From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LNaBJ-0006hw-8G for qemu-devel@nongnu.org; Thu, 15 Jan 2009 16:55:17 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LNaBF-0006e2-Pr for qemu-devel@nongnu.org; Thu, 15 Jan 2009 16:55:14 -0500 Received: from [199.232.76.173] (port=39083 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LNaBE-0006de-T8 for qemu-devel@nongnu.org; Thu, 15 Jan 2009 16:55:12 -0500 Received: from e8.ny.us.ibm.com ([32.97.182.138]:58766) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LNaBE-0001xZ-5r for qemu-devel@nongnu.org; Thu, 15 Jan 2009 16:55:12 -0500 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e8.ny.us.ibm.com (8.13.1/8.13.1) with ESMTP id n0FLnAbD015581 for ; Thu, 15 Jan 2009 16:49:10 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id n0FLt7fE188438 for ; Thu, 15 Jan 2009 16:55:07 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n0FLsGXY012169 for ; Thu, 15 Jan 2009 16:54:17 -0500 Message-ID: <496FB0B2.9010005@us.ibm.com> Date: Thu, 15 Jan 2009 15:54:58 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <1231951270-23664-1-git-send-email-amit.shah@redhat.com> <1231951270-23664-2-git-send-email-amit.shah@redhat.com> In-Reply-To: <1231951270-23664-2-git-send-email-amit.shah@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 1/2] KVM: CPUID takes ecx as input value for some functions Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Amit Shah Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org, avi@redhat.com Amit Shah wrote: > The CPUID instruction takes the value of ECX as an input parameter > in addition to the value of EAX as the count for functions 4, 0xb > and 0xd. Make sure we pass the value to the instruction. > > Also convert to the qemu-style whitespace for the surrounding code. > > Signed-off-by: Amit Shah > --- > qemu/target-i386/cpu.h | 2 +- > qemu/target-i386/helper.c | 34 +++++++++++++++++----------------- > qemu/target-i386/kvm.c | 8 ++++---- > qemu/target-i386/op_helper.c | 2 +- > 4 files changed, 23 insertions(+), 23 deletions(-) > Please resubmit against qemu (not kvm-userspace) and I'll apply. Regards, Anthony Liguori > diff --git a/qemu/target-i386/cpu.h b/qemu/target-i386/cpu.h > index 944e386..d9834db 100644 > --- a/qemu/target-i386/cpu.h > +++ b/qemu/target-i386/cpu.h > @@ -743,7 +743,7 @@ int cpu_x86_signal_handler(int host_signum, void *pinfo, > int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr, > int is_write, int mmu_idx, int is_softmmu); > void cpu_x86_set_a20(CPUX86State *env, int a20_state); > -void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > +void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, > uint32_t *eax, uint32_t *ebx, > uint32_t *ecx, uint32_t *edx); > > diff --git a/qemu/target-i386/helper.c b/qemu/target-i386/helper.c > index cda0390..4c1e541 100644 > --- a/qemu/target-i386/helper.c > +++ b/qemu/target-i386/helper.c > @@ -1377,7 +1377,8 @@ static void breakpoint_handler(CPUState *env) > } > #endif /* !CONFIG_USER_ONLY */ > > -static void host_cpuid(uint32_t function, uint32_t *eax, uint32_t *ebx, > +static void host_cpuid(uint32_t function, uint32_t count, > + uint32_t *eax, uint32_t *ebx, > uint32_t *ecx, uint32_t *edx) > { > #if defined(CONFIG_KVM) || defined(USE_KVM) > @@ -1385,19 +1386,19 @@ static void host_cpuid(uint32_t function, uint32_t *eax, uint32_t *ebx, > > #ifdef __x86_64__ > asm volatile("cpuid" > - : "=a"(vec[0]), "=b"(vec[1]), > - "=c"(vec[2]), "=d"(vec[3]) > - : "0"(function) : "cc"); > + : "=a"(vec[0]), "=b"(vec[1]), > + "=c"(vec[2]), "=d"(vec[3]) > + : "0"(function), "c"(count) : "cc"); > #else > asm volatile("pusha \n\t" > - "cpuid \n\t" > - "mov %%eax, 0(%1) \n\t" > - "mov %%ebx, 4(%1) \n\t" > - "mov %%ecx, 8(%1) \n\t" > - "mov %%edx, 12(%1) \n\t" > - "popa" > - : : "a"(function), "S"(vec) > - : "memory", "cc"); > + "cpuid \n\t" > + "mov %%eax, 0(%1) \n\t" > + "mov %%ebx, 4(%1) \n\t" > + "mov %%ecx, 8(%1) \n\t" > + "mov %%edx, 12(%1) \n\t" > + "popa" > + : : "a"(function), "c"(count), "S"(vec) > + : "memory", "cc"); > #endif > > if (eax) > @@ -1411,7 +1412,7 @@ static void host_cpuid(uint32_t function, uint32_t *eax, uint32_t *ebx, > #endif > } > > -void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > +void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, > uint32_t *eax, uint32_t *ebx, > uint32_t *ecx, uint32_t *edx) > { > @@ -1436,7 +1437,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > * actuall cpu, and say goodbye to migration between different vendors > * is you use compatibility mode. */ > if (kvm_enabled()) > - host_cpuid(0, NULL, ebx, ecx, edx); > + host_cpuid(0, 0, NULL, ebx, ecx, edx); > break; > case 1: > *eax = env->cpuid_version; > @@ -1457,7 +1458,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > break; > case 4: > /* cache info: needed for Core compatibility */ > - switch (*ecx) { > + switch (count) { > case 0: /* L1 dcache info */ > *eax = 0x0000121; > *ebx = 0x1c0003f; > @@ -1483,7 +1484,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > *edx = 0; > break; > } > - > break; > case 5: > /* mwait info: needed for Core compatibility */ > @@ -1528,7 +1528,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, > if (kvm_enabled()) { > uint32_t h_eax, h_edx; > > - host_cpuid(0x80000001, &h_eax, NULL, NULL, &h_edx); > + host_cpuid(index, 0, &h_eax, NULL, NULL, &h_edx); > > /* disable CPU features that the host does not support */ > > diff --git a/qemu/target-i386/kvm.c b/qemu/target-i386/kvm.c > index f87bf36..bef3150 100644 > --- a/qemu/target-i386/kvm.c > +++ b/qemu/target-i386/kvm.c > @@ -44,13 +44,13 @@ int kvm_arch_init_vcpu(CPUState *env) > > cpuid_i = 0; > > - cpu_x86_cpuid(env, 0, &eax, &ebx, &ecx, &edx); > + cpu_x86_cpuid(env, 0, 0, &eax, &ebx, &ecx, &edx); > limit = eax; > > for (i = 0; i <= limit; i++) { > struct kvm_cpuid_entry *c = &cpuid_data.entries[cpuid_i++]; > > - cpu_x86_cpuid(env, i, &eax, &ebx, &ecx, &edx); > + cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx); > c->function = i; > c->eax = eax; > c->ebx = ebx; > @@ -58,13 +58,13 @@ int kvm_arch_init_vcpu(CPUState *env) > c->edx = edx; > } > > - cpu_x86_cpuid(env, 0x80000000, &eax, &ebx, &ecx, &edx); > + cpu_x86_cpuid(env, 0x80000000, 0, &eax, &ebx, &ecx, &edx); > limit = eax; > > for (i = 0x80000000; i <= limit; i++) { > struct kvm_cpuid_entry *c = &cpuid_data.entries[cpuid_i++]; > > - cpu_x86_cpuid(env, i, &eax, &ebx, &ecx, &edx); > + cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx); > c->function = i; > c->eax = eax; > c->ebx = ebx; > diff --git a/qemu/target-i386/op_helper.c b/qemu/target-i386/op_helper.c > index 6e0e32e..74ba643 100644 > --- a/qemu/target-i386/op_helper.c > +++ b/qemu/target-i386/op_helper.c > @@ -1898,7 +1898,7 @@ void helper_cpuid(void) > > helper_svm_check_intercept_param(SVM_EXIT_CPUID, 0); > > - cpu_x86_cpuid(env, (uint32_t)EAX, &eax, &ebx, &ecx, &edx); > + cpu_x86_cpuid(env, (uint32_t)EAX, (uint32_t)ECX, &eax, &ebx, &ecx, &edx); > EAX = eax; > EBX = ebx; > ECX = ecx; >