[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] Revert "x86/dom0: delay setting SMAP after dom0 build is done"
commit bec25f11d5180d407cf04d2de2525fa6f876bde1 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Mon Aug 5 12:55:37 2024 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Mon Aug 5 12:55:37 2024 +0200 Revert "x86/dom0: delay setting SMAP after dom0 build is done" This reverts commit ac6b9309694de9b2b5163886656282f6ada71565. The change crashes Xen on boot on SMAP-capable systems. --- xen/arch/x86/setup.c | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index a7a85e94e3..eee20bb175 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -80,7 +80,7 @@ int8_t __initdata opt_probe_port_aliases = -1; boolean_param("probe-port-aliases", opt_probe_port_aliases); /* Only used in asm code and within this source file */ -unsigned long asmlinkage __ro_after_init cr4_pv32_mask; +unsigned long asmlinkage __read_mostly cr4_pv32_mask; /* **** Linux config option: propagated to domain0. */ /* "acpi=off": Sisables both ACPI table parsing and interpreter. */ @@ -955,9 +955,26 @@ static struct domain *__init create_dom0(const module_t *image, } } + /* + * Temporarily clear SMAP in CR4 to allow user-accesses in construct_dom0(). + * This saves a large number of corner cases interactions with + * copy_from_user(). + */ + if ( cpu_has_smap ) + { + cr4_pv32_mask &= ~X86_CR4_SMAP; + write_cr4(read_cr4() & ~X86_CR4_SMAP); + } + if ( construct_dom0(d, image, headroom, initrd, cmdline) != 0 ) panic("Could not construct domain 0\n"); + if ( cpu_has_smap ) + { + write_cr4(read_cr4() | X86_CR4_SMAP); + cr4_pv32_mask |= X86_CR4_SMAP; + } + return d; } @@ -1890,26 +1907,16 @@ void asmlinkage __init noreturn __start_xen(unsigned long mbi_p) if ( cpu_has_smep && opt_smep != SMEP_HVM_ONLY ) setup_force_cpu_cap(X86_FEATURE_XEN_SMEP); if ( boot_cpu_has(X86_FEATURE_XEN_SMEP) ) - { set_in_cr4(X86_CR4_SMEP); - BUILD_BUG_ON(!(X86_CR4_SMEP & XEN_CR4_PV32_BITS)); - cr4_pv32_mask |= X86_CR4_SMEP; - } if ( !opt_smap ) setup_clear_cpu_cap(X86_FEATURE_SMAP); if ( cpu_has_smap && opt_smap != SMAP_HVM_ONLY ) setup_force_cpu_cap(X86_FEATURE_XEN_SMAP); if ( boot_cpu_has(X86_FEATURE_XEN_SMAP) ) - /* - * Set SMAP on the %cr4 mask so that it's set for APs on bringup, but - * don't set for the BSP until domain building is done. - * - * Don't set it in cr4_pv32_mask either, until it's also set on the - * BSP. Otherwise the BUG in cr4_pv32_restore would trigger for events - * received on the BSP. - */ - mmu_cr4_features |= X86_CR4_SMAP; + set_in_cr4(X86_CR4_SMAP); + + cr4_pv32_mask = mmu_cr4_features & XEN_CR4_PV32_BITS; if ( boot_cpu_has(X86_FEATURE_FSGSBASE) ) set_in_cr4(X86_CR4_FSGSBASE); @@ -2041,19 +2048,6 @@ void asmlinkage __init noreturn __start_xen(unsigned long mbi_p) if ( !dom0 ) panic("Could not set up DOM0 guest OS\n"); - /* - * Enable SMAP only after being done with the domain building phase, as the - * PV builder switches to the domain page-tables and must be run with SMAP - * disabled. - */ - if ( boot_cpu_has(X86_FEATURE_XEN_SMAP) ) - { - ASSERT(mmu_cr4_features & X86_CR4_SMAP); - write_cr4(read_cr4() | X86_CR4_SMAP); - BUILD_BUG_ON(!(X86_CR4_SMAP & XEN_CR4_PV32_BITS)); - cr4_pv32_mask |= X86_CR4_SMAP; - } - heap_init_late(); init_trace_bufs(); -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |