Line data Source code
1 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_ */
|