kasan_init.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * This file contains kasan initialization code for ARM64.
  4. *
  5. * Copyright (c) 2015 Samsung Electronics Co., Ltd.
  6. * Author: Andrey Ryabinin <[email protected]>
  7. */
  8. #define pr_fmt(fmt) "kasan: " fmt
  9. #include <linux/kasan.h>
  10. #include <linux/kernel.h>
  11. #include <linux/sched/task.h>
  12. #include <linux/memblock.h>
  13. #include <linux/start_kernel.h>
  14. #include <linux/mm.h>
  15. #include <asm/mmu_context.h>
  16. #include <asm/kernel-pgtable.h>
  17. #include <asm/page.h>
  18. #include <asm/pgalloc.h>
  19. #include <asm/sections.h>
  20. #include <asm/tlbflush.h>
  21. #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
  22. static pgd_t tmp_pg_dir[PTRS_PER_PGD] __initdata __aligned(PGD_SIZE);
  23. /*
  24. * The p*d_populate functions call virt_to_phys implicitly so they can't be used
  25. * directly on kernel symbols (bm_p*d). All the early functions are called too
  26. * early to use lm_alias so __p*d_populate functions must be used to populate
  27. * with the physical address from __pa_symbol.
  28. */
  29. static phys_addr_t __init kasan_alloc_zeroed_page(int node)
  30. {
  31. void *p = memblock_alloc_try_nid(PAGE_SIZE, PAGE_SIZE,
  32. __pa(MAX_DMA_ADDRESS),
  33. MEMBLOCK_ALLOC_NOLEAKTRACE, node);
  34. if (!p)
  35. panic("%s: Failed to allocate %lu bytes align=0x%lx nid=%d from=%llx\n",
  36. __func__, PAGE_SIZE, PAGE_SIZE, node,
  37. __pa(MAX_DMA_ADDRESS));
  38. return __pa(p);
  39. }
  40. static phys_addr_t __init kasan_alloc_raw_page(int node)
  41. {
  42. void *p = memblock_alloc_try_nid_raw(PAGE_SIZE, PAGE_SIZE,
  43. __pa(MAX_DMA_ADDRESS),
  44. MEMBLOCK_ALLOC_NOLEAKTRACE,
  45. node);
  46. if (!p)
  47. panic("%s: Failed to allocate %lu bytes align=0x%lx nid=%d from=%llx\n",
  48. __func__, PAGE_SIZE, PAGE_SIZE, node,
  49. __pa(MAX_DMA_ADDRESS));
  50. return __pa(p);
  51. }
  52. static pte_t *__init kasan_pte_offset(pmd_t *pmdp, unsigned long addr, int node,
  53. bool early)
  54. {
  55. if (pmd_none(READ_ONCE(*pmdp))) {
  56. phys_addr_t pte_phys = early ?
  57. __pa_symbol(kasan_early_shadow_pte)
  58. : kasan_alloc_zeroed_page(node);
  59. __pmd_populate(pmdp, pte_phys, PMD_TYPE_TABLE);
  60. }
  61. return early ? pte_offset_kimg(pmdp, addr)
  62. : pte_offset_kernel(pmdp, addr);
  63. }
  64. static pmd_t *__init kasan_pmd_offset(pud_t *pudp, unsigned long addr, int node,
  65. bool early)
  66. {
  67. if (pud_none(READ_ONCE(*pudp))) {
  68. phys_addr_t pmd_phys = early ?
  69. __pa_symbol(kasan_early_shadow_pmd)
  70. : kasan_alloc_zeroed_page(node);
  71. __pud_populate(pudp, pmd_phys, PUD_TYPE_TABLE);
  72. }
  73. return early ? pmd_offset_kimg(pudp, addr) : pmd_offset(pudp, addr);
  74. }
  75. static pud_t *__init kasan_pud_offset(p4d_t *p4dp, unsigned long addr, int node,
  76. bool early)
  77. {
  78. if (p4d_none(READ_ONCE(*p4dp))) {
  79. phys_addr_t pud_phys = early ?
  80. __pa_symbol(kasan_early_shadow_pud)
  81. : kasan_alloc_zeroed_page(node);
  82. __p4d_populate(p4dp, pud_phys, P4D_TYPE_TABLE);
  83. }
  84. return early ? pud_offset_kimg(p4dp, addr) : pud_offset(p4dp, addr);
  85. }
  86. static void __init kasan_pte_populate(pmd_t *pmdp, unsigned long addr,
  87. unsigned long end, int node, bool early)
  88. {
  89. unsigned long next;
  90. pte_t *ptep = kasan_pte_offset(pmdp, addr, node, early);
  91. do {
  92. phys_addr_t page_phys = early ?
  93. __pa_symbol(kasan_early_shadow_page)
  94. : kasan_alloc_raw_page(node);
  95. if (!early)
  96. memset(__va(page_phys), KASAN_SHADOW_INIT, PAGE_SIZE);
  97. next = addr + PAGE_SIZE;
  98. set_pte(ptep, pfn_pte(__phys_to_pfn(page_phys), PAGE_KERNEL));
  99. } while (ptep++, addr = next, addr != end && pte_none(READ_ONCE(*ptep)));
  100. }
  101. static void __init kasan_pmd_populate(pud_t *pudp, unsigned long addr,
  102. unsigned long end, int node, bool early)
  103. {
  104. unsigned long next;
  105. pmd_t *pmdp = kasan_pmd_offset(pudp, addr, node, early);
  106. do {
  107. next = pmd_addr_end(addr, end);
  108. kasan_pte_populate(pmdp, addr, next, node, early);
  109. } while (pmdp++, addr = next, addr != end && pmd_none(READ_ONCE(*pmdp)));
  110. }
  111. static void __init kasan_pud_populate(p4d_t *p4dp, unsigned long addr,
  112. unsigned long end, int node, bool early)
  113. {
  114. unsigned long next;
  115. pud_t *pudp = kasan_pud_offset(p4dp, addr, node, early);
  116. do {
  117. next = pud_addr_end(addr, end);
  118. kasan_pmd_populate(pudp, addr, next, node, early);
  119. } while (pudp++, addr = next, addr != end && pud_none(READ_ONCE(*pudp)));
  120. }
  121. static void __init kasan_p4d_populate(pgd_t *pgdp, unsigned long addr,
  122. unsigned long end, int node, bool early)
  123. {
  124. unsigned long next;
  125. p4d_t *p4dp = p4d_offset(pgdp, addr);
  126. do {
  127. next = p4d_addr_end(addr, end);
  128. kasan_pud_populate(p4dp, addr, next, node, early);
  129. } while (p4dp++, addr = next, addr != end);
  130. }
  131. static void __init kasan_pgd_populate(unsigned long addr, unsigned long end,
  132. int node, bool early)
  133. {
  134. unsigned long next;
  135. pgd_t *pgdp;
  136. pgdp = pgd_offset_k(addr);
  137. do {
  138. next = pgd_addr_end(addr, end);
  139. kasan_p4d_populate(pgdp, addr, next, node, early);
  140. } while (pgdp++, addr = next, addr != end);
  141. }
  142. /* The early shadow maps everything to a single page of zeroes */
  143. asmlinkage void __init kasan_early_init(void)
  144. {
  145. BUILD_BUG_ON(KASAN_SHADOW_OFFSET !=
  146. KASAN_SHADOW_END - (1UL << (64 - KASAN_SHADOW_SCALE_SHIFT)));
  147. BUILD_BUG_ON(!IS_ALIGNED(_KASAN_SHADOW_START(VA_BITS), PGDIR_SIZE));
  148. BUILD_BUG_ON(!IS_ALIGNED(_KASAN_SHADOW_START(VA_BITS_MIN), PGDIR_SIZE));
  149. BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_END, PGDIR_SIZE));
  150. kasan_pgd_populate(KASAN_SHADOW_START, KASAN_SHADOW_END, NUMA_NO_NODE,
  151. true);
  152. }
  153. /* Set up full kasan mappings, ensuring that the mapped pages are zeroed */
  154. static void __init kasan_map_populate(unsigned long start, unsigned long end,
  155. int node)
  156. {
  157. kasan_pgd_populate(start & PAGE_MASK, PAGE_ALIGN(end), node, false);
  158. }
  159. /*
  160. * Copy the current shadow region into a new pgdir.
  161. */
  162. void __init kasan_copy_shadow(pgd_t *pgdir)
  163. {
  164. pgd_t *pgdp, *pgdp_new, *pgdp_end;
  165. pgdp = pgd_offset_k(KASAN_SHADOW_START);
  166. pgdp_end = pgd_offset_k(KASAN_SHADOW_END);
  167. pgdp_new = pgd_offset_pgd(pgdir, KASAN_SHADOW_START);
  168. do {
  169. set_pgd(pgdp_new, READ_ONCE(*pgdp));
  170. } while (pgdp++, pgdp_new++, pgdp != pgdp_end);
  171. }
  172. static void __init clear_pgds(unsigned long start,
  173. unsigned long end)
  174. {
  175. /*
  176. * Remove references to kasan page tables from
  177. * swapper_pg_dir. pgd_clear() can't be used
  178. * here because it's nop on 2,3-level pagetable setups
  179. */
  180. for (; start < end; start += PGDIR_SIZE)
  181. set_pgd(pgd_offset_k(start), __pgd(0));
  182. }
  183. static void __init kasan_init_shadow(void)
  184. {
  185. u64 kimg_shadow_start, kimg_shadow_end;
  186. u64 mod_shadow_start, mod_shadow_end;
  187. u64 vmalloc_shadow_end;
  188. phys_addr_t pa_start, pa_end;
  189. u64 i;
  190. kimg_shadow_start = (u64)kasan_mem_to_shadow(KERNEL_START) & PAGE_MASK;
  191. kimg_shadow_end = PAGE_ALIGN((u64)kasan_mem_to_shadow(KERNEL_END));
  192. mod_shadow_start = (u64)kasan_mem_to_shadow((void *)MODULES_VADDR);
  193. mod_shadow_end = (u64)kasan_mem_to_shadow((void *)MODULES_END);
  194. vmalloc_shadow_end = (u64)kasan_mem_to_shadow((void *)VMALLOC_END);
  195. /*
  196. * We are going to perform proper setup of shadow memory.
  197. * At first we should unmap early shadow (clear_pgds() call below).
  198. * However, instrumented code couldn't execute without shadow memory.
  199. * tmp_pg_dir used to keep early shadow mapped until full shadow
  200. * setup will be finished.
  201. */
  202. memcpy(tmp_pg_dir, swapper_pg_dir, sizeof(tmp_pg_dir));
  203. dsb(ishst);
  204. cpu_replace_ttbr1(lm_alias(tmp_pg_dir), idmap_pg_dir);
  205. clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END);
  206. kasan_map_populate(kimg_shadow_start, kimg_shadow_end,
  207. early_pfn_to_nid(virt_to_pfn(lm_alias(KERNEL_START))));
  208. kasan_populate_early_shadow(kasan_mem_to_shadow((void *)PAGE_END),
  209. (void *)mod_shadow_start);
  210. if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) {
  211. BUILD_BUG_ON(VMALLOC_START != MODULES_END);
  212. kasan_populate_early_shadow((void *)vmalloc_shadow_end,
  213. (void *)KASAN_SHADOW_END);
  214. } else {
  215. kasan_populate_early_shadow((void *)kimg_shadow_end,
  216. (void *)KASAN_SHADOW_END);
  217. if (kimg_shadow_start > mod_shadow_end)
  218. kasan_populate_early_shadow((void *)mod_shadow_end,
  219. (void *)kimg_shadow_start);
  220. }
  221. for_each_mem_range(i, &pa_start, &pa_end) {
  222. void *start = (void *)__phys_to_virt(pa_start);
  223. void *end = (void *)__phys_to_virt(pa_end);
  224. if (start >= end)
  225. break;
  226. kasan_map_populate((unsigned long)kasan_mem_to_shadow(start),
  227. (unsigned long)kasan_mem_to_shadow(end),
  228. early_pfn_to_nid(virt_to_pfn(start)));
  229. }
  230. /*
  231. * KAsan may reuse the contents of kasan_early_shadow_pte directly,
  232. * so we should make sure that it maps the zero page read-only.
  233. */
  234. for (i = 0; i < PTRS_PER_PTE; i++)
  235. set_pte(&kasan_early_shadow_pte[i],
  236. pfn_pte(sym_to_pfn(kasan_early_shadow_page),
  237. PAGE_KERNEL_RO));
  238. memset(kasan_early_shadow_page, KASAN_SHADOW_INIT, PAGE_SIZE);
  239. cpu_replace_ttbr1(lm_alias(swapper_pg_dir), idmap_pg_dir);
  240. }
  241. static void __init kasan_init_depth(void)
  242. {
  243. init_task.kasan_depth = 0;
  244. }
  245. #ifdef CONFIG_KASAN_VMALLOC
  246. void __init kasan_populate_early_vm_area_shadow(void *start, unsigned long size)
  247. {
  248. unsigned long shadow_start, shadow_end;
  249. if (!is_vmalloc_or_module_addr(start))
  250. return;
  251. shadow_start = (unsigned long)kasan_mem_to_shadow(start);
  252. shadow_start = ALIGN_DOWN(shadow_start, PAGE_SIZE);
  253. shadow_end = (unsigned long)kasan_mem_to_shadow(start + size);
  254. shadow_end = ALIGN(shadow_end, PAGE_SIZE);
  255. kasan_map_populate(shadow_start, shadow_end, NUMA_NO_NODE);
  256. }
  257. #endif
  258. void __init kasan_init(void)
  259. {
  260. kasan_init_shadow();
  261. kasan_init_depth();
  262. #if defined(CONFIG_KASAN_GENERIC)
  263. /* CONFIG_KASAN_SW_TAGS also requires kasan_init_sw_tags(). */
  264. pr_info("KernelAddressSanitizer initialized (generic)\n");
  265. #endif
  266. }
  267. #endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */