Running user-space programs on FVP

This page explains how to load and run user space programs on a Linux image running in FVP simulation. The loaded programs may use any trusted services that are available as part of the image firmware.

To prepare and run an image that includes trusted services running in S-EL0 secure partitions under OP-TEE see: Deploying trusted services in S-EL0 Secure Partitions under OP-TEE

The example assumes that the FVP model has been installed in the following directory relative to the OP-TEE build directory:

../Base_RevC_AEMvA_pkg/models/Linux64_GCC-9.3

Shared directory

The AEM FVP supports directory sharing between the target and the host OS. This provides a convenient way to transfer files between the host and the device simulation. When the FVP is run using the run-only target from the op-tee/build repository, the shared directory is set-up automatically. The whole “workspace” is shared to the FVP and mounted under /mnt/host.

Running service level tests

Most test and demo applications are integrated into the OP-TEE build flow, and can be build using the makefiles in the op-tee/build repository.

To build all such binaries build the ffa-test-all target. For available targets please refer to fvp-psa-sp.mk_. As an example to build the ts-service-test application execute the following commands from the root of the workspace:

make -C build ffa-ts-service-test

The executable includes service level test cases that exercise trusted services via their standard interfaces. Test cases use libts for locating services and establishing RPC sessions. ts-service-test provides a useful reference for understanding how libts may be used for accessing trusted services.

Build output will be copied to out/ts-install.

To build the applications without using the op-tee/build files refer to the instructions here: Build Instructions

Run ts-service-test

To start the FVP, from the root directory of the workspace, enter:

FVP_PATH=../Base_RevC_AEMvA_pkg/models/Linux64_GCC-9.3 make -C build run-only

Once it boots to the login prompt, log in as root and from the FVP terminal, enter:

# Enter the mount target for the shared directory
cd /mnt/host

# Install the shared library and executables
cp -vat /usr out/ts-install/arm-linux/lib out/ts-install/arm-linux/bin

# Load the kernel modules
out/linux-arm-ffa-tee/load_module.sh
out/linux-arm-ffa-user/load_module.sh

# Run the test application
ts-service-test -v

Use the same flow for other user-space programs. Check the output of the cp command executed to see executables copied under /usr/bin.

If all is well, you should see something like:

