VirtualBox

Changeset 4520 in vbox for trunk


Ignore:
Timestamp:
Sep 5, 2007 7:17:14 AM (17 years ago)
Author:
vboxsync
Message:

Don't take the address of a va_list parameter. must va_copy it first or GCC/AMD64 won't work.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/VMAll.cpp

    r4071 r4520  
    250250     * Switch to EMT.
    251251     */
     252    va_list WorkaroundVA;
     253    va_copy(WorkaroundVA, args); /* Have to make a copy here or GCC will break. */
    252254    PVMREQ pReq;
    253255    VMR3ReqCall(pVM, &pReq, RT_INDEFINITE_WAIT, (PFNRT)vmR3SetRuntimeErrorV, 5,
    254                 pVM, fFatal, pszErrorID, pszFormat, &args);
     256                pVM, fFatal, pszErrorID, pszFormat, &WorkaroundVA);
    255257    VMR3ReqFree(pReq);
     258    va_end(WorkaroundVA);
    256259
    257260#else
  • trunk/src/VBox/VMM/testcase/tstVMREQ.cpp

    r4071 r4520  
    3333
    3434
    35 
    36 
    3735/*******************************************************************************
    3836*   Defined Constants And Macros                                               *
     
    4038#define TESTCASE    "tstVMREQ"
    4139
     40/*******************************************************************************
     41*   Global Variables                                                           *
     42*******************************************************************************/
     43/** the error count. */
     44static int g_cErrors = 0;
     45
     46
     47/**
     48 * Testings va_list passing in VMSetRuntimeError.
     49 */
     50static DECLCALLBACK(void) MyAtRuntimeError(PVM pVM, void *pvUser, bool fFatal, const char *pszErrorId, const char *pszFormat, va_list va)
     51{
     52    if (strcmp((const char *)pvUser, "user argument"))
     53    {
     54        RTPrintf(TESTCASE ": pvUser=%p:{%s}!\n", pvUser, (const char *)pvUser);
     55        g_cErrors++;
     56    }
     57    if (fFatal)
     58    {
     59        RTPrintf(TESTCASE ": fFatal=%d!\n", fFatal);
     60        g_cErrors++;
     61    }
     62    if (strcmp(pszErrorId, "enum"))
     63    {
     64        RTPrintf(TESTCASE ": pszErrorId=%p:{%s}!\n", pszErrorId, pszErrorId);
     65        g_cErrors++;
     66    }
     67    if (strcmp(pszFormat, "some %s string"))
     68    {
     69        RTPrintf(TESTCASE ": pszFormat=%p:{%s}!\n", pszFormat, pszFormat);
     70        g_cErrors++;
     71    }
     72
     73    char szBuf[1024];
     74    RTStrPrintfV(szBuf, sizeof(szBuf), pszFormat, va);
     75    if (strcmp(szBuf, "some error string"))
     76    {
     77        RTPrintf(TESTCASE ": RTStrPrintfV -> '%s'!\n", szBuf);
     78        g_cErrors++;
     79    }
     80}
     81
     82
     83/**
     84 * The function PassVA and PassVA2 calls.
     85 */
     86static DECLCALLBACK(int) PassVACallback(PVM pVM, unsigned u4K, unsigned u1G, const char *pszFormat, va_list *pva)
     87{
     88    if (u4K != _4K)
     89    {
     90        RTPrintf(TESTCASE ": u4K=%#x!\n", u4K);
     91        g_cErrors++;
     92    }
     93    if (u1G != _1G)
     94    {
     95        RTPrintf(TESTCASE ": u1G=%#x!\n", u1G);
     96        g_cErrors++;
     97    }
     98
     99    if (strcmp(pszFormat, "hello %s"))
     100    {
     101        RTPrintf(TESTCASE ": pszFormat=%p:{%s}!\n", pszFormat, pszFormat);
     102        g_cErrors++;
     103    }
     104
     105    char szBuf[1024];
     106    RTStrPrintfV(szBuf, sizeof(szBuf), pszFormat, *pva);
     107    if (strcmp(szBuf, "hello world"))
     108    {
     109        RTPrintf(TESTCASE ": RTStrPrintfV -> '%s'!\n", szBuf);
     110        g_cErrors++;
     111    }
     112
     113    return VINF_SUCCESS;
     114}
     115
     116
     117/**
     118 * Functions that tests passing a va_list * argument in a request,
     119 * similar to VMSetRuntimeError.
     120 */
     121static void PassVA2(PVM pVM, const char *pszFormat, va_list va)
     122{
     123#if 0 /** @todo test if this is a GCC problem only or also happens with AMD64+VCC80... */
     124    void *pvVA = &va;
     125#else
     126    va_list va2;
     127    va_copy(va2, va);
     128    void *pvVA = va2;
     129#endif
     130
     131    PVMREQ pReq;
     132    int rc = VMR3ReqCall(pVM, &pReq, RT_INDEFINITE_WAIT, (PFNRT)PassVACallback, 5,
     133                         pVM, _4K, _1G, pszFormat, pvVA);
     134    if (VBOX_SUCCESS(rc))
     135        rc = pReq->iStatus;
     136    VMR3ReqFree(pReq);
     137
     138#if 1
     139    va_end(va2);
     140#endif
     141}
     142
     143
     144/**
     145 * Functions that tests passing a va_list * argument in a request,
     146 * similar to VMSetRuntimeError.
     147 */
     148static void PassVA(PVM pVM, const char *pszFormat, ...)
     149{
     150    /* 1st test */
     151    va_list va1;
     152    va_start(va1, pszFormat);
     153    PVMREQ pReq;
     154    int rc = VMR3ReqCall(pVM, &pReq, RT_INDEFINITE_WAIT, (PFNRT)PassVACallback, 5,
     155                         pVM, _4K, _1G, pszFormat, &va1);
     156    if (VBOX_SUCCESS(rc))
     157        rc = pReq->iStatus;
     158    VMR3ReqFree(pReq);
     159    va_end(va1);
     160
     161    /* 2nd test */
     162    va_list va2;
     163    va_start(va2, pszFormat);
     164    PassVA2(pVM, pszFormat, va2);
     165    va_end(va2);
     166}
     167
     168
    42169/**
    43170 * Thread function which allocates and frees requests like wildfire.
    44171 */
    45 DECLCALLBACK(int) Thread(RTTHREAD Thread, void *pvUser)
     172static DECLCALLBACK(int) Thread(RTTHREAD Thread, void *pvUser)
    46173{
    47174    int rc = VINF_SUCCESS;
     
    88215int main(int argc, char **argv)
    89216{
    90     int     cErrors = 0;
    91 
    92217    RTR3Init();
    93218    RTPrintf(TESTCASE ": TESTING...\n");
     
    117242                {
    118243                    RTPrintf(TESTCASE ": RTThreadWait(Thread1,,) failed, rc=%Vrc\n", rc);
    119                     cErrors++;
     244                    g_cErrors++;
    120245                }
    121246                if (VBOX_FAILURE(rcThread1))
    122                     cErrors++;
     247                    g_cErrors++;
    123248            }
    124249            else
    125250            {
    126251                RTPrintf(TESTCASE ": RTThreadCreate(&Thread1,,,,) failed, rc=%Vrc\n", rc);
    127                 cErrors++;
     252                g_cErrors++;
    128253            }
    129254
     
    133258            {
    134259                RTPrintf(TESTCASE ": RTThreadWait(Thread1,,) failed, rc=%Vrc\n", rc);
    135                 cErrors++;
     260                g_cErrors++;
    136261            }
    137262            if (VBOX_FAILURE(rcThread0))
    138                 cErrors++;
     263                g_cErrors++;
    139264        }
    140265        else
    141266        {
    142267            RTPrintf(TESTCASE ": RTThreadCreate(&Thread0,,,,) failed, rc=%Vrc\n", rc);
    143             cErrors++;
     268            g_cErrors++;
    144269        }
    145270        uint64_t u64ElapsedTS = RTTimeNanoTS() - u64StartTS;
     
    150275         */
    151276        STAMR3Print(pVM, "/VM/Req/*");
     277
     278        /*
     279         * Testing va_list fun.
     280         */
     281        RTPrintf(TESTCASE ": va_list argument test...\n");
     282        PassVA(pVM, "hello %s", "world");
     283        VMR3AtRuntimeErrorRegister(pVM, MyAtRuntimeError, (void *)"user argument");
     284        VMSetRuntimeError(pVM, false, "enum", "some %s string", "error");
    152285
    153286        /*
     
    158291        {
    159292            RTPrintf(TESTCASE ": error: failed to destroy vm! rc=%Vrc\n", rc);
    160             cErrors++;
     293            g_cErrors++;
    161294        }
    162295    }
     
    164297    {
    165298        RTPrintf(TESTCASE ": fatal error: failed to create vm! rc=%Vrc\n", rc);
    166         cErrors++;
     299        g_cErrors++;
    167300    }
    168301
     
    170303     * Summary and return.
    171304     */
    172     if (!cErrors)
     305    if (!g_cErrors)
    173306        RTPrintf(TESTCASE ": SUCCESS\n");
    174307    else
    175         RTPrintf(TESTCASE ": FAILURE - %d errors\n", cErrors);
    176 
    177     return !!cErrors;
    178 }
     308        RTPrintf(TESTCASE ": FAILURE - %d errors\n", g_cErrors);
     309
     310    return !!g_cErrors;
     311}
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