mbed-os5 only for TYBLE16
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
components/TARGET_PSA/TARGET_TFM/COMPONENT_SPE/secure_fw/core/secure_utilities.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) 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 | #ifndef __SECURE_UTILITIES_H__ |
kenjiArai | 0:5b88d5760320 | 9 | #define __SECURE_UTILITIES_H__ |
kenjiArai | 0:5b88d5760320 | 10 | |
kenjiArai | 0:5b88d5760320 | 11 | #include <stdio.h> |
kenjiArai | 0:5b88d5760320 | 12 | #include "cmsis_compiler.h" |
kenjiArai | 0:5b88d5760320 | 13 | #include "tfm_svc.h" |
kenjiArai | 0:5b88d5760320 | 14 | |
kenjiArai | 0:5b88d5760320 | 15 | #define EXC_RETURN_INDICATOR (0xF << 28) |
kenjiArai | 0:5b88d5760320 | 16 | #define EXC_RETURN_SECURITY_STACK_STATUS_MASK (0x3 << 5) |
kenjiArai | 0:5b88d5760320 | 17 | #define EXC_RETURN_SECURE_STACK (1 << 6) |
kenjiArai | 0:5b88d5760320 | 18 | #define EXC_RETURN_FPU_FRAME_BASIC (1 << 4) |
kenjiArai | 0:5b88d5760320 | 19 | #define EXC_RETURN_MODE_THREAD (1 << 3) |
kenjiArai | 0:5b88d5760320 | 20 | #define EXC_RETURN_STACK_PROCESS (1 << 2) |
kenjiArai | 0:5b88d5760320 | 21 | #define EXC_RETURN_EXC_SECURE (1) |
kenjiArai | 0:5b88d5760320 | 22 | |
kenjiArai | 0:5b88d5760320 | 23 | #define EXC_NUM_THREAD_MODE (0) |
kenjiArai | 0:5b88d5760320 | 24 | #define EXC_NUM_SVCALL (11) |
kenjiArai | 0:5b88d5760320 | 25 | #define EXC_NUM_PENDSV (14) |
kenjiArai | 0:5b88d5760320 | 26 | #define EXC_NUM_SYSTICK (15) |
kenjiArai | 0:5b88d5760320 | 27 | |
kenjiArai | 0:5b88d5760320 | 28 | #define printf(...) |
kenjiArai | 0:5b88d5760320 | 29 | |
kenjiArai | 0:5b88d5760320 | 30 | /* Disable NS exceptions by setting NS PRIMASK to 1 */ |
kenjiArai | 0:5b88d5760320 | 31 | #define TFM_NS_EXC_DISABLE() __TZ_set_PRIMASK_NS(1) |
kenjiArai | 0:5b88d5760320 | 32 | /* Enable NS exceptions by setting NS PRIMASK to 0 */ |
kenjiArai | 0:5b88d5760320 | 33 | #define TFM_NS_EXC_ENABLE() __TZ_set_PRIMASK_NS(0) |
kenjiArai | 0:5b88d5760320 | 34 | |
kenjiArai | 0:5b88d5760320 | 35 | struct tfm_exc_stack_t { |
kenjiArai | 0:5b88d5760320 | 36 | uint32_t R0; |
kenjiArai | 0:5b88d5760320 | 37 | uint32_t R1; |
kenjiArai | 0:5b88d5760320 | 38 | uint32_t R2; |
kenjiArai | 0:5b88d5760320 | 39 | uint32_t R3; |
kenjiArai | 0:5b88d5760320 | 40 | uint32_t R12; |
kenjiArai | 0:5b88d5760320 | 41 | uint32_t LR; |
kenjiArai | 0:5b88d5760320 | 42 | uint32_t RetAddr; |
kenjiArai | 0:5b88d5760320 | 43 | uint32_t XPSR; |
kenjiArai | 0:5b88d5760320 | 44 | }; |
kenjiArai | 0:5b88d5760320 | 45 | |
kenjiArai | 0:5b88d5760320 | 46 | #ifdef TFM_CORE_DEBUG |
kenjiArai | 0:5b88d5760320 | 47 | #define LOG_MSG_HDLR(MSG) printf("[Sec Handler] %s\r\n", MSG) |
kenjiArai | 0:5b88d5760320 | 48 | #else |
kenjiArai | 0:5b88d5760320 | 49 | /* FixMe: redirect to secure log area */ |
kenjiArai | 0:5b88d5760320 | 50 | #define LOG_MSG_HDLR(MSG) printf("[Sec Handler] %s\r\n", MSG) |
kenjiArai | 0:5b88d5760320 | 51 | #endif |
kenjiArai | 0:5b88d5760320 | 52 | |
kenjiArai | 0:5b88d5760320 | 53 | #define LOG_MSG_THR(MSG) \ |
kenjiArai | 0:5b88d5760320 | 54 | __ASM volatile("MOV r0, %0\n" \ |
kenjiArai | 0:5b88d5760320 | 55 | "SVC %1\n" \ |
kenjiArai | 0:5b88d5760320 | 56 | : : "r" (MSG), "I" (TFM_SVC_PRINT)) |
kenjiArai | 0:5b88d5760320 | 57 | |
kenjiArai | 0:5b88d5760320 | 58 | #define LOG_MSG(MSG) \ |
kenjiArai | 0:5b88d5760320 | 59 | do { \ |
kenjiArai | 0:5b88d5760320 | 60 | if (__get_active_exc_num()) { \ |
kenjiArai | 0:5b88d5760320 | 61 | LOG_MSG_HDLR(MSG); \ |
kenjiArai | 0:5b88d5760320 | 62 | } else { \ |
kenjiArai | 0:5b88d5760320 | 63 | LOG_MSG_THR(MSG); \ |
kenjiArai | 0:5b88d5760320 | 64 | } \ |
kenjiArai | 0:5b88d5760320 | 65 | } while (0) |
kenjiArai | 0:5b88d5760320 | 66 | |
kenjiArai | 0:5b88d5760320 | 67 | #ifdef TFM_CORE_DEBUG |
kenjiArai | 0:5b88d5760320 | 68 | #define ERROR_MSG(MSG) printf("[Sec Error] %s\r\n", MSG) |
kenjiArai | 0:5b88d5760320 | 69 | #else |
kenjiArai | 0:5b88d5760320 | 70 | /* FixMe: redirect to secure log area */ |
kenjiArai | 0:5b88d5760320 | 71 | #define ERROR_MSG(MSG) printf("[Sec Error] %s\r\n", MSG) |
kenjiArai | 0:5b88d5760320 | 72 | #endif |
kenjiArai | 0:5b88d5760320 | 73 | |
kenjiArai | 0:5b88d5760320 | 74 | /** |
kenjiArai | 0:5b88d5760320 | 75 | * \brief Get Link Register |
kenjiArai | 0:5b88d5760320 | 76 | * \details Returns the value of the Link Register (LR) |
kenjiArai | 0:5b88d5760320 | 77 | * \return LR value |
kenjiArai | 0:5b88d5760320 | 78 | */ |
kenjiArai | 0:5b88d5760320 | 79 | |
kenjiArai | 0:5b88d5760320 | 80 | __attribute__ ((always_inline)) __STATIC_INLINE uint32_t __get_LR(void) |
kenjiArai | 0:5b88d5760320 | 81 | { |
kenjiArai | 0:5b88d5760320 | 82 | register uint32_t result; |
kenjiArai | 0:5b88d5760320 | 83 | |
kenjiArai | 0:5b88d5760320 | 84 | __ASM volatile ("MOV %0, LR\n" : "=r" (result)); |
kenjiArai | 0:5b88d5760320 | 85 | return result; |
kenjiArai | 0:5b88d5760320 | 86 | } |
kenjiArai | 0:5b88d5760320 | 87 | |
kenjiArai | 0:5b88d5760320 | 88 | __attribute__ ((always_inline)) |
kenjiArai | 0:5b88d5760320 | 89 | __STATIC_INLINE uint32_t __get_active_exc_num(void) |
kenjiArai | 0:5b88d5760320 | 90 | { |
kenjiArai | 0:5b88d5760320 | 91 | IPSR_Type IPSR; |
kenjiArai | 0:5b88d5760320 | 92 | |
kenjiArai | 0:5b88d5760320 | 93 | /* if non-zero, exception is active. NOT banked S/NS */ |
kenjiArai | 0:5b88d5760320 | 94 | IPSR.w = __get_IPSR(); |
kenjiArai | 0:5b88d5760320 | 95 | return IPSR.b.ISR; |
kenjiArai | 0:5b88d5760320 | 96 | } |
kenjiArai | 0:5b88d5760320 | 97 | |
kenjiArai | 0:5b88d5760320 | 98 | __attribute__ ((always_inline)) |
kenjiArai | 0:5b88d5760320 | 99 | __STATIC_INLINE void __set_CONTROL_SPSEL(uint32_t SPSEL) |
kenjiArai | 0:5b88d5760320 | 100 | { |
kenjiArai | 0:5b88d5760320 | 101 | CONTROL_Type ctrl; |
kenjiArai | 0:5b88d5760320 | 102 | |
kenjiArai | 0:5b88d5760320 | 103 | ctrl.w = __get_CONTROL(); |
kenjiArai | 0:5b88d5760320 | 104 | ctrl.b.SPSEL = SPSEL; |
kenjiArai | 0:5b88d5760320 | 105 | __set_CONTROL(ctrl.w); |
kenjiArai | 0:5b88d5760320 | 106 | __ISB(); |
kenjiArai | 0:5b88d5760320 | 107 | } |
kenjiArai | 0:5b88d5760320 | 108 | |
kenjiArai | 0:5b88d5760320 | 109 | #endif /* __SECURE_UTILITIES_H__ */ |