VirtualBox

Changeset 19303 in vbox for trunk/src/recompiler


Ignore:
Timestamp:
May 3, 2009 12:58:22 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
46759
Message:

REM: Fixed crash caused by cpu_abort on AMD64/Win and changed the release assertion into a RTLogRelPrintf so we get a guru meditation instead of a crash.

Location:
trunk/src/recompiler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler/VBoxREMWrapper.cpp

    r19300 r19303  
    12031203    { "RTLogLoggerExV",                         (void *)(uintptr_t)&RTLogLoggerExV,                 &g_aArgsRTLogLoggerExV[0],                  RT_ELEMENTS(g_aArgsRTLogLoggerExV),                    REMFNDESC_FLAGS_RET_VOID | REMFNDESC_FLAGS_VALIST, 0, NULL },
    12041204    { "RTLogPrintf",                            (void *)(uintptr_t)&RTLogPrintf,                    &g_aArgsRTLogPrintf[0],                     RT_ELEMENTS(g_aArgsRTLogPrintf),                       REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
     1205    { "RTLogRelPrintf",                         (void *)(uintptr_t)&RTLogRelPrintf,                 &g_aArgsRTLogPrintf[0],                     RT_ELEMENTS(g_aArgsRTLogPrintf),                       REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
    12051206    { "RTMemAlloc",                             (void *)(uintptr_t)&RTMemAlloc,                     &g_aArgsSIZE_T[0],                          RT_ELEMENTS(g_aArgsSIZE_T),                            REMFNDESC_FLAGS_RET_INT,    sizeof(void *),     NULL },
    12061207    { "RTMemAllocZ",                            (void *)(uintptr_t)&RTMemAllocZ,                    &g_aArgsSIZE_T[0],                          RT_ELEMENTS(g_aArgsSIZE_T),                            REMFNDESC_FLAGS_RET_INT,    sizeof(void *),     NULL },
  • trunk/src/recompiler/VBoxRecompiler.c

    r19300 r19303  
    42934293void cpu_abort(CPUState *env, const char *pszFormat, ...)
    42944294{
    4295     va_list args;
     4295    va_list va;
    42964296    PVM     pVM;
    42974297    PVMCPU  pVCpu;
     4298    char    szMsg[256];
    42984299
    42994300    /*
    43004301     * Bitch about it.
    43014302     */
    4302 #ifndef _MSC_VER
    4303     /** @todo: MSVC is right - it's not valid C */
    43044303    RTLogFlags(NULL, "nodisabled nobuffered");
    4305 #endif
    4306     va_start(args, pszFormat);
    4307     RTLogPrintf("fatal error in recompiler cpu: %N\n", pszFormat, &args);
    4308     va_end(args);
    4309     va_start(args, pszFormat);
    4310     AssertReleaseMsgFailed(("fatal error in recompiler cpu: %N\n", pszFormat, &args));
    4311     va_end(args);
     4304    RTLogFlush(NULL);
     4305
     4306    va_start(va, pszFormat);
     4307#if defined(RT_OS_WINDOWS) && ARCH_BITS == 64
     4308    /* It's a bit complicated when mixing MSC and GCC on AMD64. This is a bit ugly, but it works. */
     4309    unsigned    cArgs     = 0;
     4310    uintptr_t   auArgs[6] = {0,0,0,0,0,0};
     4311    const char *psz       = strchr(pszFormat, '%');
     4312    while (psz && cArgs < 6)
     4313    {
     4314        auArgs[cArgs++] = va_arg(va, uintptr_t);
     4315        psz = strchr(psz + 1, '%');
     4316    }
     4317    switch (cArgs)
     4318    {
     4319        case 1: RTStrPrintf(szMsg, sizeof(szMsg), pszFormat, auArgs[0]); break;
     4320        case 2: RTStrPrintf(szMsg, sizeof(szMsg), pszFormat, auArgs[0], auArgs[1]); break;
     4321        case 3: RTStrPrintf(szMsg, sizeof(szMsg), pszFormat, auArgs[0], auArgs[1], auArgs[2]); break;
     4322        case 4: RTStrPrintf(szMsg, sizeof(szMsg), pszFormat, auArgs[0], auArgs[1], auArgs[2], auArgs[3]); break;
     4323        case 5: RTStrPrintf(szMsg, sizeof(szMsg), pszFormat, auArgs[0], auArgs[1], auArgs[2], auArgs[3], auArgs[4]); break;
     4324        case 6: RTStrPrintf(szMsg, sizeof(szMsg), pszFormat, auArgs[0], auArgs[1], auArgs[2], auArgs[3], auArgs[4], auArgs[5]); break;
     4325        default:
     4326        case 0: RTStrPrintf(szMsg, sizeof(szMsg), "%s", pszFormat); break;
     4327    }
     4328#else
     4329    RTStrPrintfV(szMsg, sizeof(szMsg), pszFormat, va);
     4330#endif
     4331    va_end(va);
     4332
     4333    RTLogPrintf("fatal error in recompiler cpu: %s\n", szMsg);
     4334    RTLogRelPrintf("fatal error in recompiler cpu: %s\n", szMsg);
    43124335
    43134336    /*
Note: See TracChangeset for help on using the changeset viewer.

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