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 incorrectlywhen 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 beclobbered, 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/vse0120000070mrt/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/vse0120000070mrt/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/vse0120000070mrt/direct/01/
_______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel