Avi Kivity wrote: > Laurent Vivier wrote: >> Avi Kivity wrote: ... >>> Interesting. I don't see how an instruction fetch can fail on >>> uniprocessor. Can you give details of the failure? >>> >>> Instruction fetches can fail on SMP so a fix is certainly needed. >>> >> OK, I spoke too fast. >> >> x86_decode_insn() fails because it is not able to decode: >> >> 0xffffffff8110b7ef <__copy_user_nocache+47>: movnti %r11,(%rdi) >> or >> 0xffffffff8110b7ef <__copy_user_nocache+47>: 0x4c 0x0f 0xc3 0x1f >> >> 0x4c is decoded as a REX prefix. >> 0x0f is decoded as a Two-byte opcode >> but 0xc3 is unknown in twobyte_table, so we exit because of an unrecognized >> opcode ("Cannot emulate"). >> >> > > Not being able to emulate is sometimes legitimate. In the case of > writing to a write-protected guest page table, we simply > un-write-protect it and go back to the guest (which should now execute > the instruction natively). > > Perhaps the logic that deals with this (the call to > kvm_mmu_unprotect_page_virt() in emulate_instruction()) was broken by > your changes. >
In fact this case is managed in the error cases of emulate_instruction(). My first patch removes this management for instruction decoding because I supposed it cannot generate such errors. So what I proposed in my last email seems to be the good solution : emulate_instruction() ... r = x86_decode_insn(&vcpu->emulate_ctxt, &emulate_ops); if (r == 0) r = x86_emulate_insn(&vcpu->emulate_ctxt, &emulate_ops); ... if (r) { if (kvm_mmu_unprotect_page_virt(vcpu, cr2)) return EMULATE_DONE; if (!vcpu->mmio_needed) { kvm_report_emulation_failure(vcpu, "mmio"); return EMULATE_FAIL; } return EMULATE_DO_MMIO; } ... Regards, Laurent ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel