VirtualBox

Changeset 4199 in vbox


Ignore:
Timestamp:
Aug 17, 2007 12:45:53 AM (17 years ago)
Author:
vboxsync
Message:

Don't use SELMToFlatEx.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Debugger/DBGConsole.cpp

    r4071 r4199  
    43054305 * Flat address (unary).
    43064306 *
    4307  * @returns 0 on success.
     4307 * @returns VINF_SUCCESS on success.
    43084308 * @returns VBox evaluation / parsing error code on failure.
    43094309 *          The caller does the bitching.
     
    43214321    {
    43224322        case DBGCVAR_TYPE_GC_FLAT:
    4323             return 0;
     4323            return VINF_SUCCESS;
    43244324
    43254325        case DBGCVAR_TYPE_GC_FAR:
    43264326        {
    4327             PCPUMCTX        pCtx;
    4328             CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);
    4329 
    43304327            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);
    43354330            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            }
    43374336            return VERR_PARSE_CONVERSION_FAILED;
    43384337        }
     
    43434342
    43444343        case DBGCVAR_TYPE_HC_FLAT:
    4345             return 0;
     4344            return VINF_SUCCESS;
    43464345
    43474346        case DBGCVAR_TYPE_HC_FAR:
     
    43534352            rc = MMR3HCPhys2HCVirt(pDbgc->pVM, pResult->u.HCPhys, &pResult->u.pvHCFlat);
    43544353            if (VBOX_SUCCESS(rc))
    4355                 return 0;
     4354                return VINF_SUCCESS;
    43564355            return VERR_PARSE_CONVERSION_FAILED;
    43574356
     
    43594358            pResult->enmType    = DBGCVAR_TYPE_GC_FLAT;
    43604359            pResult->u.GCFlat   = (RTGCPTR)pResult->u.u64Number;
    4361             return 0;
     4360            return VINF_SUCCESS;
    43624361
    43634362        case DBGCVAR_TYPE_STRING:
     
    44004399        case DBGCVAR_TYPE_GC_FAR:
    44014400        {
    4402             PCPUMCTX        pCtx;
    4403             CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);
    44044401            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);
    44074404            if (VBOX_SUCCESS(rc))
    44084405            {
    44094406                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);
    44114408                if (VBOX_SUCCESS(rc))
    44124409                    return 0;
     
    44794476        case DBGCVAR_TYPE_GC_FAR:
    44804477        {
    4481             PCPUMCTX        pCtx;
    4482             CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);
    4483 
    44844478            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);
    44874481            if (VBOX_SUCCESS(rc))
    44884482            {
    44894483                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);
    44914485                if (VBOX_SUCCESS(rc))
    44924486                    return 0;
     
    45644558        case DBGCVAR_TYPE_GC_FAR:
    45654559        {
    4566             PCPUMCTX        pCtx;
    4567             CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);
    4568 
    45694560            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);
    45724563            if (VBOX_SUCCESS(rc))
    45734564            {
    45744565                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);
    45764567                if (VBOX_SUCCESS(rc))
    45774568                    return 0;
     
    57655756    /*
    57665757     * Convert Far addresses getting size and the correct base address.
     5758     * Getting and checking the size is what makes this messy and slow.
    57675759     */
    57685760    DBGCVAR Var = *pVarPointer;
     
    57715763        case DBGCVAR_TYPE_GC_FAR:
    57725764        {
    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);
    57805769            if (VBOX_FAILURE(rc))
    57815770                return rc;
    5782             if (cbRead > cb)
     5771
     5772            /* don't bother with flat selectors (for now). */
     5773            if (!DBGFADDRESS_IS_FLAT(&Address))
    57835774            {
    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;
    57875811            }
    57885812            break;
    57895813        }
    5790 
    5791         case DBGCVAR_TYPE_HC_FAR:
    5792             /* not supported yet! */
    5793             return VERR_NOT_IMPLEMENTED;
    57945814
    57955815        case DBGCVAR_TYPE_GC_FLAT:
     
    57995819            break;
    58005820
     5821        case DBGCVAR_TYPE_HC_FAR: /* not supported yet! */
    58015822        default:
    58025823            return VERR_NOT_IMPLEMENTED;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette