[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
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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |