FreeRTOS support for EL1 NS domU guest

The purpose of this page is to describe the build and execution of the FreeRTOS application as a Xen guest on Zynq UltraScale+ MPSoC using PetaLinux and Xilinx xsct Tools.

Table of Contents

Building the FreeRTOS Application

Steps to build the FreeRTOS applications as Xen guest are as given below,

  • Source Vitis settings.sh

  • xsct

  • set WORKSPACE .

  • setws -switch $WORKSPACE

  • app create -name <app name> -template {template app name} -proc psu_cortexa53_0 -hw {xsa path} -os freertos10_xilinx

  • bsp config stdin psu_uart_1

  • bsp config stdout psu_uart_1

  • bsp config hypervisor_guest true

  •  Go to application source path and modify the linker script start address to 0x40000000 as shown below,

Note: Xen guest address space always starts from 0x40000000, so updating linker script to load executable sections starting from 0x40000000.

1 2 3 4 5 6 7 8 9 /* Define Memories in the system */ MEMORY { psu_ddr_0_MEM_0 : ORIGIN = 0x40000000, LENGTH = 0x100000 psu_ddr_1_MEM_0 : ORIGIN = 0x800000000, LENGTH = 0x80000000 psu_ocm_ram_0_MEM_0 : ORIGIN = 0xFFFC0000, LENGTH = 0x40000 psu_qspi_linear_0_MEM_0 : ORIGIN = 0xC0000000, LENGTH = 0x20000000 }
  • app build -name <application name>

  • Run command to generate BIN file from executable "aarch64-linux-gnu-objcopy -O binary --gap-fill 0  <elf path> BOOT.BIN"

Configuring Xen

As FreeRTOS uses UART1 for stdout/stdin and TTC0 as tick timer, both of them need to be marked as passthrough in xen-overlay.dtsi. Apart from UART1/TTC0, if application is using any other peripheral device, corresponding nodes also need to be updated with passthrough property.

Example:

UART1 and TTC0 device can be passthrough in xen-overlay.dtsi, as shown below.

1 2 3 4 5 6 7 &uart1 { xen,passthrough = <0x1>; }; &ttc0 { xen,passthrough = <0x1>; };

Config file for FreeRTOS hello world application would look like as given below.

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # ===================================================================== # Example FreeRTOS Guest configuration # ===================================================================== # Guest name name = "freertos hello world" # Kernel image to boot kernel = "BOOT.BIN" # Kernel command line options - Allocate 8MB memory = 8 # Number of VCPUS vcpus = 1 # Pin to CPU 0 cpus = [1] irqs = [ 68, 69, 70, 54 ] iomem = [ "0xff010,1", "0xff110,1" ]

Note- ‘irq' parameter in config file specifies TTC0 (68-70) and UART1 interrupt ID’s , for specific peripheral in Zynq UltraScale+ MPSoC interrupt id can be found in “System Interrupts“ section of TRM

Executing the Application

Procedure is similar to baremetal domU guest as explained in https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842536#XENEL1BaremetalDomU-HowtoExecuteanEL1DomUBaremetalApplication .