Skip to content

Commit 3e39ce2

Browse files
author
Vasily Gorbik
committed
s390/kasan: add KASAN_VMALLOC support
Add KASAN_VMALLOC support which now enables vmalloc memory area access checks as well as enables usage of VMAP_STACK under kasan. KASAN_VMALLOC changes the way vmalloc and modules areas shadow memory is handled. With this new approach only top level page tables are pre-populated and lower levels are filled dynamically upon memory allocation. Acked-by: Ilya Leoshkevich <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]>
1 parent 1b68ac8 commit 3e39ce2

File tree

2 files changed

+57
-12
lines changed

2 files changed

+57
-12
lines changed

arch/s390/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ config S390
124124
select HAVE_ARCH_JUMP_LABEL
125125
select HAVE_ARCH_JUMP_LABEL_RELATIVE
126126
select HAVE_ARCH_KASAN
127+
select HAVE_ARCH_KASAN_VMALLOC
127128
select CPU_NO_EFFICIENT_FFS if !HAVE_MARCH_Z9_109_FEATURES
128129
select HAVE_ARCH_SECCOMP_FILTER
129130
select HAVE_ARCH_SOFT_DIRTY

arch/s390/mm/kasan_init.c

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ static pte_t * __init kasan_early_pte_alloc(void)
8282
enum populate_mode {
8383
POPULATE_ONE2ONE,
8484
POPULATE_MAP,
85-
POPULATE_ZERO_SHADOW
85+
POPULATE_ZERO_SHADOW,
86+
POPULATE_SHALLOW
8687
};
8788
static void __init kasan_early_vmemmap_populate(unsigned long address,
8889
unsigned long end,
@@ -116,6 +117,12 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
116117
pgd_populate(&init_mm, pg_dir, p4_dir);
117118
}
118119

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+
119126
p4_dir = p4d_offset(pg_dir, address);
120127
if (p4d_none(*p4_dir)) {
121128
if (mode == POPULATE_ZERO_SHADOW &&
@@ -130,6 +137,12 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
130137
p4d_populate(&init_mm, p4_dir, pu_dir);
131138
}
132139

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+
133146
pu_dir = pud_offset(p4_dir, address);
134147
if (pud_none(*pu_dir)) {
135148
if (mode == POPULATE_ZERO_SHADOW &&
@@ -195,6 +208,9 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
195208
page = kasan_early_shadow_page;
196209
pte_val(*pt_dir) = __pa(page) | pgt_prot_zero;
197210
break;
211+
case POPULATE_SHALLOW:
212+
/* should never happen */
213+
break;
198214
}
199215
}
200216
address += PAGE_SIZE;
@@ -313,22 +329,50 @@ void __init kasan_early_init(void)
313329
init_mm.pgd = early_pg_dir;
314330
/*
315331
* 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 ---+
327364
*/
328365
/* populate kasan shadow (for identity mapping and zero page mapping) */
329366
kasan_early_vmemmap_populate(__sha(0), __sha(memsize), POPULATE_MAP);
330367
if (IS_ENABLED(CONFIG_MODULES))
331368
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 */
332376
kasan_early_vmemmap_populate(__sha(max_physmem_end),
333377
__sha(untracked_mem_end),
334378
POPULATE_ZERO_SHADOW);

0 commit comments

Comments
 (0)