diff options
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r-- | arch/x86/kvm/emulate.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index d270f1a817dc..05a562b85025 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2645,6 +2645,17 @@ static int em_rdtsc(struct x86_emulate_ctxt *ctxt) | |||
2645 | return X86EMUL_CONTINUE; | 2645 | return X86EMUL_CONTINUE; |
2646 | } | 2646 | } |
2647 | 2647 | ||
2648 | static int em_rdpmc(struct x86_emulate_ctxt *ctxt) | ||
2649 | { | ||
2650 | u64 pmc; | ||
2651 | |||
2652 | if (ctxt->ops->read_pmc(ctxt, ctxt->regs[VCPU_REGS_RCX], &pmc)) | ||
2653 | return emulate_gp(ctxt, 0); | ||
2654 | ctxt->regs[VCPU_REGS_RAX] = (u32)pmc; | ||
2655 | ctxt->regs[VCPU_REGS_RDX] = pmc >> 32; | ||
2656 | return X86EMUL_CONTINUE; | ||
2657 | } | ||
2658 | |||
2648 | static int em_mov(struct x86_emulate_ctxt *ctxt) | 2659 | static int em_mov(struct x86_emulate_ctxt *ctxt) |
2649 | { | 2660 | { |
2650 | ctxt->dst.val = ctxt->src.val; | 2661 | ctxt->dst.val = ctxt->src.val; |
@@ -3411,7 +3422,7 @@ static struct opcode twobyte_table[256] = { | |||
3411 | II(ImplicitOps | Priv, em_wrmsr, wrmsr), | 3422 | II(ImplicitOps | Priv, em_wrmsr, wrmsr), |
3412 | IIP(ImplicitOps, em_rdtsc, rdtsc, check_rdtsc), | 3423 | IIP(ImplicitOps, em_rdtsc, rdtsc, check_rdtsc), |
3413 | II(ImplicitOps | Priv, em_rdmsr, rdmsr), | 3424 | II(ImplicitOps | Priv, em_rdmsr, rdmsr), |
3414 | DIP(ImplicitOps, rdpmc, check_rdpmc), | 3425 | IIP(ImplicitOps, em_rdpmc, rdpmc, check_rdpmc), |
3415 | I(ImplicitOps | VendorSpecific, em_sysenter), | 3426 | I(ImplicitOps | VendorSpecific, em_sysenter), |
3416 | I(ImplicitOps | Priv | VendorSpecific, em_sysexit), | 3427 | I(ImplicitOps | Priv | VendorSpecific, em_sysexit), |
3417 | N, N, | 3428 | N, N, |