Re: [Xen-devel] [PATCH 03/10] VMX: Add PML definition and feature detection.
On 03/28/2015 04:46 AM, Andrew Cooper wrote: On 27/03/15 02:35, Kai Huang wrote: The patch adds PML definition and feature detection. Note PML won't be detected if PML is disabled from boot parameter. PML is also disabled in construct_vmcs, as it will only be enabled when domain is switched to log dirty mode. Signed-off-by: Kai Huang --- xen/arch/x86/hvm/vmx/vmcs.c| 18 ++ xen/include/asm-x86/hvm/vmx/vmcs.h | 5 + xen/include/asm-x86/hvm/vmx/vmx.h | 1 + 3 files changed, 24 insertions(+) diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index 9b20a4b..2798b0b 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -143,6 +143,7 @@ static void __init vmx_display_features(void) P(cpu_has_vmx_virtual_intr_delivery, "Virtual Interrupt Delivery"); P(cpu_has_vmx_posted_intr_processing, "Posted Interrupt Processing"); P(cpu_has_vmx_vmcs_shadowing, "VMCS shadowing"); +P(cpu_has_vmx_pml, "Page Modification Logging"); #undef P if ( !printed ) @@ -240,6 +241,8 @@ static int vmx_init_vmcs_config(void) opt |= SECONDARY_EXEC_ENABLE_VPID; if ( opt_unrestricted_guest_enabled ) opt |= SECONDARY_EXEC_UNRESTRICTED_GUEST; +if ( pml_enable ) This should be named opt_pml_enable in patch 1 or 2 to identify that it is a command line option. Sure. +opt |= SECONDARY_EXEC_ENABLE_PML; /* * "APIC Register Virtualization" and "Virtual Interrupt Delivery" @@ -286,6 +289,14 @@ static int vmx_init_vmcs_config(void) */ if ( !(_vmx_ept_vpid_cap & VMX_VPID_INVVPID_ALL_CONTEXT) ) _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_VPID; + + /* +* PML cannot be supported if EPT A/D bits is not supported. Actually, +* PML should not be detected if EPT A/D bits is not supported, but for +* sure we do it anyway. +*/ + if ( !(_vmx_ept_vpid_cap & VMX_EPT_AD_BIT_SUPPORT) ) + _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; } if ( _vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT ) @@ -306,6 +317,10 @@ static int vmx_init_vmcs_config(void) SECONDARY_EXEC_UNRESTRICTED_GUEST); } +/* PML cannot be supported if we don't use EPT */ +if ( !(_vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT) ) +_vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; + Somewhere in here you should clear pml_enable if hardware doesn't support it. Will do. Thanks for catching. Thanks, -Kai ~Andrew if ( (_vmx_secondary_exec_control & SECONDARY_EXEC_PAUSE_LOOP_EXITING) && ple_gap == 0 ) { @@ -1041,6 +1056,9 @@ static int construct_vmcs(struct vcpu *v) __vmwrite(POSTED_INTR_NOTIFICATION_VECTOR, posted_intr_vector); } +/* Disable PML anyway here as it will only be enabled in log dirty mode */ +v->arch.hvm_vmx.secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; + /* Host data selectors. */ __vmwrite(HOST_SS_SELECTOR, __HYPERVISOR_DS); __vmwrite(HOST_DS_SELECTOR, __HYPERVISOR_DS); diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index 4528346..47b4df2 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -216,6 +216,7 @@ extern u32 vmx_vmentry_control; #define SECONDARY_EXEC_ENABLE_INVPCID 0x1000 #define SECONDARY_EXEC_ENABLE_VMFUNC0x2000 #define SECONDARY_EXEC_ENABLE_VMCS_SHADOWING0x4000 +#define SECONDARY_EXEC_ENABLE_PML 0x0002 extern u32 vmx_secondary_exec_control; #define VMX_EPT_EXEC_ONLY_SUPPORTED 0x0001 @@ -276,6 +277,8 @@ extern u32 vmx_secondary_exec_control; (vmx_pin_based_exec_control & PIN_BASED_POSTED_INTERRUPT) #define cpu_has_vmx_vmcs_shadowing \ (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_VMCS_SHADOWING) +#define cpu_has_vmx_pml \ +(vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_PML) #define VMCS_RID_TYPE_MASK 0x8000 @@ -320,6 +323,7 @@ enum vmcs_field { GUEST_LDTR_SELECTOR = 0x080c, GUEST_TR_SELECTOR = 0x080e, GUEST_INTR_STATUS = 0x0810, +GUEST_PML_INDEX = 0x0812, HOST_ES_SELECTOR= 0x0c00, HOST_CS_SELECTOR= 0x0c02, HOST_SS_SELECTOR= 0x0c04, @@ -333,6 +337,7 @@ enum vmcs_field { VM_EXIT_MSR_STORE_ADDR = 0x2006, VM_EXIT_MSR_LOAD_ADDR = 0x2008, VM_ENTRY_MSR_LOAD_ADDR = 0x200a, +PML_ADDRESS = 0x200e, TSC_OFFSET = 0x2010, VIRTUAL_APIC_PAGE_ADDR = 0x2012, APIC_ACCESS_ADDR=
Re: [Xen-devel] [PATCH 03/10] VMX: Add PML definition and feature detection.
On 27/03/15 02:35, Kai Huang wrote: > The patch adds PML definition and feature detection. Note PML won't be > detected > if PML is disabled from boot parameter. PML is also disabled in > construct_vmcs, > as it will only be enabled when domain is switched to log dirty mode. > > Signed-off-by: Kai Huang > --- > xen/arch/x86/hvm/vmx/vmcs.c| 18 ++ > xen/include/asm-x86/hvm/vmx/vmcs.h | 5 + > xen/include/asm-x86/hvm/vmx/vmx.h | 1 + > 3 files changed, 24 insertions(+) > > diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c > index 9b20a4b..2798b0b 100644 > --- a/xen/arch/x86/hvm/vmx/vmcs.c > +++ b/xen/arch/x86/hvm/vmx/vmcs.c > @@ -143,6 +143,7 @@ static void __init vmx_display_features(void) > P(cpu_has_vmx_virtual_intr_delivery, "Virtual Interrupt Delivery"); > P(cpu_has_vmx_posted_intr_processing, "Posted Interrupt Processing"); > P(cpu_has_vmx_vmcs_shadowing, "VMCS shadowing"); > +P(cpu_has_vmx_pml, "Page Modification Logging"); > #undef P > > if ( !printed ) > @@ -240,6 +241,8 @@ static int vmx_init_vmcs_config(void) > opt |= SECONDARY_EXEC_ENABLE_VPID; > if ( opt_unrestricted_guest_enabled ) > opt |= SECONDARY_EXEC_UNRESTRICTED_GUEST; > +if ( pml_enable ) This should be named opt_pml_enable in patch 1 or 2 to identify that it is a command line option. > +opt |= SECONDARY_EXEC_ENABLE_PML; > > /* > * "APIC Register Virtualization" and "Virtual Interrupt Delivery" > @@ -286,6 +289,14 @@ static int vmx_init_vmcs_config(void) > */ > if ( !(_vmx_ept_vpid_cap & VMX_VPID_INVVPID_ALL_CONTEXT) ) > _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_VPID; > + > + /* > + * PML cannot be supported if EPT A/D bits is not supported. Actually, > + * PML should not be detected if EPT A/D bits is not supported, but for > + * sure we do it anyway. > + */ > + if ( !(_vmx_ept_vpid_cap & VMX_EPT_AD_BIT_SUPPORT) ) > + _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; > } > > if ( _vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT ) > @@ -306,6 +317,10 @@ static int vmx_init_vmcs_config(void) >SECONDARY_EXEC_UNRESTRICTED_GUEST); > } > > +/* PML cannot be supported if we don't use EPT */ > +if ( !(_vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT) ) > +_vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; > + Somewhere in here you should clear pml_enable if hardware doesn't support it. ~Andrew > if ( (_vmx_secondary_exec_control & SECONDARY_EXEC_PAUSE_LOOP_EXITING) && >ple_gap == 0 ) > { > @@ -1041,6 +1056,9 @@ static int construct_vmcs(struct vcpu *v) > __vmwrite(POSTED_INTR_NOTIFICATION_VECTOR, posted_intr_vector); > } > > +/* Disable PML anyway here as it will only be enabled in log dirty mode > */ > +v->arch.hvm_vmx.secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; > + > /* Host data selectors. */ > __vmwrite(HOST_SS_SELECTOR, __HYPERVISOR_DS); > __vmwrite(HOST_DS_SELECTOR, __HYPERVISOR_DS); > diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h > b/xen/include/asm-x86/hvm/vmx/vmcs.h > index 4528346..47b4df2 100644 > --- a/xen/include/asm-x86/hvm/vmx/vmcs.h > +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h > @@ -216,6 +216,7 @@ extern u32 vmx_vmentry_control; > #define SECONDARY_EXEC_ENABLE_INVPCID 0x1000 > #define SECONDARY_EXEC_ENABLE_VMFUNC0x2000 > #define SECONDARY_EXEC_ENABLE_VMCS_SHADOWING0x4000 > +#define SECONDARY_EXEC_ENABLE_PML 0x0002 > extern u32 vmx_secondary_exec_control; > > #define VMX_EPT_EXEC_ONLY_SUPPORTED 0x0001 > @@ -276,6 +277,8 @@ extern u32 vmx_secondary_exec_control; > (vmx_pin_based_exec_control & PIN_BASED_POSTED_INTERRUPT) > #define cpu_has_vmx_vmcs_shadowing \ > (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_VMCS_SHADOWING) > +#define cpu_has_vmx_pml \ > +(vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_PML) > > #define VMCS_RID_TYPE_MASK 0x8000 > > @@ -320,6 +323,7 @@ enum vmcs_field { > GUEST_LDTR_SELECTOR = 0x080c, > GUEST_TR_SELECTOR = 0x080e, > GUEST_INTR_STATUS = 0x0810, > +GUEST_PML_INDEX = 0x0812, > HOST_ES_SELECTOR= 0x0c00, > HOST_CS_SELECTOR= 0x0c02, > HOST_SS_SELECTOR= 0x0c04, > @@ -333,6 +337,7 @@ enum vmcs_field { > VM_EXIT_MSR_STORE_ADDR = 0x2006, > VM_EXIT_MSR_LOAD_ADDR = 0x2008, > VM_ENTRY_MSR_LOAD_ADDR = 0x200a, > +PML_ADDRESS = 0x200e, > TSC_OFFSET = 0x2010, > VIRTUAL_APIC_PAGE_ADDR = 0x2012, > A
[Xen-devel] [PATCH 03/10] VMX: Add PML definition and feature detection.
The patch adds PML definition and feature detection. Note PML won't be detected if PML is disabled from boot parameter. PML is also disabled in construct_vmcs, as it will only be enabled when domain is switched to log dirty mode. Signed-off-by: Kai Huang --- xen/arch/x86/hvm/vmx/vmcs.c| 18 ++ xen/include/asm-x86/hvm/vmx/vmcs.h | 5 + xen/include/asm-x86/hvm/vmx/vmx.h | 1 + 3 files changed, 24 insertions(+) diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index 9b20a4b..2798b0b 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -143,6 +143,7 @@ static void __init vmx_display_features(void) P(cpu_has_vmx_virtual_intr_delivery, "Virtual Interrupt Delivery"); P(cpu_has_vmx_posted_intr_processing, "Posted Interrupt Processing"); P(cpu_has_vmx_vmcs_shadowing, "VMCS shadowing"); +P(cpu_has_vmx_pml, "Page Modification Logging"); #undef P if ( !printed ) @@ -240,6 +241,8 @@ static int vmx_init_vmcs_config(void) opt |= SECONDARY_EXEC_ENABLE_VPID; if ( opt_unrestricted_guest_enabled ) opt |= SECONDARY_EXEC_UNRESTRICTED_GUEST; +if ( pml_enable ) +opt |= SECONDARY_EXEC_ENABLE_PML; /* * "APIC Register Virtualization" and "Virtual Interrupt Delivery" @@ -286,6 +289,14 @@ static int vmx_init_vmcs_config(void) */ if ( !(_vmx_ept_vpid_cap & VMX_VPID_INVVPID_ALL_CONTEXT) ) _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_VPID; + + /* +* PML cannot be supported if EPT A/D bits is not supported. Actually, +* PML should not be detected if EPT A/D bits is not supported, but for +* sure we do it anyway. +*/ + if ( !(_vmx_ept_vpid_cap & VMX_EPT_AD_BIT_SUPPORT) ) + _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; } if ( _vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT ) @@ -306,6 +317,10 @@ static int vmx_init_vmcs_config(void) SECONDARY_EXEC_UNRESTRICTED_GUEST); } +/* PML cannot be supported if we don't use EPT */ +if ( !(_vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT) ) +_vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; + if ( (_vmx_secondary_exec_control & SECONDARY_EXEC_PAUSE_LOOP_EXITING) && ple_gap == 0 ) { @@ -1041,6 +1056,9 @@ static int construct_vmcs(struct vcpu *v) __vmwrite(POSTED_INTR_NOTIFICATION_VECTOR, posted_intr_vector); } +/* Disable PML anyway here as it will only be enabled in log dirty mode */ +v->arch.hvm_vmx.secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML; + /* Host data selectors. */ __vmwrite(HOST_SS_SELECTOR, __HYPERVISOR_DS); __vmwrite(HOST_DS_SELECTOR, __HYPERVISOR_DS); diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index 4528346..47b4df2 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -216,6 +216,7 @@ extern u32 vmx_vmentry_control; #define SECONDARY_EXEC_ENABLE_INVPCID 0x1000 #define SECONDARY_EXEC_ENABLE_VMFUNC0x2000 #define SECONDARY_EXEC_ENABLE_VMCS_SHADOWING0x4000 +#define SECONDARY_EXEC_ENABLE_PML 0x0002 extern u32 vmx_secondary_exec_control; #define VMX_EPT_EXEC_ONLY_SUPPORTED 0x0001 @@ -276,6 +277,8 @@ extern u32 vmx_secondary_exec_control; (vmx_pin_based_exec_control & PIN_BASED_POSTED_INTERRUPT) #define cpu_has_vmx_vmcs_shadowing \ (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_VMCS_SHADOWING) +#define cpu_has_vmx_pml \ +(vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_PML) #define VMCS_RID_TYPE_MASK 0x8000 @@ -320,6 +323,7 @@ enum vmcs_field { GUEST_LDTR_SELECTOR = 0x080c, GUEST_TR_SELECTOR = 0x080e, GUEST_INTR_STATUS = 0x0810, +GUEST_PML_INDEX = 0x0812, HOST_ES_SELECTOR= 0x0c00, HOST_CS_SELECTOR= 0x0c02, HOST_SS_SELECTOR= 0x0c04, @@ -333,6 +337,7 @@ enum vmcs_field { VM_EXIT_MSR_STORE_ADDR = 0x2006, VM_EXIT_MSR_LOAD_ADDR = 0x2008, VM_ENTRY_MSR_LOAD_ADDR = 0x200a, +PML_ADDRESS = 0x200e, TSC_OFFSET = 0x2010, VIRTUAL_APIC_PAGE_ADDR = 0x2012, APIC_ACCESS_ADDR= 0x2014, diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h b/xen/include/asm-x86/hvm/vmx/vmx.h index 9afd351..c0e352d 100644 --- a/xen/include/asm-x86/hvm/vmx/vmx.h +++ b/xen/include/asm-x86/hvm/vmx/vmx.h @@ -186,6 +186,7 @@ static inline unsigned long pi_get_pir(struct pi_desc *pi_desc, int group) #define EXIT_REASON_XSETBV 55 #define EXIT_REASON_APIC_WRITE 56 #defin