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?ds=sidebyside 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