Subject: [Bug 3601804]: platformCPUID segmentation fault on Darwin

From: "jan.nijtmans" <[email-masked]>
Date: Sat, 26 Jan 2013 16:50:22 +0000

---
 ChangeLog            | 5 +++++
 unix/tclUnixCompat.c | 8 ++++++++
 2 files changed, 13 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 2ee5bbe..941edb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-01-26  Jan Nijtmans  <[email-masked]>
+
+	* unix/tclUnixCompat.c: [Bug 3601804]: platformCPUID segmentation
+	fault on Darwin.
+
 2013-01-16  Jan Nijtmans  <[email-masked]>
 
 	* Makefile.in: Enable win32 build with -DTCL_NO_DEPRECATED, just
diff --git a/unix/tclUnixCompat.c b/unix/tclUnixCompat.c
index 5a3ccd4..4ca7da9 100644
--- a/unix/tclUnixCompat.c
+++ b/unix/tclUnixCompat.c
@@ -693,11 +693,19 @@ TclWinCPUID(
 
     /* See: <http://en.wikipedia.org/wiki/CPUID> */
 #if defined(HAVE_CPUID)
+#if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
+    __asm__ __volatile__("movq %%rbx, %%rsi     \n\t" /* save %rbx */
+                 "cpuid            \n\t"
+                 "xchgq %%rsi, %%rbx   \n\t" /* restore the old %rbx */
+                 : "=a"(regsPtr[0]), "=S"(regsPtr[1]), "=c"(regsPtr[2]), "=d"(regsPtr[3])
+                 : "a"(index));
+#else
     __asm__ __volatile__("mov %%ebx, %%esi     \n\t" /* save %ebx */
                  "cpuid            \n\t"
                  "xchg %%esi, %%ebx   \n\t" /* restore the old %ebx */
                  : "=a"(regsPtr[0]), "=S"(regsPtr[1]), "=c"(regsPtr[2]), "=d"(regsPtr[3])
                  : "a"(index));
+#endif
     status = TCL_OK;
 #endif
     return status;
-- 
cgit v0.12