mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

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?

UserRevisionLine numberNew 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 }