Re: [Xen-devel] [PATCH 03/10] VMX: Add PML definition and feature detection.

2015-03-29 Thread Kai Huang



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.

2015-03-27 Thread Andrew Cooper
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.

2015-03-26 Thread Kai Huang
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