Get started with the Neoverse Reference Design software stack


Now that you have the environment and the source set up, you can build the firmware stack. Follow the instructions to build a busybox root filesystem. This builds a lightweight kernel with shell. Test that the firmware implementation builds and boots on a FVP. The firmware stack requires TF-A, UEFI, SCP and a lightweight OS loader, to make sure you exercise the UEFI ExitBootServices transition. The busy-box boot is perfect for this.

Launch the container:


            ./container-scrits/ -v /home/ubuntu/rd-infra/ run

Perform a build inside the container:


            ./build-scripts/rdinfra/ -p rdn2 build

During the build you will see that TF-A, UEFI and SCP firmware are built using their own build systems. The build finishes with the following output:


        output/bin/grub-mkimage: info: kernel_img=0x7f366cf65010, kernel_size=0x1a000.
output/bin/grub-mkimage: info: the core size is 0xa2a98.
output/bin/grub-mkimage: info: writing 0xa5000 bytes.
Execute build for on rdn2[rdn2][busybox] done.
Execute build for on rdn2[rdn2][busybox]
~/rd-infra ~/rd-infra
Execute build for on rdn2[rdn2][busybox] done.


As your rd-infra workspace is mounted into the container from the outside, you should normally be able to find the output of the build in our host filesystem. You do not need to extract it from the container.

Package the built images

The build system provides scripts to package the build products into image files that can be consumed by the FVP.


            ./build-scripts/rdinfra/ -p rdn2 package

The script confirms that the firmware has been built, firmware marshalled, signing keys generated, firmware signed, firmware image files created, and finally a busy-box ramdisk created.

Verify that the package has been created successfully:


            ls output/rdn2/

The output contents should look like this:


        components  grub-busybox.img  ramdisk-busybox.img  rdn2


Examine the full build directory with:


            ls output/rdn2/rdn2/ -l

The output from this should be:


        total 4948
-rw-r--r-- 1 ubuntu ubuntu 5064017 Jan 12 15:35 fip-uefi.bin
lrwxrwxrwx 1 ubuntu ubuntu      25 Jan 12 15:35 Image -> ../components/linux/Image
lrwxrwxrwx 1 ubuntu ubuntu      35 Jan 12 15:35 Image.defconfig -> ../components/linux/Image.defconfig
lrwxrwxrwx 1 ubuntu ubuntu      26 Jan 12 15:35 lkvm -> ../components/kvmtool/lkvm
lrwxrwxrwx 1 ubuntu ubuntu      32 Jan 12 15:35 mcp_ramfw.bin -> ../components/rdn2/mcp_ramfw.bin
lrwxrwxrwx 1 ubuntu ubuntu      32 Jan 12 15:35 mcp_romfw.bin -> ../components/rdn2/mcp_romfw.bin
lrwxrwxrwx 1 ubuntu ubuntu      32 Jan 12 15:35 scp_ramfw.bin -> ../components/rdn2/scp_ramfw.bin
lrwxrwxrwx 1 ubuntu ubuntu      32 Jan 12 15:35 scp_romfw.bin -> ../components/rdn2/scp_romfw.bin
lrwxrwxrwx 1 ubuntu ubuntu      29 Jan 12 15:35 tf-bl1.bin -> ../components/rdn2/tf-bl1.bin
lrwxrwxrwx 1 ubuntu ubuntu      29 Jan 12 15:35 tf-bl2.bin -> ../components/rdn2/tf-bl2.bin
lrwxrwxrwx 1 ubuntu ubuntu      30 Jan 12 15:35 tf-bl31.bin -> ../components/rdn2/tf-bl31.bin
lrwxrwxrwx 1 ubuntu ubuntu      33 Jan 12 15:35 uefi.bin -> ../components/css-common/uefi.bin


The fip-uefi.bin firmware image will contain the TF-A BL2 boot loader image which is responsible for unpacking the rest of the firmware as well as the firmware that TF-A BL2 unpacks. This includes the SCP BL2 (scp_ramfw.bin) image that is unpacked by the AP firmware and transferred over to the SCP TCMs using the SCP shared data store module. Along with the FIP image, the FVP also needs the TF-A BL1 image and the SCP BL1 (scp_romfw.bin) image files.