/*
 * Copyright (c) 2017-2021, Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 */

/*
 * An example to implement tfm_ns_interface_dispatch() in NS RTOS to integrate
 * TF-M interface on Armv8-M TrustZone based platforms.
 *
 * In this example, NS OS calls mutex in tfm_ns_interface_dispatch() to
 * synchronize multiple NS client calls.
 * NS OS pseudo code in this example is not based on any specific RTOS.
 *
 * Please note that this example cannot be built directly.
 */

#include <stdint.h>

/* Include NS RTOS specific mutex declarations */
#include "mutex.h"
#include "tfm_ns_interface.h"

/* Static ns lock handle */
static void *ns_lock_handle = NULL;

/* Initialize the ns lock */
int32_t ns_interface_lock_init(...)
{
    /* NS RTOS specific mutex creation/initialization */
    ns_lock_handle = os_mutex_create(...);
    if (ns_lock_handle) {
        return OS_SUCCESS;
    }

    return OS_ERROR;
}

int32_t tfm_ns_interface_dispatch(veneer_fn fn,
                                  uint32_t arg0, uint32_t arg1,
                                  uint32_t arg2, uint32_t arg3)
{
    int32_t result;

    /* TF-M request protected by NS lock. */
    while (os_mutex_acquire(ns_lock_handle, ...) != OS_SUCCESS);

    result = fn(arg0, arg1, arg2, arg3);

    /*
     * Whether to check/handle lock release return code depends on NS RTOS
     * specific implementation and usage scenario.
     */
    os_mutex_release(ns_lock_handle, ...);

    return result;
}
