diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2011-04-04 06:39:27 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-05-11 07:57:01 -0400 |
commit | 8a76d7f25f8f24fc5a328c8e15e4a7313cf141b9 (patch) | |
tree | 7adadd7663b006d75563c457c6b7c5f91a4d16d2 /arch/x86/include | |
parent | 8ea7d6aef84e278fcb121acff1bd4c3edaa95b8b (diff) |
KVM: x86: Add x86 callback for intercept check
This patch adds a callback into kvm_x86_ops so that svm and
vmx code can do intercept checks on emulated instructions.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/include')
-rw-r--r-- | arch/x86/include/asm/kvm_emulate.h | 22 | ||||
-rw-r--r-- | arch/x86/include/asm/kvm_host.h | 7 |
2 files changed, 27 insertions, 2 deletions
diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h index cab841a034f9..eb7033cefe8e 100644 --- a/arch/x86/include/asm/kvm_emulate.h +++ b/arch/x86/include/asm/kvm_emulate.h | |||
@@ -26,6 +26,24 @@ struct x86_exception { | |||
26 | }; | 26 | }; |
27 | 27 | ||
28 | /* | 28 | /* |
29 | * This struct is used to carry enough information from the instruction | ||
30 | * decoder to main KVM so that a decision can be made whether the | ||
31 | * instruction needs to be intercepted or not. | ||
32 | */ | ||
33 | struct x86_instruction_info { | ||
34 | u8 intercept; /* which intercept */ | ||
35 | u8 rep_prefix; /* rep prefix? */ | ||
36 | u8 modrm_mod; /* mod part of modrm */ | ||
37 | u8 modrm_reg; /* index of register used */ | ||
38 | u8 modrm_rm; /* rm part of modrm */ | ||
39 | u64 src_val; /* value of source operand */ | ||
40 | u8 src_bytes; /* size of source operand */ | ||
41 | u8 dst_bytes; /* size of destination operand */ | ||
42 | u8 ad_bytes; /* size of src/dst address */ | ||
43 | u64 next_rip; /* rip following the instruction */ | ||
44 | }; | ||
45 | |||
46 | /* | ||
29 | * x86_emulate_ops: | 47 | * x86_emulate_ops: |
30 | * | 48 | * |
31 | * These operations represent the instruction emulator's interface to memory. | 49 | * These operations represent the instruction emulator's interface to memory. |
@@ -163,8 +181,8 @@ struct x86_emulate_ops { | |||
163 | int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata); | 181 | int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata); |
164 | void (*get_fpu)(struct x86_emulate_ctxt *ctxt); /* disables preempt */ | 182 | void (*get_fpu)(struct x86_emulate_ctxt *ctxt); /* disables preempt */ |
165 | void (*put_fpu)(struct x86_emulate_ctxt *ctxt); /* reenables preempt */ | 183 | void (*put_fpu)(struct x86_emulate_ctxt *ctxt); /* reenables preempt */ |
166 | int (*intercept)(struct x86_emulate_ctxt *ctxt, | 184 | int (*intercept)(struct kvm_vcpu *vcpu, |
167 | enum x86_intercept intercept, | 185 | struct x86_instruction_info *info, |
168 | enum x86_intercept_stage stage); | 186 | enum x86_intercept_stage stage); |
169 | }; | 187 | }; |
170 | 188 | ||
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index e820c6339b8b..038562c222e8 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h | |||
@@ -505,6 +505,8 @@ struct kvm_vcpu_stat { | |||
505 | u32 nmi_injections; | 505 | u32 nmi_injections; |
506 | }; | 506 | }; |
507 | 507 | ||
508 | struct x86_instruction_info; | ||
509 | |||
508 | struct kvm_x86_ops { | 510 | struct kvm_x86_ops { |
509 | int (*cpu_has_kvm_support)(void); /* __init */ | 511 | int (*cpu_has_kvm_support)(void); /* __init */ |
510 | int (*disabled_by_bios)(void); /* __init */ | 512 | int (*disabled_by_bios)(void); /* __init */ |
@@ -592,6 +594,11 @@ struct kvm_x86_ops { | |||
592 | void (*write_tsc_offset)(struct kvm_vcpu *vcpu, u64 offset); | 594 | void (*write_tsc_offset)(struct kvm_vcpu *vcpu, u64 offset); |
593 | 595 | ||
594 | void (*get_exit_info)(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2); | 596 | void (*get_exit_info)(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2); |
597 | |||
598 | int (*check_intercept)(struct kvm_vcpu *vcpu, | ||
599 | struct x86_instruction_info *info, | ||
600 | enum x86_intercept_stage stage); | ||
601 | |||
595 | const struct trace_print_flags *exit_reasons_str; | 602 | const struct trace_print_flags *exit_reasons_str; |
596 | }; | 603 | }; |
597 | 604 | ||