|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] 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 <kai.huang@xxxxxxxxxxxxxxx>
> ---
> 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 0x00001000
> #define SECONDARY_EXEC_ENABLE_VMFUNC 0x00002000
> #define SECONDARY_EXEC_ENABLE_VMCS_SHADOWING 0x00004000
> +#define SECONDARY_EXEC_ENABLE_PML 0x00020000
> extern u32 vmx_secondary_exec_control;
>
> #define VMX_EPT_EXEC_ONLY_SUPPORTED 0x00000001
> @@ -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 0x80000000
>
> @@ -320,6 +323,7 @@ enum vmcs_field {
> GUEST_LDTR_SELECTOR = 0x0000080c,
> GUEST_TR_SELECTOR = 0x0000080e,
> GUEST_INTR_STATUS = 0x00000810,
> + GUEST_PML_INDEX = 0x00000812,
> HOST_ES_SELECTOR = 0x00000c00,
> HOST_CS_SELECTOR = 0x00000c02,
> HOST_SS_SELECTOR = 0x00000c04,
> @@ -333,6 +337,7 @@ enum vmcs_field {
> VM_EXIT_MSR_STORE_ADDR = 0x00002006,
> VM_EXIT_MSR_LOAD_ADDR = 0x00002008,
> VM_ENTRY_MSR_LOAD_ADDR = 0x0000200a,
> + PML_ADDRESS = 0x0000200e,
> TSC_OFFSET = 0x00002010,
> VIRTUAL_APIC_PAGE_ADDR = 0x00002012,
> APIC_ACCESS_ADDR = 0x00002014,
> 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
> #define EXIT_REASON_INVPCID 58
> +#define EXIT_REASON_PML_FULL 62
>
> /*
> * Interruption-information format
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |