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