blob: 14fd76a0d6b2dc63f2c27d7ddc3afa55cef977d2 [file] [log] [blame]
Ashutosh Singhf4d88672017-11-29 13:35:43 +00001/*
Kevin Peng67a87542019-01-28 09:53:58 +08002 * Copyright (c) 2017-2019, 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
Ashutosh Singhf4d88672017-11-29 13:35:43 +000010#include "cmsis_os2.h"
11
12#include "tfm_api.h"
Mate Toth-Pal1379e152018-07-30 17:38:29 +020013#include "tfm_ns_lock.h"
Ashutosh Singhf4d88672017-11-29 13:35:43 +000014
15/**
16 * \brief struct ns_lock_state type
17 */
18struct ns_lock_state
19{
20 bool init;
21 osMutexId_t id;
22};
23
24/**
25 * \brief ns_lock status
26 */
27static struct ns_lock_state ns_lock = {.init=false, .id=NULL};
28
29/**
30 * \brief Mutex properties, NS lock
31 */
32static const osMutexAttr_t ns_lock_attrib = {
33 .name = "ns_lock",
Hugues de Valon32547602019-02-19 14:46:56 +000034 .attr_bits = osMutexPrioInherit,
35 .cb_mem = NULL,
36 .cb_size = 0U
Ashutosh Singhf4d88672017-11-29 13:35:43 +000037};
38
39/**
Ashutosh Singhf4d88672017-11-29 13:35:43 +000040 * \brief NS world, NS lock based dispatcher
41 */
Mate Toth-Pal1379e152018-07-30 17:38:29 +020042uint32_t tfm_ns_lock_dispatch(veneer_fn fn,
43 uint32_t arg0, uint32_t arg1,
44 uint32_t arg2, uint32_t arg3)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000045{
46 uint32_t result;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000047
48 /* Check the NS lock has been initialized */
49 if (ns_lock.init == false) {
50 return TFM_ERROR_GENERIC;
51 }
52
Mate Toth-Pal1379e152018-07-30 17:38:29 +020053 /* TFM request protected by NS lock */
Hugues de Valon32547602019-02-19 14:46:56 +000054 if (osMutexAcquire(ns_lock.id,osWaitForever) != osOK) {
55 return TFM_ERROR_GENERIC;
56 }
Ashutosh Singhf4d88672017-11-29 13:35:43 +000057
Mate Toth-Pal1379e152018-07-30 17:38:29 +020058 result = fn(arg0, arg1, arg2, arg3);
Ashutosh Singhf4d88672017-11-29 13:35:43 +000059
Hugues de Valon32547602019-02-19 14:46:56 +000060 if (osMutexRelease(ns_lock.id) != osOK) {
61 return TFM_ERROR_GENERIC;
62 }
Mate Toth-Pal1379e152018-07-30 17:38:29 +020063
64 return result;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000065}
66
67/**
68 * \brief NS world, Init NS lock
69 */
Hugues de Valon32547602019-02-19 14:46:56 +000070enum tfm_status_e tfm_ns_lock_init()
Ashutosh Singhf4d88672017-11-29 13:35:43 +000071{
72 if (ns_lock.init == false) {
73 ns_lock.id = osMutexNew(&ns_lock_attrib);
74 ns_lock.init = true;
75 return TFM_SUCCESS;
76 }
77 else {
78 return TFM_ERROR_GENERIC;
79 }
80}
Mate Toth-Pal1379e152018-07-30 17:38:29 +020081
82bool tfm_ns_lock_get_init_state()
83{
84 return ns_lock.init;
85}
86