VirtualBox

Ignore:
Timestamp:
Jan 25, 2019 2:34:46 PM (6 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:9180 Allowing fetching VM-exit names from ring-0 as well. Various naming cleanups. Added HMDumpHwvirtVmxState() to be able to dump virtual VMCS state from ring-0 as well. Remove unusued HMIsVmxSupported() function.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/HMAll.cpp

    r76797 r76993  
    3939
    4040
     41/*********************************************************************************************************************************
     42*   Global Variables                                                                                                             *
     43*********************************************************************************************************************************/
     44#define EXIT_REASON(a_Def, a_Val, a_Str)      #a_Def " - " #a_Val " - " a_Str
     45#define EXIT_REASON_NIL()                     NULL
     46
     47/** Exit reason descriptions for VT-x, used to describe statistics and exit
     48 *  history. */
     49static const char * const g_apszVmxExitReasons[MAX_EXITREASON_STAT] =
     50{
     51    EXIT_REASON(VMX_EXIT_XCPT_OR_NMI            ,   0, "Exception or non-maskable interrupt (NMI)."),
     52    EXIT_REASON(VMX_EXIT_EXT_INT                ,   1, "External interrupt."),
     53    EXIT_REASON(VMX_EXIT_TRIPLE_FAULT           ,   2, "Triple fault."),
     54    EXIT_REASON(VMX_EXIT_INIT_SIGNAL            ,   3, "INIT signal."),
     55    EXIT_REASON(VMX_EXIT_SIPI                   ,   4, "Start-up IPI (SIPI)."),
     56    EXIT_REASON(VMX_EXIT_IO_SMI_IRQ             ,   5, "I/O system-management interrupt (SMI)."),
     57    EXIT_REASON(VMX_EXIT_SMI_IRQ                ,   6, "Other SMI."),
     58    EXIT_REASON(VMX_EXIT_INT_WINDOW             ,   7, "Interrupt window."),
     59    EXIT_REASON(VMX_EXIT_NMI_WINDOW             ,   8, "NMI window."),
     60    EXIT_REASON(VMX_EXIT_TASK_SWITCH            ,   9, "Task switch."),
     61    EXIT_REASON(VMX_EXIT_CPUID                  ,  10, "CPUID instruction."),
     62    EXIT_REASON(VMX_EXIT_GETSEC                 ,  11, "GETSEC instrunction."),
     63    EXIT_REASON(VMX_EXIT_HLT                    ,  12, "HLT instruction."),
     64    EXIT_REASON(VMX_EXIT_INVD                   ,  13, "INVD instruction."),
     65    EXIT_REASON(VMX_EXIT_INVLPG                 ,  14, "INVLPG instruction."),
     66    EXIT_REASON(VMX_EXIT_RDPMC                  ,  15, "RDPMCinstruction."),
     67    EXIT_REASON(VMX_EXIT_RDTSC                  ,  16, "RDTSC instruction."),
     68    EXIT_REASON(VMX_EXIT_RSM                    ,  17, "RSM instruction in SMM."),
     69    EXIT_REASON(VMX_EXIT_VMCALL                 ,  18, "VMCALL instruction."),
     70    EXIT_REASON(VMX_EXIT_VMCLEAR                ,  19, "VMCLEAR instruction."),
     71    EXIT_REASON(VMX_EXIT_VMLAUNCH               ,  20, "VMLAUNCH instruction."),
     72    EXIT_REASON(VMX_EXIT_VMPTRLD                ,  21, "VMPTRLD instruction."),
     73    EXIT_REASON(VMX_EXIT_VMPTRST                ,  22, "VMPTRST instruction."),
     74    EXIT_REASON(VMX_EXIT_VMREAD                 ,  23, "VMREAD instruction."),
     75    EXIT_REASON(VMX_EXIT_VMRESUME               ,  24, "VMRESUME instruction."),
     76    EXIT_REASON(VMX_EXIT_VMWRITE                ,  25, "VMWRITE instruction."),
     77    EXIT_REASON(VMX_EXIT_VMXOFF                 ,  26, "VMXOFF instruction."),
     78    EXIT_REASON(VMX_EXIT_VMXON                  ,  27, "VMXON instruction."),
     79    EXIT_REASON(VMX_EXIT_MOV_CRX                ,  28, "Control-register accesses."),
     80    EXIT_REASON(VMX_EXIT_MOV_DRX                ,  29, "Debug-register accesses."),
     81    EXIT_REASON(VMX_EXIT_PORT_IO                ,  30, "I/O instruction."),
     82    EXIT_REASON(VMX_EXIT_RDMSR                  ,  31, "RDMSR instruction."),
     83    EXIT_REASON(VMX_EXIT_WRMSR                  ,  32, "WRMSR instruction."),
     84    EXIT_REASON(VMX_EXIT_ERR_INVALID_GUEST_STATE,  33, "VM-entry failure due to invalid guest state."),
     85    EXIT_REASON(VMX_EXIT_ERR_MSR_LOAD           ,  34, "VM-entry failure due to MSR loading."),
     86    EXIT_REASON_NIL(),
     87    EXIT_REASON(VMX_EXIT_MWAIT                  ,  36, "MWAIT instruction."),
     88    EXIT_REASON(VMX_EXIT_MTF                    ,  37, "Monitor Trap Flag."),
     89    EXIT_REASON_NIL(),
     90    EXIT_REASON(VMX_EXIT_MONITOR                ,  39, "MONITOR instruction."),
     91    EXIT_REASON(VMX_EXIT_PAUSE                  ,  40, "PAUSE instruction."),
     92    EXIT_REASON(VMX_EXIT_ERR_MACHINE_CHECK      ,  41, "VM-entry failure due to machine-check."),
     93    EXIT_REASON_NIL(),
     94    EXIT_REASON(VMX_EXIT_TPR_BELOW_THRESHOLD    ,  43, "TPR below threshold (MOV to CR8)."),
     95    EXIT_REASON(VMX_EXIT_APIC_ACCESS            ,  44, "APIC access."),
     96    EXIT_REASON(VMX_EXIT_VIRTUALIZED_EOI        ,  45, "Virtualized EOI."),
     97    EXIT_REASON(VMX_EXIT_GDTR_IDTR_ACCESS       ,  46, "GDTR/IDTR access using LGDT/SGDT/LIDT/SIDT."),
     98    EXIT_REASON(VMX_EXIT_LDTR_TR_ACCESS         ,  47, "LDTR/TR access using LLDT/SLDT/LTR/STR."),
     99    EXIT_REASON(VMX_EXIT_EPT_VIOLATION          ,  48, "EPT violation."),
     100    EXIT_REASON(VMX_EXIT_EPT_MISCONFIG          ,  49, "EPT misconfiguration."),
     101    EXIT_REASON(VMX_EXIT_INVEPT                 ,  50, "INVEPT instruction."),
     102    EXIT_REASON(VMX_EXIT_RDTSCP                 ,  51, "RDTSCP instruction."),
     103    EXIT_REASON(VMX_EXIT_PREEMPT_TIMER          ,  52, "VMX-preemption timer expired."),
     104    EXIT_REASON(VMX_EXIT_INVVPID                ,  53, "INVVPID instruction."),
     105    EXIT_REASON(VMX_EXIT_WBINVD                 ,  54, "WBINVD instruction."),
     106    EXIT_REASON(VMX_EXIT_XSETBV                 ,  55, "XSETBV instruction."),
     107    EXIT_REASON(VMX_EXIT_APIC_WRITE             ,  56, "APIC write completed to virtual-APIC page."),
     108    EXIT_REASON(VMX_EXIT_RDRAND                 ,  57, "RDRAND instruction."),
     109    EXIT_REASON(VMX_EXIT_INVPCID                ,  58, "INVPCID instruction."),
     110    EXIT_REASON(VMX_EXIT_VMFUNC                 ,  59, "VMFUNC instruction."),
     111    EXIT_REASON(VMX_EXIT_ENCLS                  ,  60, "ENCLS instruction."),
     112    EXIT_REASON(VMX_EXIT_RDSEED                 ,  61, "RDSEED instruction."),
     113    EXIT_REASON(VMX_EXIT_PML_FULL               ,  62, "Page-modification log full."),
     114    EXIT_REASON(VMX_EXIT_XSAVES                 ,  63, "XSAVES instruction."),
     115    EXIT_REASON(VMX_EXIT_XRSTORS                ,  64, "XRSTORS instruction.")
     116};
     117/** Array index of the last valid VT-x exit reason. */
     118#define MAX_EXITREASON_VTX                         64
     119
     120/** A partial list of \#EXIT reason descriptions for AMD-V, used to describe
     121 *  statistics and exit history.
     122 *
     123 *  @note AMD-V have annoyingly large gaps (e.g. \#NPF VMEXIT comes at 1024),
     124 *        this array doesn't contain the entire set of exit reasons, we
     125 *        handle them via hmSvmGetSpecialExitReasonDesc(). */
     126static const char * const g_apszSvmExitReasons[MAX_EXITREASON_STAT] =
     127{
     128    EXIT_REASON(SVM_EXIT_READ_CR0     ,    0, "Read CR0."),
     129    EXIT_REASON(SVM_EXIT_READ_CR1     ,    1, "Read CR1."),
     130    EXIT_REASON(SVM_EXIT_READ_CR2     ,    2, "Read CR2."),
     131    EXIT_REASON(SVM_EXIT_READ_CR3     ,    3, "Read CR3."),
     132    EXIT_REASON(SVM_EXIT_READ_CR4     ,    4, "Read CR4."),
     133    EXIT_REASON(SVM_EXIT_READ_CR5     ,    5, "Read CR5."),
     134    EXIT_REASON(SVM_EXIT_READ_CR6     ,    6, "Read CR6."),
     135    EXIT_REASON(SVM_EXIT_READ_CR7     ,    7, "Read CR7."),
     136    EXIT_REASON(SVM_EXIT_READ_CR8     ,    8, "Read CR8."),
     137    EXIT_REASON(SVM_EXIT_READ_CR9     ,    9, "Read CR9."),
     138    EXIT_REASON(SVM_EXIT_READ_CR10    ,   10, "Read CR10."),
     139    EXIT_REASON(SVM_EXIT_READ_CR11    ,   11, "Read CR11."),
     140    EXIT_REASON(SVM_EXIT_READ_CR12    ,   12, "Read CR12."),
     141    EXIT_REASON(SVM_EXIT_READ_CR13    ,   13, "Read CR13."),
     142    EXIT_REASON(SVM_EXIT_READ_CR14    ,   14, "Read CR14."),
     143    EXIT_REASON(SVM_EXIT_READ_CR15    ,   15, "Read CR15."),
     144    EXIT_REASON(SVM_EXIT_WRITE_CR0    ,   16, "Write CR0."),
     145    EXIT_REASON(SVM_EXIT_WRITE_CR1    ,   17, "Write CR1."),
     146    EXIT_REASON(SVM_EXIT_WRITE_CR2    ,   18, "Write CR2."),
     147    EXIT_REASON(SVM_EXIT_WRITE_CR3    ,   19, "Write CR3."),
     148    EXIT_REASON(SVM_EXIT_WRITE_CR4    ,   20, "Write CR4."),
     149    EXIT_REASON(SVM_EXIT_WRITE_CR5    ,   21, "Write CR5."),
     150    EXIT_REASON(SVM_EXIT_WRITE_CR6    ,   22, "Write CR6."),
     151    EXIT_REASON(SVM_EXIT_WRITE_CR7    ,   23, "Write CR7."),
     152    EXIT_REASON(SVM_EXIT_WRITE_CR8    ,   24, "Write CR8."),
     153    EXIT_REASON(SVM_EXIT_WRITE_CR9    ,   25, "Write CR9."),
     154    EXIT_REASON(SVM_EXIT_WRITE_CR10   ,   26, "Write CR10."),
     155    EXIT_REASON(SVM_EXIT_WRITE_CR11   ,   27, "Write CR11."),
     156    EXIT_REASON(SVM_EXIT_WRITE_CR12   ,   28, "Write CR12."),
     157    EXIT_REASON(SVM_EXIT_WRITE_CR13   ,   29, "Write CR13."),
     158    EXIT_REASON(SVM_EXIT_WRITE_CR14   ,   30, "Write CR14."),
     159    EXIT_REASON(SVM_EXIT_WRITE_CR15   ,   31, "Write CR15."),
     160    EXIT_REASON(SVM_EXIT_READ_DR0     ,   32, "Read DR0."),
     161    EXIT_REASON(SVM_EXIT_READ_DR1     ,   33, "Read DR1."),
     162    EXIT_REASON(SVM_EXIT_READ_DR2     ,   34, "Read DR2."),
     163    EXIT_REASON(SVM_EXIT_READ_DR3     ,   35, "Read DR3."),
     164    EXIT_REASON(SVM_EXIT_READ_DR4     ,   36, "Read DR4."),
     165    EXIT_REASON(SVM_EXIT_READ_DR5     ,   37, "Read DR5."),
     166    EXIT_REASON(SVM_EXIT_READ_DR6     ,   38, "Read DR6."),
     167    EXIT_REASON(SVM_EXIT_READ_DR7     ,   39, "Read DR7."),
     168    EXIT_REASON(SVM_EXIT_READ_DR8     ,   40, "Read DR8."),
     169    EXIT_REASON(SVM_EXIT_READ_DR9     ,   41, "Read DR9."),
     170    EXIT_REASON(SVM_EXIT_READ_DR10    ,   42, "Read DR10."),
     171    EXIT_REASON(SVM_EXIT_READ_DR11    ,   43, "Read DR11"),
     172    EXIT_REASON(SVM_EXIT_READ_DR12    ,   44, "Read DR12."),
     173    EXIT_REASON(SVM_EXIT_READ_DR13    ,   45, "Read DR13."),
     174    EXIT_REASON(SVM_EXIT_READ_DR14    ,   46, "Read DR14."),
     175    EXIT_REASON(SVM_EXIT_READ_DR15    ,   47, "Read DR15."),
     176    EXIT_REASON(SVM_EXIT_WRITE_DR0    ,   48, "Write DR0."),
     177    EXIT_REASON(SVM_EXIT_WRITE_DR1    ,   49, "Write DR1."),
     178    EXIT_REASON(SVM_EXIT_WRITE_DR2    ,   50, "Write DR2."),
     179    EXIT_REASON(SVM_EXIT_WRITE_DR3    ,   51, "Write DR3."),
     180    EXIT_REASON(SVM_EXIT_WRITE_DR4    ,   52, "Write DR4."),
     181    EXIT_REASON(SVM_EXIT_WRITE_DR5    ,   53, "Write DR5."),
     182    EXIT_REASON(SVM_EXIT_WRITE_DR6    ,   54, "Write DR6."),
     183    EXIT_REASON(SVM_EXIT_WRITE_DR7    ,   55, "Write DR7."),
     184    EXIT_REASON(SVM_EXIT_WRITE_DR8    ,   56, "Write DR8."),
     185    EXIT_REASON(SVM_EXIT_WRITE_DR9    ,   57, "Write DR9."),
     186    EXIT_REASON(SVM_EXIT_WRITE_DR10   ,   58, "Write DR10."),
     187    EXIT_REASON(SVM_EXIT_WRITE_DR11   ,   59, "Write DR11."),
     188    EXIT_REASON(SVM_EXIT_WRITE_DR12   ,   60, "Write DR12."),
     189    EXIT_REASON(SVM_EXIT_WRITE_DR13   ,   61, "Write DR13."),
     190    EXIT_REASON(SVM_EXIT_WRITE_DR14   ,   62, "Write DR14."),
     191    EXIT_REASON(SVM_EXIT_WRITE_DR15   ,   63, "Write DR15."),
     192    EXIT_REASON(SVM_EXIT_XCPT_0       ,   64, "Exception 0  (#DE)."),
     193    EXIT_REASON(SVM_EXIT_XCPT_1       ,   65, "Exception 1  (#DB)."),
     194    EXIT_REASON(SVM_EXIT_XCPT_2       ,   66, "Exception 2  (#NMI)."),
     195    EXIT_REASON(SVM_EXIT_XCPT_3       ,   67, "Exception 3  (#BP)."),
     196    EXIT_REASON(SVM_EXIT_XCPT_4       ,   68, "Exception 4  (#OF)."),
     197    EXIT_REASON(SVM_EXIT_XCPT_5       ,   69, "Exception 5  (#BR)."),
     198    EXIT_REASON(SVM_EXIT_XCPT_6       ,   70, "Exception 6  (#UD)."),
     199    EXIT_REASON(SVM_EXIT_XCPT_7       ,   71, "Exception 7  (#NM)."),
     200    EXIT_REASON(SVM_EXIT_XCPT_8       ,   72, "Exception 8  (#DF)."),
     201    EXIT_REASON(SVM_EXIT_XCPT_9       ,   73, "Exception 9  (#CO_SEG_OVERRUN)."),
     202    EXIT_REASON(SVM_EXIT_XCPT_10      ,   74, "Exception 10 (#TS)."),
     203    EXIT_REASON(SVM_EXIT_XCPT_11      ,   75, "Exception 11 (#NP)."),
     204    EXIT_REASON(SVM_EXIT_XCPT_12      ,   76, "Exception 12 (#SS)."),
     205    EXIT_REASON(SVM_EXIT_XCPT_13      ,   77, "Exception 13 (#GP)."),
     206    EXIT_REASON(SVM_EXIT_XCPT_14      ,   78, "Exception 14 (#PF)."),
     207    EXIT_REASON(SVM_EXIT_XCPT_15      ,   79, "Exception 15 (0x0f)."),
     208    EXIT_REASON(SVM_EXIT_XCPT_16      ,   80, "Exception 16 (#MF)."),
     209    EXIT_REASON(SVM_EXIT_XCPT_17      ,   81, "Exception 17 (#AC)."),
     210    EXIT_REASON(SVM_EXIT_XCPT_18      ,   82, "Exception 18 (#MC)."),
     211    EXIT_REASON(SVM_EXIT_XCPT_19      ,   83, "Exception 19 (#XF)."),
     212    EXIT_REASON(SVM_EXIT_XCPT_20      ,   84, "Exception 20 (#VE)."),
     213    EXIT_REASON(SVM_EXIT_XCPT_21      ,   85, "Exception 22 (0x15)."),
     214    EXIT_REASON(SVM_EXIT_XCPT_22      ,   86, "Exception 22 (0x16)."),
     215    EXIT_REASON(SVM_EXIT_XCPT_23      ,   87, "Exception 23 (0x17)."),
     216    EXIT_REASON(SVM_EXIT_XCPT_24      ,   88, "Exception 24 (0x18)."),
     217    EXIT_REASON(SVM_EXIT_XCPT_25      ,   89, "Exception 25 (0x19)."),
     218    EXIT_REASON(SVM_EXIT_XCPT_26      ,   90, "Exception 26 (0x1a)."),
     219    EXIT_REASON(SVM_EXIT_XCPT_27      ,   91, "Exception 27 (0x1b)."),
     220    EXIT_REASON(SVM_EXIT_XCPT_28      ,   92, "Exception 28 (0x1c)."),
     221    EXIT_REASON(SVM_EXIT_XCPT_29      ,   93, "Exception 29 (0x1d)."),
     222    EXIT_REASON(SVM_EXIT_XCPT_30      ,   94, "Exception 30 (#SX)."),
     223    EXIT_REASON(SVM_EXIT_XCPT_31      ,   95, "Exception 31 (0x1F)."),
     224    EXIT_REASON(SVM_EXIT_INTR         ,   96, "Physical maskable interrupt (host)."),
     225    EXIT_REASON(SVM_EXIT_NMI          ,   97, "Physical non-maskable interrupt (host)."),
     226    EXIT_REASON(SVM_EXIT_SMI          ,   98, "System management interrupt (host)."),
     227    EXIT_REASON(SVM_EXIT_INIT         ,   99, "Physical INIT signal (host)."),
     228    EXIT_REASON(SVM_EXIT_VINTR        ,  100, "Virtual interrupt-window exit."),
     229    EXIT_REASON(SVM_EXIT_CR0_SEL_WRITE,  101, "Selective CR0 Write (to bits other than CR0.TS and CR0.MP)."),
     230    EXIT_REASON(SVM_EXIT_IDTR_READ    ,  102, "Read IDTR."),
     231    EXIT_REASON(SVM_EXIT_GDTR_READ    ,  103, "Read GDTR."),
     232    EXIT_REASON(SVM_EXIT_LDTR_READ    ,  104, "Read LDTR."),
     233    EXIT_REASON(SVM_EXIT_TR_READ      ,  105, "Read TR."),
     234    EXIT_REASON(SVM_EXIT_IDTR_WRITE   ,  106, "Write IDTR."),
     235    EXIT_REASON(SVM_EXIT_GDTR_WRITE   ,  107, "Write GDTR."),
     236    EXIT_REASON(SVM_EXIT_LDTR_WRITE   ,  108, "Write LDTR."),
     237    EXIT_REASON(SVM_EXIT_TR_WRITE     ,  109, "Write TR."),
     238    EXIT_REASON(SVM_EXIT_RDTSC        ,  110, "RDTSC instruction."),
     239    EXIT_REASON(SVM_EXIT_RDPMC        ,  111, "RDPMC instruction."),
     240    EXIT_REASON(SVM_EXIT_PUSHF        ,  112, "PUSHF instruction."),
     241    EXIT_REASON(SVM_EXIT_POPF         ,  113, "POPF instruction."),
     242    EXIT_REASON(SVM_EXIT_CPUID        ,  114, "CPUID instruction."),
     243    EXIT_REASON(SVM_EXIT_RSM          ,  115, "RSM instruction."),
     244    EXIT_REASON(SVM_EXIT_IRET         ,  116, "IRET instruction."),
     245    EXIT_REASON(SVM_EXIT_SWINT        ,  117, "Software interrupt (INTn instructions)."),
     246    EXIT_REASON(SVM_EXIT_INVD         ,  118, "INVD instruction."),
     247    EXIT_REASON(SVM_EXIT_PAUSE        ,  119, "PAUSE instruction."),
     248    EXIT_REASON(SVM_EXIT_HLT          ,  120, "HLT instruction."),
     249    EXIT_REASON(SVM_EXIT_INVLPG       ,  121, "INVLPG instruction."),
     250    EXIT_REASON(SVM_EXIT_INVLPGA      ,  122, "INVLPGA instruction."),
     251    EXIT_REASON(SVM_EXIT_IOIO         ,  123, "IN/OUT/INS/OUTS instruction."),
     252    EXIT_REASON(SVM_EXIT_MSR          ,  124, "RDMSR or WRMSR access to protected MSR."),
     253    EXIT_REASON(SVM_EXIT_TASK_SWITCH  ,  125, "Task switch."),
     254    EXIT_REASON(SVM_EXIT_FERR_FREEZE  ,  126, "FERR Freeze; CPU frozen in an x87/mmx instruction waiting for interrupt."),
     255    EXIT_REASON(SVM_EXIT_SHUTDOWN     ,  127, "Shutdown."),
     256    EXIT_REASON(SVM_EXIT_VMRUN        ,  128, "VMRUN instruction."),
     257    EXIT_REASON(SVM_EXIT_VMMCALL      ,  129, "VMCALL instruction."),
     258    EXIT_REASON(SVM_EXIT_VMLOAD       ,  130, "VMLOAD instruction."),
     259    EXIT_REASON(SVM_EXIT_VMSAVE       ,  131, "VMSAVE instruction."),
     260    EXIT_REASON(SVM_EXIT_STGI         ,  132, "STGI instruction."),
     261    EXIT_REASON(SVM_EXIT_CLGI         ,  133, "CLGI instruction."),
     262    EXIT_REASON(SVM_EXIT_SKINIT       ,  134, "SKINIT instruction."),
     263    EXIT_REASON(SVM_EXIT_RDTSCP       ,  135, "RDTSCP instruction."),
     264    EXIT_REASON(SVM_EXIT_ICEBP        ,  136, "ICEBP instruction."),
     265    EXIT_REASON(SVM_EXIT_WBINVD       ,  137, "WBINVD instruction."),
     266    EXIT_REASON(SVM_EXIT_MONITOR      ,  138, "MONITOR instruction."),
     267    EXIT_REASON(SVM_EXIT_MWAIT        ,  139, "MWAIT instruction."),
     268    EXIT_REASON(SVM_EXIT_MWAIT_ARMED  ,  140, "MWAIT instruction when armed."),
     269    EXIT_REASON(SVM_EXIT_XSETBV       ,  141, "XSETBV instruction."),
     270};
     271/** Array index of the last valid AMD-V exit reason. */
     272#define MAX_EXITREASON_AMDV              141
     273
     274/** Special exit reasons not covered in the array above. */
     275#define SVM_EXIT_REASON_NPF                  EXIT_REASON(SVM_EXIT_NPF                , 1024, "Nested Page Fault.")
     276#define SVM_EXIT_REASON_AVIC_INCOMPLETE_IPI  EXIT_REASON(SVM_EXIT_AVIC_INCOMPLETE_IPI, 1025, "AVIC - Incomplete IPI delivery.")
     277#define SVM_EXIT_REASON_AVIC_NOACCEL         EXIT_REASON(SVM_EXIT_AVIC_NOACCEL       , 1026, "AVIC - Unhandled register.")
     278
     279/**
     280 * Gets the SVM exit reason if it's one of the reasons not present in the @c
     281 * g_apszSvmExitReasons array.
     282 *
     283 * @returns The exit reason or NULL if unknown.
     284 * @param   uExit       The exit.
     285 */
     286DECLINLINE(const char *) hmSvmGetSpecialExitReasonDesc(uint16_t uExit)
     287{
     288    switch (uExit)
     289    {
     290        case SVM_EXIT_NPF:                 return SVM_EXIT_REASON_NPF;
     291        case SVM_EXIT_AVIC_INCOMPLETE_IPI: return SVM_EXIT_REASON_AVIC_INCOMPLETE_IPI;
     292        case SVM_EXIT_AVIC_NOACCEL:        return SVM_EXIT_REASON_AVIC_NOACCEL;
     293    }
     294    return EXIT_REASON_NIL();
     295}
     296#undef EXIT_REASON_NIL
     297#undef EXIT_REASON
     298
     299
    41300/**
    42301 * Checks whether HM (VT-x/AMD-V) is being used by this VM.
     
    86345    }
    87346
    88     return HMVmxCanExecuteGuest(pVCpu, pCtx);
     347    return HMCanExecuteVmxGuest(pVCpu, pCtx);
    89348}
    90349
     
    192451 * @param   pVCpu       The cross context virtual CPU structure.
    193452 */
    194 VMM_INT_DECL(int) HMFlushTLB(PVMCPU pVCpu)
    195 {
    196     LogFlow(("HMFlushTLB\n"));
     453VMM_INT_DECL(int) HMFlushTlb(PVMCPU pVCpu)
     454{
     455    LogFlow(("HMFlushTlb\n"));
    197456
    198457    VMCPU_FF_SET(pVCpu, VMCPU_FF_TLB_FLUSH);
     
    277536 * @param   pVM       The cross context VM structure.
    278537 */
    279 VMM_INT_DECL(int) HMFlushTLBOnAllVCpus(PVM pVM)
     538VMM_INT_DECL(int) HMFlushTlbOnAllVCpus(PVM pVM)
    280539{
    281540    if (pVM->cCpus == 1)
    282         return HMFlushTLB(&pVM->aCpus[0]);
     541        return HMFlushTlb(&pVM->aCpus[0]);
    283542
    284543    VMCPUID idThisCpu = VMMGetCpuId(pVM);
     
    331590    /** @todo Remove or figure out to way to update the Phys STAT counter.  */
    332591    /* STAM_COUNTER_INC(&pVCpu->hm.s.StatFlushTlbInvlpgPhys); */
    333     return HMFlushTLBOnAllVCpus(pVM);
     592    return HMFlushTlbOnAllVCpus(pVM);
    334593}
    335594
     
    429688VMM_INT_DECL(bool) HMIsVmxActive(PVM pVM)
    430689{
    431     return HMIsVmxSupported(pVM) && HMIsEnabled(pVM);
    432 }
    433 
    434 
    435 /**
    436  * Checks if VT-x is supported by the host CPU.
    437  *
    438  * @returns true if VT-x is supported, false otherwise.
    439  * @param   pVM         The cross context VM structure.
    440  *
    441  * @remarks Works before hmR3InitFinalizeR0.
    442  */
    443 VMM_INT_DECL(bool) HMIsVmxSupported(PVM pVM)
    444 {
    445     return pVM->hm.s.vmx.fSupported;
     690    return pVM->hm.s.vmx.fSupported && HMIsEnabled(pVM);
    446691}
    447692
     
    537782 * @param   enmGuestMode    New guest paging mode.
    538783 */
    539 VMM_INT_DECL(void) HMHCPagingModeChanged(PVM pVM, PVMCPU pVCpu, PGMMODE enmShadowMode, PGMMODE enmGuestMode)
     784VMM_INT_DECL(void) HMHCChangedPagingMode(PVM pVM, PVMCPU pVCpu, PGMMODE enmShadowMode, PGMMODE enmGuestMode)
    540785{
    541786# ifdef IN_RING3
     
    572817# endif
    573818
    574     Log4(("HMHCPagingModeChanged: Guest paging mode '%s', shadow paging mode '%s'\n", PGMGetModeName(enmGuestMode),
     819    Log4(("HMHCChangedPagingMode: Guest paging mode '%s', shadow paging mode '%s'\n", PGMGetModeName(enmGuestMode),
    575820          PGMGetModeName(enmShadowMode)));
    576821}
     
    587832 * @param   pVmxMsrs        Where to store the VMX MSRs.
    588833 */
    589 VMM_INT_DECL(void) HMVmxGetVmxMsrsFromHwvirtMsrs(PCSUPHWVIRTMSRS pHwvirtMsrs, PVMXMSRS pVmxMsrs)
     834VMM_INT_DECL(void) HMGetVmxMsrsFromHwvirtMsrs(PCSUPHWVIRTMSRS pHwvirtMsrs, PVMXMSRS pVmxMsrs)
    590835{
    591836    AssertReturnVoid(pHwvirtMsrs);
     
    622867 * @param   pSvmMsrs        Where to store the SVM MSRs.
    623868 */
    624 VMM_INT_DECL(void) HMVmxGetSvmMsrsFromHwvirtMsrs(PCSUPHWVIRTMSRS pHwvirtMsrs, PSVMMSRS pSvmMsrs)
     869VMM_INT_DECL(void) HMGetSvmMsrsFromHwvirtMsrs(PCSUPHWVIRTMSRS pHwvirtMsrs, PSVMMSRS pSvmMsrs)
    625870{
    626871    AssertReturnVoid(pHwvirtMsrs);
     
    629874}
    630875
     876
     877/**
     878 * Gets the name of a VT-x exit code.
     879 *
     880 * @returns Pointer to read only string if @a uExit is known, otherwise NULL.
     881 * @param   uExit               The VT-x exit to name.
     882 */
     883VMM_INT_DECL(const char *) HMGetVmxExitName(uint32_t uExit)
     884{
     885    if (uExit <= MAX_EXITREASON_VTX)
     886    {
     887        Assert(uExit < RT_ELEMENTS(g_apszVmxExitReasons));
     888        return g_apszVmxExitReasons[uExit];
     889    }
     890    return NULL;
     891}
     892
     893
     894/**
     895 * Gets the name of an AMD-V exit code.
     896 *
     897 * @returns Pointer to read only string if @a uExit is known, otherwise NULL.
     898 * @param   uExit               The AMD-V exit to name.
     899 */
     900VMM_INT_DECL(const char *) HMGetSvmExitName(uint32_t uExit)
     901{
     902    if (uExit <= MAX_EXITREASON_AMDV)
     903    {
     904        Assert(uExit < RT_ELEMENTS(g_apszSvmExitReasons));
     905        return g_apszSvmExitReasons[uExit];
     906    }
     907    return hmSvmGetSpecialExitReasonDesc(uExit);
     908}
     909
Note: See TracChangeset for help on using the changeset viewer.

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