summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@sun.com>2006-10-18 18:11:06 -0700
committerAlan Coopersmith <alan.coopersmith@sun.com>2006-10-18 18:11:06 -0700
commit357b37b3826fa6e9878c0bd895164259c2ed3c0d (patch)
tree5b16ba6d41384f8af82d0321304bd9dc9970c83f
parent5eca750fe2f3f243fb352271ad8da196af0cb16a (diff)
Use getisax() instead of asm code to determine available x86 ISA extensions on Solaris
-rw-r--r--configure.ac3
-rw-r--r--fb/fbpict.c25
-rw-r--r--include/dix-config.h.in3
3 files changed, 28 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac
index 444dd4c04..693da1362 100644
--- a/configure.ac
+++ b/configure.ac
@@ -82,7 +82,8 @@ AC_TYPE_PID_T
dnl Checks for library functions.
AC_FUNC_VPRINTF
AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr \
- strtol getopt getopt_long vsnprintf walkcontext backtrace])
+ strtol getopt getopt_long vsnprintf walkcontext backtrace \
+ getisax])
AC_FUNC_ALLOCA
dnl Old HAS_* names used in os/*.c.
AC_CHECK_FUNC([getdtablesize],
diff --git a/fb/fbpict.c b/fb/fbpict.c
index eb305b906..d839994ae 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1435,6 +1435,10 @@ fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
*/
#if !defined(__amd64__) && !defined(__x86_64__)
+#ifdef HAVE_GETISAX
+#include <sys/auxv.h>
+#endif
+
enum CPUFeatures {
NoFeatures = 0,
MMX = 0x1,
@@ -1445,7 +1449,23 @@ enum CPUFeatures {
};
static unsigned int detectCPUFeatures(void) {
+ unsigned int features = 0;
unsigned int result;
+
+#ifdef HAVE_GETISAX
+ if (getisax(&result, 1)) {
+ if (result & AV_386_CMOV)
+ features |= CMOV;
+ if (result & AV_386_MMX)
+ features |= MMX;
+ if (result & AV_386_AMD_MMX)
+ features |= MMX_Extensions;
+ if (result & AV_386_SSE)
+ features |= SSE;
+ if (result & AV_386_SSE2)
+ features |= SSE2;
+ }
+#else
char vendor[13];
vendor[0] = 0;
vendor[12] = 0;
@@ -1454,7 +1474,8 @@ static unsigned int detectCPUFeatures(void) {
* %esp here. We can't declare either one as clobbered
* since they are special registers (%ebx is the "PIC
* register" holding an offset to global data, %esp the
- * stack pointer), so we need to make sure they have their+ * original values when we access the output operands.
+ * stack pointer), so we need to make sure they have their
+ * original values when we access the output operands.
*/
__asm__ ("pushf\n"
"pop %%eax\n"
@@ -1490,7 +1511,6 @@ static unsigned int detectCPUFeatures(void) {
: "%eax", "%ecx", "%edx"
);
- unsigned int features = 0;
if (result) {
/* result now contains the standard feature bits */
if (result & (1 << 15))
@@ -1524,6 +1544,7 @@ static unsigned int detectCPUFeatures(void) {
features |= MMX_Extensions;
}
}
+#endif /* HAVE_GETISAX */
return features;
}
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 571a86719..65c42e6af 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -112,6 +112,9 @@
/* Define to 1 if you have the `geteuid' function. */
#undef HAVE_GETEUID
+/* Define to 1 if you have the `getisax' function. */
+#undef HAVE_GETISAX
+
/* Define to 1 if you have the `getopt' function. */
#undef HAVE_GETOPT