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.
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.
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
<../board/emulation/qemu-arm>
.
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 <ls1046ardb_jtag>
.
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
.
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.
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