Changeset 36054 in vbox
- Timestamp:
- Feb 22, 2011 3:04:28 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 70165
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/vm.h ¶
r35361 r36054 334 334 * (NON-GLOBAL FLUSH) */ 335 335 #define VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL RT_BIT_32(17) 336 /** Check for pending TLB shootdown actions. */ 336 /** Check for pending TLB shootdown actions. 337 * Consumer: HWACCM 338 * @todo rename to VMCPU_FF_HWACCM_TLB_SHOOTDOWN */ 337 339 #define VMCPU_FF_TLB_SHOOTDOWN RT_BIT_32(18) 338 /** Check for pending TLB flush action. */ 340 /** Check for pending TLB flush action. 341 * Consumer: HWACCM 342 * @todo rename to VMCPU_FF_HWACCM_TLB_FLUSH */ 339 343 #define VMCPU_FF_TLB_FLUSH RT_BIT_32(VMCPU_FF_TLB_FLUSH_BIT) 340 344 /** The bit number for VMCPU_FF_TLB_FLUSH. */ … … 411 415 #define VMCPU_FF_ALL_MASK (~0U) 412 416 413 /** All the forced VM flags. */ 414 #define VM_FF_ALL_BUT_RAW_MASK (~(VM_FF_HIGH_PRIORITY_PRE_RAW_MASK) | VM_FF_PGM_NO_MEMORY) 415 /** All the forced VMCPU flags. */ 416 #define VMCPU_FF_ALL_BUT_RAW_MASK (~(VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK | VMCPU_FF_CSAM_PENDING_ACTION | VMCPU_FF_PDM_CRITSECT)) 417 /** All the forced VM flags except those related to raw-mode and hardware 418 * assisted execution. */ 419 #define VM_FF_ALL_REM_MASK (~(VM_FF_HIGH_PRIORITY_PRE_RAW_MASK) | VM_FF_PGM_NO_MEMORY) 420 /** All the forced VMCPU flags except those related to raw-mode and hardware 421 * assisted execution. */ 422 #define VMCPU_FF_ALL_REM_MASK (~(VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK | VMCPU_FF_CSAM_PENDING_ACTION | VMCPU_FF_PDM_CRITSECT | VMCPU_FF_TLB_FLUSH | VMCPU_FF_TLB_SHOOTDOWN)) 417 423 418 424 /** @} */ -
trunk/src/VBox/VMM/VMMR3/EM.cpp ¶
r35346 r36054 989 989 TMTimerPollVoid(pVM, pVCpu); 990 990 #endif 991 AssertCompile((VMCPU_FF_ALL_ BUT_RAW_MASK & ~(VMCPU_FF_CSAM_PENDING_ACTION | VMCPU_FF_CSAM_SCAN_PAGE)) & VMCPU_FF_TIMER);992 if ( VM_FF_ISPENDING(pVM, VM_FF_ALL_ BUT_RAW_MASK)993 || VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_ALL_ BUT_RAW_MASK & ~(VMCPU_FF_CSAM_PENDING_ACTION | VMCPU_FF_CSAM_SCAN_PAGE)))991 AssertCompile((VMCPU_FF_ALL_REM_MASK & ~(VMCPU_FF_CSAM_PENDING_ACTION | VMCPU_FF_CSAM_SCAN_PAGE)) & VMCPU_FF_TIMER); 992 if ( VM_FF_ISPENDING(pVM, VM_FF_ALL_REM_MASK) 993 || VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_ALL_REM_MASK & ~(VMCPU_FF_CSAM_PENDING_ACTION | VMCPU_FF_CSAM_SCAN_PAGE))) 994 994 { 995 995 l_REMDoForcedActions: … … 1755 1755 && rc != VINF_EM_TERMINATE 1756 1756 && rc != VINF_EM_OFF 1757 && ( VM_FF_ISPENDING(pVM, VM_FF_ALL_ BUT_RAW_MASK)1758 || VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_ALL_ BUT_RAW_MASK)))1757 && ( VM_FF_ISPENDING(pVM, VM_FF_ALL_REM_MASK) 1758 || VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_ALL_REM_MASK))) 1759 1759 { 1760 1760 rc = emR3ForcedActions(pVM, pVCpu, rc); -
trunk/src/VBox/VMM/VMMR3/VMM.cpp ¶
r35346 r36054 2258 2258 PRINT_GROUP(VM_FF_,NORMAL_PRIORITY_POST,_MASK); 2259 2259 PRINT_GROUP(VM_FF_,NORMAL_PRIORITY,_MASK); 2260 PRINT_GROUP(VM_FF_,ALL_ BUT_RAW,_MASK);2260 PRINT_GROUP(VM_FF_,ALL_REM,_MASK); 2261 2261 if (c) 2262 2262 pHlp->pfnPrintf(pHlp, "\n"); … … 2305 2305 PRINT_GROUP(VMCPU_FF_,RESUME_GUEST,_MASK); 2306 2306 PRINT_GROUP(VMCPU_FF_,HWACCM_TO_R3,_MASK); 2307 PRINT_GROUP(VMCPU_FF_,ALL_ BUT_RAW,_MASK);2307 PRINT_GROUP(VMCPU_FF_,ALL_REM,_MASK); 2308 2308 if (c) 2309 2309 pHlp->pfnPrintf(pHlp, "\n"); -
trunk/src/recompiler/VBoxRecompiler.c ¶
r35994 r36054 1064 1064 1065 1065 /** 1066 * Used by REMR3Run to handle the case where CPU_EMULATE_SINGLE_STEP is set. 1067 * 1068 * @returns VBox status code. 1069 * 1070 * @param pVM The VM handle. 1071 * @param pVCpu The Virtual CPU handle. 1072 */ 1073 static int remR3RunLoggingStep(PVM pVM, PVMCPU pVCpu) 1074 { 1075 int rc; 1076 Assert(!pVM->rem.s.Env.singlestep_enabled); 1077 Assert(pVM->rem.s.fInREM); 1078 /* #define REM_USE_QEMU_SINGLE_STEP_FOR_LOGGING - slow (tb flushing?) */ 1079 #ifdef REM_USE_QEMU_SINGLE_STEP_FOR_LOGGING 1080 cpu_single_step(&pVM->rem.s.Env, 1); 1081 #endif 1082 1083 /* 1084 * Now we set the execute single instruction flag and enter the cpu_exec loop. 1085 */ 1086 for (;;) 1087 { 1088 char szBuf[256]; 1089 1090 /* 1091 * Log the current registers state and instruction. 1092 */ 1093 remR3StateUpdate(pVM, pVCpu); 1094 DBGFR3Info(pVM, "cpumguest", NULL, NULL); 1095 szBuf[0] = '\0'; 1096 rc = DBGFR3DisasInstrEx(pVM, 1097 pVCpu->idCpu, 1098 0, /* Sel */ 1099 0, /* GCPtr */ 1100 DBGF_DISAS_FLAGS_CURRENT_GUEST 1101 | DBGF_DISAS_FLAGS_DEFAULT_MODE 1102 | DBGF_DISAS_FLAGS_HID_SEL_REGS_VALID, 1103 szBuf, 1104 sizeof(szBuf), 1105 NULL); 1106 if (RT_FAILURE(rc)) 1107 RTStrPrintf(szBuf, sizeof(szBuf), "DBGFR3DisasInstrEx failed with rc=%Rrc\n", rc); 1108 RTLogPrintf("CPU%d: %s\n", pVCpu->idCpu, szBuf); 1109 1110 /* 1111 * Execute the instruction. 1112 */ 1113 TMNotifyStartOfExecution(pVCpu); 1114 1115 if ( pVM->rem.s.Env.exception_index < 0 1116 || pVM->rem.s.Env.exception_index > 256) 1117 pVM->rem.s.Env.exception_index = -1; /** @todo We need to do similar stuff elsewhere, I think. */ 1118 1119 #ifdef REM_USE_QEMU_SINGLE_STEP_FOR_LOGGING 1120 pVM->rem.s.Env.interrupt_request = 0; 1121 #else 1122 pVM->rem.s.Env.interrupt_request = CPU_INTERRUPT_SINGLE_INSTR; 1123 #endif 1124 if (VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)) 1125 pVM->rem.s.Env.interrupt_request |= CPU_INTERRUPT_HARD; 1126 RTLogPrintf("remR3RunLoggingStep: interrupt_request=%#x halted=%d exception_index=%#x\n", rc, 1127 pVM->rem.s.Env.interrupt_request, 1128 pVM->rem.s.Env.halted, 1129 pVM->rem.s.Env.exception_index 1130 ); 1131 1132 rc = cpu_exec(&pVM->rem.s.Env); 1133 1134 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> %#x interrupt_request=%#x halted=%d exception_index=%#x\n", rc, 1135 pVM->rem.s.Env.interrupt_request, 1136 pVM->rem.s.Env.halted, 1137 pVM->rem.s.Env.exception_index 1138 ); 1139 1140 TMNotifyEndOfExecution(pVCpu); 1141 1142 switch (rc) 1143 { 1144 #ifndef REM_USE_QEMU_SINGLE_STEP_FOR_LOGGING 1145 /* 1146 * The normal exit. 1147 */ 1148 case EXCP_SINGLE_INSTR: 1149 if ( !VM_FF_ISPENDING(pVM, VM_FF_ALL_REM_MASK) 1150 && !VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_ALL_REM_MASK)) 1151 continue; 1152 RTLogPrintf("remR3RunLoggingStep: rc=VINF_SUCCESS w/ FFs (%#x/%#x)\n", 1153 pVM->fGlobalForcedActions, pVCpu->fLocalForcedActions); 1154 rc = VINF_SUCCESS; 1155 break; 1156 1157 #else 1158 /* 1159 * The normal exit, check for breakpoints at PC just to be sure. 1160 */ 1161 #endif 1162 case EXCP_DEBUG: 1163 rc = VINF_EM_DBG_STEPPED; 1164 if (pVM->rem.s.Env.nb_breakpoints > 0) 1165 { 1166 RTGCPTR GCPtrPC = pVM->rem.s.Env.eip + pVM->rem.s.Env.segs[R_CS].base; 1167 int iBP; 1168 for (iBP = 0; iBP < pVM->rem.s.Env.nb_breakpoints; iBP++) 1169 if (pVM->rem.s.Env.breakpoints[iBP] == GCPtrPC) 1170 { 1171 rc = VINF_EM_DBG_BREAKPOINT; 1172 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> EXCP_DEBUG rc=%Rrc iBP=%d GCPtrPC=%RGv\n", rc, iBP, GCPtrPC); 1173 break; 1174 } 1175 } 1176 #ifdef REM_USE_QEMU_SINGLE_STEP_FOR_LOGGING 1177 if (rc == VINF_EM_DBG_STEPPED) 1178 { 1179 if ( !VM_FF_ISPENDING(pVM, VM_FF_ALL_REM_MASK) 1180 && !VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_ALL_REM_MASK)) 1181 continue; 1182 1183 RTLogPrintf("remR3RunLoggingStep: rc=VINF_SUCCESS w/ FFs (%#x/%#x)\n", 1184 pVM->fGlobalForcedActions, pVCpu->fLocalForcedActions); 1185 rc = VINF_SUCCESS; 1186 } 1187 #endif 1188 break; 1189 1190 /* 1191 * If we take a trap or start servicing a pending interrupt, we might end up here. 1192 * (Timer thread or some other thread wishing EMT's attention.) 1193 */ 1194 case EXCP_INTERRUPT: 1195 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> EXCP_INTERRUPT rc=VINF_SUCCESS\n"); 1196 rc = VINF_SUCCESS; 1197 break; 1198 1199 /* 1200 * hlt instruction. 1201 */ 1202 case EXCP_HLT: 1203 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> EXCP_HLT rc=VINF_EM_HALT\n"); 1204 rc = VINF_EM_HALT; 1205 break; 1206 1207 /* 1208 * The VM has halted. 1209 */ 1210 case EXCP_HALTED: 1211 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> EXCP_HALTED rc=VINF_EM_HALT\n"); 1212 rc = VINF_EM_HALT; 1213 break; 1214 1215 /* 1216 * Switch to RAW-mode. 1217 */ 1218 case EXCP_EXECUTE_RAW: 1219 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> EXCP_EXECUTE_RAW rc=VINF_EM_RESCHEDULE_RAW\n"); 1220 rc = VINF_EM_RESCHEDULE_RAW; 1221 break; 1222 1223 /* 1224 * Switch to hardware accelerated RAW-mode. 1225 */ 1226 case EXCP_EXECUTE_HWACC: 1227 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> EXCP_EXECUTE_HWACC rc=VINF_EM_RESCHEDULE_HWACC\n"); 1228 rc = VINF_EM_RESCHEDULE_HWACC; 1229 break; 1230 1231 /* 1232 * An EM RC was raised (VMR3Reset/Suspend/PowerOff/some-fatal-error). 1233 */ 1234 case EXCP_RC: 1235 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> EXCP_RC rc=%Rrc\n", pVM->rem.s.rc); 1236 rc = pVM->rem.s.rc; 1237 pVM->rem.s.rc = VERR_INTERNAL_ERROR; 1238 break; 1239 1240 /* 1241 * Figure out the rest when they arrive.... 1242 */ 1243 default: 1244 AssertMsgFailed(("rc=%d\n", rc)); 1245 RTLogPrintf("remR3RunLoggingStep: cpu_exec -> %d rc=VINF_EM_RESCHEDULE\n", rc); 1246 rc = VINF_EM_RESCHEDULE; 1247 break; 1248 } 1249 break; 1250 } 1251 1252 #ifdef REM_USE_QEMU_SINGLE_STEP_FOR_LOGGING 1253 cpu_single_step(&pVM->rem.s.Env, 0); 1254 #else 1255 pVM->rem.s.Env.interrupt_request &= ~(CPU_INTERRUPT_SINGLE_INSTR | CPU_INTERRUPT_SINGLE_INSTR_IN_FLIGHT); 1256 #endif 1257 return rc; 1258 } 1259 1260 1261 /** 1066 1262 * Runs code in recompiled mode. 1067 1263 * … … 1079 1275 { 1080 1276 int rc; 1277 1278 if (RT_UNLIKELY(pVM->rem.s.Env.state & CPU_EMULATE_SINGLE_STEP)) 1279 return remR3RunLoggingStep(pVM, pVCpu); 1280 1281 Assert(pVM->rem.s.fInREM); 1081 1282 Log2(("REMR3Run: (cs:eip=%04x:%RGv)\n", pVM->rem.s.Env.segs[R_CS].selector, (RTGCPTR)pVM->rem.s.Env.eip)); 1082 Assert(pVM->rem.s.fInREM);1083 1283 1084 1284 TMNotifyStartOfExecution(pVCpu); … … 1195 1395 * Check if the cpu state is suitable for Raw execution. 1196 1396 * 1197 * @returns boolean 1397 * @returns true if RAW/HWACC mode is ok, false if we should stay in REM. 1398 * 1198 1399 * @param env The CPU env struct. 1199 1400 * @param eip The EIP to check this for (might differ from env->eip). … … 1212 1413 /* Update counter. */ 1213 1414 env->pVM->rem.s.cCanExecuteRaw++; 1415 1416 /* Never when single stepping+logging guest code. */ 1417 if (env->state & CPU_EMULATE_SINGLE_STEP) 1418 return false; 1214 1419 1215 1420 if (HWACCMIsEnabled(env->pVM)) … … 3739 3944 * Log registers if requested. 3740 3945 */ 3741 if ( !fLog2)3946 if (fLog2) 3742 3947 DBGFR3InfoLog(pVM, "cpumguest", pszPrefix); 3743 3948 -
trunk/src/recompiler/cpu-exec.c ¶
r33656 r36054 372 372 || !(env->eflags & IF_MASK) 373 373 || (env->hflags & HF_INHIBIT_IRQ_MASK) 374 || (env->state & CPU_RAW_HWACC)374 || (env->state & (CPU_RAW_HWACC | CPU_EMULATE_SINGLE_STEP)) 375 375 ) 376 376 {
Note:
See TracChangeset
for help on using the changeset viewer.