|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 08/17] x86emul: fold/eliminate some local variables
On 09/14/2017 04:16 PM, Jan Beulich wrote:
> Make i switch-wide (at once making it unsigned, as it should have been)
> and introduce n (for immediate use in enter and aam/aad handling).
> Eliminate on-stack arrays in pusha/popa handling. Use ea.val instead of
> a custom variable in bound handling.
>
> No (intended) functional change.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
> @@ -3238,6 +3238,7 @@ x86_emulate(
> struct segment_register cs, sreg;
> struct cpuid_leaf cpuid_leaf;
> uint64_t msr_val;
> + unsigned int i, n;
> unsigned long dummy;
>
> case 0x00 ... 0x05: add: /* add */
> @@ -3370,47 +3371,45 @@ x86_emulate(
> goto done;
> break;
>
> - case 0x60: /* pusha */ {
> - int i;
> - unsigned int regs[] = {
> - _regs.eax, _regs.ecx, _regs.edx, _regs.ebx,
> - _regs.esp, _regs.ebp, _regs.esi, _regs.edi };
> -
> + case 0x60: /* pusha */
> fail_if(!ops->write);
> + ea.val = _regs.esp;
> for ( i = 0; i < 8; i++ )
> + {
> + void *reg = decode_register(i, &_regs, 0);
> +
> if ( (rc = ops->write(x86_seg_ss, sp_pre_dec(op_bytes),
> - ®s[i], op_bytes, ctxt)) != 0 )
> - goto done;
> + reg != &_regs.esp ? reg : &ea.val,
> + op_bytes, ctxt)) != 0 )
> + goto done;
> + }
> break;
> - }
> -
> - case 0x61: /* popa */ {
> - int i;
> - unsigned int dummy_esp, *regs[] = {
> - &_regs.edi, &_regs.esi, &_regs.ebp, &dummy_esp,
> - &_regs.ebx, &_regs.edx, &_regs.ecx, &_regs.eax };
>
> + case 0x61: /* popa */
> for ( i = 0; i < 8; i++ )
> {
> + void *reg = decode_register(7 - i, &_regs, 0);
> +
> if ( (rc = read_ulong(x86_seg_ss, sp_post_inc(op_bytes),
> &dst.val, op_bytes, ctxt, ops)) != 0 )
> goto done;
> + if ( reg == &_regs.r(sp) )
> + continue;
> if ( op_bytes == 2 )
> - *(uint16_t *)regs[i] = (uint16_t)dst.val;
> + *(uint16_t *)reg = dst.val;
> else
> - *regs[i] = dst.val; /* 64b: zero-ext done by read_ulong() */
> + *(unsigned long *)reg = dst.val;
> }
> break;
> - }
>
> case 0x62: /* bound */ {
> - unsigned long src_val2;
> int lb, ub, idx;
> +
> generate_exception_if(src.type != OP_MEM, EXC_UD);
> if ( (rc = read_ulong(src.mem.seg, truncate_ea(src.mem.off +
> op_bytes),
This is the bit where the context is wrong; is this meant to be applied
on top of my AFL series?
-George
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |