# Hurd on aarch64 notes this may be in the public domain ## Build gnumach
Prepare the crosscompiler environment ``` PREFIX=~/src/crosshurd-aarch64 mkdir $PREFIX mkdir $PREFIX/{src,include,aarch64-gnu}; ln -s ../include $PREFIX/aarch64-gnu/sys-include; ln -s ../lib $PREFIX/aarch64-gnu/lib ``` Compile binutils ``` cd $PREFIX/src git clone https://sourceware.org/git/binutils-gdb.git mv binutils-gdb/ binutils cd binutils mkdir build cd build ../configure --disable-werror --target=aarch64-gnu --prefix=$PREFIX --with-lib-path=$PREFIX/lib make make install ``` Compile gcc ``` cd $PREFIX/src git clone https://gcc.gnu.org/git/gcc.git cd gcc mkdir build cd build ../configure --prefix=$PREFIX --target=aarch64-gnu --with-lib-path=$PREFIX/lib --disable-multilib --enable-languages=c && make all-gcc && make install-gcc ``` Might need the patch at https://lists.gnu.org/archive/html/bug-hurd/2024-03/msg00110.html Compile gnumach and install headers, Sergey branch ``` cd $PREFIX/src git clone https://git.savannah.gnu.org/git/hurd/gnumach.git cd gnumach git remote add bugaevc https://github.com/bugaevc/gnumach.git git fetch bugaevc git switch -c wip-aarch64 bugaevc/wip-aarch64 autoreconf -i && mkdir build && cd build && CC=gcc ../configure --prefix=$PREFIX --host=aarch64-gnu && make install-data ``` Set PATH variable: ``` PATH=$PATH:$PREFIX/bin ``` Install mig ``` cd $PREFIX/src git clone https://git.savannah.gnu.org/git/hurd/mig.git cd mig autoreconf -i mkdir build && cd build ../configure --target=aarch64-gnu --prefix=$PREFIX && make && make install ``` Install hurd headers ``` cd $PREFIX/src git clone https://git.savannah.gnu.org/git/hurd/hurd.git cd hurd git remote add bugaevc https://github.com/bugaevc/hurd.git git fetch bugaevc git switch -c aarch64 bugaevc/aarch64 autoreconf -i && mkdir build && cd build && CC=gcc ../configure --host=aarch64-gnu --without-parted --without-libcrypt --without-libbz2 --without-libz --without-rump && make no_deps=t prefix=$PREFIX install-headers ``` Install glibc headers ``` cd $PREFIX/src git clone https://sourceware.org/git/glibc.git cd glibc/ git remote add bugaevc https://github.com/bugaevc/glibc.git git fetch bugaevc git switch -c aarch64-gnu bugaevc/aarch64-gnu mkdir build && cd build && ../configure --disable-mathvec --host=aarch64-gnu --prefix= && make install-headers DESTDIR=$PREFIX touch $PREFIX/include/gnu/stubs.h $PREFIX/lib/libc.so && make csu/subdir_lib && install csu/crt1.o csu/crti.o csu/crtn.o $PREFIX/lib ``` Make libgcc ``` cd $PREFIX/src cd gcc/build make configure-target-libgcc && make all-target-libgcc && make install-target-libgcc ``` Make gnumach for real now ``` cd $PREFIX/src cd gnumach rm -r build && mkdir build && cd build && ../configure --prefix=$PREFIX --host=aarch64-gnu && make ``` Check booting notes in aarch64/BOOTING. Test gnumach: ``` cd $PREFIX/src cd gnumach/build make tests/module-{hello,gsync,mach_host,machmsg,mach_port,syscalls,task,threads,vm,thread-state} qemu-system-aarch64 -m 1G -machine virt -cpu max -kernel gnumach -nographic -append "foo=bar" -device guest-loader,kernel=tests/module-hello,bootargs="module-hello "'${host-port} ${device-port} $(task-create) $(task-resume)',addr=0x4000 for test in gsync hello mach_host machmsg mach_port syscalls task threads vm; do qemu-system-aarch64 -m 1G -machine virt -cpu max -kernel gnumach -nographic -append "foo=bar" -device guest-loader,kernel=tests/module-$test,bootargs="module-$test "'${host-port} ${device-port} $(task-create) $(task-resume)',addr=0x4000; done ``` ## Debug gnumach: ``` qemu-system-aarch64 -m 1G -machine virt -cpu max -kernel gnumach -nographic -append "foo=bar" -device guest-loader,kernel=tests/module-hello,bootargs="module-hello "'${host-port} ${device-port} $(task-create) $(task-resume)',addr=0x4000 ``` in another terminal (tab), run gdb, enter tar ext :1234, then p $pc. $pc is in 0x40000000. Enter si 6 times, $pc should jump to 0x0000000040200000. symbol-file gnumach.elf -o $pc. ## Build Das U-Boot Make Arm Trusted Firmware: ``` cd $PREFIX/src git clone https://github.com/ARM-software/arm-trusted-firmware.git cd arm-trusted-firmware export CROSS_COMPILE=aarch64-gnu- export ARCH=arm64 make PLAT=sun50i_a64 bl31 ``` Make crust: ``` cd $PREFIX/src git clone https://github.com/crust-firmware/crust cd crust export CROSS_COMPILE=or1k-elf- make a64-olinuxino_defconfig make scp ``` Download Das U-boot: ``` cd $PREFIX/src git clone https://github.com/u-boot/u-boot.git ``` Make Das U-boot: ``` cd $PREFIX/src cd u-boot export CROSS_COMPILE=aarch64-gnu- export BL31=$PREFIX/src/arm-trusted-firmware/build/sun50i_a64/release/bl31.bin export ARCH=arm64 export SCP=$PREFIX/src/crust/build/scp/scp.bin make distclean make a64-olinuxino_defconfig make all ``` Install u-boot: ``` sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/[CHANGE THIS] bs=1024 seek=8 ``` ## Boot gnumach with Das U-boot ### Boot from serial After copying dt.dtb from u-boot, gnumach and tests/module-hello from gnumach in a local directory. Boot the system in u-boot. Then from a serial terminal run: ``` loady 0x42000000 <== load gnumach size:0x00069c58 loady 0x60000000 <== load module-hello size:0x000779e0 loady 0x42200000 <== load dt.dtb size:0x0000a018 fdt addr 0x42200000 fdt resize fdt set /chosen bootargs "foo=bar" fdt set /chosen \#address-cells <0x2> fdt set /chosen \#size-cells <0x2> fdt mknod /chosen module@0x60000000 fdt set /chosen/module@0x60000000 compatible "multiboot,kernel" "multiboot,module" fdt set /chosen/module@0x60000000 reg <0x0 0x60000000 0x0 0x000779e0> fdt set /chosen/module@0x60000000 bootargs "module-hello "'${host-port} ${device-port} $(task-create) $(task-resume)' fdt print /chosen booti 0x42000000 - 0x42200000 ``` Where <== load commands are terminal-emulator dependent. ### Boot from smartcard Copy dt.dtb, gnumach, gnumach-tracing and all modules on the sd card. The tracing version of gnumach is obtained by cherrypicking the relative commit in a gnumach tree and rebuilding gnumach: ``` git cherry-pick ee177f52680116538192b2c0c5d9a08e174c007f ``` Create the file boot.cmd on the smartcard: ``` if itest $trace != 0; then load mmc 0:1 0x42000000 gnumach-tracing; else load mmc 0:1 0x42000000 gnumach; fi load mmc 0:1 0x60000000 $module load mmc 0:1 0x42200000 dt.dtb fdt addr 0x42200000 fdt resize fdt set /chosen bootargs "foo=bar" fdt set /chosen \#address-cells <0x2> fdt set /chosen \#size-cells <0x2> fdt mknod /chosen module@0x60000000 fdt set /chosen/module@0x60000000 compatible "multiboot,kernel" "multiboot,module" fdt set /chosen/module@0x60000000 reg <0x0 0x60000000 0x0 0x04000000> fdt set /chosen/module@0x60000000 bootargs "$module "'${host-port} ${device-port} $(task-create) $(task-resume)' booti 0x42000000 - 0x42200000 ``` Compile it with: ``` mkimage -C none -A arm -T script -d boot.cmd boot.scr ``` Boot into Das u-boot, interrupt automatic booting to set the variables before: ``` trace=0 module=module-hello boot ``` modify trace to a different number to start the version of gnumach compiled with tracing.