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

Reply via email to