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