vmparam.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /*-
  2. * Copyright (c) 1990 The Regents of the University of California.
  3. * All rights reserved.
  4. * Copyright (c) 1994 John S. Dyson
  5. * All rights reserved.
  6. *
  7. * This code is derived from software contributed to Berkeley by
  8. * William Jolitz.
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions
  12. * are met:
  13. * 1. Redistributions of source code must retain the above copyright
  14. * notice, this list of conditions and the following disclaimer.
  15. * 2. Redistributions in binary form must reproduce the above copyright
  16. * notice, this list of conditions and the following disclaimer in the
  17. * documentation and/or other materials provided with the distribution.
  18. * 3. Neither the name of the University nor the names of its contributors
  19. * may be used to endorse or promote products derived from this software
  20. * without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32. * SUCH DAMAGE.
  33. * from: FreeBSD: src/sys/i386/include/vmparam.h,v 1.33 2000/03/30
  34. */
  35. #ifndef _MACHINE_VMPARAM_H_
  36. #define _MACHINE_VMPARAM_H_
  37. /*
  38. * Virtual memory related constants, all in bytes
  39. */
  40. #ifndef MAXTSIZ
  41. #define MAXTSIZ (1*1024*1024*1024) /* max text size */
  42. #endif
  43. #ifndef DFLDSIZ
  44. #define DFLDSIZ (128*1024*1024) /* initial data size limit */
  45. #endif
  46. #ifndef MAXDSIZ
  47. #define MAXDSIZ (1*1024*1024*1024) /* max data size */
  48. #endif
  49. #ifndef DFLSSIZ
  50. #define DFLSSIZ (128*1024*1024) /* initial stack size limit */
  51. #endif
  52. #ifndef MAXSSIZ
  53. #define MAXSSIZ (1*1024*1024*1024) /* max stack size */
  54. #endif
  55. #ifndef SGROWSIZ
  56. #define SGROWSIZ (128*1024) /* amount to grow stack */
  57. #endif
  58. /*
  59. * The physical address space is sparsely populated.
  60. */
  61. #define VM_PHYSSEG_SPARSE
  62. /*
  63. * The number of PHYSSEG entries.
  64. */
  65. #define VM_PHYSSEG_MAX 64
  66. /*
  67. * Create two free page pools: VM_FREEPOOL_DEFAULT is the default pool
  68. * from which physical pages are allocated and VM_FREEPOOL_DIRECT is
  69. * the pool from which physical pages for small UMA objects are
  70. * allocated.
  71. */
  72. #define VM_NFREEPOOL 2
  73. #define VM_FREEPOOL_DEFAULT 0
  74. #define VM_FREEPOOL_DIRECT 1
  75. /*
  76. * Create one free page list: VM_FREELIST_DEFAULT is for all physical
  77. * pages.
  78. */
  79. #define VM_NFREELIST 1
  80. #define VM_FREELIST_DEFAULT 0
  81. /*
  82. * An allocation size of 16MB is supported in order to optimize the
  83. * use of the direct map by UMA. Specifically, a cache line contains
  84. * at most four TTEs, collectively mapping 16MB of physical memory.
  85. * By reducing the number of distinct 16MB "pages" that are used by UMA,
  86. * the physical memory allocator reduces the likelihood of both 4MB
  87. * page TLB misses and cache misses caused by 4MB page TLB misses.
  88. */
  89. #define VM_NFREEORDER 12
  90. /*
  91. * Enable superpage reservations: 1 level.
  92. */
  93. #ifndef VM_NRESERVLEVEL
  94. #define VM_NRESERVLEVEL 1
  95. #endif
  96. /*
  97. * Level 0 reservations consist of 512 pages.
  98. */
  99. #ifndef VM_LEVEL_0_ORDER
  100. #define VM_LEVEL_0_ORDER 9
  101. #endif
  102. /**
  103. * Address space layout.
  104. *
  105. * RISC-V implements multiple paging modes with different virtual address space
  106. * sizes: SV32, SV39, SV48 and SV57. Only SV39 and SV48 are supported by
  107. * FreeBSD. SV39 provides a 512GB virtual address space and uses three-level
  108. * page tables, while SV48 provides a 256TB virtual address space and uses
  109. * four-level page tables. 64-bit RISC-V implementations are required to provide
  110. * at least SV39 mode; locore initially enables SV39 mode while bootstrapping
  111. * page tables, and pmap_bootstrap() optionally switches to SV48 mode.
  112. *
  113. * The address space is split into two regions at each end of the 64-bit address
  114. * space; the lower region is for use by user mode software, while the upper
  115. * region is used for various kernel maps. The kernel map layout in SV48 mode
  116. * is currently identical to that used in SV39 mode.
  117. *
  118. * SV39 memory map:
  119. * 0x0000000000000000 - 0x0000003fffffffff 256GB user map
  120. * 0x0000004000000000 - 0xffffffbfffffffff unmappable
  121. * 0xffffffc000000000 - 0xffffffc7ffffffff 32GB kernel map
  122. * 0xffffffc800000000 - 0xffffffcfffffffff 32GB unused
  123. * 0xffffffd000000000 - 0xffffffefffffffff 128GB direct map
  124. * 0xfffffff000000000 - 0xffffffffffffffff 64GB unused
  125. *
  126. * SV48 memory map:
  127. * 0x0000000000000000 - 0x00007fffffffffff 128TB user map
  128. * 0x0000800000000000 - 0xffff7fffffffffff unmappable
  129. * 0xffff800000000000 - 0xffffffc7ffffffff 127.75TB hole
  130. * 0xffffffc000000000 - 0xffffffc7ffffffff 32GB kernel map
  131. * 0xffffffc800000000 - 0xffffffcfffffffff 32GB unused
  132. * 0xffffffd000000000 - 0xffffffefffffffff 128GB direct map
  133. * 0xfffffff000000000 - 0xffffffffffffffff 64GB unused
  134. *
  135. * The kernel is loaded at the beginning of the kernel map.
  136. *
  137. * We define some interesting address constants:
  138. *
  139. * VM_MIN_ADDRESS and VM_MAX_ADDRESS define the start and end of the entire
  140. * 64 bit address space, mostly just for convenience.
  141. *
  142. * VM_MIN_KERNEL_ADDRESS and VM_MAX_KERNEL_ADDRESS define the start and end of
  143. * mappable kernel virtual address space.
  144. *
  145. * VM_MIN_USER_ADDRESS and VM_MAX_USER_ADDRESS define the start and end of the
  146. * user address space.
  147. */
  148. #define VM_MIN_ADDRESS (0x0000000000000000UL)
  149. #define VM_MAX_ADDRESS (0xffffffffffffffffUL)
  150. #define VM_MIN_KERNEL_ADDRESS (0xffffffc000000000UL)
  151. #define VM_MAX_KERNEL_ADDRESS (0xffffffc800000000UL)
  152. #define DMAP_MIN_ADDRESS (0xffffffd000000000UL)
  153. #define DMAP_MAX_ADDRESS (0xfffffff000000000UL)
  154. #define DMAP_MIN_PHYSADDR (dmap_phys_base)
  155. #define DMAP_MAX_PHYSADDR (dmap_phys_max)
  156. /* True if pa is in the dmap range */
  157. #define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \
  158. (pa) < DMAP_MAX_PHYSADDR)
  159. /* True if va is in the dmap range */
  160. #define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \
  161. (va) < (dmap_max_addr))
  162. #define PMAP_HAS_DMAP 1
  163. #define PHYS_TO_DMAP(pa) \
  164. ({ \
  165. KASSERT(PHYS_IN_DMAP(pa), \
  166. ("%s: PA out of range, PA: 0x%lx", __func__, \
  167. (vm_paddr_t)(pa))); \
  168. ((pa) - dmap_phys_base) + DMAP_MIN_ADDRESS; \
  169. })
  170. #define DMAP_TO_PHYS(va) \
  171. ({ \
  172. KASSERT(VIRT_IN_DMAP(va), \
  173. ("%s: VA out of range, VA: 0x%lx", __func__, \
  174. (vm_offset_t)(va))); \
  175. ((va) - DMAP_MIN_ADDRESS) + dmap_phys_base; \
  176. })
  177. #define VM_MIN_USER_ADDRESS (0x0000000000000000UL)
  178. #define VM_MAX_USER_ADDRESS_SV39 (0x0000004000000000UL)
  179. #define VM_MAX_USER_ADDRESS_SV48 (0x0000800000000000UL)
  180. #define VM_MAX_USER_ADDRESS VM_MAX_USER_ADDRESS_SV48
  181. #define VM_MINUSER_ADDRESS (VM_MIN_USER_ADDRESS)
  182. #define VM_MAXUSER_ADDRESS (VM_MAX_USER_ADDRESS)
  183. #define KERNBASE (VM_MIN_KERNEL_ADDRESS)
  184. #define SHAREDPAGE_SV39 (VM_MAX_USER_ADDRESS_SV39 - PAGE_SIZE)
  185. #define SHAREDPAGE_SV48 (VM_MAX_USER_ADDRESS_SV48 - PAGE_SIZE)
  186. #define SHAREDPAGE SHAREDPAGE_SV48
  187. #define USRSTACK_SV39 SHAREDPAGE_SV39
  188. #define USRSTACK_SV48 SHAREDPAGE_SV48
  189. #define USRSTACK USRSTACK_SV48
  190. #define PS_STRINGS_SV39 (USRSTACK_SV39 - sizeof(struct ps_strings))
  191. #define PS_STRINGS_SV48 (USRSTACK_SV48 - sizeof(struct ps_strings))
  192. /*
  193. * How many physical pages per kmem arena virtual page.
  194. */
  195. #ifndef VM_KMEM_SIZE_SCALE
  196. #define VM_KMEM_SIZE_SCALE (1)
  197. #endif
  198. /*
  199. * Optional ceiling (in bytes) on the size of the kmem arena: 60% of the
  200. * kernel map.
  201. */
  202. #ifndef VM_KMEM_SIZE_MAX
  203. #define VM_KMEM_SIZE_MAX ((VM_MAX_KERNEL_ADDRESS - \
  204. VM_MIN_KERNEL_ADDRESS + 1) * 3 / 5)
  205. #endif
  206. /*
  207. * Initial pagein size of beginning of executable file.
  208. */
  209. #ifndef VM_INITIAL_PAGEIN
  210. #define VM_INITIAL_PAGEIN 16
  211. #endif
  212. #define UMA_USE_DMAP
  213. #ifndef LOCORE
  214. extern vm_paddr_t dmap_phys_base;
  215. extern vm_paddr_t dmap_phys_max;
  216. extern vm_offset_t dmap_max_addr;
  217. #endif
  218. #define ZERO_REGION_SIZE (64 * 1024) /* 64KB */
  219. /*
  220. * The top of KVA is reserved for early device mappings.
  221. */
  222. #define DEVMAP_MAX_VADDR VM_MAX_KERNEL_ADDRESS
  223. #define DEVMAP_MIN_VADDR (DEVMAP_MAX_VADDR - PMAP_MAPDEV_EARLY_SIZE)
  224. #define PMAP_MAPDEV_EARLY_SIZE (4 * L2_SIZE)
  225. /*
  226. * No non-transparent large page support in the pmap.
  227. */
  228. #define PMAP_HAS_LARGEPAGES 0
  229. /*
  230. * Need a page dump array for minidump.
  231. */
  232. #define MINIDUMP_PAGE_TRACKING 1
  233. #define MINIDUMP_STARTUP_PAGE_TRACKING 1
  234. #endif /* !_MACHINE_VMPARAM_H_ */