Re: [kvm-devel] [PATCH] Fix host_cpuid() in qemu/qemu-kvm-x86.c
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
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
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
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