blob: ef6cfe0f9241db673275ae880d14800237e7591e [file] [log] [blame]
Ashutosh Singhf4d88672017-11-29 13:35:43 +00001/*
Antonio de Angelisd9cd66e2018-03-27 11:19:59 +01002 * Copyright (c) 2017-2018, Arm Limited. All rights reserved.
Ashutosh Singhf4d88672017-11-29 13:35:43 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7#include <stdint.h>
8#include <stdbool.h>
9
10#include "cmsis.h"
11#include "cmsis_os2.h"
12
13#include "tfm_api.h"
Mate Toth-Pal1379e152018-07-30 17:38:29 +020014#include "tfm_ns_lock.h"
Ashutosh Singhf4d88672017-11-29 13:35:43 +000015
16/**
17 * \brief struct ns_lock_state type
18 */
19struct ns_lock_state
20{
21 bool init;
22 osMutexId_t id;
23};
24
25/**
26 * \brief ns_lock status
27 */
28static struct ns_lock_state ns_lock = {.init=false, .id=NULL};
29
30/**
31 * \brief Mutex properties, NS lock
32 */
33static const osMutexAttr_t ns_lock_attrib = {
34 .name = "ns_lock",
35 .attr_bits = osMutexPrioInherit
36};
37
38/**
Ashutosh Singhf4d88672017-11-29 13:35:43 +000039 * \brief NS world, NS lock based dispatcher
40 */
Mate Toth-Pal1379e152018-07-30 17:38:29 +020041uint32_t tfm_ns_lock_dispatch(veneer_fn fn,
42 uint32_t arg0, uint32_t arg1,
43 uint32_t arg2, uint32_t arg3)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000044{
45 uint32_t result;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000046
47 /* Check the NS lock has been initialized */
48 if (ns_lock.init == false) {
49 return TFM_ERROR_GENERIC;
50 }
51
Mate Toth-Pal1379e152018-07-30 17:38:29 +020052 /* TFM request protected by NS lock */
53 osMutexAcquire(ns_lock.id,osWaitForever);
Ashutosh Singhf4d88672017-11-29 13:35:43 +000054
Mate Toth-Pal1379e152018-07-30 17:38:29 +020055 result = fn(arg0, arg1, arg2, arg3);
Ashutosh Singhf4d88672017-11-29 13:35:43 +000056
Mate Toth-Pal1379e152018-07-30 17:38:29 +020057 osMutexRelease(ns_lock.id);
58
59 return result;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000060}
61
62/**
63 * \brief NS world, Init NS lock
64 */
65uint32_t tfm_ns_lock_init()
66{
67 if (ns_lock.init == false) {
68 ns_lock.id = osMutexNew(&ns_lock_attrib);
69 ns_lock.init = true;
70 return TFM_SUCCESS;
71 }
72 else {
73 return TFM_ERROR_GENERIC;
74 }
75}
Mate Toth-Pal1379e152018-07-30 17:38:29 +020076
77bool tfm_ns_lock_get_init_state()
78{
79 return ns_lock.init;
80}
81