From: Gordon Malm Make inline asm PIC-safe (do not clobber ebx). Thanks and credit to Anthony Basile for all his help and testing. Reference: http://bugs.gentoo.org/200376 --- a/checkvm/checkvm.c +++ b/checkvm/checkvm.c @@ -79,8 +79,16 @@ { uint32 eax, ebx, ecx, edx; - __asm__ volatile("inl (%%dx)" : - "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : + __asm__ volatile( +#if defined __PIC__ && !vm_x86_64 // %ebx is reserved by the compiler. + "movl %%ebx, %3 \n\t" + "inl (%%dx) \n\t" + "xchgl %%ebx, %3 \n\t" : + "=a"(eax), "=c"(ecx), "=d"(edx), "=r"(ebx) : +#else + "inl (%%dx)" : + "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : +#endif "0"(BDOOR_MAGIC), "1"(BDOOR_CMD_GETVERSION), "2"(BDOOR_PORT) : "memory"); version[0] = eax; @@ -96,8 +104,16 @@ { uint32 eax, ebx, ecx, edx; - __asm__ volatile("inl (%%dx)" : - "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : + __asm__ volatile( +#if defined __PIC__ && !vm_x86_64 // %ebx is reserved by the compiler. + "movl %%ebx, %3 \n\t" + "inl (%%dx) \n\t" + "xchgl %%ebx, %3 \n\t" : + "=a"(eax), "=c"(ecx), "=d"(edx), "=r"(ebx) : +#else + "inl (%%dx)" : + "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : +#endif "0"(BDOOR_MAGIC), "1"(BDOOR_CMD_GETHWVERSION), "2"(BDOOR_PORT) : "memory"); *hwVersion = eax; @@ -112,8 +128,16 @@ { uint32 eax, ebx, ecx, edx; - __asm__ volatile("inl (%%dx)" : - "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : + __asm__ volatile( +#if defined __PIC__ && !vm_x86_64 // %ebx is reserved by the compiler. + "movl %%ebx, %3 \n\t" + "inl (%%dx) \n\t" + "xchgl %%ebx, %3 \n\t" : + "=a"(eax), "=c"(ecx), "=d"(edx), "=r"(ebx) : +#else + "inl (%%dx)" : + "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : +#endif "0"(BDOOR_MAGIC), "1"(BDOOR_CMD_GETSCREENSIZE), "2"(BDOOR_PORT) : "memory"); *screensize = eax;