From 79929ff29ffe5d39b19f415fe584ee3eb3e2df97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85strand?= Date: Tue, 26 Jan 2021 14:42:43 +0100 Subject: Add trustzone application example Add example project that builds both secure and nonsecure world sides and the inference is done on the secure side. This commit includes the mpc driver as found in the upstream trustedfirmware git repository https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git (8c0a234e453b51e6606d11599d0cb15097c3da48) The model,input and output used are described in the README.md in this directory. Change-Id: Ie54904a38d54df4de2d6936f066c388ea58e396b --- .../nonsecure/main_nonsecure.cpp | 90 ++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 applications/trustzone_inference/nonsecure/main_nonsecure.cpp (limited to 'applications/trustzone_inference/nonsecure/main_nonsecure.cpp') diff --git a/applications/trustzone_inference/nonsecure/main_nonsecure.cpp b/applications/trustzone_inference/nonsecure/main_nonsecure.cpp new file mode 100644 index 0000000..72e91e0 --- /dev/null +++ b/applications/trustzone_inference/nonsecure/main_nonsecure.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2019-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* to be able to print from nonsecure world since uart is mapped + * to secure world. */ +#include "../common/secure_entries.hpp" + +/* Disable semihosting */ +__asm(".global __use_no_semihosting\n"); + +/* Target specific CMSIS Device header is included by compiler, + * see cmsis.cmake in core_software */ + +using namespace std; + +extern "C" void SystemInit() { + /* secure world is doing the neccessary setup, since it has + * the privilege to do so, and non-secure doesn't + */ + nonsecure_print("skipping system init from non-secure world"); +} + +/* + * Retargeting stubs for the non-secure world + */ +extern "C" { + +void _sys_exit(int code) { + (void) code; + nonsecure_print("Returning to secure world!"); + /* + * Make sure we return to secure world when exit by + * setting LR to FNC_RETURN and branching to tell CPU + * we want to leave the non-secure world + */ + asm("LDR r14, =0xFEFFFFFE\n"); + asm("BX lr\n"); +} + +void _ttywrch(int ch) { + (void)ch; +} + +char *_sys_command_string(char *cmd, int len) { + (void)len; + + return cmd; +} + +} // extern "C" + +int result = -1; + +int return_nonsecure_result(void) { + return result; +} + +int main() { + nonsecure_print("Non-secure main starting up."); + + set_result_function(return_nonsecure_result); + + /* Execute inference in secure world with data not accessible from + * non-secure world + */ + nonsecure_print("Starting secure inference."); + int inference_failed = run_secure_inference(); + + nonsecure_print("Inference returned: "); + nonsecure_print(inference_failed ? "failed" : "success"); + + result = inference_failed ? -1 : 0; + + return 0; +} -- cgit v1.2.1