VirtualBox

Changeset 22105 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Aug 8, 2009 2:54:59 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
50854
Message:

DBGF: Added DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE for making stack walking work - it's a gross hack. A more proper solution would mean adding more context to sel:off conversions, no time for that now.

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/DBGFAddr.cpp

    r19463 r22105  
    6969    {
    7070        DBGFSELINFO SelInfo;
    71         int rc = DBGFR3SelQueryInfo(pVM, idCpu, Sel, DBGFSELQI_FLAGS_DT_GUEST, &SelInfo);
     71        int rc = DBGFR3SelQueryInfo(pVM, idCpu, Sel, DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE, &SelInfo);
    7272        if (RT_FAILURE(rc))
    7373            return rc;
  • trunk/src/VBox/VMM/DBGFMem.cpp

    r20868 r22105  
    403403     */
    404404    int rc;
    405     if (!(fFlags & DBGFSELQI_FLAGS_DT_GUEST))
     405    if (!(fFlags & DBGFSELQI_FLAGS_DT_SHADOW))
    406406    {
    407407        PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu);
    408408        VMCPU_ASSERT_EMT(pVCpu);
    409409        rc = SELMR3GetSelectorInfo(pVM, pVCpu, Sel, pSelInfo);
     410
     411        /*
     412         * 64-bit mode HACKS for making data and stack selectors wide open when
     413         * queried. This is voodoo magic.
     414         */
     415        if (fFlags & DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE)
     416        {
     417            /* Expand 64-bit data and stack selectors. The check is a bit bogus... */
     418            if (    RT_SUCCESS(rc)
     419                &&  (pSelInfo->fFlags & (  DBGFSELINFO_FLAGS_LONG_MODE | DBGFSELINFO_FLAGS_REAL_MODE | DBGFSELINFO_FLAGS_PROT_MODE
     420                                         | DBGFSELINFO_FLAGS_GATE      | DBGFSELINFO_FLAGS_HYPER
     421                                         | DBGFSELINFO_FLAGS_INVALID   | DBGFSELINFO_FLAGS_NOT_PRESENT))
     422                     == DBGFSELINFO_FLAGS_LONG_MODE
     423                &&  pSelInfo->cbLimit != ~(RTGCPTR)0
     424                &&  CPUMIsGuestIn64BitCode(pVCpu, CPUMGetGuestCtxCore(pVCpu)) )
     425            {
     426                pSelInfo->GCPtrBase = 0;
     427                pSelInfo->cbLimit   = ~(RTGCPTR)0;
     428            }
     429            else if (   Sel == 0
     430                     && CPUMIsGuestIn64BitCode(pVCpu, CPUMGetGuestCtxCore(pVCpu)))
     431            {
     432                pSelInfo->GCPtrBase = 0;
     433                pSelInfo->cbLimit   = ~(RTGCPTR)0;
     434                pSelInfo->Sel       = 0;
     435                pSelInfo->SelGate   = 0;
     436                pSelInfo->fFlags    = DBGFSELINFO_FLAGS_LONG_MODE;
     437                pSelInfo->u.Raw64.Gen.u1Present  = 1;
     438                pSelInfo->u.Raw64.Gen.u1Long     = 1;
     439                pSelInfo->u.Raw64.Gen.u1DescType = 1;
     440                rc = VINF_SUCCESS;
     441            }
     442        }
    410443    }
    411444    else
     
    449482{
    450483    AssertReturn(idCpu < pVM->cCPUs, VERR_INVALID_PARAMETER);
    451     AssertReturn(!(fFlags & ~(DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_SHADOW)), VERR_INVALID_PARAMETER);
     484    AssertReturn(!(fFlags & ~(DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE)), VERR_INVALID_PARAMETER);
     485    AssertReturn(    (fFlags & (DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE))
     486                  !=           (DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE), VERR_INVALID_PARAMETER);
    452487
    453488    /* Clear the return data here on this thread. */
  • trunk/src/VBox/VMM/SELM.cpp

    r22104 r22105  
    20552055    if (Desc.Gen.u1DescType)
    20562056    {
     2057        /*
     2058         * 64-bit code selectors are wide open, it's not possible to detect
     2059         * 64-bit data or stack selectors without also dragging in assumptions
     2060         * about current CS (i.e. that's we're executing in 64-bit mode).  So,
     2061         * the selinfo user needs to deal with this in the context the info is
     2062         * used unfortunately.
     2063         */
    20572064        if (    Desc.Gen.u1Long
    20582065            &&  !Desc.Gen.u1DefBig
    20592066            &&  (Desc.Gen.u4Type & X86_SEL_TYPE_CODE))
    20602067        {
    2061             /* 64-bit code selectors are wide open. It's not possible to
    2062                detect 64-bit data or stack selectors without also dragging
    2063                in assumptions about current CS. So, the selinfo user needs
    2064                to deal with this in the context the info is used unfortunately.
    2065                Note. We ignore the segment limit hacks that was added by AMD. */
     2068            /* Note! We ignore the segment limit hacks that was added by AMD. */
    20662069            pSelInfo->GCPtrBase = 0;
    20672070            pSelInfo->cbLimit   = ~(RTGCUINTPTR)0;
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