mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
s390/kasan: remove 3-level paging support
Compiling the kernel with Kasan disables automatic 3-level vs 4-level kernel space paging selection, because the shadow memory offset has to be known at compile time and there is no such offset which would be acceptable for both 3 and 4-level paging. Instead S390_4_LEVEL_PAGING option was introduced which allowed to pick how many paging levels to use under Kasan. With the introduction of protected virtualization, kernel memory layout may be affected due to ultravisor secure storage limit. This adds additional complexity into how memory layout would look like in combination with Kasan predefined shadow memory offsets. To simplify this make Kasan 4-level paging default and remove Kasan 3-level paging support. Suggested-by: Heiko Carstens <hca@linux.ibm.com> Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
This commit is contained in:
parent
f38b0a7439
commit
a3453d923e
@ -53,8 +53,7 @@ config ARCH_SUPPORTS_UPROBES
|
||||
config KASAN_SHADOW_OFFSET
|
||||
hex
|
||||
depends on KASAN
|
||||
default 0x18000000000000 if KASAN_S390_4_LEVEL_PAGING
|
||||
default 0x30000000000
|
||||
default 0x18000000000000
|
||||
|
||||
config S390
|
||||
def_bool y
|
||||
|
@ -5,13 +5,8 @@
|
||||
#ifdef CONFIG_KASAN
|
||||
|
||||
#define KASAN_SHADOW_SCALE_SHIFT 3
|
||||
#ifdef CONFIG_KASAN_S390_4_LEVEL_PAGING
|
||||
#define KASAN_SHADOW_SIZE \
|
||||
(_AC(1, UL) << (_REGION1_SHIFT - KASAN_SHADOW_SCALE_SHIFT))
|
||||
#else
|
||||
#define KASAN_SHADOW_SIZE \
|
||||
(_AC(1, UL) << (_REGION2_SHIFT - KASAN_SHADOW_SCALE_SHIFT))
|
||||
#endif
|
||||
#define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL)
|
||||
#define KASAN_SHADOW_START KASAN_SHADOW_OFFSET
|
||||
#define KASAN_SHADOW_END (KASAN_SHADOW_START + KASAN_SHADOW_SIZE)
|
||||
|
@ -123,8 +123,7 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||
pgd_populate(&init_mm, pg_dir, p4_dir);
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_KASAN_S390_4_LEVEL_PAGING) &&
|
||||
mode == POPULATE_SHALLOW) {
|
||||
if (mode == POPULATE_SHALLOW) {
|
||||
address = (address + P4D_SIZE) & P4D_MASK;
|
||||
continue;
|
||||
}
|
||||
@ -143,12 +142,6 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||
p4d_populate(&init_mm, p4_dir, pu_dir);
|
||||
}
|
||||
|
||||
if (!IS_ENABLED(CONFIG_KASAN_S390_4_LEVEL_PAGING) &&
|
||||
mode == POPULATE_SHALLOW) {
|
||||
address = (address + PUD_SIZE) & PUD_MASK;
|
||||
continue;
|
||||
}
|
||||
|
||||
pu_dir = pud_offset(p4_dir, address);
|
||||
if (pud_none(*pu_dir)) {
|
||||
if (mode == POPULATE_ZERO_SHADOW &&
|
||||
@ -281,7 +274,6 @@ void __init kasan_early_init(void)
|
||||
unsigned long shadow_alloc_size;
|
||||
unsigned long vmax_unlimited;
|
||||
unsigned long initrd_end;
|
||||
unsigned long asce_type;
|
||||
unsigned long memsize;
|
||||
unsigned long pgt_prot = pgprot_val(PAGE_KERNEL_RO);
|
||||
pte_t pte_z;
|
||||
@ -304,25 +296,12 @@ void __init kasan_early_init(void)
|
||||
memsize = min(memsize, OLDMEM_SIZE);
|
||||
memsize = min(memsize, KASAN_SHADOW_START);
|
||||
|
||||
if (IS_ENABLED(CONFIG_KASAN_S390_4_LEVEL_PAGING)) {
|
||||
/* 4 level paging */
|
||||
BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_START, P4D_SIZE));
|
||||
BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_END, P4D_SIZE));
|
||||
crst_table_init((unsigned long *)early_pg_dir,
|
||||
_REGION2_ENTRY_EMPTY);
|
||||
untracked_mem_end = kasan_vmax = vmax_unlimited = _REGION1_SIZE;
|
||||
if (has_uv_sec_stor_limit())
|
||||
kasan_vmax = min(vmax_unlimited, uv_info.max_sec_stor_addr);
|
||||
asce_type = _ASCE_TYPE_REGION2;
|
||||
} else {
|
||||
/* 3 level paging */
|
||||
BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_START, PUD_SIZE));
|
||||
BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_END, PUD_SIZE));
|
||||
crst_table_init((unsigned long *)early_pg_dir,
|
||||
_REGION3_ENTRY_EMPTY);
|
||||
untracked_mem_end = kasan_vmax = vmax_unlimited = _REGION2_SIZE;
|
||||
asce_type = _ASCE_TYPE_REGION3;
|
||||
}
|
||||
BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_START, P4D_SIZE));
|
||||
BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_END, P4D_SIZE));
|
||||
crst_table_init((unsigned long *)early_pg_dir, _REGION2_ENTRY_EMPTY);
|
||||
untracked_mem_end = kasan_vmax = vmax_unlimited = _REGION1_SIZE;
|
||||
if (has_uv_sec_stor_limit())
|
||||
kasan_vmax = min(vmax_unlimited, uv_info.max_sec_stor_addr);
|
||||
|
||||
/* init kasan zero shadow */
|
||||
crst_table_init((unsigned long *)kasan_early_shadow_p4d,
|
||||
@ -408,7 +387,7 @@ void __init kasan_early_init(void)
|
||||
pgalloc_freeable = pgalloc_pos;
|
||||
/* populate identity mapping */
|
||||
kasan_early_vmemmap_populate(0, memsize, POPULATE_ONE2ONE);
|
||||
kasan_set_pgd(early_pg_dir, asce_type);
|
||||
kasan_set_pgd(early_pg_dir, _ASCE_TYPE_REGION2);
|
||||
kasan_enable_dat();
|
||||
/* enable kasan */
|
||||
init_task.kasan_depth = 0;
|
||||
@ -428,24 +407,13 @@ void __init kasan_copy_shadow(pgd_t *pg_dir)
|
||||
pgd_t *pg_dir_dst;
|
||||
p4d_t *p4_dir_src;
|
||||
p4d_t *p4_dir_dst;
|
||||
pud_t *pu_dir_src;
|
||||
pud_t *pu_dir_dst;
|
||||
|
||||
pg_dir_src = pgd_offset_raw(early_pg_dir, KASAN_SHADOW_START);
|
||||
pg_dir_dst = pgd_offset_raw(pg_dir, KASAN_SHADOW_START);
|
||||
p4_dir_src = p4d_offset(pg_dir_src, KASAN_SHADOW_START);
|
||||
p4_dir_dst = p4d_offset(pg_dir_dst, KASAN_SHADOW_START);
|
||||
if (!p4d_folded(*p4_dir_src)) {
|
||||
/* 4 level paging */
|
||||
memcpy(p4_dir_dst, p4_dir_src,
|
||||
(KASAN_SHADOW_SIZE >> P4D_SHIFT) * sizeof(p4d_t));
|
||||
return;
|
||||
}
|
||||
/* 3 level paging */
|
||||
pu_dir_src = pud_offset(p4_dir_src, KASAN_SHADOW_START);
|
||||
pu_dir_dst = pud_offset(p4_dir_dst, KASAN_SHADOW_START);
|
||||
memcpy(pu_dir_dst, pu_dir_src,
|
||||
(KASAN_SHADOW_SIZE >> PUD_SHIFT) * sizeof(pud_t));
|
||||
memcpy(p4_dir_dst, p4_dir_src,
|
||||
(KASAN_SHADOW_SIZE >> P4D_SHIFT) * sizeof(p4d_t));
|
||||
}
|
||||
|
||||
void __init kasan_free_early_identity(void)
|
||||
|
@ -136,15 +136,6 @@ config KASAN_STACK
|
||||
default 1 if KASAN_STACK_ENABLE || CC_IS_GCC
|
||||
default 0
|
||||
|
||||
config KASAN_S390_4_LEVEL_PAGING
|
||||
bool "KASan: use 4-level paging"
|
||||
depends on S390
|
||||
help
|
||||
Compiling the kernel with KASan disables automatic 3-level vs
|
||||
4-level paging selection. 3-level paging is used by default (up
|
||||
to 3TB of RAM with KASan enabled). This options allows to force
|
||||
4-level paging instead.
|
||||
|
||||
config KASAN_SW_TAGS_IDENTIFY
|
||||
bool "Enable memory corruption identification"
|
||||
depends on KASAN_SW_TAGS
|
||||
|
Loading…
Reference in New Issue
Block a user