]> xenbits.xensource.com Git - xen.git/commitdiff
x86_emulate: Handle rep_ins, rep_outs, rep_movs hook failure and fall
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 7 Feb 2008 18:56:47 +0000 (18:56 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 7 Feb 2008 18:56:47 +0000 (18:56 +0000)
back to slow path.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/x86_emulate.c

index c111f1ca3655e447bfb629e6daea9f3a4b0090f6..32a11b6be4451378d55bda776c61c544696f704a 100644 (file)
@@ -2225,11 +2225,12 @@ x86_emulate(
         dst.bytes = !(b & 1) ? 1 : (op_bytes == 8) ? 4 : op_bytes;
         dst.mem.seg = x86_seg_es;
         dst.mem.off = truncate_ea(_regs.edi);
-        if ( (nr_reps > 1) && (ops->rep_ins != NULL) )
+        if ( (nr_reps > 1) && (ops->rep_ins != NULL) &&
+             ((rc = ops->rep_ins((uint16_t)_regs.edx, dst.mem.seg,
+                                 dst.mem.off, dst.bytes,
+                                 &nr_reps, ctxt)) != X86EMUL_UNHANDLEABLE) )
         {
-            if ( (rc = ops->rep_ins((uint16_t)_regs.edx, dst.mem.seg,
-                                    dst.mem.off, dst.bytes,
-                                    &nr_reps, ctxt)) != 0 )
+            if ( rc != 0 )
                 goto done;
         }
         else
@@ -2252,11 +2253,12 @@ x86_emulate(
         unsigned long nr_reps = get_rep_prefix();
         generate_exception_if(!mode_iopl(), EXC_GP);
         dst.bytes = !(b & 1) ? 1 : (op_bytes == 8) ? 4 : op_bytes;
-        if ( (nr_reps > 1) && (ops->rep_outs != NULL) )
+        if ( (nr_reps > 1) && (ops->rep_outs != NULL) &&
+             ((rc = ops->rep_outs(ea.mem.seg, truncate_ea(_regs.esi),
+                                  (uint16_t)_regs.edx, dst.bytes,
+                                  &nr_reps, ctxt)) != X86EMUL_UNHANDLEABLE) )
         {
-            if ( (rc = ops->rep_outs(ea.mem.seg, truncate_ea(_regs.esi),
-                                     (uint16_t)_regs.edx, dst.bytes,
-                                     &nr_reps, ctxt)) != 0 )
+            if ( rc != 0 )
                 goto done;
         }
         else
@@ -2403,11 +2405,12 @@ x86_emulate(
         dst.bytes = (d & ByteOp) ? 1 : op_bytes;
         dst.mem.seg = x86_seg_es;
         dst.mem.off = truncate_ea(_regs.edi);
-        if ( (nr_reps > 1) && (ops->rep_movs != NULL) )
+        if ( (nr_reps > 1) && (ops->rep_movs != NULL) &&
+             ((rc = ops->rep_movs(ea.mem.seg, truncate_ea(_regs.esi),
+                                  dst.mem.seg, dst.mem.off, dst.bytes,
+                                  &nr_reps, ctxt)) != X86EMUL_UNHANDLEABLE) )
         {
-            if ( (rc = ops->rep_movs(ea.mem.seg, truncate_ea(_regs.esi),
-                                     dst.mem.seg, dst.mem.off, dst.bytes,
-                                     &nr_reps, ctxt)) != 0 )
+            if ( rc != 0 )
                 goto done;
         }
         else