VirtualBox

Changeset 83296 in vbox for trunk/src/VBox/Devices/testcase


Ignore:
Timestamp:
Mar 16, 2020 11:43:32 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
136463
Message:

Devices/tstDevice: Copy over and modify PDMThread* API so we can fuzz saved states of device s which delegate some parts of the saved state loading to workers

Location:
trunk/src/VBox/Devices/testcase
Files:
3 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/testcase/tstDeviceInternal.h

    r83261 r83296  
    141141
    142142
     143/**
     144 * The usual device/driver/internal/external stuff.
     145 */
     146typedef enum
     147{
     148    /** The usual invalid entry. */
     149    PDMTHREADTYPE_INVALID = 0,
     150    /** Device type. */
     151    PDMTHREADTYPE_DEVICE,
     152    /** USB Device type. */
     153    PDMTHREADTYPE_USB,
     154    /** Driver type. */
     155    PDMTHREADTYPE_DRIVER,
     156    /** Internal type. */
     157    PDMTHREADTYPE_INTERNAL,
     158    /** External type. */
     159    PDMTHREADTYPE_EXTERNAL,
     160    /** The usual 32-bit hack. */
     161    PDMTHREADTYPE_32BIT_HACK = 0x7fffffff
     162} PDMTHREADTYPE;
     163
     164
     165/**
     166 * The internal structure for the thread.
     167 */
     168typedef struct PDMTHREADINT
     169{
     170    /** Node for the list of threads. */
     171    RTLISTNODE                      NdPdmThrds;
     172    /** Pointer to the device under test the allocation was made for. */
     173    PTSTDEVDUTINT                   pDut;
     174    /** The event semaphore the thread blocks on when not running. */
     175    RTSEMEVENTMULTI                 BlockEvent;
     176    /** The event semaphore the thread sleeps on while running. */
     177    RTSEMEVENTMULTI                 SleepEvent;
     178    /** The thread type. */
     179    PDMTHREADTYPE                   enmType;
     180} PDMTHREADINT;
     181
     182
     183#define PDMTHREADINT_DECLARED
    143184#define PDMCRITSECTINT_DECLARED
    144185#define PDMDEVINSINT_DECLARED
     
    148189RT_C_DECLS_END
    149190#include <VBox/vmm/pdmcritsect.h>
     191#include <VBox/vmm/pdmthread.h>
    150192#include <VBox/vmm/pdmdev.h>
    151193#include <VBox/vmm/pdmpci.h>
     
    416458}
    417459
     460DECLHIDDEN(int) tstDevPdmR3ThreadCreateDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDEV pfnThread,
     461                                              PFNPDMTHREADWAKEUPDEV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
     462DECLHIDDEN(int) tstDevPdmR3ThreadCreateUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADUSB pfnThread,
     463                                           PFNPDMTHREADWAKEUPUSB pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
     464DECLHIDDEN(int) tstDevPdmR3ThreadCreateDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread,
     465                                              PFNPDMTHREADWAKEUPDRV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
     466DECLHIDDEN(int) tstDevPdmR3ThreadCreate(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADINT pfnThread,
     467                                        PFNPDMTHREADWAKEUPINT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
     468DECLHIDDEN(int) tstDevPdmR3ThreadCreateExternal(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADEXT pfnThread,
     469                                                PFNPDMTHREADWAKEUPEXT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
     470DECLHIDDEN(int) tstDevPdmR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread);
     471DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns);
     472DECLHIDDEN(int) tstDevPdmR3ThreadDestroyUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns);
     473DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns);
     474DECLHIDDEN(void) tstDevPdmR3ThreadDestroyAll(PTSTDEVDUTINT pDut);
     475DECLHIDDEN(int) tstDevPdmR3ThreadIAmSuspending(PPDMTHREAD pThread);
     476DECLHIDDEN(int) tstDevPdmR3ThreadIAmRunning(PPDMTHREAD pThread);
     477DECLHIDDEN(int) tstDevPdmR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies);
     478DECLHIDDEN(int) tstDevPdmR3ThreadSuspend(PPDMTHREAD pThread);
     479DECLHIDDEN(int) tstDevPdmR3ThreadResume(PPDMTHREAD pThread);
     480
     481
    418482RT_C_DECLS_END
    419483
  • trunk/src/VBox/Devices/testcase/tstDevicePdmDevHlp.cpp

    r83281 r83296  
    27072707             pszDesc, pszDesc, phType));
    27082708
    2709     int rc = VERR_NOT_IMPLEMENTED;
    2710     AssertFailed();
     2709#ifndef VBOX_TSTDEV_NOT_IMPLEMENTED_STUBS_FAKE_SUCCESS
     2710    int rc = VERR_NOT_IMPLEMENTED;
     2711    AssertFailed();
     2712#else
     2713    int rc = VINF_SUCCESS;
     2714#endif
    27112715
    27122716    LogRel(("pdmR3DevHlp_PGMHandlerPhysicalTypeRegister: caller='%s'/%d: returns %Rrc\n",
     
    42104214             pDevIns->pReg->szName, pDevIns->iInstance, ppThread, pvUser, pfnThread, pfnWakeup, cbStack, enmType, pszName, pszName));
    42114215
    4212     RT_NOREF(ppThread, pvUser, pfnThread, pfnWakeup, cbStack, enmType, pszName);
    4213 
    4214 #ifndef VBOX_TSTDEV_NOT_IMPLEMENTED_STUBS_FAKE_SUCCESS
    4215     int rc = VERR_NOT_IMPLEMENTED;
    4216     AssertFailed();
    4217 #else
    4218     int rc = VINF_SUCCESS;
    4219 #endif
     4216    int rc = tstDevPdmR3ThreadCreateDevice(pDevIns->Internal.s.pDut, pDevIns, ppThread, pvUser, pfnThread, pfnWakeup, cbStack, enmType, pszName);
    42204217
    42214218    LogFlow(("pdmR3DevHlp_ThreadCreate: caller='%s'/%d: returns %Rrc *ppThread=%RTthrd\n", pDevIns->pReg->szName, pDevIns->iInstance,
     
    42274224static DECLCALLBACK(int) pdmR3DevHlp_ThreadDestroy(PPDMTHREAD pThread, int *pRcThread)
    42284225{
    4229     RT_NOREF(pThread, pRcThread);
    4230     int rc = VERR_NOT_IMPLEMENTED;
    4231     AssertFailed();
    4232     return rc;
     4226    return tstDevPdmR3ThreadDestroy(pThread, pRcThread);
    42334227}
    42344228
     
    42364230static DECLCALLBACK(int) pdmR3DevHlp_ThreadIAmSuspending(PPDMTHREAD pThread)
    42374231{
    4238     RT_NOREF(pThread);
    4239     int rc = VERR_NOT_IMPLEMENTED;
    4240     AssertFailed();
    4241     return rc;
     4232    return tstDevPdmR3ThreadIAmSuspending(pThread);
    42424233}
    42434234
     
    42454236static DECLCALLBACK(int) pdmR3DevHlp_ThreadIamRunning(PPDMTHREAD pThread)
    42464237{
    4247     RT_NOREF(pThread);
    4248     int rc = VERR_NOT_IMPLEMENTED;
    4249     AssertFailed();
    4250     return rc;
     4238    return tstDevPdmR3ThreadIAmRunning(pThread);
    42514239}
    42524240
     
    42544242static DECLCALLBACK(int) pdmR3DevHlp_ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies)
    42554243{
    4256     RT_NOREF(pThread, cMillies);
    4257     int rc = VERR_NOT_IMPLEMENTED;
    4258     AssertFailed();
    4259     return rc;
     4244    return tstDevPdmR3ThreadSleep(pThread, cMillies);
    42604245}
    42614246
     
    42634248static DECLCALLBACK(int) pdmR3DevHlp_ThreadSuspend(PPDMTHREAD pThread)
    42644249{
    4265     RT_NOREF(pThread);
    4266     int rc = VERR_NOT_IMPLEMENTED;
    4267     AssertFailed();
    4268     return rc;
     4250    return tstDevPdmR3ThreadSuspend(pThread);
    42694251}
    42704252
     
    42724254static DECLCALLBACK(int) pdmR3DevHlp_ThreadResume(PPDMTHREAD pThread)
    42734255{
    4274     RT_NOREF(pThread);
    4275     int rc = VERR_NOT_IMPLEMENTED;
    4276     AssertFailed();
    4277     return rc;
     4256    return tstDevPdmR3ThreadResume(pThread);
    42784257}
    42794258
  • trunk/src/VBox/Devices/testcase/tstDevicePdmThread.cpp

    r83294 r83296  
    11/* $Id$ */
    22/** @file
    3  * PDM Thread - VM Thread Management.
     3 * PDM Thread - Thread Management (copied from PDMThread).
    44 */
    55
     
    2121*********************************************************************************************************************************/
    2222/// @todo \#define LOG_GROUP LOG_GROUP_PDM_THREAD
    23 #include "PDMInternal.h"
    24 #include <VBox/vmm/pdm.h>
    25 #include <VBox/vmm/mm.h>
    26 #include <VBox/vmm/vm.h>
    27 #include <VBox/vmm/uvm.h>
    2823#include <VBox/err.h>
    29 
    3024#include <VBox/log.h>
     25
    3126#include <iprt/asm.h>
    3227#include <iprt/semaphore.h>
    3328#include <iprt/assert.h>
     29#include <iprt/mem.h>
    3430#include <iprt/thread.h>
     31
     32#include "tstDeviceInternal.h"
    3533
    3634
     
    7876
    7977        case PDMTHREADTYPE_INTERNAL:
    80             rc = pThread->u.Int.pfnWakeUp(pThread->Internal.s.pVM, pThread);
     78            rc = pThread->u.Int.pfnWakeUp(NULL /*pVM*/, pThread);
    8179            break;
    8280
     
    9997 *
    10098 * @returns VBox status code.
    101  * @param   pVM         The cross context VM structure.
     99 * @param   pDut        The device under test.
    102100 * @param   ppThread    Where to store the pointer to the instance.
    103101 */
    104 static int pdmR3ThreadNew(PVM pVM, PPPDMTHREAD ppThread)
    105 {
    106     PPDMTHREAD pThread;
    107     int rc = MMR3HeapAllocZEx(pVM, MM_TAG_PDM_THREAD, sizeof(*pThread), (void **)&pThread);
    108     if (RT_FAILURE(rc))
    109         return rc;
    110 
    111     pThread->u32Version     = PDMTHREAD_VERSION;
    112     pThread->enmState       = PDMTHREADSTATE_INITIALIZING;
    113     pThread->Thread         = NIL_RTTHREAD;
    114     pThread->Internal.s.pVM = pVM;
     102static int pdmR3ThreadNew(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread)
     103{
     104    PPDMTHREAD pThread = (PPDMTHREAD)RTMemAllocZ(sizeof(*pThread));
     105    if (!pThread)
     106        return VERR_NO_MEMORY;
     107
     108    pThread->u32Version      = PDMTHREAD_VERSION;
     109    pThread->enmState        = PDMTHREADSTATE_INITIALIZING;
     110    pThread->Thread          = NIL_RTTHREAD;
     111    pThread->Internal.s.pDut = pDut;
    115112
    116113    *ppThread = pThread;
     
    124121 *
    125122 * @returns VBox status code.
    126  * @param   pVM         The cross context VM structure.
     123 * @param   pDut        The device under test.
    127124 * @param   ppThread    Where the thread instance data handle is.
    128125 * @param   cbStack     The stack size, see RTThreadCreate().
     
    130127 * @param   pszName     The thread name, see RTThreadCreate().
    131128 */
    132 static int pdmR3ThreadInit(PVM pVM, PPPDMTHREAD ppThread, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
     129static int pdmR3ThreadInit(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
    133130{
    134131    PPDMTHREAD  pThread = *ppThread;
    135     PUVM        pUVM    = pVM->pUVM;
    136 
    137     /*
    138      * Initialize the remainder of the structure.
    139      */
    140     pThread->Internal.s.pVM = pVM;
    141132
    142133    int rc = RTSemEventMultiCreate(&pThread->Internal.s.BlockEvent);
     
    163154                     * Insert it into the thread list.
    164155                     */
    165                     RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
    166                     pThread->Internal.s.pNext = NULL;
    167                     if (pUVM->pdm.s.pThreadsTail)
    168                         pUVM->pdm.s.pThreadsTail->Internal.s.pNext = pThread;
    169                     else
    170                         pUVM->pdm.s.pThreads = pThread;
    171                     pUVM->pdm.s.pThreadsTail = pThread;
    172                     RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
     156                    tstDevDutLockExcl(pDut);
     157                    RTListAppend(&pDut->LstPdmThreads, &pThread->Internal.s.NdPdmThrds);
     158                    tstDevDutUnlockExcl(pDut);
    173159
    174160                    rc = RTThreadUserReset(Thread);
     
    186172        pThread->Internal.s.BlockEvent = NIL_RTSEMEVENTMULTI;
    187173    }
    188     MMR3HeapFree(pThread);
     174    RTMemFree(pThread);
    189175    *ppThread = NULL;
    190176
     
    197183 *
    198184 * @returns VBox status code.
    199  * @param   pVM         The cross context VM structure.
     185 * @param   pDut        The device under test.
    200186 * @param   pDevIns     The device instance.
    201187 * @param   ppThread    Where to store the thread 'handle'.
     
    208194 * @param   pszName     See RTThreadCreate.
    209195 */
    210 int pdmR3ThreadCreateDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDEV pfnThread,
    211                             PFNPDMTHREADWAKEUPDEV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
    212 {
    213     int rc = pdmR3ThreadNew(pVM, ppThread);
     196DECLHIDDEN(int) tstDevPdmR3ThreadCreateDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDEV pfnThread,
     197                                              PFNPDMTHREADWAKEUPDEV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
     198{
     199    int rc = pdmR3ThreadNew(pDut, ppThread);
    214200    if (RT_SUCCESS(rc))
    215201    {
     
    220206        pThread->u.Dev.pfnThread = pfnThread;
    221207        pThread->u.Dev.pfnWakeUp = pfnWakeUp;
    222         rc = pdmR3ThreadInit(pVM, ppThread, cbStack, enmType, pszName);
     208        rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName);
    223209    }
    224210    return rc;
     
    230216 *
    231217 * @returns VBox status code.
    232  * @param   pVM         The cross context VM structure.
     218 * @param   pDut        The device under test.
    233219 * @param   pUsbIns     The USB device instance.
    234220 * @param   ppThread    Where to store the thread 'handle'.
     
    241227 * @param   pszName     See RTThreadCreate.
    242228 */
    243 int pdmR3ThreadCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADUSB pfnThread,
    244                          PFNPDMTHREADWAKEUPUSB pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
    245 {
    246     int rc = pdmR3ThreadNew(pVM, ppThread);
     229DECLHIDDEN(int) tstDevPdmR3ThreadCreateUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADUSB pfnThread,
     230                                           PFNPDMTHREADWAKEUPUSB pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
     231{
     232    int rc = pdmR3ThreadNew(pDut, ppThread);
    247233    if (RT_SUCCESS(rc))
    248234    {
     
    253239        pThread->u.Usb.pfnThread = pfnThread;
    254240        pThread->u.Usb.pfnWakeUp = pfnWakeUp;
    255         rc = pdmR3ThreadInit(pVM, ppThread, cbStack, enmType, pszName);
     241        rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName);
    256242    }
    257243    return rc;
     
    263249 *
    264250 * @returns VBox status code.
    265  * @param   pVM         The cross context VM structure.
     251 * @param   pDut        The device under test.
    266252 * @param   pDrvIns     The driver instance.
    267253 * @param   ppThread    Where to store the thread 'handle'.
     
    274260 * @param   pszName     See RTThreadCreate.
    275261 */
    276 int pdmR3ThreadCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread,
    277                             PFNPDMTHREADWAKEUPDRV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
    278 {
    279     int rc = pdmR3ThreadNew(pVM, ppThread);
     262DECLHIDDEN(int) tstDevPdmR3ThreadCreateDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread,
     263                                              PFNPDMTHREADWAKEUPDRV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
     264{
     265    int rc = pdmR3ThreadNew(pDut, ppThread);
    280266    if (RT_SUCCESS(rc))
    281267    {
     
    286272        pThread->u.Drv.pfnThread = pfnThread;
    287273        pThread->u.Drv.pfnWakeUp = pfnWakeUp;
    288         rc = pdmR3ThreadInit(pVM, ppThread, cbStack, enmType, pszName);
     274        rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName);
    289275    }
    290276    return rc;
     
    296282 *
    297283 * @returns VBox status code.
    298  * @param   pVM         The cross context VM structure.
     284 * @param   pDut        The device under test.
    299285 * @param   ppThread    Where to store the thread 'handle'.
    300286 * @param   pvUser      The user argument to the thread function.
     
    306292 * @param   pszName     See RTThreadCreate.
    307293 */
    308 VMMR3DECL(int) PDMR3ThreadCreate(PVM pVM, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADINT pfnThread,
    309                                  PFNPDMTHREADWAKEUPINT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
    310 {
    311     int rc = pdmR3ThreadNew(pVM, ppThread);
     294DECLHIDDEN(int) tstDevPdmR3ThreadCreate(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADINT pfnThread,
     295                                        PFNPDMTHREADWAKEUPINT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
     296{
     297    int rc = pdmR3ThreadNew(pDut, ppThread);
    312298    if (RT_SUCCESS(rc))
    313299    {
     
    317303        pThread->u.Int.pfnThread = pfnThread;
    318304        pThread->u.Int.pfnWakeUp = pfnWakeUp;
    319         rc = pdmR3ThreadInit(pVM, ppThread, cbStack, enmType, pszName);
     305        rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName);
    320306    }
    321307    return rc;
     
    327313 *
    328314 * @returns VBox status code.
    329  * @param   pVM         The cross context VM structure.
     315 * @param   pDut        The device under test.
    330316 * @param   ppThread    Where to store the thread 'handle'.
    331317 * @param   pvUser      The user argument to the thread function.
     
    337323 * @param   pszName     See RTThreadCreate.
    338324 */
    339 VMMR3DECL(int) PDMR3ThreadCreateExternal(PVM pVM, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADEXT pfnThread,
    340                                          PFNPDMTHREADWAKEUPEXT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
    341 {
    342     int rc = pdmR3ThreadNew(pVM, ppThread);
     325DECLHIDDEN(int) tstDevPdmR3ThreadCreateExternal(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADEXT pfnThread,
     326                                                PFNPDMTHREADWAKEUPEXT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
     327{
     328    int rc = pdmR3ThreadNew(pDut, ppThread);
    343329    if (RT_SUCCESS(rc))
    344330    {
     
    348334        pThread->u.Ext.pfnThread = pfnThread;
    349335        pThread->u.Ext.pfnWakeUp = pfnWakeUp;
    350         rc = pdmR3ThreadInit(pVM, ppThread, cbStack, enmType, pszName);
     336        rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName);
    351337    }
    352338    return rc;
     
    366352 * @thread  The emulation thread (EMT).
    367353 */
    368 VMMR3DECL(int) PDMR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread)
     354DECLHIDDEN(int) tstDevPdmR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread)
    369355{
    370356    /*
     
    375361    Assert(pThread->Thread != RTThreadSelf());
    376362    AssertPtrNullReturn(pRcThread, VERR_INVALID_POINTER);
    377     PVM pVM = pThread->Internal.s.pVM;
    378     VM_ASSERT_EMT(pVM);
    379     PUVM pUVM = pVM->pUVM;
     363
     364    PTSTDEVDUTINT pDut = pThread->Internal.s.pDut;
    380365
    381366    /*
     
    431416
    432417        /* unlink */
    433         RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
    434         if (pUVM->pdm.s.pThreads == pThread)
    435         {
    436             pUVM->pdm.s.pThreads = pThread->Internal.s.pNext;
    437             if (!pThread->Internal.s.pNext)
    438                 pUVM->pdm.s.pThreadsTail = NULL;
    439         }
    440         else
    441         {
    442             PPDMTHREAD pPrev = pUVM->pdm.s.pThreads;
    443             while (pPrev && pPrev->Internal.s.pNext != pThread)
    444                 pPrev = pPrev->Internal.s.pNext;
    445             Assert(pPrev);
    446             if (pPrev)
    447                 pPrev->Internal.s.pNext = pThread->Internal.s.pNext;
    448             if (!pThread->Internal.s.pNext)
    449                 pUVM->pdm.s.pThreadsTail = pPrev;
    450         }
    451         pThread->Internal.s.pNext = NULL;
    452         RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
     418        tstDevDutLockExcl(pDut);
     419        RTListNodeRemove(&pThread->Internal.s.NdPdmThrds);
     420        tstDevDutUnlockExcl(pDut);
    453421
    454422        /* free the resources */
     
    459427        pThread->Internal.s.SleepEvent = NIL_RTSEMEVENTMULTI;
    460428
    461         MMR3HeapFree(pThread);
     429        RTMemFree(pThread);
    462430    }
    463431    else if (RT_SUCCESS(rc))
     
    475443 *
    476444 * @returns VBox status code of the first failure.
    477  * @param   pVM         The cross context VM structure.
     445 * @param   pDut        The device under test.
    478446 * @param   pDevIns     the device instance.
    479447 */
    480 int pdmR3ThreadDestroyDevice(PVM pVM, PPDMDEVINS pDevIns)
    481 {
    482     int     rc   = VINF_SUCCESS;
    483     PUVM    pUVM = pVM->pUVM;
     448DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns)
     449{
     450    int rc = VINF_SUCCESS;
    484451
    485452    AssertPtr(pDevIns);
    486453
    487     RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
     454    tstDevDutLockExcl(pDut);
     455#if 0
    488456    PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
    489457    while (pThread)
     
    499467        pThread = pNext;
    500468    }
    501     RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
     469#endif
     470    tstDevDutUnlockExcl(pDut);
    502471    return rc;
    503472}
     
    510479 *
    511480 * @returns VBox status code of the first failure.
    512  * @param   pVM         The cross context VM structure.
     481 * @param   pDut        The device under test.
    513482 * @param   pUsbIns     The USB device instance.
    514483 */
    515 int pdmR3ThreadDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns)
    516 {
    517     int     rc   = VINF_SUCCESS;
    518     PUVM    pUVM = pVM->pUVM;
     484DECLHIDDEN(int) tstDevPdmR3ThreadDestroyUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns)
     485{
     486    int rc = VINF_SUCCESS;
    519487
    520488    AssertPtr(pUsbIns);
    521489
    522     RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
     490    tstDevDutLockExcl(pDut);
     491#if 0
    523492    PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
    524493    while (pThread)
     
    534503        pThread = pNext;
    535504    }
    536     RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
     505#endif
     506    tstDevDutUnlockExcl(pDut);
    537507    return rc;
    538508}
     
    545515 *
    546516 * @returns VBox status code of the first failure.
    547  * @param   pVM         The cross context VM structure.
     517 * @param   pDut        The device under test.
    548518 * @param   pDrvIns     The driver instance.
    549519 */
    550 int pdmR3ThreadDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns)
    551 {
    552     int     rc   = VINF_SUCCESS;
    553     PUVM    pUVM = pVM->pUVM;
     520DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns)
     521{
     522    int rc = VINF_SUCCESS;
    554523
    555524    AssertPtr(pDrvIns);
    556525
    557     RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
     526    tstDevDutLockExcl(pDut);
     527#if 0
    558528    PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
    559529    while (pThread)
     
    569539        pThread = pNext;
    570540    }
    571     RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
     541#endif
     542    tstDevDutUnlockExcl(pDut);
    572543    return rc;
    573544}
     
    577548 * Called For VM power off.
    578549 *
    579  * @param   pVM         The cross context VM structure.
    580  */
    581 void pdmR3ThreadDestroyAll(PVM pVM)
    582 {
    583     PUVM pUVM = pVM->pUVM;
    584     RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
     550 * @param   pDut        The device under test.
     551 */
     552DECLHIDDEN(void) tstDevPdmR3ThreadDestroyAll(PTSTDEVDUTINT pDut)
     553{
     554    tstDevDutLockExcl(pDut);
     555#if 0
    585556    PPDMTHREAD pThread = pUVM->pdm.s.pThreads;
    586557    while (pThread)
     
    592563    }
    593564    Assert(!pUVM->pdm.s.pThreads && !pUVM->pdm.s.pThreadsTail);
    594     RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
     565#endif
     566    tstDevDutUnlockExcl(pDut);
    595567}
    596568
     
    642614 * @param   pThread     The PDM thread.
    643615 */
    644 VMMR3DECL(int) PDMR3ThreadIAmSuspending(PPDMTHREAD pThread)
     616DECLHIDDEN(int) tstDevPdmR3ThreadIAmSuspending(PPDMTHREAD pThread)
    645617{
    646618    /*
     
    690662 * @param   pThread     The PDM thread.
    691663 */
    692 VMMR3DECL(int) PDMR3ThreadIAmRunning(PPDMTHREAD pThread)
     664DECLHIDDEN(int) tstDevPdmR3ThreadIAmRunning(PPDMTHREAD pThread)
    693665{
    694666    /*
     
    728700 * @param   cMillies    The number of milliseconds to sleep.
    729701 */
    730 VMMR3DECL(int) PDMR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies)
     702DECLHIDDEN(int) tstDevPdmR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies)
    731703{
    732704    /*
     
    759731    Log(("PDMThread: Initializing thread %RTthrd / %p / '%s'...\n", Thread, pThread, RTThreadGetName(Thread)));
    760732    pThread->Thread = Thread;
    761 
    762     PUVM pUVM = pThread->Internal.s.pVM->pUVM;
    763     if (   pUVM->pVmm2UserMethods
    764         && pUVM->pVmm2UserMethods->pfnNotifyPdmtInit)
    765         pUVM->pVmm2UserMethods->pfnNotifyPdmtInit(pUVM->pVmm2UserMethods, pUVM);
    766733
    767734    /*
     
    790757
    791758            case PDMTHREADTYPE_INTERNAL:
    792                 rc = pThread->u.Int.pfnThread(pThread->Internal.s.pVM, pThread);
     759                rc = pThread->u.Int.pfnThread(NULL /*pVM*/, pThread);
    793760                break;
    794761
     
    815782            break;
    816783        }
    817         rc = PDMR3ThreadIAmSuspending(pThread);
     784        rc = tstDevPdmR3ThreadIAmSuspending(pThread);
    818785        if (RT_FAILURE(rc))
    819786            break;
     
    824791        }
    825792
    826         rc = PDMR3ThreadIAmRunning(pThread);
     793        rc = tstDevPdmR3ThreadIAmRunning(pThread);
    827794        if (RT_FAILURE(rc))
    828795            break;
     
    846813    int rc2 = RTThreadUserSignal(Thread); AssertRC(rc2);
    847814
    848     if (   pUVM->pVmm2UserMethods
    849         && pUVM->pVmm2UserMethods->pfnNotifyPdmtTerm)
    850         pUVM->pVmm2UserMethods->pfnNotifyPdmtTerm(pUVM->pVmm2UserMethods, pUVM);
    851815    Log(("PDMThread: Terminating thread %RTthrd / %p / '%s': %Rrc\n", Thread, pThread, RTThreadGetName(Thread), rc));
    852816    return rc;
     
    911875 * @param   pThread     The PDM thread.
    912876 */
    913 VMMR3DECL(int) PDMR3ThreadSuspend(PPDMTHREAD pThread)
     877DECLHIDDEN(int) tstDevPdmR3ThreadSuspend(PPDMTHREAD pThread)
    914878{
    915879    /*
     
    967931
    968932/**
    969  * Suspend all running threads.
    970  *
    971  * This is called by PDMR3Suspend() and PDMR3PowerOff() after all the devices
    972  * and drivers have been notified about the suspend / power off.
    973  *
    974  * @return VBox status code.
    975  * @param   pVM         The cross context VM structure.
    976  */
    977 int pdmR3ThreadSuspendAll(PVM pVM)
    978 {
    979     PUVM pUVM = pVM->pUVM;
    980     RTCritSectEnter(&pUVM->pdm.s.ListCritSect); /* This may cause deadlocks later... */
    981     for (PPDMTHREAD pThread = pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)
    982         switch (pThread->enmState)
    983         {
    984             case PDMTHREADSTATE_RUNNING:
    985             {
    986                 int rc = PDMR3ThreadSuspend(pThread);
    987                 AssertLogRelMsgReturnStmt(RT_SUCCESS(rc),
    988                                           ("PDMR3ThreadSuspend -> %Rrc for '%s'\n", rc, RTThreadGetName(pThread->Thread)),
    989                                           RTCritSectLeave(&pUVM->pdm.s.ListCritSect),
    990                                           rc);
    991                 break;
    992             }
    993 
    994             /* suspend -> power off; voluntary suspend. */
    995             case PDMTHREADSTATE_SUSPENDED:
    996                 break;
    997 
    998             default:
    999                 AssertMsgFailed(("pThread=%p enmState=%d\n", pThread, pThread->enmState));
    1000                 break;
    1001         }
    1002     RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    1003     return VINF_SUCCESS;
    1004 }
    1005 
    1006 
    1007 /**
    1008933 * Resumes the thread.
    1009934 *
     
    1018943 * @param   pThread     The PDM thread.
    1019944 */
    1020 VMMR3DECL(int) PDMR3ThreadResume(PPDMTHREAD pThread)
     945DECLHIDDEN(int) tstDevPdmR3ThreadResume(PPDMTHREAD pThread)
    1021946{
    1022947    /*
     
    1060985}
    1061986
    1062 
    1063 /**
    1064  * Resumes all threads not running.
    1065  *
    1066  * This is called by PDMR3Resume() and PDMR3PowerOn() after all the devices
    1067  * and drivers have been notified about the resume / power on .
    1068  *
    1069  * @return VBox status code.
    1070  * @param   pVM         The cross context VM structure.
    1071  */
    1072 int pdmR3ThreadResumeAll(PVM pVM)
    1073 {
    1074     PUVM pUVM = pVM->pUVM;
    1075     RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
    1076     for (PPDMTHREAD pThread = pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)
    1077         switch (pThread->enmState)
    1078         {
    1079             case PDMTHREADSTATE_SUSPENDED:
    1080             {
    1081                 int rc = PDMR3ThreadResume(pThread);
    1082                 AssertRCReturn(rc, rc);
    1083                 break;
    1084             }
    1085 
    1086             default:
    1087                 AssertMsgFailed(("pThread=%p enmState=%d\n", pThread, pThread->enmState));
    1088                 break;
    1089         }
    1090     RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
    1091     return VINF_SUCCESS;
    1092 }
    1093 
  • trunk/src/VBox/Devices/testcase/tstDeviceSsmFuzz.cpp

    r83261 r83296  
    104104    if (RT_SUCCESS(rc))
    105105    {
    106         rc = RTFuzzCtxCorpusInputAddFromDirPath(hFuzzCtx, tstDevSsmFuzzGetCfgString(paCfg, cCfgItems, "CorpusPath"));
     106        uint64_t cbMutateRange = tstDevSsmFuzzGetCfgU64(paCfg, cCfgItems, "OffMutateSize");
     107        if (!cbMutateRange)
     108            cbMutateRange = UINT64_MAX;
     109
     110        rc = RTFuzzCtxCfgSetMutationRange(hFuzzCtx,
     111                                          tstDevSsmFuzzGetCfgU64(paCfg, cCfgItems, "OffMutateStart"),
     112                                          cbMutateRange);
     113        if (RT_SUCCESS(rc))
     114            rc = RTFuzzCtxCorpusInputAddFromDirPath(hFuzzCtx, tstDevSsmFuzzGetCfgString(paCfg, cCfgItems, "CorpusPath"));
    107115        if (RT_SUCCESS(rc))
    108116        {
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