VirtualBox

Changeset 89980 in vbox for trunk


Ignore:
Timestamp:
Jun 30, 2021 2:22:17 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145442
Message:

VMM/HMVMX: Add debug event and dtrace probe for the split-lock #ACs. bugref:10052

Location:
trunk
Files:
4 edited

Legend:

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

    r89924 r89980  
    497497
    498498
     499    /** @name Misc VT-x and AMD-V execution events.
     500     * @{ */
     501    DBGFEVENT_VMX_SPLIT_LOCK,           /**< VT-x: Split-lock \#AC triggered by host having detection enabled. */
     502    /** @} */
     503
     504
    499505    /** Access to an unassigned I/O port.
    500506     * @todo not yet implemented. */
  • trunk/src/VBox/Debugger/DBGCEmulateCodeView.cpp

    r89896 r89980  
    680680    { DBGFEVENT_EXIT_SVM_STGI,          "exit_svm_stgi",        NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
    681681    { DBGFEVENT_EXIT_SVM_CLGI,          "exit_svm_clgi",        NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
     682    { DBGFEVENT_VMX_SPLIT_LOCK,         "vmx_split_lock",       NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
    682683    { DBGFEVENT_IOPORT_UNASSIGNED,      "pio_unassigned",       NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
    683684    { DBGFEVENT_IOPORT_UNUSED,          "pio_unused",           NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
  • trunk/src/VBox/VMM/VBoxVMM.d

    r82968 r89980  
    361361
    362362
     363    /** @name Misc VT-x and AMD-V execution events.
     364     * @{ */
     365    /** VT-x: Split-lock \#AC triggered by host having detection enabled. */
     366    probe vmx__split__lock(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     367    /** @} */
     368
     369
    363370    /** @name IPRT tracepoints we link in.
    364371     * @{ */
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r89976 r89980  
    1415314153        || !(pVCpu->cpum.GstCtx.eflags.u & X86_EFL_AC) )
    1415414154    {
     14155        /*
     14156         * Check for debug/trace events and import state accordingly.
     14157         */
    1415514158        STAM_REL_COUNTER_INC(&pVCpu->hm.s.StatExitGuestACSplitLock);
    14156 #if 0
    14157         rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
     14159        PVM pVM = pVCpu->pVMR0;
     14160        if (   !DBGF_IS_EVENT_ENABLED(pVM, DBGFEVENT_VMX_SPLIT_LOCK)
     14161            && !VBOXVMM_VMX_SPLIT_LOCK_ENABLED())
     14162        {
     14163#if 0 /** @todo r=bird: This is potentially wrong.  Might have to just do a whole state sync above and mark everything changed to be safe... */
     14164            rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
    1415814165#else
    14159         rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
     14166            rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
    1416014167#endif
    14161         AssertRCReturn(rc, rc);
     14168            AssertRCReturn(rc, rc);
     14169        }
     14170        else
     14171        {
     14172            rc = hmR0VmxImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
     14173            AssertRCReturn(rc, rc);
     14174
     14175            VBOXVMM_XCPT_DF(pVCpu, &pVCpu->cpum.GstCtx);
     14176
     14177            if (DBGF_IS_EVENT_ENABLED(pVM, DBGFEVENT_VMX_SPLIT_LOCK))
     14178            {
     14179                VBOXSTRICTRC rcStrict = DBGFEventGenericWithArgs(pVM, pVCpu, DBGFEVENT_VMX_SPLIT_LOCK, DBGFEVENTCTX_HM, 0);
     14180                if (rcStrict != VINF_SUCCESS)
     14181                    return rcStrict;
     14182            }
     14183        }
     14184
     14185        /*
     14186         * Emulate the instruction.
     14187         *
     14188         * We have to ignore the LOCK prefix here as we must not retrigger the
     14189         * detection on the host.  This isn't all that satisfactory, though...
     14190         */
    1416214191        Log8Func(("cs:rip=%#04x:%#RX64 rflags=%#RX64 cr0=%#RX64 split-lock #AC?\n", pVCpu->cpum.GstCtx.cs.Sel,
    1416314192                  pVCpu->cpum.GstCtx.rip, pVCpu->cpum.GstCtx.rflags, pVCpu->cpum.GstCtx.cr0));
     
    1416614195        VBOXSTRICTRC rcStrict = IEMExecOneIgnoreLock(pVCpu);
    1416714196        if (rcStrict == VINF_SUCCESS)
    14168 #if 0       /** @todo r=bird: This is potentially wrong.  Might have to just do a whole
    14169              *        state sync above and mark everything changed to be safe... */
     14197#if 0 /** @todo r=bird: This is potentially wrong.  Might have to just do a whole state sync above and mark everything changed to be safe... */
    1417014198            ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged,
    1417114199                               HM_CHANGED_GUEST_RIP
     
    1417514203                             | HM_CHANGED_GUEST_SS);
    1417614204#else
    14177         ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_ALL_GUEST);
     14205            ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_ALL_GUEST);
    1417814206#endif
    1417914207        else if (rcStrict == VINF_IEM_RAISED_XCPT)
     
    1418214210            rcStrict = VINF_SUCCESS;
    1418314211        }
    14184         return VBOXSTRICTRC_VAL(rcStrict);
     14212        return rcStrict;
    1418514213    }
    1418614214
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