Re: [kvm-unit-tests PATCH] nVMX: Fix testing failure for canonical checks when forced emulation is not available

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

 




On 6/4/2025 7:20 AM, Sean Christopherson wrote:
> On Fri, May 23, 2025, Chenyi Qiang wrote:
>> Use the _safe() variant instead of _fep_safe() to avoid failure if the
>> forced emulated is not available.
>>
>> Fixes: 05fbb364b5b2 ("nVMX: add a test for canonical checks of various host state vmcs12 fields")
>> Signed-off-by: Chenyi Qiang <chenyi.qiang@xxxxxxxxx>
>> ---
>>  x86/vmx_tests.c | 5 ++---
>>  1 file changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
>> index 2f178227..01a15b7c 100644
>> --- a/x86/vmx_tests.c
>> +++ b/x86/vmx_tests.c
>> @@ -10881,12 +10881,11 @@ static int set_host_value(u64 vmcs_field, u64 value)
>>  	case HOST_BASE_GDTR:
>>  		sgdt(&dt_ptr);
>>  		dt_ptr.base = value;
>> -		lgdt(&dt_ptr);
>> -		return lgdt_fep_safe(&dt_ptr);
>> +		return lgdt_safe(&dt_ptr);
>>  	case HOST_BASE_IDTR:
>>  		sidt(&dt_ptr);
>>  		dt_ptr.base = value;
>> -		return lidt_fep_safe(&dt_ptr);
>> +		return lidt_safe(&dt_ptr);
> 
> Hmm, the main purpose of this particular test is to verify KVM's emulation of the
> canonical checks, so it probably makes sense to force emulation when possible.
> 
> It's not the most performant approach, but how about this?
> 
> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
> index 2f178227..fe53e989 100644
> --- a/x86/vmx_tests.c
> +++ b/x86/vmx_tests.c
> @@ -10881,12 +10881,13 @@ static int set_host_value(u64 vmcs_field, u64 value)
>         case HOST_BASE_GDTR:
>                 sgdt(&dt_ptr);
>                 dt_ptr.base = value;
> -               lgdt(&dt_ptr);
> -               return lgdt_fep_safe(&dt_ptr);
> +               return is_fep_available() ? lgdt_fep_safe(&dt_ptr) :
> +                                           lgdt_safe(&dt_ptr);
>         case HOST_BASE_IDTR:
>                 sidt(&dt_ptr);
>                 dt_ptr.base = value;
> -               return lidt_fep_safe(&dt_ptr);
> +               return is_fep_available() ? lidt_fep_safe(&dt_ptr) :
> +                                           lidt_safe(&dt_ptr);
>         case HOST_BASE_TR:
>                 /* Set the base and clear the busy bit */
>                 set_gdt_entry(FIRST_SPARE_SEL, value, 0x200, 0x89, 0);

The call of is_fep_available() itself will trigger the #UD exception:

Unhandled cpu exception 6 #UD at ip 000000000040efb5
error_code=0000      rflags=00010097      cs=00000008
rax=0000000000000000 rcx=00000000c0000101 rdx=000000000042d220
rbx=0000000000006c0c
rbp=000000000073bed0 rsi=ff45454545000000 rdi=0000000000000006
 r8=000000000043836e  r9=00000000000003f8 r10=000000000000000d
r11=00000000000071ba
r12=0000000000436daa r13=0000000000006c0c r14=000000000042d220
r15=0000000000420078
cr0=0000000080010031 cr2=ffffffffffffb000 cr3=0000000001007000
cr4=0000000000042020
cr8=0000000000000000
        STACK: @40efb5 40f0e9 40ff56 402039 403f11 4001bd

Maybe the result of is_fep_available() needs to be passed in from main()
function in some way instead of checking it in guest code.






[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