mem.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  4. */
  5. #include <linux/stddef.h>
  6. #include <linux/module.h>
  7. #include <linux/memblock.h>
  8. #include <linux/highmem.h>
  9. #include <linux/mm.h>
  10. #include <linux/swap.h>
  11. #include <linux/slab.h>
  12. #include <asm/fixmap.h>
  13. #include <asm/page.h>
  14. #include <asm/pgalloc.h>
  15. #include <as-layout.h>
  16. #include <init.h>
  17. #include <kern.h>
  18. #include <kern_util.h>
  19. #include <mem_user.h>
  20. #include <os.h>
  21. #include <um_malloc.h>
  22. #include <linux/sched/task.h>
  23. #ifdef CONFIG_KASAN
  24. int kasan_um_is_ready;
  25. void kasan_init(void)
  26. {
  27. /*
  28. * kasan_map_memory will map all of the required address space and
  29. * the host machine will allocate physical memory as necessary.
  30. */
  31. kasan_map_memory((void *)KASAN_SHADOW_START, KASAN_SHADOW_SIZE);
  32. init_task.kasan_depth = 0;
  33. kasan_um_is_ready = true;
  34. }
  35. static void (*kasan_init_ptr)(void)
  36. __section(".kasan_init") __used
  37. = kasan_init;
  38. #endif
  39. /* allocated in paging_init, zeroed in mem_init, and unchanged thereafter */
  40. unsigned long *empty_zero_page = NULL;
  41. EXPORT_SYMBOL(empty_zero_page);
  42. /*
  43. * Initialized during boot, and readonly for initializing page tables
  44. * afterwards
  45. */
  46. pgd_t swapper_pg_dir[PTRS_PER_PGD];
  47. /* Initialized at boot time, and readonly after that */
  48. unsigned long long highmem;
  49. EXPORT_SYMBOL(highmem);
  50. int kmalloc_ok = 0;
  51. /* Used during early boot */
  52. static unsigned long brk_end;
  53. void __init mem_init(void)
  54. {
  55. /* clear the zero-page */
  56. memset(empty_zero_page, 0, PAGE_SIZE);
  57. /* Map in the area just after the brk now that kmalloc is about
  58. * to be turned on.
  59. */
  60. brk_end = (unsigned long) UML_ROUND_UP(sbrk(0));
  61. map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, 0);
  62. memblock_free((void *)brk_end, uml_reserved - brk_end);
  63. uml_reserved = brk_end;
  64. min_low_pfn = PFN_UP(__pa(uml_reserved));
  65. /* this will put all low memory onto the freelists */
  66. memblock_free_all();
  67. max_pfn = max_low_pfn;
  68. kmalloc_ok = 1;
  69. }
  70. /*
  71. * Create a page table and place a pointer to it in a middle page
  72. * directory entry.
  73. */
  74. static void __init one_page_table_init(pmd_t *pmd)
  75. {
  76. if (pmd_none(*pmd)) {
  77. pte_t *pte = (pte_t *) memblock_alloc_low(PAGE_SIZE,
  78. PAGE_SIZE);
  79. if (!pte)
  80. panic("%s: Failed to allocate %lu bytes align=%lx\n",
  81. __func__, PAGE_SIZE, PAGE_SIZE);
  82. set_pmd(pmd, __pmd(_KERNPG_TABLE +
  83. (unsigned long) __pa(pte)));
  84. BUG_ON(pte != pte_offset_kernel(pmd, 0));
  85. }
  86. }
  87. static void __init one_md_table_init(pud_t *pud)
  88. {
  89. #ifdef CONFIG_3_LEVEL_PGTABLES
  90. pmd_t *pmd_table = (pmd_t *) memblock_alloc_low(PAGE_SIZE, PAGE_SIZE);
  91. if (!pmd_table)
  92. panic("%s: Failed to allocate %lu bytes align=%lx\n",
  93. __func__, PAGE_SIZE, PAGE_SIZE);
  94. set_pud(pud, __pud(_KERNPG_TABLE + (unsigned long) __pa(pmd_table)));
  95. BUG_ON(pmd_table != pmd_offset(pud, 0));
  96. #endif
  97. }
  98. static void __init fixrange_init(unsigned long start, unsigned long end,
  99. pgd_t *pgd_base)
  100. {
  101. pgd_t *pgd;
  102. p4d_t *p4d;
  103. pud_t *pud;
  104. pmd_t *pmd;
  105. int i, j;
  106. unsigned long vaddr;
  107. vaddr = start;
  108. i = pgd_index(vaddr);
  109. j = pmd_index(vaddr);
  110. pgd = pgd_base + i;
  111. for ( ; (i < PTRS_PER_PGD) && (vaddr < end); pgd++, i++) {
  112. p4d = p4d_offset(pgd, vaddr);
  113. pud = pud_offset(p4d, vaddr);
  114. if (pud_none(*pud))
  115. one_md_table_init(pud);
  116. pmd = pmd_offset(pud, vaddr);
  117. for (; (j < PTRS_PER_PMD) && (vaddr < end); pmd++, j++) {
  118. one_page_table_init(pmd);
  119. vaddr += PMD_SIZE;
  120. }
  121. j = 0;
  122. }
  123. }
  124. static void __init fixaddr_user_init( void)
  125. {
  126. #ifdef CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA
  127. long size = FIXADDR_USER_END - FIXADDR_USER_START;
  128. pte_t *pte;
  129. phys_t p;
  130. unsigned long v, vaddr = FIXADDR_USER_START;
  131. if (!size)
  132. return;
  133. fixrange_init( FIXADDR_USER_START, FIXADDR_USER_END, swapper_pg_dir);
  134. v = (unsigned long) memblock_alloc_low(size, PAGE_SIZE);
  135. if (!v)
  136. panic("%s: Failed to allocate %lu bytes align=%lx\n",
  137. __func__, size, PAGE_SIZE);
  138. memcpy((void *) v , (void *) FIXADDR_USER_START, size);
  139. p = __pa(v);
  140. for ( ; size > 0; size -= PAGE_SIZE, vaddr += PAGE_SIZE,
  141. p += PAGE_SIZE) {
  142. pte = virt_to_kpte(vaddr);
  143. pte_set_val(*pte, p, PAGE_READONLY);
  144. }
  145. #endif
  146. }
  147. void __init paging_init(void)
  148. {
  149. unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
  150. unsigned long vaddr;
  151. empty_zero_page = (unsigned long *) memblock_alloc_low(PAGE_SIZE,
  152. PAGE_SIZE);
  153. if (!empty_zero_page)
  154. panic("%s: Failed to allocate %lu bytes align=%lx\n",
  155. __func__, PAGE_SIZE, PAGE_SIZE);
  156. max_zone_pfn[ZONE_NORMAL] = end_iomem >> PAGE_SHIFT;
  157. free_area_init(max_zone_pfn);
  158. /*
  159. * Fixed mappings, only the page table structure has to be
  160. * created - mappings will be set by set_fixmap():
  161. */
  162. vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
  163. fixrange_init(vaddr, FIXADDR_TOP, swapper_pg_dir);
  164. fixaddr_user_init();
  165. }
  166. /*
  167. * This can't do anything because nothing in the kernel image can be freed
  168. * since it's not in kernel physical memory.
  169. */
  170. void free_initmem(void)
  171. {
  172. }
  173. /* Allocate and free page tables. */
  174. pgd_t *pgd_alloc(struct mm_struct *mm)
  175. {
  176. pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
  177. if (pgd) {
  178. memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
  179. memcpy(pgd + USER_PTRS_PER_PGD,
  180. swapper_pg_dir + USER_PTRS_PER_PGD,
  181. (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
  182. }
  183. return pgd;
  184. }
  185. void *uml_kmalloc(int size, int flags)
  186. {
  187. return kmalloc(size, flags);
  188. }
  189. static const pgprot_t protection_map[16] = {
  190. [VM_NONE] = PAGE_NONE,
  191. [VM_READ] = PAGE_READONLY,
  192. [VM_WRITE] = PAGE_COPY,
  193. [VM_WRITE | VM_READ] = PAGE_COPY,
  194. [VM_EXEC] = PAGE_READONLY,
  195. [VM_EXEC | VM_READ] = PAGE_READONLY,
  196. [VM_EXEC | VM_WRITE] = PAGE_COPY,
  197. [VM_EXEC | VM_WRITE | VM_READ] = PAGE_COPY,
  198. [VM_SHARED] = PAGE_NONE,
  199. [VM_SHARED | VM_READ] = PAGE_READONLY,
  200. [VM_SHARED | VM_WRITE] = PAGE_SHARED,
  201. [VM_SHARED | VM_WRITE | VM_READ] = PAGE_SHARED,
  202. [VM_SHARED | VM_EXEC] = PAGE_READONLY,
  203. [VM_SHARED | VM_EXEC | VM_READ] = PAGE_READONLY,
  204. [VM_SHARED | VM_EXEC | VM_WRITE] = PAGE_SHARED,
  205. [VM_SHARED | VM_EXEC | VM_WRITE | VM_READ] = PAGE_SHARED
  206. };
  207. DECLARE_VM_GET_PAGE_PROT