From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 0/5] Split the emulator: decode & execute Date: Mon, 17 Sep 2007 19:29:21 +0200 Message-ID: <46EEB971.9000507@qumranet.com> References: <46D5A151.80000@bull.net> <46E3E3D4.1050206@qumranet.com> <46EAB36E.2060004@bull.net> <46EABD97.5060503@qumranet.com> <46EEA801.20404@bull.net> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: kvm-devel To: Laurent Vivier Return-path: In-Reply-To: <46EEA801.20404-6ktuUTfB/bM@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org Laurent Vivier wrote: > Avi Kivity wrote: > >> Laurent Vivier wrote: >> >>> Avi Kivity wrote: >>> >>> >>>> Laurent Vivier wrote: >>>> >>>> >>>>> These patches split the emulator in two parts: one to decode the >>>>> instruction, >>>>> the other to execute it. The decode part is then called only when needed. >>>>> >>>>> >>>>> >>>>> >>>> Patchset looks good, but fails booting FC6 x86-64 on Intel. It may be a >>>> merge error (did not apply cleanly due to other changes). I pushed this >>>> as a 'split-emulator' branch on the kvm.git repository. >>>> >>>> >>>> >>> I think I found the bug (not a merge error...): I just supposed that an >>> instruction fetch cannot failed. >>> >>> >>> >> 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. -- Do not meddle in the internals of kernels, for they are subtle and quick to panic. ------------------------------------------------------------------------- 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/