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

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


  • To: Jan Beulich <JBeulich@xxxxxxxx>
  • From: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx>
  • Date: Tue, 12 Aug 2014 18:08:07 +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, 12 Aug 2014 15:08:19 +0000
  • Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=bitdefender.com; b=cKhHZNXelHmdbqBzNTaLagTkHhObesjUF2oyPUHrAG4TafK4QXk+bfOcZ9rUl/41dPQ4z1/ksB1DFpxAfAYnfdl6LGPZlBEvFfMv5vI96ZbAm06kfq7kKmkKxDjDpLKKfny9DbehQAcV7bE+60CRruh1ooiefSU6NRaGSELm4sK0vuYORYogOm4RwY2BHfdTBy5NI8r6vEnT72MjbcCZOu1XqurSZPco4dOLpCd/Wgqg3E4MHCEmH2Wc8dCl5r12/beJJPOnPbdqgDd8agoSi1BpNJiQDBOTCkBcK4n8ayQBH/6GRSC5fH1rPZ+1gAdlpBXam5I5s7QrTJupLax4YA==; 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/12/2014 05:57 PM, Jan Beulich wrote:
>>>> On 11.08.14 at 17:08, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
>> +static const struct x86_emulate_ops hvm_emulate_ops_no_write = {
>> +    .read          = hvmemul_read,
>> +    .insn_fetch    = hvmemul_insn_fetch,
>> +    .write         = hvmemul_write_discard,
>> +    .cmpxchg       = hvmemul_cmpxchg_discard,
>> +    .rep_ins       = hvmemul_rep_ins_discard,
>> +    .rep_outs      = hvmemul_rep_outs_discard,
>> +    .rep_movs      = hvmemul_rep_movs_discard,
>> +    .read_segment  = hvmemul_read_segment,
>> +    .write_segment = hvmemul_write_segment,
>> +    .read_io       = hvmemul_read_io_discard,
>> +    .write_io      = hvmemul_write_io_discard,
>> +    .read_cr       = hvmemul_read_cr,
>> +    .write_cr      = hvmemul_write_cr,
>> +    .read_msr      = hvmemul_read_msr,
>> +    .write_msr     = hvmemul_write_msr,
>> +    .wbinvd        = hvmemul_wbinvd,
> 
> How about these last two?

It would likely be safer to provide discard versions of those as well,
thank you for pointing that out.

>> +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);
>> +        /* fall through */
>> +    default:
>> +        hvm_emulate_writeback(&ctx);
> 
> Shouldn't this be pulled out of the switch to also cover the exception
> injection in the X86EMUL_UNHANDLEABLE case?

I'm not sure, that's the way it's handled in xen/arch/x86/hvm/io.c
(handle_mmio()):

 80 int handle_mmio(void)
 81 {
 82     struct hvm_emulate_ctxt ctxt;
 83     struct vcpu *curr = current;
 84     struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
 85     int rc;
 86
 87     ASSERT(!is_pvh_vcpu(curr));
 88
 89     hvm_emulate_prepare(&ctxt, guest_cpu_user_regs());
 90
 91     rc = hvm_emulate_one(&ctxt);
 92
 93     if ( rc != X86EMUL_RETRY )
 94         vio->io_state = HVMIO_none;
 95     if ( vio->io_state == HVMIO_awaiting_completion )
 96         vio->io_state = HVMIO_handle_mmio_awaiting_completion;
 97     else
 98         vio->mmio_gva = 0;
 99
100     switch ( rc )
101     {
102     case X86EMUL_UNHANDLEABLE:
103         gdprintk(XENLOG_WARNING,
104                  "MMIO emulation failed @ %04x:%lx: "
105                  "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
106                  hvmemul_get_seg_reg(x86_seg_cs, &ctxt)->sel,
107                  ctxt.insn_buf_eip,
108                  ctxt.insn_buf[0], ctxt.insn_buf[1],
109                  ctxt.insn_buf[2], ctxt.insn_buf[3],
110                  ctxt.insn_buf[4], ctxt.insn_buf[5],
111                  ctxt.insn_buf[6], ctxt.insn_buf[7],
112                  ctxt.insn_buf[8], ctxt.insn_buf[9]);
113         return 0;
114     case X86EMUL_EXCEPTION:
115         if ( ctxt.exn_pending )
116             hvm_inject_hw_exception(ctxt.exn_vector,
ctxt.exn_error_code);
117         break;
118     default:
119         break;
120     }
121
122     hvm_emulate_writeback(&ctxt);
123
124     return 1;
125 }

There's a return there in the X86EMUL_UNHANDLEABLE case, so
hvm_emulate_writeback(&ctxt) doesn't get called.


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®.