Changeset 4199 in vbox
- Timestamp:
- Aug 17, 2007 12:45:53 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Debugger/DBGConsole.cpp
r4071 r4199 4305 4305 * Flat address (unary). 4306 4306 * 4307 * @returns 0on success.4307 * @returns VINF_SUCCESS on success. 4308 4308 * @returns VBox evaluation / parsing error code on failure. 4309 4309 * The caller does the bitching. … … 4321 4321 { 4322 4322 case DBGCVAR_TYPE_GC_FLAT: 4323 return 0;4323 return VINF_SUCCESS; 4324 4324 4325 4325 case DBGCVAR_TYPE_GC_FAR: 4326 4326 { 4327 PCPUMCTX pCtx;4328 CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);4329 4330 4327 Assert(pDbgc->pVM); 4331 4332 pResult->enmType = DBGCVAR_TYPE_GC_FLAT; 4333 rc = SELMToFlatEx(pDbgc->pVM, pCtx->eflags, pResult->u.GCFar.sel, pResult->u.GCFar.off, NULL, 4334 SELMTOFLAT_FLAGS_NO_PL | SELMTOFLAT_FLAGS_HYPER, &pResult->u.GCFlat, NULL); 4328 DBGFADDRESS Address; 4329 rc = DBGFR3AddrFromSelOff(pDbgc->pVM, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off); 4335 4330 if (VBOX_SUCCESS(rc)) 4336 return 0; 4331 { 4332 pResult->enmType = DBGCVAR_TYPE_GC_FLAT; 4333 pResult->u.GCFlat = Address.FlatPtr; 4334 return VINF_SUCCESS; 4335 } 4337 4336 return VERR_PARSE_CONVERSION_FAILED; 4338 4337 } … … 4343 4342 4344 4343 case DBGCVAR_TYPE_HC_FLAT: 4345 return 0;4344 return VINF_SUCCESS; 4346 4345 4347 4346 case DBGCVAR_TYPE_HC_FAR: … … 4353 4352 rc = MMR3HCPhys2HCVirt(pDbgc->pVM, pResult->u.HCPhys, &pResult->u.pvHCFlat); 4354 4353 if (VBOX_SUCCESS(rc)) 4355 return 0;4354 return VINF_SUCCESS; 4356 4355 return VERR_PARSE_CONVERSION_FAILED; 4357 4356 … … 4359 4358 pResult->enmType = DBGCVAR_TYPE_GC_FLAT; 4360 4359 pResult->u.GCFlat = (RTGCPTR)pResult->u.u64Number; 4361 return 0;4360 return VINF_SUCCESS; 4362 4361 4363 4362 case DBGCVAR_TYPE_STRING: … … 4400 4399 case DBGCVAR_TYPE_GC_FAR: 4401 4400 { 4402 PCPUMCTX pCtx;4403 CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);4404 4401 Assert(pDbgc->pVM); 4405 rc = SELMToFlatEx(pDbgc->pVM, pCtx->eflags, pResult->u.GCFar.sel, pResult->u.GCFar.off, NULL,4406 SELMTOFLAT_FLAGS_NO_PL | SELMTOFLAT_FLAGS_HYPER, &pResult->u.GCFlat, NULL);4402 DBGFADDRESS Address; 4403 rc = DBGFR3AddrFromSelOff(pDbgc->pVM, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off); 4407 4404 if (VBOX_SUCCESS(rc)) 4408 4405 { 4409 4406 pResult->enmType = DBGCVAR_TYPE_GC_PHYS; 4410 rc = PGMPhysGCPtr2GCPhys(pDbgc->pVM, pResult->u.GCFlat, &pResult->u.GCPhys);4407 rc = PGMPhysGCPtr2GCPhys(pDbgc->pVM, Address.FlatPtr, &pResult->u.GCPhys); 4411 4408 if (VBOX_SUCCESS(rc)) 4412 4409 return 0; … … 4479 4476 case DBGCVAR_TYPE_GC_FAR: 4480 4477 { 4481 PCPUMCTX pCtx;4482 CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);4483 4484 4478 Assert(pDbgc->pVM); 4485 rc = SELMToFlatEx(pDbgc->pVM, pCtx->eflags, pResult->u.GCFar.sel, pResult->u.GCFar.off, NULL,4486 SELMTOFLAT_FLAGS_NO_PL | SELMTOFLAT_FLAGS_HYPER, &pResult->u.GCFlat, NULL);4479 DBGFADDRESS Address; 4480 rc = DBGFR3AddrFromSelOff(pDbgc->pVM, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off); 4487 4481 if (VBOX_SUCCESS(rc)) 4488 4482 { 4489 4483 pResult->enmType = DBGCVAR_TYPE_HC_PHYS; 4490 rc = PGMPhysGCPtr2HCPhys(pDbgc->pVM, pResult->u.GCFlat, &pResult->u.HCPhys);4484 rc = PGMPhysGCPtr2HCPhys(pDbgc->pVM, Address.FlatPtr, &pResult->u.HCPhys); 4491 4485 if (VBOX_SUCCESS(rc)) 4492 4486 return 0; … … 4564 4558 case DBGCVAR_TYPE_GC_FAR: 4565 4559 { 4566 PCPUMCTX pCtx;4567 CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);4568 4569 4560 Assert(pDbgc->pVM); 4570 rc = SELMToFlatEx(pDbgc->pVM, pCtx->eflags, pResult->u.GCFar.sel, pResult->u.GCFar.off, NULL,4571 SELMTOFLAT_FLAGS_NO_PL | SELMTOFLAT_FLAGS_HYPER, &pResult->u.GCFlat, NULL);4561 DBGFADDRESS Address; 4562 rc = DBGFR3AddrFromSelOff(pDbgc->pVM, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off); 4572 4563 if (VBOX_SUCCESS(rc)) 4573 4564 { 4574 4565 pResult->enmType = DBGCVAR_TYPE_HC_FLAT; 4575 rc = PGMPhysGCPtr2HCPtr(pDbgc->pVM, pResult->u.GCFlat, &pResult->u.pvHCFlat);4566 rc = PGMPhysGCPtr2HCPtr(pDbgc->pVM, Address.FlatPtr, &pResult->u.pvHCFlat); 4576 4567 if (VBOX_SUCCESS(rc)) 4577 4568 return 0; … … 5765 5756 /* 5766 5757 * Convert Far addresses getting size and the correct base address. 5758 * Getting and checking the size is what makes this messy and slow. 5767 5759 */ 5768 5760 DBGCVAR Var = *pVarPointer; … … 5771 5763 case DBGCVAR_TYPE_GC_FAR: 5772 5764 { 5773 uint32_t cb; 5774 PCPUMCTX pCtx; 5775 CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx); 5776 5777 Var.enmType = DBGCVAR_TYPE_GC_FLAT; 5778 int rc = SELMToFlatEx(pDbgc->pVM, pCtx->eflags, Var.u.GCFar.sel, Var.u.GCFar.off, NULL, 5779 SELMTOFLAT_FLAGS_NO_PL | SELMTOFLAT_FLAGS_HYPER, &Var.u.GCFlat, &cb); 5765 /* Use DBGFR3AddrFromSelOff for the conversion. */ 5766 Assert(pDbgc->pVM); 5767 DBGFADDRESS Address; 5768 int rc = DBGFR3AddrFromSelOff(pDbgc->pVM, &Address, Var.u.GCFar.sel, Var.u.GCFar.off); 5780 5769 if (VBOX_FAILURE(rc)) 5781 5770 return rc; 5782 if (cbRead > cb) 5771 5772 /* don't bother with flat selectors (for now). */ 5773 if (!DBGFADDRESS_IS_FLAT(&Address)) 5783 5774 { 5784 if (!pcbRead) 5785 return VERR_OUT_OF_SELECTOR_BOUNDS; 5786 cbRead = cb; 5775 SELMSELINFO SelInfo; 5776 rc = SELMR3GetSelectorInfo(pDbgc->pVM, Address.Sel, &SelInfo); 5777 if (VBOX_SUCCESS(rc)) 5778 { 5779 RTGCUINTPTR cb; 5780 /** @todo Add SELMSelInfoIsExpandDown() */ 5781 if ( (SelInfo.Raw.Gen.u4Type & X86_SEL_TYPE_DOWN) 5782 && SelInfo.Raw.Gen.u1DescType 5783 && ( SelInfo.Raw.Gen.u4Type == X86_SEL_TYPE_RO_DOWN 5784 || SelInfo.Raw.Gen.u4Type == X86_SEL_TYPE_RO_DOWN_ACC 5785 || SelInfo.Raw.Gen.u4Type == X86_SEL_TYPE_RW_DOWN 5786 || SelInfo.Raw.Gen.u4Type == X86_SEL_TYPE_RW_DOWN_ACC)) 5787 { 5788 if ( !SelInfo.Raw.Gen.u1Granularity 5789 && Address.off > UINT16_C(0xffff)) 5790 return VERR_OUT_OF_SELECTOR_BOUNDS; 5791 if (Address.off <= SelInfo.cbLimit) 5792 return VERR_OUT_OF_SELECTOR_BOUNDS; 5793 cb = (SelInfo.Raw.Gen.u1Granularity ? UINT32_C(0xffffffff) : UINT32_C(0xffff)) - Address.off; 5794 } 5795 else 5796 { 5797 if (Address.off >= SelInfo.cbLimit) 5798 return VERR_OUT_OF_SELECTOR_BOUNDS; 5799 cb = SelInfo.cbLimit - Address.off; 5800 } 5801 if (cbRead - 1 > cb) 5802 { 5803 if (!pcbRead) 5804 return VERR_OUT_OF_SELECTOR_BOUNDS; 5805 cbRead = cb; 5806 } 5807 } 5808 5809 Var.enmType = DBGCVAR_TYPE_GC_FLAT; 5810 Var.u.GCFlat = Address.FlatPtr; 5787 5811 } 5788 5812 break; 5789 5813 } 5790 5791 case DBGCVAR_TYPE_HC_FAR:5792 /* not supported yet! */5793 return VERR_NOT_IMPLEMENTED;5794 5814 5795 5815 case DBGCVAR_TYPE_GC_FLAT: … … 5799 5819 break; 5800 5820 5821 case DBGCVAR_TYPE_HC_FAR: /* not supported yet! */ 5801 5822 default: 5802 5823 return VERR_NOT_IMPLEMENTED;
Note:
See TracChangeset
for help on using the changeset viewer.