| From: Borislav Petkov <bp@suse.de> |
| Date: Mon, 25 Dec 2017 13:57:16 +0100 |
| Subject: x86/kaiser: Move feature detection up |
| |
| ... before the first use of kaiser_enabled as otherwise funky |
| things happen: |
| |
| about to get started... |
| (XEN) d0v0 Unhandled page fault fault/trap [#14, ec=0000] |
| (XEN) Pagetable walk from ffff88022a449090: |
| (XEN) L4[0x110] = 0000000229e0e067 0000000000001e0e |
| (XEN) L3[0x008] = 0000000000000000 ffffffffffffffff |
| (XEN) domain_crash_sync called from entry.S: fault at ffff82d08033fd08 |
| entry.o#create_bounce_frame+0x135/0x14d |
| (XEN) Domain 0 (vcpu#0) crashed on cpu#0: |
| (XEN) ----[ Xen-4.9.1_02-3.21 x86_64 debug=n Not tainted ]---- |
| (XEN) CPU: 0 |
| (XEN) RIP: e033:[<ffffffff81007460>] |
| (XEN) RFLAGS: 0000000000000286 EM: 1 CONTEXT: pv guest (d0v0) |
| |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| [bwh: Backported to 3.2: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/x86/include/asm/kaiser.h | 2 ++ |
| arch/x86/kernel/setup.c | 7 +++++++ |
| arch/x86/mm/kaiser.c | 2 -- |
| 3 files changed, 9 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/include/asm/kaiser.h |
| +++ b/arch/x86/include/asm/kaiser.h |
| @@ -96,8 +96,10 @@ DECLARE_PER_CPU(unsigned long, x86_cr3_p |
| extern char __per_cpu_user_mapped_start[], __per_cpu_user_mapped_end[]; |
| |
| extern int kaiser_enabled; |
| +extern void __init kaiser_check_boottime_disable(void); |
| #else |
| #define kaiser_enabled 0 |
| +static inline void __init kaiser_check_boottime_disable(void) {} |
| #endif /* CONFIG_KAISER */ |
| |
| /* |
| --- a/arch/x86/kernel/setup.c |
| +++ b/arch/x86/kernel/setup.c |
| @@ -114,6 +114,7 @@ |
| #include <asm/mce.h> |
| #include <asm/alternative.h> |
| #include <asm/prom.h> |
| +#include <asm/kaiser.h> |
| |
| /* |
| * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries. |
| @@ -921,6 +922,12 @@ void __init setup_arch(char **cmdline_p) |
| */ |
| init_hypervisor_platform(); |
| |
| + /* |
| + * This needs to happen right after XENPV is set on xen and |
| + * kaiser_enabled is checked below in cleanup_highmap(). |
| + */ |
| + kaiser_check_boottime_disable(); |
| + |
| x86_init.resources.probe_roms(); |
| |
| /* after parse_early_param, so could debug it */ |
| --- a/arch/x86/mm/kaiser.c |
| +++ b/arch/x86/mm/kaiser.c |
| @@ -318,8 +318,6 @@ void __init kaiser_init(void) |
| { |
| int cpu; |
| |
| - kaiser_check_boottime_disable(); |
| - |
| if (!kaiser_enabled) |
| return; |
| |