This port is arm64 with a 32-bit ABI instead of a 64bit ABI. It is exactly equivalent to x32 on x86. The instruction set is 64-bit armv8, but not using the default LP64 ABI (64-bit longs and pointers) but the ILP32 ABI (ints, longs and pointers are all 32bit, same as they are on armhf/armel).
It gives exactly the same functionality as existing 32-bit ARM, but using the v8 instruction set. This is significant on arm cores that _only_ support v8, such as the Cavium ThunderX, where you also have software that is not 64-bit-safe.
It is fairly experimental at the moment (2016/2017) and whilst there is some upstream toolchain support, kernel and glibc support have not yet been upstreamed ( July 2017) and may never be - there is some debate about whether the kernel people wish to maintain it.
Documentation
Linaro maintains a wiki page at https://wiki.linaro.org/Platform/arm64-ilp32
Status
Linaro is doing bootstrap work so that it is possible to build this in Debian. It is unlikely to become a Debian port unless it achieves sufficient interest and maturity to be maintainable. This may happen if enough 64-bit-only cores are produced, whilst interest in 32-bit-only software remains.
packages (stable/stretch/9) are available here: http://people.linaro.org/~wookey/ilp32
There is a working cross-toolchain there, for both amd64 and arm64, plus a set of cross-built packages, enough to do a debootstrap.
Use this command to cross-generate a filesystem image:
sudo debootstrap --foreign --no-check-gpg --arch=arm64ilp32 rebootstrap chroot http://people.linaro.org/~wookey/ilp32/repo /usr/share/debootstrap/scripts/stretch
You also need an arm64 kernel with ilp32 support enabled/built to run those binaries either on real hardware or in qemu.
The rebootstrap branch containing all the patches lives here: https://anonscm.debian.org/cgit/users/wookey/rebootstrap.git/log/?h=ilp32-stable
Debian differences
The debian port is a 'proper' multiarchable port for this ABI. Most other efforts so far have been to build an aarch64/arm64 toolchain which can build both LP64 and ILP32 ABI binaries, and treat everything as multilib. ?OpenSuse did an OBS build of a pile of packages to produce a set of arm64ilp32 binaries in 2016.
Patches/BUGs
dpkg |
|
binutils |
|
gcc-6 |
|
glibc |
|
linux |
|
libatomic-ops |
|
openssl |
|
libgpg-error |
|
gmp |
|
nspr |
|
libgc |
|
findutils |
nobble getrlimit test |
gnutls28 |
|
systemd |
set rlim_t to UQUAD, not ULONGWORD, in glibc |
libssh2 |
874679 (Arch independent issue) |
openssl1.0 |
|
perl |
kernel
Here's how to build an arm64ilp32 kernel:
git clone https://github.com/norov/linux.git cd linux/ git checkout ilp32-4.12 # bd1f3da26a9c73fe537490e6faeb96ccf3bf7b2c make ARCH=arm64 defconfig echo CONFIG_ARM64_ILP32=y >> .config make ARCH=arm64 olddefconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j16 Image.gz qemu-system-aarch64 \ -M virt -cpu cortex-a57 -m 1024 \ -drive file=/tmp/disk.img,if=none,format=raw,id=hd0 \ -netdev user,id=net0 -device virtio-net-device,netdev=net0 \ -device virtio-blk-device,drive=hd0 \ -nographic \ -kernel arch/arm64/boot/Image.gz \ -append "root=/dev/vda2 rw"
$ arch-test arm64 arm64ilp32 armel armhf