blob: 00b38f3d96e5f27b57c59096d178027a0d1dda74 [file] [log] [blame]
/*
* Copyright (c) 2021, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#include "tfm_ns_client_ext.h"
#include "tfm_nsid_manager.h"
/* Max number of threads could be customised by RTOS */
#ifndef THREAD_NUM_MAX
#define THREAD_NUM_MAX 10
#endif
/* Map table of token and NSIDs */
struct nsid_token_pair {
uint32_t token;
int32_t nsid;
};
static struct nsid_token_pair test_ns_token_table[THREAD_NUM_MAX];
uint8_t nsid_mgr_init(void)
{
uint32_t i;
for (i = 0; i < THREAD_NUM_MAX; i++) {
test_ns_token_table[i].token = TFM_NS_CLIENT_INVALID_TOKEN;
test_ns_token_table[i].nsid = TFM_INVALID_NSID_MIN;
}
return NSID_MGR_ERR_SUCCESS;
}
uint8_t nsid_mgr_add_entry(int32_t nsid, uint32_t token)
{
uint32_t i;
if (nsid >= TFM_INVALID_NSID_MIN) {
return NSID_MGR_ERR_INVALID_NSID;
}
if (token == TFM_NS_CLIENT_INVALID_TOKEN) {
return NSID_MGR_ERR_INVALID_TOKEN;
}
for (i = 0; i < THREAD_NUM_MAX; i++) {
if (test_ns_token_table[i].token == TFM_NS_CLIENT_INVALID_TOKEN) {
test_ns_token_table[i].token = token;
test_ns_token_table[i].nsid = nsid;
return NSID_MGR_ERR_SUCCESS;
}
}
/* No free entry for new token, return error */
return NSID_MGR_ERR_NO_FREE_ENTRY;
}
uint8_t nsid_mgr_remove_entry(uint32_t token)
{
uint32_t i;
if (token == TFM_NS_CLIENT_INVALID_TOKEN) {
return NSID_MGR_ERR_INVALID_TOKEN;
}
for (i = 0; i < THREAD_NUM_MAX; i++) {
if (test_ns_token_table[i].token == token) {
test_ns_token_table[i].token = TFM_NS_CLIENT_INVALID_TOKEN;
test_ns_token_table[i].nsid = TFM_INVALID_NSID_MIN;
return NSID_MGR_ERR_SUCCESS;
}
}
/* Token not found in the table, return error */
return NSID_MGR_ERR_INVALID_TOKEN;
}
int32_t nsid_mgr_query_nsid(uint32_t token)
{
uint32_t i;
/* Return invalid NSID if token is invalid */
if (token == TFM_NS_CLIENT_INVALID_TOKEN) {
return TFM_INVALID_NSID_MIN;
}
for (i = 0; i < THREAD_NUM_MAX; i++) {
if (test_ns_token_table[i].token == token) {
return test_ns_token_table[i].nsid;
}
}
/* Token not found in the table, return invalid NSID */
return TFM_INVALID_NSID_MIN;
}