Hello all!

This is my first time posting here, but I'll try to provide all the detail I 
can, and I'm grateful for any advice others have to fix this issue.

I've been trying to boot the seL4 Hello World tutorial in QEMU with UEFI 
support on the x86 platform, with the help of the Grub bootloader. It seems I 
can load the kernel okay, but an error occurs when the kernel tries to load the 
rootserver:

> seL4 failed assertion 'mods_end_paddr > boot_state.ki_p_reg.end' at 
> /home/fennel/grubbuild/stacktest/sel4-tutorials/kernel/src/arch/x86/kernel/boot_sys.c:452
>  in function try_boot_sys

>From my research, it seems to be happening because grub is loading the 
>rootserver module at a lower address than expected. These two lines from 
>serial output during boot indeed show that the module end address is lower 
>than the kernel end address:
> module #0: start=0x751000 end=0x7954c8 size=0x444c8 name=''
> Kernel loaded to: start=0x100000 end=0xc12000 size=0xb12000 entry=0x100298

When running the same hello world project using ./simulate in the build 
directory, the rootserver module is placed at a higher address and boots ok:
> module #0: start=0xc13000 end=0xc574c8 size=0x444c8 
> name='images/hello-world-image-x86_64-pc99'
> Kernel loaded to: start=0x100000 end=0xc12000 size=0xb12000 entry=0x100298

Does anyone know if this is a mistake in how I am compiling and building the 
project, my QEMU settings, or perhaps an issue with how Grub is handling 
loading the module? Booting from Grub should be possible in theory 
(https://docs.sel4.systems/Hardware/IA32.html) so any guidance is appreciated. 
Thank you! - Fennel



STEPS TO REPRODUCE:
# Contents of grub.cfg - place in current directory
menuentry "Load seL4" --class os {
    insmod efi_gop
    insmod efi_uga
    insmod all_video
    set root='(hd0,gpt1)'
    multiboot2 /EFI/BOOT/sel4kernel
    module2 /EFI/BOOT/sel4rootserver
}
# End of grub.cfg

# Compile Grub 2.06 from source to ./grub-2.06
wget https://ftp.gnu.org/gnu/grub/grub-2.06.tar.gz -O grub.tar.gz # Download 
grub source
tar -xvzf grub.tar.gz -C ./ && rm grub.tar.gz # Unzip and remove original file
cd grub-2.06 && ./autogen.sh && ./configure --target=x86_64 --with-platform=efi 
&& make # Configure & compile

# Install, configure, and compile hello-world seL4 project to ./sel4-tutorials
mkdir sel4-tutorials
cd sel4-tutorials
repo init -u https://github.com/seL4/sel4-tutorials-manifest # Install tutorials
repo sync
./init --plat pc99 --tut hello-world
cd hello-world_build
cmake -DCMAKE_TOOLCHAIN_FILE=../kernel/gcc.cmake -DKernelHugePage=OFF -G Ninja 
. # Disable huge page requirement
ninja

# Create final image as disk.img
mkdir EFI EFI/BOOT
grub-2.06/grub-mkimage -d grub-2.06/grub-core -o EFI/BOOT/BOOTX64.EFI -O 
x86_64-efi -p "" configfile fat part_gpt gzio multiboot video efi_gop efi_uga 
normal chain boot multiboot2 all_video
cp sel4-tutorials/hello-world_build/images/kernel-x86_64-pc99 
EFI/BOOT/sel4kernel
cp sel4-tutorials/hello-world_build/images/hello-world-image-x86_64-pc99 
EFI/BOOT/sel4rootserver
cp grub.cfg EFI/BOOT/grub.cfg
dd if=/dev/zero of=disk.img bs=1M count=35 # 35MB is just about the smallest 
FAT32 partition possible
mformat -i disk.img@@2048s -v "EFI SYSTEM" -F # Create fat32 partition 2048 
sectors in
mcopy -i disk.img@@2048s -s EFI ::
parted -s disk.img mklabel gpt mkpart '"EFI SYSTEM"' fat32 2048s 100% set 1 esp 
on # Create partition entry for ESP

# Run in QEMU (most of these arguments are copied from the seL4 ./simulate 
script - replace OVMF path with your path to OVMF_CODE.fd for UEFI boot)
qemu-system-x86_64 -cpu 
Nehalem,-vme,+pdpe1gb,-xsave,-xsaveopt,-xsavec,-fsgsbase,-invpcid,+syscall,+lm,enforce
 -serial mon:stdio -m size=512M -drive 
if=pflash,format=raw,readonly=on,file=PATH_TO_OVMF_CODE.fd -drive file=disk.img
_______________________________________________
Devel mailing list -- devel@sel4.systems
To unsubscribe send an email to devel-leave@sel4.systems

Reply via email to