aboutsummaryrefslogtreecommitdiff
path: root/applications/trustzone_inference/nonsecure/main_nonsecure.cpp
blob: 72e91e0f22e340688f175bd015dfc70409553d69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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;
}