68 lines
2.0 KiB
Diff
68 lines
2.0 KiB
Diff
|
From: Gordon Malm <gengor@gentoo.org>
|
||
|
|
||
|
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;
|