@@ -82,7 +82,8 @@ static pte_t * __init kasan_early_pte_alloc(void)
82
82
enum populate_mode {
83
83
POPULATE_ONE2ONE ,
84
84
POPULATE_MAP ,
85
- POPULATE_ZERO_SHADOW
85
+ POPULATE_ZERO_SHADOW ,
86
+ POPULATE_SHALLOW
86
87
};
87
88
static void __init kasan_early_vmemmap_populate (unsigned long address ,
88
89
unsigned long end ,
@@ -116,6 +117,12 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
116
117
pgd_populate (& init_mm , pg_dir , p4_dir );
117
118
}
118
119
120
+ if (IS_ENABLED (CONFIG_KASAN_S390_4_LEVEL_PAGING ) &&
121
+ mode == POPULATE_SHALLOW ) {
122
+ address = (address + P4D_SIZE ) & P4D_MASK ;
123
+ continue ;
124
+ }
125
+
119
126
p4_dir = p4d_offset (pg_dir , address );
120
127
if (p4d_none (* p4_dir )) {
121
128
if (mode == POPULATE_ZERO_SHADOW &&
@@ -130,6 +137,12 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
130
137
p4d_populate (& init_mm , p4_dir , pu_dir );
131
138
}
132
139
140
+ if (!IS_ENABLED (CONFIG_KASAN_S390_4_LEVEL_PAGING ) &&
141
+ mode == POPULATE_SHALLOW ) {
142
+ address = (address + PUD_SIZE ) & PUD_MASK ;
143
+ continue ;
144
+ }
145
+
133
146
pu_dir = pud_offset (p4_dir , address );
134
147
if (pud_none (* pu_dir )) {
135
148
if (mode == POPULATE_ZERO_SHADOW &&
@@ -195,6 +208,9 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
195
208
page = kasan_early_shadow_page ;
196
209
pte_val (* pt_dir ) = __pa (page ) | pgt_prot_zero ;
197
210
break ;
211
+ case POPULATE_SHALLOW :
212
+ /* should never happen */
213
+ break ;
198
214
}
199
215
}
200
216
address += PAGE_SIZE ;
@@ -313,22 +329,50 @@ void __init kasan_early_init(void)
313
329
init_mm .pgd = early_pg_dir ;
314
330
/*
315
331
* Current memory layout:
316
- * +- 0 -------------+ +- shadow start -+
317
- * | 1:1 ram mapping | /| 1/8 ram |
318
- * +- end of ram ----+ / +----------------+
319
- * | ... gap ... |/ | kasan |
320
- * +- shadow start --+ | zero |
321
- * | 1/8 addr space | | page |
322
- * +- shadow end -+ | mapping |
323
- * | ... gap ... |\ | (untracked) |
324
- * +- modules vaddr -+ \ +----------------+
325
- * | 2Gb | \| unmapped | allocated per module
326
- * +-----------------+ +- shadow end ---+
332
+ * +- 0 -------------+ +- shadow start -+
333
+ * | 1:1 ram mapping | /| 1/8 ram |
334
+ * | | / | |
335
+ * +- end of ram ----+ / +----------------+
336
+ * | ... gap ... | / | |
337
+ * | |/ | kasan |
338
+ * +- shadow start --+ | zero |
339
+ * | 1/8 addr space | | page |
340
+ * +- shadow end -+ | mapping |
341
+ * | ... gap ... |\ | (untracked) |
342
+ * +- vmalloc area -+ \ | |
343
+ * | vmalloc_size | \ | |
344
+ * +- modules vaddr -+ \ +----------------+
345
+ * | 2Gb | \| unmapped | allocated per module
346
+ * +-----------------+ +- shadow end ---+
347
+ *
348
+ * Current memory layout (KASAN_VMALLOC):
349
+ * +- 0 -------------+ +- shadow start -+
350
+ * | 1:1 ram mapping | /| 1/8 ram |
351
+ * | | / | |
352
+ * +- end of ram ----+ / +----------------+
353
+ * | ... gap ... | / | kasan |
354
+ * | |/ | zero |
355
+ * +- shadow start --+ | page |
356
+ * | 1/8 addr space | | mapping |
357
+ * +- shadow end -+ | (untracked) |
358
+ * | ... gap ... |\ | |
359
+ * +- vmalloc area -+ \ +- vmalloc area -+
360
+ * | vmalloc_size | \ |shallow populate|
361
+ * +- modules vaddr -+ \ +- modules area -+
362
+ * | 2Gb | \|shallow populate|
363
+ * +-----------------+ +- shadow end ---+
327
364
*/
328
365
/* populate kasan shadow (for identity mapping and zero page mapping) */
329
366
kasan_early_vmemmap_populate (__sha (0 ), __sha (memsize ), POPULATE_MAP );
330
367
if (IS_ENABLED (CONFIG_MODULES ))
331
368
untracked_mem_end = vmax - MODULES_LEN ;
369
+ if (IS_ENABLED (CONFIG_KASAN_VMALLOC )) {
370
+ untracked_mem_end = vmax - vmalloc_size - MODULES_LEN ;
371
+ /* shallowly populate kasan shadow for vmalloc and modules */
372
+ kasan_early_vmemmap_populate (__sha (untracked_mem_end ),
373
+ __sha (vmax ), POPULATE_SHALLOW );
374
+ }
375
+ /* populate kasan shadow for untracked memory */
332
376
kasan_early_vmemmap_populate (__sha (max_physmem_end ),
333
377
__sha (untracked_mem_end ),
334
378
POPULATE_ZERO_SHADOW );
0 commit comments