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

Reply via email to