public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* v2: Remove duplicate cpuid functionality in kvm userspace code
@ 2008-12-26  6:02 Amit Shah
  2008-12-26  6:02 ` [PATCH] KVM: userspace: Remove duplicated functionality for cpuid processing Amit Shah
  0 siblings, 1 reply; 4+ messages in thread
From: Amit Shah @ 2008-12-26  6:02 UTC (permalink / raw)
  To: avi; +Cc: agraf, kvm


This supersedes my previous patch which just removed the host_cpuid function.

This patch cleans up the do_cpuid_ent function of duplicate code as well.

Amit

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] KVM: userspace: Remove duplicated functionality for cpuid processing
  2008-12-26  6:02 v2: Remove duplicate cpuid functionality in kvm userspace code Amit Shah
@ 2008-12-26  6:02 ` Amit Shah
  2008-12-26 12:50   ` Alexander Graf
  2008-12-29 13:46   ` Avi Kivity
  0 siblings, 2 replies; 4+ messages in thread
From: Amit Shah @ 2008-12-26  6:02 UTC (permalink / raw)
  To: avi; +Cc: agraf, kvm, Amit Shah

host_cpuid is now available in target-i386/helper.c.
Remove the duplicated code now in kvm-specific code.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 qemu/qemu-kvm-x86.c |   70 ---------------------------------------------------
 1 files changed, 0 insertions(+), 70 deletions(-)

diff --git a/qemu/qemu-kvm-x86.c b/qemu/qemu-kvm-x86.c
index aa36be8..1bf86e1 100644
--- a/qemu/qemu-kvm-x86.c
+++ b/qemu/qemu-kvm-x86.c
@@ -451,39 +451,6 @@ void kvm_arch_save_regs(CPUState *env)
     }
 }
 
