1 /*
2  * Copyright (c) 2017 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  * @brief Per-arch thread definition
10  *
11  * This file contains definitions for
12  *
13  *  struct _thread_arch
14  *  struct _callee_saved
15   *
16  * necessary to instantiate instances of struct k_thread.
17  */
18 
19 #ifndef ZEPHYR_INCLUDE_ARCH_ARM_THREAD_H_
20 #define ZEPHYR_INCLUDE_ARCH_ARM_THREAD_H_
21 
22 #ifndef _ASMLANGUAGE
23 #include <zephyr/types.h>
24 
25 struct _callee_saved {
26 	uint32_t v1;  /* r4 */
27 	uint32_t v2;  /* r5 */
28 	uint32_t v3;  /* r6 */
29 	uint32_t v4;  /* r7 */
30 	uint32_t v5;  /* r8 */
31 	uint32_t v6;  /* r9 */
32 	uint32_t v7;  /* r10 */
33 	uint32_t v8;  /* r11 */
34 	uint32_t psp; /* r13 */
35 #ifdef CONFIG_USE_SWITCH
36 	uint32_t lr;  /* lr */
37 #endif
38 };
39 
40 typedef struct _callee_saved _callee_saved_t;
41 
42 #if defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING)
43 struct _preempt_float {
44 	float  s16;
45 	float  s17;
46 	float  s18;
47 	float  s19;
48 	float  s20;
49 	float  s21;
50 	float  s22;
51 	float  s23;
52 	float  s24;
53 	float  s25;
54 	float  s26;
55 	float  s27;
56 	float  s28;
57 	float  s29;
58 	float  s30;
59 	float  s31;
60 };
61 #endif
62 
63 struct _thread_arch {
64 
65 	/* interrupt locking key */
66 	uint32_t basepri;
67 
68 	/* r0 in stack frame cannot be written to reliably */
69 	uint32_t swap_return_value;
70 
71 #if defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING)
72 	/*
73 	 * No cooperative floating point register set structure exists for
74 	 * the Cortex-M as it automatically saves the necessary registers
75 	 * in its exception stack frame.
76 	 */
77 	struct _preempt_float  preempt_float;
78 #endif
79 
80 #if defined(CONFIG_CPU_AARCH32_CORTEX_A) || defined(CONFIG_CPU_AARCH32_CORTEX_R)
81 	int8_t exception_depth;
82 #endif
83 
84 #if defined(CONFIG_ARM_STORE_EXC_RETURN) || defined(CONFIG_USERSPACE)
85 	/*
86 	 * Status variable holding several thread status flags
87 	 * as follows:
88 	 *
89 	 * byte 0
90 	 * +-bits 4-7-----bit-3----------bit-2--------bit-1---+----bit-0------+
91 	 * :          |             |              |          |               |
92 	 * : reserved |<Guard FLOAT>|   reserved   | reserved |  <priv mode>  |
93 	 * :   bits   |             |              |          | CONTROL.nPRIV |
94 	 * +------------------------------------------------------------------+
95 	 *
96 	 * byte 1
97 	 * +----------------------------bits 8-15-----------------------------+
98 	 * :              Least significant byte of EXC_RETURN                |
99 	 * : bit 15| bit 14| bit 13 | bit 12| bit 11 | bit 10 | bit 9 | bit 8 |
100 	 * :  Res  |   S   |  DCRS  | FType |  Mode  | SPSel  |  Res  |  ES   |
101 	 * +------------------------------------------------------------------+
102 	 *
103 	 * Bit 0: thread's current privileged mode (Supervisor or User mode)
104 	 *        Mirrors CONTROL.nPRIV flag.
105 	 * Bit 2: Deprecated in favor of FType. Note: FType = !CONTROL.FPCA.
106 	 *        indicating whether the thread has an active FP context.
107 	 *        Mirrors CONTROL.FPCA flag.
108 	 * Bit 3: indicating whether the thread is applying the long (FLOAT)
109 	 *        or the default MPU stack guard size.
110 	 *
111 	 * Bits 8-15: Least significant octet of the EXC_RETURN value when a
112 	 *            thread is switched-out. The value is copied from LR when
113 	 *            entering the PendSV handler. When the thread is
114 	 *            switched in again, the value is restored to LR before
115 	 *            exiting the PendSV handler.
116 	 */
117 	union {
118 		uint32_t mode;
119 
120 #if defined(CONFIG_ARM_STORE_EXC_RETURN)
121 		struct {
122 			uint8_t mode_bits;
123 			uint8_t mode_exc_return;
124 			uint16_t mode_reserved2;
125 		};
126 #endif
127 	};
128 
129 #if defined(CONFIG_USERSPACE)
130 	uint32_t priv_stack_start;
131 #if defined(CONFIG_CPU_AARCH32_CORTEX_R)
132 	uint32_t priv_stack_end;
133 	uint32_t sp_usr;
134 #endif
135 #endif
136 #endif
137 };
138 
139 #if defined(CONFIG_FPU_SHARING) && defined(CONFIG_MPU_STACK_GUARD)
140 #define Z_ARM_MODE_MPU_GUARD_FLOAT_Msk (1 << 3)
141 #endif
142 typedef struct _thread_arch _thread_arch_t;
143 
144 #endif /* _ASMLANGUAGE */
145 
146 #endif /* ZEPHYR_INCLUDE_ARCH_ARM_THREAD_H_ */
147