[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC v2 06/12] x86: add a xpti command line parameter
Add a command line parameter for controlling Xen page table isolation (XPTI): per default it is on for non-AMD systems in 64 bit pv domains. Possible settings are: - true: switched on even on AMD systems - false: switched off for all - nodom0: switched off for dom0 Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- docs/misc/xen-command-line.markdown | 18 ++++++++++++ xen/arch/x86/pv/domain.c | 55 +++++++++++++++++++++++++++++++++++++ xen/include/asm-x86/domain.h | 2 ++ 3 files changed, 75 insertions(+) diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index f5214defbb..90202a5cc9 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -1911,6 +1911,24 @@ In the case that x2apic is in use, this option switches between physical and clustered mode. The default, given no hint from the **FADT**, is cluster mode. +### xpti +> `= nodom0 | default | <boolean>` + +> Default: `false` on AMD hardware, `true` everywhere else. + +> Can be modified at runtime + +Override default selection of whether to isolate 64-bit PV guest page +tables. + +`true` activates page table isolation even on AMD hardware. + +`false` deactivates page table isolation on all systems. + +`nodom0` deactivates page table isolation for dom0. + +`default` switch to default settings. + ### xsave > `= <boolean>` diff --git a/xen/arch/x86/pv/domain.c b/xen/arch/x86/pv/domain.c index 74e9e667d2..7d50f9bc19 100644 --- a/xen/arch/x86/pv/domain.c +++ b/xen/arch/x86/pv/domain.c @@ -6,6 +6,7 @@ #include <xen/domain_page.h> #include <xen/errno.h> +#include <xen/init.h> #include <xen/lib.h> #include <xen/sched.h> @@ -17,6 +18,40 @@ #undef page_to_mfn #define page_to_mfn(pg) _mfn(__page_to_mfn(pg)) +static __read_mostly enum { + XPTI_DEFAULT, + XPTI_ON, + XPTI_OFF, + XPTI_NODOM0 +} opt_xpti = XPTI_DEFAULT; + +static int parse_xpti(const char *s) +{ + int rc = 0; + + switch ( parse_bool(s, NULL) ) + { + case 0: + opt_xpti = XPTI_OFF; + break; + case 1: + opt_xpti = XPTI_ON; + break; + default: + if ( !strcmp(s, "default") ) + opt_xpti = XPTI_DEFAULT; + else if ( !strcmp(s, "nodom0") ) + opt_xpti = XPTI_NODOM0; + else + rc = -EINVAL; + break; + } + + return rc; +} + +custom_runtime_param("xpti", parse_xpti); + static void noreturn continue_nonidle_domain(struct vcpu *v) { check_wakeup_from_wait(); @@ -76,6 +111,8 @@ int switch_compat(struct domain *d) goto undo_and_fail; } + d->arch.pv_domain.xpti = false; + domain_set_alloc_bitsize(d); recalculate_cpuid_policy(d); @@ -212,6 +249,24 @@ int pv_domain_initialise(struct domain *d, unsigned int domcr_flags, /* 64-bit PV guest by default. */ d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0; + switch (opt_xpti) + { + case XPTI_OFF: + d->arch.pv_domain.xpti = false; + break; + case XPTI_ON: + d->arch.pv_domain.xpti = true; + break; + case XPTI_NODOM0: + d->arch.pv_domain.xpti = boot_cpu_data.x86_vendor != X86_VENDOR_AMD && + d->domain_id != 0 && + d->domain_id != hardware_domid; + break; + case XPTI_DEFAULT: + d->arch.pv_domain.xpti = boot_cpu_data.x86_vendor != X86_VENDOR_AMD; + break; + } + return 0; fail: diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index 4679d5477d..f1230ac621 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -257,6 +257,8 @@ struct pv_domain struct mapcache_domain mapcache; struct cpuidmasks *cpuidmasks; + + bool xpti; }; struct monitor_write_data { -- 2.13.6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |