diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-02-07 18:56:47 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-02-07 18:56:47 +0000 |
commit | 23c077d931414c31ba2907cbf7b07b1a49bdfa21 (patch) | |
tree | 1eeaa71465cd794de5a017ad9f0e3e09982bde99 /xen/arch/x86/x86_emulate.c | |
parent | 785137cb6b2ebfa54bfb6af5d985ac10fa8a4560 (diff) | |
download | xen-23c077d931414c31ba2907cbf7b07b1a49bdfa21.tar.gz xen-23c077d931414c31ba2907cbf7b07b1a49bdfa21.tar.bz2 xen-23c077d931414c31ba2907cbf7b07b1a49bdfa21.zip |
x86_emulate: Handle rep_ins, rep_outs, rep_movs hook failure and fall
back to slow path.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'xen/arch/x86/x86_emulate.c')
-rw-r--r-- | xen/arch/x86/x86_emulate.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/xen/arch/x86/x86_emulate.c b/xen/arch/x86/x86_emulate.c index c111f1ca36..32a11b6be4 100644 --- a/xen/arch/x86/x86_emulate.c +++ b/xen/arch/x86/x86_emulate.c @@ -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 |