[PATCH v2 1/4] dbghelp: Avoid using inline assembly in do_x86cpuid().

Zebediah Figura z.figura12 at gmail.com
Sun Nov 25 22:31:49 CST 2018


Signed-off-by: Zebediah Figura <z.figura12 at 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




More information about the wine-devel mailing list