1 // SPDX-License-Identifier: GPL-2.0
3 #define DISABLE_BRANCH_PROFILING
5 #include <linux/kasan.h>
6 #include <linux/memblock.h>
7 #include <mm/mmu_decl.h>
9 int __init
kasan_init_region(void *start
, size_t size
)
11 unsigned long k_start
= (unsigned long)kasan_mem_to_shadow(start
);
12 unsigned long k_end
= (unsigned long)kasan_mem_to_shadow(start
+ size
);
13 unsigned long k_nobat
= k_start
;
18 while (k_nobat
< k_end
) {
19 unsigned int k_size
= bat_block_size(k_nobat
, k_end
);
20 int idx
= find_free_bat();
26 phys
= memblock_phys_alloc_range(k_size
, k_size
, 0,
27 MEMBLOCK_ALLOC_ANYWHERE
);
31 setbat(idx
, k_nobat
, phys
, k_size
, PAGE_KERNEL
);
34 if (k_nobat
!= k_start
)
37 if (k_nobat
< k_end
) {
38 phys
= memblock_phys_alloc_range(k_end
- k_nobat
, PAGE_SIZE
, 0,
39 MEMBLOCK_ALLOC_ANYWHERE
);
44 ret
= kasan_init_shadow_page_tables(k_start
, k_end
);
48 kasan_update_early_region(k_start
, k_nobat
, __pte(0));
50 for (k_cur
= k_nobat
; k_cur
< k_end
; k_cur
+= PAGE_SIZE
) {
51 pmd_t
*pmd
= pmd_off_k(k_cur
);
52 pte_t pte
= pfn_pte(PHYS_PFN(phys
+ k_cur
- k_nobat
), PAGE_KERNEL
);
54 __set_pte_at(&init_mm
, k_cur
, pte_offset_kernel(pmd
, k_cur
), pte
, 0);
56 flush_tlb_kernel_range(k_start
, k_end
);
57 memset(kasan_mem_to_shadow(start
), 0, k_end
- k_start
);