Skip to content

Commit b102534

Browse files
SylwesterKonczyktomchy
authored andcommitted
suit: manifest-controlled variables
Support for SUIT manifest-controlled variables Ref: NCSDK-30530 Signed-off-by: Sylwester Konczyk <[email protected]>
1 parent bacf1e7 commit b102534

File tree

28 files changed

+645
-42
lines changed

28 files changed

+645
-42
lines changed

subsys/suit/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ add_subdirectory_ifdef(CONFIG_SUIT_EXECUTION_MODE execution_mode)
2222
add_subdirectory_ifdef(CONFIG_SUIT_VALIDATOR validator)
2323
add_subdirectory_ifdef(CONFIG_SUIT_EVENTS events)
2424
add_subdirectory_ifdef(CONFIG_SUIT_RECOVERY_BUTTON recovery_button)
25+
add_subdirectory_ifdef(CONFIG_SUIT_MANIFEST_VARIABLES manifest_variables)

subsys/suit/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ config SUIT_ENABLE_DEFAULTS_SDFW
148148
imply SUIT_DIGEST
149149
imply SUIT_DIGEST_CACHE
150150
imply SUIT_IPUC
151+
imply SUIT_MANIFEST_VARIABLES
151152
imply SUIT_CHECK_IMAGE_MATCH
152153
imply SUIT_MCI
153154
imply SUIT_METADATA
@@ -199,6 +200,7 @@ rsource "memory_layout/Kconfig"
199200
rsource "validator/Kconfig"
200201
rsource "events/Kconfig"
201202
rsource "recovery_button/Kconfig"
203+
rsource "manifest_variables/Kconfig"
202204

