@@ -42,39 +42,43 @@ static pgd_t kasan_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE);
4242
4343bool kasan_early_stage = true;
4444
45- void * kasan_mem_to_shadow (const void * addr )
45+ static void * mem_to_shadow (const void * addr )
4646{
47- if (!kasan_arch_is_ready ()) {
47+ unsigned long offset = 0 ;
48+ unsigned long maddr = (unsigned long )addr ;
49+ unsigned long xrange = (maddr >> XRANGE_SHIFT ) & 0xffff ;
50+
51+ if (maddr >= FIXADDR_START )
4852 return (void * )(kasan_early_shadow_page );
49- } else {
50- unsigned long maddr = (unsigned long )addr ;
51- unsigned long xrange = (maddr >> XRANGE_SHIFT ) & 0xffff ;
52- unsigned long offset = 0 ;
53-
54- if (maddr >= FIXADDR_START )
55- return (void * )(kasan_early_shadow_page );
56-
57- maddr &= XRANGE_SHADOW_MASK ;
58- switch (xrange ) {
59- case XKPRANGE_CC_SEG :
60- offset = XKPRANGE_CC_SHADOW_OFFSET ;
61- break ;
62- case XKPRANGE_UC_SEG :
63- offset = XKPRANGE_UC_SHADOW_OFFSET ;
64- break ;
65- case XKPRANGE_WC_SEG :
66- offset = XKPRANGE_WC_SHADOW_OFFSET ;
67- break ;
68- case XKVRANGE_VC_SEG :
69- offset = XKVRANGE_VC_SHADOW_OFFSET ;
70- break ;
71- default :
72- WARN_ON (1 );
73- return NULL ;
74- }
7553
76- return (void * )((maddr >> KASAN_SHADOW_SCALE_SHIFT ) + offset );
54+ maddr &= XRANGE_SHADOW_MASK ;
55+ switch (xrange ) {
56+ case XKPRANGE_CC_SEG :
57+ offset = XKPRANGE_CC_SHADOW_OFFSET ;
58+ break ;
59+ case XKPRANGE_UC_SEG :
60+ offset = XKPRANGE_UC_SHADOW_OFFSET ;
61+ break ;
62+ case XKPRANGE_WC_SEG :
63+ offset = XKPRANGE_WC_SHADOW_OFFSET ;
64+ break ;
65+ case XKVRANGE_VC_SEG :
66+ offset = XKVRANGE_VC_SHADOW_OFFSET ;
67+ break ;
68+ default :
69+ WARN_ON (1 );
70+ return NULL ;
7771 }
72+
73+ return (void * )((maddr >> KASAN_SHADOW_SCALE_SHIFT ) + offset );
74+ }
75+
76+ void * kasan_mem_to_shadow (const void * addr )
77+ {
78+ if (kasan_arch_is_ready ())
79+ return mem_to_shadow (addr );
80+ else
81+ return (void * )(kasan_early_shadow_page );
7882}
7983
8084const void * kasan_shadow_to_mem (const void * shadow_addr )
@@ -295,10 +299,8 @@ void __init kasan_init(void)
295299 /* Maps everything to a single page of zeroes */
296300 kasan_pgd_populate (KASAN_SHADOW_START , KASAN_SHADOW_END , NUMA_NO_NODE , true);
297301
298- kasan_populate_early_shadow (kasan_mem_to_shadow ((void * )VMALLOC_START ),
299- kasan_mem_to_shadow ((void * )KFENCE_AREA_END ));
300-
301- kasan_early_stage = false;
302+ kasan_populate_early_shadow (mem_to_shadow ((void * )VMALLOC_START ),
303+ mem_to_shadow ((void * )KFENCE_AREA_END ));
302304
303305 /* Populate the linear mapping */
304306 for_each_mem_range (i , & pa_start , & pa_end ) {
@@ -308,13 +310,13 @@ void __init kasan_init(void)
308310 if (start >= end )
309311 break ;
310312
311- kasan_map_populate ((unsigned long )kasan_mem_to_shadow (start ),
312- (unsigned long )kasan_mem_to_shadow (end ), NUMA_NO_NODE );
313+ kasan_map_populate ((unsigned long )mem_to_shadow (start ),
314+ (unsigned long )mem_to_shadow (end ), NUMA_NO_NODE );
313315 }
314316
315317 /* Populate modules mapping */
316- kasan_map_populate ((unsigned long )kasan_mem_to_shadow ((void * )MODULES_VADDR ),
317- (unsigned long )kasan_mem_to_shadow ((void * )MODULES_END ), NUMA_NO_NODE );
318+ kasan_map_populate ((unsigned long )mem_to_shadow ((void * )MODULES_VADDR ),
319+ (unsigned long )mem_to_shadow ((void * )MODULES_END ), NUMA_NO_NODE );
318320 /*
319321 * KAsan may reuse the contents of kasan_early_shadow_pte directly, so we
320322 * should make sure that it maps the zero page read-only.
@@ -329,5 +331,6 @@ void __init kasan_init(void)
329331
330332 /* At this point kasan is fully initialized. Enable error messages */
331333 init_task .kasan_depth = 0 ;
334+ kasan_early_stage = false;
332335 pr_info ("KernelAddressSanitizer initialized.\n" );
333336}
0 commit comments