VirtualBox

Changeset 72564 in vbox for trunk/src/VBox/VMM/VMMRC


Ignore:
Timestamp:
Jun 15, 2018 12:56:01 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
123058
Message:

EM,TRPM,IOM: Improved the raw-mode exit history a little (just for the heck of it). bugref:9044

Location:
trunk/src/VBox/VMM/VMMRC
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMRC/IOMRC.cpp

    r69111 r72564  
    218218    {
    219219        case OP_IN:
     220            EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_IO_PORT_READ));
    220221            return iomRCInterpretIN(pVM, pVCpu, pRegFrame, pCpu);
    221222
    222223        case OP_OUT:
     224            EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_IO_PORT_WRITE));
    223225            return iomRCInterpretOUT(pVM, pVCpu, pRegFrame, pCpu);
    224226
    225227        case OP_INSB:
    226228        case OP_INSWD:
     229            EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_IO_PORT_STR_READ));
    227230            return iomRCInterpretINS(pVCpu, pCpu);
    228231
    229232        case OP_OUTSB:
    230233        case OP_OUTSWD:
     234            EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_IO_PORT_STR_WRITE));
    231235            return iomRCInterpretOUTS(pVCpu, pCpu);
    232236
  • trunk/src/VBox/VMM/VMMRC/TRPMRCHandlers.cpp

    r72559 r72564  
    845845     * Try handle it here, if not return to HC and emulate/interpret it there.
    846846     */
    847     switch (pCpu->pCurInstr->uOpcode)
     847    uint16_t const uOpcode = pCpu->pCurInstr->uOpcode;
     848    switch (uOpcode)
    848849    {
    849850        case OP_INT3:
     
    856857        case OP_INT:
    857858        {
     859            EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_INT));
    858860            Assert(pCpu->Param1.fUse & DISUSE_IMMEDIATE8);
    859861            Assert(!(PATMIsPatchGCAddr(pVM, PC)));
     
    888890
    889891        case OP_HLT:
     892            EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_HLT));
     893
    890894            /* If it's in patch code, defer to ring-3. */
    891895            if (PATMIsPatchGCAddr(pVM, PC))
     
    908912            if (    !PATMIsPatchGCAddr(pVM, PC)
    909913                &&  !CSAMIsKnownDangerousInstr(pVM, PC))
     914            {
     915                if (uOpcode == OP_MOV_CR)
     916                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_MOV_CRX));
     917                else
     918                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_MOV_DRX));
    910919                break;
     920            }
    911921            RT_FALL_THRU();
    912922        case OP_INVLPG:
     
    920930        case OP_WRMSR:
    921931        {
     932            /* Update history. */
     933            switch (uOpcode)
     934            {
     935                case OP_MOV_CR:
     936                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_MOV_CRX));
     937                    break;
     938                case OP_MOV_DR:
     939                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_MOV_DRX));
     940                    break;
     941                case OP_INVLPG:
     942                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_INVLPG));
     943                    break;
     944                case OP_LLDT:
     945                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_LLDT));
     946                    break;
     947                case OP_STI:
     948                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_STI));
     949                    break;
     950                case OP_RDPMC:
     951                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_RDPMC));
     952                    break;
     953                case OP_CLTS:
     954                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_CLTS));
     955                    break;
     956                case OP_WBINVD:
     957                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_CLTS));
     958                    break;
     959                case OP_RDMSR:
     960                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_MSR_READ));
     961                    break;
     962                case OP_WRMSR:
     963                    EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_MSR_WRITE));
     964                    break;
     965            }
     966
    922967            rc = VBOXSTRICTRC_TODO(EMInterpretInstructionDisasState(pVCpu, pCpu, pRegFrame, PC, EMCODETYPE_SUPERVISOR));
    923968            if (rc == VERR_EM_INTERPRETER)
     
    952997    TRPM_ENTER_DBG_HOOK(0xd);
    953998
    954     switch (pCpu->pCurInstr->uOpcode)
     999    uint16_t const uOpcode = pCpu->pCurInstr->uOpcode;
     1000    switch (uOpcode)
    9551001    {
    9561002        /*
     
    9671013        case OP_INT:
    9681014        {
     1015            EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_INT));
    9691016            Assert(pCpu->Param1.fUse & DISUSE_IMMEDIATE8);
    9701017            rc = TRPMForwardTrap(pVCpu, pRegFrame, (uint32_t)pCpu->Param1.uValue, pCpu->cbInstr, TRPM_TRAP_NO_ERRORCODE, TRPM_SOFTWARE_INT, 0xd);
     
    9861033        case OP_SYSCALL:
    9871034        case OP_SYSENTER:
     1035            if (uOpcode == OP_SYSCALL)
     1036                EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_SYSCALL));
     1037            else
     1038                EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_SYSENTER));
    9881039#ifdef PATM_EMULATE_SYSENTER
    9891040            rc = PATMSysCall(pVM, CPUMCTX_FROM_CORE(pRegFrame), pCpu);
     
    11271178     */
    11281179    if (Cpu.pCurInstr->uOpcode == OP_RDTSC)
     1180    {
     1181        EMHistoryUpdateFlagsAndType(pVCpu, EMEXIT_MAKE_FLAGS_AND_TYPE(EMEXIT_F_KIND_EM, EMEXITTYPE_RDTSC));
    11291182        return trpmGCTrap0dHandlerRdTsc(pVM, pVCpu, pRegFrame);
     1183    }
    11301184
    11311185    /*
     
    11351189        &&  (Cpu.pCurInstr->fOpType & DISOPTYPE_PORTIO))
    11361190    {
     1191        /* IOMRCIOPortHandler updates exit history. */
    11371192        VBOXSTRICTRC rcStrict = IOMRCIOPortHandler(pVM, pVCpu, pRegFrame, &Cpu);
    11381193        TRPM_EXIT_DBG_HOOK(0xd);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette