Author: David Schneider <[email protected]>
Branch: 
Changeset: r63479:7cf11fdfb221
Date: 2013-04-18 18:01 +0200
http://bitbucket.org/pypy/pypy/changeset/7cf11fdfb221/

Log:    ARM architecture autodetection based on /proc/cpuinfo

diff --git a/rpython/jit/backend/arm/detect.py 
b/rpython/jit/backend/arm/detect.py
--- a/rpython/jit/backend/arm/detect.py
+++ b/rpython/jit/backend/arm/detect.py
@@ -1,7 +1,10 @@
+import os
+
 from rpython.translator.tool.cbuild import ExternalCompilationInfo
 from rpython.rlib.clibffi import FFI_DEFAULT_ABI, FFI_SYSV, FFI_VFP
 from rpython.rtyper.tool import rffi_platform
 from rpython.translator.platform import CompilationError
+from rpython.rlib.debug import debug_print, debug_start, debug_stop
 
 eci = ExternalCompilationInfo(
     post_include_bits=["""
@@ -26,3 +29,35 @@
         return True
     except CompilationError:
         return False
+
+
+def detect_arch_version(filename="/proc/cpuinfo"):
+    fd = os.open(filename, os.O_RDONLY, 0644)
+    n = 0
+    debug_start("jit-backend-arch")
+    try:
+        buf = os.read(fd, 2048)
+        if not buf:
+            debug_print("Could not detect ARM architecture "
+                        "version, assuming", "ARMv%d" % n)
+            n = 6  # we asume ARMv6 as base case
+    finally:
+        os.close(fd)
+    # "Processor       : ARMv%d-compatible processor rev 7 (v6l)"
+    i = buf.find('ARMv')
+    if i == -1:
+        raise ValueError("Unknown Processor entry")
+
+    n = int(buf[i + 4])
+
+    if n < 6:
+        raise ValueError("Unsupported ARM architecture version")
+
+    debug_print("Detected", "ARMv%d" % n)
+
+    if n > 7:
+        n = 7
+        debug_print("Architecture version not explicitly supported, "
+                    "falling back to", "ARMv%d" % n)
+    debug_stop("jit-backend-arch")
+    return n
diff --git a/rpython/jit/backend/arm/test/test_detect.py 
b/rpython/jit/backend/arm/test/test_detect.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/backend/arm/test/test_detect.py
@@ -0,0 +1,24 @@
+import py
+from rpython.tool.udir import udir
+from rpython.jit.backend.arm.detect import detect_arch_version
+
+cpuinfo = "Processor : ARMv%d-compatible processor rev 7 (v6l)"""
+
+
+def write_cpuinfo(info):
+    filepath = udir.join('get_arch_version')
+    filepath.write(info)
+    return str(filepath)
+
+
+def test_detect_arch_version():
+    # currently supported cases
+    for i in (6, 7, ):
+        filepath = write_cpuinfo(cpuinfo % i)
+        assert detect_arch_version(filepath) == i
+    # unsupported cases
+    assert detect_arch_version(write_cpuinfo(cpuinfo % 8)) == 7
+    py.test.raises(ValueError,
+            'detect_arch_version(write_cpuinfo(cpuinfo % 5))')
+    py.test.raises(ValueError,
+            'detect_arch_version(write_cpuinfo("Lorem ipsum dolor sit amet, 
consectetur"))')
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to