Changeset 96925 in vbox for trunk/src/VBox/VMM/VMMR0
- Timestamp:
- Sep 28, 2022 8:39:43 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153836
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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;
Note:
See TracChangeset
for help on using the changeset viewer.