Changeset 80121 in vbox for trunk/include/VBox
- Timestamp:
- Aug 5, 2019 6:30:43 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 132562
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/hmvmxinline.h
r80112 r80121 745 745 { 746 746 # 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); 748 752 if (RT_LIKELY(rcMsc == 0)) 749 753 return VINF_SUCCESS; 750 754 return rcMsc == 2 ? VERR_VMX_INVALID_VMCS_PTR : VERR_VMX_INVALID_VMCS_FIELD; 755 # endif 751 756 752 757 # 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; 754 768 __asm__ __volatile__ ( 755 769 ".byte 0x0f, 0x79, 0xc2 # VMWRITE eax, edx \n\t" … … 767 781 ); 768 782 return rc; 783 # endif 769 784 770 785 # elif defined(RT_ARCH_X86) … … 873 888 { 874 889 # if VMX_USE_MSC_INTRINSICS 890 # ifdef VBOX_WITH_VMREAD_VMWRITE_NOCHECK 891 __vmx_vmwrite(uFieldEnc, u64Val); 892 return VINF_SUCCESS; 893 # else 875 894 unsigned char rcMsc = __vmx_vmwrite(uFieldEnc, u64Val); 876 895 if (RT_LIKELY(rcMsc == 0)) 877 896 return VINF_SUCCESS; 878 897 return rcMsc == 2 ? VERR_VMX_INVALID_VMCS_PTR : VERR_VMX_INVALID_VMCS_FIELD; 898 # endif 879 899 880 900 # 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 881 910 int rc; 882 911 __asm__ __volatile__ ( … … 895 924 ); 896 925 return rc; 926 # endif 897 927 898 928 # else … … 989 1019 { 990 1020 # 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 991 1027 unsigned char rcMsc; 992 1028 uint64_t u64Tmp; … … 996 1032 return VINF_SUCCESS; 997 1033 return rcMsc == 2 ? VERR_VMX_INVALID_VMCS_PTR : VERR_VMX_INVALID_VMCS_FIELD; 1034 # endif 998 1035 999 1036 # 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 1000 1046 int rc; 1001 1047 __asm__ __volatile__ ( … … 1015 1061 ); 1016 1062 return rc; 1063 # endif 1017 1064 1018 1065 # elif defined(RT_ARCH_X86) … … 1132 1179 { 1133 1180 # if VMX_USE_MSC_INTRINSICS 1181 # ifdef VBOX_WITH_VMREAD_NOCHECK 1182 __vmx_vmread(uFieldEnc, pData); 1183 return VINF_SUCCESS; 1184 # else 1134 1185 unsigned char rcMsc; 1135 1186 rcMsc = __vmx_vmread(uFieldEnc, pData); … … 1137 1188 return VINF_SUCCESS; 1138 1189 return rcMsc == 2 ? VERR_VMX_INVALID_VMCS_PTR : VERR_VMX_INVALID_VMCS_FIELD; 1190 # endif 1139 1191 1140 1192 # 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 1141 1202 int rc; 1142 1203 __asm__ __volatile__ ( … … 1156 1217 ); 1157 1218 return rc; 1158 1219 # endif 1159 1220 # else 1160 1221 # error "Shouldn't be here..."
Note:
See TracChangeset
for help on using the changeset viewer.