]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
s390/kasan: remove 3-level paging support
authorVasily Gorbik <gor@linux.ibm.com>
Thu, 15 Oct 2020 08:01:42 +0000 (10:01 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 9 Nov 2020 10:20:58 +0000 (11:20 +0100)
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>
arch/s390/Kconfig
arch/s390/include/asm/kasan.h
arch/s390/mm/kasan_init.c
lib/Kconfig.kasan

index 4a2a12be04c964c6f4df1a227d90135761e5dd53..28bdb11e9db27e781dc94430ea646f40264daa1a 100644 (file)
@@ -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
index e9bf486de136b8809c192c344972c1d7712f6138..528dfb9be77a3328752d0d780bfb5cedcf377871 100644 (file)
@@ -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)
index 5646b39c728a92947d8ac02eed5275a93ed3d255..fcb2b533b2353c30aed6602fb606e313cdc571b4 100644 (file)
@@ -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)
index 542a9c18398e158ccec96f5adf952bd23737fd16..8fb097057fec85890c93796d2a77c2a93aaab1ee 100644 (file)
@@ -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