- Timestamp:
- Sep 28, 2022 8:39:43 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153836
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/vmm.h
r96407 r96925 454 454 * Request package for VMMR0_DO_VMMR0_UPDATE_LOGGERS. 455 455 * 456 * In addition the u64Arg selects the logger sets: @c false for debug, @c true457 * for release.456 * In addition the u64Arg is selects the logger and indicates whether we're only 457 * outputting to the parent VMM. See VMMR0UPDATELOGGER_F_XXX. 458 458 */ 459 459 typedef struct VMMR0UPDATELOGGERSREQ … … 473 473 /** Pointer to a VMMR0_DO_VMMR0_UPDATE_LOGGERS request. */ 474 474 typedef VMMR0UPDATELOGGERSREQ *PVMMR0UPDATELOGGERSREQ; 475 476 /** @name VMMR0UPDATELOGGER_F_XXX - u64Arg definitions for VMMR0_DO_VMMR0_UPDATE_LOGGERS. 477 * @{ */ 478 /** Logger index mask. */ 479 #define VMMR0UPDATELOGGER_F_LOGGER_MASK UINT64_C(0x0001) 480 /** Only flush to the parent VMM's debug log, don't return to ring-3. */ 481 #define VMMR0UPDATELOGGER_F_TO_PARENT_VMM_DBG UINT64_C(0x0002) 482 /** Only flush to the parent VMM's debug log, don't return to ring-3. */ 483 #define VMMR0UPDATELOGGER_F_TO_PARENT_VMM_REL UINT64_C(0x0004) 484 /** Valid flag mask. */ 485 #define VMMR0UPDATELOGGER_F_VALID_MASK UINT64_C(0x0007) 486 /** @} */ 475 487 476 488 #if defined(IN_RING0) || defined(DOXYGEN_RUNNING) -
trunk/src/VBox/Runtime/Makefile.kmk
r96892 r96925 3405 3405 common/asm/ASMRdMsrEx.asm \ 3406 3406 common/asm/ASMWrMsrEx.asm \ 3407 common/string/RTStrEnd.asm 3407 common/string/RTStrEnd.asm \ 3408 VBox/RTLogWriteVmm-amd64-x86.asm 3408 3409 RuntimeR0_SOURCES.amd64 += \ 3409 3410 common/asm/ASMCpuIdExSlow.asm \ … … 3425 3426 common/asm/ASMWrMsrEx.asm \ 3426 3427 common/math/RTUInt128MulByU64Ex.asm \ 3427 common/string/RTStrEnd.asm 3428 common/string/RTStrEnd.asm \ 3429 VBox/RTLogWriteVmm-amd64-x86.asm 3428 3430 RuntimeR0_SOURCES.arm32 += \ 3429 3431 common/string/RTStrEnd.cpp -
trunk/src/VBox/VMM/VMMR0/VMMR0.cpp
r96407 r96925 100 100 #endif 101 101 RT_C_DECLS_END 102 static int vmmR0UpdateLoggers(PGVM pGVM, VMCPUID idCpu, PVMMR0UPDATELOGGERSREQ pReq, size_t idxLogger);102 static int vmmR0UpdateLoggers(PGVM pGVM, VMCPUID idCpu, PVMMR0UPDATELOGGERSREQ pReq, uint64_t fFlags); 103 103 static int vmmR0LogFlusher(PGVM pGVM); 104 104 static int vmmR0LogWaitFlushed(PGVM pGVM, VMCPUID idCpu, size_t idxLogger); … … 1837 1837 if (idCpu == NIL_VMCPUID) 1838 1838 return VERR_INVALID_CPU_ID; 1839 if ( u64Arg < VMMLOGGER_IDX_MAX&& pReqHdr != NULL)1840 rc = vmmR0UpdateLoggers(pGVM, idCpu /*idCpu*/, (PVMMR0UPDATELOGGERSREQ)pReqHdr, (size_t)u64Arg);1839 if (!(u64Arg & ~VMMR0UPDATELOGGER_F_VALID_MASK) && pReqHdr != NULL) 1840 rc = vmmR0UpdateLoggers(pGVM, idCpu /*idCpu*/, (PVMMR0UPDATELOGGERSREQ)pReqHdr, u64Arg); 1841 1841 else 1842 1842 return VERR_INVALID_PARAMETER; … … 2738 2738 * @param idCpu The ID of the calling EMT. 2739 2739 * @param pReq The request data. 2740 * @param idxLogger Which logger set to update.2740 * @param fFlags Flags, see VMMR0UPDATELOGGER_F_XXX. 2741 2741 * @thread EMT(idCpu) 2742 2742 */ 2743 static int vmmR0UpdateLoggers(PGVM pGVM, VMCPUID idCpu, PVMMR0UPDATELOGGERSREQ pReq, size_t idxLogger)2743 static int vmmR0UpdateLoggers(PGVM pGVM, VMCPUID idCpu, PVMMR0UPDATELOGGERSREQ pReq, uint64_t fFlags) 2744 2744 { 2745 2745 /* … … 2753 2753 AssertReturn(pReq->Hdr.cbReq == RT_UOFFSETOF_DYN(VMMR0UPDATELOGGERSREQ, afGroups[pReq->cGroups]), VERR_INVALID_PARAMETER); 2754 2754 2755 size_t const idxLogger = (size_t)(fFlags & VMMR0UPDATELOGGER_F_LOGGER_MASK); 2755 2756 AssertReturn(idxLogger < VMMLOGGER_IDX_MAX, VERR_OUT_OF_RANGE); 2756 2757 … … 2758 2759 * Adjust flags. 2759 2760 */ 2760 /* Always buffered: */ 2761 pReq->fFlags |= RTLOGFLAGS_BUFFERED; 2761 /* Always buffered, unless logging directly to parent VMM: */ 2762 if (!(fFlags & (VMMR0UPDATELOGGER_F_TO_PARENT_VMM_DBG | VMMR0UPDATELOGGER_F_TO_PARENT_VMM_REL))) 2763 pReq->fFlags |= RTLOGFLAGS_BUFFERED; 2762 2764 /* These doesn't make sense at present: */ 2763 2765 pReq->fFlags &= ~(RTLOGFLAGS_FLUSH | RTLOGFLAGS_WRITE_THROUGH); … … 2775 2777 if (pLogger) 2776 2778 { 2779 pGVCpu->vmmr0.s.u.aLoggers[idxLogger].fFlushToParentVmmDbg = RT_BOOL(fFlags & VMMR0UPDATELOGGER_F_TO_PARENT_VMM_DBG); 2780 pGVCpu->vmmr0.s.u.aLoggers[idxLogger].fFlushToParentVmmRel = RT_BOOL(fFlags & VMMR0UPDATELOGGER_F_TO_PARENT_VMM_REL); 2781 2777 2782 RTLogSetR0ProgramStart(pLogger, pGVM->vmm.s.nsProgramStart); 2778 2783 rc = RTLogBulkUpdate(pLogger, pReq->fFlags, pReq->uGroupCrc32, pReq->cGroups, pReq->afGroups); … … 2998 3003 2999 3004 /** 3000 * Inner worker for vmmR0LoggerFlushCommon .3001 */ 3002 static bool vmmR0LoggerFlushInner (PGVM pGVM, PGVMCPU pGVCpu, uint32_t idxLogger, size_t idxBuffer, uint32_t cbToFlush)3005 * Inner worker for vmmR0LoggerFlushCommon for flushing to ring-3. 3006 */ 3007 static bool vmmR0LoggerFlushInnerToRing3(PGVM pGVM, PGVMCPU pGVCpu, uint32_t idxLogger, size_t idxBuffer, uint32_t cbToFlush) 3003 3008 { 3004 3009 PVMMR0PERVCPULOGGER const pR0Log = &pGVCpu->vmmr0.s.u.aLoggers[idxLogger]; … … 3048 3053 if (enmAction != kJustSignal) 3049 3054 { 3050 int rc = VMMR0EmtPrepareToBlock(pGVCpu, VINF_SUCCESS, "vmmR0LoggerFlushInner ", pR0Log->hEventFlushWait, &Ctx);3055 int rc = VMMR0EmtPrepareToBlock(pGVCpu, VINF_SUCCESS, "vmmR0LoggerFlushInnerToRing3", pR0Log->hEventFlushWait, &Ctx); 3051 3056 if (RT_SUCCESS(rc)) 3052 3057 { /* likely */ } … … 3154 3159 return fFlushedBuffer; 3155 3160 } 3161 3162 3163 /** 3164 * Inner worker for vmmR0LoggerFlushCommon when only flushing to the parent 3165 * VMM's logs. 3166 */ 3167 static bool vmmR0LoggerFlushInnerToParent(PGVM pGVM, PGVMCPU pGVCpu, PVMMR0PERVCPULOGGER pR0Log, PRTLOGBUFFERDESC pBufDesc) 3168 { 3169 uint32_t const cbToFlush = pBufDesc->offBuf; 3170 if (pR0Log->fFlushToParentVmmDbg) 3171 RTLogWriteVmm(pBufDesc->pchBuf, cbToFlush, false /*fRelease*/); 3172 if (pR0Log->fFlushToParentVmmRel) 3173 RTLogWriteVmm(pBufDesc->pchBuf, cbToFlush, true /*fRelease*/); 3174 return true; 3175 } 3176 3156 3177 3157 3178 … … 3192 3213 { 3193 3214 pR0Log->fFlushing = true; 3194 bool fFlushed = vmmR0LoggerFlushInner(pGVM, pGVCpu, idxLogger, idxBuffer, pBufDesc->offBuf); 3215 bool fFlushed; 3216 if ( !pR0Log->fFlushToParentVmmDbg 3217 && !pR0Log->fFlushToParentVmmRel) 3218 fFlushed = vmmR0LoggerFlushInnerToRing3(pGVM, pGVCpu, idxLogger, idxBuffer, pBufDesc->offBuf); 3219 else 3220 fFlushed = vmmR0LoggerFlushInnerToParent(pGVM, pGVCpu, pR0Log, pBufDesc); 3195 3221 pR0Log->fFlushing = false; 3196 3222 return fFlushed; -
trunk/src/VBox/VMM/VMMR3/VMM.cpp
r96407 r96925 731 731 AssertRC(rc); 732 732 if (RT_SUCCESS(rc)) 733 rc = VMMR3CallR0Emt(pVM, pVCpu, VMMR0_DO_VMMR0_UPDATE_LOGGERS, fReleaseLogger, &pReq->Hdr); 733 { 734 /* 735 * The 64-bit value argument. 736 */ 737 uint64_t fExtraArg = fReleaseLogger; 738 739 /* Only outputting to the parent VMM's logs? Enable ring-0 to flush directly. */ 740 uint32_t fDst = RTLogGetDestinations(pSrcLogger); 741 fDst &= ~(RTLOGDEST_DUMMY | RTLOGDEST_F_NO_DENY | RTLOGDEST_F_DELAY_FILE | RTLOGDEST_FIXED_FILE | RTLOGDEST_FIXED_DIR); 742 if ( (fDst & (RTLOGDEST_VMM | RTLOGDEST_VMM_REL)) 743 && !(fDst & ~(RTLOGDEST_VMM | RTLOGDEST_VMM_REL))) 744 fExtraArg |= (fDst & RTLOGDEST_VMM ? VMMR0UPDATELOGGER_F_TO_PARENT_VMM_DBG : 0) 745 | (fDst & RTLOGDEST_VMM_REL ? VMMR0UPDATELOGGER_F_TO_PARENT_VMM_REL : 0); 746 747 rc = VMMR3CallR0Emt(pVM, pVCpu, VMMR0_DO_VMMR0_UPDATE_LOGGERS, fExtraArg, &pReq->Hdr); 748 } 734 749 735 750 RTMemFree(pReq); -
trunk/src/VBox/VMM/include/VMMInternal.h
r96407 r96925 99 99 /** Set while we're inside vmmR0LoggerFlushCommon to prevent recursion. */ 100 100 bool fFlushing; 101 bool afPadding[1]; 101 /** Flush to parent VMM's debug log instead of ring-3. */ 102 bool fFlushToParentVmmDbg : 1; 103 /** Flush to parent VMM's debug log instead of ring-3. */ 104 bool fFlushToParentVmmRel : 1; 102 105 /** Number of buffers currently queued for flushing. */ 103 106 uint32_t volatile cFlushing;
Note:
See TracChangeset
for help on using the changeset viewer.