blob: 96251aecc980d8e38ee46ae093677d778af88b4d [file] [log] [blame]
David Hu50711e32019-06-12 18:32:30 +08001/*
Ronald Cron312be682019-09-23 09:27:33 +02002 * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
David Hu50711e32019-06-12 18:32:30 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7#ifndef __TFM_ARCH_H__
8#define __TFM_ARCH_H__
9
10/* This header file collects the architecture related operations. */
11
Ken Liu1d96c132019-12-31 15:51:30 +080012#include <stddef.h>
David Hu50711e32019-06-12 18:32:30 +080013#include <inttypes.h>
Kevin Pengbc5e5aa2019-10-16 10:55:17 +080014#include "tfm_hal_device_header.h"
David Hu50711e32019-06-12 18:32:30 +080015#include "cmsis_compiler.h"
16
Ronald Cron312be682019-09-23 09:27:33 +020017#if defined(__ARM_ARCH_8_1M_MAIN__) || \
18 defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8M_BASE__)
David Hu50711e32019-06-12 18:32:30 +080019#include "tfm_arch_v8m.h"
David Hu40455c92019-07-02 14:31:34 +080020#elif defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_7M__) || \
21 defined(__ARM_ARCH_7EM__)
22#include "tfm_arch_v6m_v7m.h"
David Hu50711e32019-06-12 18:32:30 +080023#else
24#error "Unsupported ARM Architecture."
25#endif
26
27#define XPSR_T32 0x01000000
28
29/* General core state context */
Ken Liu5a2b9052019-08-15 19:03:29 +080030struct tfm_state_context_t {
David Hu50711e32019-06-12 18:32:30 +080031 uint32_t r0;
32 uint32_t r1;
33 uint32_t r2;
34 uint32_t r3;
35 uint32_t r12;
Ken Liu5a2b9052019-08-15 19:03:29 +080036 uint32_t lr;
David Hu50711e32019-06-12 18:32:30 +080037 uint32_t ra;
38 uint32_t xpsr;
39};
40
Summer Qinf68f0de2020-01-14 11:31:50 +080041#define TFM_STATE_RET_VAL(ctx) (((struct tfm_state_context_t *)((ctx)->sp))->r0)
David Hu50711e32019-06-12 18:32:30 +080042
43__attribute__ ((always_inline))
44__STATIC_INLINE void tfm_arch_trigger_pendsv(void)
45{
46 SCB->ICSR = SCB_ICSR_PENDSVSET_Msk;
47}
48
Summer Qin2b8ab7e2020-02-18 13:58:58 +080049#ifdef TFM_MULTI_CORE_TOPOLOGY
50__STATIC_INLINE void tfm_arch_set_pendsv_priority(void)
51{
52 NVIC_SetPriority(PendSV_IRQn, (1 << __NVIC_PRIO_BITS) - 1);
53}
54#else
55__STATIC_INLINE void tfm_arch_set_pendsv_priority(void)
56{
57 /*
58 * Set secure PendSV priority to the lowest in SECURE state.
59 *
60 * IMPORTANT NOTE:
61 *
62 * Although the priority of the secure PendSV must be the lowest possible
63 * among other interrupts in the Secure state, it must be ensured that
64 * PendSV is not preempted nor masked by Non-Secure interrupts to ensure
65 * the integrity of the Secure operation.
66 * When AIRCR.PRIS is set, the Non-Secure execution can act on
67 * FAULTMASK_NS, PRIMASK_NS or BASEPRI_NS register to boost its priority
68 * number up to the value 0x80.
69 * For this reason, set the priority of the PendSV interrupt to the next
70 * priority level configurable on the platform, just below 0x80.
71 */
72 NVIC_SetPriority(PendSV_IRQn, (1 << (__NVIC_PRIO_BITS - 1)) - 1);
73}
74#endif /* TFM_MULTI_CORE_TOPOLOGY */
75
David Hu50711e32019-06-12 18:32:30 +080076/**
77 * \brief Get Link Register
78 * \details Returns the value of the Link Register (LR)
79 * \return LR value
80 */
81__attribute__ ((always_inline)) __STATIC_INLINE uint32_t __get_LR(void)
82{
83 register uint32_t result;
84
85 __ASM volatile ("MOV %0, LR\n" : "=r" (result));
86 return result;
87}
88
89__attribute__ ((always_inline))
90__STATIC_INLINE uint32_t __get_active_exc_num(void)
91{
92 IPSR_Type IPSR;
93
94 /* if non-zero, exception is active. NOT banked S/NS */
95 IPSR.w = __get_IPSR();
96 return IPSR.b.ISR;
97}
98
99__attribute__ ((always_inline))
100__STATIC_INLINE void __set_CONTROL_SPSEL(uint32_t SPSEL)
101{
102 CONTROL_Type ctrl;
103
104 ctrl.w = __get_CONTROL();
105 ctrl.b.SPSEL = SPSEL;
106 __set_CONTROL(ctrl.w);
107 __ISB();
108}
109
110/*
111 * Initialize CPU architecture specific thread context extension
112 */
Summer Qinf68f0de2020-01-14 11:31:50 +0800113void tfm_arch_init_actx(struct tfm_arch_ctx_t *p_actx,
114 uint32_t sp, uint32_t sp_limit);
David Hu50711e32019-06-12 18:32:30 +0800115
David Hu4e165602019-06-12 18:38:31 +0800116/*
117 * Prioritize Secure exceptions
118 */
119void tfm_arch_prioritize_secure_exception(void);
120
Ken Liuce2692d2020-02-11 12:39:36 +0800121/*
122 * Clear float point status.
123 */
124void tfm_arch_clear_fp_status(void);
125
Summer Qinaf3b9e12020-01-13 15:56:36 +0800126void tfm_arch_init_context(struct tfm_arch_ctx_t *p_actx,
127 void *param, uintptr_t pfn,
128 uintptr_t stk_btm, uintptr_t stk_top);
David Hu50711e32019-06-12 18:32:30 +0800129#endif