Changeset 71020 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Feb 14, 2018 10:46:51 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 120883
- Location:
- trunk/src/VBox/VMM/VMMR3
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/EM.cpp
r70984 r71020 44 44 #include <VBox/vmm/trpm.h> 45 45 #include <VBox/vmm/iem.h> 46 #include <VBox/vmm/nem.h> 46 47 #include <VBox/vmm/iom.h> 47 48 #include <VBox/vmm/dbgf.h> … … 1400 1401 1401 1402 X86EFLAGS EFlags = pCtx->eflags; 1402 /** @todo NEM: scheduling. */1403 1403 if (!VM_IS_RAW_MODE_ENABLED(pVM)) 1404 1404 { 1405 /* 1406 * Hardware accelerated raw-mode: 1407 */ 1408 if ( EMIsHwVirtExecutionEnabled(pVM) 1409 && HMR3CanExecuteGuest(pVM, pCtx)) 1410 return EMSTATE_HM; 1411 1412 /* 1413 * Note! Raw mode and hw accelerated mode are incompatible. The latter 1414 * turns off monitoring features essential for raw mode! 1415 */ 1416 return EMSTATE_IEM_THEN_REM; 1405 if (EMIsHwVirtExecutionEnabled(pVM)) 1406 { 1407 if (VM_IS_HM_ENABLED(pVM)) 1408 { 1409 if (HMR3CanExecuteGuest(pVM, pCtx)) 1410 return EMSTATE_HM; 1411 } 1412 else if (NEMR3CanExecuteGuest(pVM, pVCpu, pCtx)) 1413 return EMSTATE_NEM; 1414 1415 /* 1416 * Note! Raw mode and hw accelerated mode are incompatible. The latter 1417 * turns off monitoring features essential for raw mode! 1418 */ 1419 return EMSTATE_IEM_THEN_REM; 1420 } 1417 1421 } 1418 1422 -
trunk/src/VBox/VMM/VMMR3/NEMR3Native-win.cpp
r70979 r71020 37 37 38 38 #include <VBox/vmm/nem.h> 39 #include <VBox/vmm/apic.h> 39 40 #include "NEMInternal.h" 40 41 #include <VBox/vmm/vm.h> … … 162 163 pvInput, cbInput, pvOutput, cbOutput); 163 164 if (!hEvt && !pfnApcCallback && !pvApcCtx) 164 Log Rel(("VID!NtDeviceIoControlFile: hFile=%#zx pIos=%p->{s:%#x, i:%#zx} uFunction=%#x Input=%p LB %#x Output=%p LB %#x) -> %#x; Caller=%p\n",165 165 Log6(("VID!NtDeviceIoControlFile: hFile=%#zx pIos=%p->{s:%#x, i:%#zx} uFunction=%#x Input=%p LB %#x Output=%p LB %#x) -> %#x; Caller=%p\n", 166 hFile, pIos, pIos->Status, pIos->Information, uFunction, pvInput, cbInput, pvOutput, cbOutput, rcNt, ASMReturnAddress())); 166 167 else 167 Log Rel(("VID!NtDeviceIoControlFile: hFile=%#zx hEvt=%#zx Apc=%p/%p pIos=%p->{s:%#x, i:%#zx} uFunction=%#x Input=%p LB %#x Output=%p LB %#x) -> %#x; Caller=%p\n",168 169 168 Log6(("VID!NtDeviceIoControlFile: hFile=%#zx hEvt=%#zx Apc=%p/%p pIos=%p->{s:%#x, i:%#zx} uFunction=%#x Input=%p LB %#x Output=%p LB %#x) -> %#x; Caller=%p\n", 169 hFile, hEvt, pfnApcCallback, pvApcCtx, pIos, pIos->Status, pIos->Information, uFunction, 170 pvInput, cbInput, pvOutput, cbOutput, rcNt, ASMReturnAddress())); 170 171 return rcNt; 171 172 } … … 869 870 870 871 872 static int nemR3WinCopyOutState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx) 873 { 874 WHV_REGISTER_NAME aenmNames[128]; 875 WHV_REGISTER_VALUE aValues[128]; 876 877 /* GPRs */ 878 aenmNames[0] = WHvX64RegisterRax; 879 aValues[0].Reg64 = pCtx->rax; 880 aenmNames[1] = WHvX64RegisterRcx; 881 aValues[1].Reg64 = pCtx->rcx; 882 aenmNames[2] = WHvX64RegisterRdx; 883 aValues[2].Reg64 = pCtx->rdx; 884 aenmNames[3] = WHvX64RegisterRbx; 885 aValues[3].Reg64 = pCtx->rbx; 886 aenmNames[4] = WHvX64RegisterRsp; 887 aValues[4].Reg64 = pCtx->rsp; 888 aenmNames[5] = WHvX64RegisterRbp; 889 aValues[5].Reg64 = pCtx->rbp; 890 aenmNames[6] = WHvX64RegisterRsi; 891 aValues[6].Reg64 = pCtx->rsi; 892 aenmNames[7] = WHvX64RegisterRdi; 893 aValues[7].Reg64 = pCtx->rdi; 894 aenmNames[8] = WHvX64RegisterR8; 895 aValues[8].Reg64 = pCtx->r8; 896 aenmNames[9] = WHvX64RegisterR9; 897 aValues[9].Reg64 = pCtx->r9; 898 aenmNames[10] = WHvX64RegisterR10; 899 aValues[10].Reg64 = pCtx->r10; 900 aenmNames[11] = WHvX64RegisterR11; 901 aValues[11].Reg64 = pCtx->r11; 902 aenmNames[12] = WHvX64RegisterR12; 903 aValues[12].Reg64 = pCtx->r12; 904 aenmNames[13] = WHvX64RegisterR13; 905 aValues[13].Reg64 = pCtx->r13; 906 aenmNames[14] = WHvX64RegisterR14; 907 aValues[14].Reg64 = pCtx->r14; 908 aenmNames[15] = WHvX64RegisterR15; 909 aValues[15].Reg64 = pCtx->r15; 910 911 /* RIP & Flags */ 912 aenmNames[16] = WHvX64RegisterRip; 913 aValues[16].Reg64 = pCtx->rip; 914 aenmNames[17] = WHvX64RegisterRflags; 915 aValues[17].Reg64 = pCtx->rflags.u; 916 917 /* Segments */ 918 #define COPY_OUT_SEG(a_idx, a_enmName, a_SReg) \ 919 do { \ 920 aenmNames[a_idx] = a_enmName; \ 921 aValues[a_idx].Segment.Base = (a_SReg).u64Base; \ 922 aValues[a_idx].Segment.Limit = (a_SReg).u32Limit; \ 923 aValues[a_idx].Segment.Selector = (a_SReg).Sel; \ 924 aValues[a_idx].Segment.Attributes = (a_SReg).Attr.u; \ 925 } while (0) 926 COPY_OUT_SEG(18, WHvX64RegisterEs, pCtx->es); 927 COPY_OUT_SEG(19, WHvX64RegisterCs, pCtx->cs); 928 COPY_OUT_SEG(20, WHvX64RegisterSs, pCtx->ss); 929 COPY_OUT_SEG(21, WHvX64RegisterDs, pCtx->ds); 930 COPY_OUT_SEG(22, WHvX64RegisterFs, pCtx->fs); 931 COPY_OUT_SEG(23, WHvX64RegisterGs, pCtx->gs); 932 COPY_OUT_SEG(24, WHvX64RegisterLdtr, pCtx->ldtr); 933 COPY_OUT_SEG(25, WHvX64RegisterTr, pCtx->tr); 934 935 uintptr_t iReg = 26; 936 /* Descriptor tables. */ 937 aenmNames[iReg] = WHvX64RegisterIdtr; 938 aValues[iReg].Table.Limit = pCtx->idtr.cbIdt; 939 aValues[iReg].Table.Base = pCtx->idtr.pIdt; 940 iReg++; 941 aenmNames[iReg] = WHvX64RegisterGdtr; 942 aValues[iReg].Table.Limit = pCtx->gdtr.cbGdt; 943 aValues[iReg].Table.Base = pCtx->gdtr.pGdt; 944 iReg++; 945 946 /* Control registers. */ 947 aenmNames[iReg] = WHvX64RegisterCr0; 948 aValues[iReg].Reg64 = pCtx->cr0; 949 iReg++; 950 aenmNames[iReg] = WHvX64RegisterCr2; 951 aValues[iReg].Reg64 = pCtx->cr2; 952 iReg++; 953 aenmNames[iReg] = WHvX64RegisterCr3; 954 aValues[iReg].Reg64 = pCtx->cr3; 955 iReg++; 956 aenmNames[iReg] = WHvX64RegisterCr4; 957 aValues[iReg].Reg64 = pCtx->cr4; 958 iReg++; 959 aenmNames[iReg] = WHvX64RegisterCr8; 960 aValues[iReg].Reg64 = CPUMGetGuestCR8(pVCpu); 961 iReg++; 962 963 /* Debug registers. */ 964 /** @todo fixme */ 965 aenmNames[iReg] = WHvX64RegisterDr0; 966 aValues[iReg].Reg64 = CPUMGetHyperDR0(pVCpu); 967 iReg++; 968 aenmNames[iReg] = WHvX64RegisterDr1; 969 aValues[iReg].Reg64 = CPUMGetHyperDR1(pVCpu); 970 iReg++; 971 aenmNames[iReg] = WHvX64RegisterDr2; 972 aValues[iReg].Reg64 = CPUMGetHyperDR2(pVCpu); 973 iReg++; 974 aenmNames[iReg] = WHvX64RegisterDr3; 975 aValues[iReg].Reg64 = CPUMGetHyperDR3(pVCpu); 976 iReg++; 977 aenmNames[iReg] = WHvX64RegisterDr6; 978 aValues[iReg].Reg64 = CPUMGetHyperDR6(pVCpu); 979 iReg++; 980 aenmNames[iReg] = WHvX64RegisterDr7; 981 aValues[iReg].Reg64 = CPUMGetHyperDR7(pVCpu); 982 iReg++; 983 984 /* Vector state. */ 985 aenmNames[iReg] = WHvX64RegisterXmm0; 986 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[0].uXmm.s.Lo; 987 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[0].uXmm.s.Hi; 988 iReg++; 989 aenmNames[iReg] = WHvX64RegisterXmm1; 990 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[1].uXmm.s.Lo; 991 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[1].uXmm.s.Hi; 992 iReg++; 993 aenmNames[iReg] = WHvX64RegisterXmm2; 994 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[2].uXmm.s.Lo; 995 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[2].uXmm.s.Hi; 996 iReg++; 997 aenmNames[iReg] = WHvX64RegisterXmm3; 998 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[3].uXmm.s.Lo; 999 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[3].uXmm.s.Hi; 1000 iReg++; 1001 aenmNames[iReg] = WHvX64RegisterXmm4; 1002 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[4].uXmm.s.Lo; 1003 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[4].uXmm.s.Hi; 1004 iReg++; 1005 aenmNames[iReg] = WHvX64RegisterXmm5; 1006 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[5].uXmm.s.Lo; 1007 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[5].uXmm.s.Hi; 1008 iReg++; 1009 aenmNames[iReg] = WHvX64RegisterXmm6; 1010 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[6].uXmm.s.Lo; 1011 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[6].uXmm.s.Hi; 1012 iReg++; 1013 aenmNames[iReg] = WHvX64RegisterXmm7; 1014 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[7].uXmm.s.Lo; 1015 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[7].uXmm.s.Hi; 1016 iReg++; 1017 aenmNames[iReg] = WHvX64RegisterXmm8; 1018 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[8].uXmm.s.Lo; 1019 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[8].uXmm.s.Hi; 1020 iReg++; 1021 aenmNames[iReg] = WHvX64RegisterXmm9; 1022 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[9].uXmm.s.Lo; 1023 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[9].uXmm.s.Hi; 1024 iReg++; 1025 aenmNames[iReg] = WHvX64RegisterXmm10; 1026 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[10].uXmm.s.Lo; 1027 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[10].uXmm.s.Hi; 1028 iReg++; 1029 aenmNames[iReg] = WHvX64RegisterXmm11; 1030 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[11].uXmm.s.Lo; 1031 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[11].uXmm.s.Hi; 1032 iReg++; 1033 aenmNames[iReg] = WHvX64RegisterXmm12; 1034 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[12].uXmm.s.Lo; 1035 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[12].uXmm.s.Hi; 1036 iReg++; 1037 aenmNames[iReg] = WHvX64RegisterXmm13; 1038 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[13].uXmm.s.Lo; 1039 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[13].uXmm.s.Hi; 1040 iReg++; 1041 aenmNames[iReg] = WHvX64RegisterXmm14; 1042 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[14].uXmm.s.Lo; 1043 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[14].uXmm.s.Hi; 1044 iReg++; 1045 aenmNames[iReg] = WHvX64RegisterXmm15; 1046 aValues[iReg].Reg128.Low64 = pCtx->pXStateR3->x87.aXMM[15].uXmm.s.Lo; 1047 aValues[iReg].Reg128.High64 = pCtx->pXStateR3->x87.aXMM[15].uXmm.s.Hi; 1048 iReg++; 1049 1050 /* Floating point state. */ 1051 aenmNames[iReg] = WHvX64RegisterFpMmx0; 1052 aValues[iReg].Fp.AsUINT128.Low64 = pCtx->pXStateR3->x87.aRegs[0].au64[0]; 1053 aValues[iReg].Fp.AsUINT128.High64 = pCtx->pXStateR3->x87.aRegs[0].au64[1]; 1054 iReg++; 1055 aenmNames[iReg] = WHvX64RegisterFpMmx1; 1056 aValues[iReg].Fp.AsUINT128.Low64 = pCtx->pXStateR3->x87.aRegs[1].au64[0]; 1057 aValues[iReg].Fp.AsUINT128.High64 = pCtx->pXStateR3->x87.aRegs[1].au64[1]; 1058 iReg++; 1059 aenmNames[iReg] = WHvX64RegisterFpMmx2; 1060 aValues[iReg].Fp.AsUINT128.Low64 = pCtx->pXStateR3->x87.aRegs[2].au64[0]; 1061 aValues[iReg].Fp.AsUINT128.High64 = pCtx->pXStateR3->x87.aRegs[2].au64[1]; 1062 iReg++; 1063 aenmNames[iReg] = WHvX64RegisterFpMmx3; 1064 aValues[iReg].Fp.AsUINT128.Low64 = pCtx->pXStateR3->x87.aRegs[3].au64[0]; 1065 aValues[iReg].Fp.AsUINT128.High64 = pCtx->pXStateR3->x87.aRegs[3].au64[1]; 1066 iReg++; 1067 aenmNames[iReg] = WHvX64RegisterFpMmx4; 1068 aValues[iReg].Fp.AsUINT128.Low64 = pCtx->pXStateR3->x87.aRegs[4].au64[0]; 1069 aValues[iReg].Fp.AsUINT128.High64 = pCtx->pXStateR3->x87.aRegs[4].au64[1]; 1070 iReg++; 1071 aenmNames[iReg] = WHvX64RegisterFpMmx5; 1072 aValues[iReg].Fp.AsUINT128.Low64 = pCtx->pXStateR3->x87.aRegs[5].au64[0]; 1073 aValues[iReg].Fp.AsUINT128.High64 = pCtx->pXStateR3->x87.aRegs[5].au64[1]; 1074 iReg++; 1075 aenmNames[iReg] = WHvX64RegisterFpMmx6; 1076 aValues[iReg].Fp.AsUINT128.Low64 = pCtx->pXStateR3->x87.aRegs[6].au64[0]; 1077 aValues[iReg].Fp.AsUINT128.High64 = pCtx->pXStateR3->x87.aRegs[6].au64[1]; 1078 iReg++; 1079 aenmNames[iReg] = WHvX64RegisterFpMmx7; 1080 aValues[iReg].Fp.AsUINT128.Low64 = pCtx->pXStateR3->x87.aRegs[7].au64[0]; 1081 aValues[iReg].Fp.AsUINT128.High64 = pCtx->pXStateR3->x87.aRegs[7].au64[1]; 1082 iReg++; 1083 1084 aenmNames[iReg] = WHvX64RegisterFpControlStatus; 1085 aValues[iReg].FpControlStatus.FpControl = pCtx->pXStateR3->x87.FCW; 1086 aValues[iReg].FpControlStatus.FpStatus = pCtx->pXStateR3->x87.FSW; 1087 aValues[iReg].FpControlStatus.FpTag = pCtx->pXStateR3->x87.FTW; 1088 aValues[iReg].FpControlStatus.Reserved = pCtx->pXStateR3->x87.FTW >> 8; 1089 aValues[iReg].FpControlStatus.LastFpOp = pCtx->pXStateR3->x87.FOP; 1090 aValues[iReg].FpControlStatus.LastFpRip = (pCtx->pXStateR3->x87.FPUIP) 1091 | ((uint64_t)pCtx->pXStateR3->x87.CS << 32) 1092 | ((uint64_t)pCtx->pXStateR3->x87.Rsrvd1 << 48); 1093 iReg++; 1094 1095 aenmNames[iReg] = WHvX64RegisterXmmControlStatus; 1096 aValues[iReg].XmmControlStatus.LastFpRdp = (pCtx->pXStateR3->x87.FPUDP) 1097 | ((uint64_t)pCtx->pXStateR3->x87.DS << 32) 1098 | ((uint64_t)pCtx->pXStateR3->x87.Rsrvd2 << 48); 1099 aValues[iReg].XmmControlStatus.XmmStatusControl = pCtx->pXStateR3->x87.MXCSR; 1100 aValues[iReg].XmmControlStatus.XmmStatusControlMask = pCtx->pXStateR3->x87.MXCSR_MASK; /* ??? (Isn't this an output field?) */ 1101 iReg++; 1102 1103 /* MSRs */ 1104 // WHvX64RegisterTsc - don't touch 1105 aenmNames[iReg] = WHvX64RegisterEfer; 1106 aValues[iReg].Reg64 = pCtx->msrEFER; 1107 iReg++; 1108 aenmNames[iReg] = WHvX64RegisterKernelGsBase; 1109 aValues[iReg].Reg64 = pCtx->msrKERNELGSBASE; 1110 iReg++; 1111 aenmNames[iReg] = WHvX64RegisterApicBase; 1112 aValues[iReg].Reg64 = APICGetBaseMsrNoCheck(pVCpu); 1113 iReg++; 1114 aenmNames[iReg] = WHvX64RegisterPat; 1115 aValues[iReg].Reg64 = pCtx->msrPAT; 1116 iReg++; 1117 /// @todo WHvX64RegisterSysenterCs 1118 /// @todo WHvX64RegisterSysenterEip 1119 /// @todo WHvX64RegisterSysenterEsp 1120 aenmNames[iReg] = WHvX64RegisterStar; 1121 aValues[iReg].Reg64 = pCtx->msrSTAR; 1122 iReg++; 1123 aenmNames[iReg] = WHvX64RegisterLstar; 1124 aValues[iReg].Reg64 = pCtx->msrLSTAR; 1125 iReg++; 1126 aenmNames[iReg] = WHvX64RegisterCstar; 1127 aValues[iReg].Reg64 = pCtx->msrCSTAR; 1128 iReg++; 1129 aenmNames[iReg] = WHvX64RegisterSfmask; 1130 aValues[iReg].Reg64 = pCtx->msrSFMASK; 1131 iReg++; 1132 1133 /* event injection */ 1134 /// @todo WHvRegisterPendingInterruption 1135 /// @todo WHvRegisterInterruptState 1136 /// @todo WHvRegisterPendingEvent0 1137 /// @todo WHvRegisterPendingEvent1 1138 1139 /* 1140 * Set the registers. 1141 */ 1142 Assert(iReg < RT_ELEMENTS(aValues)); 1143 Assert(iReg < RT_ELEMENTS(aenmNames)); 1144 #ifdef NEM_WIN_INTERCEPT_NT_IO_CTLS 1145 Log6(("Calling WHvSetVirtualProcessorRegisters(%p, %u, %p, %u, %p)\n", 1146 pVM->nem.s.hPartition, pVCpu->idCpu, aenmNames, iReg, aValues)); 1147 #endif 1148 HRESULT hrc = WHvSetVirtualProcessorRegisters(pVM->nem.s.hPartition, pVCpu->idCpu, aenmNames, iReg, aValues); 1149 if (SUCCEEDED(hrc)) 1150 return VINF_SUCCESS; 1151 AssertLogRelMsgFailed(("WHvSetVirtualProcessorRegisters(%p, %u,,%u,) -> %Rhrc (Last=%#x/%u)\n", 1152 pVM->nem.s.hPartition, pVCpu->idCpu, iReg, 1153 hrc, RTNtCurrentTeb()->LastStatusValue, RTNtCurrentTeb()->LastErrorValue)); 1154 return VERR_INTERNAL_ERROR; 1155 } 1156 1157 1158 #ifdef LOG_ENABLED 1159 /** 1160 * Log the full details of an exit reason. 1161 * 1162 * @param pExitReason The exit reason to log. 1163 */ 1164 static void nemR3WinLogExitReason(WHV_RUN_VP_EXIT_CONTEXT const *pExitReason) 1165 { 1166 bool fExitCtx = false; 1167 bool fExitInstr = false; 1168 switch (pExitReason->ExitReason) 1169 { 1170 case WHvRunVpExitReasonMemoryAccess: 1171 Log2(("Exit: Memory access GCPhys=%RGp GCVirt=%RGv %s %s %s\n", 1172 pExitReason->MemoryAccess.Gpa, pExitReason->MemoryAccess.Gva, 1173 pExitReason->MemoryAccess.AccessInfo.AccessType == WHvMemoryAccessRead ? "read" 1174 : pExitReason->MemoryAccess.AccessInfo.AccessType == WHvMemoryAccessWrite ? "write" 1175 : pExitReason->MemoryAccess.AccessInfo.AccessType == WHvMemoryAccessExecute ? "exec" : "!invalid access!", 1176 pExitReason->MemoryAccess.AccessInfo.GpaUnmapped ? "unmapped" : "mapped", 1177 pExitReason->MemoryAccess.AccessInfo.GvaValid ? "" : "invalid-gc-virt")); 1178 AssertMsg(!(pExitReason->MemoryAccess.AccessInfo.AsUINT32 & ~UINT32_C(0xf)), 1179 ("MemoryAccess.AccessInfo=%#x\n", pExitReason->MemoryAccess.AccessInfo.AsUINT32)); 1180 fExitCtx = fExitInstr = true; 1181 break; 1182 1183 case WHvRunVpExitReasonX64IoPortAccess: 1184 Log2(("Exit: Memory access IoPort=%#x LB %u %s%s%s rax=%#RX64 rcx=%#RX64 rsi=%#RX64 rdi=%#RX64\n", 1185 pExitReason->IoPortAccess.PortNumber, 1186 pExitReason->IoPortAccess.AccessInfo.AccessSize, 1187 pExitReason->IoPortAccess.AccessInfo.IsWrite ? "out" : "in", 1188 pExitReason->IoPortAccess.AccessInfo.StringOp ? " string" : "", 1189 pExitReason->IoPortAccess.AccessInfo.RepPrefix ? " rep" : "", 1190 pExitReason->IoPortAccess.Rax, 1191 pExitReason->IoPortAccess.Rcx, 1192 pExitReason->IoPortAccess.Rsi, 1193 pExitReason->IoPortAccess.Rdi)); 1194 Log2(("Exit: ds=%#x:{%#RX64 LB %#RX32, %#x} es=%#x:{%#RX64 LB %#RX32, %#x}\n", 1195 pExitReason->IoPortAccess.Ds.Selector, 1196 pExitReason->IoPortAccess.Ds.Base, 1197 pExitReason->IoPortAccess.Ds.Limit, 1198 pExitReason->IoPortAccess.Ds.Attributes, 1199 pExitReason->IoPortAccess.Es.Selector, 1200 pExitReason->IoPortAccess.Es.Base, 1201 pExitReason->IoPortAccess.Es.Limit, 1202 pExitReason->IoPortAccess.Es.Attributes )); 1203 1204 AssertMsg( pExitReason->IoPortAccess.AccessInfo.AccessSize == 1 1205 || pExitReason->IoPortAccess.AccessInfo.AccessSize == 2 1206 || pExitReason->IoPortAccess.AccessInfo.AccessSize == 4, 1207 ("IoPortAccess.AccessInfo.AccessSize=%d\n", pExitReason->IoPortAccess.AccessInfo.AccessSize)); 1208 AssertMsg(!(pExitReason->IoPortAccess.AccessInfo.AsUINT32 & ~UINT32_C(0x3f)), 1209 ("IoPortAccess.AccessInfo=%#x\n", pExitReason->IoPortAccess.AccessInfo.AsUINT32)); 1210 fExitCtx = fExitInstr = true; 1211 break; 1212 1213 # if 0 1214 case WHvRunVpExitReasonUnrecoverableException: 1215 case WHvRunVpExitReasonInvalidVpRegisterValue: 1216 case WHvRunVpExitReasonUnsupportedFeature: 1217 case WHvRunVpExitReasonX64InterruptWindow: 1218 case WHvRunVpExitReasonX64Halt: 1219 case WHvRunVpExitReasonX64MsrAccess: 1220 case WHvRunVpExitReasonX64Cpuid: 1221 case WHvRunVpExitReasonException: 1222 case WHvRunVpExitReasonCanceled: 1223 case WHvRunVpExitReasonAlerted: 1224 WHV_X64_MSR_ACCESS_CONTEXT MsrAccess; 1225 WHV_X64_CPUID_ACCESS_CONTEXT CpuidAccess; 1226 WHV_VP_EXCEPTION_CONTEXT VpException; 1227 WHV_X64_INTERRUPTION_DELIVERABLE_CONTEXT InterruptWindow; 1228 WHV_UNRECOVERABLE_EXCEPTION_CONTEXT UnrecoverableException; 1229 WHV_X64_UNSUPPORTED_FEATURE_CONTEXT UnsupportedFeature; 1230 WHV_RUN_VP_CANCELED_CONTEXT CancelReason; 1231 #endif 1232 1233 case WHvRunVpExitReasonNone: 1234 Log2(("Exit: No reason\n")); 1235 AssertFailed(); 1236 break; 1237 1238 default: 1239 Log(("Exit: %#x\n", pExitReason->ExitReason)); 1240 break; 1241 } 1242 1243 /* 1244 * Context and maybe instruction details. 1245 */ 1246 if (fExitCtx) 1247 { 1248 const WHV_VP_EXIT_CONTEXT *pVpCtx = &pExitReason->IoPortAccess.VpContext; 1249 Log2(("Exit: CS:RIP=%04x:%08RX64 RFLAGS=%06RX64 cbInstr=%u CS={%RX64 L %#RX32, %#x}\n", 1250 pVpCtx->Cs.Selector, 1251 pVpCtx->Rip, 1252 pVpCtx->Rflags, 1253 pVpCtx->InstructionLength, 1254 pVpCtx->Cs.Base, pVpCtx->Cs.Limit, pVpCtx->Cs.Attributes)); 1255 Log2(("Exit: cpl=%d CR0.PE=%d CR0.AM=%d EFER.LMA=%d DebugActive=%d InterruptionPending=%d InterruptShadow=%d\n", 1256 pVpCtx->ExecutionState.Cpl, 1257 pVpCtx->ExecutionState.Cr0Pe, 1258 pVpCtx->ExecutionState.Cr0Am, 1259 pVpCtx->ExecutionState.EferLma, 1260 pVpCtx->ExecutionState.DebugActive, 1261 pVpCtx->ExecutionState.InterruptionPending, 1262 pVpCtx->ExecutionState.InterruptShadow)); 1263 AssertMsg(!(pVpCtx->ExecutionState.AsUINT16 & ~UINT16_C(0x107f)), 1264 ("ExecutionState.AsUINT16=%#x\n", pVpCtx->ExecutionState.AsUINT16)); 1265 1266 /** @todo Someone please explain why the InstructionBytes fields are 16 bytes 1267 * long, when 15 would've been sufficent and saved 3-7 bytes of alignment 1268 * padding? Intel max length is 15, so is this sSome ARM stuff? Aren't ARM 1269 * instructions max 32-bit wide? Confused. */ 1270 if (fExitInstr && pExitReason->IoPortAccess.InstructionByteCount > 0) 1271 Log2(("Exit: Instruction %.*Rhxs\n", 1272 pExitReason->IoPortAccess.InstructionByteCount, pExitReason->IoPortAccess.InstructionBytes)); 1273 } 1274 } 1275 #endif /* LOG_ENABLED */ 1276 871 1277 VBOXSTRICTRC nemR3NativeRunGC(PVM pVM, PVMCPU pVCpu) 872 1278 { 873 NOREF(pVM); NOREF(pVCpu); 874 return VERR_INTERNAL_ERROR_2; 1279 /* 1280 * Just some simple experiment here that runs a couple of instructions. 1281 */ 1282 PCPUMCTX pCtx = CPUMQueryGuestCtxPtr(pVCpu); 1283 int rc = nemR3WinCopyOutState(pVM, pVCpu, pCtx); 1284 if (RT_SUCCESS(rc)) 1285 { 1286 WHV_RUN_VP_EXIT_CONTEXT ExitReason; 1287 RT_ZERO(ExitReason); 1288 HRESULT hrc = WHvRunVirtualProcessor(pVM->nem.s.hPartition, pVCpu->idCpu, &ExitReason, sizeof(ExitReason)); 1289 Log2(("WHvRunVirtualProcessor -> %#x; exit code %#x (%d)\n", hrc, ExitReason.ExitReason)); 1290 if (LogIs2Enabled()) 1291 nemR3WinLogExitReason(&ExitReason); 1292 1293 rc = VERR_NOT_IMPLEMENTED; 1294 } 1295 return rc; 875 1296 } 876 1297
Note:
See TracChangeset
for help on using the changeset viewer.