[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 03/17] x86emul: track only rIP in emulator state
On 08/09/16 14:09, Jan Beulich wrote: > Now that all decoding happens in x86_decode() there's no need to keep > the local registers copy in struct x86_emulate_state. Only rIP gets > updated in the decode phase, so only that register needs tracking > there. All other (read-only) registers can be read from the original > structure (but sadly, due to it getting passed to decode_register(), > the pointer can't be made point to "const" to make the compiler help > ensure no modification happens). I was going to suggest making a second helper and casting away constness, but that also has problems with the mark_regs_dirty() call. However, on further consideration... > @@ -2061,6 +2064,8 @@ x86_emulate( > struct x86_emulate_ctxt *ctxt, > const struct x86_emulate_ops *ops) > { > + /* Shadow copy of register state. Committed on successful emulation. */ > + struct cpu_user_regs _regs = *ctxt->regs; > struct x86_emulate_state state; > int rc; > uint8_t b, d; > @@ -2074,10 +2079,21 @@ x86_emulate( > if ( rc != X86EMUL_OKAY) > return rc; > > + /* Sync rIP to post decode value. */ > + _regs.eip = state.eip; > + > b = state.opcode; > d = state.desc; > #define state (&state) > > + /* Re-vector ea's register pointer into our shadow registers. */ > + if ( ea.type == OP_REG ) > + { > + unsigned int offs = (void *)ea.reg - (void *)state->regs; > + > + ea.reg = (void *)&_regs + offs; > + } > + This is some very hairy pointer arithmetic. Why do we need to decode registers in x86_decode()? We don't need to decode the GPRs to calculate the length of the instruction. If the displacement is stashed in x86_emulate_state, the calculation of ea can be deferred until the start of x86_emulate(), and no arithmetic like this would be necessary. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |