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, but base-passwd, coreutils and shadow are still missing.

Use this command to cross-generate a filesystem image:

sudo debootstrap --foreign --no-check-gpg --arch=arm64ilp32 rebootstrap ilp32chroot 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

824742

binutils

861833

gcc-6

874583

glibc

874587

linux

874536

libatomic-ops

867241

openssl

867240

libgpg-error

869605

gmp

869691

nspr

871741

libgc

872392

findutils

nobble getrlimit test

gnutls28

872454

systemd

set rlim_t to UQUAD, not ULONGWORD, in glibc

libssh2

874679 (Arch independent issue)

openssl1.0

874709

perl

875922 872471 875921

coreutils

?DebianBug: ?DebianBug: (arch-independent cross fixes)

kernel

Here's how to build an arm64ilp32 kernel:

apt install git bc gcc-aarch64-linux-gnu build-essential 
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

Test it on qemu:

apt install qemu-system-aarch64
qemu-system-aarch64 \
  -M virt -cpu cortex-a57 -m 1024 \
  -drive file=ilp32.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/vda rw"

See if you got the right stuff:

$ arch-test
arm64
arm64ilp32
armel
armhf