From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: KVM 29: Page fault in kernel mode while booting GNU/kFreeBSD Date: Sun, 15 Jul 2007 15:30:43 +0300 Message-ID: <469A1373.5090904@qumranet.com> References: <20070714170618.GB6527@hall.aurel32.net> <4699BD63.8010904@qumranet.com> <20070715121159.GO3941@hall.aurel32.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------080304050707060509030005" Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org To: Aurelien Jarno Return-path: In-Reply-To: <20070715121159.GO3941-OqXK5JiLQY5aJl8KAwiEcA@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 This is a multi-part message in MIME format. --------------080304050707060509030005 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Aurelien Jarno wrote: > On Sun, Jul 15, 2007 at 09:23:31AM +0300, Avi Kivity wrote: > >> Can you bisect kvm to find the offending commit? Basically, you do a >> >> git clone git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm.git >> cd kvm >> git bisect start drivers/kvm/ >> bit bisect bad kvm-29 >> git bisect good kvm-28 >> >> git will check out a test candidate; go to your kvm userspace directory >> and do >> >> make -C kernel sync LINUX=/path/to/the/kvm/git/directory >> make -C kernel >> sudo make -C kernel install >> >> reload the module, test, and issue 'git bisect good' or 'git bisect bad' >> according to the result. As there are only 25 commits you should be >> done in 5 cycles. >> >> > > And the result is: > > commit ba9c20c048726037664d303362b688759fdf6e9d > Author: Luca Tettamanti > Date: Tue Jun 19 22:41:20 2007 +0200 > > KVM: Fix x86 emulator writeback > > When the old value and new one are the same the emulator skips the > write; this is undesirable when the destination is a MMIO area and the > write shall be performed regardless of the previous value. This > optimization breaks e.g. a Linux guest APIC compiled without > X86_GOOD_APIC. > > Remove the check and perform the writeback stage in the emulation unless > it's explicitly disabled (currently push and some 2 bytes instructions > may disable the writeback). > > Signed-Off-By: Luca Tettamanti > Signed-off-by: Avi Kivity > > > I have tried to revert this patch directly into kvm-29, and it also > fixes the problem. > > From a cursory inspection, looks like the cmov instructions were broken by the patch. Can you try the attached patch on top of kvm-29? -- error compiling committee.c: too many arguments to function --------------080304050707060509030005 Content-Type: text/x-patch; name="cmov.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="cmov.patch" diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c index f60012d..7974012 100644 --- a/drivers/kvm/x86_emulate.c +++ b/drivers/kvm/x86_emulate.c @@ -1225,40 +1225,40 @@ twobyte_insn: break; case 0x40 ... 0x4f: /* cmov */ dst.val = dst.orig_val = src.val; - d &= ~Mov; /* default to no move */ + no_wb = 1; /* default to no move */ /* * First, assume we're decoding an even cmov opcode * (lsb == 0). */ switch ((b & 15) >> 1) { case 0: /* cmovo */ - d |= (_eflags & EFLG_OF) ? Mov : 0; + no_wb &= (_eflags & EFLG_OF) ? 0 : 1; break; case 1: /* cmovb/cmovc/cmovnae */ - d |= (_eflags & EFLG_CF) ? Mov : 0; + no_wb &= (_eflags & EFLG_CF) ? 0 : 1; break; case 2: /* cmovz/cmove */ - d |= (_eflags & EFLG_ZF) ? Mov : 0; + no_wb &= (_eflags & EFLG_ZF) ? 0 : 1; break; case 3: /* cmovbe/cmovna */ - d |= (_eflags & (EFLG_CF | EFLG_ZF)) ? Mov : 0; + no_wb &= (_eflags & (EFLG_CF | EFLG_ZF)) ? 0 : 1; break; case 4: /* cmovs */ - d |= (_eflags & EFLG_SF) ? Mov : 0; + no_wb &= (_eflags & EFLG_SF) ? 0 : 1; break; case 5: /* cmovp/cmovpe */ - d |= (_eflags & EFLG_PF) ? Mov : 0; + no_wb &= (_eflags & EFLG_PF) ? 0 : 1; break; case 7: /* cmovle/cmovng */ - d |= (_eflags & EFLG_ZF) ? Mov : 0; + no_wb &= (_eflags & EFLG_ZF) ? 0 : 1; /* fall through */ case 6: /* cmovl/cmovnge */ - d |= (!(_eflags & EFLG_SF) != - !(_eflags & EFLG_OF)) ? Mov : 0; + no_wb &= (!(_eflags & EFLG_SF) != + !(_eflags & EFLG_OF)) ? 0 : 1; break; } /* Odd cmov opcodes (lsb == 1) have inverted sense. */ - d ^= (b & 1) ? Mov : 0; + no_wb ^= (b & 1) ? 1 : 0; break; case 0xb0 ... 0xb1: /* cmpxchg */ /* --------------080304050707060509030005 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ --------------080304050707060509030005 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --------------080304050707060509030005--