Re: [kvm-devel] [PATCH] Fix host_cpuid() in qemu/qemu-kvm-x86.c

2008-02-21 Thread Avi Kivity
Alexander Graf wrote:
>
> This version fixes a wrong identifier (%0 instead of %1) and makes 
> things work without touching the stack. This works by using %esi as 
> backup-register for %ebx. It furthermore moves "function" directly to 
> eax, without relying on gcc optimizations to realize this.
>

Applied, thanks.  Let's see if gcc can handle 4 register constraints + 1 
clobber.

-- 
error compiling committee.c: too many arguments to function


-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/
___
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel


Re: [kvm-devel] [PATCH] Fix host_cpuid() in qemu/qemu-kvm-x86.c

2008-02-21 Thread Alexander Graf


On Feb 21, 2008, at 10:14 AM, Alexander Graf wrote:



On Feb 21, 2008, at 9:46 AM, Avi Kivity wrote:


Bernhard Kaindl wrote:

Hi,

I found that on kvm-61 the cpuid in the guest was reported  
incorrectly

when qemu-kvm was compiled with gcc-4.1 or 4.3.

This resulted in linux-64bit not booting, complaining that it is not
running on a 64-bit machine.

Symptom: Unexpected behaviour after the assembly snippet.

Solution: New assembly which is simpler and leaves optimizations  
to gcc,

resulting in much shorter and maintainable code.

Comments are welcome,



There were two reasons for the obfuscated code: first, qemu-kvm.c  
used

to be compiled with ebx assigned to a global register, which can't be
clobbered, and second not to cause excessive register pressure on  
i386.


If a globally assigned register is in the clobbered list, gcc  
automatically stores and restores it. But if the problem is gone,  
that's even better.


This new patch should address the second issue as well. For most of  
what I tested, using ebx worked perfectly fine. It failed with PIC  
code though, so here you are. We now save and restore ebx in the  
assembly and assign the value to a random free register.




This version fixes a wrong identifier (%0 instead of %1) and makes  
things work without touching the stack. This works by using %esi as  
backup-register for %ebx. It furthermore moves "function" directly to  
eax, without relying on gcc optimizations to realize this.


Signed-off-by: Alexander Graf <[EMAIL PROTECTED]>



kvm-cpuid.patch
Description: Binary data


-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/___
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel


Re: [kvm-devel] [PATCH] Fix host_cpuid() in qemu/qemu-kvm-x86.c

2008-02-21 Thread Alexander Graf


On Feb 21, 2008, at 9:46 AM, Avi Kivity wrote:


Bernhard Kaindl wrote:

Hi,

I found that on kvm-61 the cpuid in the guest was reported  
incorrectly

when qemu-kvm was compiled with gcc-4.1 or 4.3.

This resulted in linux-64bit not booting, complaining that it is not
running on a 64-bit machine.

Symptom: Unexpected behaviour after the assembly snippet.

Solution: New assembly which is simpler and leaves optimizations to  
gcc,

resulting in much shorter and maintainable code.

Comments are welcome,



There were two reasons for the obfuscated code: first, qemu-kvm.c used
to be compiled with ebx assigned to a global register, which can't be
clobbered, and second not to cause excessive register pressure on  
i386.


If a globally assigned register is in the clobbered list, gcc  
automatically stores and restores it. But if the problem is gone,  
that's even better.


This new patch should address the second issue as well. For most of  
what I tested, using ebx worked perfectly fine. It failed with PIC  
code though, so here you are. We now save and restore ebx in the  
assembly and assign the value to a random free register.


kvm-cpuid.patch
Description: Binary data




The first reason is gone, but can you test the second by compiling  
on i386?



Bernhard

PS: Thanks a lot to Alex Graf for the fix.

