[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RFC V7 1/5] xen: Emulate with no writes


  • To: Jan Beulich <JBeulich@xxxxxxxx>
  • From: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx>
  • Date: Tue, 26 Aug 2014 17:30:33 +0300
  • Cc: kevin.tian@xxxxxxxxx, ian.campbell@xxxxxxxxxx, stefano.stabellini@xxxxxxxxxxxxx, andrew.cooper3@xxxxxxxxxx, eddie.dong@xxxxxxxxx, xen-devel@xxxxxxxxxxxxx, jun.nakajima@xxxxxxxxx, ian.jackson@xxxxxxxxxxxxx
  • Comment: DomainKeys? See http://domainkeys.sourceforge.net/
  • Delivery-date: Tue, 26 Aug 2014 14:30:30 +0000
  • Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=bitdefender.com; b=DdZ47uYVPpfF7V1kCe+OrdiABqSfE93xSjoLkNNRyG/3/0G8s+Wae2qN7XT03TW7VvxMLBpLYJTg8t2hY6J53GeFfQCEt7JanGN9K8V7Lrgmo3Jb5Kt/6oKL6FSDBpRhA/JllohlHE28gO7vc3l/WAqpTrz14OZOqBbdwh3a8/jdcLUOT5bPkQkbyOGDkoMk8MqBocAMNs1/62dLxQ9NgwcOONxBtds54lxZrOSdiI50jT6Neu3jFCFXWcjii7a0wtpcDMjzYXI5tJAbtdcp7DiPz3AXrejFkAvxIAaIySRjRiLKaGUTXPIo50jIxRj0iuMHsfYvK+3aE8pvxKcl0g==; h=Received:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type:Content-Transfer-Encoding:X-BitDefender-Scanner:X-BitDefender-Spam:X-BitDefender-SpamStamp:X-BitDefender-CF-Stamp;
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>

On 08/26/2014 05:19 PM, Jan Beulich wrote:
>>>> On 26.08.14 at 16:01, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
>> On 08/26/2014 04:56 PM, Jan Beulich wrote:
>>>>>> On 13.08.14 at 17:28, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
>>>> +void hvm_emulate_one_full(bool_t nowrite, unsigned int trapnr,
>>>> +    unsigned int errcode)
>>>> +{
>>>> +    struct hvm_emulate_ctxt ctx = {{ 0 }};
>>>> +    int rc;
>>>> +
>>>> +    hvm_emulate_prepare(&ctx, guest_cpu_user_regs());
>>>> +
>>>> +    if ( nowrite )
>>>> +        rc = hvm_emulate_one_no_write(&ctx);
>>>> +    else
>>>> +        rc = hvm_emulate_one(&ctx);
>>>> +
>>>> +    switch ( rc )
>>>> +    {
>>>> +    case X86EMUL_UNHANDLEABLE:
>>>> +        gdprintk(XENLOG_DEBUG, "Emulation failed @ %04x:%lx: "
>>>> +               "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
>>>> +               hvmemul_get_seg_reg(x86_seg_cs, &ctx)->sel,
>>>> +               ctx.insn_buf_eip,
>>>> +               ctx.insn_buf[0], ctx.insn_buf[1],
>>>> +               ctx.insn_buf[2], ctx.insn_buf[3],
>>>> +               ctx.insn_buf[4], ctx.insn_buf[5],
>>>> +               ctx.insn_buf[6], ctx.insn_buf[7],
>>>> +               ctx.insn_buf[8], ctx.insn_buf[9]);
>>>> +        hvm_inject_hw_exception(trapnr, errcode);
>>>> +        break;
>>>> +    case X86EMUL_EXCEPTION:
>>>> +        if ( ctx.exn_pending )
>>>> +            hvm_inject_hw_exception(ctx.exn_vector, ctx.exn_error_code);
>>>> +        break;
>>>
>>> Shouldn't you act on X86EMUL_RETRY here? Or at least not fall through
>>> to the writeback below?
>>
>> Thanks for the review, I did initially loop around hvm_emulate_one()
>> until rc != X86EMUL_RETRY, but I've been told that that might block
>> against time calibration rendezvous points.
> 
> In any event it strikes me as odd that you ignore that state
> altogether rather than propagating it back up, so that someone
> in suitable position to do the retry can invoke it.

Since it's being called in the context of handling a mem_event response,
the X86EMUL_RETRY case would lead to a retry anyway (since we couldn't
emulate the current instruction, and we haven't lifted the page access
restrictions). So if we've failed to somehow modify the guest's EIP, the
instruction will hit the page again, cause a new mem_event and a new
attempt to emulate it - so that would seem to fit with the spirit of
X86EMUL_RETRY.


Thanks,
Razvan Cojocaru

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.