203205
# Configure SUIT_LOG_LEVEL
204206
module = SUIT
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#
2+
# Copyright (c) 2024 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
#
6+
7+
# Module giving an access to manifest-accessible variables and configuration data
8+
zephyr_interface_library_named(suit_manifest_variables)
9+
target_include_directories(suit_manifest_variables INTERFACE include)
10+
11+
zephyr_library()
12+
zephyr_library_sources_ifdef(CONFIG_SUIT_MANIFEST_VARIABLES_IMPL_SDFW src/suit_manifest_variables.c)
13+
14+
zephyr_library_link_libraries(suit_manifest_variables)
15+
zephyr_library_link_libraries(suit_platform_err)
16+
zephyr_library_link_libraries(suit_storage_interface)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#
2+
# Copyright (c) 2024 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
#
6+
7+
config SUIT_MANIFEST_VARIABLES
8+
bool "Enable SUIT manifest-accessible variables support"
9+
10+
if SUIT_MANIFEST_VARIABLES
11+
12+
choice SUIT_MANIFEST_VARIABLES_IMPL
13+
prompt "Implementation selection"
14+
default SUIT_MANIFEST_VARIABLES_IMPL_SDFW if SUIT_PLATFORM_VARIANT_SDFW
15+
default SUIT_MANIFEST_VARIABLES_IMPL_IPC if SUIT_PLATFORM_VARIANT_APP
16+
17+
config SUIT_MANIFEST_VARIABLES_IMPL_SDFW
18+
bool "SDFW"
19+
20+
config SUIT_MANIFEST_VARIABLES_IMPL_IPC
21+
bool "IPC"
22+
23+
endchoice
24+
25+
# Manifest-controlled, NVM-stored variable.
26+
# Can be modified by Application, Radio Manifests
27+
# and by IPC clients running on Application and Radio Domains.
28+
29+
config SUIT_MANIFEST_VARIABLES_NVM_BASE_ID
30+
int
31+
default 0
32+
33+
config SUIT_MANIFEST_VARIABLES_NVM_COUNT
34+
int
35+
default 8
36+
37+
config SUIT_MANIFEST_VARIABLES_NVM_ACCESS_MASK
38+
hex
39+
default 0x0D
40+
41+
# Platform-controlled, RAM-stored variable.
42+
# Manifests and IPC clients are not allowed to modify it.
43+
44+
config SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID
45+
int
46+
default 128
47+
48+
config SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_COUNT
49+
int
50+
default 2
51+
52+
config SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_ACCESS_MASK
53+
hex
54+
default 0x00
55+
56+
# Manifest-controlled, RAM-stored variable.
57+
# Can be modified by Application and Radio Manifests.
58+
# IPC clients are not allowed to modify it.
59+
60+
config SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID
61+
int
62+
default 256
63+
64+
config SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_COUNT
65+
int
66+
default 4
67+
68+
config SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_ACCESS_MASK
69+
hex
70+
default 0x0C
71+
72+
endif
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright (c) 2024 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
/** @file
8+
* @brief SUIT Manifest-accessible variables.
9+
*
10+
* @details Variables are readable by any SUIT manifest, the SDFW and the IPC
11+
* clients, modifiability of variables depends on access mask.
12+
*/
13+
14+
#ifndef SUIT_MANIFEST_VARIABLES_H__
15+
#define SUIT_MANIFEST_VARIABLES_H__
16+
17+
#include <stdint.h>
18+
#include <suit_plat_err.h>
19+
20+
#ifdef __cplusplus
21+
extern "C" {
22+
#endif
23+
24+
/** Selected IPC clients are allowed to modify a variable, i.e:
25+
* MFST_VAR_ACCESS_IPC | MFST_VAR_ACCESS_APP means that variable can be modified
26+
* by App Domain SUIT manifests and IPC clients executed on App Domain cores
27+
*
28+
*/
29+
#define MFST_VAR_ACCESS_IPC 0x01
30+
31+
/* Nordic Top, Secure Domain, System Controller manifests are allowed
32+
* to modify a variable, modifiability by System Controller IPC client
33+
* depends on MFST_VAR_ACCESS_IPC
34+
*/
35+
#define MFST_VAR_ACCESS_SEC 0x02
36+
37+
/* Root, App Domain manifests are allowed to modify a variable, modifiability by
38+
* App Domain IPC client depends on MFST_VAR_ACCESS_IPC
39+
*/
40+
#define MFST_VAR_ACCESS_APP 0x04
41+
42+
/* Radio Domain manifests are allowed to modify a variable, modifiability by
43+
* Radio Domain IPC client depends on MFST_VAR_ACCESS_IPC
44+
*/
45+
#define MFST_VAR_ACCESS_RAD 0x08
46+
47+
/**
48+
* @brief Modify a variable value
49+
*
50+
* @param[in] id Variable Identifier
51+
* @param[in] val Value to assigned to variable
52+
*
53+
* @retval SUIT_PLAT_SUCCESS On success.
54+
* @retval SUIT_PLAT_ERR_NOT_FOUND Variable with given id is not supported.
55+
* @retval SUIT_PLAT_ERR_SIZE Applies to NVM-based variables. Given val
56+
* exceeds 8 bits.
57+
* @retval SUIT_PLAT_ERR_IO Storage backend was unable to modify NVM content.
58+
*/
59+
suit_plat_err_t suit_mfst_var_set(uint32_t id, uint32_t val);
60+
61+
/**
62+
* @brief Read out a variable value
63+
*
64+
* @param[in] id Variable Identifier
65+
* @param[out] val Value to assigned to variable
66+
*
67+
* @retval SUIT_PLAT_SUCCESS On success.
68+
* @retval SUIT_PLAT_ERR_NOT_FOUND Variable with given id is not supported.
69+
* @retval SUIT_PLAT_ERR_INVAL Invalid parameter, i.e. null pointer
70+
* @retval SUIT_PLAT_ERR_IO Storage backend was unable to read out NVM content.
71+
*/
72+
suit_plat_err_t suit_mfst_var_get(uint32_t id, uint32_t *val);
73+
74+
/**
75+
* @brief Read out an access mask
76+
*
77+
* @note Module does not enforce variable access privileges, but provides
78+
* information about access mask, so privileges can be enforced
79+
* on client of this module.
80+
*
81+
* @param[in] id Variable Identifier
82+
* @param[out] access_mask Access mask
83+
*
84+
* @retval SUIT_PLAT_SUCCESS On success.
85+
* @retval SUIT_PLAT_ERR_NOT_FOUND Variable with given id is not supported.
86+
* @retval SUIT_PLAT_ERR_INVAL Invalid parameter, i.e. null pointer
87+
*/
88+
suit_plat_err_t suit_mfst_var_get_access_mask(uint32_t id, uint32_t *access_mask);
89+
90+
#ifdef __cplusplus
91+
}
92+
#endif
93+
94+
#endif /* SUIT_MANIFEST_VARIABLES_H__ */
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/*
2+
* Copyright (c) 2024 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#include <suit_manifest_variables.h>
8+
#include <suit_storage.h>
9+
#include <zephyr/logging/log.h>
10+
11+
LOG_MODULE_REGISTER(suit_mfst_vars, CONFIG_SUIT_LOG_LEVEL);
12+
13+
static uint32_t plat_volatile_values[CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_COUNT];
14+
static uint32_t mfst_volatile_values[CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_COUNT];
15+
16+
suit_plat_err_t suit_mfst_var_get_access_mask(uint32_t id, uint32_t *access_mask)
17+
{
18+
if (access_mask == NULL) {
19+
return SUIT_PLAT_ERR_INVAL;
20+
}
21+
22+
if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID &&
23+
id < CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID +
24+
CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_COUNT) {
25+
26+
*access_mask = CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_ACCESS_MASK;
27+
return SUIT_PLAT_SUCCESS;
28+
29+
} else if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID &&
30+
id < CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID +
31+
CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_COUNT) {
32+
33+
*access_mask = CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_ACCESS_MASK;
34+
return SUIT_PLAT_SUCCESS;
35+
36+
} else if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_NVM_BASE_ID &&
37+
id < CONFIG_SUIT_MANIFEST_VARIABLES_NVM_BASE_ID +
38+
CONFIG_SUIT_MANIFEST_VARIABLES_NVM_COUNT) {
39+
40+
*access_mask = CONFIG_SUIT_MANIFEST_VARIABLES_NVM_ACCESS_MASK;
41+
return SUIT_PLAT_SUCCESS;
42+
}
43+
44+
LOG_ERR("Variable does not exist, id: %d", id);
45+
return SUIT_PLAT_ERR_NOT_FOUND;
46+
}
47+
48+
suit_plat_err_t suit_mfst_var_set(uint32_t id, uint32_t val)
49+
{
50+
if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID &&
51+
id < CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID +
52+
CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_COUNT) {
53+
54+
uint32_t idx = id - CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID;
55+
56+
plat_volatile_values[idx] = val;
57+
return SUIT_PLAT_SUCCESS;
58+
59+
} else if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID &&
60+
id < CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID +
61+
CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_COUNT) {
62+
63+
uint32_t idx = id - CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID;
64+
65+
mfst_volatile_values[idx] = val;
66+
return SUIT_PLAT_SUCCESS;
67+
68+
} else if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_NVM_BASE_ID &&
69+
id < CONFIG_SUIT_MANIFEST_VARIABLES_NVM_BASE_ID +
70+
CONFIG_SUIT_MANIFEST_VARIABLES_NVM_COUNT) {
71+
72+
if (val > 0xFF) {
73+
/* size of NVM based variable is limited to 8 bits
74+
*/
75+
return SUIT_PLAT_ERR_SIZE;
76+
}
77+
78+
uint32_t idx = id - CONFIG_SUIT_MANIFEST_VARIABLES_NVM_BASE_ID;
79+
80+
if (suit_storage_var_set(idx, val) == SUIT_PLAT_SUCCESS) {
81+
return SUIT_PLAT_SUCCESS;
82+
}
83+
84+
LOG_ERR("Cannot set persistent variable, idx: %d", idx);
85+
86+
return SUIT_PLAT_ERR_IO;
87+
}
88+
89+
LOG_ERR("Variable does not exist, id: %d", id);
90+
return SUIT_PLAT_ERR_NOT_FOUND;
91+
}
92+
93+
suit_plat_err_t suit_mfst_var_get(uint32_t id, uint32_t *val)
94+
{
95+
if (val == NULL) {
96+
return SUIT_PLAT_ERR_INVAL;
97+
}
98+
99+
if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID &&
100+
id < CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID +
101+
CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_COUNT) {
102+
103+
uint32_t idx = id - CONFIG_SUIT_MANIFEST_VARIABLES_PLAT_VOLATILE_BASE_ID;
104+
105+
*val = plat_volatile_values[idx];
106+
return SUIT_PLAT_SUCCESS;
107+
108+
} else if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID &&
109+
id < CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID +
110+
CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_COUNT) {
111+
112+
uint32_t idx = id - CONFIG_SUIT_MANIFEST_VARIABLES_MFST_VOLATILE_BASE_ID;
113+
114+
*val = mfst_volatile_values[idx];
115+
return SUIT_PLAT_SUCCESS;
116+
117+
} else if (id >= CONFIG_SUIT_MANIFEST_VARIABLES_NVM_BASE_ID &&
118+
id < CONFIG_SUIT_MANIFEST_VARIABLES_NVM_BASE_ID +
119+
CONFIG_SUIT_MANIFEST_VARIABLES_NVM_COUNT) {
120+
121+
uint32_t idx = id - CONFIG_SUIT_MANIFEST_VARIABLES_NVM_BASE_ID;
122+
uint8_t nvm_val = 0;
123+
124+
if (suit_storage_var_get(idx, &nvm_val) == SUIT_PLAT_SUCCESS) {
125+
*val = nvm_val;
126+
return SUIT_PLAT_SUCCESS;
127+
}
128+
129+
LOG_ERR("Cannot get persistent variable, idx: %d", idx);
130+
return SUIT_PLAT_ERR_IO;
131+
}
132+
133+
LOG_ERR("Variable does not exist, id: %d", id);
134+
return SUIT_PLAT_ERR_NOT_FOUND;
135+
}

0 commit comments

Comments
 (0)