| /* |
| * 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; |
| } |