mbed-os5 only for TYBLE16
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
components/TARGET_PSA/TARGET_TFM/COMPONENT_SPE/secure_fw/core/tfm_spm_services.c@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) 2017-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 | #include <arm_cmse.h> |
kenjiArai | 0:5b88d5760320 | 9 | |
kenjiArai | 0:5b88d5760320 | 10 | #include "tfm_svc.h" |
kenjiArai | 0:5b88d5760320 | 11 | #include "tfm_secure_api.h" |
kenjiArai | 0:5b88d5760320 | 12 | #include "tfm_internal.h" |
kenjiArai | 0:5b88d5760320 | 13 | #include "secure_fw/include/tfm_spm_services_api.h" |
kenjiArai | 0:5b88d5760320 | 14 | #include "spm_api.h" |
kenjiArai | 0:5b88d5760320 | 15 | |
kenjiArai | 0:5b88d5760320 | 16 | uint8_t *tfm_scratch_area; |
kenjiArai | 0:5b88d5760320 | 17 | uint32_t tfm_scratch_area_size; |
kenjiArai | 0:5b88d5760320 | 18 | nsfptr_t ns_entry; |
kenjiArai | 0:5b88d5760320 | 19 | |
kenjiArai | 0:5b88d5760320 | 20 | void jump_to_ns_code(void) |
kenjiArai | 0:5b88d5760320 | 21 | { |
kenjiArai | 0:5b88d5760320 | 22 | #if TFM_LVL == 3 || ((!defined(TFM_PSA_API)) && (TFM_LVL != 1)) |
kenjiArai | 0:5b88d5760320 | 23 | /* Initialization is done, set thread mode to unprivileged. */ |
kenjiArai | 0:5b88d5760320 | 24 | tfm_spm_partition_change_privilege(TFM_PARTITION_UNPRIVILEGED_MODE); |
kenjiArai | 0:5b88d5760320 | 25 | #endif |
kenjiArai | 0:5b88d5760320 | 26 | /* All changes made to memory will be effective after this point */ |
kenjiArai | 0:5b88d5760320 | 27 | __DSB(); |
kenjiArai | 0:5b88d5760320 | 28 | __ISB(); |
kenjiArai | 0:5b88d5760320 | 29 | |
kenjiArai | 0:5b88d5760320 | 30 | /* Calls the non-secure Reset_Handler to jump to the non-secure binary */ |
kenjiArai | 0:5b88d5760320 | 31 | ns_entry(); |
kenjiArai | 0:5b88d5760320 | 32 | } |
kenjiArai | 0:5b88d5760320 | 33 | |
kenjiArai | 0:5b88d5760320 | 34 | #ifndef TFM_PSA_API |
kenjiArai | 0:5b88d5760320 | 35 | #if defined(__ARM_ARCH_8M_MAIN__) |
kenjiArai | 0:5b88d5760320 | 36 | __attribute__((naked)) int32_t tfm_core_sfn_request( |
kenjiArai | 0:5b88d5760320 | 37 | const struct tfm_sfn_req_s *desc_ptr) |
kenjiArai | 0:5b88d5760320 | 38 | { |
kenjiArai | 0:5b88d5760320 | 39 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 40 | "PUSH {r4-r12, lr}\n" |
kenjiArai | 0:5b88d5760320 | 41 | "SVC %[SVC_REQ]\n" |
kenjiArai | 0:5b88d5760320 | 42 | "MOV r4, #0\n" |
kenjiArai | 0:5b88d5760320 | 43 | "MOV r5, #0\n" |
kenjiArai | 0:5b88d5760320 | 44 | "MOV r6, #0\n" |
kenjiArai | 0:5b88d5760320 | 45 | "MOV r7, #0\n" |
kenjiArai | 0:5b88d5760320 | 46 | "MOV r8, #0\n" |
kenjiArai | 0:5b88d5760320 | 47 | "MOV r9, #0\n" |
kenjiArai | 0:5b88d5760320 | 48 | "MOV r10, #0\n" |
kenjiArai | 0:5b88d5760320 | 49 | "MOV r11, #0\n" |
kenjiArai | 0:5b88d5760320 | 50 | "BLX lr\n" |
kenjiArai | 0:5b88d5760320 | 51 | "SVC %[SVC_RET]\n" |
kenjiArai | 0:5b88d5760320 | 52 | "POP {r4-r12, pc}\n" |
kenjiArai | 0:5b88d5760320 | 53 | : : [SVC_REQ] "I" (TFM_SVC_SFN_REQUEST) |
kenjiArai | 0:5b88d5760320 | 54 | , [SVC_RET] "I" (TFM_SVC_SFN_RETURN) |
kenjiArai | 0:5b88d5760320 | 55 | : "r0"); |
kenjiArai | 0:5b88d5760320 | 56 | } |
kenjiArai | 0:5b88d5760320 | 57 | #elif defined(__ARM_ARCH_8M_BASE__) |
kenjiArai | 0:5b88d5760320 | 58 | __attribute__((naked)) int32_t tfm_core_sfn_request( |
kenjiArai | 0:5b88d5760320 | 59 | const struct tfm_sfn_req_s *desc_ptr) |
kenjiArai | 0:5b88d5760320 | 60 | { |
kenjiArai | 0:5b88d5760320 | 61 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 62 | ".syntax unified\n" |
kenjiArai | 0:5b88d5760320 | 63 | "PUSH {lr}\n" |
kenjiArai | 0:5b88d5760320 | 64 | "PUSH {r4-r7}\n" |
kenjiArai | 0:5b88d5760320 | 65 | "MOV r4, r8\n" |
kenjiArai | 0:5b88d5760320 | 66 | "MOV r5, r9\n" |
kenjiArai | 0:5b88d5760320 | 67 | "MOV r6, r10\n" |
kenjiArai | 0:5b88d5760320 | 68 | "MOV r7, r11\n" |
kenjiArai | 0:5b88d5760320 | 69 | "PUSH {r4-r7}\n" |
kenjiArai | 0:5b88d5760320 | 70 | "MOV r4, r12\n" |
kenjiArai | 0:5b88d5760320 | 71 | "PUSH {r4}\n" |
kenjiArai | 0:5b88d5760320 | 72 | "SVC %[SVC_REQ]\n" |
kenjiArai | 0:5b88d5760320 | 73 | "MOVS r4, #0\n" |
kenjiArai | 0:5b88d5760320 | 74 | "MOV r5, r4\n" |
kenjiArai | 0:5b88d5760320 | 75 | "MOV r6, r4\n" |
kenjiArai | 0:5b88d5760320 | 76 | "MOV r7, r4\n" |
kenjiArai | 0:5b88d5760320 | 77 | "MOV r8, r4\n" |
kenjiArai | 0:5b88d5760320 | 78 | "MOV r9, r4\n" |
kenjiArai | 0:5b88d5760320 | 79 | "MOV r10, r4\n" |
kenjiArai | 0:5b88d5760320 | 80 | "MOV r11, r4\n" |
kenjiArai | 0:5b88d5760320 | 81 | "BLX lr\n" |
kenjiArai | 0:5b88d5760320 | 82 | "SVC %[SVC_RET]\n" |
kenjiArai | 0:5b88d5760320 | 83 | "POP {r4}\n" |
kenjiArai | 0:5b88d5760320 | 84 | "MOV r12, r4\n" |
kenjiArai | 0:5b88d5760320 | 85 | "POP {r4-r7}\n" |
kenjiArai | 0:5b88d5760320 | 86 | "MOV r8, r4\n" |
kenjiArai | 0:5b88d5760320 | 87 | "MOV r9, r5\n" |
kenjiArai | 0:5b88d5760320 | 88 | "MOV r10, r6\n" |
kenjiArai | 0:5b88d5760320 | 89 | "MOV r11, r7\n" |
kenjiArai | 0:5b88d5760320 | 90 | "POP {r4-r7}\n" |
kenjiArai | 0:5b88d5760320 | 91 | "POP {pc}\n" |
kenjiArai | 0:5b88d5760320 | 92 | : : [SVC_REQ] "I" (TFM_SVC_SFN_REQUEST) |
kenjiArai | 0:5b88d5760320 | 93 | , [SVC_RET] "I" (TFM_SVC_SFN_RETURN) |
kenjiArai | 0:5b88d5760320 | 94 | : "r0"); |
kenjiArai | 0:5b88d5760320 | 95 | } |
kenjiArai | 0:5b88d5760320 | 96 | #else |
kenjiArai | 0:5b88d5760320 | 97 | #error "Unsupported ARM Architecture." |
kenjiArai | 0:5b88d5760320 | 98 | #endif |
kenjiArai | 0:5b88d5760320 | 99 | |
kenjiArai | 0:5b88d5760320 | 100 | __attribute__((naked)) |
kenjiArai | 0:5b88d5760320 | 101 | int32_t tfm_core_memory_permission_check(const void *ptr, |
kenjiArai | 0:5b88d5760320 | 102 | uint32_t len, |
kenjiArai | 0:5b88d5760320 | 103 | int32_t access) |
kenjiArai | 0:5b88d5760320 | 104 | { |
kenjiArai | 0:5b88d5760320 | 105 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 106 | "SVC %0\n" |
kenjiArai | 0:5b88d5760320 | 107 | "BX lr\n" |
kenjiArai | 0:5b88d5760320 | 108 | : : "I" (TFM_SVC_MEMORY_CHECK)); |
kenjiArai | 0:5b88d5760320 | 109 | } |
kenjiArai | 0:5b88d5760320 | 110 | |
kenjiArai | 0:5b88d5760320 | 111 | __attribute__((naked)) |
kenjiArai | 0:5b88d5760320 | 112 | int32_t tfm_core_get_caller_client_id(int32_t *caller_client_id) |
kenjiArai | 0:5b88d5760320 | 113 | { |
kenjiArai | 0:5b88d5760320 | 114 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 115 | "SVC %0\n" |
kenjiArai | 0:5b88d5760320 | 116 | "BX LR\n" |
kenjiArai | 0:5b88d5760320 | 117 | : : "I" (TFM_SVC_GET_CALLER_CLIENT_ID)); |
kenjiArai | 0:5b88d5760320 | 118 | } |
kenjiArai | 0:5b88d5760320 | 119 | |
kenjiArai | 0:5b88d5760320 | 120 | __attribute__((naked)) |
kenjiArai | 0:5b88d5760320 | 121 | int32_t tfm_spm_request_reset_vote(void) |
kenjiArai | 0:5b88d5760320 | 122 | { |
kenjiArai | 0:5b88d5760320 | 123 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 124 | "MOVS R0, %0\n" |
kenjiArai | 0:5b88d5760320 | 125 | "B tfm_spm_request\n" |
kenjiArai | 0:5b88d5760320 | 126 | : : "I" (TFM_SPM_REQUEST_RESET_VOTE)); |
kenjiArai | 0:5b88d5760320 | 127 | } |
kenjiArai | 0:5b88d5760320 | 128 | |
kenjiArai | 0:5b88d5760320 | 129 | __attribute__((naked)) |
kenjiArai | 0:5b88d5760320 | 130 | int32_t tfm_spm_request(void) |
kenjiArai | 0:5b88d5760320 | 131 | { |
kenjiArai | 0:5b88d5760320 | 132 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 133 | "SVC %0\n" |
kenjiArai | 0:5b88d5760320 | 134 | "BX lr\n" |
kenjiArai | 0:5b88d5760320 | 135 | : : "I" (TFM_SVC_SPM_REQUEST)); |
kenjiArai | 0:5b88d5760320 | 136 | } |
kenjiArai | 0:5b88d5760320 | 137 | |
kenjiArai | 0:5b88d5760320 | 138 | __attribute__((naked)) |
kenjiArai | 0:5b88d5760320 | 139 | int32_t tfm_core_validate_secure_caller(void) |
kenjiArai | 0:5b88d5760320 | 140 | { |
kenjiArai | 0:5b88d5760320 | 141 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 142 | "SVC %0\n" |
kenjiArai | 0:5b88d5760320 | 143 | "BX lr\n" |
kenjiArai | 0:5b88d5760320 | 144 | : : "I" (TFM_SVC_VALIDATE_SECURE_CALLER)); |
kenjiArai | 0:5b88d5760320 | 145 | } |
kenjiArai | 0:5b88d5760320 | 146 | |
kenjiArai | 0:5b88d5760320 | 147 | __attribute__((naked)) |
kenjiArai | 0:5b88d5760320 | 148 | int32_t tfm_core_set_buffer_area(enum tfm_buffer_share_region_e share) |
kenjiArai | 0:5b88d5760320 | 149 | { |
kenjiArai | 0:5b88d5760320 | 150 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 151 | "SVC %0\n" |
kenjiArai | 0:5b88d5760320 | 152 | "BX lr\n" |
kenjiArai | 0:5b88d5760320 | 153 | : : "I" (TFM_SVC_SET_SHARE_AREA)); |
kenjiArai | 0:5b88d5760320 | 154 | } |
kenjiArai | 0:5b88d5760320 | 155 | #endif |
kenjiArai | 0:5b88d5760320 | 156 | |
kenjiArai | 0:5b88d5760320 | 157 | __attribute__((naked)) |
kenjiArai | 0:5b88d5760320 | 158 | int32_t tfm_core_get_boot_data(uint8_t major_type, |
kenjiArai | 0:5b88d5760320 | 159 | struct tfm_boot_data *boot_status, |
kenjiArai | 0:5b88d5760320 | 160 | uint32_t len) |
kenjiArai | 0:5b88d5760320 | 161 | { |
kenjiArai | 0:5b88d5760320 | 162 | __ASM volatile( |
kenjiArai | 0:5b88d5760320 | 163 | "SVC %0\n" |
kenjiArai | 0:5b88d5760320 | 164 | "BX lr\n" |
kenjiArai | 0:5b88d5760320 | 165 | : : "I" (TFM_SVC_GET_BOOT_DATA)); |
kenjiArai | 0:5b88d5760320 | 166 | } |