mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/svm: Intercept and terminate RDPRU with #UD
The RDPRU instruction isn't supported at all (and it is unclear how this can ever be offered safely to guests). However, a guest which ignores CPUID and blindly executes RDPRU will find that it functions. Use the intercept and terminate with #UD. While at it, fold SKINIT into the same "unconditionally disabled" path. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
3d189f16a1
commit
2e2e22c7d5
3 files changed
+7
-5
No files matched your search
@@ -2945,6 +2945,8 @@ void svm_vmexit_handler(struct cpu_user_regs *regs)
|
||||
|
||||
case VMEXIT_MONITOR:
|
||||
case VMEXIT_MWAIT:
|
||||
case VMEXIT_SKINIT:
|
||||
case VMEXIT_RDPRU:
|
||||
hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC);
|
||||
break;
|
||||
|
||||
@@ -2963,9 +2965,6 @@ void svm_vmexit_handler(struct cpu_user_regs *regs)
|
||||
case VMEXIT_CLGI:
|
||||
svm_vmexit_do_clgi(regs, v);
|
||||
break;
|
||||
case VMEXIT_SKINIT:
|
||||
hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC);
|
||||
break;
|
||||
|
||||
case VMEXIT_XSETBV:
|
||||
if ( vmcb_get_cpl(vmcb) )
|
||||
|
||||
@@ -70,7 +70,8 @@ static int construct_vmcb(struct vcpu *v)
|
||||
GENERAL2_INTERCEPT_STGI | GENERAL2_INTERCEPT_CLGI |
|
||||
GENERAL2_INTERCEPT_SKINIT | GENERAL2_INTERCEPT_MWAIT |
|
||||
GENERAL2_INTERCEPT_WBINVD | GENERAL2_INTERCEPT_MONITOR |
|
||||
GENERAL2_INTERCEPT_XSETBV | GENERAL2_INTERCEPT_ICEBP;
|
||||
GENERAL2_INTERCEPT_XSETBV | GENERAL2_INTERCEPT_ICEBP |
|
||||
GENERAL2_INTERCEPT_RDPRU;
|
||||
|
||||
/* Intercept all debug-register writes. */
|
||||
vmcb->_dr_intercepts = ~0u;
|
||||
|
||||
@@ -74,7 +74,8 @@ enum GenericIntercept2bits
|
||||
GENERAL2_INTERCEPT_MONITOR = 1 << 10,
|
||||
GENERAL2_INTERCEPT_MWAIT = 1 << 11,
|
||||
GENERAL2_INTERCEPT_MWAIT_CONDITIONAL = 1 << 12,
|
||||
GENERAL2_INTERCEPT_XSETBV = 1 << 13
|
||||
GENERAL2_INTERCEPT_XSETBV = 1 << 13,
|
||||
GENERAL2_INTERCEPT_RDPRU = 1 << 14,
|
||||
};
|
||||
|
||||
|
||||
@@ -300,6 +301,7 @@ enum VMEXIT_EXITCODE
|
||||
VMEXIT_MWAIT = 139, /* 0x8b */
|
||||
VMEXIT_MWAIT_CONDITIONAL= 140, /* 0x8c */
|
||||
VMEXIT_XSETBV = 141, /* 0x8d */
|
||||
VMEXIT_RDPRU = 142, /* 0x8e */
|
||||
VMEXIT_NPF = 1024, /* 0x400, nested paging fault */
|
||||
VMEXIT_INVALID = -1
|
||||
};
|
||||
|
||||