VirtualBox

Changeset 83083 in vbox


Ignore:
Timestamp:
Feb 15, 2020 2:23:57 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
136138
Message:

DBGPlugInDarwin.cpp: Hacking.

File:
1 edited

Legend:

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

    r82968 r83083  
    3030#include <iprt/ctype.h>
    3131#include <iprt/formats/mach-o.h>
     32
     33#undef LogRel2
     34#define LogRel2 LogRel
    3235
    3336
     
    165168        if (RT_FAILURE(rc))
    166169        {
    167             Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to read _msgbufp at %RGv: %Rrc\n", Addr.FlatPtr, rc));
     170            LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to read _msgbufp at %RGv: %Rrc\n", Addr.FlatPtr, rc));
    168171            return VERR_NOT_FOUND;
    169172        }
    170173        if (!OSX_VALID_ADDRESS(pData->f64Bit, GCPtrMsgBufP))
    171174        {
    172             Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid address for _msgbufp: %RGv\n", GCPtrMsgBufP));
     175            LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid address for _msgbufp: %RGv\n", GCPtrMsgBufP));
    173176            return VERR_NOT_FOUND;
    174177        }
     
    179182        if (RT_FAILURE(rc))
    180183        {
    181             Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to find _msgbufp and _msgbuf: %Rrc\n", rc));
     184            LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to find _msgbufp and _msgbuf: %Rrc\n", rc));
    182185            return VERR_NOT_FOUND;
    183186        }
     
    185188        if (!OSX_VALID_ADDRESS(pData->f64Bit, GCPtrMsgBufP))
    186189        {
    187             Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid address for _msgbuf: %RGv\n", GCPtrMsgBufP));
     190            LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid address for _msgbuf: %RGv\n", GCPtrMsgBufP));
    188191            return VERR_NOT_FOUND;
    189192        }
     
    205208    if (RT_FAILURE(rc))
    206209    {
    207         Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to read msgbuf struct at %RGv: %Rrc\n", Addr.FlatPtr, rc));
     210        LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to read msgbuf struct at %RGv: %Rrc\n", Addr.FlatPtr, rc));
    208211        return VERR_NOT_FOUND;
    209212    }
     
    221224        || !OSX_VALID_ADDRESS(pData->f64Bit, MsgBuf.msg_bufc) )
    222225    {
    223         Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid MsgBuf data: magic=%#x size=%#x bufx=%#x bufr=%#x bufc=%RGv\n",
    224              MsgBuf.msg_magic, MsgBuf.msg_size, MsgBuf.msg_bufx, MsgBuf.msg_bufr, MsgBuf.msg_bufc));
     226        LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid MsgBuf data: magic=%#x size=%#x bufx=%#x bufr=%#x bufc=%RGv\n",
     227                MsgBuf.msg_magic, MsgBuf.msg_size, MsgBuf.msg_bufx, MsgBuf.msg_bufr, MsgBuf.msg_bufc));
    225228        return VERR_INVALID_STATE;
    226229    }
     
    232235    if (!pchMsgBuf)
    233236    {
    234         Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: Failed to allocate %#x bytes of memory for the log buffer\n",
    235              MsgBuf.msg_size));
     237        LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Failed to allocate %#x bytes of memory for the log buffer\n",
     238                MsgBuf.msg_size));
    236239        return VERR_INVALID_STATE;
    237240    }
     
    299302    }
    300303    else
    301         Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: Error reading %#x bytes at %RGv: %Rrc\n", MsgBuf.msg_size, MsgBuf.msg_bufc, rc));
     304        LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Error reading %#x bytes at %RGv: %Rrc\n",
     305                MsgBuf.msg_size, MsgBuf.msg_bufc, rc));
    302306    RTMemFree(pchMsgBuf);
    303307    return rc;
     
    389393    dbgDiggerDarwinTerm(pUVM, pvData);
    390394    return dbgDiggerDarwinInit(pUVM, pvData);
     395}
     396
     397
     398/**
     399 * Helper function that tries to accertain whether a segment (__LINKEDIT) is
     400 * present or not.
     401 *
     402 * @returns true if present, false if not.
     403 * @param   pUVM                The user mode VM structure.
     404 * @param   uSegAddr            The segment addresss.
     405 * @param   cbSeg               The segment size.
     406 * @param   uMinAddr            Lowest allowed address.
     407 * @param   uMaxAddr            Highest allowed address.
     408 */
     409static int dbgDiggerDarwinIsSegmentPresent(PUVM pUVM, uint64_t uSegAddr, uint64_t cbSeg, uint64_t uMinAddr, uint64_t uMaxAddr)
     410{
     411    /*
     412     * Validate the size and address.
     413     */
     414    if (cbSeg < 32)
     415    {
     416        LogRel(("OSXDig: __LINKEDIT too small %#RX64\n", cbSeg));
     417        return false;
     418    }
     419    if (cbSeg > uMaxAddr - uMinAddr)
     420    {
     421        LogRel(("OSXDig: __LINKEDIT too big %#RX64, max %#RX64\n", cbSeg, uMaxAddr - uMinAddr));
     422        return false;
     423    }
     424
     425    if (uSegAddr < uMinAddr)
     426    {
     427        LogRel(("OSXDig: __LINKEDIT too low %#RX64, min %#RX64\n", uSegAddr, uMinAddr));
     428        return false;
     429    }
     430    if (uSegAddr > uMaxAddr)
     431    {
     432        LogRel(("OSXDig: __LINKEDIT too high %#RX64, max %#RX64\n", uSegAddr, uMaxAddr));
     433        return false;
     434    }
     435    if (uSegAddr + cbSeg > uMaxAddr)
     436    {
     437        LogRel(("OSXDig: __LINKEDIT ends too high %#RX64 (%#RX64+%#RX64), max %#RX64\n",
     438                 uSegAddr + cbSeg, uSegAddr, cbSeg, uMaxAddr));
     439        return false;
     440    }
     441
     442    /*
     443     * Check that all the pages are present.
     444     */
     445    cbSeg    += uSegAddr & X86_PAGE_OFFSET_MASK;
     446    uSegAddr &= ~(uint64_t)X86_PAGE_OFFSET_MASK;
     447    for (;;)
     448    {
     449        uint8_t     abBuf[8];
     450        DBGFADDRESS Addr;
     451        int rc = DBGFR3MemRead(pUVM, 0 /*idCpu*/, DBGFR3AddrFromFlat(pUVM, &Addr, uSegAddr), abBuf, sizeof(abBuf));
     452        if (RT_FAILURE(rc))
     453        {
     454            LogRel(("OSXDig: __LINKEDIT read error at %#RX64: %Rrc\n", uSegAddr, rc));
     455            return false;
     456        }
     457
     458        /* Advance */
     459        if (cbSeg <= X86_PAGE_SIZE)
     460            return true;
     461        cbSeg    -= X86_PAGE_SIZE;
     462        uSegAddr += X86_PAGE_SIZE;
     463    }
    391464}
    392465
     
    506579                if (!dbgDiggerDarwinIsValidSegOrSectName(uLCmd.pSeg32->segname, sizeof(uLCmd.pSeg32->segname)))
    507580                    return VERR_INVALID_NAME;
    508                 if (!strcmp(uLCmd.pSeg32->segname, "__LINKEDIT"))
     581                if (   !strcmp(uLCmd.pSeg32->segname, "__LINKEDIT")
     582                    && !dbgDiggerDarwinIsSegmentPresent(pUVM, uLCmd.pSeg32->vmaddr, uLCmd.pSeg32->vmsize,
     583                                                        uModAddr, uModAddr + _64M))
    509584                    break; /* This usually is discarded or not loaded at all. */
    510585                if (cSegs >= RT_ELEMENTS(aSegs))
     
    525600                if (!dbgDiggerDarwinIsValidSegOrSectName(uLCmd.pSeg64->segname, sizeof(uLCmd.pSeg64->segname)))
    526601                    return VERR_INVALID_NAME;
    527                 if (!strcmp(uLCmd.pSeg64->segname, "__LINKEDIT"))
     602                if (   !strcmp(uLCmd.pSeg64->segname, "__LINKEDIT")
     603                    && !dbgDiggerDarwinIsSegmentPresent(pUVM, uLCmd.pSeg64->vmaddr, uLCmd.pSeg64->vmsize,
     604                                                        uModAddr, uModAddr + _128M))
    528605                    break; /* This usually is discarded or not loaded at all. */
    529606                if (cSegs >= RT_ELEMENTS(aSegs))
     
    570647            break;
    571648    if (iSeg >= cSegs)
     649    {
     650        LogRel2(("OSXDig: uModAddr=%#RX64 was not found among the segments segments\n", uModAddr));
    572651        return VERR_ADDRESS_CONFLICT;
     652    }
    573653
    574654    /*
     
    581661    if (RT_FAILURE(rc))
    582662    {
     663        /** @todo try open in memory. */
     664
    583665        /*
    584666         * Final fallback is a container module.
     
    734816                    if (!OSX_VALID_ADDRESS(f64Bit, AddrModInfo.FlatPtr))
    735817                    {
    736                         Log(("OSXDig: Invalid kmod_info pointer: %RGv\n", AddrModInfo.FlatPtr));
     818                        LogRel(("OSXDig: Invalid kmod_info pointer: %RGv\n", AddrModInfo.FlatPtr));
    737819                        break;
    738820                    }
    739821                    if (AddrModInfo.FlatPtr == uKmodValue.u && cIterations != 0)
    740822                    {
    741                         Log(("OSXDig: kmod_info list looped back to the start.\n"));
     823                        LogRel(("OSXDig: kmod_info list looped back to the start.\n"));
    742824                        break;
    743825                    }
    744826                    if (cIterations++ >= 2048)
    745827                    {
    746                         Log(("OSXDig: Too many mod_info loops (%u)\n", cIterations));
     828                        LogRel(("OSXDig: Too many mod_info loops (%u)\n", cIterations));
    747829                        break;
    748830                    }
     
    761843                    if (RT_FAILURE(rc))
    762844                    {
    763                         Log(("OSXDig: Error reading kmod_info structure at %RGv: %Rrc\n", AddrModInfo.FlatPtr, rc));
     845                        LogRel(("OSXDig: Error reading kmod_info structure at %RGv: %Rrc\n", AddrModInfo.FlatPtr, rc));
    764846                        break;
    765847                    }
     
    771853                    if (iInfoVer != OSX_KMOD_INFO_VERSION)
    772854                    {
    773                         Log(("OSXDig: kmod_info @%RGv: Bad info_version %d\n", AddrModInfo.FlatPtr, iInfoVer));
     855                        LogRel(("OSXDig: kmod_info @%RGv: Bad info_version %d\n", AddrModInfo.FlatPtr, iInfoVer));
    774856                        break;
    775857                    }
     
    780862                        || !dbgDiggerDarwinIsValidName(pszName) )
    781863                    {
    782                         Log(("OSXDig: kmod_info @%RGv: Bad name '%.*s'\n", AddrModInfo.FlatPtr,
    783                              sizeof(uMod.Info64.name), pszName));
     864                        LogRel(("OSXDig: kmod_info @%RGv: Bad name '%.*s'\n", AddrModInfo.FlatPtr,
     865                                sizeof(uMod.Info64.name), pszName));
    784866                        break;
    785867                    }
     
    789871                        || !dbgDiggerDarwinIsValidVersion(pszVersion) )
    790872                    {
    791                         Log(("OSXDig: kmod_info @%RGv: Bad version '%.*s'\n", AddrModInfo.FlatPtr,
     873                        LogRel(("OSXDig: kmod_info @%RGv: Bad version '%.*s'\n", AddrModInfo.FlatPtr,
    792874                             sizeof(uMod.Info64.version), pszVersion));
    793875                        break;
     
    797879                    if (cRefs < -1 || cRefs > 16384)
    798880                    {
    799                         Log(("OSXDig: kmod_info @%RGv: Bad reference_count %d\n", AddrModInfo.FlatPtr, cRefs));
     881                        LogRel(("OSXDig: kmod_info @%RGv: Bad reference_count %d\n", AddrModInfo.FlatPtr, cRefs));
    800882                        break;
    801883                    }
     
    804886                    if (!OSX_VALID_ADDRESS(f64Bit, uImageAddr))
    805887                    {
    806                         Log(("OSXDig: kmod_info @%RGv: Bad address %#llx\n", AddrModInfo.FlatPtr, uImageAddr));
     888                        LogRel(("OSXDig: kmod_info @%RGv: Bad address %#llx\n", AddrModInfo.FlatPtr, uImageAddr));
    807889                        break;
    808890                    }
     
    811893                    if (cbImage > 64U*_1M)
    812894                    {
    813                         Log(("OSXDig: kmod_info @%RGv: Bad size %#llx\n", AddrModInfo.FlatPtr, cbImage));
     895                        LogRel(("OSXDig: kmod_info @%RGv: Bad size %#llx\n", AddrModInfo.FlatPtr, cbImage));
    814896                        break;
    815897                    }
     
    818900                    if (cbHdr > 16U*_1M)
    819901                    {
    820                         Log(("OSXDig: kmod_info @%RGv: Bad hdr_size %#llx\n", AddrModInfo.FlatPtr, cbHdr));
     902                        LogRel(("OSXDig: kmod_info @%RGv: Bad hdr_size %#llx\n", AddrModInfo.FlatPtr, cbHdr));
    821903                        break;
    822904                    }
     
    825907                    if (!uStartAddr && !OSX_VALID_ADDRESS(f64Bit, uStartAddr))
    826908                    {
    827                         Log(("OSXDig: kmod_info @%RGv: Bad start function %#llx\n", AddrModInfo.FlatPtr, uStartAddr));
     909                        LogRel(("OSXDig: kmod_info @%RGv: Bad start function %#llx\n", AddrModInfo.FlatPtr, uStartAddr));
    828910                        break;
    829911                    }
     
    832914                    if (!uStopAddr && !OSX_VALID_ADDRESS(f64Bit, uStopAddr))
    833915                    {
    834                         Log(("OSXDig: kmod_info @%RGv: Bad stop function %#llx\n", AddrModInfo.FlatPtr, uStopAddr));
     916                        LogRel(("OSXDig: kmod_info @%RGv: Bad stop function %#llx\n", AddrModInfo.FlatPtr, uStopAddr));
    835917                        break;
    836918                    }
     
    839921                     * Try add the module.
    840922                     */
    841                     Log(("OSXDig: kmod_info @%RGv: '%s' ver '%s', image @%#llx LB %#llx cbHdr=%#llx\n", AddrModInfo.FlatPtr,
    842                          pszName, pszVersion, uImageAddr, cbImage, cbHdr));
     923                    LogRel(("OSXDig: kmod_info @%RGv: '%s' ver '%s', image @%#llx LB %#llx cbHdr=%#llx\n", AddrModInfo.FlatPtr,
     924                            pszName, pszVersion, uImageAddr, cbImage, cbHdr));
    843925                    rc = dbgDiggerDarwinAddModule(pThis, pUVM, uImageAddr, pszName, NULL);
    844926
     
    851933            }
    852934            else
    853                 Log(("OSXDig: Error reading the 'kmod' variable: %Rrc\n", rc));
     935                LogRel(("OSXDig: Error reading the 'kmod' variable: %Rrc\n", rc));
    854936        }
    855937        else
    856             Log(("OSXDig: Failed to locate the 'kmod' variable in mach_kernel.\n"));
     938            LogRel(("OSXDig: Failed to locate the 'kmod' variable in mach_kernel.\n"));
    857939
    858940        pThis->fValid = true;
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