VirtualBox

Changeset 59004 in vbox


Ignore:
Timestamp:
Dec 5, 2015 12:07:54 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
104532
Message:

DBGF,VBoxVMM.d,HM: Split the exit probes and events into an intrusive version (INSTR_xxx) and a non-intrusive (EXIT_xxx) as we need to be able to trace named exits without causing more exits to occur.

Location:
trunk
Files:
3 edited

Legend:

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

    r59000 r59004  
    201201     * via DBGFR3xxx and queried via DBGFR3yyy.  */
    202202    DBGFEVENT_FIRST_SELECTABLE,
    203     /** Tripple fault.
    204      * @todo not yet implemented.  */
     203    /** Tripple fault. */
    205204    DBGFEVENT_TRIPLE_FAULT = DBGFEVENT_FIRST_SELECTABLE,
    206     DBGFEVENT_XCPT_DE,      /**< 0x00 - \#DE - Fault - NoErr - Integer divide error (zero/overflow). */
    207     DBGFEVENT_XCPT_DB,      /**< 0x01 - \#DB - trap/fault - NoErr - debug event. */
    208     DBGFEVENT_XCPT_02,      /**< 0x02 - Reserved for NMI, see interrupt events. */
    209     DBGFEVENT_XCPT_BP,      /**< 0x03 - \#BP - Trap  - NoErr - Breakpoint, INT 3 instruction. */
    210     DBGFEVENT_XCPT_OF,      /**< 0x04 - \#OF - Trap  - NoErr - Overflow, INTO instruction. */
    211     DBGFEVENT_XCPT_BR,      /**< 0x05 - \#BR - Fault - NoErr - BOUND Range Exceeded, BOUND instruction. */
    212     DBGFEVENT_XCPT_UD,      /**< 0x06 - \#UD - Fault - NoErr - Undefined(/Invalid) Opcode. */
    213     DBGFEVENT_XCPT_NM,      /**< 0x07 - \#NM - Fault - NoErr - Device not available, FP or (F)WAIT instruction. */
    214     DBGFEVENT_XCPT_DF,      /**< 0x08 - \#DF - Abort - Err=0 - Double fault. */
    215     DBGFEVENT_XCPT_09,      /**< 0x09 - Int9 - Fault - NoErr - Coprocessor Segment Overrun (obsolete). */
    216     DBGFEVENT_XCPT_TS,      /**< 0x0a - \#TS - Fault - ErrCd - Invalid TSS, Taskswitch or TSS access. */
    217     DBGFEVENT_XCPT_NP,      /**< 0x0b - \#NP - Fault - ErrCd - Segment not present. */
    218     DBGFEVENT_XCPT_SS,      /**< 0x0c - \#SS - Fault - ErrCd - Stack-Segment fault. */
    219     DBGFEVENT_XCPT_GP,      /**< 0x0d - \#GP - Fault - ErrCd - General protection fault. */
    220     DBGFEVENT_XCPT_PF,      /**< 0x0e - \#PF - Fault - ErrCd - Page fault. - interrupt gate!!! */
    221     DBGFEVENT_XCPT_0f,      /**< 0x0f - Rsvd - Resvd - Resvd - Intel Reserved. */
    222     DBGFEVENT_XCPT_MF,      /**< 0x10 - \#MF - Fault - NoErr - x86 FPU Floating-Point Error (Math fault), FP or (F)WAIT instruction. */
    223     DBGFEVENT_XCPT_AC,      /**< 0x11 - \#AC - Fault - Err=0 - Alignment Check. */
    224     DBGFEVENT_XCPT_MC,      /**< 0x12 - \#MC - Abort - NoErr - Machine Check. */
    225     DBGFEVENT_XCPT_XF,      /**< 0x13 - \#XF - Fault - NoErr - SIMD Floating-Point Exception. */
    226     DBGFEVENT_XCPT_VE,      /**< 0x14 - \#VE - Fault - Noerr - Virtualization exception. */
    227     DBGFEVENT_XCPT_15,      /**< 0x15 - Intel Reserved. */
    228     DBGFEVENT_XCPT_16,      /**< 0x16 - Intel Reserved. */
    229     DBGFEVENT_XCPT_17,      /**< 0x17 - Intel Reserved. */
    230     DBGFEVENT_XCPT_18,      /**< 0x18 - Intel Reserved. */
    231     DBGFEVENT_XCPT_19,      /**< 0x19 - Intel Reserved. */
    232     DBGFEVENT_XCPT_1a,      /**< 0x1a - Intel Reserved. */
    233     DBGFEVENT_XCPT_1b,      /**< 0x1b - Intel Reserved. */
    234     DBGFEVENT_XCPT_1c,      /**< 0x1c - Intel Reserved. */
    235     DBGFEVENT_XCPT_1d,      /**< 0x1d - Intel Reserved. */
    236     DBGFEVENT_XCPT_SX,      /**< 0x1e - \#SX - Fault - ErrCd - Security Exception. */
    237     DBGFEVENT_XCPT_1f,      /**< 0x1f - Intel Reserved. */
    238     /** The first exception event. */
    239     DBGFEVENT_XCPT_FIRST = DBGFEVENT_XCPT_DE,
    240     /** The last exception event. */
    241     DBGFEVENT_XCPT_LAST  = DBGFEVENT_XCPT_1f,
     205
     206    /** @name Exception events
     207     * The exception events normally represents guest exceptions, but depending on
     208     * the execution mode some virtualization exceptions may occure (no nested
     209     * paging, raw-mode, ++).  When necessary, we will request additional VM exits.
     210     * @{  */
     211    DBGFEVENT_XCPT_FIRST,           /**< The first exception event. */
     212    DBGFEVENT_XCPT_DE               /**< 0x00 - \#DE - Fault - NoErr - Integer divide error (zero/overflow). */
     213        = DBGFEVENT_XCPT_FIRST,
     214    DBGFEVENT_XCPT_DB,              /**< 0x01 - \#DB - trap/fault - NoErr - debug event. */
     215    DBGFEVENT_XCPT_02,              /**< 0x02 - Reserved for NMI, see interrupt events. */
     216    DBGFEVENT_XCPT_BP,              /**< 0x03 - \#BP - Trap  - NoErr - Breakpoint, INT 3 instruction. */
     217    DBGFEVENT_XCPT_OF,              /**< 0x04 - \#OF - Trap  - NoErr - Overflow, INTO instruction. */
     218    DBGFEVENT_XCPT_BR,              /**< 0x05 - \#BR - Fault - NoErr - BOUND Range Exceeded, BOUND instruction. */
     219    DBGFEVENT_XCPT_UD,              /**< 0x06 - \#UD - Fault - NoErr - Undefined(/Invalid) Opcode. */
     220    DBGFEVENT_XCPT_NM,              /**< 0x07 - \#NM - Fault - NoErr - Device not available, FP or (F)WAIT instruction. */
     221    DBGFEVENT_XCPT_DF,              /**< 0x08 - \#DF - Abort - Err=0 - Double fault. */
     222    DBGFEVENT_XCPT_09,              /**< 0x09 - Int9 - Fault - NoErr - Coprocessor Segment Overrun (obsolete). */
     223    DBGFEVENT_XCPT_TS,              /**< 0x0a - \#TS - Fault - ErrCd - Invalid TSS, Taskswitch or TSS access. */
     224    DBGFEVENT_XCPT_NP,              /**< 0x0b - \#NP - Fault - ErrCd - Segment not present. */
     225    DBGFEVENT_XCPT_SS,              /**< 0x0c - \#SS - Fault - ErrCd - Stack-Segment fault. */
     226    DBGFEVENT_XCPT_GP,              /**< 0x0d - \#GP - Fault - ErrCd - General protection fault. */
     227    DBGFEVENT_XCPT_PF,              /**< 0x0e - \#PF - Fault - ErrCd - Page fault. - interrupt gate!!! */
     228    DBGFEVENT_XCPT_0f,              /**< 0x0f - Rsvd - Resvd - Resvd - Intel Reserved. */
     229    DBGFEVENT_XCPT_MF,              /**< 0x10 - \#MF - Fault - NoErr - x86 FPU Floating-Point Error (Math fault), FP or (F)WAIT instruction. */
     230    DBGFEVENT_XCPT_AC,              /**< 0x11 - \#AC - Fault - Err=0 - Alignment Check. */
     231    DBGFEVENT_XCPT_MC,              /**< 0x12 - \#MC - Abort - NoErr - Machine Check. */
     232    DBGFEVENT_XCPT_XF,              /**< 0x13 - \#XF - Fault - NoErr - SIMD Floating-Point Exception. */
     233    DBGFEVENT_XCPT_VE,              /**< 0x14 - \#VE - Fault - Noerr - Virtualization exception. */
     234    DBGFEVENT_XCPT_15,              /**< 0x15 - Intel Reserved. */
     235    DBGFEVENT_XCPT_16,              /**< 0x16 - Intel Reserved. */
     236    DBGFEVENT_XCPT_17,              /**< 0x17 - Intel Reserved. */
     237    DBGFEVENT_XCPT_18,              /**< 0x18 - Intel Reserved. */
     238    DBGFEVENT_XCPT_19,              /**< 0x19 - Intel Reserved. */
     239    DBGFEVENT_XCPT_1a,              /**< 0x1a - Intel Reserved. */
     240    DBGFEVENT_XCPT_1b,              /**< 0x1b - Intel Reserved. */
     241    DBGFEVENT_XCPT_1c,              /**< 0x1c - Intel Reserved. */
     242    DBGFEVENT_XCPT_1d,              /**< 0x1d - Intel Reserved. */
     243    DBGFEVENT_XCPT_SX,              /**< 0x1e - \#SX - Fault - ErrCd - Security Exception. */
     244    DBGFEVENT_XCPT_1f,              /**< 0x1f - Intel Reserved. */
     245    DBGFEVENT_XCPT_LAST             /**< The last exception event. */
     246        = DBGFEVENT_XCPT_1f,
     247    /** @} */
     248
     249    /** @name Instruction events
     250     * The instruction events exerts all possible effort to intercept the
     251     * relevant instructions.  However, in some execution modes we won't be able
     252     * to catch them.  So it goes.
     253     * @{ */
     254    DBGFEVENT_INSTR_FIRST,          /**< The first VM instruction event. */
     255    DBGFEVENT_INSTR_HALT            /**< Instruction: HALT */
     256        = DBGFEVENT_INSTR_FIRST,
     257    DBGFEVENT_INSTR_MWAIT,          /**< Instruction: MWAIT */
     258    DBGFEVENT_INSTR_MONITOR,        /**< Instruction: MONITOR */
     259    DBGFEVENT_INSTR_CPUID,          /**< Instruction: CPUID (missing stuff in raw-mode). */
     260    DBGFEVENT_INSTR_INVD,           /**< Instruction: INVD */
     261    DBGFEVENT_INSTR_WBINVD,         /**< Instruction: WBINVD */
     262    DBGFEVENT_INSTR_INVLPG,         /**< Instruction: INVLPG */
     263    DBGFEVENT_INSTR_RDTSC,          /**< Instruction: RDTSC */
     264    DBGFEVENT_INSTR_RDTSCP,         /**< Instruction: RDTSCP */
     265    DBGFEVENT_INSTR_RDPMC,          /**< Instruction: RDPMC */
     266    DBGFEVENT_INSTR_RDMSR,          /**< Instruction: RDMSR */
     267    DBGFEVENT_INSTR_WRMSR,          /**< Instruction: WRMSR */
     268    DBGFEVENT_INSTR_CRX_READ,       /**< Instruction: CRx read instruction (missing smsw in raw-mode, and reads in general in VT-x). */
     269    DBGFEVENT_INSTR_CRX_WRITE,      /**< Instruction: CRx write */
     270    DBGFEVENT_INSTR_DRX_READ,       /**< Instruction: DRx read */
     271    DBGFEVENT_INSTR_DRX_WRITE,      /**< Instruction: DRx write */
     272    DBGFEVENT_INSTR_PAUSE,          /**< Instruction: PAUSE instruction (not in raw-mode). */
     273    DBGFEVENT_INSTR_XSETBV,         /**< Instruction: XSETBV */
     274    DBGFEVENT_INSTR_SIDT,           /**< Instruction: SIDT */
     275    DBGFEVENT_INSTR_LIDT,           /**< Instruction: LIDT */
     276    DBGFEVENT_INSTR_SGDT,           /**< Instruction: SGDT */
     277    DBGFEVENT_INSTR_LGDT,           /**< Instruction: LGDT */
     278    DBGFEVENT_INSTR_SLDT,           /**< Instruction: SLDT */
     279    DBGFEVENT_INSTR_LLDT,           /**< Instruction: LLDT */
     280    DBGFEVENT_INSTR_STR,            /**< Instruction: STR */
     281    DBGFEVENT_INSTR_LTR,            /**< Instruction: LTR */
     282    DBGFEVENT_INSTR_GETSEC,         /**< Instruction: GETSEC */
     283    DBGFEVENT_INSTR_RSM,            /**< Instruction: RSM */
     284    DBGFEVENT_INSTR_RDRAND,         /**< Instruction: RDRAND */
     285    DBGFEVENT_INSTR_RDSEED,         /**< Instruction: RDSEED */
     286    DBGFEVENT_INSTR_XSAVES,         /**< Instruction: XSAVES */
     287    DBGFEVENT_INSTR_XRSTORS,        /**< Instruction: XRSTORS */
     288    DBGFEVENT_INSTR_VMM_CALL,       /**< Instruction: VMCALL (intel) or VMMCALL (AMD) */
     289    DBGFEVENT_INSTR_LAST_COMMON     /**< Instruction: the last common event. */
     290        = DBGFEVENT_INSTR_VMM_CALL,
     291    DBGFEVENT_INSTR_VMX_FIRST,      /**< Instruction: VT-x - First. */
     292    DBGFEVENT_INSTR_VMX_VMCLEAR     /**< Instruction: VT-x VMCLEAR */
     293        = DBGFEVENT_INSTR_VMX_FIRST,
     294    DBGFEVENT_INSTR_VMX_VMLAUNCH,   /**< Instruction: VT-x VMLAUNCH */
     295    DBGFEVENT_INSTR_VMX_VMPTRLD,    /**< Instruction: VT-x VMPTRLD */
     296    DBGFEVENT_INSTR_VMX_VMPTRST,    /**< Instruction: VT-x VMPTRST */
     297    DBGFEVENT_INSTR_VMX_VMREAD,     /**< Instruction: VT-x VMREAD */
     298    DBGFEVENT_INSTR_VMX_VMRESUME,   /**< Instruction: VT-x VMRESUME */
     299    DBGFEVENT_INSTR_VMX_VMWRITE,    /**< Instruction: VT-x VMWRITE */
     300    DBGFEVENT_INSTR_VMX_VMXOFF,     /**< Instruction: VT-x VMXOFF */
     301    DBGFEVENT_INSTR_VMX_VMXON,      /**< Instruction: VT-x VMXON */
     302    DBGFEVENT_INSTR_VMX_VMFUNC,     /**< Instruction: VT-x VMFUNC */
     303    DBGFEVENT_INSTR_VMX_INVEPT,     /**< Instruction: VT-x INVEPT */
     304    DBGFEVENT_INSTR_VMX_INVVPID,    /**< Instruction: VT-x INVVPID */
     305    DBGFEVENT_INSTR_VMX_INVPCID,    /**< Instruction: VT-x INVPCID */
     306    DBGFEVENT_INSTR_VMX_LAST        /**< Instruction: VT-x - Last. */
     307        = DBGFEVENT_INSTR_VMX_INVPCID,
     308    DBGFEVENT_INSTR_SVM_FIRST,      /**< Instruction: AMD-V - first */
     309    DBGFEVENT_INSTR_SVM_VMRUN       /**< Instruction: AMD-V VMRUN */
     310    = DBGFEVENT_INSTR_SVM_FIRST,
     311    DBGFEVENT_INSTR_SVM_VMLOAD,     /**< Instruction: AMD-V VMLOAD */
     312    DBGFEVENT_INSTR_SVM_VMSAVE,     /**< Instruction: AMD-V VMSAVE */
     313    DBGFEVENT_INSTR_SVM_STGI,       /**< Instruction: AMD-V STGI */
     314    DBGFEVENT_INSTR_SVM_CLGI,       /**< Instruction: AMD-V CLGI */
     315    DBGFEVENT_INSTR_SVM_LAST        /**< Instruction: The last ADM-V VM exit event. */
     316        = DBGFEVENT_INSTR_SVM_CLGI,
     317    DBGFEVENT_INSTR_LAST            /**< Instruction: The last instruction event.   */
     318        = DBGFEVENT_INSTR_SVM_LAST,
     319    /** @} */
     320
     321
     322    /** @name VM exit events.
     323     * VM exits events for VT-x and AMD-V execution mode.  Many of the VM exits
     324     * behind these events are also directly translated into instruction events, but
     325     * the difference here is that the exit events will not try provoke the exits.
     326     * @{ */
     327    DBGFEVENT_EXIT_FIRST,               /**< The first VM exit event. */
     328    DBGFEVENT_EXIT_TASK_SWITCH          /**< Exit: Task switch. */
     329        = DBGFEVENT_EXIT_FIRST,
     330    DBGFEVENT_EXIT_HALT,                /**< Exit: HALT instruction. */
     331    DBGFEVENT_EXIT_MWAIT,               /**< Exit: MWAIT instruction. */
     332    DBGFEVENT_EXIT_MONITOR,             /**< Exit: MONITOR instruction. */
     333    DBGFEVENT_EXIT_CPUID,               /**< Exit: CPUID instruction (missing stuff in raw-mode). */
     334    DBGFEVENT_EXIT_INVD,                /**< Exit: INVD instruction. */
     335    DBGFEVENT_EXIT_WBINVD,              /**< Exit: WBINVD instruction. */
     336    DBGFEVENT_EXIT_INVLPG,              /**< Exit: INVLPG instruction. */
     337    DBGFEVENT_EXIT_RDTSC,               /**< Exit: RDTSC instruction. */
     338    DBGFEVENT_EXIT_RDTSCP,              /**< Exit: RDTSCP instruction. */
     339    DBGFEVENT_EXIT_RDPMC,               /**< Exit: RDPMC instruction. */
     340    DBGFEVENT_EXIT_RDMSR,               /**< Exit: RDMSR instruction. */
     341    DBGFEVENT_EXIT_WRMSR,               /**< Exit: WRMSR instruction. */
     342    DBGFEVENT_EXIT_CRX_READ,            /**< Exit: CRx read instruction (missing smsw in raw-mode, and reads in  general in VT-x). */
     343    DBGFEVENT_EXIT_CRX_WRITE,           /**< Exit: CRx write instruction. */
     344    DBGFEVENT_EXIT_DRX_READ,            /**< Exit: DRx read instruction. */
     345    DBGFEVENT_EXIT_DRX_WRITE,           /**< Exit: DRx write instruction. */
     346    DBGFEVENT_EXIT_PAUSE,               /**< Exit: PAUSE instruction (not in raw-mode). */
     347    DBGFEVENT_EXIT_XSETBV,              /**< Exit: XSETBV instruction. */
     348    DBGFEVENT_EXIT_SIDT,                /**< Exit: SIDT instruction. */
     349    DBGFEVENT_EXIT_LIDT,                /**< Exit: LIDT instruction. */
     350    DBGFEVENT_EXIT_SGDT,                /**< Exit: SGDT instruction. */
     351    DBGFEVENT_EXIT_LGDT,                /**< Exit: LGDT instruction. */
     352    DBGFEVENT_EXIT_SLDT,                /**< Exit: SLDT instruction. */
     353    DBGFEVENT_EXIT_LLDT,                /**< Exit: LLDT instruction. */
     354    DBGFEVENT_EXIT_STR,                 /**< Exit: STR instruction. */
     355    DBGFEVENT_EXIT_LTR,                 /**< Exit: LTR instruction. */
     356    DBGFEVENT_EXIT_GETSEC,              /**< Exit: GETSEC instruction. */
     357    DBGFEVENT_EXIT_RSM,                 /**< Exit: RSM instruction. */
     358    DBGFEVENT_EXIT_RDRAND,              /**< Exit: RDRAND instruction. */
     359    DBGFEVENT_EXIT_RDSEED,              /**< Exit: RDSEED instruction. */
     360    DBGFEVENT_EXIT_XSAVES,              /**< Exit: XSAVES instruction. */
     361    DBGFEVENT_EXIT_XRSTORS,             /**< Exit: XRSTORS instruction. */
     362    DBGFEVENT_EXIT_VMM_CALL,            /**< Exit: VMCALL (intel) or VMMCALL (AMD) instruction. */
     363    DBGFEVENT_EXIT_LAST_COMMON          /**< Exit: the last common event. */
     364        = DBGFEVENT_EXIT_VMM_CALL,
     365    DBGFEVENT_EXIT_VMX_FIRST,           /**< Exit: VT-x - First. */
     366    DBGFEVENT_EXIT_VMX_VMCLEAR          /**< Exit: VT-x VMCLEAR instruction. */
     367        = DBGFEVENT_EXIT_VMX_FIRST,
     368    DBGFEVENT_EXIT_VMX_VMLAUNCH,        /**< Exit: VT-x VMLAUNCH instruction. */
     369    DBGFEVENT_EXIT_VMX_VMPTRLD,         /**< Exit: VT-x VMPTRLD instruction. */
     370    DBGFEVENT_EXIT_VMX_VMPTRST,         /**< Exit: VT-x VMPTRST instruction. */
     371    DBGFEVENT_EXIT_VMX_VMREAD,          /**< Exit: VT-x VMREAD instruction. */
     372    DBGFEVENT_EXIT_VMX_VMRESUME,        /**< Exit: VT-x VMRESUME instruction. */
     373    DBGFEVENT_EXIT_VMX_VMWRITE,         /**< Exit: VT-x VMWRITE instruction. */
     374    DBGFEVENT_EXIT_VMX_VMXOFF,          /**< Exit: VT-x VMXOFF instruction. */
     375    DBGFEVENT_EXIT_VMX_VMXON,           /**< Exit: VT-x VMXON instruction. */
     376    DBGFEVENT_EXIT_VMX_VMFUNC,          /**< Exit: VT-x VMFUNC instruction. */
     377    DBGFEVENT_EXIT_VMX_INVEPT,          /**< Exit: VT-x INVEPT instruction. */
     378    DBGFEVENT_EXIT_VMX_INVVPID,         /**< Exit: VT-x INVVPID instruction. */
     379    DBGFEVENT_EXIT_VMX_INVPCID,         /**< Exit: VT-x INVPCID instruction. */
     380    DBGFEVENT_EXIT_VMX_EPT_VIOLATION,   /**< Exit: VT-x EPT violation. */
     381    DBGFEVENT_EXIT_VMX_EPT_MISCONFIG,   /**< Exit: VT-x EPT misconfiguration. */
     382    DBGFEVENT_EXIT_VMX_VAPIC_ACCESS,    /**< Exit: VT-x Virtual APIC page access. */
     383    DBGFEVENT_EXIT_VMX_VAPIC_WRITE,     /**< Exit: VT-x Virtual APIC write. */
     384    DBGFEVENT_EXIT_VMX_LAST             /**< Exit: VT-x - Last. */
     385        = DBGFEVENT_EXIT_VMX_VAPIC_WRITE,
     386    DBGFEVENT_EXIT_SVM_FIRST,           /**< Exit: AMD-V - first */
     387    DBGFEVENT_EXIT_SVM_VMRUN            /**< Exit: AMD-V VMRUN instruction. */
     388        = DBGFEVENT_EXIT_SVM_FIRST,
     389    DBGFEVENT_EXIT_SVM_VMLOAD,          /**< Exit: AMD-V VMLOAD instruction. */
     390    DBGFEVENT_EXIT_SVM_VMSAVE,          /**< Exit: AMD-V VMSAVE instruction. */
     391    DBGFEVENT_EXIT_SVM_STGI,            /**< Exit: AMD-V STGI instruction. */
     392    DBGFEVENT_EXIT_SVM_CLGI,            /**< Exit: AMD-V CLGI instruction. */
     393    DBGFEVENT_EXIT_SVM_LAST             /**< Exit: The last ADM-V VM exit event. */
     394        = DBGFEVENT_EXIT_SVM_CLGI,
     395    DBGFEVENT_EXIT_LAST                 /**< Exit: The last VM exit event. */
     396        = DBGFEVENT_EXIT_SVM_LAST,
     397    /** @} */
     398
     399
    242400    /** Access to an unassigned I/O port.
    243401     * @todo not yet implemented. */
     
    252410     * @todo not yet implemented.  */
    253411    DBGFEVENT_MEMORY_ROM_WRITE,
    254 
    255     /** The first VM exit event. */
    256     DBGFEVENT_EXIT_FIRST,
    257     /** Exit - Task switch.
    258      * @todo not yet implemented.  */
    259     DBGFEVENT_EXIT_TASK_SWITCH = DBGFEVENT_EXIT_FIRST,
    260     /** Exit - HALT instruction.
    261      * @todo not yet implemented.  */
    262     DBGFEVENT_EXIT_HALT,
    263     /** Exit - MWAIT instruction.
    264      * @todo not yet implemented.  */
    265     DBGFEVENT_EXIT_MWAIT,
    266     /** Exit - MONITOR instruction.
    267      * @todo not yet implemented.  */
    268     DBGFEVENT_EXIT_MONITOR,
    269     /** Exit - CPUID instruction (missing stuff in raw-mode).
    270      * @todo not yet implemented.  */
    271     DBGFEVENT_EXIT_CPUID,
    272     /** Exit - INVD instruction.
    273      * @todo not yet implemented.  */
    274     DBGFEVENT_EXIT_INVD,
    275     /** Exit - WBINVD instruction.
    276      * @todo not yet implemented.  */
    277     DBGFEVENT_EXIT_WBINVD,
    278     /** Exit - INVLPG instruction.
    279      * @todo not yet implemented.  */
    280     DBGFEVENT_EXIT_INVLPG,
    281     /** Exit - RDTSC instruction.
    282      * @todo not yet implemented.  */
    283     DBGFEVENT_EXIT_RDTSC,
    284     /** Exit - RDTSCP instruction.
    285      * @todo not yet implemented.  */
    286     DBGFEVENT_EXIT_RDTSCP,
    287     /** Exit - RDPMC instruction.
    288      * @todo not yet implemented.  */
    289     DBGFEVENT_EXIT_RDPMC,
    290     /** Exit - RDMSR instruction.
    291      * @todo not yet implemented.  */
    292     DBGFEVENT_EXIT_RDMSR,
    293     /** Exit - WRMSR instruction.
    294      * @todo not yet implemented.  */
    295     DBGFEVENT_EXIT_WRMSR,
    296     /** Exit - CRx read instruction (missing smsw in raw-mode, and reads in
    297      *  general in VT-x).
    298      * @todo not yet implemented.  */
    299     DBGFEVENT_EXIT_CRX_READ,
    300     /** Exit - CRx write instruction.
    301      * @todo not yet implemented.  */
    302     DBGFEVENT_EXIT_CRX_WRITE,
    303     /** Exit - DRx read instruction.
    304      * @todo not yet implemented.  */
    305     DBGFEVENT_EXIT_DRX_READ,
    306     /** Exit - DRx write instruction.
    307      * @todo not yet implemented.  */
    308     DBGFEVENT_EXIT_DRX_WRITE,
    309     /** Exit - PAUSE instruction (not in raw-mode).
    310      * @todo not yet implemented.  */
    311     DBGFEVENT_EXIT_PAUSE,
    312     /** Exit - XSETBV instruction.
    313      * @todo not yet implemented.  */
    314     DBGFEVENT_EXIT_XSETBV,
    315     /** Exit - SIDT instruction.
    316      * @todo not yet implemented.  */
    317     DBGFEVENT_EXIT_SIDT,
    318     /** Exit - LIDT instruction.
    319      * @todo not yet implemented.  */
    320     DBGFEVENT_EXIT_LIDT,
    321     /** Exit - SGDT instruction.
    322      * @todo not yet implemented.  */
    323     DBGFEVENT_EXIT_SGDT,
    324     /** Exit - LGDT instruction.
    325      * @todo not yet implemented.  */
    326     DBGFEVENT_EXIT_LGDT,
    327     /** Exit - SLDT instruction.
    328      * @todo not yet implemented.  */
    329     DBGFEVENT_EXIT_SLDT,
    330     /** Exit - LLDT instruction.
    331      * @todo not yet implemented.  */
    332     DBGFEVENT_EXIT_LLDT,
    333     /** Exit - STR instruction.
    334      * @todo not yet implemented.  */
    335     DBGFEVENT_EXIT_STR,
    336     /** Exit - LTR instruction.
    337      * @todo not yet implemented.  */
    338     DBGFEVENT_EXIT_LTR,
    339     /** Exit - GETSEC instruction.
    340      * @todo not yet implemented.  */
    341     DBGFEVENT_EXIT_GETSEC,
    342     /** Exit - RSM instruction.
    343      * @todo not yet implemented.  */
    344     DBGFEVENT_EXIT_RSM,
    345     /** Exit - RDRAND instruction.
    346      * @todo not yet implemented.  */
    347     DBGFEVENT_EXIT_RDRAND,
    348     /** Exit - RDSEED instruction.
    349      * @todo not yet implemented.  */
    350     DBGFEVENT_EXIT_RDSEED,
    351     /** Exit - XSAVES instruction.
    352      * @todo not yet implemented.  */
    353     DBGFEVENT_EXIT_XSAVES,
    354     /** Exit - XRSTORS instruction.
    355      * @todo not yet implemented.  */
    356     DBGFEVENT_EXIT_XRSTORS,
    357     /** Exit - VMCALL (intel) or VMMCALL (AMD) instruction.
    358      * @todo not yet implemented.  */
    359     DBGFEVENT_EXIT_VMM_CALL,
    360     /** Exit - the last common event. */
    361     DBGFEVENT_EXIT_LAST_COMMON = DBGFEVENT_EXIT_VMM_CALL,
    362 
    363     /** Exit - VT-x - First. */
    364     DBGFEVENT_EXIT_VMX_FIRST,
    365     /** Exit - VT-x VMCLEAR instruction.
    366      * @todo not yet implemented.  */
    367     DBGFEVENT_EXIT_VMX_VMCLEAR = DBGFEVENT_EXIT_VMX_FIRST,
    368     /** Exit - VT-x VMLAUNCH instruction.
    369      * @todo not yet implemented.  */
    370     DBGFEVENT_EXIT_VMX_VMLAUNCH,
    371     /** Exit - VT-x VMPTRLD instruction.
    372      * @todo not yet implemented.  */
    373     DBGFEVENT_EXIT_VMX_VMPTRLD,
    374     /** Exit - VT-x VMPTRST instruction.
    375      * @todo not yet implemented.  */
    376     DBGFEVENT_EXIT_VMX_VMPTRST,
    377     /** Exit - VT-x VMREAD instruction.
    378      * @todo not yet implemented.  */
    379     DBGFEVENT_EXIT_VMX_VMREAD,
    380     /** Exit - VT-x VMRESUME instruction.
    381      * @todo not yet implemented.  */
    382     DBGFEVENT_EXIT_VMX_VMRESUME,
    383     /** Exit - VT-x VMWRITE instruction.
    384      * @todo not yet implemented.  */
    385     DBGFEVENT_EXIT_VMX_VMWRITE,
    386     /** Exit - VT-x VMXOFF instruction.
    387      * @todo not yet implemented.  */
    388     DBGFEVENT_EXIT_VMX_VMXOFF,
    389     /** Exit - VT-x VMXON instruction.
    390      * @todo not yet implemented.  */
    391     DBGFEVENT_EXIT_VMX_VMXON,
    392     /** Exit - VT-x VMFUNC instruction.
    393      * @todo not yet implemented.  */
    394     DBGFEVENT_EXIT_VMX_VMFUNC,
    395     /** Exit - VT-x INVEPT instruction.
    396      * @todo not yet implemented.  */
    397     DBGFEVENT_EXIT_VMX_INVEPT,
    398     /** Exit - VT-x INVVPID instruction.
    399      * @todo not yet implemented.  */
    400     DBGFEVENT_EXIT_VMX_INVVPID,
    401     /** Exit - VT-x INVPCID instruction.
    402      * @todo not yet implemented.  */
    403     DBGFEVENT_EXIT_VMX_INVPCID,
    404     /** Exit - VT-x EPT violation. */
    405     DBGFEVENT_EXIT_VMX_EPT_VIOLATION,
    406     /** Exit - VT-x EPT misconfiguration. */
    407     DBGFEVENT_EXIT_VMX_EPT_MISCONFIG,
    408     /** Exit - VT-x Virtual APIC page access. */
    409     DBGFEVENT_EXIT_VMX_VAPIC_ACCESS,
    410     /** Exit - VT-x Virtual APIC write. */
    411     DBGFEVENT_EXIT_VMX_VAPIC_WRITE,
    412     /** Exit - VT-x - Last. */
    413     DBGFEVENT_EXIT_VMX_LAST = DBGFEVENT_EXIT_VMX_VAPIC_WRITE,
    414 
    415     /** Exit - AMD-V - first */
    416     DBGFEVENT_EXIT_SVM_FIRST,
    417     /** Exit - AMD-V VMRUN instruction.
    418      * @todo not yet implemented.  */
    419     DBGFEVENT_EXIT_SVM_VMRUN = DBGFEVENT_EXIT_SVM_FIRST,
    420     /** Exit - AMD-V VMLOAD instruction.
    421      * @todo not yet implemented.  */
    422     DBGFEVENT_EXIT_SVM_VMLOAD,
    423     /** Exit - AMD-V VMSAVE instruction.
    424      * @todo not yet implemented.  */
    425     DBGFEVENT_EXIT_SVM_VMSAVE,
    426     /** Exit - AMD-V STGI instruction.
    427      * @todo not yet implemented.  */
    428     DBGFEVENT_EXIT_SVM_STGI,
    429     /** Exit - AMD-V CLGI instruction.
    430      * @todo not yet implemented.  */
    431     DBGFEVENT_EXIT_SVM_CLGI,
    432     /** The last ADM-V VM exit event. */
    433     DBGFEVENT_EXIT_SVM_LAST = DBGFEVENT_EXIT_SVM_CLGI,
    434 
    435     /** The last VM exit event. */
    436     DBGFEVENT_EXIT_LAST = DBGFEVENT_EXIT_SVM_LAST,
    437412
    438413
  • trunk/src/VBox/VMM/VBoxVMM.d

    r58998 r59004  
    6060
    6161
     62    /** @name CPU Exception probes
     63     * These probes will intercept guest CPU exceptions as best we
     64     * can.  In some execution modes some of these probes may also
     65     * see non-guest exceptions as we don't try distiguish between
     66     * virtualization and guest exceptions before firing the probes.
     67     *
     68     * Using these probes may have a performance impact on guest
     69     * activities involving lots of exceptions.
     70     * @{
     71     */
    6272    /** \#DE - integer divide error.  */
    6373    probe xcpt__de(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     
    96106    /** \#SX - security exception.  */
    97107    probe xcpt__sx(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint32_t a_uErr);
    98 
    99     /** Software interrupt (INT XXh). */
     108    /** @} */
     109
     110
     111    /** Software interrupt (INT XXh).
     112     * It may be very difficult to implement this probe when using hardware
     113     * virtualization, so maybe we have to drop it... */
    100114    probe int__software(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iInterrupt);
    101     /** Hardware interrupt being dispatched. */
     115    /** Hardware interrupt being dispatched.
     116     *
     117     * Relates to pdm__irq__get ...
     118     */
    102119    probe int__hardware(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iInterrupt, uint32_t a_uTag, uint32_t a_idSource);
    103120
    104     /** Exit - Task switch. */
     121    /** @name Instruction probes
     122     * These are instructions normally related to VM exits.  These
     123     * probes differs from the exit probes in that we will try make
     124     * these instructions cause exits and fire the probe whenever
     125     * they are executed by the guest.  This means some of these
     126     * probes will have a noticable performance impact (like
     127     * instr__pause).
     128     * @{ */
     129    /** Instruction: HALT */
     130    probe instr__halt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     131    /** Instruction: MWAIT */
     132    probe instr__mwait(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     133    /** Instruction: MONITOR */
     134    probe instr__monitor(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     135    /** Instruction: CPUID instruction (missing stuff in raw-mode). */
     136    probe instr__cpuid(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint32_t uLeaf, uint32_t uSubLeaf);
     137    /** Instruction: INVD  */
     138    probe instr__invd(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     139    /** Instruction: WBINVD */
     140    probe instr__wbinvd(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     141    /** Instruction: INVLPG */
     142    probe instr__invlpg(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     143    /** Instruction: RDTSC  */
     144    probe instr__rdtsc(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     145    /** Instruction: RDTSCP */
     146    probe instr__rdtscp(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     147    /** Instruction: RDPMC  */
     148    probe instr__rdpmc(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     149    /** Instruction: RDMSR  */
     150    probe instr__rdmsr(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint32_t a_idMsr);
     151    /** Instruction: WRMSR  */
     152    probe instr__wrmsr(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint32_t a_idMsr, uint64_t a_uValue);
     153    /** Instruction: CRx read instruction (missing smsw in raw-mode,
     154     *  and reads in general in VT-x). */
     155    probe instr__crx__read(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iReg);
     156    /** Instruction: CRx write instruction. */
     157    probe instr__crx__write(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iReg);
     158    /** Instruction: DRx read instruction. */
     159    probe instr__drx__read(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iReg);
     160    /** Instruction: DRx write instruction. */
     161    probe instr__drx__write(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iReg);
     162    /** Instruction: PAUSE instruction (not in raw-mode). */
     163    probe instr__pause(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     164    /** Instruction: XSETBV */
     165    probe instr__xsetbv(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     166    /** Instruction: SIDT  */
     167    probe instr__sidt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     168    /** Instruction: LIDT */
     169    probe instr__lidt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     170    /** Instruction: SGDT */
     171    probe instr__sgdt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     172    /** Instruction: LGDT */
     173    probe instr__lgdt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     174    /** Instruction: SLDT */
     175    probe instr__sldt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     176    /** Instruction: LLDT */
     177    probe instr__lldt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     178    /** Instruction: STR */
     179    probe instr__str(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     180    /** Instruction: LTR */
     181    probe instr__ltr(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     182    /** Instruction: GETSEC */
     183    probe instr__getsec(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     184    /** Instruction: RSM */
     185    probe instr__rsm(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     186    /** Instruction: RDRAND */
     187    probe instr__rdrand(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     188    /** Instruction: RDSEED */
     189    probe instr__rdseed(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     190    /** Instruction: XSAVES */
     191    probe instr__xsaves(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     192    /** Instruction: XRSTORS  */
     193    probe instr__xrstors(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     194    /** Instruction: VMCALL (intel) or VMMCALL (AMD) instruction. */
     195    probe instr__vmm__call(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     196
     197    /** Instruction: VT-x VMCLEAR instruction. */
     198    probe instr__vmx__vmclear(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     199    /** Instruction: VT-x VMLAUNCH */
     200    probe instr__vmx__vmlaunch(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     201    /** Instruction: VT-x VMPTRLD */
     202    probe instr__vmx__vmptrld(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     203    /** Instruction: VT-x VMPTRST */
     204    probe instr__vmx__vmptrst(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     205    /** Instruction: VT-x VMREAD */
     206    probe instr__vmx__vmread(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     207    /** Instruction: VT-x VMRESUME */
     208    probe instr__vmx__vmresume(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     209    /** Instruction: VT-x VMWRITE */
     210    probe instr__vmx__vmwrite(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     211    /** Instruction: VT-x VMXOFF */
     212    probe instr__vmx__vmxoff(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     213    /** Instruction: VT-x VMXON */
     214    probe instr__vmx__vmxon(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     215    /** Instruction: VT-x VMFUNC */
     216    probe instr__vmx__vmfunc(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     217    /** Instruction: VT-x INVEPT */
     218    probe instr__vmx__invept(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     219    /** Instruction: VT-x INVVPID */
     220    probe instr__vmx__invvpid(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     221    /** Instruction: VT-x INVPCID */
     222    probe instr__vmx__invpcid(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     223
     224    /** Instruction: AMD-V VMRUN */
     225    probe instr__svm__vmrun(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     226    /** Instruction: AMD-V VMLOAD */
     227    probe instr__svm__vmload(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     228    /** Instruction: AMD-V VMSAVE */
     229    probe instr__svm__vmsave(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     230    /** Instruction: AMD-V STGI */
     231    probe instr__svm__stgi(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     232    /** Instruction: AMD-V CLGI */
     233    probe instr__svm__clgi(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     234    /** @} */
     235
     236
     237    /** @name VM exit probes
     238     * These are named exits with (in some cases at least) useful
     239     * information as arguments.  Unlike the instruction probes,
     240     * these will not change the number of VM exits and have much
     241     * less of an impact on VM performance.
     242     * @{ */
     243    /** VM Exit: Task switch. */
    105244    probe exit__task__switch(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    106     /** Exit - HALT instruction.
     245    /** VM Exit: HALT instruction.
    107246     * @todo not yet implemented. */
    108247    probe exit__halt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    109     /** Exit - MWAIT instruction. */
     248    /** VM Exit: MWAIT instruction. */
    110249    probe exit__mwait(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    111     /** Exit - MONITOR instruction. */
     250    /** VM Exit: MONITOR instruction. */
    112251    probe exit__monitor(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    113     /** Exit - CPUID instruction (missing stuff in raw-mode). */
     252    /** VM Exit: CPUID instruction (missing stuff in raw-mode). */
    114253    probe exit__cpuid(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint32_t uLeaf, uint32_t uSubLeaf);
    115     /** Exit - INVD instruction.  */
     254    /** VM Exit: INVD instruction.  */
    116255    probe exit__invd(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    117     /** Exit - WBINVD instruction. */
     256    /** VM Exit: WBINVD instruction. */
    118257    probe exit__wbinvd(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    119     /** Exit - INVLPG instruction. */
     258    /** VM Exit: INVLPG instruction. */
    120259    probe exit__invlpg(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    121     /** Exit - RDTSC instruction.  */
     260    /** VM Exit: RDTSC instruction.  */
    122261    probe exit__rdtsc(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    123     /** Exit - RDTSCP instruction. */
     262    /** VM Exit: RDTSCP instruction. */
    124263    probe exit__rdtscp(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    125     /** Exit - RDPMC instruction.  */
     264    /** VM Exit: RDPMC instruction.  */
    126265    probe exit__rdpmc(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    127     /** Exit - RDMSR instruction.  */
     266    /** VM Exit: RDMSR instruction.  */
    128267    probe exit__rdmsr(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint32_t a_idMsr);
    129     /** Exit - WRMSR instruction.  */
     268    /** VM Exit: WRMSR instruction.  */
    130269    probe exit__wrmsr(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint32_t a_idMsr, uint64_t a_uValue);
    131     /** Exit - CRx read instruction (missing smsw in raw-mode,
     270    /** VM Exit: CRx read instruction (missing smsw in raw-mode,
    132271     *  and reads in general in VT-x). */
    133272    probe exit__crx__read(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iReg);
    134     /** Exit - CRx write instruction. */
     273    /** VM Exit: CRx write instruction. */
    135274    probe exit__crx__write(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iReg);
    136     /** Exit - DRx read instruction. */
     275    /** VM Exit: DRx read instruction. */
    137276    probe exit__drx__read(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iReg);
    138     /** Exit - DRx write instruction. */
     277    /** VM Exit: DRx write instruction. */
    139278    probe exit__drx__write(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint8_t a_iReg);
    140     /** Exit - PAUSE instruction (not in raw-mode). */
     279    /** VM Exit: PAUSE instruction (not in raw-mode). */
    141280    probe exit__pause(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    142     /** Exit - XSETBV instruction. */
     281    /** VM Exit: XSETBV instruction. */
    143282    probe exit__xsetbv(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    144     /** Exit - SIDT instruction.  */
     283    /** VM Exit: SIDT instruction.  */
    145284    probe exit__sidt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    146     /** Exit - LIDT instruction. */
     285    /** VM Exit: LIDT instruction. */
    147286    probe exit__lidt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    148     /** Exit - SGDT instruction. */
     287    /** VM Exit: SGDT instruction. */
    149288    probe exit__sgdt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    150     /** Exit - LGDT instruction. */
     289    /** VM Exit: LGDT instruction. */
    151290    probe exit__lgdt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    152     /** Exit - SLDT instruction. */
     291    /** VM Exit: SLDT instruction. */
    153292    probe exit__sldt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    154     /** Exit - LLDT instruction. */
     293    /** VM Exit: LLDT instruction. */
    155294    probe exit__lldt(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    156     /** Exit - STR instruction. */
     295    /** VM Exit: STR instruction. */
    157296    probe exit__str(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    158     /** Exit - LTR instruction. */
     297    /** VM Exit: LTR instruction. */
    159298    probe exit__ltr(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    160     /** Exit - GETSEC instruction. */
     299    /** VM Exit: GETSEC instruction. */
    161300    probe exit__getsec(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    162     /** Exit - RSM instruction. */
     301    /** VM Exit: RSM instruction. */
    163302    probe exit__rsm(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    164     /** Exit - RDRAND instruction. */
     303    /** VM Exit: RDRAND instruction. */
    165304    probe exit__rdrand(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    166     /** Exit - RDSEED instruction. */
     305    /** VM Exit: RDSEED instruction. */
    167306    probe exit__rdseed(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    168     /** Exit - XSAVES instruction. */
     307    /** VM Exit: XSAVES instruction. */
    169308    probe exit__xsaves(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    170     /** Exit - XRSTORS instruction.  */
     309    /** VM Exit: XRSTORS instruction.  */
    171310    probe exit__xrstors(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    172     /** Exit - VMCALL (intel) or VMMCALL (AMD) instruction. */
     311    /** VM Exit: VMCALL (intel) or VMMCALL (AMD) instruction. */
    173312    probe exit__vmm__call(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    174313
    175     /** Exit - VT-x VMCLEAR instruction. */
     314    /** VM Exit: VT-x VMCLEAR instruction. */
    176315    probe exit__vmx__vmclear(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    177     /** Exit - VT-x VMLAUNCH instruction. */
     316    /** VM Exit: VT-x VMLAUNCH instruction. */
    178317    probe exit__vmx__vmlaunch(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    179     /** Exit - VT-x VMPTRLD instruction. */
     318    /** VM Exit: VT-x VMPTRLD instruction. */
    180319    probe exit__vmx__vmptrld(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    181     /** Exit - VT-x VMPTRST instruction. */
     320    /** VM Exit: VT-x VMPTRST instruction. */
    182321    probe exit__vmx__vmptrst(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    183     /** Exit - VT-x VMREAD instruction. */
     322    /** VM Exit: VT-x VMREAD instruction. */
    184323    probe exit__vmx__vmread(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    185     /** Exit - VT-x VMRESUME instruction. */
     324    /** VM Exit: VT-x VMRESUME instruction. */
    186325    probe exit__vmx__vmresume(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    187     /** Exit - VT-x VMWRITE instruction. */
     326    /** VM Exit: VT-x VMWRITE instruction. */
    188327    probe exit__vmx__vmwrite(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    189     /** Exit - VT-x VMXOFF instruction. */
     328    /** VM Exit: VT-x VMXOFF instruction. */
    190329    probe exit__vmx__vmxoff(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    191     /** Exit - VT-x VMXON instruction. */
     330    /** VM Exit: VT-x VMXON instruction. */
    192331    probe exit__vmx__vmxon(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    193     /** Exit - VT-x VMFUNC instruction. */
     332    /** VM Exit: VT-x VMFUNC instruction. */
    194333    probe exit__vmx__vmfunc(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    195     /** Exit - VT-x INVEPT instruction. */
     334    /** VM Exit: VT-x INVEPT instruction. */
    196335    probe exit__vmx__invept(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    197     /** Exit - VT-x INVVPID instruction. */
     336    /** VM Exit: VT-x INVVPID instruction. */
    198337    probe exit__vmx__invvpid(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    199     /** Exit - VT-x INVPCID instruction. */
     338    /** VM Exit: VT-x INVPCID instruction. */
    200339    probe exit__vmx__invpcid(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    201     /** Exit - VT-x EPT violation. */
     340    /** VM Exit: VT-x EPT violation. */
    202341    probe exit__vmx__ept__violation(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    203     /** Exit - VT-x EPT misconfiguration. */
     342    /** VM Exit: VT-x EPT misconfiguration. */
    204343    probe exit__vmx__ept__misconfig(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    205     /** Exit - VT-x Virtual APIC page access. */
     344    /** VM Exit: VT-x Virtual APIC page access. */
    206345    probe exit__vmx__vapic__access(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    207     /** Exit - VT-x Virtual APIC page write needing virtualizing. */
     346    /** VM Exit: VT-x Virtual APIC page write needing virtualizing. */
    208347    probe exit__vmx__vapic__write(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    209348
    210     /** Exit - AMD-V VMRUN instruction. */
     349    /** VM Exit: AMD-V VMRUN instruction. */
    211350    probe exit__svm__vmrun(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    212     /** Exit - AMD-V VMLOAD instruction. */
     351    /** VM Exit: AMD-V VMLOAD instruction. */
    213352    probe exit__svm__vmload(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    214     /** Exit - AMD-V VMSAVE instruction. */
     353    /** VM Exit: AMD-V VMSAVE instruction. */
    215354    probe exit__svm__vmsave(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    216     /** Exit - AMD-V STGI instruction. */
     355    /** VM Exit: AMD-V STGI instruction. */
    217356    probe exit__svm__stgi(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
    218     /** Exit - AMD-V CLGI instruction. */
     357    /** VM Exit: AMD-V CLGI instruction. */
    219358    probe exit__svm__clgi(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx);
     359    /** @} */
    220360};
    221361
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r59003 r59004  
    91459145    SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VAPIC_WRITE,     VMX_EXIT_APIC_WRITE);       /* feature dependent, nothing to enable here */
    91469146
    9147     SET_ONLY_XBM_IF_EITHER_EN(EXIT_CPUID,               VMX_EXIT_CPUID);            /* unconditional */
    9148     SET_ONLY_XBM_IF_EITHER_EN(EXIT_GETSEC,              VMX_EXIT_GETSEC);           /* unconditional */
    9149     SET_CPE1_XBM_IF_EITHER_EN(EXIT_HALT,                VMX_EXIT_HLT,      VMX_VMCS_CTRL_PROC_EXEC_HLT_EXIT); /* paranoia */
    9150     SET_ONLY_XBM_IF_EITHER_EN(EXIT_INVD,                VMX_EXIT_INVD);             /* unconditional */
    9151     SET_CPE1_XBM_IF_EITHER_EN(EXIT_INVLPG,              VMX_EXIT_INVLPG,   VMX_VMCS_CTRL_PROC_EXEC_INVLPG_EXIT);
    9152     SET_CPE1_XBM_IF_EITHER_EN(EXIT_RDPMC,               VMX_EXIT_RDPMC,    VMX_VMCS_CTRL_PROC_EXEC_RDPMC_EXIT);
    9153     SET_CPE1_XBM_IF_EITHER_EN(EXIT_RDTSC,               VMX_EXIT_RDTSC,    VMX_VMCS_CTRL_PROC_EXEC_RDTSC_EXIT);
    9154     SET_ONLY_XBM_IF_EITHER_EN(EXIT_RSM,                 VMX_EXIT_RSM);              /* unconditional */
    9155     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMM_CALL,            VMX_EXIT_VMCALL);           /* unconditional */
    9156     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMCLEAR,         VMX_EXIT_VMCLEAR);          /* unconditional */
    9157     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMLAUNCH,        VMX_EXIT_VMLAUNCH);         /* unconditional */
    9158     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMPTRLD,         VMX_EXIT_VMPTRLD);          /* unconditional */
    9159     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMPTRST,         VMX_EXIT_VMPTRST);          /* unconditional */
    9160     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMREAD,          VMX_EXIT_VMREAD);           /* unconditional */
    9161     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMRESUME,        VMX_EXIT_VMRESUME);         /* unconditional */
    9162     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMWRITE,         VMX_EXIT_VMWRITE);          /* unconditional */
    9163     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMXOFF,          VMX_EXIT_VMXOFF);           /* unconditional */
    9164     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMXON,           VMX_EXIT_VMXON);            /* unconditional */
    9165 
    9166     if (   IS_EITHER_ENABLED(pVM, EXIT_CRX_READ)
    9167         || IS_EITHER_ENABLED(pVM, EXIT_CRX_WRITE))
     9147    SET_ONLY_XBM_IF_EITHER_EN(INSTR_CPUID,              VMX_EXIT_CPUID);            /* unconditional */
     9148    SET_ONLY_XBM_IF_EITHER_EN( EXIT_CPUID,              VMX_EXIT_CPUID);
     9149    SET_ONLY_XBM_IF_EITHER_EN(INSTR_GETSEC,             VMX_EXIT_GETSEC);           /* unconditional */
     9150    SET_ONLY_XBM_IF_EITHER_EN( EXIT_GETSEC,             VMX_EXIT_GETSEC);
     9151    SET_CPE1_XBM_IF_EITHER_EN(INSTR_HALT,               VMX_EXIT_HLT,      VMX_VMCS_CTRL_PROC_EXEC_HLT_EXIT); /* paranoia */
     9152    SET_ONLY_XBM_IF_EITHER_EN( EXIT_HALT,               VMX_EXIT_HLT);
     9153    SET_ONLY_XBM_IF_EITHER_EN(INSTR_INVD,               VMX_EXIT_INVD);             /* unconditional */
     9154    SET_ONLY_XBM_IF_EITHER_EN( EXIT_INVD,               VMX_EXIT_INVD);
     9155    SET_CPE1_XBM_IF_EITHER_EN(INSTR_INVLPG,             VMX_EXIT_INVLPG,   VMX_VMCS_CTRL_PROC_EXEC_INVLPG_EXIT);
     9156    SET_ONLY_XBM_IF_EITHER_EN( EXIT_INVLPG,             VMX_EXIT_INVLPG);
     9157    SET_CPE1_XBM_IF_EITHER_EN(INSTR_RDPMC,              VMX_EXIT_RDPMC,    VMX_VMCS_CTRL_PROC_EXEC_RDPMC_EXIT);
     9158    SET_ONLY_XBM_IF_EITHER_EN( EXIT_RDPMC,              VMX_EXIT_RDPMC);
     9159    SET_CPE1_XBM_IF_EITHER_EN(INSTR_RDTSC,              VMX_EXIT_RDTSC,    VMX_VMCS_CTRL_PROC_EXEC_RDTSC_EXIT);
     9160    SET_ONLY_XBM_IF_EITHER_EN( EXIT_RDTSC,              VMX_EXIT_RDTSC);
     9161    SET_ONLY_XBM_IF_EITHER_EN(INSTR_RSM,                VMX_EXIT_RSM);              /* unconditional */
     9162    SET_ONLY_XBM_IF_EITHER_EN( EXIT_RSM,                VMX_EXIT_RSM);
     9163    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMM_CALL,           VMX_EXIT_VMCALL);           /* unconditional */
     9164    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMM_CALL,           VMX_EXIT_VMCALL);
     9165    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMCLEAR,        VMX_EXIT_VMCLEAR);          /* unconditional */
     9166    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMCLEAR,        VMX_EXIT_VMCLEAR);
     9167    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMLAUNCH,       VMX_EXIT_VMLAUNCH);         /* unconditional */
     9168    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMLAUNCH,       VMX_EXIT_VMLAUNCH);
     9169    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMPTRLD,        VMX_EXIT_VMPTRLD);          /* unconditional */
     9170    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMPTRLD,        VMX_EXIT_VMPTRLD);
     9171    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMPTRST,        VMX_EXIT_VMPTRST);          /* unconditional */
     9172    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMPTRST,        VMX_EXIT_VMPTRST);
     9173    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMREAD,         VMX_EXIT_VMREAD);           /* unconditional */
     9174    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMREAD,         VMX_EXIT_VMREAD);
     9175    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMRESUME,       VMX_EXIT_VMRESUME);         /* unconditional */
     9176    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMRESUME,       VMX_EXIT_VMRESUME);
     9177    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMWRITE,        VMX_EXIT_VMWRITE);          /* unconditional */
     9178    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMWRITE,        VMX_EXIT_VMWRITE);
     9179    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMXOFF,         VMX_EXIT_VMXOFF);           /* unconditional */
     9180    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMXOFF,         VMX_EXIT_VMXOFF);
     9181    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMXON,          VMX_EXIT_VMXON);            /* unconditional */
     9182    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMXON,          VMX_EXIT_VMXON);
     9183
     9184    if (   IS_EITHER_ENABLED(pVM, INSTR_CRX_READ)
     9185        || IS_EITHER_ENABLED(pVM, INSTR_CRX_WRITE))
    91689186    {
    91699187        int rc2 = hmR0VmxSaveGuestCR0(pVCpu, pCtx);
     
    91769194        pDbgState->fClearCr4Mask = true;
    91779195#endif
    9178         if (IS_EITHER_ENABLED(pVM, EXIT_CRX_READ))
     9196        if (IS_EITHER_ENABLED(pVM, INSTR_CRX_READ))
    91799197            pDbgState->fCpe1Extra |= VMX_VMCS_CTRL_PROC_EXEC_CR3_STORE_EXIT | VMX_VMCS_CTRL_PROC_EXEC_CR8_STORE_EXIT;
    9180         if (IS_EITHER_ENABLED(pVM, EXIT_CRX_WRITE))
     9198        if (IS_EITHER_ENABLED(pVM, INSTR_CRX_WRITE))
    91819199            pDbgState->fCpe1Extra |= VMX_VMCS_CTRL_PROC_EXEC_CR3_LOAD_EXIT | VMX_VMCS_CTRL_PROC_EXEC_CR8_LOAD_EXIT;
    91829200        pDbgState->fCpe1Unwanted |= VMX_VMCS_CTRL_PROC_EXEC_USE_TPR_SHADOW; /* risky? */
     
    91989216        }
    91999217    }
    9200 
    9201     if (   IS_EITHER_ENABLED(pVM, EXIT_DRX_READ)
    9202         || IS_EITHER_ENABLED(pVM, EXIT_DRX_WRITE))
     9218    SET_ONLY_XBM_IF_EITHER_EN( EXIT_CRX_READ,           VMX_EXIT_MOV_CRX);
     9219    SET_ONLY_XBM_IF_EITHER_EN( EXIT_CRX_WRITE,          VMX_EXIT_MOV_CRX);
     9220
     9221    if (   IS_EITHER_ENABLED(pVM, INSTR_DRX_READ)
     9222        || IS_EITHER_ENABLED(pVM, INSTR_DRX_WRITE))
    92039223    {
    92049224        /** @todo later, need to fix handler as it assumes this won't usually happen. */
    92059225        ASMBitSet(pDbgState->bmExitsToCheck, VMX_EXIT_MOV_DRX);
    92069226    }
    9207 
    9208     SET_CPEU_XBM_IF_EITHER_EN(EXIT_RDMSR,               VMX_EXIT_RDMSR,     VMX_VMCS_CTRL_PROC_EXEC_USE_MSR_BITMAPS); /* risky clearing this? */
    9209     SET_CPEU_XBM_IF_EITHER_EN(EXIT_WRMSR,               VMX_EXIT_WRMSR,     VMX_VMCS_CTRL_PROC_EXEC_USE_MSR_BITMAPS);
    9210     SET_CPE1_XBM_IF_EITHER_EN(EXIT_MWAIT,               VMX_EXIT_MWAIT,     VMX_VMCS_CTRL_PROC_EXEC_MWAIT_EXIT);   /* parnoia */
    9211     SET_CPE1_XBM_IF_EITHER_EN(EXIT_MONITOR,             VMX_EXIT_MONITOR,   VMX_VMCS_CTRL_PROC_EXEC_MONITOR_EXIT); /* parnoia */
     9227    SET_ONLY_XBM_IF_EITHER_EN( EXIT_DRX_READ,           VMX_EXIT_MOV_DRX);
     9228    SET_ONLY_XBM_IF_EITHER_EN( EXIT_DRX_WRITE,          VMX_EXIT_MOV_DRX);
     9229
     9230    SET_CPEU_XBM_IF_EITHER_EN(INSTR_RDMSR,               VMX_EXIT_RDMSR,     VMX_VMCS_CTRL_PROC_EXEC_USE_MSR_BITMAPS); /* risky clearing this? */
     9231    SET_ONLY_XBM_IF_EITHER_EN( EXIT_RDMSR,               VMX_EXIT_RDMSR);
     9232    SET_CPEU_XBM_IF_EITHER_EN(INSTR_WRMSR,               VMX_EXIT_WRMSR,     VMX_VMCS_CTRL_PROC_EXEC_USE_MSR_BITMAPS);
     9233    SET_ONLY_XBM_IF_EITHER_EN( EXIT_WRMSR,               VMX_EXIT_WRMSR);
     9234    SET_CPE1_XBM_IF_EITHER_EN(INSTR_MWAIT,               VMX_EXIT_MWAIT,     VMX_VMCS_CTRL_PROC_EXEC_MWAIT_EXIT);   /* parnoia */
     9235    SET_ONLY_XBM_IF_EITHER_EN( EXIT_MWAIT,               VMX_EXIT_MWAIT);
     9236    SET_CPE1_XBM_IF_EITHER_EN(INSTR_MONITOR,             VMX_EXIT_MONITOR,   VMX_VMCS_CTRL_PROC_EXEC_MONITOR_EXIT); /* parnoia */
     9237    SET_ONLY_XBM_IF_EITHER_EN( EXIT_MONITOR,             VMX_EXIT_MONITOR);
    92129238#if 0 /** @todo too slow, fix handler. */
    9213     SET_CPE1_XBM_IF_EITHER_EN(EXIT_PAUSE,               VMX_EXIT_PAUSE,     VMX_VMCS_CTRL_PROC_EXEC_PAUSE_EXIT);
     9239    SET_CPE1_XBM_IF_EITHER_EN(INSTR_PAUSE,               VMX_EXIT_PAUSE,     VMX_VMCS_CTRL_PROC_EXEC_PAUSE_EXIT);
    92149240#endif
    9215 
    9216     if (   IS_EITHER_ENABLED(pVM, EXIT_SGDT)
    9217         || IS_EITHER_ENABLED(pVM, EXIT_SIDT)
    9218         || IS_EITHER_ENABLED(pVM, EXIT_LGDT)
    9219         || IS_EITHER_ENABLED(pVM, EXIT_LIDT))
     9241    SET_ONLY_XBM_IF_EITHER_EN( EXIT_PAUSE,               VMX_EXIT_PAUSE);
     9242
     9243    if (   IS_EITHER_ENABLED(pVM, INSTR_SGDT)
     9244        || IS_EITHER_ENABLED(pVM, INSTR_SIDT)
     9245        || IS_EITHER_ENABLED(pVM, INSTR_LGDT)
     9246        || IS_EITHER_ENABLED(pVM, INSTR_LIDT))
    92209247    {
    92219248        pDbgState->fCpe2Extra |= VMX_VMCS_CTRL_PROC_EXEC2_DESCRIPTOR_TABLE_EXIT;
    92229249        ASMBitSet(pDbgState->bmExitsToCheck, VMX_EXIT_XDTR_ACCESS);
    92239250    }
    9224 
    9225     if (   IS_EITHER_ENABLED(pVM, EXIT_SLDT)
    9226         || IS_EITHER_ENABLED(pVM, EXIT_STR)
    9227         || IS_EITHER_ENABLED(pVM, EXIT_LLDT)
    9228         || IS_EITHER_ENABLED(pVM, EXIT_LTR))
     9251    SET_ONLY_XBM_IF_EITHER_EN( EXIT_SGDT,               VMX_EXIT_XDTR_ACCESS);
     9252    SET_ONLY_XBM_IF_EITHER_EN( EXIT_SIDT,               VMX_EXIT_XDTR_ACCESS);
     9253    SET_ONLY_XBM_IF_EITHER_EN( EXIT_LGDT,               VMX_EXIT_XDTR_ACCESS);
     9254    SET_ONLY_XBM_IF_EITHER_EN( EXIT_LIDT,               VMX_EXIT_XDTR_ACCESS);
     9255
     9256    if (   IS_EITHER_ENABLED(pVM, INSTR_SLDT)
     9257        || IS_EITHER_ENABLED(pVM, INSTR_STR)
     9258        || IS_EITHER_ENABLED(pVM, INSTR_LLDT)
     9259        || IS_EITHER_ENABLED(pVM, INSTR_LTR))
    92299260    {
    92309261        pDbgState->fCpe2Extra |= VMX_VMCS_CTRL_PROC_EXEC2_DESCRIPTOR_TABLE_EXIT;
    92319262        ASMBitSet(pDbgState->bmExitsToCheck, VMX_EXIT_TR_ACCESS);
    92329263    }
    9233 
    9234     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_INVEPT,          VMX_EXIT_INVEPT);           /* unconditional */
    9235     SET_CPE1_XBM_IF_EITHER_EN(EXIT_RDTSCP,              VMX_EXIT_RDTSCP,    VMX_VMCS_CTRL_PROC_EXEC_RDTSC_EXIT);
    9236     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_INVVPID,         VMX_EXIT_INVVPID);          /* unconditional */
    9237     SET_CPE2_XBM_IF_EITHER_EN(EXIT_WBINVD,              VMX_EXIT_WBINVD,    VMX_VMCS_CTRL_PROC_EXEC2_WBINVD_EXIT);
    9238     SET_ONLY_XBM_IF_EITHER_EN(EXIT_XSETBV,              VMX_EXIT_XSETBV);           /* unconditional */
    9239     SET_CPE2_XBM_IF_EITHER_EN(EXIT_RDRAND,              VMX_EXIT_RDRAND,    VMX_VMCS_CTRL_PROC_EXEC2_RDRAND_EXIT);
    9240     SET_CPE1_XBM_IF_EITHER_EN(EXIT_VMX_INVPCID,         VMX_EXIT_INVPCID,   VMX_VMCS_CTRL_PROC_EXEC_INVLPG_EXIT);
    9241     SET_ONLY_XBM_IF_EITHER_EN(EXIT_VMX_VMFUNC,          VMX_EXIT_VMFUNC);           /* unconditional for the current setup */
    9242     SET_CPE2_XBM_IF_EITHER_EN(EXIT_RDSEED,              VMX_EXIT_RDSEED,    VMX_VMCS_CTRL_PROC_EXEC2_RDSEED_EXIT);
    9243     SET_ONLY_XBM_IF_EITHER_EN(EXIT_XSAVES,              VMX_EXIT_XSAVES);           /* unconditional (enabled by host, guest cfg) */
    9244     SET_ONLY_XBM_IF_EITHER_EN(EXIT_XRSTORS,             VMX_EXIT_XRSTORS);          /* unconditional (enabled by host, guest cfg) */
     9264    SET_ONLY_XBM_IF_EITHER_EN( EXIT_SLDT,               VMX_EXIT_TR_ACCESS);
     9265    SET_ONLY_XBM_IF_EITHER_EN( EXIT_STR,                VMX_EXIT_TR_ACCESS);
     9266    SET_ONLY_XBM_IF_EITHER_EN( EXIT_LLDT,               VMX_EXIT_TR_ACCESS);
     9267    SET_ONLY_XBM_IF_EITHER_EN( EXIT_LTR,                VMX_EXIT_TR_ACCESS);
     9268
     9269    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_INVEPT,         VMX_EXIT_INVEPT);           /* unconditional */
     9270    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_INVEPT,         VMX_EXIT_INVEPT);
     9271    SET_CPE1_XBM_IF_EITHER_EN(INSTR_RDTSCP,             VMX_EXIT_RDTSCP,    VMX_VMCS_CTRL_PROC_EXEC_RDTSC_EXIT);
     9272    SET_ONLY_XBM_IF_EITHER_EN( EXIT_RDTSCP,             VMX_EXIT_RDTSCP);
     9273    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_INVVPID,        VMX_EXIT_INVVPID);          /* unconditional */
     9274    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_INVVPID,        VMX_EXIT_INVVPID);
     9275    SET_CPE2_XBM_IF_EITHER_EN(INSTR_WBINVD,             VMX_EXIT_WBINVD,    VMX_VMCS_CTRL_PROC_EXEC2_WBINVD_EXIT);
     9276    SET_ONLY_XBM_IF_EITHER_EN( EXIT_WBINVD,             VMX_EXIT_WBINVD);
     9277    SET_ONLY_XBM_IF_EITHER_EN(INSTR_XSETBV,             VMX_EXIT_XSETBV);           /* unconditional */
     9278    SET_ONLY_XBM_IF_EITHER_EN( EXIT_XSETBV,             VMX_EXIT_XSETBV);
     9279    SET_CPE2_XBM_IF_EITHER_EN(INSTR_RDRAND,             VMX_EXIT_RDRAND,    VMX_VMCS_CTRL_PROC_EXEC2_RDRAND_EXIT);
     9280    SET_ONLY_XBM_IF_EITHER_EN( EXIT_RDRAND,             VMX_EXIT_RDRAND);
     9281    SET_CPE1_XBM_IF_EITHER_EN(INSTR_VMX_INVPCID,        VMX_EXIT_INVPCID,   VMX_VMCS_CTRL_PROC_EXEC_INVLPG_EXIT);
     9282    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_INVPCID,        VMX_EXIT_INVPCID);
     9283    SET_ONLY_XBM_IF_EITHER_EN(INSTR_VMX_VMFUNC,         VMX_EXIT_VMFUNC);           /* unconditional for the current setup */
     9284    SET_ONLY_XBM_IF_EITHER_EN( EXIT_VMX_VMFUNC,         VMX_EXIT_VMFUNC);
     9285    SET_CPE2_XBM_IF_EITHER_EN(INSTR_RDSEED,             VMX_EXIT_RDSEED,    VMX_VMCS_CTRL_PROC_EXEC2_RDSEED_EXIT);
     9286    SET_ONLY_XBM_IF_EITHER_EN( EXIT_RDSEED,             VMX_EXIT_RDSEED);
     9287    SET_ONLY_XBM_IF_EITHER_EN(INSTR_XSAVES,             VMX_EXIT_XSAVES);           /* unconditional (enabled by host, guest cfg) */
     9288    SET_ONLY_XBM_IF_EITHER_EN(EXIT_XSAVES,              VMX_EXIT_XSAVES);
     9289    SET_ONLY_XBM_IF_EITHER_EN(INSTR_XRSTORS,            VMX_EXIT_XRSTORS);          /* unconditional (enabled by host, guest cfg) */
     9290    SET_ONLY_XBM_IF_EITHER_EN( EXIT_XRSTORS,            VMX_EXIT_XRSTORS);
    92459291
    92469292#undef IS_EITHER_ENABLED
     
    93019347     *       where we dispatch dtrace events.
    93029348     */
    9303     bool            fDtrace   = false;
    9304     DBGFEVENTTYPE   enmEvent  = DBGFEVENT_END;
    9305     uint32_t        uEventArg = 0;
     9349    bool            fDtrace1   = false;
     9350    bool            fDtrace2   = false;
     9351    DBGFEVENTTYPE   enmEvent1  = DBGFEVENT_END;
     9352    DBGFEVENTTYPE   enmEvent2  = DBGFEVENT_END;
     9353    uint32_t        uEventArg  = 0;
     9354#define SET_EXIT(a_EventSubName) \
     9355        do { \
     9356            enmEvent2 = RT_CONCAT(DBGFEVENT_EXIT_,  a_EventSubName); \
     9357            fDtrace2  = RT_CONCAT3(VBOXVMM_EXIT_,   a_EventSubName, _ENABLED)(); \
     9358        } while (0)
    93069359#define SET_BOTH(a_EventSubName) \
    9307         do { enmEvent = RT_CONCAT(DBGFEVENT_, a_EventSubName); \
    9308             fDtrace = RT_CONCAT3(VBOXVMM_, a_EventSubName, _ENABLED)(); \
     9360        do { \
     9361            enmEvent1 = RT_CONCAT(DBGFEVENT_INSTR_, a_EventSubName); \
     9362            enmEvent2 = RT_CONCAT(DBGFEVENT_EXIT_,  a_EventSubName); \
     9363            fDtrace1  = RT_CONCAT3(VBOXVMM_INSTR_,  a_EventSubName, _ENABLED)(); \
     9364            fDtrace2  = RT_CONCAT3(VBOXVMM_EXIT_,   a_EventSubName, _ENABLED)(); \
    93099365        } while (0)
    93109366    switch (uExitReason)
     
    93289384                            uEventArg = pVmxTransient->uExitIntErrorCode;
    93299385                        }
    9330                         enmEvent = (DBGFEVENTTYPE)(DBGFEVENT_XCPT_FIRST + idxVector);
    9331                         switch (enmEvent)
     9386                        enmEvent1 = (DBGFEVENTTYPE)(DBGFEVENT_XCPT_FIRST + idxVector);
     9387                        switch (enmEvent1)
    93329388                        {
    9333                             case DBGFEVENT_XCPT_DE: fDtrace = VBOXVMM_XCPT_DE_ENABLED(); break;
    9334                             case DBGFEVENT_XCPT_DB: fDtrace = VBOXVMM_XCPT_DB_ENABLED(); break;
    9335                             case DBGFEVENT_XCPT_BP: fDtrace = VBOXVMM_XCPT_BP_ENABLED(); break;
    9336                             case DBGFEVENT_XCPT_OF: fDtrace = VBOXVMM_XCPT_OF_ENABLED(); break;
    9337                             case DBGFEVENT_XCPT_BR: fDtrace = VBOXVMM_XCPT_BR_ENABLED(); break;
    9338                             case DBGFEVENT_XCPT_UD: fDtrace = VBOXVMM_XCPT_UD_ENABLED(); break;
    9339                             case DBGFEVENT_XCPT_NM: fDtrace = VBOXVMM_XCPT_NM_ENABLED(); break;
    9340                             case DBGFEVENT_XCPT_DF: fDtrace = VBOXVMM_XCPT_DF_ENABLED(); break;
    9341                             case DBGFEVENT_XCPT_TS: fDtrace = VBOXVMM_XCPT_TS_ENABLED(); break;
    9342                             case DBGFEVENT_XCPT_NP: fDtrace = VBOXVMM_XCPT_NP_ENABLED(); break;
    9343                             case DBGFEVENT_XCPT_SS: fDtrace = VBOXVMM_XCPT_SS_ENABLED(); break;
    9344                             case DBGFEVENT_XCPT_GP: fDtrace = VBOXVMM_XCPT_GP_ENABLED(); break;
    9345                             case DBGFEVENT_XCPT_PF: fDtrace = VBOXVMM_XCPT_PF_ENABLED(); break;
    9346                             case DBGFEVENT_XCPT_MF: fDtrace = VBOXVMM_XCPT_MF_ENABLED(); break;
    9347                             case DBGFEVENT_XCPT_AC: fDtrace = VBOXVMM_XCPT_AC_ENABLED(); break;
    9348                             case DBGFEVENT_XCPT_XF: fDtrace = VBOXVMM_XCPT_XF_ENABLED(); break;
    9349                             case DBGFEVENT_XCPT_VE: fDtrace = VBOXVMM_XCPT_VE_ENABLED(); break;
    9350                             case DBGFEVENT_XCPT_SX: fDtrace = VBOXVMM_XCPT_SX_ENABLED(); break;
    9351                             default:                                                     break;
     9389                            case DBGFEVENT_XCPT_DE: fDtrace1 = VBOXVMM_XCPT_DE_ENABLED(); break;
     9390                            case DBGFEVENT_XCPT_DB: fDtrace1 = VBOXVMM_XCPT_DB_ENABLED(); break;
     9391                            case DBGFEVENT_XCPT_BP: fDtrace1 = VBOXVMM_XCPT_BP_ENABLED(); break;
     9392                            case DBGFEVENT_XCPT_OF: fDtrace1 = VBOXVMM_XCPT_OF_ENABLED(); break;
     9393                            case DBGFEVENT_XCPT_BR: fDtrace1 = VBOXVMM_XCPT_BR_ENABLED(); break;
     9394                            case DBGFEVENT_XCPT_UD: fDtrace1 = VBOXVMM_XCPT_UD_ENABLED(); break;
     9395                            case DBGFEVENT_XCPT_NM: fDtrace1 = VBOXVMM_XCPT_NM_ENABLED(); break;
     9396                            case DBGFEVENT_XCPT_DF: fDtrace1 = VBOXVMM_XCPT_DF_ENABLED(); break;
     9397                            case DBGFEVENT_XCPT_TS: fDtrace1 = VBOXVMM_XCPT_TS_ENABLED(); break;
     9398                            case DBGFEVENT_XCPT_NP: fDtrace1 = VBOXVMM_XCPT_NP_ENABLED(); break;
     9399                            case DBGFEVENT_XCPT_SS: fDtrace1 = VBOXVMM_XCPT_SS_ENABLED(); break;
     9400                            case DBGFEVENT_XCPT_GP: fDtrace1 = VBOXVMM_XCPT_GP_ENABLED(); break;
     9401                            case DBGFEVENT_XCPT_PF: fDtrace1 = VBOXVMM_XCPT_PF_ENABLED(); break;
     9402                            case DBGFEVENT_XCPT_MF: fDtrace1 = VBOXVMM_XCPT_MF_ENABLED(); break;
     9403                            case DBGFEVENT_XCPT_AC: fDtrace1 = VBOXVMM_XCPT_AC_ENABLED(); break;
     9404                            case DBGFEVENT_XCPT_XF: fDtrace1 = VBOXVMM_XCPT_XF_ENABLED(); break;
     9405                            case DBGFEVENT_XCPT_VE: fDtrace1 = VBOXVMM_XCPT_VE_ENABLED(); break;
     9406                            case DBGFEVENT_XCPT_SX: fDtrace1 = VBOXVMM_XCPT_SX_ENABLED(); break;
     9407                            default:                                                      break;
    93529408                        }
    93539409                    }
     
    93589414                case VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT:
    93599415                    uEventArg = idxVector;
    9360                     enmEvent  = DBGFEVENT_INTERRUPT_SOFTWARE;
    9361                     fDtrace   = VBOXVMM_INT_SOFTWARE_ENABLED();
     9416                    enmEvent1 = DBGFEVENT_INTERRUPT_SOFTWARE;
     9417                    fDtrace1  = VBOXVMM_INT_SOFTWARE_ENABLED();
    93629418                    break;
    93639419            }
     
    93669422
    93679423        case VMX_EXIT_TRIPLE_FAULT:
    9368             enmEvent = DBGFEVENT_TRIPLE_FAULT;
    9369             //fDtrace  = VBOXVMM_EXIT_TRIPLE_FAULT_ENABLED();
     9424            enmEvent1 = DBGFEVENT_TRIPLE_FAULT;
     9425            //fDtrace1  = VBOXVMM_EXIT_TRIPLE_FAULT_ENABLED();
    93709426            break;
    9371         case VMX_EXIT_TASK_SWITCH:      SET_BOTH(EXIT_TASK_SWITCH); break;
    9372         case VMX_EXIT_EPT_VIOLATION:    SET_BOTH(EXIT_VMX_EPT_VIOLATION); break;
    9373         case VMX_EXIT_EPT_MISCONFIG:    SET_BOTH(EXIT_VMX_EPT_MISCONFIG); break;
    9374         case VMX_EXIT_APIC_ACCESS:      SET_BOTH(EXIT_VMX_VAPIC_ACCESS); break;
    9375         case VMX_EXIT_APIC_WRITE:       SET_BOTH(EXIT_VMX_VAPIC_WRITE); break;
     9427        case VMX_EXIT_TASK_SWITCH:      SET_EXIT(TASK_SWITCH); break;
     9428        case VMX_EXIT_EPT_VIOLATION:    SET_EXIT(VMX_EPT_VIOLATION); break;
     9429        case VMX_EXIT_EPT_MISCONFIG:    SET_EXIT(VMX_EPT_MISCONFIG); break;
     9430        case VMX_EXIT_APIC_ACCESS:      SET_EXIT(VMX_VAPIC_ACCESS); break;
     9431        case VMX_EXIT_APIC_WRITE:       SET_EXIT(VMX_VAPIC_WRITE); break;
    93769432
    93779433        /* Instruction specific VM-exits: */
    9378         case VMX_EXIT_CPUID:            SET_BOTH(EXIT_CPUID); break;
    9379         case VMX_EXIT_GETSEC:           SET_BOTH(EXIT_GETSEC); break;
    9380         case VMX_EXIT_HLT:              SET_BOTH(EXIT_HALT); break;
    9381         case VMX_EXIT_INVD:             SET_BOTH(EXIT_INVD); break;
    9382         case VMX_EXIT_INVLPG:           SET_BOTH(EXIT_INVLPG); break;
    9383         case VMX_EXIT_RDPMC:            SET_BOTH(EXIT_RDPMC); break;
    9384         case VMX_EXIT_RDTSC:            SET_BOTH(EXIT_RDTSC); break;
    9385         case VMX_EXIT_RSM:              SET_BOTH(EXIT_RSM); break;
    9386         case VMX_EXIT_VMCALL:           SET_BOTH(EXIT_VMM_CALL); break;
    9387         case VMX_EXIT_VMCLEAR:          SET_BOTH(EXIT_VMX_VMCLEAR); break;
    9388         case VMX_EXIT_VMLAUNCH:         SET_BOTH(EXIT_VMX_VMLAUNCH); break;
    9389         case VMX_EXIT_VMPTRLD:          SET_BOTH(EXIT_VMX_VMPTRLD); break;
    9390         case VMX_EXIT_VMPTRST:          SET_BOTH(EXIT_VMX_VMPTRST); break;
    9391         case VMX_EXIT_VMREAD:           SET_BOTH(EXIT_VMX_VMREAD); break;
    9392         case VMX_EXIT_VMRESUME:         SET_BOTH(EXIT_VMX_VMRESUME); break;
    9393         case VMX_EXIT_VMWRITE:          SET_BOTH(EXIT_VMX_VMWRITE); break;
    9394         case VMX_EXIT_VMXOFF:           SET_BOTH(EXIT_VMX_VMXOFF); break;
    9395         case VMX_EXIT_VMXON:            SET_BOTH(EXIT_VMX_VMXON); break;
     9434        case VMX_EXIT_CPUID:            SET_BOTH(CPUID); break;
     9435        case VMX_EXIT_GETSEC:           SET_BOTH(GETSEC); break;
     9436        case VMX_EXIT_HLT:              SET_BOTH(HALT); break;
     9437        case VMX_EXIT_INVD:             SET_BOTH(INVD); break;
     9438        case VMX_EXIT_INVLPG:           SET_BOTH(INVLPG); break;
     9439        case VMX_EXIT_RDPMC:            SET_BOTH(RDPMC); break;
     9440        case VMX_EXIT_RDTSC:            SET_BOTH(RDTSC); break;
     9441        case VMX_EXIT_RSM:              SET_BOTH(RSM); break;
     9442        case VMX_EXIT_VMCALL:           SET_BOTH(VMM_CALL); break;
     9443        case VMX_EXIT_VMCLEAR:          SET_BOTH(VMX_VMCLEAR); break;
     9444        case VMX_EXIT_VMLAUNCH:         SET_BOTH(VMX_VMLAUNCH); break;
     9445        case VMX_EXIT_VMPTRLD:          SET_BOTH(VMX_VMPTRLD); break;
     9446        case VMX_EXIT_VMPTRST:          SET_BOTH(VMX_VMPTRST); break;
     9447        case VMX_EXIT_VMREAD:           SET_BOTH(VMX_VMREAD); break;
     9448        case VMX_EXIT_VMRESUME:         SET_BOTH(VMX_VMRESUME); break;
     9449        case VMX_EXIT_VMWRITE:          SET_BOTH(VMX_VMWRITE); break;
     9450        case VMX_EXIT_VMXOFF:           SET_BOTH(VMX_VMXOFF); break;
     9451        case VMX_EXIT_VMXON:            SET_BOTH(VMX_VMXON); break;
    93969452        case VMX_EXIT_MOV_CRX:
    93979453            hmR0VmxReadExitQualificationVmcs(pVCpu, pVmxTransient);
     
    94009456            if (   VMX_EXIT_QUALIFICATION_CRX_ACCESS(pVmxTransient->uExitQualification)
    94019457                == VMX_EXIT_QUALIFICATION_CRX_ACCESS_READ)
    9402                 SET_BOTH(EXIT_CRX_READ);
     9458                SET_BOTH(CRX_READ);
    94039459            else
    9404                 SET_BOTH(EXIT_CRX_WRITE);
     9460                SET_BOTH(CRX_WRITE);
    94059461            uEventArg = VMX_EXIT_QUALIFICATION_CRX_REGISTER(pVmxTransient->uExitQualification);
    94069462            break;
     
    94099465            if (   VMX_EXIT_QUALIFICATION_DRX_DIRECTION(pVmxTransient->uExitQualification)
    94109466                == VMX_EXIT_QUALIFICATION_DRX_DIRECTION_READ)
    9411                 SET_BOTH(EXIT_DRX_READ);
     9467                SET_BOTH(DRX_READ);
    94129468            else
    9413                 SET_BOTH(EXIT_DRX_WRITE);
     9469                SET_BOTH(DRX_WRITE);
    94149470            uEventArg = VMX_EXIT_QUALIFICATION_DRX_REGISTER(pVmxTransient->uExitQualification);
    94159471            break;
    9416         case VMX_EXIT_RDMSR:            SET_BOTH(EXIT_RDMSR); break;
    9417         case VMX_EXIT_WRMSR:            SET_BOTH(EXIT_WRMSR); break;
    9418         case VMX_EXIT_MWAIT:            SET_BOTH(EXIT_MWAIT); break;
    9419         case VMX_EXIT_MONITOR:          SET_BOTH(EXIT_MONITOR); break;
    9420         case VMX_EXIT_PAUSE:            SET_BOTH(EXIT_PAUSE); break;
     9472        case VMX_EXIT_RDMSR:            SET_BOTH(RDMSR); break;
     9473        case VMX_EXIT_WRMSR:            SET_BOTH(WRMSR); break;
     9474        case VMX_EXIT_MWAIT:            SET_BOTH(MWAIT); break;
     9475        case VMX_EXIT_MONITOR:          SET_BOTH(MONITOR); break;
     9476        case VMX_EXIT_PAUSE:            SET_BOTH(PAUSE); break;
    94219477        case VMX_EXIT_XDTR_ACCESS:
    94229478            hmR0VmxReadExitInstrInfoVmcs(pVmxTransient);
    94239479            switch (RT_BF_GET(pVmxTransient->ExitInstrInfo.u, VMX_XDTR_INSINFO_INSTR_ID))
    94249480            {
    9425                 case VMX_XDTR_INSINFO_II_SGDT: SET_BOTH(EXIT_SGDT); break;
    9426                 case VMX_XDTR_INSINFO_II_SIDT: SET_BOTH(EXIT_SIDT); break;
    9427                 case VMX_XDTR_INSINFO_II_LGDT: SET_BOTH(EXIT_LGDT); break;
    9428                 case VMX_XDTR_INSINFO_II_LIDT: SET_BOTH(EXIT_LIDT); break;
     9481                case VMX_XDTR_INSINFO_II_SGDT: SET_BOTH(SGDT); break;
     9482                case VMX_XDTR_INSINFO_II_SIDT: SET_BOTH(SIDT); break;
     9483                case VMX_XDTR_INSINFO_II_LGDT: SET_BOTH(LGDT); break;
     9484                case VMX_XDTR_INSINFO_II_LIDT: SET_BOTH(LIDT); break;
    94299485            }
    94309486            break;
     
    94349490            switch (RT_BF_GET(pVmxTransient->ExitInstrInfo.u, VMX_YYTR_INSINFO_INSTR_ID))
    94359491            {
    9436                 case VMX_YYTR_INSINFO_II_SLDT: SET_BOTH(EXIT_SLDT); break;
    9437                 case VMX_YYTR_INSINFO_II_STR:  SET_BOTH(EXIT_STR); break;
    9438                 case VMX_YYTR_INSINFO_II_LLDT: SET_BOTH(EXIT_LLDT); break;
    9439                 case VMX_YYTR_INSINFO_II_LTR:  SET_BOTH(EXIT_LTR); break;
     9492                case VMX_YYTR_INSINFO_II_SLDT: SET_BOTH(SLDT); break;
     9493                case VMX_YYTR_INSINFO_II_STR:  SET_BOTH(STR); break;
     9494                case VMX_YYTR_INSINFO_II_LLDT: SET_BOTH(LLDT); break;
     9495                case VMX_YYTR_INSINFO_II_LTR:  SET_BOTH(LTR); break;
    94409496            }
    94419497            break;
    94429498
    9443         case VMX_EXIT_INVEPT:           SET_BOTH(EXIT_VMX_INVEPT); break;
    9444         case VMX_EXIT_RDTSCP:           SET_BOTH(EXIT_RDTSCP); break;
    9445         case VMX_EXIT_INVVPID:          SET_BOTH(EXIT_VMX_INVVPID); break;
    9446         case VMX_EXIT_WBINVD:           SET_BOTH(EXIT_WBINVD); break;
    9447         case VMX_EXIT_XSETBV:           SET_BOTH(EXIT_XSETBV); break;
    9448         case VMX_EXIT_RDRAND:           SET_BOTH(EXIT_RDRAND); break;
    9449         case VMX_EXIT_INVPCID:          SET_BOTH(EXIT_VMX_INVPCID); break;
    9450         case VMX_EXIT_VMFUNC:           SET_BOTH(EXIT_VMX_VMFUNC); break;
    9451         case VMX_EXIT_RDSEED:           SET_BOTH(EXIT_RDSEED); break;
    9452         case VMX_EXIT_XSAVES:           SET_BOTH(EXIT_XSAVES); break;
    9453         case VMX_EXIT_XRSTORS:          SET_BOTH(EXIT_XRSTORS); break;
     9499        case VMX_EXIT_INVEPT:           SET_BOTH(VMX_INVEPT); break;
     9500        case VMX_EXIT_RDTSCP:           SET_BOTH(RDTSCP); break;
     9501        case VMX_EXIT_INVVPID:          SET_BOTH(VMX_INVVPID); break;
     9502        case VMX_EXIT_WBINVD:           SET_BOTH(WBINVD); break;
     9503        case VMX_EXIT_XSETBV:           SET_BOTH(XSETBV); break;
     9504        case VMX_EXIT_RDRAND:           SET_BOTH(RDRAND); break;
     9505        case VMX_EXIT_INVPCID:          SET_BOTH(VMX_INVPCID); break;
     9506        case VMX_EXIT_VMFUNC:           SET_BOTH(VMX_VMFUNC); break;
     9507        case VMX_EXIT_RDSEED:           SET_BOTH(RDSEED); break;
     9508        case VMX_EXIT_XSAVES:           SET_BOTH(XSAVES); break;
     9509        case VMX_EXIT_XRSTORS:          SET_BOTH(XRSTORS); break;
    94549510
    94559511        /* Events that aren't relevant at this point. */
     
    94779533    }
    94789534#undef SET_BOTH
     9535#undef SET_EXIT
    94799536
    94809537    /*
     
    94849541     * we use enmEvent since the probes are a subset of what DBGF does.
    94859542     */
    9486     if (fDtrace)
     9543    if (fDtrace1 || fDtrace2)
    94879544    {
    94889545        hmR0VmxReadExitQualificationVmcs(pVCpu, pVmxTransient);
    94899546        hmR0VmxSaveGuestState(pVCpu, pMixedCtx);
    9490         switch (enmEvent)
     9547        switch (enmEvent1)
    94919548        {
    94929549            /** @todo consider which extra parameters would be helpful for each probe.   */
     9550            case DBGFEVENT_END: break;
    94939551            case DBGFEVENT_XCPT_DE:                 VBOXVMM_XCPT_DE(pVCpu, pMixedCtx); break;
    94949552            case DBGFEVENT_XCPT_DB:                 VBOXVMM_XCPT_DB(pVCpu, pMixedCtx, pMixedCtx->dr[6]); break;
     
    95109568            case DBGFEVENT_XCPT_SX:                 VBOXVMM_XCPT_SX(pVCpu, pMixedCtx, uEventArg); break;
    95119569            case DBGFEVENT_INTERRUPT_SOFTWARE:      VBOXVMM_INT_SOFTWARE(pVCpu, pMixedCtx, (uint8_t)uEventArg); break;
     9570            case DBGFEVENT_INSTR_CPUID:             VBOXVMM_INSTR_CPUID(pVCpu, pMixedCtx, pMixedCtx->eax, pMixedCtx->ecx); break;
     9571            case DBGFEVENT_INSTR_GETSEC:            VBOXVMM_INSTR_GETSEC(pVCpu, pMixedCtx); break;
     9572            case DBGFEVENT_INSTR_HALT:              VBOXVMM_INSTR_HALT(pVCpu, pMixedCtx); break;
     9573            case DBGFEVENT_INSTR_INVD:              VBOXVMM_INSTR_INVD(pVCpu, pMixedCtx); break;
     9574            case DBGFEVENT_INSTR_INVLPG:            VBOXVMM_INSTR_INVLPG(pVCpu, pMixedCtx); break;
     9575            case DBGFEVENT_INSTR_RDPMC:             VBOXVMM_INSTR_RDPMC(pVCpu, pMixedCtx); break;
     9576            case DBGFEVENT_INSTR_RDTSC:             VBOXVMM_INSTR_RDTSC(pVCpu, pMixedCtx); break;
     9577            case DBGFEVENT_INSTR_RSM:               VBOXVMM_INSTR_RSM(pVCpu, pMixedCtx); break;
     9578            case DBGFEVENT_INSTR_CRX_READ:          VBOXVMM_INSTR_CRX_READ(pVCpu, pMixedCtx, (uint8_t)uEventArg); break;
     9579            case DBGFEVENT_INSTR_CRX_WRITE:         VBOXVMM_INSTR_CRX_WRITE(pVCpu, pMixedCtx, (uint8_t)uEventArg); break;
     9580            case DBGFEVENT_INSTR_DRX_READ:          VBOXVMM_INSTR_DRX_READ(pVCpu, pMixedCtx, (uint8_t)uEventArg); break;
     9581            case DBGFEVENT_INSTR_DRX_WRITE:         VBOXVMM_INSTR_DRX_WRITE(pVCpu, pMixedCtx, (uint8_t)uEventArg); break;
     9582            case DBGFEVENT_INSTR_RDMSR:             VBOXVMM_INSTR_RDMSR(pVCpu, pMixedCtx, pMixedCtx->ecx); break;
     9583            case DBGFEVENT_INSTR_WRMSR:             VBOXVMM_INSTR_WRMSR(pVCpu, pMixedCtx, pMixedCtx->ecx,
     9584                                                                        RT_MAKE_U64(pMixedCtx->eax, pMixedCtx->edx)); break;
     9585            case DBGFEVENT_INSTR_MWAIT:             VBOXVMM_INSTR_MWAIT(pVCpu, pMixedCtx); break;
     9586            case DBGFEVENT_INSTR_MONITOR:           VBOXVMM_INSTR_MONITOR(pVCpu, pMixedCtx); break;
     9587            case DBGFEVENT_INSTR_PAUSE:             VBOXVMM_INSTR_PAUSE(pVCpu, pMixedCtx); break;
     9588            case DBGFEVENT_INSTR_SGDT:              VBOXVMM_INSTR_SGDT(pVCpu, pMixedCtx); break;
     9589            case DBGFEVENT_INSTR_SIDT:              VBOXVMM_INSTR_SIDT(pVCpu, pMixedCtx); break;
     9590            case DBGFEVENT_INSTR_LGDT:              VBOXVMM_INSTR_LGDT(pVCpu, pMixedCtx); break;
     9591            case DBGFEVENT_INSTR_LIDT:              VBOXVMM_INSTR_LIDT(pVCpu, pMixedCtx); break;
     9592            case DBGFEVENT_INSTR_SLDT:              VBOXVMM_INSTR_SLDT(pVCpu, pMixedCtx); break;
     9593            case DBGFEVENT_INSTR_STR:               VBOXVMM_INSTR_STR(pVCpu, pMixedCtx); break;
     9594            case DBGFEVENT_INSTR_LLDT:              VBOXVMM_INSTR_LLDT(pVCpu, pMixedCtx); break;
     9595            case DBGFEVENT_INSTR_LTR:               VBOXVMM_INSTR_LTR(pVCpu, pMixedCtx); break;
     9596            case DBGFEVENT_INSTR_RDTSCP:            VBOXVMM_INSTR_RDTSCP(pVCpu, pMixedCtx); break;
     9597            case DBGFEVENT_INSTR_WBINVD:            VBOXVMM_INSTR_WBINVD(pVCpu, pMixedCtx); break;
     9598            case DBGFEVENT_INSTR_XSETBV:            VBOXVMM_INSTR_XSETBV(pVCpu, pMixedCtx); break;
     9599            case DBGFEVENT_INSTR_RDRAND:            VBOXVMM_INSTR_RDRAND(pVCpu, pMixedCtx); break;
     9600            case DBGFEVENT_INSTR_RDSEED:            VBOXVMM_INSTR_RDSEED(pVCpu, pMixedCtx); break;
     9601            case DBGFEVENT_INSTR_XSAVES:            VBOXVMM_INSTR_XSAVES(pVCpu, pMixedCtx); break;
     9602            case DBGFEVENT_INSTR_XRSTORS:           VBOXVMM_INSTR_XRSTORS(pVCpu, pMixedCtx); break;
     9603            case DBGFEVENT_INSTR_VMM_CALL:          VBOXVMM_INSTR_VMM_CALL(pVCpu, pMixedCtx); break;
     9604            case DBGFEVENT_INSTR_VMX_VMCLEAR:       VBOXVMM_INSTR_VMX_VMCLEAR(pVCpu, pMixedCtx); break;
     9605            case DBGFEVENT_INSTR_VMX_VMLAUNCH:      VBOXVMM_INSTR_VMX_VMLAUNCH(pVCpu, pMixedCtx); break;
     9606            case DBGFEVENT_INSTR_VMX_VMPTRLD:       VBOXVMM_INSTR_VMX_VMPTRLD(pVCpu, pMixedCtx); break;
     9607            case DBGFEVENT_INSTR_VMX_VMPTRST:       VBOXVMM_INSTR_VMX_VMPTRST(pVCpu, pMixedCtx); break;
     9608            case DBGFEVENT_INSTR_VMX_VMREAD:        VBOXVMM_INSTR_VMX_VMREAD(pVCpu, pMixedCtx); break;
     9609            case DBGFEVENT_INSTR_VMX_VMRESUME:      VBOXVMM_INSTR_VMX_VMRESUME(pVCpu, pMixedCtx); break;
     9610            case DBGFEVENT_INSTR_VMX_VMWRITE:       VBOXVMM_INSTR_VMX_VMWRITE(pVCpu, pMixedCtx); break;
     9611            case DBGFEVENT_INSTR_VMX_VMXOFF:        VBOXVMM_INSTR_VMX_VMXOFF(pVCpu, pMixedCtx); break;
     9612            case DBGFEVENT_INSTR_VMX_VMXON:         VBOXVMM_INSTR_VMX_VMXON(pVCpu, pMixedCtx); break;
     9613            case DBGFEVENT_INSTR_VMX_INVEPT:        VBOXVMM_INSTR_VMX_INVEPT(pVCpu, pMixedCtx); break;
     9614            case DBGFEVENT_INSTR_VMX_INVVPID:       VBOXVMM_INSTR_VMX_INVVPID(pVCpu, pMixedCtx); break;
     9615            case DBGFEVENT_INSTR_VMX_INVPCID:       VBOXVMM_INSTR_VMX_INVPCID(pVCpu, pMixedCtx); break;
     9616            case DBGFEVENT_INSTR_VMX_VMFUNC:        VBOXVMM_INSTR_VMX_VMFUNC(pVCpu, pMixedCtx); break;
     9617            default: AssertMsgFailed(("enmEvent1=%d uExitReason=%d\n", enmEvent1, uExitReason)); break;
     9618        }
     9619        switch (enmEvent2)
     9620        {
     9621            /** @todo consider which extra parameters would be helpful for each probe. */
     9622            case DBGFEVENT_END: break;
    95129623            case DBGFEVENT_EXIT_TASK_SWITCH:        VBOXVMM_EXIT_TASK_SWITCH(pVCpu, pMixedCtx); break;
    95139624            case DBGFEVENT_EXIT_CPUID:              VBOXVMM_EXIT_CPUID(pVCpu, pMixedCtx, pMixedCtx->eax, pMixedCtx->ecx); break;
     
    95629673            case DBGFEVENT_EXIT_VMX_VAPIC_ACCESS:   VBOXVMM_EXIT_VMX_VAPIC_ACCESS(pVCpu, pMixedCtx); break;
    95639674            case DBGFEVENT_EXIT_VMX_VAPIC_WRITE:    VBOXVMM_EXIT_VMX_VAPIC_WRITE(pVCpu, pMixedCtx); break;
    9564             default:                                AssertMsgFailed(("enmEvent=%d uExitReason=%d\n", enmEvent, uExitReason)); break;
     9675            default: AssertMsgFailed(("enmEvent2=%d uExitReason=%d\n", enmEvent2, uExitReason)); break;
    95659676        }
    95669677    }
     
    95719682     *
    95729683     * Note! DBGF sets DBGFEVENT_INTERRUPT_SOFTWARE in the bitmap.
     9684     * Note! If we have to events, we prioritize the first, i.e. the instruction
     9685     *       one, in order to avoid event nesting.
    95739686     */
    9574     if (   enmEvent != DBGFEVENT_END
    9575         && DBGF_IS_EVENT_ENABLED(pVM, enmEvent))
    9576     {
    9577         VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent, uEventArg);
     9687    if (   enmEvent1 != DBGFEVENT_END
     9688        && DBGF_IS_EVENT_ENABLED(pVM, enmEvent1))
     9689    {
     9690        VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent1, uEventArg);
     9691        if (rcStrict != VINF_SUCCESS)
     9692            return rcStrict;
     9693    }
     9694    else if (   enmEvent2 != DBGFEVENT_END
     9695             && DBGF_IS_EVENT_ENABLED(pVM, enmEvent2))
     9696    {
     9697        VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent2, uEventArg);
    95789698        if (rcStrict != VINF_SUCCESS)
    95799699            return rcStrict;
     
    990610026       Since the variables are in an array and the probes are next to one
    990710027       another (more or less), we have good locality.  So, better read
    9908        four-five cache lines ever time and only have one conditional, than
    9909        70+ conditionals, right? */
     10028       eight-nine cache lines ever time and only have one conditional, than
     10029       128+ conditionals, right? */
    991010030    return (  VBOXVMM_R0_HMVMX_VMEXIT_ENABLED_RAW() /* expensive too due to context */
    991110031            | VBOXVMM_XCPT_DE_ENABLED_RAW()
     
    992910049            | VBOXVMM_INT_SOFTWARE_ENABLED_RAW()
    993010050            | VBOXVMM_INT_HARDWARE_ENABLED_RAW()
    9931             | VBOXVMM_EXIT_TASK_SWITCH_ENABLED_RAW()
     10051           ) != 0
     10052        || (  VBOXVMM_INSTR_HALT_ENABLED_RAW()
     10053            | VBOXVMM_INSTR_MWAIT_ENABLED_RAW()
     10054            | VBOXVMM_INSTR_MONITOR_ENABLED_RAW()
     10055            | VBOXVMM_INSTR_CPUID_ENABLED_RAW()
     10056            | VBOXVMM_INSTR_INVD_ENABLED_RAW()
     10057            | VBOXVMM_INSTR_WBINVD_ENABLED_RAW()
     10058            | VBOXVMM_INSTR_INVLPG_ENABLED_RAW()
     10059            | VBOXVMM_INSTR_RDTSC_ENABLED_RAW()
     10060            | VBOXVMM_INSTR_RDTSCP_ENABLED_RAW()
     10061            | VBOXVMM_INSTR_RDPMC_ENABLED_RAW()
     10062            | VBOXVMM_INSTR_RDMSR_ENABLED_RAW()
     10063            | VBOXVMM_INSTR_WRMSR_ENABLED_RAW()
     10064            | VBOXVMM_INSTR_CRX_READ_ENABLED_RAW()
     10065            | VBOXVMM_INSTR_CRX_WRITE_ENABLED_RAW()
     10066            | VBOXVMM_INSTR_DRX_READ_ENABLED_RAW()
     10067            | VBOXVMM_INSTR_DRX_WRITE_ENABLED_RAW()
     10068            | VBOXVMM_INSTR_PAUSE_ENABLED_RAW()
     10069            | VBOXVMM_INSTR_XSETBV_ENABLED_RAW()
     10070            | VBOXVMM_INSTR_SIDT_ENABLED_RAW()
     10071            | VBOXVMM_INSTR_LIDT_ENABLED_RAW()
     10072            | VBOXVMM_INSTR_SGDT_ENABLED_RAW()
     10073            | VBOXVMM_INSTR_LGDT_ENABLED_RAW()
     10074            | VBOXVMM_INSTR_SLDT_ENABLED_RAW()
     10075            | VBOXVMM_INSTR_LLDT_ENABLED_RAW()
     10076            | VBOXVMM_INSTR_STR_ENABLED_RAW()
     10077            | VBOXVMM_INSTR_LTR_ENABLED_RAW()
     10078            | VBOXVMM_INSTR_GETSEC_ENABLED_RAW()
     10079            | VBOXVMM_INSTR_RSM_ENABLED_RAW()
     10080            | VBOXVMM_INSTR_RDRAND_ENABLED_RAW()
     10081            | VBOXVMM_INSTR_RDSEED_ENABLED_RAW()
     10082            | VBOXVMM_INSTR_XSAVES_ENABLED_RAW()
     10083            | VBOXVMM_INSTR_XRSTORS_ENABLED_RAW()
     10084            | VBOXVMM_INSTR_VMM_CALL_ENABLED_RAW()
     10085            | VBOXVMM_INSTR_VMX_VMCLEAR_ENABLED_RAW()
     10086            | VBOXVMM_INSTR_VMX_VMLAUNCH_ENABLED_RAW()
     10087            | VBOXVMM_INSTR_VMX_VMPTRLD_ENABLED_RAW()
     10088            | VBOXVMM_INSTR_VMX_VMPTRST_ENABLED_RAW()
     10089            | VBOXVMM_INSTR_VMX_VMREAD_ENABLED_RAW()
     10090            | VBOXVMM_INSTR_VMX_VMRESUME_ENABLED_RAW()
     10091            | VBOXVMM_INSTR_VMX_VMWRITE_ENABLED_RAW()
     10092            | VBOXVMM_INSTR_VMX_VMXOFF_ENABLED_RAW()
     10093            | VBOXVMM_INSTR_VMX_VMXON_ENABLED_RAW()
     10094            | VBOXVMM_INSTR_VMX_VMFUNC_ENABLED_RAW()
     10095            | VBOXVMM_INSTR_VMX_INVEPT_ENABLED_RAW()
     10096            | VBOXVMM_INSTR_VMX_INVVPID_ENABLED_RAW()
     10097            | VBOXVMM_INSTR_VMX_INVPCID_ENABLED_RAW()
     10098           ) != 0
     10099        || (  VBOXVMM_EXIT_TASK_SWITCH_ENABLED_RAW()
    993210100            | VBOXVMM_EXIT_HALT_ENABLED_RAW()
    993310101            | VBOXVMM_EXIT_MWAIT_ENABLED_RAW()
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