mozilla-sle11.patch
author Wolfgang Rosenauer <wr@rosenauer.org>
Tue, 13 Mar 2012 08:06:57 +0100
changeset 408 475395d00191
parent 382 67f876aafae8
child 568 2c74c5927ea2
permissions -rw-r--r--
Firefox 11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
285
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     1
Subject: Patches needed to build on SLE11/11.1
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     2
References:
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     3
https://bugzilla.mozilla.org/show_bug.cgi?id=513422
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     4
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     5
diff --git a/xpcom/glue/SSE.cpp b/xpcom/glue/SSE.cpp
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     6
--- a/xpcom/glue/SSE.cpp
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     7
+++ b/xpcom/glue/SSE.cpp
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     8
@@ -44,26 +44,77 @@ namespace {
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     9
 // SSE.h has parallel #ifs which declare MOZILLA_SSE_HAVE_CPUID_DETECTION.
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    10
 // We can't declare these functions in the header file, however, because
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    11
 // <intrin.h> conflicts with <windows.h> on MSVC 2005, and some files want to
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    12
 // include both SSE.h and <windows.h>.
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    13
 
382
67f876aafae8 lift up to Gecko 11beta
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 294
diff changeset
    14
 #ifdef HAVE_CPUID_H
285
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    15
 
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    16
 // cpuid.h is available on gcc 4.3 and higher on i386 and x86_64
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    17
-#include <cpuid.h>
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    18
+//#include <cpuid.h>
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    19
 
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    20
 enum CPUIDRegister { eax = 0, ebx = 1, ecx = 2, edx = 3 };
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    21
 
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    22
+#ifdef __i386__
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    23
+#define _my_cpuid(level, a, b, c, d)                    \
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    24
+  __asm__ ("xchg{l}\t{%%}ebx, %1\n\t"                   \
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    25
+           "cpuid\n\t"                                  \
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    26
+           "xchg{l}\t{%%}ebx, %1\n\t"                   \
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    27
+           : "=a" (a), "=r" (b), "=c" (c), "=d" (d)     \
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    28
+           : "0" (level))
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    29
+#else
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    30
+#define _my_cpuid(level, a, b, c, d)                    \
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    31
+  __asm__ ("cpuid\n\t"                                  \
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    32
+           : "=a" (a), "=b" (b), "=c" (c), "=d" (d)     \
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    33
+           : "0" (level))
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    34
+#endif
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    35
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    36
+static __inline unsigned int
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    37
+my_cpuid_max (unsigned int __ext, unsigned int *__sig)
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    38
+{
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    39
+  unsigned int __eax, __ebx, __ecx, __edx;
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    40
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    41
+#ifdef __i386__
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    42
+  __asm__ ("pushf{l|d}\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    43
+           "pushf{l|d}\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    44
+           "pop{l}\t%0\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    45
+           "mov{l}\t{%0, %1|%1, %0}\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    46
+           "xor{l}\t{%2, %0|%0, %2}\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    47
+           "push{l}\t%0\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    48
+           "popf{l|d}\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    49
+           "pushf{l|d}\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    50
+           "pop{l}\t%0\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    51
+           "popf{l|d}\n\t"
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    52
+           : "=&r" (__eax), "=&r" (__ebx)
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    53
+           : "i" (0x00200000));
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    54
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    55
+  if (!((__eax ^ __ebx) & 0x00200000))
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    56
+    return 0;
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    57
+#endif
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    58
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    59
+  /* Host supports cpuid.  Return highest supported cpuid input value.  */
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    60
+  _my_cpuid (__ext, __eax, __ebx, __ecx, __edx);
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    61
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    62
+  if (__sig)
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    63
+    *__sig = __ebx;
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    64
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    65
+  return __eax;
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    66
+}
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    67
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    68
 static bool
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    69
 has_cpuid_bit(unsigned int level, CPUIDRegister reg, unsigned int bit)
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    70
 {
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    71
   unsigned int regs[4];
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    72
-  return __get_cpuid(level, &regs[0], &regs[1], &regs[2], &regs[3]) &&
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    73
-         (regs[reg] & bit);
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    74
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    75
+  unsigned int __ext = level & 0x80000000;
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    76
+  if (my_cpuid_max(__ext, 0) < level)
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    77
+    return false;
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    78
+
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    79
+  _my_cpuid(level, regs[0], regs[1], regs[2], regs[3]);
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    80
+  return !!(unsigned(regs[reg]) & bit);
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    81
 }
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    82
 
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    83
 #elif defined(_MSC_VER) && _MSC_VER >= 1400 && (defined(_M_IX86) || defined(_M_AMD64))
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    84
 
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    85
 // MSVC 2005 or newer on x86-32 or x86-64
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    86
 #include <intrin.h>
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    87
 
0287f70d86e9 SLE11 compatibility:
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    88
 enum CPUIDRegister { eax = 0, ebx = 1, ecx = 2, edx = 3 };