VirtualBox

Changeset 20854 in vbox


Ignore:
Timestamp:
Jun 23, 2009 4:32:12 PM (15 years ago)
Author:
vboxsync
Message:

VMM: Use the custom logger prefix to indicate the virtual CPU ID.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VM.cpp

    r20564 r20854  
    131131static int               vmR3InitGC(PVM pVM);
    132132static int               vmR3InitDoCompleted(PVM pVM, VMINITCOMPLETED enmWhat);
     133static DECLCALLBACK(size_t) vmR3LogPrefixCallback(PRTLOGGER pLogger, char *pchBuf, size_t cchBuf, void *pvUser);
    133134static DECLCALLBACK(int) vmR3PowerOn(PVM pVM);
    134135static DECLCALLBACK(int) vmR3Suspend(PVM pVM);
     
    645646                                    {
    646647                                        /*
    647                                         * Set the state and link into the global list.
    648                                         */
     648                                         * Set the state and link into the global list.
     649                                         */
    649650                                        vmR3SetState(pVM, VMSTATE_CREATED);
    650651                                        pUVM->pNext = g_pUVMsHead;
    651652                                        g_pUVMsHead = pUVM;
     653
     654#ifdef LOG_ENABLED
     655                                        RTLogSetCustomPrefixCallback(NULL, vmR3LogPrefixCallback, pUVM);
     656#endif
    652657                                        return VINF_SUCCESS;
    653658                                    }
     
    10391044
    10401045/**
     1046 * Logger callback for inserting a custom prefix.
     1047 *
     1048 * @returns Number of chars written.
     1049 * @param   pLogger             The logger.
     1050 * @param   pchBuf              The output buffer.
     1051 * @param   cchBuf              The output buffer size.
     1052 * @param   pvUser              Pointer to the UVM structure.
     1053 */
     1054static DECLCALLBACK(size_t) vmR3LogPrefixCallback(PRTLOGGER pLogger, char *pchBuf, size_t cchBuf, void *pvUser)
     1055{
     1056    AssertReturn(cchBuf >= 2, 0);
     1057    PUVM        pUVM   = (PUVM)pvUser;
     1058    PUVMCPU     pUVCpu = (PUVMCPU)RTTlsGet(pUVM->vm.s.idxTLS);
     1059    if (pUVCpu)
     1060    {
     1061        static const char s_szHex[17] = "0123456789abcdef";
     1062        VMCPUID const     idCpu       = pUVCpu->idCpu;
     1063        pchBuf[1] = s_szHex[ idCpu       & 15];
     1064        pchBuf[0] = s_szHex[(idCpu >> 4) & 15];
     1065    }
     1066    else
     1067    {
     1068        pchBuf[0] = 'x';
     1069        pchBuf[1] = 'y';
     1070    }
     1071
     1072    return 2;
     1073}
     1074
     1075
     1076/**
    10411077 * Calls the relocation functions for all VMM components so they can update
    10421078 * any GC pointers. When this function is called all the basic VM members
     
    20322068    STAMR3TermUVM(pUVM);
    20332069
     2070#ifdef LOG_ENABLED
     2071    RTLogSetCustomPrefixCallback(NULL, NULL, NULL);
     2072#endif
    20342073    RTTlsFree(pUVM->vm.s.idxTLS);
    20352074
  • trunk/src/VBox/VMM/VMM.cpp

    r20792 r20854  
    808808     * in ring-0. Only initialize it once.
    809809     */
    810     for (unsigned i = 0; i < pVM->cCPUs; i++)
     810    for (VMCPUID i = 0; i < pVM->cCPUs; i++)
    811811    {
    812812        PVMCPU       pVCpu = &pVM->aCpus[i];
     
    818818                RTR0PTR pfnLoggerWrapper = NIL_RTR0PTR;
    819819                rc = PDMR3LdrGetSymbolR0(pVM, VMMR0_MAIN_MODULE_NAME, "vmmR0LoggerWrapper", &pfnLoggerWrapper);
    820                 AssertReleaseMsgRCReturn(rc, ("VMMLoggerWrapper not found! rc=%Rra\n", rc), rc);
     820                AssertReleaseMsgRCReturn(rc, ("vmmR0LoggerWrapper not found! rc=%Rra\n", rc), rc);
    821821
    822822                RTR0PTR pfnLoggerFlush = NIL_RTR0PTR;
    823823                rc = PDMR3LdrGetSymbolR0(pVM, VMMR0_MAIN_MODULE_NAME, "vmmR0LoggerFlush", &pfnLoggerFlush);
    824                 AssertReleaseMsgRCReturn(rc, ("VMMLoggerFlush not found! rc=%Rra\n", rc), rc);
     824                AssertReleaseMsgRCReturn(rc, ("vmmR0LoggerFlush not found! rc=%Rra\n", rc), rc);
    825825
    826826                rc = RTLogCreateForR0(&pR0LoggerR3->Logger, pR0LoggerR3->cbLogger,
    827                                     *(PFNRTLOGGER *)&pfnLoggerWrapper, *(PFNRTLOGFLUSH *)&pfnLoggerFlush,
    828                                     RTLOGFLAGS_BUFFERED, RTLOGDEST_DUMMY);
     827                                      *(PFNRTLOGGER *)&pfnLoggerWrapper, *(PFNRTLOGFLUSH *)&pfnLoggerFlush,
     828                                      RTLOGFLAGS_BUFFERED, RTLOGDEST_DUMMY);
    829829                AssertReleaseMsgRCReturn(rc, ("RTLogCreateForR0 failed! rc=%Rra\n", rc), rc);
     830
     831                RTR0PTR pfnLoggerPrefix = NIL_RTR0PTR;
     832                rc = PDMR3LdrGetSymbolR0(pVM, VMMR0_MAIN_MODULE_NAME, "vmmR0LoggerPrefix", &pfnLoggerPrefix);
     833                AssertReleaseMsgRCReturn(rc, ("vmmR0LoggerPrefix not found! rc=%Rra\n", rc), rc);
     834                rc = RTLogSetCustomPrefixCallback(&pR0LoggerR3->Logger, *(PFNRTLOGPREFIX *)&pfnLoggerPrefix, NULL);
     835                AssertReleaseMsgRCReturn(rc, ("RTLogSetCustomPrefixCallback failed! rc=%Rra\n", rc), rc);
     836
     837                pR0LoggerR3->idCpu = i;
    830838                pR0LoggerR3->fCreated = true;
    831839                pR0LoggerR3->fFlushingDisabled = false;
     840
    832841            }
    833842
  • trunk/src/VBox/VMM/VMMInternal.h

    r20663 r20854  
    112112    bool                        fRegistered;
    113113    bool                        a8Alignment;
    114 #if HC_ARCH_BITS == 32
     114    /** The CPU ID. */
     115    VMCPUID                     idCpu;
     116#if HC_ARCH_BITS == 64
    115117    uint32_t                    u32Alignment;
    116118#endif
     
    558560VMMR0DECL(void) vmmR0LoggerFlush(PRTLOGGER pLogger);
    559561
     562/**
     563 * Interal R0 logger worker: Custom prefix.
     564 *
     565 * @returns Number of chars written.
     566 *
     567 * @param   pLogger     The logger instance.
     568 * @param   pchBuf      The output buffer.
     569 * @param   cchBuf      The size of the buffer.
     570 * @param   pvUser      User argument (ignored).
     571 */
     572VMMR0DECL(size_t) vmmR0LoggerPrefix(PRTLOGGER pLogger, char *pchBuf, size_t cchBuf, void *pvUser);
     573
    560574#endif /* IN_RING0 */
    561575#ifdef IN_RC
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r20406 r20854  
    12121212}
    12131213
     1214/**
     1215 * Interal R0 logger worker: Custom prefix.
     1216 *
     1217 * @returns Number of chars written.
     1218 *
     1219 * @param   pLogger     The logger instance.
     1220 * @param   pchBuf      The output buffer.
     1221 * @param   cchBuf      The size of the buffer.
     1222 * @param   pvUser      User argument (ignored).
     1223 */
     1224VMMR0DECL(size_t) vmmR0LoggerPrefix(PRTLOGGER pLogger, char *pchBuf, size_t cchBuf, void *pvUser)
     1225{
     1226    NOREF(pvUser);
     1227#ifdef LOG_ENABLED
     1228    PVMMR0LOGGER pR0Logger = (PVMMR0LOGGER)((uintptr_t)pLogger - RT_OFFSETOF(VMMR0LOGGER, Logger));
     1229    if (    !VALID_PTR(pR0Logger)
     1230        ||  !VALID_PTR(pR0Logger + 1)
     1231        ||  pLogger->u32Magic != RTLOGGER_MAGIC
     1232        ||  cchBuf < 2)
     1233        return 0;
     1234
     1235    static const char s_szHex[17] = "0123456789abcdef";
     1236    VMCPUID const     idCpu       = pR0Logger->idCpu;
     1237    pchBuf[1] = s_szHex[ idCpu       & 15];
     1238    pchBuf[0] = s_szHex[(idCpu >> 4) & 15];
     1239
     1240    return 2;
     1241#else
     1242    return 0;
     1243#endif
     1244}
     1245
     1246
    12141247#ifdef LOG_ENABLED
    12151248/**
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