--- qemu/qemu-kvm-x86.c
+++ qemu/qemu-kvm-x86.c
@@ -428,35 +428,7 @@ static void host_cpuid(uint32_t function
uint32_t vec[4];

vec[0] = function;
-asm volatile (
-#ifdef __x86_64__
-"sub $128, %%rsp \n\t"  /* skip red zone */
- "push %0;  push %%rsi \n\t"
-"push %%rax; push %%rbx; push %%rcx; push %%rdx \n\t"
-"mov 8*5(%%rsp), %%rsi \n\t"
-"mov (%%rsi), %%eax \n\t"
-"cpuid \n\t"
-"mov %%eax, (%%rsi) \n\t"
-"mov %%ebx, 4(%%rsi) \n\t"
-"mov %%ecx, 8(%%rsi) \n\t"
-"mov %%edx, 12(%%rsi) \n\t"
-"pop %%rdx; pop %%rcx; pop %%rbx; pop %%rax \n\t"
-"pop %%rsi; pop %0 \n\t"
-"add $128, %%rsp"
-#else
- "push %0;  push %%esi \n\t"
-"push %%eax; push %%ebx; push %%ecx; push %%edx \n\t"
-"mov 4*5(%%esp), %%esi \n\t"
-"mov (%%esi), %%eax \n\t"
-"cpuid \n\t"
-"mov %%eax, (%%esi) \n\t"
-"mov %%ebx, 4(%%esi) \n\t"
-"mov %%ecx, 8(%%esi) \n\t"
-"mov %%edx, 12(%%esi) \n\t"
-"pop %%edx; pop %%ecx; pop %%ebx; pop %%eax \n\t"
-"pop %%esi; pop %0 \n\t"
-#endif
-: : "rm"(vec) : "memory");
+asm volatile("cpuid" : "+a" (vec[0]),  
"=b" (vec[1]),"=c" (vec[2]), "=d" (vec[3]));

if (eax)
*eax = vec[0];
if (ebx)

-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/
___
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel




--
error compiling committee.c: too many arguments to function


-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/
___
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel


Signed-off-by: Alexander Graf <[EMAIL PROTECTED]>-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/___
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel


Re: [kvm-devel] [PATCH] Fix host_cpuid() in qemu/qemu-kvm-x86.c

2008-02-21 Thread Avi Kivity
Bernhard Kaindl wrote:
> Hi,
>
> I found that on kvm-61 the cpuid in the guest was reported incorrectly
> when qemu-kvm was compiled with gcc-4.1 or 4.3.
>
> This resulted in linux-64bit not booting, complaining that it is not
> running on a 64-bit machine.
>
> Symptom: Unexpected behaviour after the assembly snippet.
>
> Solution: New assembly which is simpler and leaves optimizations to gcc,
> resulting in much shorter and maintainable code.
>
> Comments are welcome,
>   

There were two reasons for the obfuscated code: first, qemu-kvm.c used 
to be compiled with ebx assigned to a global register, which can't be 
clobbered, and second not to cause excessive register pressure on i386.  
The first reason is gone, but can you test the second by compiling on i386?

> Bernhard
>
> PS: Thanks a lot to Alex Graf for the fix.
>
> --- qemu/qemu-kvm-x86.c
> +++ qemu/qemu-kvm-x86.c
> @@ -428,35 +428,7 @@ static void host_cpuid(uint32_t function
>  uint32_t vec[4];
>  
>  vec[0] = function;
> -asm volatile (
> -#ifdef __x86_64__
> -  "sub $128, %%rsp \n\t"  /* skip red zone */
> - "push %0;  push %%rsi \n\t"
> -  "push %%rax; push %%rbx; push %%rcx; push %%rdx \n\t"
> -  "mov 8*5(%%rsp), %%rsi \n\t"
> -  "mov (%%rsi), %%eax \n\t"
> -  "cpuid \n\t"
> -  "mov %%eax, (%%rsi) \n\t"
> -  "mov %%ebx, 4(%%rsi) \n\t"
> -  "mov %%ecx, 8(%%rsi) \n\t"
> -  "mov %%edx, 12(%%rsi) \n\t"
> -  "pop %%rdx; pop %%rcx; pop %%rbx; pop %%rax \n\t"
> -  "pop %%rsi; pop %0 \n\t"
> -  "add $128, %%rsp"
> -#else
> - "push %0;  push %%esi \n\t"
> -  "push %%eax; push %%ebx; push %%ecx; push %%edx \n\t"
> -  "mov 4*5(%%esp), %%esi \n\t"
> -  "mov (%%esi), %%eax \n\t"
> -  "cpuid \n\t"
> -  "mov %%eax, (%%esi) \n\t"
> -  "mov %%ebx, 4(%%esi) \n\t"
> -  "mov %%ecx, 8(%%esi) \n\t"
> -  "mov %%edx, 12(%%esi) \n\t"
> -  "pop %%edx; pop %%ecx; pop %%ebx; pop %%eax \n\t"
> -  "pop %%esi; pop %0 \n\t"
> -#endif
> -  : : "rm"(vec) : "memory");
> +asm volatile("cpuid" : "+a" (vec[0]), "=b" (vec[1]),"=c" (vec[2]), "=d" 
> (vec[3]));
>  if (eax)
>   *eax = vec[0];
>  if (ebx)
>
> -
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/
> ___
> kvm-devel mailing list
> kvm-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/kvm-devel
>   


-- 
error compiling committee.c: too many arguments to function


-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/
___
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel