mmuvar.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*-
  2. * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
  3. *
  4. * Copyright (c) 2005 Peter Grehan
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  17. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  20. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  22. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  23. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  24. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  25. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  26. * SUCH DAMAGE.
  27. *
  28. * $FreeBSD$
  29. */
  30. #ifndef _MACHINE_MMUVAR_H_
  31. #define _MACHINE_MMUVAR_H_
  32. typedef void (*pmap_bootstrap_t)(vm_offset_t, vm_offset_t);
  33. typedef void (*pmap_cpu_bootstrap_t)(int);
  34. typedef void (*pmap_kenter_t)(vm_offset_t, vm_paddr_t pa);
  35. typedef void (*pmap_kenter_attr_t)(vm_offset_t, vm_paddr_t, vm_memattr_t);
  36. typedef void (*pmap_kremove_t)(vm_offset_t);
  37. typedef void *(*pmap_mapdev_t)(vm_paddr_t, vm_size_t);
  38. typedef void *(*pmap_mapdev_attr_t)(vm_paddr_t, vm_size_t, vm_memattr_t);
  39. typedef void (*pmap_unmapdev_t)(vm_offset_t, vm_size_t);
  40. typedef void (*pmap_page_set_memattr_t)(vm_page_t, vm_memattr_t);
  41. typedef int (*pmap_change_attr_t)(vm_offset_t, vm_size_t, vm_memattr_t);
  42. typedef int (*pmap_map_user_ptr_t)(pmap_t, volatile const void *,
  43. void **, size_t, size_t *);
  44. typedef int (*pmap_decode_kernel_ptr_t)(vm_offset_t, int *, vm_offset_t *);
  45. typedef vm_paddr_t (*pmap_kextract_t)(vm_offset_t);
  46. typedef int (*pmap_dev_direct_mapped_t)(vm_paddr_t, vm_size_t);
  47. typedef void (*pmap_page_array_startup_t)(long);
  48. typedef void (*pmap_advise_t)(pmap_t, vm_offset_t, vm_offset_t, int);
  49. typedef void (*pmap_clear_modify_t)(vm_page_t);
  50. typedef void (*pmap_remove_write_t)(vm_page_t);
  51. typedef void (*pmap_copy_t)(pmap_t, pmap_t, vm_offset_t, vm_size_t, vm_offset_t);
  52. typedef void (*pmap_copy_page_t)(vm_page_t, vm_page_t);
  53. typedef void (*pmap_copy_pages_t)(vm_page_t *, vm_offset_t,
  54. vm_page_t *, vm_offset_t, int);
  55. typedef int (*pmap_enter_t)(pmap_t, vm_offset_t, vm_page_t, vm_prot_t,
  56. u_int, int8_t);
  57. typedef void (*pmap_enter_object_t)(pmap_t, vm_offset_t, vm_offset_t,
  58. vm_page_t, vm_prot_t);
  59. typedef void (*pmap_enter_quick_t)(pmap_t, vm_offset_t, vm_page_t, vm_prot_t);
  60. typedef vm_paddr_t (*pmap_extract_t)(pmap_t, vm_offset_t);
  61. typedef vm_page_t (*pmap_extract_and_hold_t)(pmap_t, vm_offset_t, vm_prot_t);
  62. typedef void (*pmap_growkernel_t)(vm_offset_t);
  63. typedef void (*pmap_init_t)(void);
  64. typedef boolean_t (*pmap_is_modified_t)(vm_page_t);
  65. typedef boolean_t (*pmap_is_prefaultable_t)(pmap_t, vm_offset_t);
  66. typedef boolean_t (*pmap_is_referenced_t)(vm_page_t);
  67. typedef int (*pmap_ts_referenced_t)(vm_page_t);
  68. typedef vm_offset_t (*pmap_map_t)(vm_offset_t *, vm_paddr_t, vm_paddr_t, int);
  69. typedef void (*pmap_object_init_pt_t)(pmap_t, vm_offset_t, vm_object_t,
  70. vm_pindex_t, vm_size_t);
  71. typedef boolean_t (*pmap_page_exists_quick_t)(pmap_t, vm_page_t);
  72. typedef boolean_t (*pmap_page_is_mapped_t)(vm_page_t);
  73. typedef void (*pmap_page_init_t)(vm_page_t);
  74. typedef int (*pmap_page_wired_mappings_t)(vm_page_t);
  75. typedef void (*pmap_pinit0_t)(pmap_t);
  76. typedef void (*pmap_protect_t)(pmap_t, vm_offset_t, vm_offset_t, vm_prot_t);
  77. typedef void (*pmap_qenter_t)(vm_offset_t, vm_page_t *, int);
  78. typedef void (*pmap_qremove_t)(vm_offset_t, int);
  79. typedef void (*pmap_release_t)(pmap_t);
  80. typedef void (*pmap_remove_t)(pmap_t, vm_offset_t, vm_offset_t);
  81. typedef void (*pmap_remove_all_t)(vm_page_t);
  82. typedef void (*pmap_remove_pages_t)(pmap_t);
  83. typedef void (*pmap_unwire_t)(pmap_t, vm_offset_t, vm_offset_t);
  84. typedef void (*pmap_zero_page_t)(vm_page_t);
  85. typedef void (*pmap_zero_page_area_t)(vm_page_t, int, int);
  86. typedef int (*pmap_mincore_t)(pmap_t, vm_offset_t, vm_paddr_t *);
  87. typedef void (*pmap_activate_t)(struct thread *);
  88. typedef void (*pmap_deactivate_t)(struct thread *);
  89. typedef void (*pmap_align_superpage_t)(vm_object_t, vm_ooffset_t,
  90. vm_offset_t *, vm_size_t);
  91. typedef void (*pmap_sync_icache_t)(pmap_t, vm_offset_t, vm_size_t);
  92. typedef void (*pmap_dumpsys_map_chunk_t)(vm_paddr_t, size_t, void **);
  93. typedef void (*pmap_dumpsys_unmap_chunk_t)(vm_paddr_t, size_t, void *);
  94. typedef void (*pmap_dumpsys_pa_init_t)(void);
  95. typedef size_t (*pmap_dumpsys_scan_pmap_t)(void);
  96. typedef void *(*pmap_dumpsys_dump_pmap_init_t)(unsigned);
  97. typedef void *(*pmap_dumpsys_dump_pmap_t)(void *, void *, u_long *);
  98. typedef vm_offset_t (*pmap_quick_enter_page_t)(vm_page_t);
  99. typedef void (*pmap_quick_remove_page_t)(vm_offset_t);
  100. typedef bool (*pmap_ps_enabled_t)(pmap_t);
  101. typedef void (*pmap_tlbie_all_t)(void);
  102. typedef void (*pmap_installer_t)(void);
  103. struct pmap_funcs {
  104. pmap_installer_t install;
  105. pmap_bootstrap_t bootstrap;
  106. pmap_cpu_bootstrap_t cpu_bootstrap;
  107. pmap_kenter_t kenter;
  108. pmap_kenter_attr_t kenter_attr;
  109. pmap_kremove_t kremove;
  110. pmap_mapdev_t mapdev;
  111. pmap_mapdev_attr_t mapdev_attr;
  112. pmap_unmapdev_t unmapdev;
  113. pmap_page_set_memattr_t page_set_memattr;
  114. pmap_change_attr_t change_attr;
  115. pmap_map_user_ptr_t map_user_ptr;
  116. pmap_decode_kernel_ptr_t decode_kernel_ptr;
  117. pmap_kextract_t kextract;
  118. pmap_dev_direct_mapped_t dev_direct_mapped;
  119. pmap_advise_t advise;
  120. pmap_clear_modify_t clear_modify;
  121. pmap_remove_write_t remove_write;
  122. pmap_copy_t copy;
  123. pmap_copy_page_t copy_page;
  124. pmap_copy_pages_t copy_pages;
  125. pmap_enter_t enter;
  126. pmap_enter_object_t enter_object;
  127. pmap_enter_quick_t enter_quick;
  128. pmap_extract_t extract;
  129. pmap_extract_and_hold_t extract_and_hold;
  130. pmap_growkernel_t growkernel;
  131. pmap_init_t init;
  132. pmap_is_modified_t is_modified;
  133. pmap_is_prefaultable_t is_prefaultable;
  134. pmap_is_referenced_t is_referenced;
  135. pmap_ts_referenced_t ts_referenced;
  136. pmap_page_is_mapped_t page_is_mapped;
  137. pmap_ps_enabled_t ps_enabled;
  138. pmap_map_t map;
  139. pmap_object_init_pt_t object_init_pt;
  140. pmap_page_exists_quick_t page_exists_quick;
  141. pmap_page_init_t page_init;
  142. pmap_page_wired_mappings_t page_wired_mappings;
  143. pmap_pinit_t pinit;
  144. pmap_pinit0_t pinit0;
  145. pmap_protect_t protect;
  146. pmap_qenter_t qenter;
  147. pmap_qremove_t qremove;
  148. pmap_release_t release;
  149. pmap_remove_t remove;
  150. pmap_remove_all_t remove_all;
  151. pmap_remove_pages_t remove_pages;
  152. pmap_unwire_t unwire;
  153. pmap_zero_page_t zero_page;
  154. pmap_zero_page_area_t zero_page_area;
  155. pmap_mincore_t mincore;
  156. pmap_activate_t activate;
  157. pmap_deactivate_t deactivate;
  158. pmap_align_superpage_t align_superpage;
  159. pmap_sync_icache_t sync_icache;
  160. pmap_quick_enter_page_t quick_enter_page;
  161. pmap_quick_remove_page_t quick_remove_page;
  162. pmap_page_array_startup_t page_array_startup;
  163. pmap_dumpsys_map_chunk_t dumpsys_map_chunk;
  164. pmap_dumpsys_unmap_chunk_t dumpsys_unmap_chunk;
  165. pmap_dumpsys_pa_init_t dumpsys_pa_init;
  166. pmap_dumpsys_scan_pmap_t dumpsys_scan_pmap;
  167. pmap_dumpsys_dump_pmap_init_t dumpsys_dump_pmap_init;
  168. pmap_dumpsys_dump_pmap_t dumpsys_dump_pmap;
  169. pmap_tlbie_all_t tlbie_all;
  170. };
  171. struct mmu_kobj {
  172. const char *name;
  173. const struct mmu_kobj *base;
  174. const struct pmap_funcs *funcs;
  175. };
  176. typedef struct mmu_kobj *mmu_t;
  177. /* The currently installed pmap object. */
  178. extern mmu_t mmu_obj;
  179. /*
  180. * Resolve a given pmap function.
  181. * 'func' is the function name less the 'pmap_' * prefix.
  182. */
  183. #define PMAP_RESOLVE_FUNC(func) \
  184. ({ \
  185. pmap_##func##_t f; \
  186. const struct mmu_kobj *mmu = mmu_obj; \
  187. do { \
  188. f = mmu->funcs->func; \
  189. if (f != NULL) break; \
  190. mmu = mmu->base; \
  191. } while (mmu != NULL); \
  192. f;})
  193. #define MMU_DEF(name, ident, methods) \
  194. \
  195. const struct mmu_kobj name = { \
  196. ident, NULL, &methods \
  197. }; \
  198. DATA_SET(mmu_set, name)
  199. #define MMU_DEF_INHERIT(name, ident, methods, base1) \
  200. \
  201. const struct mmu_kobj name = { \
  202. ident, &base1, &methods, \
  203. }; \
  204. DATA_SET(mmu_set, name)
  205. /*
  206. * Known MMU names
  207. */
  208. #define MMU_TYPE_BOOKE "mmu_booke" /* Book-E MMU specification */
  209. #define MMU_TYPE_OEA "mmu_oea" /* 32-bit OEA */
  210. #define MMU_TYPE_G5 "mmu_g5" /* 64-bit bridge (ibm 970) */
  211. #define MMU_TYPE_RADIX "mmu_radix" /* 64-bit native ISA 3.0 (POWER9) radix */
  212. #define MMU_TYPE_8xx "mmu_8xx" /* 8xx quicc TLB */
  213. #endif /* _MACHINE_MMUVAR_H_ */