blob: 7d9cf967151b5f9c2356ba17a6f71a507c1ea3ed [file] [log] [blame]
/*
* 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;
}