mbed-os5 only for TYBLE16
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
Diff: components/TARGET_PSA/TARGET_TFM/COMPONENT_SPE/secure_fw/core/secure_utilities.h
- Revision:
- 0:5b88d5760320
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/TARGET_PSA/TARGET_TFM/COMPONENT_SPE/secure_fw/core/secure_utilities.h Tue Dec 17 23:23:45 2019 +0000 @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2017-2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef __SECURE_UTILITIES_H__ +#define __SECURE_UTILITIES_H__ + +#include <stdio.h> +#include "cmsis_compiler.h" +#include "tfm_svc.h" + +#define EXC_RETURN_INDICATOR (0xF << 28) +#define EXC_RETURN_SECURITY_STACK_STATUS_MASK (0x3 << 5) +#define EXC_RETURN_SECURE_STACK (1 << 6) +#define EXC_RETURN_FPU_FRAME_BASIC (1 << 4) +#define EXC_RETURN_MODE_THREAD (1 << 3) +#define EXC_RETURN_STACK_PROCESS (1 << 2) +#define EXC_RETURN_EXC_SECURE (1) + +#define EXC_NUM_THREAD_MODE (0) +#define EXC_NUM_SVCALL (11) +#define EXC_NUM_PENDSV (14) +#define EXC_NUM_SYSTICK (15) + +#define printf(...) + +/* Disable NS exceptions by setting NS PRIMASK to 1 */ +#define TFM_NS_EXC_DISABLE() __TZ_set_PRIMASK_NS(1) +/* Enable NS exceptions by setting NS PRIMASK to 0 */ +#define TFM_NS_EXC_ENABLE() __TZ_set_PRIMASK_NS(0) + +struct tfm_exc_stack_t { + uint32_t R0; + uint32_t R1; + uint32_t R2; + uint32_t R3; + uint32_t R12; + uint32_t LR; + uint32_t RetAddr; + uint32_t XPSR; +}; + +#ifdef TFM_CORE_DEBUG +#define LOG_MSG_HDLR(MSG) printf("[Sec Handler] %s\r\n", MSG) +#else +/* FixMe: redirect to secure log area */ +#define LOG_MSG_HDLR(MSG) printf("[Sec Handler] %s\r\n", MSG) +#endif + +#define LOG_MSG_THR(MSG) \ + __ASM volatile("MOV r0, %0\n" \ + "SVC %1\n" \ + : : "r" (MSG), "I" (TFM_SVC_PRINT)) + +#define LOG_MSG(MSG) \ + do { \ + if (__get_active_exc_num()) { \ + LOG_MSG_HDLR(MSG); \ + } else { \ + LOG_MSG_THR(MSG); \ + } \ + } while (0) + +#ifdef TFM_CORE_DEBUG +#define ERROR_MSG(MSG) printf("[Sec Error] %s\r\n", MSG) +#else +/* FixMe: redirect to secure log area */ +#define ERROR_MSG(MSG) printf("[Sec Error] %s\r\n", MSG) +#endif + +/** + * \brief Get Link Register + * \details Returns the value of the Link Register (LR) + * \return LR value + */ + +__attribute__ ((always_inline)) __STATIC_INLINE uint32_t __get_LR(void) +{ + register uint32_t result; + + __ASM volatile ("MOV %0, LR\n" : "=r" (result)); + return result; +} + +__attribute__ ((always_inline)) +__STATIC_INLINE uint32_t __get_active_exc_num(void) +{ + IPSR_Type IPSR; + + /* if non-zero, exception is active. NOT banked S/NS */ + IPSR.w = __get_IPSR(); + return IPSR.b.ISR; +} + +__attribute__ ((always_inline)) +__STATIC_INLINE void __set_CONTROL_SPSEL(uint32_t SPSEL) +{ + CONTROL_Type ctrl; + + ctrl.w = __get_CONTROL(); + ctrl.b.SPSEL = SPSEL; + __set_CONTROL(ctrl.w); + __ISB(); +} + +#endif /* __SECURE_UTILITIES_H__ */