VirtualBox

Changeset 80121 in vbox for trunk/include/VBox


Ignore:
Timestamp:
Aug 5, 2019 6:30:43 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
132562
Message:

hmvmxinline.h: Added VBOX_WITH_VMREAD_VMWRITE_NOCHECK and corresponding assembly. Disabled currently only tested on Linux host.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/hmvmxinline.h

    r80112 r80121  
    745745{
    746746# if VMX_USE_MSC_INTRINSICS
    747      unsigned char rcMsc = __vmx_vmwrite(uFieldEnc, u32Val);
     747#  ifdef VBOX_WITH_VMREAD_VMWRITE_NOCHECK
     748    __vmx_vmwrite(uFieldEnc, u32Val);
     749    return VINF_SUCCESS;
     750#  else
     751    unsigned char rcMsc = __vmx_vmwrite(uFieldEnc, u32Val);
    748752     if (RT_LIKELY(rcMsc == 0))
    749753         return VINF_SUCCESS;
    750754     return rcMsc == 2 ? VERR_VMX_INVALID_VMCS_PTR : VERR_VMX_INVALID_VMCS_FIELD;
     755#  endif
    751756
    752757# elif RT_INLINE_ASM_GNU_STYLE
    753     int rc;
     758#  ifdef VBOX_WITH_VMREAD_VMWRITE_NOCHECK
     759    __asm__ __volatile__ (
     760       ".byte  0x0f, 0x79, 0xc2        # VMWRITE eax, edx       \n\t"
     761       :
     762       :"a"(uFieldEnc),
     763        "d"(u32Val)
     764       );
     765    return VINF_SUCCESS;
     766#  else
     767     int rc;
    754768    __asm__ __volatile__ (
    755769       ".byte  0x0f, 0x79, 0xc2        # VMWRITE eax, edx       \n\t"
     
    767781       );
    768782    return rc;
     783#  endif
    769784
    770785# elif defined(RT_ARCH_X86)
     
    873888{
    874889# if VMX_USE_MSC_INTRINSICS
     890#  ifdef VBOX_WITH_VMREAD_VMWRITE_NOCHECK
     891    __vmx_vmwrite(uFieldEnc, u64Val);
     892    return VINF_SUCCESS;
     893#  else
    875894    unsigned char rcMsc = __vmx_vmwrite(uFieldEnc, u64Val);
    876895    if (RT_LIKELY(rcMsc == 0))
    877896        return VINF_SUCCESS;
    878897    return rcMsc == 2 ? VERR_VMX_INVALID_VMCS_PTR : VERR_VMX_INVALID_VMCS_FIELD;
     898#  endif
    879899
    880900# elif RT_INLINE_ASM_GNU_STYLE
     901#  ifdef VBOX_WITH_VMREAD_VMWRITE_NOCHECK
     902    __asm__ __volatile__ (
     903       ".byte  0x0f, 0x79, 0xc2        # VMWRITE eax, edx        \n\t"
     904       :
     905       :"a"(uFieldEnc),
     906        "d"(u64Val)
     907       );
     908    return VINF_SUCCESS;
     909#  else
    881910    int rc;
    882911    __asm__ __volatile__ (
     
    895924       );
    896925    return rc;
     926#  endif
    897927
    898928# else
     
    9891019{
    9901020# if VMX_USE_MSC_INTRINSICS
     1021#  ifdef VBOX_WITH_VMREAD_VMWRITE_NOCHECK
     1022    uint64_t u64Tmp = 0;
     1023    __vmx_vmread(uFieldEnc, &u64Tmp);
     1024    *pData = (uint32_t)u64Tmp;
     1025    return VINF_SUCCESS;
     1026#  else
    9911027    unsigned char rcMsc;
    9921028    uint64_t u64Tmp;
     
    9961032        return VINF_SUCCESS;
    9971033    return rcMsc == 2 ? VERR_VMX_INVALID_VMCS_PTR : VERR_VMX_INVALID_VMCS_FIELD;
     1034#  endif
    9981035
    9991036# elif RT_INLINE_ASM_GNU_STYLE
     1037#  ifdef VBOX_WITH_VMREAD_VMWRITE_NOCHECK
     1038    __asm__ __volatile__ (
     1039       ".byte  0x0f, 0x78, 0xc2        # VMREAD eax, edx         \n\t"
     1040       :"=d"(*pData)
     1041       :"a"(uFieldEnc),
     1042        "d"(0)
     1043       );
     1044    return VINF_SUCCESS;
     1045#  else
    10001046    int rc;
    10011047    __asm__ __volatile__ (
     
    10151061       );
    10161062    return rc;
     1063#  endif
    10171064
    10181065# elif defined(RT_ARCH_X86)
     
    11321179{
    11331180# if VMX_USE_MSC_INTRINSICS
     1181#  ifdef VBOX_WITH_VMREAD_NOCHECK
     1182    __vmx_vmread(uFieldEnc, pData);
     1183    return VINF_SUCCESS;
     1184#  else
    11341185    unsigned char rcMsc;
    11351186    rcMsc = __vmx_vmread(uFieldEnc, pData);
     
    11371188        return VINF_SUCCESS;
    11381189    return rcMsc == 2 ? VERR_VMX_INVALID_VMCS_PTR : VERR_VMX_INVALID_VMCS_FIELD;
     1190#  endif
    11391191
    11401192# elif RT_INLINE_ASM_GNU_STYLE
     1193#  ifdef VBOX_WITH_VMREAD_NOCHECK
     1194    __asm__ __volatile__ (
     1195       ".byte  0x0f, 0x78, 0xc2        # VMREAD eax, edx         \n\t"
     1196       :"=d"(*pData)
     1197       :"a"(uFieldEnc),
     1198        "d"(0)
     1199       );
     1200    return VINF_SUCCESS;
     1201#  else
    11411202    int rc;
    11421203    __asm__ __volatile__ (
     
    11561217       );
    11571218    return rc;
    1158 
     1219#  endif
    11591220# else
    11601221#  error "Shouldn't be here..."
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette