mbed-os5 only for TYBLE16
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
components/TARGET_PSA/TARGET_TFM/COMPONENT_SPE/secure_fw/spm/spm_db_setup.h@1:9db0e321a9f4, 2019-12-31 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue Dec 31 06:02:27 2019 +0000
- Revision:
- 1:9db0e321a9f4
- Parent:
- 0:5b88d5760320
updated based on mbed-os5.15.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:5b88d5760320 | 1 | /* |
kenjiArai | 0:5b88d5760320 | 2 | * Copyright (c) 2018-2019, Arm Limited. All rights reserved. |
kenjiArai | 0:5b88d5760320 | 3 | * |
kenjiArai | 0:5b88d5760320 | 4 | * SPDX-License-Identifier: BSD-3-Clause |
kenjiArai | 0:5b88d5760320 | 5 | * |
kenjiArai | 0:5b88d5760320 | 6 | */ |
kenjiArai | 0:5b88d5760320 | 7 | |
kenjiArai | 0:5b88d5760320 | 8 | #ifndef __SPM_DB_SETUP_H__ |
kenjiArai | 0:5b88d5760320 | 9 | #define __SPM_DB_SETUP_H__ |
kenjiArai | 0:5b88d5760320 | 10 | |
kenjiArai | 0:5b88d5760320 | 11 | #include <stdint.h> |
kenjiArai | 0:5b88d5760320 | 12 | #include "spm_db.h" |
kenjiArai | 0:5b88d5760320 | 13 | |
kenjiArai | 0:5b88d5760320 | 14 | /** |
kenjiArai | 0:5b88d5760320 | 15 | * \brief Get the index of a partition. |
kenjiArai | 0:5b88d5760320 | 16 | * |
kenjiArai | 0:5b88d5760320 | 17 | * Gets the index of a partition in the partition db based on the partition ID |
kenjiArai | 0:5b88d5760320 | 18 | * provided as a parameter. |
kenjiArai | 0:5b88d5760320 | 19 | * |
kenjiArai | 0:5b88d5760320 | 20 | * \param[in] partition_idx The index of the partition |
kenjiArai | 0:5b88d5760320 | 21 | * |
kenjiArai | 0:5b88d5760320 | 22 | * \return \ref INVALID_PARTITION_IDX if the provided index is invalid. The |
kenjiArai | 0:5b88d5760320 | 23 | * index of the partition otherwise. |
kenjiArai | 0:5b88d5760320 | 24 | */ |
kenjiArai | 0:5b88d5760320 | 25 | uint32_t get_partition_idx(uint32_t partition_id); |
kenjiArai | 0:5b88d5760320 | 26 | |
kenjiArai | 0:5b88d5760320 | 27 | struct spm_partition_db_t { |
kenjiArai | 0:5b88d5760320 | 28 | uint32_t is_init; |
kenjiArai | 0:5b88d5760320 | 29 | uint32_t partition_count; |
kenjiArai | 0:5b88d5760320 | 30 | uint32_t running_partition_idx; |
kenjiArai | 0:5b88d5760320 | 31 | struct spm_partition_desc_t partitions[SPM_MAX_PARTITIONS]; |
kenjiArai | 0:5b88d5760320 | 32 | }; |
kenjiArai | 0:5b88d5760320 | 33 | |
kenjiArai | 0:5b88d5760320 | 34 | #define PARTITION_INIT_STATIC_DATA(data, partition, flags, id, priority) \ |
kenjiArai | 0:5b88d5760320 | 35 | do { \ |
kenjiArai | 0:5b88d5760320 | 36 | data.partition_id = partition##_ID; \ |
kenjiArai | 0:5b88d5760320 | 37 | data.partition_flags = flags; \ |
kenjiArai | 0:5b88d5760320 | 38 | data.partition_priority = TFM_PRIORITY(priority); \ |
kenjiArai | 0:5b88d5760320 | 39 | } while (0) |
kenjiArai | 0:5b88d5760320 | 40 | |
kenjiArai | 0:5b88d5760320 | 41 | /* Changed from #if (TFM_LVL == 1) && !defined(TFM_PSA_API) to #if (TFM_LVL == 1) to avoid linker error. |
kenjiArai | 0:5b88d5760320 | 42 | TF-M build autogenerates region details (code, ro, rw, zi and stack ) using linker scripts. We do not |
kenjiArai | 0:5b88d5760320 | 43 | hve that in mbed-os build yet. |
kenjiArai | 0:5b88d5760320 | 44 | */ |
kenjiArai | 0:5b88d5760320 | 45 | #if (TFM_LVL == 1) |
kenjiArai | 0:5b88d5760320 | 46 | #define PARTITION_INIT_MEMORY_DATA(data, partition) |
kenjiArai | 0:5b88d5760320 | 47 | #else |
kenjiArai | 0:5b88d5760320 | 48 | #define PARTITION_INIT_MEMORY_DATA(data, partition) \ |
kenjiArai | 0:5b88d5760320 | 49 | do { \ |
kenjiArai | 0:5b88d5760320 | 50 | data.code_start = PART_REGION_ADDR(partition, $$Base); \ |
kenjiArai | 0:5b88d5760320 | 51 | data.code_limit = PART_REGION_ADDR(partition, $$Limit); \ |
kenjiArai | 0:5b88d5760320 | 52 | data.ro_start = PART_REGION_ADDR(partition, $$RO$$Base); \ |
kenjiArai | 0:5b88d5760320 | 53 | data.ro_limit = PART_REGION_ADDR(partition, $$RO$$Limit); \ |
kenjiArai | 0:5b88d5760320 | 54 | data.rw_start = PART_REGION_ADDR(partition, _DATA$$RW$$Base); \ |
kenjiArai | 0:5b88d5760320 | 55 | data.rw_limit = PART_REGION_ADDR(partition, _DATA$$RW$$Limit); \ |
kenjiArai | 0:5b88d5760320 | 56 | data.zi_start = PART_REGION_ADDR(partition, _DATA$$ZI$$Base); \ |
kenjiArai | 0:5b88d5760320 | 57 | data.zi_limit = PART_REGION_ADDR(partition, _DATA$$ZI$$Limit); \ |
kenjiArai | 0:5b88d5760320 | 58 | data.stack_bottom = PART_REGION_ADDR(partition, _STACK$$ZI$$Base); \ |
kenjiArai | 0:5b88d5760320 | 59 | data.stack_top = PART_REGION_ADDR(partition, _STACK$$ZI$$Limit); \ |
kenjiArai | 0:5b88d5760320 | 60 | } while (0) |
kenjiArai | 0:5b88d5760320 | 61 | #endif |
kenjiArai | 0:5b88d5760320 | 62 | |
kenjiArai | 0:5b88d5760320 | 63 | #if TFM_LVL == 1 |
kenjiArai | 0:5b88d5760320 | 64 | #define PARTITION_INIT_RUNTIME_DATA(data, partition) \ |
kenjiArai | 0:5b88d5760320 | 65 | do { \ |
kenjiArai | 0:5b88d5760320 | 66 | data.partition_state = SPM_PARTITION_STATE_UNINIT; \ |
kenjiArai | 0:5b88d5760320 | 67 | } while (0) |
kenjiArai | 0:5b88d5760320 | 68 | #else |
kenjiArai | 0:5b88d5760320 | 69 | #define PARTITION_INIT_RUNTIME_DATA(data, partition) \ |
kenjiArai | 0:5b88d5760320 | 70 | do { \ |
kenjiArai | 0:5b88d5760320 | 71 | data.partition_state = SPM_PARTITION_STATE_UNINIT; \ |
kenjiArai | 0:5b88d5760320 | 72 | /* The top of the stack is reserved for the iovec */ \ |
kenjiArai | 0:5b88d5760320 | 73 | /* parameters of the service called. That's why in */ \ |
kenjiArai | 0:5b88d5760320 | 74 | /* data.stack_ptr we extract sizeof(struct iovec_args_t) */ \ |
kenjiArai | 0:5b88d5760320 | 75 | /* from the limit. */ \ |
kenjiArai | 0:5b88d5760320 | 76 | data.stack_ptr = \ |
kenjiArai | 0:5b88d5760320 | 77 | PART_REGION_ADDR(partition, _STACK$$ZI$$Limit - \ |
kenjiArai | 0:5b88d5760320 | 78 | sizeof(struct iovec_args_t)); \ |
kenjiArai | 0:5b88d5760320 | 79 | } while (0) |
kenjiArai | 0:5b88d5760320 | 80 | #endif |
kenjiArai | 0:5b88d5760320 | 81 | |
kenjiArai | 0:5b88d5760320 | 82 | #define PARTITION_DECLARE(partition, flag, type, id, priority, part_stack_size) \ |
kenjiArai | 0:5b88d5760320 | 83 | do { \ |
kenjiArai | 0:5b88d5760320 | 84 | REGION_DECLARE(Image$$, partition, $$Base); \ |
kenjiArai | 0:5b88d5760320 | 85 | REGION_DECLARE(Image$$, partition, $$Limit); \ |
kenjiArai | 0:5b88d5760320 | 86 | REGION_DECLARE(Image$$, partition, $$RO$$Base); \ |
kenjiArai | 0:5b88d5760320 | 87 | REGION_DECLARE(Image$$, partition, $$RO$$Limit); \ |
kenjiArai | 0:5b88d5760320 | 88 | REGION_DECLARE(Image$$, partition, _DATA$$RW$$Base); \ |
kenjiArai | 0:5b88d5760320 | 89 | REGION_DECLARE(Image$$, partition, _DATA$$RW$$Limit); \ |
kenjiArai | 0:5b88d5760320 | 90 | REGION_DECLARE(Image$$, partition, _DATA$$ZI$$Base); \ |
kenjiArai | 0:5b88d5760320 | 91 | REGION_DECLARE(Image$$, partition, _DATA$$ZI$$Limit); \ |
kenjiArai | 0:5b88d5760320 | 92 | REGION_DECLARE(Image$$, partition, _STACK$$ZI$$Base); \ |
kenjiArai | 0:5b88d5760320 | 93 | REGION_DECLARE(Image$$, partition, _STACK$$ZI$$Limit); \ |
kenjiArai | 0:5b88d5760320 | 94 | int32_t flags = flag; \ |
kenjiArai | 0:5b88d5760320 | 95 | if (tfm_memcmp(type, TFM_PARTITION_TYPE_APP, \ |
kenjiArai | 0:5b88d5760320 | 96 | strlen(TFM_PARTITION_TYPE_APP)) == 0) { \ |
kenjiArai | 0:5b88d5760320 | 97 | flags |= SPM_PART_FLAG_APP_ROT; \ |
kenjiArai | 0:5b88d5760320 | 98 | } else if (tfm_memcmp(type, TFM_PARTITION_TYPE_PSA, \ |
kenjiArai | 0:5b88d5760320 | 99 | strlen(TFM_PARTITION_TYPE_PSA)) == 0) { \ |
kenjiArai | 0:5b88d5760320 | 100 | flags |= SPM_PART_FLAG_PSA_ROT | SPM_PART_FLAG_APP_ROT; \ |
kenjiArai | 0:5b88d5760320 | 101 | } else { \ |
kenjiArai | 0:5b88d5760320 | 102 | return SPM_ERR_INVALID_CONFIG; \ |
kenjiArai | 0:5b88d5760320 | 103 | } \ |
kenjiArai | 0:5b88d5760320 | 104 | struct spm_partition_desc_t *part_ptr; \ |
kenjiArai | 0:5b88d5760320 | 105 | if (g_spm_partition_db.partition_count >= SPM_MAX_PARTITIONS) { \ |
kenjiArai | 0:5b88d5760320 | 106 | return SPM_ERR_INVALID_CONFIG; \ |
kenjiArai | 0:5b88d5760320 | 107 | } \ |
kenjiArai | 0:5b88d5760320 | 108 | __attribute__((section(".data.partitions_stacks"))) \ |
kenjiArai | 0:5b88d5760320 | 109 | static uint8_t partition##_stack[part_stack_size] __attribute__((aligned(8))); \ |
kenjiArai | 0:5b88d5760320 | 110 | part_ptr = &(g_spm_partition_db.partitions[ \ |
kenjiArai | 0:5b88d5760320 | 111 | g_spm_partition_db.partition_count]); \ |
kenjiArai | 0:5b88d5760320 | 112 | part_ptr->memory_data.stack_bottom = (uint32_t)partition##_stack; \ |
kenjiArai | 0:5b88d5760320 | 113 | part_ptr->memory_data.stack_top = part_ptr->memory_data.stack_bottom + part_stack_size; \ |
kenjiArai | 0:5b88d5760320 | 114 | PARTITION_INIT_STATIC_DATA(part_ptr->static_data, partition, flags, \ |
kenjiArai | 0:5b88d5760320 | 115 | id, priority); \ |
kenjiArai | 0:5b88d5760320 | 116 | PARTITION_INIT_RUNTIME_DATA(part_ptr->runtime_data, partition); \ |
kenjiArai | 0:5b88d5760320 | 117 | PARTITION_INIT_MEMORY_DATA(part_ptr->memory_data, partition); \ |
kenjiArai | 0:5b88d5760320 | 118 | ++g_spm_partition_db.partition_count; \ |
kenjiArai | 0:5b88d5760320 | 119 | } while (0) |
kenjiArai | 0:5b88d5760320 | 120 | |
kenjiArai | 0:5b88d5760320 | 121 | #define PARTITION_ADD_INIT_FUNC(partition, init_func) \ |
kenjiArai | 0:5b88d5760320 | 122 | do { \ |
kenjiArai | 0:5b88d5760320 | 123 | extern int32_t init_func(void); \ |
kenjiArai | 0:5b88d5760320 | 124 | uint32_t partition_idx = get_partition_idx(partition##_ID); \ |
kenjiArai | 0:5b88d5760320 | 125 | struct spm_partition_desc_t *part_ptr = \ |
kenjiArai | 0:5b88d5760320 | 126 | &(g_spm_partition_db.partitions[partition_idx]); \ |
kenjiArai | 0:5b88d5760320 | 127 | part_ptr->static_data.partition_init = init_func; \ |
kenjiArai | 0:5b88d5760320 | 128 | } while (0) |
kenjiArai | 0:5b88d5760320 | 129 | |
kenjiArai | 0:5b88d5760320 | 130 | #define PARTITION_ADD_PERIPHERAL(partition, peripheral) \ |
kenjiArai | 0:5b88d5760320 | 131 | do { \ |
kenjiArai | 0:5b88d5760320 | 132 | uint32_t partition_idx = get_partition_idx(partition##_ID); \ |
kenjiArai | 0:5b88d5760320 | 133 | struct spm_partition_desc_t *part_ptr = \ |
kenjiArai | 0:5b88d5760320 | 134 | &(g_spm_partition_db.partitions[partition_idx]); \ |
kenjiArai | 0:5b88d5760320 | 135 | part_ptr->platform_data = peripheral; \ |
kenjiArai | 0:5b88d5760320 | 136 | } while (0) |
kenjiArai | 0:5b88d5760320 | 137 | |
kenjiArai | 0:5b88d5760320 | 138 | #endif /* __SPM_DB_SETUP_H__ */ |