Semihosting

Semihosting is ARM’s way of having a real or virtual target communicate with a host or host debugger for basic operations such as file I/O, console I/O, etc. Please see Arm’s semihosting documentation for more information.

Platform Support

Versatile Express

For developing on armv8 virtual fastmodel platforms, semihosting is a valuable tool since it allows access to image/configuration files before eMMC or other NV media are available.

There are two main ARM virtual Fixed Virtual Platform (FVP) models, Versatile Express (VE) FVP and BASE FVP. The initial vexpress64 U-Boot board created here runs on the VE virtual platform using the license-free Foundation_v8 simulator. Fortunately, the Foundation_v8 simulator also supports the BASE_FVP model which companies can purchase licenses for and contain much more functionality. So we can, in U-Boot, run either model by either using the VE FVP (default), or turning on CONFIG_BASE_FVP for the more full featured model.

Rather than create a new armv8 board similar to armltd/vexpress64, add semihosting calls to the existing one, enabled with CONFIG_SEMIHOSTING and CONFIG_BASE_FVP both set. Also reuse the existing board config file vexpress_aemv8.h but differentiate the two models by the presence or absence of CONFIG_BASE_FVP. This change is tested and works on both the Foundation and Base fastmodel simulators.

QEMU

Another ARM emulator which supports semihosting is QEMU. To enable semihosting, enable CONFIG_SERIAL_PROBE_ALL when configuring U-Boot, and use -semihosting when invoking QEMU. Adding -nographic can also be helpful. When using a semihosted serial console, QEMU will block waiting for input. This will cause the GUI to become unresponsive. To mitigate this, try adding -nographic. For more information about building and running QEMU, refer to the board documentation.

OpenOCD

Any ARM platform can use semihosting with an attached debugger. One such debugger with good support for a variety of boards and JTAG adapters is OpenOCD. Semihosting is not enabled by default, so you will need to enable it:

$ openocd -f <your board config> -c init -c halt -c \
      'arm semihosting enable' -c resume

Note that enabling semihosting can only be done after attaching to the board with init, and must be done while the CPU is halted. For a more extended example, refer to the LS1046ARDB docs.

Loading files

The semihosting code adds a “semihosting filesystem”:

load hostfs - <address> <image>

That will load an image from the host filesystem into RAM at the specified address. If you are using U-Boot SPL, you can also use BOOT_DEVICE_SMH which will load CONFIG_SPL_FS_LOAD_PAYLOAD_NAME.

Host console

U-Boot can use the host’s console instead of a physical serial device by enabling CONFIG_SERIAL_SEMIHOSTING. If you don’t have CONFIG_DM_SERIAL enabled, make sure you disable any other serial drivers.

Migrating from smhload

If you were using the smhload command, you can migrate commands like:

smhload <file> <address> [<end var>]

to a generic load command like:

load hostfs - <address> <file>

The load command will set the filesize variable with the size of the file. The fdt chosen command has been updated to take a size instead of an end address. If you were adding the initramfs to your device tree like:

fdt chosen <address> <end var>

you can now run:

fdt chosen <address> $filesize