|
[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 13.09.16 at 21:09, <andrew.cooper3@xxxxxxxxxx> wrote:
> 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.
That's a good idea; I didn't really like this pointer arithmetic myself,
but didn't come to think of this (seemingly obvious) alternative.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |