vbox的更動 47671 路徑 trunk/src/VBox/VMM/VMMR3/EMHM.cpp
- 時間撮記:
- 2013-8-12 上午11:16:55 (12 年 以前)
- svn:sync-xref-src-repo-rev:
- 87874
- 檔案:
-
- 修改 1 筆資料
圖例:
- 未更動
- 新增
- 刪除
-
trunk/src/VBox/VMM/VMMR3/EMHM.cpp
r47619 r47671 167 167 * @param pVCpu Pointer to the cross context CPU structure for 168 168 * the calling EMT. 169 * @param fFlags Combinations of EM_ONE_INS_FLAGS_XXX. 169 170 * @thread EMT. 170 171 */ 171 VMMR3_INT_DECL(VBOXSTRICTRC) EMR3HmSingleInstruction(PVM pVM, PVMCPU pVCpu )172 VMMR3_INT_DECL(VBOXSTRICTRC) EMR3HmSingleInstruction(PVM pVM, PVMCPU pVCpu, uint32_t fFlags) 172 173 { 173 if (!HMR3CanExecuteGuest(pVM, pVCpu->em.s.pCtx)) 174 PCPUMCTX pCtx = pVCpu->em.s.pCtx; 175 Assert(!(fFlags & ~EM_ONE_INS_FLAGS_MASK)); 176 177 if (!HMR3CanExecuteGuest(pVM, pCtx)) 174 178 return VINF_EM_RESCHEDULE; 175 179 176 /* 177 * Service necessary FFs before going into HM. 178 */ 179 PCPUMCTX pCtx = pVCpu->em.s.pCtx; 180 if ( VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_PRE_RAW_MASK) 181 || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK)) 182 { 183 VBOXSTRICTRC rcStrict = emR3HmForcedActions(pVM, pVCpu, pCtx); 184 if (rcStrict != VINF_SUCCESS) 185 { 186 Log(("EMR3HmSingleInstruction: FFs before -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 180 uint64_t const uOldRip = pCtx->rip; 181 for (;;) 182 { 183 /* 184 * Service necessary FFs before going into HM. 185 */ 186 if ( VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_PRE_RAW_MASK) 187 || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK)) 188 { 189 VBOXSTRICTRC rcStrict = emR3HmForcedActions(pVM, pVCpu, pCtx); 190 if (rcStrict != VINF_SUCCESS) 191 { 192 Log(("EMR3HmSingleInstruction: FFs before -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 193 return rcStrict; 194 } 195 } 196 197 /* 198 * Go execute it. 199 */ 200 bool fOld = HMSetSingleInstruction(pVCpu, true); 201 VBOXSTRICTRC rcStrict = VMMR3HmRunGC(pVM, pVCpu); 202 HMSetSingleInstruction(pVCpu, fOld); 203 LogFlow(("EMR3HmSingleInstruction: %Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 204 205 /* 206 * Handle high priority FFs and informational status codes. We don't do 207 * normal FF processing the caller or the next call can deal with them. 208 */ 209 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_RESUME_GUEST_MASK); 210 if ( VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_POST_MASK) 211 || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_POST_MASK)) 212 { 213 rcStrict = emR3HighPriorityPostForcedActions(pVM, pVCpu, VBOXSTRICTRC_TODO(rcStrict)); 214 LogFlow(("EMR3HmSingleInstruction: FFs after -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 215 } 216 217 if (rcStrict != VINF_SUCCESS && (rcStrict < VINF_EM_FIRST || rcStrict > VINF_EM_LAST)) 218 { 219 rcStrict = emR3HmHandleRC(pVM, pVCpu, pCtx, VBOXSTRICTRC_TODO(rcStrict)); 220 Log(("EMR3HmSingleInstruction: emR3HmHandleRC -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 221 } 222 223 /* 224 * Done? 225 */ 226 if ( (rcStrict != VINF_SUCCESS && rcStrict != VINF_EM_DBG_STEPPED) 227 || !(fFlags & EM_ONE_INS_FLAGS_RIP_CHANGE) 228 || pCtx->rip != uOldRip) 229 { 230 if (rcStrict == VINF_SUCCESS && pCtx->rip != uOldRip) 231 rcStrict = VINF_EM_DBG_STEPPED; 232 Log(("EMR3HmSingleInstruction: returns %Rrc (rip %llx -> %llx)\n", VBOXSTRICTRC_VAL(rcStrict), uOldRip, pCtx->rip)); 187 233 return rcStrict; 188 234 } 189 235 } 190 191 /*192 * Go execute it.193 */194 bool fOld = HMSetSingleInstruction(pVCpu, true);195 VBOXSTRICTRC rcStrict = VMMR3HmRunGC(pVM, pVCpu);196 HMSetSingleInstruction(pVCpu, fOld);197 LogFlow(("EMR3HmSingleInstruction: %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));198 199 /*200 * Handle high priority FFs and informational status codes. We don't do201 * normal FF processing the caller or the next call can deal with them.202 */203 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_RESUME_GUEST_MASK);204 if ( VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_POST_MASK)205 || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_POST_MASK))206 {207 rcStrict = emR3HighPriorityPostForcedActions(pVM, pVCpu, VBOXSTRICTRC_TODO(rcStrict));208 LogFlow(("EMR3HmSingleInstruction: FFs after -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));209 }210 211 if (rcStrict != VINF_SUCCESS && (rcStrict < VINF_EM_FIRST || rcStrict > VINF_EM_LAST))212 {213 rcStrict = emR3HmHandleRC(pVM, pVCpu, pCtx, VBOXSTRICTRC_TODO(rcStrict));214 Log(("EMR3HmSingleInstruction: emR3HmHandleRC -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));215 }216 217 return rcStrict;218 236 } 219 237
注意:
瀏覽 TracChangeset
來幫助您使用更動檢視器