aarch64 and armv6 vs. armv7 support: armv6 is not supported, despite what "man arch" reports
- Reply: Dimitry Andric : "Re: aarch64 and armv6 vs. armv7 support: armv6 is not supported, despite what "man arch" reports"
- Reply: Robert Clausecker : "Re: aarch64 and armv6 vs. armv7 support: armv6 is not supported, despite what "man arch" reports"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 07 Dec 2023 04:31:13 UTC
man arch reports: QUOTE Some machines support more than one FreeBSD ABI. Typically these are 64-bit machines, where the “native” LP64 execution environment is accompanied by the “legacy” ILP32 environment, which was the historical 32-bit predecessor for 64-bit evolution. Examples are: LP64 ILP32 counterpart amd64 i386 powerpc64 powerpc aarch64 armv6/armv7 aarch64 will support execution of armv6 or armv7 binaries if the CPU implements AArch32 execution state, however older armv4 and armv5 binaries aren't supported. END QUOTE (I take "armv6 or armv7 binaries" as what was built targeting a FreeBSD architecture triple for one of those. FreeBSD keeps them distinct.) However, the armv6 part of that is wrong: The infrastructure supports only one 32-bit alternative for a given kernel, not a family of them at once . . . sys/kern/kern_mib.c : static const char * proc_machine_arch(struct proc *p) { if (p->p_sysent->sv_machine_arch != NULL) return (p->p_sysent->sv_machine_arch(p)); #ifdef COMPAT_FREEBSD32 if (SV_PROC_FLAG(p, SV_ILP32)) return (MACHINE_ARCH32); #endif return (MACHINE_ARCH); } . . . static int sysctl_kern_supported_archs(SYSCTL_HANDLER_ARGS) { const char *supported_archs; supported_archs = #ifdef COMPAT_FREEBSD32 compat_freebsd_32bit ? MACHINE_ARCH " " MACHINE_ARCH32 : #endif MACHINE_ARCH; return (SYSCTL_OUT(req, supported_archs, strlen(supported_archs) + 1)); } sys/arm64/include/param.h : #define MACHINE_ARCHES MACHINE_ARCH " " MACHINE_ARCH32 . . . #define MACHINE_ARCH32 "armv7" (There is no "armv6" alternative present.) But with something like: #define MACHINE_ARCH32 "armv7 armv6" MACHINE_ARCH32 is not interpreted as a list of alternatives, each supported. There is code that would have to be reworked to allow a list of alternatives to work. One can build a custom kernel with: #define MACHINE_ARCH32 "armv6" and then, having booted that kernel, then run armv6 on aarch64 --but, then, not armv7. https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=256132 is about this and has my messy notes as I explored and discovered that multiple 32-bit alternatives did not work. I see that I forgot various quote (") symbols. This note was prompted by: https://lists.freebsd.org/archives/freebsd-hackers/2023-December/002728.html that mentions "the list of valid MACHINE_ARCH" that reminded me of this old issue. === Mark Millard marklmi at yahoo.com