]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
x86/boot: Skip realmode init code when running as Xen PV guest
authorJuergen Gross <jgross@suse.com>
Wed, 23 Nov 2022 11:45:23 +0000 (12:45 +0100)
committerBorislav Petkov <bp@suse.de>
Fri, 25 Nov 2022 11:05:22 +0000 (12:05 +0100)
When running as a Xen PV guest there is no need for setting up the
realmode trampoline, as realmode isn't supported in this environment.

Trying to setup the trampoline has been proven to be problematic in
some cases, especially when trying to debug early boot problems with
Xen requiring to keep the EFI boot-services memory mapped (some
firmware variants seem to claim basically all memory below 1Mb for boot
services).

Introduce new x86_platform_ops operations for that purpose, which can
be set to a NOP by the Xen PV specific kernel boot code.

  [ bp: s/call_init_real_mode/do_init_real_mode/ ]

Fixes: 084ee1c641a0 ("x86, realmode: Relocator for realmode code")
Suggested-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20221123114523.3467-1-jgross@suse.com
arch/x86/include/asm/realmode.h
arch/x86/include/asm/x86_init.h
arch/x86/kernel/setup.c
arch/x86/kernel/x86_init.c
arch/x86/realmode/init.c
arch/x86/xen/enlighten_pv.c

index fd6f6e5b755a7823c50ef4f6e2fe4daaee09caf5..a336feef0af14318bf3776e417c4fbcd8277b976 100644 (file)
@@ -91,6 +91,7 @@ static inline void set_real_mode_mem(phys_addr_t mem)
 
 void reserve_real_mode(void);
 void load_trampoline_pgtable(void);
+void init_real_mode(void);
 
 #endif /* __ASSEMBLY__ */
 
index e9170457697e4ca6605c151ef08865799ad533e6..c1c8c581759d69bfe807a81bfa5eb3a799d2ebc8 100644 (file)
@@ -285,6 +285,8 @@ struct x86_hyper_runtime {
  *                             possible in x86_early_init_platform_quirks() by
  *                             only using the current x86_hardware_subarch
  *                             semantics.
+ * @realmode_reserve:          reserve memory for realmode trampoline
+ * @realmode_init:             initialize realmode trampoline
  * @hyper:                     x86 hypervisor specific runtime callbacks
  */
 struct x86_platform_ops {
@@ -301,6 +303,8 @@ struct x86_platform_ops {
        void (*apic_post_init)(void);
        struct x86_legacy_features legacy;
        void (*set_legacy_features)(void);
+       void (*realmode_reserve)(void);
+       void (*realmode_init)(void);
        struct x86_hyper_runtime hyper;
        struct x86_guest guest;
 };
index 216fee7144eefd4f76eca0d34df9bc84c2754bbc..892609cde4a20fb60469da7e1a788536cf470dd2 100644 (file)
@@ -1175,7 +1175,7 @@ void __init setup_arch(char **cmdline_p)
         * Moreover, on machines with SandyBridge graphics or in setups that use
         * crashkernel the entire 1M is reserved anyway.
         */
-       reserve_real_mode();
+       x86_platform.realmode_reserve();
 
        init_mem_mapping();
 
index 57353519bc119e7458f9a35d172d5f199ba9e75b..ef80d361b4632ec64bb8aacd0f0bf6e88acb1021 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/iommu.h>
 #include <asm/mach_traps.h>
 #include <asm/irqdomain.h>
+#include <asm/realmode.h>
 
 void x86_init_noop(void) { }
 void __init x86_init_uint_noop(unsigned int unused) { }
@@ -145,6 +146,8 @@ struct x86_platform_ops x86_platform __ro_after_init = {
        .get_nmi_reason                 = default_get_nmi_reason,
        .save_sched_clock_state         = tsc_save_sched_clock_state,
        .restore_sched_clock_state      = tsc_restore_sched_clock_state,
+       .realmode_reserve               = reserve_real_mode,
+       .realmode_init                  = init_real_mode,
        .hyper.pin_vcpu                 = x86_op_int_noop,
 
        .guest = {
index 41d7669a97ad167f50485fab3ac1ebafe255ddfc..af565816d2ba6aed5df706910d9e43e773b53fcb 100644 (file)
@@ -200,14 +200,18 @@ static void __init set_real_mode_permissions(void)
        set_memory_x((unsigned long) text_start, text_size >> PAGE_SHIFT);
 }
 
-static int __init init_real_mode(void)
+void __init init_real_mode(void)
 {
        if (!real_mode_header)
                panic("Real mode trampoline was not allocated");
 
        setup_real_mode();
        set_real_mode_permissions();
+}
 
+static int __init do_init_real_mode(void)
+{
+       x86_platform.realmode_init();
        return 0;
 }
-early_initcall(init_real_mode);
+early_initcall(do_init_real_mode);
index 038da45f057a7a85ade569160b8518dd76d70f44..8944726255c9c2e4c7760b9381b0bb1b3e8a7a7b 100644 (file)
@@ -1266,6 +1266,8 @@ asmlinkage __visible void __init xen_start_kernel(struct start_info *si)
        xen_vcpu_info_reset(0);
 
        x86_platform.get_nmi_reason = xen_get_nmi_reason;
+       x86_platform.realmode_reserve = x86_init_noop;
+       x86_platform.realmode_init = x86_init_noop;
 
        x86_init.resources.memory_setup = xen_memory_setup;
        x86_init.irqs.intr_mode_select  = x86_init_noop;