From b83bf83c12bcbbd76688195048fa65e61d4b4197 Mon Sep 17 00:00:00 2001 From: Kai Huang Date: Mon, 4 May 2015 12:09:03 +0200 Subject: [PATCH] vmx: add new boot parameter to control PML enabling A top level EPT parameter "ept=" and a sub boolean "opt_pml_enabled" are added to control PML. Other booleans can be further added for any other EPT related features. The document description for the new parameter is also added. Signed-off-by: Kai Huang Reviewed-by: Andrew Cooper Acked-by: Tim Deegan Acked-by: Kevin Tian --- docs/misc/xen-command-line.markdown | 15 ++++++++++ tools/tests/x86_emulator/test_x86_emulator.c | 2 +- xen/arch/x86/hvm/vmx/vmcs.c | 30 ++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index 1dda1f0604..4889e27626 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -685,6 +685,21 @@ requirement can be relaxed. This option is particularly useful for nested virtualization, to allow the L1 hypervisor to use EPT even if the L0 hypervisor does not provide VM\_ENTRY\_LOAD\_GUEST\_PAT. +### ept (Intel) +> `= List of ( pml )` + +> Default: `false` + +Controls EPT related features. Currently only Page Modification Logging (PML) is +the controllable feature as boolean type. + +PML is a new hardware feature in Intel's Broadwell Server and further platforms +which reduces hypervisor overhead of log-dirty mechanism by automatically +recording GPAs (guest physical addresses) when guest memory gets dirty, and +therefore significantly reducing number of EPT violation caused by write +protection of guest memory, which is a necessity to implement log-dirty +mechanism before PML. + ### gdb > `= [/][,DPS[,[,[,[,]]]] | pci | amt ] ` diff --git a/tools/tests/x86_emulator/test_x86_emulator.c b/tools/tests/x86_emulator/test_x86_emulator.c index b789edf0ca..1b78bf7e45 100644 --- a/tools/tests/x86_emulator/test_x86_emulator.c +++ b/tools/tests/x86_emulator/test_x86_emulator.c @@ -288,7 +288,7 @@ int main(int argc, char **argv) rc = x86_emulate(&ctxt, &emulops); if ( (rc != X86EMUL_OKAY) || (*res != 0x923456AA) || - ((regs.eflags&0xad5) != 0xa91) || + ((regs.eflags & 0xad5) != 0xa91) || (regs.eax != 0xAABBCCAA) || (regs.ecx != 0xFF) || (regs.eip != (unsigned long)&instr[4]) ) diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index 8b98a9f52e..0a9a1aafbb 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -64,6 +64,36 @@ integer_param("ple_gap", ple_gap); static unsigned int __read_mostly ple_window = 4096; integer_param("ple_window", ple_window); +static bool_t __read_mostly opt_pml_enabled = 0; + +/* + * The 'ept' parameter controls functionalities that depend on, or impact the + * EPT mechanism. Optional comma separated value may contain: + * + * pml Enable PML + */ +static void __init parse_ept_param(char *s) +{ + char *ss; + + do { + bool_t val = !!strncmp(s, "no-", 3); + + if ( !val ) + s += 3; + + ss = strchr(s, ','); + if ( ss ) + *ss = '\0'; + + if ( !strcmp(s, "pml") ) + opt_pml_enabled = val; + + s = ss + 1; + } while ( ss ); +} +custom_param("ept", parse_ept_param); + /* Dynamic (run-time adjusted) execution control flags. */ u32 vmx_pin_based_exec_control __read_mostly; u32 vmx_cpu_based_exec_control __read_mostly; -- 2.30.2