From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=36991 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OBwiE-0007ON-Jh for qemu-devel@nongnu.org; Tue, 11 May 2010 17:09:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OBwiD-0004B4-2N for qemu-devel@nongnu.org; Tue, 11 May 2010 17:09:58 -0400 Received: from mail-fx0-f45.google.com ([209.85.161.45]:50248) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OBwiC-0004Ax-Q2 for qemu-devel@nongnu.org; Tue, 11 May 2010 17:09:57 -0400 Received: by fxm12 with SMTP id 12so561291fxm.4 for ; Tue, 11 May 2010 14:09:55 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <1273611384.4840.29.camel@localhost> References: <1273611384.4840.29.camel@localhost> Date: Wed, 12 May 2010 00:09:54 +0300 Message-ID: Subject: Re: [Qemu-devel] qemu-kvm problem with DOS/4GW extender and EMM386.EXE From: Mohammed Gamal Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Andy Walls Cc: qemu-devel@nongnu.org On Tue, May 11, 2010 at 11:56 PM, Andy Walls wrot= e: > Running an MS-DOS 6.22 image with qemu-kvm on a RedHat Linux OS, I > noticed the guest OS becomes hung and my dmesg gets spammed with > > =A0 =A0 =A0 =A0set_cr0: #GP, set PG flag with a clear PE flag > > That message appears to be the linux kernel's kvm emulator griping about > Paging Enable bit being enabled while the Protection Enable bit is set > for real mode. =A0(The Intel manual says this should be a protection > fault). > > The program that causes this has the DOS/4GW DOS extender runtime > compiled into it. > > I found that when I don't load the EMM386.EXE memory manager, the > problem doesn't occur. > > Here's a kvmtrace segment of when things are not working: > > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0IO_WRITE =A0 =A0 =A0vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ port =3D 0x0070, size =3D 1 ] > 28471049668815 (+ =A0 =A0 =A0 =A04000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049671815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000004e, rip =3D 0x00000= 000 00002a18 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0PAGE_FAULT =A0 =A0vcpu =3D 0x00000000 =A0p= id =3D 0x00001997 [ errorcode =3D 0x00000000, virt =3D 0x00000000 0001ba28 = ] > 28471049675815 (+ =A0 =A0 =A0 =A04000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049678815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000004e, rip =3D 0x00000= 000 00000334 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0PAGE_FAULT =A0 =A0vcpu =3D 0x00000000 =A0p= id =3D 0x00001997 [ errorcode =3D 0x00000000, virt =3D 0x00000000 00019344 = ] > 28471049681815 (+ =A0 =A0 =A0 =A03000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049685815 (+ =A0 =A0 =A0 =A04000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000000, rip =3D 0x00000= 000 000002a7 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0CR_READ =A0 =A0 =A0 vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ CR# =3D 0, value =3D 0x00000000 80000011 ] > 28471049688815 (+ =A0 =A0 =A0 =A03000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049691815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000010, rip =3D 0x00000= 000 000002ae ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0LMSW =A0 =A0 =A0 =A0 =A0vcpu =3D 0x0000000= 0 =A0pid =3D 0x00001997 [ value =3D 0x80000011 ] > 28471049696815 (+ =A0 =A0 =A0 =A05000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049699815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000004e, rip =3D 0x00000= 000 00005593 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0PAGE_FAULT =A0 =A0vcpu =3D 0x00000000 =A0p= id =3D 0x00001997 [ errorcode =3D 0x00000000, virt =3D 0x00000000 000262e3 = ] > 28471049703815 (+ =A0 =A0 =A0 =A04000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049706815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000004e, rip =3D 0x00000= 000 000044d6 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0PAGE_FAULT =A0 =A0vcpu =3D 0x00000000 =A0p= id =3D 0x00001997 [ errorcode =3D 0x00000000, virt =3D 0x00000000 00025226 = ] > 28471049709815 (+ =A0 =A0 =A0 =A03000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049713815 (+ =A0 =A0 =A0 =A04000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000004e, rip =3D 0x00000= 000 000055c0 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0PAGE_FAULT =A0 =A0vcpu =3D 0x00000000 =A0p= id =3D 0x00001997 [ errorcode =3D 0x00000002, virt =3D 0x00000000 00024f79 = ] > 28471049717815 (+ =A0 =A0 =A0 =A04000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049721815 (+ =A0 =A0 =A0 =A04000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000000, rip =3D 0x00000= 000 00002a69 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0CR_READ =A0 =A0 =A0 vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ CR# =3D 0, value =3D 0x00000000 80000011 ] > 28471049723815 (+ =A0 =A0 =A0 =A02000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049726815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000010, rip =3D 0x00000= 000 00002a73 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0LMSW =A0 =A0 =A0 =A0 =A0vcpu =3D 0x0000000= 0 =A0pid =3D 0x00001997 [ value =3D 0x80000010 ] > 28471049781815 (+ =A0 =A0 =A0 55000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x00= 000000 =A0pid =3D 0x00001997 > 28471049784815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000004e, rip =3D 0x00000= 000 00001fb8 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0PAGE_FAULT =A0 =A0vcpu =3D 0x00000000 =A0p= id =3D 0x00001997 [ errorcode =3D 0x00000000, virt =3D 0x00000000 00022d08 = ] > 28471049788815 (+ =A0 =A0 =A0 =A04000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049792815 (+ =A0 =A0 =A0 =A04000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000007b, rip =3D 0x00000= 000 00001fd6 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0IO_WRITE =A0 =A0 =A0vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ port =3D 0x0020, size =3D 1 ] > 28471049794815 (+ =A0 =A0 =A0 =A02000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049797815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000007b, rip =3D 0x00000= 000 00001fd9 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0IO_READ =A0 =A0 =A0 vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ port =3D 0x0020, size =3D 1 ] > 28471049800815 (+ =A0 =A0 =A0 =A03000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049803815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000004e, rip =3D 0x00000= 000 00001f70 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0PAGE_FAULT =A0 =A0vcpu =3D 0x00000000 =A0p= id =3D 0x00001997 [ errorcode =3D 0x00000000, virt =3D 0x00000000 0001a072 = ] > 28471049807815 (+ =A0 =A0 =A0 =A04000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049811815 (+ =A0 =A0 =A0 =A04000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000000, rip =3D 0x00000= 000 00002a69 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0CR_READ =A0 =A0 =A0 vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ CR# =3D 0, value =3D 0x00000000 80000011 ] > 28471049815815 (+ =A0 =A0 =A0 =A04000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049818815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000010, rip =3D 0x00000= 000 00002a73 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0LMSW =A0 =A0 =A0 =A0 =A0vcpu =3D 0x0000000= 0 =A0pid =3D 0x00001997 [ value =3D 0x80000010 ] > 28471049840815 (+ =A0 =A0 =A0 22000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x00= 000000 =A0pid =3D 0x00001997 > 28471049844815 (+ =A0 =A0 =A0 =A04000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000007b, rip =3D 0x00000= 000 00001fd6 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0IO_WRITE =A0 =A0 =A0vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ port =3D 0x0020, size =3D 1 ] > 28471049846815 (+ =A0 =A0 =A0 =A02000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049849815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000007b, rip =3D 0x00000= 000 00001fd9 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0IO_READ =A0 =A0 =A0 vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ port =3D 0x0020, size =3D 1 ] > 28471049851815 (+ =A0 =A0 =A0 =A02000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049855815 (+ =A0 =A0 =A0 =A04000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000000, rip =3D 0x00000= 000 00002a69 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0CR_READ =A0 =A0 =A0 vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ CR# =3D 0, value =3D 0x00000000 80000011 ] > 28471049858815 (+ =A0 =A0 =A0 =A03000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049861815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000010, rip =3D 0x00000= 000 00002a73 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0LMSW =A0 =A0 =A0 =A0 =A0vcpu =3D 0x0000000= 0 =A0pid =3D 0x00001997 [ value =3D 0x80000010 ] > 28471049882815 (+ =A0 =A0 =A0 21000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x00= 000000 =A0pid =3D 0x00001997 > 28471049885815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000007b, rip =3D 0x00000= 000 00001fd6 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0IO_WRITE =A0 =A0 =A0vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ port =3D 0x0020, size =3D 1 ] > 28471049887815 (+ =A0 =A0 =A0 =A02000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049890815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000007b, rip =3D 0x00000= 000 00001fd9 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0IO_READ =A0 =A0 =A0 vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ port =3D 0x0020, size =3D 1 ] > 28471049892815 (+ =A0 =A0 =A0 =A02000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049896815 (+ =A0 =A0 =A0 =A04000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000000, rip =3D 0x00000= 000 00002a69 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0CR_READ =A0 =A0 =A0 vcpu =3D 0x00000000 = =A0pid =3D 0x00001997 [ CR# =3D 0, value =3D 0x00000000 80000011 ] > 28471049900815 (+ =A0 =A0 =A0 =A04000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x= 00000000 =A0pid =3D 0x00001997 > 28471049903815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x00000010, rip =3D 0x00000= 000 00002a73 ] > 0 (+ =A0 =A0 =A0 =A0 =A0 0) =A0LMSW =A0 =A0 =A0 =A0 =A0vcpu =3D 0x0000000= 0 =A0pid =3D 0x00001997 [ value =3D 0x80000010 ] > 28471049933815 (+ =A0 =A0 =A0 30000) =A0VMENTRY =A0 =A0 =A0 vcpu =3D 0x00= 000000 =A0pid =3D 0x00001997 > 28471049936815 (+ =A0 =A0 =A0 =A03000) =A0VMEXIT =A0 =A0 =A0 =A0vcpu =3D = 0x00000000 =A0pid =3D 0x00001997 [ exitcode =3D 0x0000007b, rip =3D 0x00000= 000 00001fd6 ] > > > > > To me it appears EMM386.EXE enables paging, and the DOS/4GW DOS extender > tries to manipulate the PE bit in CR0 with LMSW but doesn't succeed. > > These programs appear to work fine in VMWare and on real hardware. > > > Any ideas on how to make EMM386.EXE and the DOS/$GW extender work in > qemu-kvm? > > Regards, > Andy > > > Are you using this on an Intel-VT machine?