From: Jan Beulich Date: Mon, 12 Dec 2016 16:47:29 +0000 (+0100) Subject: x86emul: consolidate string insn register adjustments X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~3185 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b5c8918164e034145aa2ea96531c97413182f0f3;p=xen.git x86emul: consolidate string insn register adjustments Move the looking at EFLAGS.DF into the macro (being renamed to no longer suggest a particular direction, rendering all call sites more readable. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index c9d48feb77..ddc48dcc71 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -728,8 +728,10 @@ do { \ (reg) = ((reg) & ~((1UL << (_width << 3)) - 1)) | \ (((reg) + _inc) & ((1UL << (_width << 3)) - 1)); \ } while (0) -#define register_address_increment(reg, inc) \ - _register_address_increment((reg), (inc), ad_bytes) +#define register_address_adjust(reg, adj) \ + _register_address_increment(reg, \ + _regs.eflags & EFLG_DF ? -(adj) : (adj), \ + ad_bytes) #define sp_pre_dec(dec) ({ \ _register_address_increment(_regs.esp, -(dec), ctxt->sp_size/8); \ @@ -2931,9 +2933,7 @@ x86_emulate( dst.type = OP_MEM; nr_reps = 1; } - register_address_increment( - _regs.edi, - nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes)); + register_address_adjust(_regs.edi, nr_reps * dst.bytes); put_rep_prefix(nr_reps); break; } @@ -2962,9 +2962,7 @@ x86_emulate( goto done; nr_reps = 1; } - register_address_increment( - _regs.esi, - nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes)); + register_address_adjust(_regs.esi, nr_reps * dst.bytes); put_rep_prefix(nr_reps); break; } @@ -3203,12 +3201,8 @@ x86_emulate( dst.type = OP_MEM; nr_reps = 1; } - register_address_increment( - _regs.esi, - nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes)); - register_address_increment( - _regs.edi, - nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes)); + register_address_adjust(_regs.esi, nr_reps * dst.bytes); + register_address_adjust(_regs.edi, nr_reps * dst.bytes); put_rep_prefix(nr_reps); break; } @@ -3223,10 +3217,8 @@ x86_emulate( (rc = read_ulong(x86_seg_es, truncate_ea(_regs.edi), &src.val, src.bytes, ctxt, ops)) ) goto done; - register_address_increment( - _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); - register_address_increment( - _regs.edi, (_regs.eflags & EFLG_DF) ? -src.bytes : src.bytes); + register_address_adjust(_regs.esi, dst.bytes); + register_address_adjust(_regs.edi, src.bytes); put_rep_prefix(1); /* cmp: dst - src ==> src=*%%edi,dst=*%%esi ==> *%%esi - *%%edi */ emulate_2op_SrcV("cmp", src, dst, _regs.eflags); @@ -3253,9 +3245,7 @@ x86_emulate( } else if ( rc != X86EMUL_OKAY ) goto done; - register_address_increment( - _regs.edi, - nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes)); + register_address_adjust(_regs.edi, nr_reps * dst.bytes); put_rep_prefix(nr_reps); break; } @@ -3265,8 +3255,7 @@ x86_emulate( if ( (rc = read_ulong(ea.mem.seg, truncate_ea(_regs.esi), &dst.val, dst.bytes, ctxt, ops)) != 0 ) goto done; - register_address_increment( - _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); + register_address_adjust(_regs.esi, dst.bytes); put_rep_prefix(1); break; @@ -3277,8 +3266,7 @@ x86_emulate( if ( (rc = read_ulong(x86_seg_es, truncate_ea(_regs.edi), &dst.val, src.bytes, ctxt, ops)) != 0 ) goto done; - register_address_increment( - _regs.edi, (_regs.eflags & EFLG_DF) ? -src.bytes : src.bytes); + register_address_adjust(_regs.edi, src.bytes); put_rep_prefix(1); /* cmp: %%eax - *%%edi ==> src=%%eax,dst=*%%edi ==> src - dst */ dst.bytes = src.bytes;