X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/waydroid.git/blobdiff_plain/45ded8c27ec83078a2319b14cccbde245f5c478c..60e96fa95d9aedd4dc2bdb80b17b4cc46565c210:/tools/helpers/arch.py 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