aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2011-04-04 06:39:23 -0400
committerAvi Kivity <avi@redhat.com>2011-05-11 07:57:00 -0400
commit3c6e276f22cf29188035535127c4c35aeeafcabc (patch)
tree910d8cc7338d4e8f88b2cd4d069898c579f8c0b3 /arch/x86
parentc4f035c60dad45ff8813550dc82540dbbc263df2 (diff)
KVM: x86 emulator: add SVM intercepts
Add intercept codes for instructions defined by SVM as interceptable. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/include/asm/kvm_emulate.h35
-rw-r--r--arch/x86/kvm/emulate.c24
2 files changed, 48 insertions, 11 deletions
diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h
index 2cfea49d470..470ac54ca38 100644
--- a/arch/x86/include/asm/kvm_emulate.h
+++ b/arch/x86/include/asm/kvm_emulate.h
@@ -281,6 +281,41 @@ enum x86_intercept_stage {
281 281
282enum x86_intercept { 282enum x86_intercept {
283 x86_intercept_none, 283 x86_intercept_none,
284 x86_intercept_lmsw,
285 x86_intercept_smsw,
286 x86_intercept_lidt,
287 x86_intercept_sidt,
288 x86_intercept_lgdt,
289 x86_intercept_sgdt,
290 x86_intercept_lldt,
291 x86_intercept_sldt,
292 x86_intercept_ltr,
293 x86_intercept_str,
294 x86_intercept_rdtsc,
295 x86_intercept_rdpmc,
296 x86_intercept_pushf,
297 x86_intercept_popf,
298 x86_intercept_cpuid,
299 x86_intercept_rsm,
300 x86_intercept_iret,
301 x86_intercept_intn,
302 x86_intercept_invd,
303 x86_intercept_pause,
304 x86_intercept_hlt,
305 x86_intercept_invlpg,
306 x86_intercept_invlpga,
307 x86_intercept_vmrun,
308 x86_intercept_vmload,
309 x86_intercept_vmsave,
310 x86_intercept_vmmcall,
311 x86_intercept_stgi,
312 x86_intercept_clgi,
313 x86_intercept_skinit,
314 x86_intercept_rdtscp,
315 x86_intercept_icebp,
316 x86_intercept_wbinvd,
317 x86_intercept_monitor,
318 x86_intercept_mwait,
284 319
285 nr_x86_intercepts 320 nr_x86_intercepts
286}; 321};
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index a81486790ba..c2260e57450 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -2469,15 +2469,15 @@ static struct opcode group5[] = {
2469}; 2469};
2470 2470
2471static struct group_dual group7 = { { 2471static struct group_dual group7 = { {
2472 N, N, D(ModRM | SrcMem | Priv), D(ModRM | SrcMem | Priv), 2472 N, N, DI(ModRM | SrcMem | Priv, lgdt), DI(ModRM | SrcMem | Priv, lidt),
2473 D(SrcNone | ModRM | DstMem | Mov), N, 2473 DI(SrcNone | ModRM | DstMem | Mov, smsw), N,
2474 D(SrcMem16 | ModRM | Mov | Priv), 2474 DI(SrcMem16 | ModRM | Mov | Priv, lmsw),
2475 D(SrcMem | ModRM | ByteOp | Priv | NoAccess), 2475 DI(SrcMem | ModRM | ByteOp | Priv | NoAccess, invlpg),
2476}, { 2476}, {
2477 D(SrcNone | ModRM | Priv | VendorSpecific), N, 2477 D(SrcNone | ModRM | Priv | VendorSpecific), N,
2478 N, D(SrcNone | ModRM | Priv | VendorSpecific), 2478 N, D(SrcNone | ModRM | Priv | VendorSpecific),
2479 D(SrcNone | ModRM | DstMem | Mov), N, 2479 DI(SrcNone | ModRM | DstMem | Mov, smsw), N,
2480 D(SrcMem16 | ModRM | Mov | Priv), N, 2480 DI(SrcMem16 | ModRM | Mov | Priv, lmsw), N,
2481} }; 2481} };
2482 2482
2483static struct opcode group8[] = { 2483static struct opcode group8[] = {
@@ -2556,7 +2556,7 @@ static struct opcode opcode_table[256] = {
2556 /* 0x98 - 0x9F */ 2556 /* 0x98 - 0x9F */
2557 D(DstAcc | SrcNone), I(ImplicitOps | SrcAcc, em_cwd), 2557 D(DstAcc | SrcNone), I(ImplicitOps | SrcAcc, em_cwd),
2558 I(SrcImmFAddr | No64, em_call_far), N, 2558 I(SrcImmFAddr | No64, em_call_far), N,
2559 D(ImplicitOps | Stack), D(ImplicitOps | Stack), N, N, 2559 DI(ImplicitOps | Stack, pushf), DI(ImplicitOps | Stack, popf), N, N,
2560 /* 0xA0 - 0xA7 */ 2560 /* 0xA0 - 0xA7 */
2561 I2bv(DstAcc | SrcMem | Mov | MemAbs, em_mov), 2561 I2bv(DstAcc | SrcMem | Mov | MemAbs, em_mov),
2562 I2bv(DstMem | SrcAcc | Mov | MemAbs, em_mov), 2562 I2bv(DstMem | SrcAcc | Mov | MemAbs, em_mov),
@@ -2579,7 +2579,8 @@ static struct opcode opcode_table[256] = {
2579 G(ByteOp, group11), G(0, group11), 2579 G(ByteOp, group11), G(0, group11),
2580 /* 0xC8 - 0xCF */ 2580 /* 0xC8 - 0xCF */
2581 N, N, N, D(ImplicitOps | Stack), 2581 N, N, N, D(ImplicitOps | Stack),
2582 D(ImplicitOps), D(SrcImmByte), D(ImplicitOps | No64), D(ImplicitOps), 2582 D(ImplicitOps), DI(SrcImmByte, intn),
2583 D(ImplicitOps | No64), DI(ImplicitOps, iret),
2583 /* 0xD0 - 0xD7 */ 2584 /* 0xD0 - 0xD7 */
2584 D2bv(DstMem | SrcOne | ModRM), D2bv(DstMem | ModRM), 2585 D2bv(DstMem | SrcOne | ModRM), D2bv(DstMem | ModRM),
2585 N, N, N, N, 2586 N, N, N, N,
@@ -2594,7 +2595,8 @@ static struct opcode opcode_table[256] = {
2594 D2bv(SrcNone | DstAcc), D2bv(SrcAcc | ImplicitOps), 2595 D2bv(SrcNone | DstAcc), D2bv(SrcAcc | ImplicitOps),
2595 /* 0xF0 - 0xF7 */ 2596 /* 0xF0 - 0xF7 */
2596 N, N, N, N, 2597 N, N, N, N,
2597 D(ImplicitOps | Priv), D(ImplicitOps), G(ByteOp, group3), G(0, group3), 2598 DI(ImplicitOps | Priv, hlt), D(ImplicitOps),
2599 G(ByteOp, group3), G(0, group3),
2598 /* 0xF8 - 0xFF */ 2600 /* 0xF8 - 0xFF */
2599 D(ImplicitOps), D(ImplicitOps), D(ImplicitOps), D(ImplicitOps), 2601 D(ImplicitOps), D(ImplicitOps), D(ImplicitOps), D(ImplicitOps),
2600 D(ImplicitOps), D(ImplicitOps), G(0, group4), G(0, group5), 2602 D(ImplicitOps), D(ImplicitOps), G(0, group4), G(0, group5),
@@ -2604,7 +2606,7 @@ static struct opcode twobyte_table[256] = {
2604 /* 0x00 - 0x0F */ 2606 /* 0x00 - 0x0F */
2605 N, GD(0, &group7), N, N, 2607 N, GD(0, &group7), N, N,
2606 N, D(ImplicitOps | VendorSpecific), D(ImplicitOps | Priv), N, 2608 N, D(ImplicitOps | VendorSpecific), D(ImplicitOps | Priv), N,
2607 D(ImplicitOps | Priv), D(ImplicitOps | Priv), N, N, 2609 DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N,
2608 N, D(ImplicitOps | ModRM), N, N, 2610 N, D(ImplicitOps | ModRM), N, N,
2609 /* 0x10 - 0x1F */ 2611 /* 0x10 - 0x1F */
2610 N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N, 2612 N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N,
@@ -2614,7 +2616,7 @@ static struct opcode twobyte_table[256] = {
2614 N, N, N, N, 2616 N, N, N, N,
2615 N, N, N, N, N, N, N, N, 2617 N, N, N, N, N, N, N, N,
2616 /* 0x30 - 0x3F */ 2618 /* 0x30 - 0x3F */
2617 D(ImplicitOps | Priv), I(ImplicitOps, em_rdtsc), 2619 D(ImplicitOps | Priv), II(ImplicitOps, em_rdtsc, rdtsc),
2618 D(ImplicitOps | Priv), N, 2620 D(ImplicitOps | Priv), N,
2619 D(ImplicitOps | VendorSpecific), D(ImplicitOps | Priv | VendorSpecific), 2621 D(ImplicitOps | VendorSpecific), D(ImplicitOps | Priv | VendorSpecific),
2620 N, N, 2622 N, N,