From: Jami Kettunen Date: Fri, 23 May 2025 13:53:21 +0000 (+0300) Subject: arch: Separately identify arm64_only CPUs without AArch32 support X-Git-Tag: 1.5.2~3 X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/waydroid.git/commitdiff_plain/60e96fa95d9aedd4dc2bdb80b17b4cc46565c210 arch: Separately identify arm64_only CPUs without AArch32 support More and more modern AArch64 SoCs present both in computers and phones can no longer run normal arm64 image builds which (currently anyway) also ship various amounts of 32-bit executables that cannot be natively executed; thus let's target an upcoming arm64_only OTA channel instead. --- diff --git a/tools/helpers/arch.py b/tools/helpers/arch.py index c74ef90..8f4543a 100644 --- a/tools/helpers/arch.py +++ b/tools/helpers/arch.py @@ -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() @@ -29,5 +44,8 @@ def maybe_remap(target): 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