Commit bf608f88 authored by Joerg Roedel's avatar Joerg Roedel Committed by Avi Kivity

KVM: SVM: Add intercept checks for one-byte instructions

This patch add intercept checks for emulated one-byte
instructions to the KVM instruction emulation path.
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 8061252e
...@@ -2789,7 +2789,7 @@ static struct opcode opcode_table[256] = { ...@@ -2789,7 +2789,7 @@ static struct opcode opcode_table[256] = {
D(DstMem | SrcNone | ModRM | Mov), D(ModRM | SrcMem | NoAccess | DstReg), D(DstMem | SrcNone | ModRM | Mov), D(ModRM | SrcMem | NoAccess | DstReg),
D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A), D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A),
/* 0x90 - 0x97 */ /* 0x90 - 0x97 */
X8(D(SrcAcc | DstReg)), DI(SrcAcc | DstReg, pause), X7(D(SrcAcc | DstReg)),
/* 0x98 - 0x9F */ /* 0x98 - 0x9F */
D(DstAcc | SrcNone), I(ImplicitOps | SrcAcc, em_cwd), D(DstAcc | SrcNone), I(ImplicitOps | SrcAcc, em_cwd),
I(SrcImmFAddr | No64, em_call_far), N, I(SrcImmFAddr | No64, em_call_far), N,
...@@ -2831,7 +2831,7 @@ static struct opcode opcode_table[256] = { ...@@ -2831,7 +2831,7 @@ static struct opcode opcode_table[256] = {
D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps),
D2bv(SrcNone | DstAcc), D2bv(SrcAcc | ImplicitOps), D2bv(SrcNone | DstAcc), D2bv(SrcAcc | ImplicitOps),
/* 0xF0 - 0xF7 */ /* 0xF0 - 0xF7 */
N, N, N, N, N, DI(ImplicitOps, icebp), N, N,
DI(ImplicitOps | Priv, hlt), D(ImplicitOps), DI(ImplicitOps | Priv, hlt), D(ImplicitOps),
G(ByteOp, group3), G(0, group3), G(ByteOp, group3), G(0, group3),
/* 0xF8 - 0xFF */ /* 0xF8 - 0xFF */
......
...@@ -3918,6 +3918,13 @@ static struct __x86_intercept { ...@@ -3918,6 +3918,13 @@ static struct __x86_intercept {
[x86_intercept_rdpmc] = POST_EX(SVM_EXIT_RDPMC), [x86_intercept_rdpmc] = POST_EX(SVM_EXIT_RDPMC),
[x86_intercept_cpuid] = PRE_EX(SVM_EXIT_CPUID), [x86_intercept_cpuid] = PRE_EX(SVM_EXIT_CPUID),
[x86_intercept_rsm] = PRE_EX(SVM_EXIT_RSM), [x86_intercept_rsm] = PRE_EX(SVM_EXIT_RSM),
[x86_intercept_pause] = PRE_EX(SVM_EXIT_PAUSE),
[x86_intercept_pushf] = PRE_EX(SVM_EXIT_PUSHF),
[x86_intercept_popf] = PRE_EX(SVM_EXIT_POPF),
[x86_intercept_intn] = PRE_EX(SVM_EXIT_SWINT),
[x86_intercept_iret] = PRE_EX(SVM_EXIT_IRET),
[x86_intercept_icebp] = PRE_EX(SVM_EXIT_ICEBP),
[x86_intercept_hlt] = POST_EX(SVM_EXIT_HLT),
}; };
#undef PRE_EX #undef PRE_EX
...@@ -3987,6 +3994,13 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu, ...@@ -3987,6 +3994,13 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu,
else else
vmcb->control.exit_info_1 = 0; vmcb->control.exit_info_1 = 0;
break; break;
case SVM_EXIT_PAUSE:
/*
* We get this for NOP only, but pause
* is rep not, check this here
*/
if (info->rep_prefix != REPE_PREFIX)
goto out;
default: default:
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment