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