s390/kaslr: provide kaslr_enabled() function
authorHeiko Carstens <hca@linux.ibm.com>
Fri, 31 Mar 2023 13:03:22 +0000 (15:03 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Thu, 13 Apr 2023 15:36:25 +0000 (17:36 +0200)
Just like other architectures provide a kaslr_enabled() function, instead
of directly accessing a global variable.

Also pass the renamed __kaslr_enabled variable from the decompressor to the
kernel, so that kalsr_enabled() is available there too. This will be used
by a subsequent patch which randomizes the module base load address.

Reviewed-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/boot/boot.h
arch/s390/boot/ipl_parm.c
arch/s390/boot/pgm_check_info.c
arch/s390/boot/startup.c
arch/s390/include/asm/setup.h
arch/s390/kernel/setup.c

index 872963c8a0abe27ec5ae0eb21160529b1cf45642..5baa855c21cbc527334a179bd4e0fc6c0e7733ef 100644 (file)
@@ -79,7 +79,6 @@ extern const char kernel_version[];
 extern unsigned long memory_limit;
 extern unsigned long vmalloc_size;
 extern int vmalloc_size_set;
-extern int kaslr_enabled;
 extern char __boot_data_start[], __boot_data_end[];
 extern char __boot_data_preserved_start[], __boot_data_preserved_end[];
 extern char _decompressor_syms_start[], _decompressor_syms_end[];
index c1f8f7999fed4c2ce4b76cfd2c9d13bff98d783c..8753cb0339e559e8486dab3b54320d4379fe81a2 100644 (file)
@@ -24,11 +24,11 @@ int __bootdata(noexec_disabled);
 unsigned int __bootdata_preserved(zlib_dfltcc_support) = ZLIB_DFLTCC_FULL;
 struct ipl_parameter_block __bootdata_preserved(ipl_block);
 int __bootdata_preserved(ipl_block_valid);
+int __bootdata_preserved(__kaslr_enabled);
 
 unsigned long vmalloc_size = VMALLOC_DEFAULT_SIZE;
 unsigned long memory_limit;
 int vmalloc_size_set;
-int kaslr_enabled;
 
 static inline int __diag308(unsigned long subcode, void *addr)
 {
@@ -264,7 +264,7 @@ void parse_boot_command_line(void)
        char *args;
        int rc;
 
-       kaslr_enabled = IS_ENABLED(CONFIG_RANDOMIZE_BASE);
+       __kaslr_enabled = IS_ENABLED(CONFIG_RANDOMIZE_BASE);
        args = strcpy(command_line_buf, early_command_line);
        while (*args) {
                args = next_arg(args, &param, &val);
@@ -300,7 +300,7 @@ void parse_boot_command_line(void)
                        modify_fac_list(val);
 
                if (!strcmp(param, "nokaslr"))
-                       kaslr_enabled = 0;
+                       __kaslr_enabled = 0;
 
 #if IS_ENABLED(CONFIG_KVM)
                if (!strcmp(param, "prot_virt")) {
index 0861e3c403f814f302601fedff02950a1feca418..97244cd7a206968398224c8e0ef6ed42402165cb 100644 (file)
@@ -153,7 +153,7 @@ void print_pgm_check_info(void)
                decompressor_printk("Kernel command line: %s\n", early_command_line);
        decompressor_printk("Kernel fault: interruption code %04x ilc:%x\n",
                            S390_lowcore.pgm_code, S390_lowcore.pgm_ilc >> 1);
-       if (kaslr_enabled)
+       if (kaslr_enabled())
                decompressor_printk("Kernel random base: %lx\n", __kaslr_offset);
        decompressor_printk("PSW : %016lx %016lx (%pS)\n",
                            S390_lowcore.psw_save_area.mask,
index bdf305a939879cfe6ea38dcec99ef5e3416dd213..cc0ca7e0cd6d8da0c7a0043e43ee2bca83c49cec 100644 (file)
@@ -160,10 +160,10 @@ static void setup_ident_map_size(unsigned long max_physmem_end)
 
 #ifdef CONFIG_CRASH_DUMP
        if (oldmem_data.start) {
-               kaslr_enabled = 0;
+               __kaslr_enabled = 0;
                ident_map_size = min(ident_map_size, oldmem_data.size);
        } else if (ipl_block_valid && is_ipl_block_dump()) {
-               kaslr_enabled = 0;
+               __kaslr_enabled = 0;
                if (!sclp_early_get_hsa_size(&hsa_size) && hsa_size)
                        ident_map_size = min(ident_map_size, hsa_size);
        }
@@ -315,7 +315,7 @@ void startup_kernel(void)
        save_ipl_cert_comp_list();
        rescue_initrd(safe_addr, ident_map_size);
 
-       if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && kaslr_enabled) {
+       if (kaslr_enabled()) {
                random_lma = get_random_base();
                if (random_lma) {
                        __kaslr_offset = random_lma - vmlinux.default_lma;
index b28d250efbaa1b6f2769ff4cf2bc12eeaff6496f..f191255c60db68aa6ba87a657896d38d1dcbecaf 100644 (file)
@@ -146,6 +146,13 @@ static inline unsigned long kaslr_offset(void)
        return __kaslr_offset;
 }
 
+extern int __kaslr_enabled;
+static inline int kaslr_enabled(void)
+{
+       if (IS_ENABLED(CONFIG_RANDOMIZE_BASE))
+               return __kaslr_enabled;
+       return 0;
+}
 
 struct oldmem_data {
        unsigned long start;
index f2d0d52b3070d211e19b44d03c4c98ac52eeb258..0903fe35663410fb01760b494e4e7f67452b959f 100644 (file)
@@ -150,6 +150,7 @@ unsigned long __bootdata(ident_map_size);
 struct physmem_info __bootdata(physmem_info);
 
 unsigned long __bootdata_preserved(__kaslr_offset);
+int __bootdata_preserved(__kaslr_enabled);
 unsigned int __bootdata_preserved(zlib_dfltcc_support);
 EXPORT_SYMBOL(zlib_dfltcc_support);
 u64 __bootdata_preserved(stfle_fac_list[16]);