From patchwork Mon Sep 17 17:27:35 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Clemens Kolbitsch X-Patchwork-Id: 184513 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id EBB532C0086 for ; Tue, 18 Sep 2012 03:28:17 +1000 (EST) Received: from localhost ([::1]:54569 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TDf7I-00023C-2J for incoming@patchwork.ozlabs.org; Mon, 17 Sep 2012 13:28:16 -0400 Received: from eggs.gnu.org ([208.118.235.92]:40639) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TDf73-000233-Q0 for qemu-devel@nongnu.org; Mon, 17 Sep 2012 13:28:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TDf6y-0008BR-L2 for qemu-devel@nongnu.org; Mon, 17 Sep 2012 13:28:01 -0400 Received: from mail-vb0-f45.google.com ([209.85.212.45]:43495) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TDf6y-0008Au-Fk for qemu-devel@nongnu.org; Mon, 17 Sep 2012 13:27:56 -0400 Received: by vbip1 with SMTP id p1so7252575vbi.4 for ; Mon, 17 Sep 2012 10:27:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:from:date:message-id:subject:to:cc:content-type :content-transfer-encoding:x-gm-message-state; bh=NvqPtvlMdbTshw3LEq7crqOS/l4VyLbIre41G/nELJs=; b=b8le28NNNYOnjl2PR22YoNl1lA50Ht8TvnErhD9yReNqZn2GplbJ/T+Jhs1nKTp6h3 obviiZIh2SYuBfpgV/BrMwpHHkfFAfzpBVVI7oW8dzaAGWnclV68EQJcVyqtB0m9mE2e lGdj9rl4KFJriqErEfMrxQ9WPZduW2ziIJiVKOhuuIao0oNmiLTT/QCG7jqsNPgilRkE 4Iw9Ro6BtpVFQCbjXg2+ZKpSBoFgAn9XKRN8WSUQi35ShuyaWTHpboSTE1WLrmV1LPED sR2iQcu7dEC+W2TZi8hkXcnNePj8vhZuzPyDg2YwjgZFJSMBjfgrHpA4Gwki+vteoKC7 LOtQ== Received: by 10.220.209.3 with SMTP id ge3mr1132680vcb.43.1347902875139; Mon, 17 Sep 2012 10:27:55 -0700 (PDT) MIME-Version: 1.0 Received: by 10.58.125.70 with HTTP; Mon, 17 Sep 2012 10:27:35 -0700 (PDT) From: Clemens Kolbitsch Date: Mon, 17 Sep 2012 10:27:35 -0700 Message-ID: To: Aurelien Jarno X-Gm-Message-State: ALoCoQkYj3dXiQYMEZwrK5gJg1SVaxFwtqze5VClhFHHGGfQnUYW4R+P9vuqe49eJm93sN/6lfcM X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.212.45 Cc: Stefan Weil , qemu-devel@nongnu.org, Andre Przywara Subject: Re: [Qemu-devel] QEMU (no kvm) Win7 (64bit) boot error [PATCH 1/1] X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org On Mon, Sep 10, 2012 at 10:31 AM, Aurelien Jarno wrote: > On Mon, Sep 10, 2012 at 06:23:43PM +0200, Stefan Weil wrote: >> Am 10.09.2012 08:19, schrieb Clemens Kolbitsch: >> >On Sat, Sep 8, 2012 at 11:22 AM, Clemens Kolbitsch >> > wrote: >> >>On Fri, Sep 7, 2012 at 9:26 PM, Stefan Weil wrote: >> >>>Am 08.09.2012 02:48, schrieb Clemens Kolbitsch: >> >>>>Hi guys, >> >>>> >> >>>>I need to run Win7 64bit in Qemu without KVM support. I found a few >> >>>>messages concerning the "unsupported architecture" problem (Windows >> >>>>shows a BSOD with "STOP 0x0000005D ..." on boot), for example >> >>>> >> >>>>http://lists.gnu.org/archive/html/qemu-devel/2011-03/msg01623.html >> >>>>or >> >>>>http://permalink.gmane.org/gmane.comp.emulators.qemu/92457 >> >>>> >> >>>>but I don't think there was ever a solution to the problem - at least >> >>>>what is proposed does not work (I've tried stable and GIT versions). >> >>>> >> >>>>Since I have a decent background of modifying the Qemu internals, I'm >> >>>>more than happy to contribute to solving this issue, but I'm not sure >> >>>>if anyone is currently working on it (i.e., I don't want to start at 0 >> >>>>in case someone is about to release a patch). >> >>>> >> >>>>Please let me know if there is already a know solution/workaround or >> >>>>whoever might be working on it, please ping me so we can sync. >> >>>> >> >>>>BTW, in case this is necessary, here are the details of what I >> >>>>need/what is not working: >> >>>> >> >>>>Qemu: current git-trunk, >> >>>> >> >>>>x86_64-softmmu$ ./qemu-system-x86_64 --version >> >>>>QEMU emulator version 1.2.50, Copyright (c) 2003-2008 Fabrice Bellard >> >>>> >> >>>>host: 64bit, Ubuntu LTS12.04 >> >>>> >> >>>>guest: 64bit Windows 7, no KVM possible >> >>>> >> >>>>Thanks! >> >>>>-Clemens >> >>> >> >>>Hi Clemens, >> >>> >> >>>AFAIK, nobody is working on this issue which exists for a long time now. >> >>>It would be great if you could find a solution to make QEMU without KVM >> >>>work with Windows guests. >> >>Hi Stefan, >> >> >> >>thanks for the info. I'll work on it then - hopefully I can come back >> >>with a patch soon! >> >> >> >>>PS: It's QEMU, not Qemu. I modified the subject in my reply :-) >> >>hehe, old habbit :) I'll try to remember - but why is the ML then >> >>called "Qemu-devel" ? ;) >> >After a first night of debugging, I have come up with a simple patch. >> >I'm still testing and it seems it's not the ultimate solution yet >> >(there are still bluescreens), but it already gets you much further >> >while booting (using either the install CD or an actual image). >> > >> >This diffs against the current stable-1.1. As you can see, one of the >> >feature bits of the CPUID are removed due to TCG not supporting them >> >(or the TCG bitmask is just missing them). Since Qemu uses CPUID_DE in >> >> QEMU :-) >> >> >other locations, I'm assuming the bitmask is just wrong. >> > >> >Can someone confirm that TCG supports CPUID_DE ? If not, I'll need to >> >work on this, otherwise I'll investigate why Win7 still crashes with a >> >BSOD. >> > >> >Thanks! >> >Clemens >> > >> > >> >qemu$ git diff >> >diff --git a/target-i386/cpu.c b/target-i386/cpu.c >> >index 388bc5c..f2af36d 100644 >> >--- a/target-i386/cpu.c >> >+++ b/target-i386/cpu.c >> >@@ -259,7 +259,8 @@ typedef struct x86_def_t { >> > CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \ >> > CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \ >> > CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \ >> >- CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS) >> >+ CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | \ >> >+ CPUID_DE) /* needed by Win7 64bit */ >> > /* partly implemented: >> > CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) >> > CPUID_PSE36 (needed for Solaris) */ >> >> Hi Clemens, >> >> indeed, it looks like CPUID_DE fixes that BSOD with "STOP 0x0000005D ...". >> In my test scenario Windows now reboots instead of showing the BSOD. >> >> This commit added the TCG feature bit trimming which broke Windows: >> >> commit 551a2dec8fa55006a68393b9d6fb63577d2b3f1c >> Autor: Andre Przywara Do Mär 11 14:39:03 >> 2010 >> Eintragender: Aurelien Jarno Sa Mär 13 >> 16:50:54 2010 >> >> x86/cpuid: add TCG feature bit trimming >> >> In KVM we trim the user provided CPUID bits to match the host CPU's >> one. Introduce a similar feature to QEMU/TCG. Create a mask of TCG's >> capabilities and apply it to the user bits. >> This allows to let the CPU models reflect their native archetypes. >> >> Signed-off-by: Andre Przywara >> Signed-off-by: Aurelien Jarno >> >> >> Andre, why don't we set the requested feature bits - no matter what >> TCG provides? >> > > Well the CPU flags are supposed to represent what a code can use. If we > announce things that we don't support, some code might enable some > features or instructions that are just causing an illegal instruction. > > Now the question is to know if DE is implemented in TCG or not. It > *seems* there are some parts implemented, but not fully. > > -- > Aurelien Jarno GPG: 1024D/F1BCDB73 > aurelien@aurel32.net http://www.aurel32.net Aurelien, I understand the concern you mention above and agree that TCG should announce only what it can do/supports. On the other hand, the current TCG implementation seems to emulate Windows7 guests properly and supporting this OS seems rather important to me. Maybe, allowing to enable "experimental" support of this bit would be an acceptable compromise and allow the community to move forward adding full support eventually. In case you agree, I have included a patch below that enables this TCG bit at compile-time (default=OFF) and warns that this is an experimental feature. Please let me know what you think. Thanks! Clemens diff --git a/configure b/configure index 7e23309..8d66034 100755 --- a/configure +++ b/configure @@ -220,6 +220,7 @@ want_tools="yes" libiscsi="" coroutine="" seccomp="" +experimental_windows7_guest="no" # parse CC options first for opt do @@ -876,6 +877,10 @@ for opt do ;; --disable-seccomp) seccomp="no" ;; + --enable-experimental-windows7-support) experimental_windows7_guest="yes" + ;; + --disable-experimental-windows7-support) experimental_windows7_guest="no" + ;; *) echo "ERROR: unknown option $opt"; show_help="yes" ;; esac @@ -1164,6 +1169,12 @@ echo " --disable-guest-agent disable building of the QEMU Guest Agent" echo " --enable-guest-agent enable building of the QEMU Guest Agent" echo " --disable-seccomp disable seccomp support" echo " --enable-seccomp enables seccomp support" +echo " --enable-experimental-windows7-support" +echo " enable support for emulating Windows7" +echo " guests (experimental!)" +echo " --disable-experimental-windows7-support" +echo " disable support for emulating Windows7" +echo " guests" echo " --with-coroutine=BACKEND coroutine backend. Supported options:" echo " gthread, ucontext, sigaltstack, windows" echo "" @@ -3203,6 +3214,7 @@ echo "OpenGL support $opengl" echo "libiscsi support $libiscsi" echo "build guest agent $guest_agent" echo "seccomp support $seccomp" +echo "Windows7 support $experimental_windows7_guest" echo "coroutine backend $coroutine_backend" if test "$sdl_too_old" = "yes"; then @@ -3506,6 +3518,10 @@ if test "$seccomp" = "yes"; then echo "CONFIG_SECCOMP=y" >> $config_host_mak fi +if test "$experimental_windows7_guest" = "yes"; then + echo "CONFIG_WINDOWS7_GUEST_SUPPORT=y" >> $config_host_mak +fi + # XXX: suppress that if [ "$bsd" = "yes" ] ; then echo "CONFIG_BSD=y" >> $config_host_mak diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 423e009..f5c9f0e 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -261,11 +261,21 @@ typedef struct x86_def_t { CPUID_PAE | CPUID_SEP | CPUID_APIC) #define EXT2_FEATURE_MASK 0x0183F3FF +#if defined(CONFIG_WINDOWS7_GUEST_SUPPORT) + /* this feature is implemented only partly, but required to + * emulate Windows7 operating system guests. Most of the + * functionality is there, so we consider it 'experimental' */ +#define TCG_FEATURE_CPUID_DE CPUID_DE +#else +#define TCG_FEATURE_CPUID_DE 0 +#endif + #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \ CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \ CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \ CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \ - CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS) + CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | \ + TCG_FEATURE_CPUID_DE) /* partly implemented: CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) CPUID_PSE36 (needed for Solaris) */