# 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.