From: Gordon Malm Make inline asm PIC-safe (do not clobber ebx). Credit to Anthony Basile for fixes on x86-64. Reference: http://bugs.gentoo.org/200376 --- a/checkvm/checkvm.c +++ b/checkvm/checkvm.c @@ -79,8 +79,18 @@ getVersion(uint32 *version) { uint32 eax, ebx, ecx, edx; - __asm__ volatile("inl (%%dx)" : - "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : +#ifdef __x86_64__ + __asm__ volatile("pushq %%rbx \n\t" + "inl (%%dx) \n\t" + "movl %%ebx, %3 \n\t" + "popq %%rbx \n\t" : +#else + __asm__ volatile("pushl %%ebx \n\t" + "inl (%%dx) \n\t" + "movl %%ebx, %3 \n\t" + "popl %%ebx \n\t" : +#endif + "=a"(eax), "=c"(ecx), "=d"(edx), "=r"(ebx) : "0"(BDOOR_MAGIC), "1"(BDOOR_CMD_GETVERSION), "2"(BDOOR_PORT) : "memory"); version[0] = eax; @@ -97,7 +107,7 @@ getHWVersion(uint32 *hwVersion) uint32 eax, ebx, ecx, edx; __asm__ volatile("inl (%%dx)" : - "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : + "=a"(eax), "=c"(ecx), "=d"(edx), "=r"(ebx) : "0"(BDOOR_MAGIC), "1"(BDOOR_CMD_GETHWVERSION), "2"(BDOOR_PORT) : "memory"); *hwVersion = eax; @@ -113,7 +123,7 @@ getScreenSize(uint32 *screensize) uint32 eax, ebx, ecx, edx; __asm__ volatile("inl (%%dx)" : - "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : + "=a"(eax), "=c"(ecx), "=d"(edx), "=r"(ebx) : "0"(BDOOR_MAGIC), "1"(BDOOR_CMD_GETSCREENSIZE), "2"(BDOOR_PORT) : "memory"); *screensize = eax;