The runfvp
tool in meta-arm makes it easy to run Yocto Project disk images inside a Fixed Virtual Platform (FVP). Some FVPs, such as the Arm Architecture Models, are available free to download, but others need registration or are only available commercially. The fvp-base
machine in meta-arm-bsp uses one of these AEM models.
runfvp
To build images with the FVP integration, the fvpboot
class needs to be inherited. If the machine does not do this explicitly it can be done in local.conf
:
INHERIT += "fvpboot"
The class will download the correct FVP and write a .fvpconf
configuration file when an image is built.
To run an image in a FVP, pass either a machine name or a .fvpconf
path to runfvp
.
$ ./meta-arm/scripts/runfvp tmp/deploy/images/fvp-base/core-image-minimal-fvp-base.fvpconf
When a machine name is passed, runfvp
will start the latest image that has been built for that machine. This requires that the BitBake environment has been initialized (using oe-init-build-env
or similar) as it will start BitBake to determine where the images are.
$ ./meta-arm/scripts/runfvp fvp-base
Note that currently meta-arm's scripts
directory isn't in PATH
, so a full path needs to be used.
runfvp
will automatically start terminals connected to each of the serial ports that the machine specifies. This can be controlled by using the --terminals
option, for example --terminals=none
will mean no terminals are started, and --terminals=tmux
will start the terminals in tmux
sessions. Alternatively, passing --console
will connect the serial port directly to the current session, without needing to open further windows.
The default terminal can also be configured by writing a INI-style configuration file to ~/.config/runfvp.conf
:
[RunFVP] Terminal=tmux
Arbitrary options can be passed directly to the FVP by specifying them after a double dash, for example this will list all of the FVP parameters:
$ runfvp fvp-base -- --list-params
fvpboot
To configure a machine so that it can be ran inside runfvp
, a number of variables need to be set in the machine configuration file (such as meta-arm-bsp/conf/machine/fvp-base.conf
).
Note that at present these variables are not stable and their behaviour may be changed in the future.
FVP_EXE
The name of the FVP binary itself, for example fvp-base
uses FVP_Base_RevC-2xAEMvA
.
FVP_PROVIDER
The name of the recipe that provides the FVP executable set in FVP_EXE
, for example fvp-base
uses fvp-base-a-aem-native
. This must be a -native
recipe as the binary will be executed on the build host.
There are recipes for common FVPs in meta-arm already, and writing new recipes is trivial. For FVPs which are free to download fvp-base-a-aem.bb
is a good example. Some FVPs must be downloaded separately as they need an account on Arm's website, fvp-base-r-aem.bb
is a good example of those.
If FVP_PROVIDER
is not set then it is assumed that FVP_EXE
is installed on the host already.
FVP_CONFIG
Parameters passed to the FVP with the --parameter
/-C
option. These are expressed as variable flags so individual parameters can be altered easily. For example:
FVP_CONFIG[bp.flashloader0.fname] = "${DEPLOY_DIR_IMAGE}/fip-fvp.bin"
FVP_DATA
Specify raw data to load at the specified address, passed to the FVP with the --data
option. This is a space-separated list of parameters in the format [INST=]FILE@[MEMSPACE:]ADDRESS
. For example:
FVP_DATA = "cluster0.cpu0=${DEPLOY_DIR_IMAGE}/Image@0x80080000 \ cluster0.cpu0=${DEPLOY_DIR_IMAGE}/fvp-base-revc.dtb@0x83000000"
FVP_APPLICATIONS
Applications to load on the cores, passed to the FVP with the --application
option. These are expressed as variable flags with the flag name being the instance and flag value the filename, for example:
FVP_APPLICATIONS[cluster0] = "${DEPLOY_DIR_IMAGE}/linux-system.axf"
Note that symbols are not allowed in flag names, so if you need to use a wildcard in the instance then you'll need to use FVP_EXTRA_ARGS
and --application
directly.
FVP_TERMINALS
Map hardware serial ports to abstract names. For example the FVP_Base_RevC-2xAEMvA
FVP exposes four serial ports, terminal_0
to terminal_3
. Typically only terminal_0
is used in the fvp-base
machine so this can be named "Console"
and the others ""
. When runfvp starts terminals it will only start named serial ports, so instead of opening four windows where only one is useful, it will only open one.
For example:
FVP_TERMINALS[bp.terminal_0] = "Console" FVP_TERMINALS[bp.terminal_1] = "" FVP_TERMINALS[bp.terminal_2] = "" FVP_TERMINALS[bp.terminal_3] = ""
FVP_CONSOLE
This specifies what serial port is used when --console
is passed to runfvp. Note that this has to be the FVP identifier but without the board prefix, for example:
FVP_CONSOLE = "terminal_0"
FVP_EXTRA_ARGS
Arbitrary extra arguments that are passed directly to the FVP. For example:
FVP_EXTRA_ARGS = "--simlimit 60"