VirtualBox

Changeset 8844

Show
Ignore:
Timestamp:
05/15/08 13:28:05 (5 months ago)
Author:
vboxsync
Message:

Dig out the solaris release+version

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/VBox/Debugger/DBGPlugInSolaris.cpp

    r8820 r8844  
    118118AssertCompileSize(SOL32_module_t, 0xd4); 
    119119 
     120typedef struct SOL_utsname 
     121{ 
     122    char        sysname[257]; 
     123    char        nodename[257]; 
     124    char        release[257]; 
     125    char        version[257]; 
     126    char        machine[257]; 
     127} SOL_utsname_t; 
     128AssertCompileSize(SOL_utsname_t, 5 * 257); 
     129 
    120130/** @} */ 
    121131 
     
    148158*******************************************************************************/ 
    149159/** Validates a 32-bit solaris kernel address */ 
    150 #define SOL32_VALID_ADDRESS(Addr)   ((Addr) > UINT32_C(0x80000000) && (Addr) < UINT32_C(0xfffff000)) 
    151  
     160#define SOL32_VALID_ADDRESS(Addr)       ((Addr) > UINT32_C(0x80000000) && (Addr) < UINT32_C(0xfffff000)) 
     161 
     162/** The max data segment size of the 'unix' module. */ 
     163#define SOL_UNIX_MAX_DATA_SEG_SIZE      0x01000000 
    152164 
    153165 
     
    176188    Assert(pThis->fValid); 
    177189 
    178     return VERR_NOT_IMPLEMENTED; 
     190    /* 
     191     * It's all in the utsname symbol... 
     192     */ 
     193    DBGFADDRESS Addr; 
     194    SOL_utsname_t UtsName; 
     195    DBGFSYMBOL SymUtsName; 
     196    int rc = DBGFR3SymbolByName(pVM, "utsname", &SymUtsName); 
     197    if (RT_SUCCESS(rc)) 
     198        rc = DBGFR3MemRead(pVM, DBGFR3AddrFromFlat(pVM, &Addr, SymUtsName.Value), &UtsName, sizeof(UtsName)); 
     199    if (RT_FAILURE(rc)) 
     200    { 
     201        /* 
     202         * Try searching by the name... 
     203         */ 
     204        memset(&UtsName, '\0', sizeof(UtsName)); 
     205        strcpy(&UtsName.sysname[0], "SunOS"); 
     206        rc = DBGFR3MemScan(pVM, &pThis->AddrUnixData, SOL_UNIX_MAX_DATA_SEG_SIZE, 
     207                           (uint8_t *)&UtsName.sysname[0], sizeof(UtsName.sysname), &Addr); 
     208        if (RT_SUCCESS(rc)) 
     209            rc = DBGFR3MemRead(pVM, DBGFR3AddrFromFlat(pVM, &Addr, Addr.FlatPtr - RT_OFFSETOF(SOL_utsname_t, sysname)), 
     210                               &UtsName, sizeof(UtsName)); 
     211    } 
     212 
     213    /* 
     214     * Copy out the result (if any). 
     215     */ 
     216    if (RT_SUCCESS(rc)) 
     217    { 
     218        if (    UtsName.nodename[-1] != '\0' 
     219            ||  UtsName.release[-1] != '\0' 
     220            ||  UtsName.version[-1] != '\0' 
     221            ||  UtsName.machine[-1] != '\0' 
     222            ||  UtsName.machine[sizeof(UtsName.machine) - 1] != '\0') 
     223        { 
     224            //rc = VERR_DBGF_UNEXPECTED_OS_DATA; 
     225            rc = VERR_GENERAL_FAILURE; 
     226            RTStrPrintf(pszVersion, cchVersion, "failed - bogus utsname"); 
     227        } 
     228        else 
     229            RTStrPrintf(pszVersion, cchVersion, "%s %s", UtsName.version, UtsName.release); 
     230    } 
     231    else 
     232        RTStrPrintf(pszVersion, cchVersion, "failed - %Rrc", rc); 
     233 
     234    return rc; 
    179235} 
    180236 
     
    365421    DBGFADDRESS     CurAddr = pThis->AddrUnixData; 
    366422    DBGFADDRESS     MaxAddr; 
    367     DBGFR3AddrFromFlat(pVM, &MaxAddr, CurAddr.FlatPtr + 0x01000000); 
     423    DBGFR3AddrFromFlat(pVM, &MaxAddr, CurAddr.FlatPtr + SOL_UNIX_MAX_DATA_SEG_SIZE); 
    368424    const uint8_t  *pbExpr = (const uint8_t *)&pThis->AddrUnixText.FlatPtr; 
    369425    const uint32_t  cbExpr = sizeof(uint32_t);//pThis->AddrUnixText.FlatPtr < _4G ? sizeof(uint32_t) : sizeof(uint64_t) 

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy