Skip to content

Commit 44ec2aa

Browse files
Alexander ZilberkantOren Cohen
authored andcommitted
Better PID handling
PSA PID is of int32_t type - use native type during the whole flow for better readability. Convert PID to unsigned for calculations only. Add dedicated inline function for logic shift right.
1 parent 9f7752b commit 44ec2aa

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

components/TARGET_PSA/services/psa_prot_internal_storage/COMPONENT_PSA_SRV_IMPL/pits_impl.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "psa_prot_internal_storage.h"
2323
#include "pits_impl.h"
2424
#include "mbed_error.h"
25+
#include "mbed_toolchain.h"
2526

2627
#ifdef __cplusplus
2728
extern "C"
@@ -88,6 +89,19 @@ static psa_its_status_t convert_status(int status)
8889
}
8990
}
9091

92+
/*
93+
* \brief Logic shift right
94+
*
95+
* \note must operate on unsinged integers to prevent negative carry
96+
* \param x[in] input number for shifting
97+
* \param n[in] number of bits to shift right
98+
* \return the result
99+
*/
100+
MBED_FORCEINLINE uint32_t lsr(uint32_t x, uint32_t n)
101+
{
102+
return x >> n;
103+
}
104+
91105
/*
92106
* \breif Generate KVStore file name
93107
*
@@ -99,34 +113,34 @@ static psa_its_status_t convert_status(int status)
99113
* \param[in] uid - PSA internal storage unique ID
100114
* \param[in] pid - owner PSA partition ID
101115
*/
102-
static void generate_fn(char *tdb_filename, uint32_t tdb_filename_size, uint32_t uid, uint32_t pid)
116+
static void generate_fn(char *tdb_filename, uint32_t tdb_filename_size, uint32_t uid, int32_t pid)
103117
{
104118
MBED_ASSERT(tdb_filename != NULL);
105119
MBED_ASSERT(tdb_filename_size == PSA_ITS_FILENAME_MAX_LEN);
106120

107121
uint8_t filename_idx = 0;
122+
uint32_t unsigned_pid = (uint32_t)pid; // binary only representation for bitwise operations
108123

109124
// Iterate on PID; each time convert 6 bits of PID into a character; first iteration must be done
110125
do {
111-
tdb_filename[filename_idx++] = base64_coding_table[pid & 0x3F];
112-
pid = pid >> 6;
113-
} while (pid != 0);
126+
tdb_filename[filename_idx++] = base64_coding_table[unsigned_pid & 0x3F];
127+
unsigned_pid = lsr(unsigned_pid, 6);
128+
} while (unsigned_pid != 0);
114129

115130
// Write delimiter
116131
tdb_filename[filename_idx++] = '#';
117132

118133
// Iterate on UID; each time convert 6 bits of UID into a character; first iteration must be done
119134
do {
120135
tdb_filename[filename_idx++] = base64_coding_table[uid & 0x3F];
121-
uid = uid >> 6;
136+
uid = lsr(uid, 6);
122137
} while (uid != 0);
123138

124139
tdb_filename[filename_idx++] = '\0';
125140
MBED_ASSERT(filename_idx <= PSA_ITS_FILENAME_MAX_LEN);
126141
}
127142

128-
129-
psa_its_status_t psa_its_set_impl(uint32_t pid, uint32_t uid, uint32_t data_length, const void *p_data, psa_its_create_flags_t create_flags)
143+
psa_its_status_t psa_its_set_impl(int32_t pid, uint32_t uid, uint32_t data_length, const void *p_data, psa_its_create_flags_t create_flags)
130144
{
131145
KVStore *kvstore = get_kvstore_instance();
132146
MBED_ASSERT(kvstore);
@@ -149,7 +163,7 @@ psa_its_status_t psa_its_set_impl(uint32_t pid, uint32_t uid, uint32_t data_leng
149163
return convert_status(status);
150164
}
151165

152-
psa_its_status_t psa_its_get_impl(uint32_t pid, uint32_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
166+
psa_its_status_t psa_its_get_impl(int32_t pid, uint32_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
153167
{
154168
KVStore *kvstore = get_kvstore_instance();
155169
MBED_ASSERT(kvstore);
@@ -188,7 +202,7 @@ psa_its_status_t psa_its_get_impl(uint32_t pid, uint32_t uid, uint32_t data_offs
188202
return convert_status(status);
189203
}
190204

191-
psa_its_status_t psa_its_get_info_impl(uint32_t pid, uint32_t uid, struct psa_its_info_t *p_info)
205+
psa_its_status_t psa_its_get_info_impl(int32_t pid, uint32_t uid, struct psa_its_info_t *p_info)
192206
{
193207
KVStore *kvstore = get_kvstore_instance();
194208
MBED_ASSERT(kvstore);
@@ -211,7 +225,7 @@ psa_its_status_t psa_its_get_info_impl(uint32_t pid, uint32_t uid, struct psa_it
211225
return convert_status(status);
212226
}
213227

214-
psa_its_status_t psa_its_remove_impl(uint32_t pid, uint32_t uid)
228+
psa_its_status_t psa_its_remove_impl(int32_t pid, uint32_t uid)
215229
{
216230
KVStore *kvstore = get_kvstore_instance();
217231
MBED_ASSERT(kvstore);

components/TARGET_PSA/services/psa_prot_internal_storage/COMPONENT_PSA_SRV_IMPL/pits_impl.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ extern "C"
2828

2929
#define PITS_DATA_PTR_AT_OFFSET(ptr, offset) ((void *)(((uintptr_t)ptr) + ((uintptr_t)offset)))
3030

31-
psa_its_status_t psa_its_set_impl(uint32_t pid, uint32_t uid, uint32_t data_length, const void *p_data, psa_its_create_flags_t create_flags);
32-
psa_its_status_t psa_its_get_impl(uint32_t pid, uint32_t uid, uint32_t data_offset, uint32_t data_length, void *p_data);
33-
psa_its_status_t psa_its_get_info_impl(uint32_t pid, uint32_t uid, struct psa_its_info_t *p_info);
34-
psa_its_status_t psa_its_remove_impl(uint32_t pid, uint32_t uid);
31+
psa_its_status_t psa_its_set_impl(int32_t pid, uint32_t uid, uint32_t data_length, const void *p_data, psa_its_create_flags_t create_flags);
32+
psa_its_status_t psa_its_get_impl(int32_t pid, uint32_t uid, uint32_t data_offset, uint32_t data_length, void *p_data);
33+
psa_its_status_t psa_its_get_info_impl(int32_t pid, uint32_t uid, struct psa_its_info_t *p_info);
34+
psa_its_status_t psa_its_remove_impl(int32_t pid, uint32_t uid);
3535

3636
#ifdef __cplusplus
3737
}

0 commit comments

Comments
 (0)