mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/dom0: disable SMAP for PV domain building only
Move the logic that disables SMAP so it's only performed when building a PV dom0, PVH dom0 builder doesn't require disabling SMAP. The fixes tag is to account for the wrong usage of cpu_has_smap in create_dom0(), it should instead have used boot_cpu_has(X86_FEATURE_XEN_SMAP). Fix while moving the logic to apply to PV only. While there also make cr4_pv32_mask __ro_after_init. Fixes:493ab190e5('xen/sm{e, a}p: allow disabling sm{e, a}p for Xen itself') Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> master commit:fb1658221amaster date: 2024-08-28 19:59:07 +0100
This commit is contained in:
1 parent
f29c2fb064
commit
4cb8c28987
3 files changed
+38
-23
No files matched your search
@@ -60,6 +60,8 @@ extern bool opt_dom0_verbose;
|
||||
extern bool opt_dom0_cpuid_faulting;
|
||||
extern bool opt_dom0_msr_relaxed;
|
||||
|
||||
extern unsigned long cr4_pv32_mask;
|
||||
|
||||
#define max_init_domid (0)
|
||||
|
||||
#endif
|
||||
@@ -354,11 +354,11 @@ static struct page_info * __init alloc_chunk(struct domain *d,
|
||||
return page;
|
||||
}
|
||||
|
||||
int __init dom0_construct_pv(struct domain *d,
|
||||
const module_t *image,
|
||||
unsigned long image_headroom,
|
||||
module_t *initrd,
|
||||
const char *cmdline)
|
||||
static int __init dom0_construct(struct domain *d,
|
||||
const module_t *image,
|
||||
unsigned long image_headroom,
|
||||
module_t *initrd,
|
||||
const char *cmdline)
|
||||
{
|
||||
int i, rc, order, machine;
|
||||
bool compatible, compat;
|
||||
@@ -1049,6 +1049,36 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
int __init dom0_construct_pv(struct domain *d,
|
||||
const module_t *image,
|
||||
unsigned long image_headroom,
|
||||
module_t *initrd,
|
||||
const char *cmdline)
|
||||
{
|
||||
int rc;
|
||||
|
||||
/*
|
||||
* Clear SMAP in CR4 to allow user-accesses in construct_dom0(). This
|
||||
* prevents us needing to rewrite construct_dom0() in terms of
|
||||
* copy_{to,from}_user().
|
||||
*/
|
||||
if ( boot_cpu_has(X86_FEATURE_XEN_SMAP) )
|
||||
{
|
||||
cr4_pv32_mask &= ~X86_CR4_SMAP;
|
||||
write_cr4(read_cr4() & ~X86_CR4_SMAP);
|
||||
}
|
||||
|
||||
rc = dom0_construct(d, image, image_headroom, initrd, cmdline);
|
||||
|
||||
if ( boot_cpu_has(X86_FEATURE_XEN_SMAP) )
|
||||
{
|
||||
write_cr4(read_cr4() | X86_CR4_SMAP);
|
||||
cr4_pv32_mask |= X86_CR4_SMAP;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
|
||||
+1
-18
@@ -75,7 +75,7 @@ static bool __initdata opt_invpcid = true;
|
||||
boolean_param("invpcid", opt_invpcid);
|
||||
bool __read_mostly use_invpcid;
|
||||
|
||||
unsigned long __read_mostly cr4_pv32_mask;
|
||||
unsigned long __ro_after_init cr4_pv32_mask;
|
||||
|
||||
/* **** Linux config option: propagated to domain0. */
|
||||
/* "acpi=off": Sisables both ACPI table parsing and interpreter. */
|
||||
@@ -946,26 +946,9 @@ static struct domain *__init create_dom0(const module_t *image,
|
||||
cmdline = dom0_cmdline;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
||||