On 03/25/2011 11:29 AM, Joerg Roedel wrote:
This patch adds a callback into kvm_x86_ops so that svm and
vmx code can do intercept checks on emulated instructions.
+/*
+ * This struct is used to carry enough information from the instruction
+ * decoder to main KVM so that a decision can be made whether the
+ * instruction needs to be intercepted or not.
+ */
+struct x86_instruction_info {
+ u8 intercept; /* which intercept */
+ u8 rep_prefix; /* rep prefix? */
+ u8 modrm; /* index of register used */
+ u64 src_val; /* value of source operand */
+ u8 src_bytes; /* size of source operand */
+ u8 dst_bytes; /* size of destination operand */
+ u8 ad_bytes; /* size of src/dst address */
+ u64 next_rip; /* rip following the instruction */
+};
Should be in kvm_emulate.h.
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 90a41aa..bf72ec6 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4245,7 +4245,25 @@ static int emulator_intercept(struct x86_emulate_ctxt
*ctxt,
enum x86_intercept intercept,
enum x86_intercept_stage stage)
{
- return X86EMUL_CONTINUE;
+ struct x86_instruction_info info = {
+ .intercept = intercept,
+ .rep_prefix = ctxt->decode.rep_prefix,
+ .modrm = ctxt->decode.modrm,
+ .src_val = ctxt->decode.src.val64,
+ .src_bytes = ctxt->decode.src.bytes,
+ .dst_bytes = ctxt->decode.dst.bytes,
+ .ad_bytes = ctxt->decode.ad_bytes,
+ .next_rip = ctxt->eip,
+ };
And this should be in emulate.c, so kvm code doesn't have to peek into
the emulator internals.
+
+ /*
+ * The callback only needs to be implemented if the architecture
+ * supports emulated guest-mode. This BUG_ON reminds the
+ * programmer that this callback needs to be implemented.
+ */
+ BUG_ON(kvm_x86_ops->check_intercept == NULL);
+
BUG_ON()s are nasty. I prefer a null implementation for vmx.
+ return kvm_x86_ops->check_intercept(ctxt->vcpu,&info, stage);
}
static struct x86_emulate_ops emulate_ops = {
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html