TEST(PsServiceTests, createAndSetExtended) - 0 ms
TEST(PsServiceTests, createAndSet) - 0 ms
TEST(PsServiceTests, storeNewItem) - 0 ms
TEST(ItsServiceTests, storeNewItem) - 0 ms
TEST(AttestationProvisioningTests, provisionedIak) - 1 ms
TEST(AttestationProvisioningTests, selfGeneratedIak) - 1 ms
TEST(AttestationServiceTests, repeatedOperation) - 75 ms
TEST(AttestationServiceTests, invalidChallengeLen) - 0 ms
TEST(AttestationServiceTests, checkTokenSize) - 2 ms
TEST(CryptoKeyDerivationServicePackedcTests, deriveAbort) - 0 ms
TEST(CryptoKeyDerivationServicePackedcTests, hkdfDeriveBytes) - 0 ms
TEST(CryptoKeyDerivationServicePackedcTests, hkdfDeriveKey) - 0 ms
TEST(CryptoMacServicePackedcTests, macAbort) - 0 ms
TEST(CryptoMacServicePackedcTests, signAndVerify) - 1 ms
TEST(CryptoCipherServicePackedcTests, cipherAbort) - 0 ms
TEST(CryptoCipherServicePackedcTests, encryptDecryptRoundtrip) - 0 ms
TEST(CryptoHashServicePackedcTests, hashAbort) - 0 ms
TEST(CryptoHashServicePackedcTests, hashAndVerify) - 0 ms
TEST(CryptoHashServicePackedcTests, calculateHash) - 0 ms
TEST(CryptoServicePackedcTests, generateRandomNumbers) - 0 ms
TEST(CryptoServicePackedcTests, asymEncryptDecryptWithSalt) - 14 ms
TEST(CryptoServicePackedcTests, asymEncryptDecrypt) - 1 ms
TEST(CryptoServicePackedcTests, signAndVerifyEat) - 4 ms
TEST(CryptoServicePackedcTests, signAndVerifyMessage) - 4 ms
TEST(CryptoServicePackedcTests, signAndVerifyHash) - 4 ms
TEST(CryptoServicePackedcTests, exportAndImportKeyPair) - 1 ms
TEST(CryptoServicePackedcTests, exportPublicKey) - 1 ms
TEST(CryptoServicePackedcTests, purgeKey) - 0 ms
TEST(CryptoServicePackedcTests, copyKey) - 1 ms
TEST(CryptoServicePackedcTests, generatePersistentKeys) - 1 ms
TEST(CryptoServicePackedcTests, generateVolatileKeys) - 0 ms
TEST(CryptoServiceProtobufTests, generateRandomNumbers) - 1 ms
TEST(CryptoServiceProtobufTests, asymEncryptDecryptWithSalt) - 15 ms
TEST(CryptoServiceProtobufTests, asymEncryptDecrypt) - 1 ms
TEST(CryptoServiceProtobufTests, signAndVerifyMessage) - 4 ms
TEST(CryptoServiceProtobufTests, signAndVerifyHash) - 4 ms
TEST(CryptoServiceProtobufTests, exportAndImportKeyPair) - 1 ms
TEST(CryptoServiceProtobufTests, exportPublicKey) - 0 ms
TEST(CryptoServiceProtobufTests, generatePersistentKeys) - 1 ms
TEST(CryptoServiceProtobufTests, generateVolatileKeys) - 1 ms
TEST(CryptoServiceLimitTests, volatileRsaKeyPairLimit) - 99 ms
TEST(CryptoServiceLimitTests, volatileEccKeyPairLimit) - 22 ms
TEST(DiscoveryServiceTests, checkServiceInfo) - 0 ms
TEST(SmmVariableAttackTests, getCheckPropertyWithMaxSizeName) - 0 ms
TEST(SmmVariableAttackTests, getCheckPropertyWithOversizeName) - 0 ms
TEST(SmmVariableAttackTests, setCheckPropertyWithMaxSizeName) - 0 ms
TEST(SmmVariableAttackTests, setCheckPropertyWithOversizeName) - 0 ms
TEST(SmmVariableAttackTests, enumerateWithSizeMaxNameSize) - 0 ms
TEST(SmmVariableAttackTests, enumerateWithOversizeName) - 0 ms
TEST(SmmVariableAttackTests, setAndGetWithSizeMaxNameSize) - 0 ms
TEST(SmmVariableAttackTests, setAndGetWithOversizeName) - 0 ms
TEST(SmmVariableAttackTests, setWithSizeMaxNameSize) - 0 ms
TEST(SmmVariableAttackTests, setWithOversizeName) - 0 ms
TEST(SmmVariableAttackTests, setWithSizeMaxDataSize) - 0 ms
TEST(SmmVariableAttackTests, setWithOversizeData) - 0 ms
TEST(SmmVariableServiceTests, checkMaxVariablePayload) - 0 ms
TEST(SmmVariableServiceTests, setSizeConstraint) - 0 ms
TEST(SmmVariableServiceTests, enumerateStoreContents) - 0 ms
TEST(SmmVariableServiceTests, getVarSizeNv) - 0 ms
TEST(SmmVariableServiceTests, getVarSize) - 0 ms
TEST(SmmVariableServiceTests, setAndGetNv) - 1 ms
TEST(SmmVariableServiceTests, setAndGet) - 0 ms
TEST(TestRunnerServiceTests, runSpecificTest) - 0 ms
TEST(TestRunnerServiceTests, runConfigTests) - 0 ms
TEST(TestRunnerServiceTests, listPlatformTests) - 0 ms
TEST(TestRunnerServiceTests, runAllTests) - 0 ms
TEST(TestRunnerServiceTests, listAllTests) - 0 ms

OK (67 tests, 67 ran, 977 checks, 0 ignored, 0 filtered out, 261 ms)

Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.

SPDX-License-Identifier: BSD-3-Clause