Re: [PATCH 2/2][kvm-unit-test] nVMX x86: Check VMX-preemption timer controls on vmentry of L2 guests

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/11/18 06:21, Krish Sadhukhan wrote:
> According to section "Checks on VMX Controls" in Intel SDM vol 3C, the
> following check needs to be enforced on vmentry of L2 guests:
> 
>     If the "activate VMX-preemption timer" VM-execution control is 0, the
>     the "save VMX-preemption timer value" VM-exit control must also be 0.
> 
> Signed-off-by: Krish Sadhukhan <krish.sadhukhan@xxxxxxxxxx>
> Reviewed-by: Mihai Carabas <mihai.carabas@xxxxxxxxxx>
> ---
>  x86/vmx_tests.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 50 insertions(+)
> 
> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
> index b105b23..7f49048 100644
> --- a/x86/vmx_tests.c
> +++ b/x86/vmx_tests.c
> @@ -4721,6 +4721,55 @@ static void test_pml(void)
>  	vmcs_write(CPU_EXEC_CTRL1, secondary_saved);
>  }
>  
> + /*
> + * If the "activate VMX-preemption timer" VM-execution control is 0, the
> + * the "save VMX-preemption timer value" VM-exit control must also be 0.
> + *
> + *  [Intel SDM]
> + */
> +static void test_vmx_preemption_timer(void)
> +{
> +	u32 saved_pin = vmcs_read(PIN_CONTROLS);
> +	u32 saved_exit = vmcs_read(EXI_CONTROLS);
> +	u32 pin = saved_pin;
> +	u32 exit = saved_exit;
> +
> +	if (!((ctrl_exit_rev.clr & EXI_SAVE_PREEMPT) ||
> +	    (ctrl_pin_rev.clr & PIN_PREEMPT))) {
> +		printf("\"Save-VMX-preemption-timer\" control and/or \"Enable-VMX-preemption-timer\" control is not supported\n");
> +		return;
> +	}
> +
> +	pin |= PIN_PREEMPT;
> +	vmcs_write(PIN_CONTROLS, pin);
> +	exit &= ~EXI_SAVE_PREEMPT;
> +	vmcs_write(EXI_CONTROLS, exit);
> +	report_prefix_pushf("enable-VMX-preemption-timer enabled, save-VMX-preemption-timer disabled");
> +	test_vmx_controls(true, false);
> +	report_prefix_pop();
> +
> +	exit |= EXI_SAVE_PREEMPT;
> +	vmcs_write(EXI_CONTROLS, exit);
> +	report_prefix_pushf("enable-VMX-preemption-timer enabled, save-VMX-preemption-timer enabled");
> +	test_vmx_controls(true, false);
> +	report_prefix_pop();
> +
> +	pin &= ~PIN_PREEMPT;
> +	vmcs_write(PIN_CONTROLS, pin);
> +	report_prefix_pushf("enable-VMX-preemption-timer disabled, save-VMX-preemption-timer enabled");
> +	test_vmx_controls(false, false);
> +	report_prefix_pop();
> +
> +	exit &= ~EXI_SAVE_PREEMPT;
> +	vmcs_write(EXI_CONTROLS, exit);
> +	report_prefix_pushf("enable-VMX-preemption-timer disabled, save-VMX-preemption-timer disabled");
> +	test_vmx_controls(true, false);
> +	report_prefix_pop();
> +
> +	vmcs_write(PIN_CONTROLS, saved_pin);
> +	vmcs_write(EXI_CONTROLS, saved_exit);
> +}
> +
>  /*
>   * Check that the virtual CPU checks all of the VMX controls as
>   * documented in the Intel SDM.
> @@ -4747,6 +4796,7 @@ static void vmx_controls_test(void)
>  	test_invalid_event_injection();
>  	test_vpid();
>  	test_eptp();
> +	test_vmx_preemption_timer();
>  }
>  
>  static bool valid_vmcs_for_vmentry(void)
> 

The following is needed too:

diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index fe187c5..7a8d6ce 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -183,6 +183,8 @@ static int preemption_timer_exit_handler(void)
 			vmx_set_test_stage(4);
 			vmcs_write(PIN_CONTROLS,
 				   vmcs_read(PIN_CONTROLS) & ~PIN_PREEMPT);
+			vmcs_write(EXI_CONTROLS,
+				   vmcs_read(EXI_CONTROLS) & ~EXI_SAVE_PREEMPT);
 			vmcs_write(GUEST_ACTV_STATE, ACTV_ACTIVE);
 			return VMX_TEST_RESUME;
 		case 4:

Paolo



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux