VirtualBox

Changeset 90897 in vbox


Ignore:
Timestamp:
Aug 25, 2021 8:00:41 PM (3 years ago)
Author:
vboxsync
Message:

VMM: Initialize the ring-0 loggers as early as possible, so we can update their settings before doing vmmR0InitVM and similar where we'd like to have working log output. bugref:10086

Location:
trunk
Files:
3 edited

Legend:

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

    r90829 r90897  
    521521VMMR0DECL(int)       VMMR0EntryEx(PGVM pGVM, PVMCC pVM, VMCPUID idCpu, VMMR0OPERATION enmOperation,
    522522                                  PSUPVMMR0REQHDR pReq, uint64_t u64Arg, PSUPDRVSESSION);
    523 VMMR0_INT_DECL(void) VMMR0InitPerVMData(PGVM pGVM);
     523VMMR0_INT_DECL(int) VMMR0InitPerVMData(PGVM pGVM);
    524524VMMR0_INT_DECL(int)  VMMR0TermVM(PGVM pGVM, VMCPUID idCpu);
    525525VMMR0_INT_DECL(void) VMMR0CleanupVM(PGVM pGVM);
  • trunk/src/VBox/VMM/VMMR0/GVMMR0.cpp

    r90829 r90897  
    910910                        rc = GMMR0InitPerVMData(pGVM);
    911911                        int rc2 = PGMR0InitPerVMData(pGVM);
    912                         VMMR0InitPerVMData(pGVM);
     912                        int rc3 = VMMR0InitPerVMData(pGVM);
    913913                        DBGFR0InitPerVMData(pGVM);
    914914                        PDMR0InitPerVMData(pGVM);
    915915                        IOMR0InitPerVMData(pGVM);
    916916                        TMR0InitPerVMData(pGVM);
    917                         if (RT_SUCCESS(rc) && RT_SUCCESS(rc2))
     917                        if (RT_SUCCESS(rc) && RT_SUCCESS(rc2) && RT_SUCCESS(rc3))
    918918                        {
    919919                            /*
     
    10391039                            }
    10401040                        }
    1041                         else if (RT_SUCCESS(rc))
    1042                             rc = rc2;
     1041                        else
     1042                        {
     1043                            if (RT_SUCCESS_NP(rc))
     1044                                rc = rc2;
     1045                            if (RT_SUCCESS_NP(rc))
     1046                                rc = rc3;
     1047                        }
    10431048                    }
    10441049                }
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r90862 r90897  
    364364
    365365/**
    366  * Initializes VMM specific members when the GVM structure is created.
    367  *
    368  * @param   pGVM        The global (ring-0) VM structure.
    369  */
    370 VMMR0_INT_DECL(void) VMMR0InitPerVMData(PGVM pGVM)
    371 {
    372     pGVM->vmmr0.s.hMemObjLogger         = NIL_RTR0MEMOBJ;
    373     pGVM->vmmr0.s.hMapObjLogger         = NIL_RTR0MEMOBJ;
    374     pGVM->vmmr0.s.hMemObjReleaseLogger  = NIL_RTR0MEMOBJ;
    375     pGVM->vmmr0.s.hMapObjReleaseLogger  = NIL_RTR0MEMOBJ;
    376     pGVM->vmmr0.s.fCalledInitVm         = false;
    377 
    378     for (VMCPUID idCpu = 0; idCpu < pGVM->cCpus; idCpu++)
    379     {
    380         PGVMCPU pGVCpu = &pGVM->aCpus[idCpu];
    381         Assert(pGVCpu->idHostCpu == NIL_RTCPUID);
    382         Assert(pGVCpu->iHostCpuSet == UINT32_MAX);
    383         pGVCpu->vmmr0.s.fInHmContext    = false;
    384         pGVCpu->vmmr0.s.pPreemptState   = NULL;
    385         pGVCpu->vmmr0.s.hCtxHook        = NIL_RTTHREADCTXHOOK;
    386     }
    387 }
    388 
    389 
    390 /**
    391366 * Helper for vmmR0InitLoggers
    392367 */
    393368static int vmmR0InitLoggerOne(PGVMCPU pGVCpu, bool fRelease, PVMMR0PERVCPULOGGER pR0Log, PVMMR3CPULOGGER pShared,
    394                               uint32_t cbBuf, char *pchBuf, RTR3PTR pchBufR3, uint64_t nsProgramStart)
     369                              uint32_t cbBuf, char *pchBuf, RTR3PTR pchBufR3)
    395370{
    396371    pR0Log->BufDesc.u32Magic    = RTLOGBUFFERDESC_MAGIC;
     
    426401        {
    427402            RTLogSetR0ThreadNameF(pLogger, "EMT-%u-R0", pGVCpu->idCpu);
    428             RTLogSetR0ProgramStart(pLogger, nsProgramStart);
    429403            return VINF_SUCCESS;
    430404        }
     
    461435                PVMMR0PERVCPULOGGER pR0Log  = fRelease ? &pGVCpu->vmmr0.s.RelLogger : &pGVCpu->vmmr0.s.Logger;
    462436                PVMMR3CPULOGGER     pShared = fRelease ? &pGVCpu->vmm.s.RelLogger   : &pGVCpu->vmm.s.Logger;
    463                 rc = vmmR0InitLoggerOne(pGVCpu, fRelease, pR0Log, pShared, cbBuf, pchBuf + i * cbBuf, pchBufR3 + i * cbBuf,
    464                                         pGVM->vmm.s.nsProgramStart);
     437                rc = vmmR0InitLoggerOne(pGVCpu, fRelease, pR0Log, pShared, cbBuf, pchBuf + i * cbBuf, pchBufR3 + i * cbBuf);
    465438                if (RT_FAILURE(rc))
    466439                {
     
    494467
    495468/**
     469 * Initializes VMM specific members when the GVM structure is created,
     470 * allocating loggers and stuff.
     471 *
     472 * The loggers are allocated here so that we can update their settings before
     473 * doing VMMR0_DO_VMMR0_INIT and have correct logging at that time.
     474 *
     475 * @returns VBox status code.
     476 * @param   pGVM        The global (ring-0) VM structure.
     477 */
     478VMMR0_INT_DECL(int) VMMR0InitPerVMData(PGVM pGVM)
     479{
     480    /*
     481     * Initialize all members first.
     482     */
     483    pGVM->vmmr0.s.hMemObjLogger         = NIL_RTR0MEMOBJ;
     484    pGVM->vmmr0.s.hMapObjLogger         = NIL_RTR0MEMOBJ;
     485    pGVM->vmmr0.s.hMemObjReleaseLogger  = NIL_RTR0MEMOBJ;
     486    pGVM->vmmr0.s.hMapObjReleaseLogger  = NIL_RTR0MEMOBJ;
     487    pGVM->vmmr0.s.fCalledInitVm         = false;
     488
     489    for (VMCPUID idCpu = 0; idCpu < pGVM->cCpus; idCpu++)
     490    {
     491        PGVMCPU pGVCpu = &pGVM->aCpus[idCpu];
     492        Assert(pGVCpu->idHostCpu == NIL_RTCPUID);
     493        Assert(pGVCpu->iHostCpuSet == UINT32_MAX);
     494        pGVCpu->vmmr0.s.fInHmContext    = false;
     495        pGVCpu->vmmr0.s.pPreemptState   = NULL;
     496        pGVCpu->vmmr0.s.hCtxHook        = NIL_RTTHREADCTXHOOK;
     497    }
     498
     499    /*
     500     * Create the ring-0 release loggers.
     501     */
     502    int rc = vmmR0InitLoggers(pGVM, true /*fRelease*/, _8K,
     503                              &pGVM->vmmr0.s.hMemObjReleaseLogger, &pGVM->vmmr0.s.hMapObjReleaseLogger);
     504
     505#ifdef LOG_ENABLED
     506    /*
     507     * Create debug loggers.
     508     */
     509    if (RT_SUCCESS(rc))
     510        rc = vmmR0InitLoggers(pGVM, false /*fRelease*/, _64K, &pGVM->vmmr0.s.hMemObjLogger, &pGVM->vmmr0.s.hMapObjLogger);
     511#endif
     512
     513    return rc;
     514}
     515
     516
     517/**
    496518 * Initiates the R0 driver for a particular VM instance.
    497519 *
     
    534556        return VERR_ALREADY_INITIALIZED;
    535557
    536     /*
    537      * Create the ring-0 release loggers.
    538      */
    539     rc = vmmR0InitLoggers(pGVM, true /*fRelease*/, _8K, &pGVM->vmmr0.s.hMemObjReleaseLogger, &pGVM->vmmr0.s.hMapObjReleaseLogger);
    540     if (RT_FAILURE(rc))
    541         return rc;
    542 
    543558#ifdef LOG_ENABLED
    544     /*
    545      * Create debug loggers.
    546      */
    547     rc = vmmR0InitLoggers(pGVM, false /*fRelease*/, _64K, &pGVM->vmmr0.s.hMemObjLogger, &pGVM->vmmr0.s.hMapObjLogger);
    548     if (RT_FAILURE(rc))
    549         return rc;
    550559
    551560    /*
     
    29172926        PRTLOGGER pLogger = fRelease ? pGVCpu->vmmr0.s.RelLogger.pLogger : pGVCpu->vmmr0.s.Logger.pLogger;
    29182927        if (pLogger)
     2928        {
     2929            RTLogSetR0ProgramStart(pLogger, pGVM->vmm.s.nsProgramStart);
    29192930            rc = RTLogBulkUpdate(pLogger, pReq->fFlags, pReq->uGroupCrc32, pReq->cGroups, pReq->afGroups);
     2931        }
    29202932    }
    29212933
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