ImageBuilder
Booting Xen from U-Boot
Booting Xen from U-Boot requires:
- loading all the required binaries, manually specifying the loading address for each of them making sure they don't overlap
- Xen, Dom0 kernel, Dom0 ramdisk, device tree binary, any Dom0-less DomUs kernels, ramdisk and partial dtbs for passthrough
- adding relevant nodes to device tree
- the Dom0 kernel and ramdisk loading addresses need to be specified in device tree under /chosen
See booting.txt as a reference.
ImageBuilder
The whole process can be automated with ImageBuilder:
https://gitlab.com/ViryaOS/imagebuilder
ImageBuilder can be invoked as a container for build automation, but its useful scripts can also be called manually. Specifically, script/uboot-script-gen generates a U-Boot script that loads all the necessary binaries and automatically adds the required entries to device tree at boot time. In order to use it, you need to write a config file first.
Config file
MEMORY_START="0x0" MEMORY_END="0x80000000" UBOOT_DIR="uboot" DEVICE_TREE="board.dtb" XEN="xen-hypervisor" DOM0_KERNEL="Image-dom0" DOM0_RAMDISK="ramdisk-dom0.rootfs.cpio.gz" NUM_DOMUS=2 DOMU_KERNEL[0]="dom1/Image-domU" DOMU_RAMDISK[0]="dom1/ramdisk-domU" DOMU_PASSTHROUGH_DTB[0]="dom1/passthrough-domU.dtb" DOMU_KERNEL[1]="dom2/Image-domU" DOMU_RAMDISK[1]="dom2/ramdisk-domU2" UBOOT_SOURCE="boot.source" UBOOT_SCRIPT="boot.scr"
The fields are self explanatory but you can find more detailed information on the readme. Make sure to use raw binaries for Xen, all the kernels and rootfs's, not U-Boot binaries (do not use the output of mkimage).
uboot-script-gen
Once you have the config file, you can call uboot-script-gen as follows:
$ export LOAD_CMD="tftpb" $ bash ./scripts/uboot-script-gen /path/to/config
to generate a U-Boot script named boot.scr that will load all your binaries automatically using tftp. You just need to load the generated boot.scr and source it from U-Boot:
$ tftpb 0xC00000 boot.scr; source 0xC00000
The command used to load the binaries can be customized, for instance you can have uboot-script-gen generate a U-Boot script that loads binaries from a SD card changing LOAD_CMD to "load scsi 0:1":
$ export LOAD_CMD="load scsi 0:1" $ bash ./scripts/uboot-script-gen /path/to/config
Important Notes
Xen and Dom0 command line
ImageBuilder uses sched=null by default. If you want to change it, and also modify other Xen and/or Dom0 command line options you'll make to edit the generated U-Boot script: boot.source. Look for sched=null in the source and edit as needed. Then you need to regenerate boot.scr using mkimage and specifying the same loading address for the boot.scr as printed earlier by uboot-script-gen:
$ mkimage -A arm64 -T script -C none -a 0xC00000 -e 0xC00000 -d boot.source boot.scr
U-Boot binaries vs. raw binaries
uboot-script-gen takes only raw binaries as input. If you have a U-Boot binary in your hands and you want to convert it back to a raw binary, you can do that with the following command:
$ dd if=uboot-binary-source of=raw-binary-dest bs=64 skip=1
Xen booting as raw binary
If you use a version of Xen older than 4.12, you need to make sure to have the following commit backported in your Xen tree:
4f3d0ed5d9 xen:arm: Populate arm64 image header
It is necessary to be able to boot Xen as a raw binary from U-Boot.