VirtualBox

Ticket #13122: rdseed.patch

File rdseed.patch, 6.7 KB (added by Jason L. Wright, 10 years ago)

RDSEED VMX patch

  • include/VBox/vmm/hm_vmx.h

     
    10021002#define VMX_EXIT_INVPCID                                        58
    10031003/** 59 VMFUNC. Guest software attempted to execute VMFUNC. */
    10041004#define VMX_EXIT_VMFUNC                                         59
     1005/** 61 RDSEED. Guest software attempted to execute RDSEED. */
     1006#define VMX_EXIT_RDSEED                                         61
    10051007/** The maximum exit value (inclusive). */
    1006 #define VMX_EXIT_MAX                                            (VMX_EXIT_VMFUNC)
     1008#define VMX_EXIT_MAX                                            (VMX_EXIT_RDSEED)
    10071009/** @} */
    10081010
    10091011
     
    13901392#define VMX_VMCS_CTRL_PROC_EXEC2_INVPCID                        RT_BIT(12)
    13911393/** Enables VMFUNC instructions. */
    13921394#define VMX_VMCS_CTRL_PROC_EXEC2_VMFUNC                         RT_BIT(13)
     1395/** VM Exit when executing RDSEED instructions. */
     1396#define VMX_VMCS_CTRL_PROC_EXEC2_RDSEED_EXIT                    RT_BIT(16)
    13931397/** @} */
    13941398
    13951399
  • src/VBox/VMM/VMMR0/HMVMXR0.cpp

     
    396396static FNVMXEXITHANDLER hmR0VmxExitXsetbv;
    397397static FNVMXEXITHANDLER hmR0VmxExitRdrand;
    398398static FNVMXEXITHANDLER hmR0VmxExitInvpcid;
     399static FNVMXEXITHANDLER hmR0VmxExitRdseed;
    399400/** @} */
    400401
    401402static int          hmR0VmxExitXcptNM(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVmxTransient);
     
    478479 /* 56  UNDEFINED                        */  hmR0VmxExitErrUndefined,
    479480 /* 57  VMX_EXIT_RDRAND                  */  hmR0VmxExitRdrand,
    480481 /* 58  VMX_EXIT_INVPCID                 */  hmR0VmxExitInvpcid,
    481  /* 59  VMX_EXIT_VMFUNC                  */  hmR0VmxExitSetPendingXcptUD
     482 /* 59  VMX_EXIT_VMFUNC                  */  hmR0VmxExitSetPendingXcptUD,
     483 /* 60  UNDEFINED                        */  hmR0VmxExitErrUndefined,
     484 /* 61  VMX_EXIT_RDSEED                  */  hmR0VmxExitRdseed,
    482485};
    483486#endif /* HMVMX_USE_FUNCTION_TABLE */
    484487
     
    88748877        case VMX_EXIT_WBINVD:                  /* SVVMCS(); */ rc = hmR0VmxExitWbinvd(pVCpu, pMixedCtx, pVmxTransient);            /* LDVMCS(); */ break;
    88758878        case VMX_EXIT_XSETBV:                  /* SVVMCS(); */ rc = hmR0VmxExitXsetbv(pVCpu, pMixedCtx, pVmxTransient);            /* LDVMCS(); */ break;
    88768879        case VMX_EXIT_RDRAND:                  /* SVVMCS(); */ rc = hmR0VmxExitRdrand(pVCpu, pMixedCtx, pVmxTransient);            /* LDVMCS(); */ break;
     8880        case VMX_EXIT_RDSEED:                  /* SVVMCS(); */ rc = hmR0VmxExitRdseed(pVCpu, pMixedCtx, pVmxTransient);            /* LDVMCS(); */ break;
    88778881        case VMX_EXIT_INVPCID:                 /* SVVMCS(); */ rc = hmR0VmxExitInvpcid(pVCpu, pMixedCtx, pVmxTransient);           /* LDVMCS(); */ break;
    88788882        case VMX_EXIT_GETSEC:                  /* SVVMCS(); */ rc = hmR0VmxExitGetsec(pVCpu, pMixedCtx, pVmxTransient);            /* LDVMCS(); */ break;
    88798883        case VMX_EXIT_RDPMC:                   /* SVVMCS(); */ rc = hmR0VmxExitRdpmc(pVCpu, pMixedCtx, pVmxTransient);             /* LDVMCS(); */ break;
     
    1031410318
    1031510319
    1031610320/**
     10321 * VM-exit handler for RDSEED (VMX_EXIT_RDSEED). Conditional VM-exit.
     10322 */
     10323HMVMX_EXIT_DECL hmR0VmxExitRdseed(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVmxTransient)
     10324{
     10325    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS();
     10326
     10327    /* By default, we don't enable VMX_VMCS_CTRL_PROC_EXEC2_RDSEED_EXIT. */
     10328    STAM_COUNTER_INC(&pVCpu->hm.s.StatExitRdseed);
     10329    if (pVCpu->hm.s.vmx.u32ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDSEED_EXIT)
     10330        return VERR_EM_INTERPRETER;
     10331    AssertMsgFailed(("Unexpected RDSEED exit. pVCpu=%p pMixedCtx=%p\n", pVCpu, pMixedCtx));
     10332    HMVMX_RETURN_UNEXPECTED_EXIT();
     10333}
     10334
     10335
     10336/**
    1031710337 * VM-exit handler for RDMSR (VMX_EXIT_RDMSR).
    1031810338 */
    1031910339HMVMX_EXIT_DECL hmR0VmxExitRdmsr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVmxTransient)
  • src/VBox/VMM/VMMR3/HM.cpp

     
    120120    EXIT_REASON_NIL(),
    121121    EXIT_REASON(VMX_EXIT_RDRAND             , 57, "Guest attempted to execute RDRAND."),
    122122    EXIT_REASON(VMX_EXIT_INVPCID            , 58, "Guest attempted to execute INVPCID."),
    123     EXIT_REASON(VMX_EXIT_VMFUNC             , 59, "Guest attempted to execute VMFUNC.")
     123    EXIT_REASON(VMX_EXIT_VMFUNC             , 59, "Guest attempted to execute VMFUNC."),
     124    EXIT_REASON_NIL(),
     125    EXIT_REASON(VMX_EXIT_RDSEED             , 61, "Guest attempted to execute RDSEED."),
    124126};
    125127/** Exit reason descriptions for AMD-V, used to describe statistics. */
    126128static const char * const g_apszAmdVExitReasons[MAX_EXITREASON_STAT] =
     
    672674        HM_REG_COUNTER(&pVCpu->hm.s.StatExitRdtscp,             "/HM/CPU%d/Exit/Instr/Rdtscp", "Guest attempted to execute RDTSCP.");
    673675        HM_REG_COUNTER(&pVCpu->hm.s.StatExitRdpmc,              "/HM/CPU%d/Exit/Instr/Rdpmc", "Guest attempted to execute RDPMC.");
    674676        HM_REG_COUNTER(&pVCpu->hm.s.StatExitRdrand,             "/HM/CPU%d/Exit/Instr/Rdrand", "Guest attempted to execute RDRAND.");
     677        HM_REG_COUNTER(&pVCpu->hm.s.StatExitRdseed,             "/HM/CPU%d/Exit/Instr/Rdseed", "Guest attempted to execute RDSEED.");
    675678        HM_REG_COUNTER(&pVCpu->hm.s.StatExitRdmsr,              "/HM/CPU%d/Exit/Instr/Rdmsr", "Guest attempted to execute RDMSR.");
    676679        HM_REG_COUNTER(&pVCpu->hm.s.StatExitWrmsr,              "/HM/CPU%d/Exit/Instr/Wrmsr", "Guest attempted to execute WRMSR.");
    677680        HM_REG_COUNTER(&pVCpu->hm.s.StatExitMwait,              "/HM/CPU%d/Exit/Instr/Mwait", "Guest attempted to execute MWAIT.");
     
    10531056        HMVMX_REPORT_FEATURE(val, zap, VMX_VMCS_CTRL_PROC_EXEC2_RDRAND_EXIT);
    10541057        HMVMX_REPORT_FEATURE(val, zap, VMX_VMCS_CTRL_PROC_EXEC2_INVPCID);
    10551058        HMVMX_REPORT_FEATURE(val, zap, VMX_VMCS_CTRL_PROC_EXEC2_VMFUNC);
     1059        HMVMX_REPORT_FEATURE(val, zap, VMX_VMCS_CTRL_PROC_EXEC2_RDSEED_EXIT);
    10561060    }
    10571061
    10581062    LogRel(("HM: MSR_IA32_VMX_ENTRY_CTLS         = %#RX64\n", pVM->hm.s.vmx.Msrs.VmxEntry.u));
  • src/VBox/VMM/include/HMInternal.h

     
    874874    STAMCOUNTER             StatExitRdtscp;
    875875    STAMCOUNTER             StatExitRdpmc;
    876876    STAMCOUNTER             StatExitRdrand;
     877    STAMCOUNTER             StatExitRdseed;
    877878    STAMCOUNTER             StatExitCli;
    878879    STAMCOUNTER             StatExitSti;
    879880    STAMCOUNTER             StatExitPushf;

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