Zephyr Project API 4.2.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
thread.h
Go to the documentation of this file.
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
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
26struct _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
41typedef struct _callee_saved _callee_saved_t;
42
43#if defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING)
44struct _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)
65struct 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
73struct _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
156typedef struct _thread_arch _thread_arch_t;
157
158#endif /* _ASMLANGUAGE */
159
160#endif /* ZEPHYR_INCLUDE_ARCH_ARM_THREAD_H_ */
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
__INT8_TYPE__ int8_t
Definition stdint.h:72