100 lines
2.4 KiB
C
100 lines
2.4 KiB
C
/*
|
|
* Copyright (c) CompanyNameMagicTag 2018-2020. All rights reserved.
|
|
* Description: BT Codeloader Module
|
|
* Author:
|
|
* Create: 2018-10-15
|
|
*/
|
|
|
|
#include "codeloader.h"
|
|
#include "codeloader_locking.h"
|
|
|
|
static uint32_t g_codeloader_lock;
|
|
|
|
/**
|
|
* Codeloader internal state vector type
|
|
*/
|
|
typedef struct {
|
|
bool security_core_allowed : 1;
|
|
bool protocol_core_allowed : 1;
|
|
bool apps_core_allowed : 1;
|
|
} codeloader_permissions_vec_t; //lint !e959
|
|
|
|
static volatile codeloader_permissions_vec_t g_codeloader_perm_state;
|
|
|
|
/*
|
|
* read codeloade lock value from security KV store
|
|
* if no ky is present, nothing is locked
|
|
*/
|
|
void codeloader_lock_init(const codeloader_options_t *options)
|
|
{
|
|
g_codeloader_lock = CODELOADER_LOCK_NO_LOCKS;
|
|
g_codeloader_perm_state.security_core_allowed = options->security_core_allowed;
|
|
g_codeloader_perm_state.protocol_core_allowed = options->protocol_core_allowed;
|
|
g_codeloader_perm_state.apps_core_allowed = options->apps_core_allowed;
|
|
}
|
|
|
|
/*
|
|
* check if requested lock is set
|
|
*/
|
|
bool codeloader_unlocked_check(uint32_t mask)
|
|
{
|
|
if (g_codeloader_lock & mask) {
|
|
return false; // if bit is set, lock is set
|
|
} else {
|
|
return true; // if bit is clear, no lock is set
|
|
}
|
|
}
|
|
|
|
/*
|
|
* return codeloader production lock value
|
|
*/
|
|
uint32_t codeloader_lock_read(void)
|
|
{
|
|
return (g_codeloader_lock);
|
|
}
|
|
|
|
bool codeloader_check_permissions(cores_t core)
|
|
{
|
|
bool allowed = false;
|
|
switch (core) {
|
|
case CORES_BT_CORE:
|
|
allowed = g_codeloader_perm_state.security_core_allowed;
|
|
break;
|
|
case CORES_EXTERN0_CORE:
|
|
case CORES_EXTERN1_CORE:
|
|
case CORES_PROTOCOL_CORE:
|
|
allowed = g_codeloader_perm_state.protocol_core_allowed;
|
|
break;
|
|
|
|
case CORES_APPS_CORE:
|
|
allowed = g_codeloader_perm_state.apps_core_allowed;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return allowed;
|
|
}
|
|
|
|
void codeloader_update_permissions(cores_t core, bool allowed)
|
|
{
|
|
switch (core) {
|
|
case CORES_BT_CORE:
|
|
g_codeloader_perm_state.security_core_allowed = allowed;
|
|
break;
|
|
case CORES_EXTERN0_CORE:
|
|
case CORES_EXTERN1_CORE:
|
|
case CORES_PROTOCOL_CORE:
|
|
g_codeloader_perm_state.protocol_core_allowed = allowed;
|
|
break;
|
|
|
|
case CORES_APPS_CORE:
|
|
g_codeloader_perm_state.apps_core_allowed = allowed;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|