]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
s390/protvirt: parse prot_virt option in the decompressor
authorVasily Gorbik <gor@linux.ibm.com>
Fri, 11 Sep 2020 09:38:21 +0000 (11:38 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 16 Sep 2020 12:08:47 +0000 (14:08 +0200)
To make early kernel address space layout definition possible parse
prot_virt option in the decompressor and pass it to the uncompressed
kernel. This enables kasan to take ultravisor secure storage limit into
consideration and pre-define vmalloc position correctly.

Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/boot/ipl_parm.c
arch/s390/boot/uv.c
arch/s390/kernel/setup.c
arch/s390/kernel/uv.c

index ae230ebd6420b05739d5cc2a786629b5ae0c33ad..92ebc4a58fe2d138ee2a876d2215124d4e3cfa03 100644 (file)
@@ -254,6 +254,14 @@ void parse_boot_command_line(void)
 
                if (!strcmp(param, "nokaslr"))
                        kaslr_enabled = 0;
+
+#if IS_ENABLED(CONFIG_KVM)
+               if (!strcmp(param, "prot_virt")) {
+                       rc = kstrtobool(val, &enabled);
+                       if (!rc && enabled)
+                               prot_virt_host = 1;
+               }
+#endif
        }
 }
 
index f887a479cdc7ec13b8058481011ad3a7b7781fdb..a15c033f53ca42a4228e4a30265749c69747bb4f 100644 (file)
@@ -7,6 +7,9 @@
 #ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
 int __bootdata_preserved(prot_virt_guest);
 #endif
+#if IS_ENABLED(CONFIG_KVM)
+int __bootdata_preserved(prot_virt_host);
+#endif
 struct uv_info __bootdata_preserved(uv_info);
 
 void uv_query_info(void)
index d63b08bacdf9d944e1995b619ef68612783a32bc..dd3fa7039cb0e23f9187462991d515aea494a765 100644 (file)
@@ -1137,8 +1137,7 @@ void __init setup_arch(char **cmdline_p)
        free_mem_detect_info();
        remove_oldmem();
 
-       if (is_prot_virt_host())
-               setup_uv();
+       setup_uv();
        setup_memory_end();
        setup_memory();
        dma_contiguous_reserve(memory_end);
index d3399b8a9b2374a132d54801940787e0950eeba9..4233245737bd94117478348342bd0d21fe904bf8 100644 (file)
@@ -26,33 +26,10 @@ int __bootdata_preserved(prot_virt_guest);
 struct uv_info __bootdata_preserved(uv_info);
 
 #if IS_ENABLED(CONFIG_KVM)
-int prot_virt_host;
+int __bootdata_preserved(prot_virt_host);
 EXPORT_SYMBOL(prot_virt_host);
 EXPORT_SYMBOL(uv_info);
 
-static int __init prot_virt_setup(char *val)
-{
-       bool enabled;
-       int rc;
-
-       rc = kstrtobool(val, &enabled);
-       if (!rc && enabled)
-               prot_virt_host = 1;
-
-       if (is_prot_virt_guest() && prot_virt_host) {
-               prot_virt_host = 0;
-               pr_warn("Protected virtualization not available in protected guests.");
-       }
-
-       if (prot_virt_host && !test_facility(158)) {
-               prot_virt_host = 0;
-               pr_warn("Protected virtualization not supported by the hardware.");
-       }
-
-       return rc;
-}
-early_param("prot_virt", prot_virt_setup);
-
 static int __init uv_init(unsigned long stor_base, unsigned long stor_len)
 {
        struct uv_cb_init uvcb = {
@@ -74,6 +51,21 @@ void __init setup_uv(void)
 {
        unsigned long uv_stor_base;
 
+       if (!is_prot_virt_host())
+               return;
+
+       if (is_prot_virt_guest()) {
+               prot_virt_host = 0;
+               pr_warn("Protected virtualization not available in protected guests.");
+               return;
+       }
+
+       if (!test_facility(158)) {
+               prot_virt_host = 0;
+               pr_warn("Protected virtualization not supported by the hardware.");
+               return;
+       }
+
        uv_stor_base = (unsigned long)memblock_alloc_try_nid(
                uv_info.uv_base_stor_len, SZ_1M, SZ_2G,
                MEMBLOCK_ALLOC_ACCESSIBLE, NUMA_NO_NODE);