I think all XScale processors have CP14 timestamp (see
<http://download.intel.com/design/intelxscale/XScaleDatasheet4.pdf>) but
it's in register 1, not register 0.  The original report is right in
that StrongArm processors do not have a CP14.  Therefore the following
*should* work:

--- liboil-0.3.10.orig/liboil/liboilcpu.c       2006-11-06 01:37:03.000000000 
+0000
+++ liboil-0.3.10/liboil/liboilcpu.c    2007-02-22 13:41:31.000000000 +0000
@@ -620,7 +620,7 @@
 {
   unsigned int ts;
   __asm__ __volatile__ (
-      "  mrc p14, 0, %0, c0, c0, 0 \n"
+      "  mrc p14, 0, %0, c1, c0, 0 \n"
       : "=r" (ts));
   return ts;
 }
@@ -629,7 +629,8 @@
 oil_cpu_detect_arm(void)
 {
 #ifdef __linux__
-  int arm_implementer;
+  int arm_implementer = 0;
+  char arm_architecture = 0;
   char *cpuinfo;
   char *s;
 
@@ -640,18 +641,16 @@
     arm_implementer = strtoul (s, NULL, 0);
     free(s);
   }
+  s = get_cpuinfo_line(cpuinfo, "CPU architecture");
+  if (s) {
+    char *p = s + strspn(s, " \t");
+    arm_architecture = *p;
+    free(s);
+  }
 
-  switch(arm_implementer) {
-    case 0x69: /* Intel */
-      /* assume that all Intel chips support CP14 timestamp */
-      _oil_profile_stamp = oil_profile_stamp_xscale;
-      break;
-    case 0x41: /* ARM */
-      /* ARM chips are known to not have timestamping available from 
-       * user space */
-      break;
-    default:
-      break;
+  /* only Intel XScale processors support CP14 timestamp */
+  if (arm_implementer == 0x69 && arm_architecture == '5') {
+    _oil_profile_stamp = oil_profile_stamp_xscale;
   }
 
   free (cpuinfo);
-- END --

In practice it still results in SIGILL, so I agree we should never use
oil_profile_stamp_xscale().

Ben.

-- 
Ben Hutchings
Beware of bugs in the above code;
I have only proved it correct, not tried it. - Donald Knuth

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to