-static void host_cpuid(uint32_t function, uint32_t *eax, uint32_t *ebx,
-		       uint32_t *ecx, uint32_t *edx)
-{
-    uint32_t vec[4];
-
-#ifdef __x86_64__
-    asm volatile("cpuid"
-		 : "=a"(vec[0]), "=b"(vec[1]),
-		   "=c"(vec[2]), "=d"(vec[3])
-		 : "0"(function) : "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");
-#endif
-
-    if (eax)
-	*eax = vec[0];
-    if (ebx)
-	*ebx = vec[1];
-    if (ecx)
-	*ecx = vec[2];
-    if (edx)
-	*edx = vec[3];
-}
-
-
 static void do_cpuid_ent(struct kvm_cpuid_entry *e, uint32_t function,
 			 CPUState *env)
 {
@@ -494,43 +461,6 @@ static void do_cpuid_ent(struct kvm_cpuid_entry *e, uint32_t function,
     e->ebx = env->regs[R_EBX];
     e->ecx = env->regs[R_ECX];
     e->edx = env->regs[R_EDX];
-    if (function == 0x80000001) {
-	uint32_t h_eax, h_edx;
-
-	host_cpuid(function, &h_eax, NULL, NULL, &h_edx);
-
-	// long mode
-	if ((h_edx & 0x20000000) == 0 || !lm_capable_kernel)
-	    e->edx &= ~0x20000000u;
-	// syscall
-	if ((h_edx & 0x00000800) == 0)
-	    e->edx &= ~0x00000800u;
-	// nx
-	if ((h_edx & 0x00100000) == 0)
-	    e->edx &= ~0x00100000u;
-	// svm
-	if (!kvm_nested && (e->ecx & 4))
-	    e->ecx &= ~4u;
-    }
-    // sysenter isn't supported on compatibility mode on AMD.  and syscall
-    // isn't supported in compatibility mode on Intel.  so advertise the
-    // actuall cpu, and say goodbye to migration between different vendors
-    // is you use compatibility mode.
-    if (function == 0) {
-	uint32_t bcd[3];
-
-	host_cpuid(0, NULL, &bcd[0], &bcd[1], &bcd[2]);
-	e->ebx = bcd[0];
-	e->ecx = bcd[1];
-	e->edx = bcd[2];
-    }
-    // "Hypervisor present" bit for Microsoft guests
-    if (function == 1)
-	e->ecx |= (1u << 31);
-
-    // 3dnow isn't properly emulated yet
-    if (function == 0x80000001)
-	e->edx &= ~0xc0000000;
 }
 
 struct kvm_para_features {
-- 
1.5.4.3


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] KVM: userspace: Remove duplicated functionality for cpuid processing
  2008-12-26  6:02 ` [PATCH] KVM: userspace: Remove duplicated functionality for cpuid processing Amit Shah
@ 2008-12-26 12:50   ` Alexander Graf
  2008-12-29 13:46   ` Avi Kivity
  1 sibling, 0 replies; 4+ messages in thread
From: Alexander Graf @ 2008-12-26 12:50 UTC (permalink / raw)
  To: Amit Shah; +Cc: avi, kvm

Hi Amit,

On 26.12.2008, at 07:02, Amit Shah wrote:

> host_cpuid is now available in target-i386/helper.c.
> Remove the duplicated code now in kvm-specific code.
>
> Signed-off-by: Amit Shah <amit.shah@redhat.com>
> ---
> qemu/qemu-kvm-x86.c |   70  
> ---------------------------------------------------
> 1 files changed, 0 insertions(+), 70 deletions(-)
>
> diff --git a/qemu/qemu-kvm-x86.c b/qemu/qemu-kvm-x86.c
> index aa36be8..1bf86e1 100644
> --- a/qemu/qemu-kvm-x86.c
> +++ b/qemu/qemu-kvm-x86.c
> @@ -451,39 +451,6 @@ void kvm_arch_save_regs(CPUState *env)
>     }
> }
>
> -static void host_cpuid(uint32_t function, uint32_t *eax, uint32_t  
> *ebx,
> -		       uint32_t *ecx, uint32_t *edx)
> -{
> -    uint32_t vec[4];
> -
> -#ifdef __x86_64__
> -    asm volatile("cpuid"
> -		 : "=a"(vec[0]), "=b"(vec[1]),
> -		   "=c"(vec[2]), "=d"(vec[3])
> -		 : "0"(function) : "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");
> -#endif
> -
> -    if (eax)
> -	*eax = vec[0];
> -    if (ebx)
> -	*ebx = vec[1];
> -    if (ecx)
> -	*ecx = vec[2];
> -    if (edx)
> -	*edx = vec[3];
> -}
> -
> -
> static void do_cpuid_ent(struct kvm_cpuid_entry *e, uint32_t function,
> 			 CPUState *env)
> {
> @@ -494,43 +461,6 @@ static void do_cpuid_ent(struct kvm_cpuid_entry  
> *e, uint32_t function,
>     e->ebx = env->regs[R_EBX];
>     e->ecx = env->regs[R_ECX];
>     e->edx = env->regs[R_EDX];

That looks a lot better, but I think we could easily do more!

do_cpuid_ent is only called twice like this:  
do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, &copy);

We can replace that with:

e->eax = i;
struct kvm_cpuid_entry *e = &cpuid_ent[cpuid_nent++];
cpu_x86_cpuid(&copy, &e->eax, &e->ebx, &e->ecx, &e->edx);

The same could be done for qemu_kvm_cpuid_on_env. Then we can get rid  
of qemu-kvm-helper.c too :-).

Alex


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] KVM: userspace: Remove duplicated functionality for cpuid processing
  2008-12-26  6:02 ` [PATCH] KVM: userspace: Remove duplicated functionality for cpuid processing Amit Shah
  2008-12-26 12:50   ` Alexander Graf
@ 2008-12-29 13:46   ` Avi Kivity
  1 sibling, 0 replies; 4+ messages in thread
From: Avi Kivity @ 2008-12-29 13:46 UTC (permalink / raw)
  To: Amit Shah; +Cc: agraf, kvm

Amit Shah wrote:
> host_cpuid is now available in target-i386/helper.c.
> Remove the duplicated code now in kvm-specific code.
>
>   

Applied, thanks.

-- 
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-12-29 13:46 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-26  6:02 v2: Remove duplicate cpuid functionality in kvm userspace code Amit Shah
2008-12-26  6:02 ` [PATCH] KVM: userspace: Remove duplicated functionality for cpuid processing Amit Shah
2008-12-26 12:50   ` Alexander Graf
2008-12-29 13:46   ` Avi Kivity

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox