mcu_hi3321_watch/middleware/utils/codeloader/private/codeloader_locking.c
2025-05-26 20:15:20 +08:00

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;
}
}