]> glassweightruler.freedombox.rocks Git - waydroid.git/blobdiff - tools/helpers/arch.py
Remove unused python imports
[waydroid.git] / tools / helpers / arch.py
index 735d344e17c773223b81c2b3702730f6969037af..8f4543a582dbd47f9a7e6eaabd12282fbecf54c6 100644 (file)
@@ -2,6 +2,21 @@
 # SPDX-License-Identifier: GPL-3.0-or-later
 import platform
 import logging
+import ctypes
+
+def is_32bit_capable():
+    # man 2 personality
+    personality = ctypes.CDLL(None).personality
+    personality.restype = ctypes.c_int
+    personality.argtypes = [ctypes.c_ulong]
+    # linux/include/uapi/linux/personality.h
+    PER_LINUX32 = 0x0008
+    # mirror e.g. https://github.com/util-linux/util-linux/blob/v2.41/sys-utils/lscpu-cputype.c#L745-L756
+    pers = personality(PER_LINUX32)
+    if pers != -1: # success, revert back to previous persona (typically just PER_LINUX, 0x0000)
+        personality(pers)
+        return True
+    return False # unable to "impersonate" 32-bit host, nothing done
 
 def host():
     machine = platform.machine()
@@ -19,12 +34,18 @@ def host():
                      " architecture is not supported")
 
 def maybe_remap(target):
-    if target == "x86_64":
+    if target.startswith("x86"):
         with open("/proc/cpuinfo") as f:
-            if "sse4_2" not in f.read():
-                logging.info("x86_64 CPU does not support SSE4.2, falling back to x86...")
-                return "x86"
+            cpuinfo = f.read()
+        if "ssse3" not in cpuinfo:
+            raise ValueError("x86/x86_64 CPU must support SSSE3!")
+        if target == "x86_64" and "sse4_2" not in cpuinfo:
+            logging.info("x86_64 CPU does not support SSE4.2, falling back to x86...")
+            return "x86"
     elif target == "arm64" and platform.architecture()[0] == "32bit":
         return "arm"
+    elif target == "arm64" and not is_32bit_capable():
+        logging.info("AArch64 CPU does not appear to support AArch32, assuming arm64_only...")
+        return "arm64_only"
 
     return target