Several references exist that document how to run seL4 on the Raspberry Pi 3 in 32-bit mode. One annoying paper cut encountered when getting this working is the need for a custom u-boot - either a binary distributed by the authors of seL4, or reverting a particular commit in u-boot.

A recent release of seL4 mentioned AArch64 support for RPi3. I’ve got it running, and it appears to avoid the need for a custom u-boot. (N.B. you still need a GPIO serial cable!)

I started with a stock Raspbian Lite image to get a known-good filesystem (with start.elf and bootcode.bin), then added u-boot and seL4 on top.

After installing the appropriate toolchain, seL4test can be configured and built almost as normal:

mkdir sel4test && cd sel4test
repo init -u https://github.com/seL4/sel4test-manifest.git
repo sync
mkdir build-rpi3 && cd build-rpi3
# Note AARCH64 here
./init-build.sh -DPLATFORM=rpi3 -DAARCH64=1
ninja

Copy build-rpi3/images/sel4test-driver-image-arm-bcm2837 to the SD card.

U-Boot was compiled approximately as per https://a-delacruz.github.io/ubuntu/rpi3-setup-64bit-uboot.html - I chose to use the latest stable release tag, v2020.04.

make CROSS_COMPILE=aarch64-linux-gnu- rpi_3_defconfig
make -j -s CROSS_COMPILE=aarch64-linux-gnu-

Copy u-boot.bin to the SD card.

Edit config.txt to add:

enable_uart=1
kernel=u-boot.bin
# Enable 64 bit mode
arm_control=0x200

Additionally I add a boot.scr file that automates loading and booting the image. First create boot.txt with the commands from the seL4 RPi3 support page:

fatload mmc 0 0x10000000 sel4test-driver-image-arm-bcm2837
bootelf 0x10000000

Then use mkimage from the u-boot source tree:

mkimage -A arm -O linux -T script -C none -n boot.scr -d boot.txt boot.scr

Copy boot.scr to the SD card.

If all is well, your serial output should show the test suite running to a reassuring conclusion:

U-Boot 2020.04 (May 11 2020 - 22:37:52 +0100)                                   
                                                                                
DRAM:  948 MiB                                                                  
RPI 3 Model B (0xa02082)                                                        
MMC:   mmc@7e202000: 0, sdhci@7e300000: 1                                       
Loading Environment from FAT... *** Warning - bad CRC, using default environment
                                                                                
In:    serial                                                                   
Out:   vidconsole                                                               
Err:   vidconsole                                                               
Net:   No ethernet found.                                                       
starting USB...                                                                 
Bus usb@7e980000: scanning bus usb@7e980000 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found            
Hit any key to stop autoboot:  0                                                
switch to partitions #0, OK                                                     
mmc0 is current device                                                          
Scanning mmc 0:1...                                                             
Found U-Boot script /boot.scr                                                   
151 bytes read in 5 ms (29.3 KiB/s)                                             
## Executing script at 02400000                                                 
3199560 bytes read in 141 ms (21.6 MiB/s)                                       
## Starting application at 0x00901000 ...                                       
                                                                                
ELF-loader started on CPU: ARM Ltd. Cortex-A53 r0p4                             
  paddr=[901000..c090f7]                                                        
No DTB passed in from boot loader.                                              
Looking for DTB in CPIO archive...found at a235c0.                              
Loaded DTB from a235c0.                                                         
   paddr=[238000..23bfff]                                                       
ELF-loading image 'kernel'                                                      
  paddr=[0..237fff]                                                             
  vaddr=[ffffff8000000000..ffffff8000237fff]                                    
  virt_entry=ffffff8000000000                                                   
ELF-loading image 'sel4test-driver'                                             
  paddr=[23c000..502fff]                                                        
  vaddr=[400000..6c6fff]                                                        
  virt_entry=40ecf8                                                             
Enabling MMU and paging                                                         
Jumping to kernel-image entry point... 
[...snip test output...]
Test suite passed. 128 tests passed. 41 tests disabled.                         
All is well in the universe