# Build and Run ART tests on ARM FVP This document describes how to build and run an Android system image targeting the ARM Fixed Virtual Platform and to use it as a target platform for running ART tests via ADB. This instruction was checked to be working for the AOSP master tree on 2021-01-13; the up-to-date instruction on how to build the kernel and firmware could be found here: device/generic/goldfish/fvpbase/README.md. ## Configuring and Building AOSP First, an AOSP image should be configured and built, including the kernel and firmware. ### Generating build system configs ``` cd $AOSP . build/envsetup.sh # fvp_mini target is used as we don't need a GUI for ART tests. lunch fvp_mini-eng # This is expected to fail; it generates all the build rules files. m ``` ### Building the kernel ``` cd $SOME_DIRECTORY_OUTSIDE_AOSP mkdir android-kernel-mainline cd android-kernel-mainline repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline repo sync BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh BUILD_CONFIG=common-modules/virtual-device/build.config.fvp build/build.sh ``` The resulting kernel image and DTB (Device Tree Binary) must then be copied into the product output directory: ``` cp out/android-mainline/dist/Image $ANDROID_PRODUCT_OUT/kernel cp out/android-mainline/dist/fvp-base-revc.dtb out/android-mainline/dist/initramfs.img $ANDROID_PRODUCT_OUT/ ``` ### Building the firmware (ARM Trusted Firmware and U-Boot) First, install ``dtc``, the device tree compiler. On Debian, this is in the ``device-tree-compiler`` package. ``` sudo apt-get install device-tree-compiler ``` Then run: ``` mkdir platform cd platform repo init -u https://git.linaro.org/landing-teams/working/arm/manifest.git -m pinned-uboot.xml -b 20.01 repo sync # The included copy of U-Boot is incompatible with this version of AOSP, switch to a recent upstream checkout. cd u-boot git fetch https://gitlab.denx.de/u-boot/u-boot.git/ master git checkout 18b9c98024ec89e00a57707f07ff6ada06089d26 cd .. mkdir -p tools/gcc cd tools/gcc wget https://releases.linaro.org/components/toolchain/binaries/6.2-2016.11/aarch64-linux-gnu/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu.tar.xz tar -xJf gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu.tar.xz cd ../.. build-scripts/build-test-uboot.sh -p fvp all ``` These components must then be copied into the product output directory: ``` cp output/fvp/fvp-uboot/uboot/{bl1,fip}.bin $ANDROID_PRODUCT_OUT/ ``` ## Setting up the FVP model ### Obtaining the model The public Arm FVP could be obtained from https://developer.arm.com/; one would need to create an account there and accept EULA to download and install it. A link for the latest version: https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms/arm-ecosystem-models: "Armv8-A Base RevC AEM FVP" The AEMv8-A Base Platform FVP is a free of charge Fixed Virtual Platform of the latest Arm v8-A architecture features and has been validated with compatible Open Source software, which can be found on the reference open source software stacks page along with instructions for running the software ### Running the model From a lunched environment: ``` export MODEL_PATH=/path/to/model/dir export MODEL_BIN=${MODEL_PATH}/models/Linux64_GCC-6.4/FVP_Base_RevC-2xAEMv8A ./device/generic/goldfish/fvpbase/run_model ``` If any extra parameters are needed for the model (e.g. specifying plugins) they should be specified as cmdline options for 'run_model'. E.g. to run a model which support SVE: ``` export SVE_PLUGIN=${MODEL_PATH}/plugins/Linux64_GCC-6.4/ScalableVectorExtension.so $ ./device/generic/goldfish/fvpbase/run_model --plugin ${SVE_PLUGIN} -C SVE.ScalableVectorExtension.veclen=2 ``` Note: SVE vector length is passed in units of 64-bit blocks. So "2" would stand for 128-bit vector length. The model will start and will have fully booted to shell in around 20 minutes (you will see "sys.boot_completed=1" in the log). It can be accessed as a regular device with adb: ``` adb connect localhost:5555 ``` To terminate the model, press ``Ctrl-] Ctrl-D`` to terminate the telnet connection. ## Running ART test on FVP The model behaves as a regular adb device so running ART tests could be done using the standard chroot method described in test/README.chroot.md; the steps are also described below. A separate AOSP tree (not the one used for the model itself), should be used - full or minimal. Then the regular ART testing routine could be performed; the regular "lunch" target ("armv8" and other targets, not "fvp-eng"). ``` export ART_TEST_CHROOT=/data/local/art-test-chroot export OVERRIDE_TARGET_FLATTEN_APEX=true export SOONG_ALLOW_MISSING_DEPENDENCIES=true export TARGET_BUILD_UNBUNDLED=true export ART_TEST_RUN_ON_ARM_FVP=true . ./build/envsetup.sh lunch armv8-userdebug art/tools/buildbot-build.sh --target art/tools/buildbot-teardown-device.sh art/tools/buildbot-cleanup-device.sh art/tools/buildbot-setup-device.sh art/tools/buildbot-sync.sh art/test/testrunner/testrunner.py --target --64 --optimizing -j1 ```