aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMingyang Sun <mingyang.sun@arm.com>2021-03-30 17:56:26 +0800
committerKen Liu <ken.liu@arm.com>2021-04-21 10:08:42 +0200
commit4ecea99b3f0938d4c66cac10e7fb35e5a731a7d2 (patch)
treebcef5f3243d2238f37edff98ff96e245945aaeea
parentabf6698dd6b916de5aea971783aa80776bf296dd (diff)
downloadtrusted-firmware-m-4ecea99b3f0938d4c66cac10e7fb35e5a731a7d2.tar.gz
Tools: Improvements on static handle encoding
Convert static handle index from [1, maximum] to [0, maximum-1] to be used directly as the tracking table index. Change-Id: I2acd4de1459c1652a4b2f45f437da1a91db1465e Signed-off-by: Mingyang Sun <mingyang.sun@arm.com>
-rw-r--r--interface/include/psa_manifest/sid.h.template2
-rw-r--r--secure_fw/spm/cmsis_psa/spm_ipc.h2
-rw-r--r--tools/tfm_parse_manifest_list.py76
3 files changed, 44 insertions, 36 deletions
diff --git a/interface/include/psa_manifest/sid.h.template b/interface/include/psa_manifest/sid.h.template
index e188d62b7..1fe128cba 100644
--- a/interface/include/psa_manifest/sid.h.template
+++ b/interface/include/psa_manifest/sid.h.template
@@ -29,7 +29,7 @@ extern "C" {
{% endif %}
{% if partition.manifest.psa_framework_version > 1.0 and service.connection_based == false %}
{% set str = service.name + "_HANDLE" %}
-#define {{"%-58s"|format(str)}} ({{"%s"|format(service.stateless_handle)}}U)
+#define {{"%-58s"|format(str)}} ({{"%s"|format(service.stateless_handle_value)}}U)
{% endif %}
{% endfor %}
{% endif %}
diff --git a/secure_fw/spm/cmsis_psa/spm_ipc.h b/secure_fw/spm/cmsis_psa/spm_ipc.h
index 332098003..1a1384fda 100644
--- a/secure_fw/spm/cmsis_psa/spm_ipc.h
+++ b/secure_fw/spm/cmsis_psa/spm_ipc.h
@@ -40,7 +40,7 @@
#define STAIC_HANDLE_IDX_MASK \
(uint32_t)((1UL << STAIC_HANDLE_IDX_BIT_WIDTH) - 1)
#define GET_INDEX_FROM_STATIC_HANDLE(handle) \
- (uint32_t)(((handle) & STAIC_HANDLE_IDX_MASK) - 1)
+ (uint32_t)((handle) & STAIC_HANDLE_IDX_MASK)
#define STAIC_HANDLE_VER_BIT_WIDTH 8
#define STAIC_HANDLE_VER_OFFSET 8
diff --git a/tools/tfm_parse_manifest_list.py b/tools/tfm_parse_manifest_list.py
index 73c764139..d54ebdd8c 100644
--- a/tools/tfm_parse_manifest_list.py
+++ b/tools/tfm_parse_manifest_list.py
@@ -197,14 +197,14 @@ def gen_files(context, gen_file_lists):
def process_stateless_services(partitions, static_handle_max_num):
"""
This function collects all stateless services together, and allocates
- stateless handle for them.
- If the stateless handle is set to a valid value in yaml file, it is used as
- the index directly, if the stateless handle is set as "auto" or not set,
- framework will allocate a valid index for the service.
- After that, framework puts each service into a stateless service list at
- position of its "index". Other elements in list are left None.
+ stateless handles for them.
+ If the stateless handle is set to a valid value in yaml/json file, it is
+ converted to a index directly, if the stateless handle is set as "auto",
+ or not set, framework will allocate a valid index for the service.
+ After that, framework puts each service into a reordered stateless service
+ list at position of "index". Other positions in list are left "None".
"""
- stateless_services = []
+ raw_stateless_services = []
# Collect all stateless services first.
for partition in partitions:
@@ -218,12 +218,12 @@ def process_stateless_services(partitions, static_handle_max_num):
if 'connection_based' not in service:
raise Exception("'connection_based' is mandatory in FF-M 1.1 service!")
if service['connection_based'] is False:
- stateless_services.append(service)
+ raw_stateless_services.append(service)
- if len(stateless_services) == 0:
+ if len(raw_stateless_services) == 0:
return []
- if len(stateless_services) > static_handle_max_num:
+ if len(raw_stateless_services) > static_handle_max_num:
raise Exception("Stateless service numbers range exceed.")
"""
@@ -233,42 +233,50 @@ def process_stateless_services(partitions, static_handle_max_num):
at index "handle - 1", since handle value starts from 1 and list index
starts from 0.
"""
- reordered_stateless_list = [None] * static_handle_max_num
+ reordered_stateless_services = [None] * static_handle_max_num
- # Fill in services with specified stateless handle, index is "handle - 1".
- for service in stateless_services:
- if service['stateless_handle'] == "auto":
- continue
- try:
- if reordered_stateless_list[service['stateless_handle']-1] is not None:
- raise Exception("Duplicated stateless service handle.")
- reordered_stateless_list[service['stateless_handle']-1] = service
- except IndexError:
- raise Exception("Stateless service index out of range.")
- # Remove recorded node from the existing list
- stateless_services.remove(service)
-
- # Auto-allocate stateless handle
+ for service in raw_stateless_services:
+ service_handle = service['stateless_handle']
+
+ # Fill in service list with specified stateless handle, otherwise skip
+ if isinstance(service_handle, int):
+ if service_handle < 1 or service_handle > static_handle_max_num:
+ raise Exception("Invalid stateless_handle setting.")
+ # Convert handle index to reordered service list index
+ service_handle = service_handle - 1
+
+ if reordered_stateless_services[service_handle] is not None:
+ raise Exception("Duplicated stateless_handle setting.")
+ reordered_stateless_services[service_handle] = service
+ # Remove recorded node from the existing list
+ raw_stateless_services.remove(service)
+
+ # Auto-allocate stateless handle and encode the stateless handle
for i in range(0, static_handle_max_num):
- if reordered_stateless_list[i] == None and len(stateless_services) > 0:
- service = stateless_services.pop(0)
- service['stateless_handle'] = i + 1
- reordered_stateless_list[i] = service
+ service = reordered_stateless_services[i]
+
+ if service == None and len(raw_stateless_services) > 0:
+ service = raw_stateless_services.pop(0)
+
"""
Encode stateless flag and version into stateless handle
bit 30: stateless handle indicator
bit 15-8: stateless service version
bit 7-0: stateless handle index
"""
- if reordered_stateless_list[i] != None:
- stateless_handle_value = reordered_stateless_list[i]['stateless_handle']
+ stateless_handle_value = 0
+ if service != None:
+ stateless_index = (i & 0xFF)
+ stateless_handle_value |= stateless_index
stateless_flag = 1 << 30
stateless_handle_value |= stateless_flag
- stateless_version = (reordered_stateless_list[i]['version'] & 0xFF) << 8
+ stateless_version = (service['version'] & 0xFF) << 8
stateless_handle_value |= stateless_version
- reordered_stateless_list[i]['stateless_handle'] = '0x%08x' % stateless_handle_value
+ service['stateless_handle_value'] = '0x{0:08x}'.format(stateless_handle_value)
+
+ reordered_stateless_services[i] = service
- return reordered_stateless_list
+ return reordered_stateless_services
def parse_args():
parser = argparse.ArgumentParser(description='Parse secure partition manifest list and generate files listed by the file list',