Hi,
Few background questions to understand the request better:
-Is the intent to enable the SEL2 arch extension, or use the legacy model without secure virtualization?
-Do you intend to use Cactus as an initial test environment with a final goal is to replace it by a real TOS?
-If the ask is about how to write a TA, did you consider existing solutions like OP-TEE and relevant documentation?
In general TA refers to a SW component running at SEL0 on top of a TOS at SEL1.
What you call "Cactus OS" is really just a sample test payload running at SEL1.
It's not a TOS in terms of loading Trusted Applications, providing services (system calls), managing memory and IPC.
The starting point should be the FF-A specification (https://developer.arm.com/documentation/den0077/latest/).
You can repurpose Cactus to host a service at SEL1, which can be called by the NWd (TFTF test framework).
There is normally no need to modify EL3.
The below sample illustrate the message passing between TFTF at NS EL2, and Cactus at SEL1:
TFTF: https://git.trustedfirmware.org/TF-A/tf-a-tests.git/tree/tftf/tests/runtime_services/secure_service/test_ffa_direct_messaging.c#n66
cactus: https://git.trustedfirmware.org/TF-A/tf-a-tests.git/tree/spm/cactus/cactus_tests/cactus_test_direct_messaging.c#n12
Please also have a look at the component documentation:
https://trustedfirmware-a.readthedocs.io/en/latest/components/secure-partition-manager.html
Depending on what you want to achieve, there are also solutions around SEL0 partitions (not involving a TOS), or the Trusted Services project.
Regards,
Olivier.
________________________________________
From: TF-A <tf-a-bounces@lists.trustedfirmware.org> on behalf of Chenxu Wang via TF-A <tf-a@lists.trustedfirmware.org>
Sent: 27 September 2021 05:44
To: tf-a@lists.trustedfirmware.org
Subject: [TF-A] How to write a Trsuted Application?
Hi all,
I want to write a TA which will be called from the Normal World and be handled by a specific Trusted OS. Currently, I am using 3 Cactus OS (provided by TF-A-Tests) in SEL1, and a Hafnium in SEL2. Here is my partial building cmd
make CROSS_COMPILE=aarch64-none-elf- SPD=spmd CTX_INCLUDE_EL2_REGS=1 ARM_ARCH_MINOR=4 PLAT=fvp DEBUG=1 BL33=../tf-a-tests/build/fvp/debug/tftf.bin BL32=../hafnium/out/reference/secure_aem_v8a_fvp_clang/hafnium.bin SP_LAYOUT_FILE=../tf-a-tests/build/fvp/debug/sp_layout.json all fip
I have created some EL3 services at services/std_svc, but have not created a TA.
In my view, to call the TA, I think I should pass (1) the ID of the TA (but I am not sure how to get the ID) (2) several parameters, which may be loaded into registers. Here may be a calling process.
ldr x0,=0xdeadbeef // loading ID
ldr x1,=0x11111 // input parameters
ldr x2,=0x22222 // input parameters
smc #0
Then I think I should write a corresponding handler (of the TA) in Cactus OS. When we call "smc #0", EL3 will trap it, and route it to a specific TA.
However, I don't know how to do it. Can you provide some useful examples?
Sincerely,
Wang Chenxu