VirtualBox

Changeset 13791 in vbox for trunk


Ignore:
Timestamp:
Nov 4, 2008 4:12:57 PM (16 years ago)
Author:
vboxsync
Message:

Moving data around

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/hwaccm.h

    r13778 r13791  
    7070
    7171#ifndef IN_GC
    72 VMMDECL(int)    HWACCMFlushTLB(PVM pVM);
    73 VMMDECL(int)    HWACCMInvalidatePhysPage(PVM pVM, RTGCPHYS GCPhys);
    74 VMMDECL(bool)   HWACCMIsNestedPagingActive(PVM pVM);
     72VMMDECL(int)     HWACCMFlushTLB(PVM pVM);
     73VMMDECL(int)     HWACCMInvalidatePhysPage(PVM pVM, RTGCPHYS GCPhys);
     74VMMDECL(bool)    HWACCMIsNestedPagingActive(PVM pVM);
    7575VMMDECL(PGMMODE) HWACCMGetPagingMode(PVM pVM);
     76VMMDECL(RTCPUID) HWACCMGetVMCPUId(PVM pVM);
    7677#else
    7778/* Nop in GC */
  • trunk/include/VBox/vm.h

    r13786 r13791  
    365365#else
    366366/** @todo need to rework this macro for the case of multiple emulation threads for SMP */
    367 # define VM_IS_EMT(pVM)                     ((pVM)->NativeThreadEMT == RTThreadNativeSelf())
     367# define VM_IS_EMT(pVM)                     (VMR3GetVMCPUNativeThread(pVM) == RTThreadNativeSelf())
    368368#endif
    369369
     
    378378# define VM_ASSERT_EMT(pVM) \
    379379    AssertMsg(VM_IS_EMT(pVM), \
    380         ("Not emulation thread! Thread=%RTnthrd ThreadEMT=%RTnthrd\n", RTThreadNativeSelf(), pVM->NativeThreadEMT))
     380        ("Not emulation thread! Thread=%RTnthrd ThreadEMT=%RTnthrd\n", RTThreadNativeSelf(), VMR3GetVMCPUNativeThread(pVM)))
    381381#endif
    382382
     
    391391# define VM_ASSERT_EMT_RETURN(pVM, rc) \
    392392    AssertMsgReturn(VM_IS_EMT(pVM), \
    393         ("Not emulation thread! Thread=%RTnthrd ThreadEMT=%RTnthrd\n", RTThreadNativeSelf(), pVM->NativeThreadEMT), \
     393        ("Not emulation thread! Thread=%RTnthrd ThreadEMT=%RTnthrd\n", RTThreadNativeSelf(), VMR3GetVMCPUNativeThread(pVM)), \
    394394        (rc))
     395#endif
     396
     397
     398/** @def VM_GET_VMCPUID
     399 * Returns the VMCPU id of the current EMT thread.
     400 */
     401#ifdef IN_GC
     402# define VM_GET_VMCPUID(pVM)                       0
     403#elif defined(IN_RING0)
     404# define VM_GET_VMCPUID(pVM)                       HWACCMGetVMCPUId(pVM)
     405#else
     406# define VM_GET_VMCPUID(pVM)                       VMR3GetVMCPUId(pVM)
    395407#endif
    396408
     
    517529    /** The native handle of ThreadEMT. Getting the native handle
    518530     * is generally faster than getting the IPRT one (except on OS/2 :-). */
    519     RTNATIVETHREAD      NativeThreadEMT;
     531    RTNATIVETHREAD      uPadding2;
    520532    /** @} */
    521533
  • trunk/include/VBox/vm.mac

    r13784 r13791  
    6767
    6868    .uPadding1          RTHCPTR_RES 1
    69     .NativeThreadEMT    RTHCPTR_RES 1
     69    .uPadding2          RTHCPTR_RES 1
    7070
    7171    .fRawR3Enabled      resb 1
  • trunk/include/VBox/vmapi.h

    r13782 r13791  
    432432VMMR3DECL(int)  VMR3WaitHalted(PVM pVM, bool fIgnoreInterrupts);
    433433VMMR3DECL(int)  VMR3WaitU(PUVM pUVM);
     434VMMR3DECL(RTCPUID)          VMR3GetVMCPUId(PVM pVM);
     435VMMR3DECL(RTTHREAD)         VMR3GetVMCPUThread(PVM pVM);
     436VMMR3DECL(RTTHREAD)         VMR3GetVMCPUThreadU(PUVM pUVM);
     437VMMR3DECL(RTNATIVETHREAD)   VMR3GetVMCPUNativeThread(PVM pVM);
     438VMMR3DECL(RTNATIVETHREAD)   VMR3GetVMCPUNativeThreadU(PUVM pUVM);
    434439
    435440/** @} */
  • trunk/src/VBox/VMM/VM.cpp

    r13789 r13791  
    426426                    for (unsigned i=0;i<cCPUs;i++)
    427427                    {
    428                         rc = RTThreadCreate(&pUVM->vm.s.ThreadEMT, vmR3EmulationThread, &pUVM->aCpu[i], _1M,
     428                        rc = RTThreadCreate(&pUVM->aCpu[i].vm.s.ThreadEMT, vmR3EmulationThread, &pUVM->aCpu[i], _1M,
    429429                                            RTTHREADTYPE_EMULATION, RTTHREADFLAGS_WAITABLE, "EMT");
    430430                        if (RT_FAILURE(rc))
    431431                            break;
     432
     433                        pUVM->aCpu[i].vm.s.NativeThreadEMT = RTThreadGetNative(pUVM->aCpu[i].vm.s.ThreadEMT);
    432434                    }
    433435
     
    501503         */
    502504        pVM->pUVM = pUVM;
    503         pVM->NativeThreadEMT = pUVM->aCpu[0].vm.s.NativeThreadEMT;
    504505        pVM->offVMCPU = RT_OFFSETOF(VM, aCpu);
    505506
     
    552553                    LogFlow(("Ring-3 init succeeded\n"));
    553554
    554                     /* Initialize the VM CPU components. */
     555                    /* Initialize the VMCPU components. */
    555556                    rc = vmR3InitVMCpu(pVM);
    556557                    if (VBOX_SUCCESS(rc))
     
    15871588         */
    15881589        Assert(pUVM->vm.s.fTerminateEMT);
    1589         rc = RTThreadWait(pUVM->vm.s.ThreadEMT, 30000, NULL);
     1590        /** @todo SMP */
     1591        rc = RTThreadWait(pUVM->aCpu[0].vm.s.ThreadEMT, 30000, NULL);
    15901592        AssertMsgRC(rc, ("EMT thread wait failed, rc=%Rrc\n", rc));
    15911593
     
    17411743        RTSemEventSignal(pUVM->vm.s.EventSemWait);
    17421744
    1743         int rc2 = RTThreadWait(pUVM->vm.s.ThreadEMT, 2000, NULL);
     1745        /** @todo SMP */
     1746        int rc2 = RTThreadWait(pUVM->aCpu[0].vm.s.ThreadEMT, 2000, NULL);
    17441747        AssertRC(rc2);
    17451748    }
     
    31633166}
    31643167
     3168/**
     3169 * Returns the VMCPU id of the current EMT thread.
     3170 *
     3171 * @param   pVM             The VM handle.
     3172 * @thread  EMT
     3173 */
     3174VMMR3DECL(RTCPUID) VMR3GetVMCPUId(PVM pVM)
     3175{
     3176    PUVMCPU pUVMCPU = (PUVMCPU)RTTlsGet(pVM->pUVM->vm.s.idxTLS);
     3177
     3178    AssertMsg(pUVMCPU, ("RTTlsGet %d failed!\n", pVM->pUVM->vm.s.idxTLS));
     3179    return pUVMCPU->idCPU;
     3180}
     3181
     3182/**
     3183 * Returns the native handle of the current EMT VMCPU thread.
     3184 *
     3185 * @returns Handle if this is an EMT thread; NIL_RTNATIVETHREAD otherwise
     3186 * @param   pVM             The VM handle.
     3187 * @thread  EMT
     3188 */
     3189VMMR3DECL(RTNATIVETHREAD) VMR3GetVMCPUNativeThread(PVM pVM)
     3190{
     3191    PUVMCPU pUVMCPU = (PUVMCPU)RTTlsGet(pVM->pUVM->vm.s.idxTLS);
     3192
     3193    if (!pUVMCPU)
     3194        return NIL_RTNATIVETHREAD;
     3195
     3196    return pUVMCPU->vm.s.NativeThreadEMT;
     3197}
     3198
     3199/**
     3200 * Returns the native handle of the current EMT VMCPU thread.
     3201 *
     3202 * @returns Handle if this is an EMT thread; NIL_RTNATIVETHREAD otherwise
     3203 * @param   pVM             The VM handle.
     3204 * @thread  EMT
     3205 */
     3206VMMR3DECL(RTNATIVETHREAD) VMR3GetVMCPUNativeThreadU(PUVM pUVM)
     3207{
     3208    PUVMCPU pUVMCPU = (PUVMCPU)RTTlsGet(pUVM->vm.s.idxTLS);
     3209
     3210    if (!pUVMCPU)
     3211        return NIL_RTNATIVETHREAD;
     3212
     3213    return pUVMCPU->vm.s.NativeThreadEMT;
     3214}
     3215
     3216/**
     3217 * Returns the handle of the current EMT VMCPU thread.
     3218 *
     3219 * @returns Handle if this is an EMT thread; NIL_RTNATIVETHREAD otherwise
     3220 * @param   pVM             The VM handle.
     3221 * @thread  EMT
     3222 */
     3223VMMR3DECL(RTTHREAD) VMR3GetVMCPUThread(PVM pVM)
     3224{
     3225    PUVMCPU pUVMCPU = (PUVMCPU)RTTlsGet(pVM->pUVM->vm.s.idxTLS);
     3226
     3227    if (!pUVMCPU)
     3228        return NIL_RTTHREAD;
     3229
     3230    return pUVMCPU->vm.s.ThreadEMT;
     3231}
     3232
     3233/**
     3234 * Returns the handle of the current EMT VMCPU thread.
     3235 *
     3236 * @returns Handle if this is an EMT thread; NIL_RTNATIVETHREAD otherwise
     3237 * @param   pVM             The VM handle.
     3238 * @thread  EMT
     3239 */
     3240VMMR3DECL(RTTHREAD) VMR3GetVMCPUThreadU(PUVM pUVM)
     3241{
     3242    PUVMCPU pUVMCPU = (PUVMCPU)RTTlsGet(pUVM->vm.s.idxTLS);
     3243
     3244    if (!pUVMCPU)
     3245        return NIL_RTTHREAD;
     3246
     3247    return pUVMCPU->vm.s.ThreadEMT;
     3248}
  • trunk/src/VBox/VMM/VMEmt.cpp

    r13785 r13791  
    6666
    6767    /*
    68      * Init the native thread member.
    69      */
    70     pUVM->vm.s.NativeThreadEMT    = RTThreadGetNative(ThreadSelf);  /* @todo should go away */
    71     pUVMCPU->vm.s.NativeThreadEMT = RTThreadGetNative(ThreadSelf);
    72 
    73     /*
    7468     * The request loop.
    7569     */
     
    215209        vmR3DestroyFinalBitFromEMT(pUVM);
    216210
    217         pUVM->vm.s.NativeThreadEMT = NIL_RTNATIVETHREAD;
     211        pUVMCPU->vm.s.NativeThreadEMT = NIL_RTNATIVETHREAD;
    218212    }
    219213    Log(("vmR3EmulationThread: EMT is terminated.\n"));
  • trunk/src/VBox/VMM/VMInternal.h

    r13782 r13791  
    262262    PSUPDRVSESSION                  pSession;
    263263
    264     /** The handle to the EMT thread. */
    265     RTTHREAD                        ThreadEMT;
    266     /** The native of the EMT thread. */
    267     RTNATIVETHREAD                  NativeThreadEMT;
    268264    /** Wait event semaphore. */
    269265    RTSEMEVENT                      EventSemWait;
  • trunk/src/VBox/VMM/VMMAll/HWACCMAll.cpp

    r13025 r13791  
    142142}
    143143
     144#ifndef IN_GC
     145/**
     146 * Returns the VMCPU id of the current EMT thread.
     147 *
     148 * @param   pVM         The VM to operate on.
     149 */
     150VMMDECL(RTCPUID) HWACCMGetVMCPUId(PVM pVM)
     151{
     152    /* @todo */
     153    Assert(pVM->cCPUs == 1);
     154    return 0;
     155}
     156#endif
  • trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp

    r12989 r13791  
    3030#include <VBox/vm.h>
    3131#include <VBox/err.h>
     32#include <VBox/hwaccm.h>
    3233
    3334#include <VBox/log.h>
     
    6768    Assert(pVM);
    6869
    69     /*
    70      * Try take the lock.
     70    RTCPUID idCPU = VM_GET_VMCPUID(pVM);
     71
     72    /*
     73     * Try to take the lock.
    7174     */
    7275    if (ASMAtomicCmpXchgS32(&pCritSect->s.Core.cLockers, 0, -1))
    7376    {
    7477        pCritSect->s.Core.cNestings = 1;
    75         ASMAtomicXchgSize(&pCritSect->s.Core.NativeThreadOwner, pVM->NativeThreadEMT);
     78        Assert(pVM->aCpu[idCPU].hNativeThread);
     79        ASMAtomicXchgSize(&pCritSect->s.Core.NativeThreadOwner, pVM->aCpu[idCPU].hNativeThread);
    7680        STAM_PROFILE_ADV_START(&pCritSect->s.StatLocked, l);
    7781        return VINF_SUCCESS;
     
    8185     * Nested?
    8286     */
    83     if (pCritSect->s.Core.NativeThreadOwner == pVM->NativeThreadEMT)
     87    if (pCritSect->s.Core.NativeThreadOwner == pVM->aCpu[idCPU].hNativeThread)
    8488    {
    8589        pCritSect->s.Core.cNestings++;
     
    159163    PVM pVM = pCritSect->s.CTX_SUFF(pVM);
    160164    Assert(pVM);
    161     Assert(pCritSect->s.Core.NativeThreadOwner == pVM->NativeThreadEMT);
     165    AssertMsg(pCritSect->s.Core.NativeThreadOwner == pVM->aCpu[VM_GET_VMCPUID(pVM)].hNativeThread, ("Owner %RX64 emt=%RX64\n", pCritSect->s.Core.NativeThreadOwner, pVM->aCpu[VM_GET_VMCPUID(pVM)].hNativeThread));
    162166
    163167    /*
     
    183187
    184188        /* darn, someone raced in on us. */
    185         ASMAtomicXchgSize(&pCritSect->s.Core.NativeThreadOwner, pVM->NativeThreadEMT);
     189        Assert(pVM->aCpu[VM_GET_VMCPUID(pVM)].hNativeThread);
     190        ASMAtomicXchgSize(&pCritSect->s.Core.NativeThreadOwner, pVM->aCpu[VM_GET_VMCPUID(pVM)].hNativeThread);
    186191        STAM_PROFILE_ADV_START(&pCritSect->s.StatLocked, l);
    187192    }
     
    217222    PVM pVM = pCritSect->s.CTX_SUFF(pVM);
    218223    Assert(pVM);
    219     return pCritSect->s.Core.NativeThreadOwner == pVM->NativeThreadEMT;
     224    return pCritSect->s.Core.NativeThreadOwner == pVM->aCpu[VM_GET_VMCPUID(pVM)].hNativeThread;
    220225#endif
    221226}
  • trunk/src/recompiler/VBoxREMWrapper.cpp

    r13755 r13791  
    906906};
    907907
    908 
    909908/* IPRT args */
    910909static const REMPARMDESC g_aArgsAssertMsg1[] =
     
    11431142    { "VMR3ReqCall",                            (void *)(uintptr_t)&VMR3ReqCall,                    &g_aArgsVMR3ReqCall[0],                     RT_ELEMENTS(g_aArgsVMR3ReqCall),                       REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    11441143    { "VMR3ReqFree",                            (void *)(uintptr_t)&VMR3ReqFree,                    &g_aArgsVMR3ReqFree[0],                     RT_ELEMENTS(g_aArgsVMR3ReqFree),                       REMFNDESC_FLAGS_RET_INT | REMFNDESC_FLAGS_ELLIPSIS, sizeof(int), NULL },
     1144    { "VMR3GetVMCPUId",                         (void *)(uintptr_t)&VMR3GetVMCPUId,                 &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
     1145    { "VMR3GetVMCPUNativeThread",               (void *)(uintptr_t)&VMR3GetVMCPUNativeThread,       &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(void *),     NULL },
    11451146//    { "",                        (void *)(uintptr_t)&,                &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(int),   NULL },
    11461147};
  • trunk/src/recompiler_new/VBoxREMWrapper.cpp

    r13755 r13791  
    337337static DECLCALLBACKPTR(int, pfnREMR3EmulateInstruction)(PVM);
    338338static DECLCALLBACKPTR(int, pfnREMR3Run)(PVM);
    339 static DECLCALLBACKPTR(int, pfnREMR3State)(PVM, bool fFlushTBs);
     339static DECLCALLBACKPTR(int, pfnREMR3State)(PVM);
    340340static DECLCALLBACKPTR(int, pfnREMR3StateBack)(PVM);
    341341static DECLCALLBACKPTR(void, pfnREMR3StateUpdate)(PVM);
     
    495495static const REMPARMDESC g_aArgsCPUMQueryGuestCtxPtr[] =
    496496{
    497     { REMPARMDESC_FLAGS_INT,        sizeof(PVM), NULL },
    498     { REMPARMDESC_FLAGS_INT,        sizeof(PCPUMCTX *), NULL }
     497    { REMPARMDESC_FLAGS_INT,        sizeof(PVM), NULL }
    499498};
    500499static const REMPARMDESC g_aArgsCSAMR3MonitorPage[] =
     
    907906};
    908907
    909 
    910908/* IPRT args */
    911909static const REMPARMDESC g_aArgsAssertMsg1[] =
     
    989987    { REMPARMDESC_FLAGS_INT,        sizeof(int), NULL },
    990988    { REMPARMDESC_FLAGS_INT,        sizeof(size_t), NULL }
    991 };
    992 static const REMPARMDESC g_aArgsState[] =
    993 {
    994     { REMPARMDESC_FLAGS_INT,        sizeof(PVM), NULL },
    995     { REMPARMDESC_FLAGS_INT,        sizeof(bool), NULL }
    996989};
    997990
     
    10111004    { "REMR3EmulateInstruction",                (void *)&pfnREMR3EmulateInstruction,                &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(int),    NULL },
    10121005    { "REMR3Run",                               (void *)&pfnREMR3Run,                               &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(int),    NULL },
    1013     { "REMR3State",                             (void *)&pfnREMR3State,                             &g_aArgsState[0],                           RT_ELEMENTS(g_aArgsState),                             REMFNDESC_FLAGS_RET_INT,    sizeof(int),    NULL },
     1006    { "REMR3State",                             (void *)&pfnREMR3State,                             &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(int),    NULL },
    10141007    { "REMR3StateBack",                         (void *)&pfnREMR3StateBack,                         &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(int),    NULL },
    10151008    { "REMR3StateUpdate",                       (void *)&pfnREMR3StateUpdate,                       &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   0,              NULL },
     
    10591052    { "CPUMGetGuestCS",                         (void *)(uintptr_t)&CPUMGetGuestCS,                 &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(RTSEL),      NULL },
    10601053    { "CPUMGetGuestSS",                         (void *)(uintptr_t)&CPUMGetGuestSS,                 &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(RTSEL),      NULL },
    1061     { "CPUMQueryGuestCtxPtr",                   (void *)(uintptr_t)&CPUMQueryGuestCtxPtr,           &g_aArgsCPUMQueryGuestCtxPtr[0],            RT_ELEMENTS(g_aArgsCPUMQueryGuestCtxPtr),              REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
     1054    { "CPUMQueryGuestCtxPtr",                   (void *)(uintptr_t)&CPUMQueryGuestCtxPtr,           &g_aArgsCPUMQueryGuestCtxPtr[0],            RT_ELEMENTS(g_aArgsCPUMQueryGuestCtxPtr),              REMFNDESC_FLAGS_RET_INT,    sizeof(PCPUMCTX),   NULL },
    10621055    { "CSAMR3MonitorPage",                      (void *)(uintptr_t)&CSAMR3MonitorPage,              &g_aArgsCSAMR3MonitorPage[0],               RT_ELEMENTS(g_aArgsCSAMR3MonitorPage),                 REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    10631056    { "CSAMR3UnmonitorPage",                    (void *)(uintptr_t)&CSAMR3UnmonitorPage,            &g_aArgsCSAMR3UnmonitorPage[0],             RT_ELEMENTS(g_aArgsCSAMR3UnmonitorPage),               REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
     
    11491142    { "VMR3ReqCall",                            (void *)(uintptr_t)&VMR3ReqCall,                    &g_aArgsVMR3ReqCall[0],                     RT_ELEMENTS(g_aArgsVMR3ReqCall),                       REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    11501143    { "VMR3ReqFree",                            (void *)(uintptr_t)&VMR3ReqFree,                    &g_aArgsVMR3ReqFree[0],                     RT_ELEMENTS(g_aArgsVMR3ReqFree),                       REMFNDESC_FLAGS_RET_INT | REMFNDESC_FLAGS_ELLIPSIS, sizeof(int), NULL },
     1144    { "VMR3GetVMCPUId",                         (void *)(uintptr_t)&VMR3GetVMCPUId,                 &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
     1145    { "VMR3GetVMCPUNativeThread",               (void *)(uintptr_t)&VMR3GetVMCPUNativeThread,       &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(void *),     NULL },
    11511146//    { "",                        (void *)(uintptr_t)&,                &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_INT,    sizeof(int),   NULL },
    11521147};
     
    19931988}
    19941989
    1995 REMR3DECL(int) REMR3State(PVM pVM, bool fFlushTBs)
     1990REMR3DECL(int) REMR3State(PVM pVM)
    19961991{
    19971992#ifdef USE_REM_STUBS
     
    19991994#else
    20001995    Assert(VALID_PTR(pfnREMR3State));
    2001     return pfnREMR3State(pVM, fFlushTBs);
     1996    return pfnREMR3State(pVM);
    20021997#endif
    20031998}
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