Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
v2: save/restore the right register (thanks Chip).
dlls/dbghelp/minidump.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/dlls/dbghelp/minidump.c b/dlls/dbghelp/minidump.c
index 975bb45c9a..ee214b274d 100644
--- a/dlls/dbghelp/minidump.c
+++ b/dlls/dbghelp/minidump.c
@@ -542,20 +542,27 @@ static unsigned dump_modules(struct dump_context* dc, BOOL dump_elf)
return sz;
}
-/* Calls cpuid with an eax of 'ax' and returns the 16 bytes in *p
- * We are compiled with -fPIC, so we can't clobber ebx.
- */
-static inline void do_x86cpuid(unsigned int ax, unsigned int *p)
+extern void do_x86cpuid(unsigned int ax, unsigned int *p);
+
+#ifdef __i386__
+__ASM_GLOBAL_FUNC( do_x86cpuid,
+ "pushl %esi\n\t"
+ "pushl %ebx\n\t"
+ "movl 4(%esp),%eax\n\t"
+ "movl 8(%esp),%esi\n\t"
+ "cpuid\n\t"
+ "movl %eax,(%esi)\n\t"
+ "movl %ebx,4(%esi)\n\t"
+ "movl %ecx,8(%esi)\n\t"
+ "movl %edx,12(%esi)\n\t"
+ "popl %ebx\n\t"
+ "popl %esi\n\t"
+ "ret" );
+#else
+void do_x86cpuid(unsigned int ax, unsigned int *p)
{
-#if defined(__GNUC__) && defined(__i386__)
- __asm__("pushl %%ebx\n\t"
- "cpuid\n\t"
- "movl %%ebx, %%esi\n\t"
- "popl %%ebx"
- : "=a" (p[0]), "=S" (p[1]), "=c" (p[2]), "=d" (p[3])
- : "0" (ax));
-#endif
}
+#endif
/* From xf86info havecpuid.c 1.11 */
static inline int have_x86cpuid(void)
--
2.14.1