Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
thread.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
19#ifndef ZEPHYR_INCLUDE_ARCH_RISCV_THREAD_H_
20#define ZEPHYR_INCLUDE_ARCH_RISCV_THREAD_H_
21
22#ifndef _ASMLANGUAGE
23#include <zephyr/types.h>
24
25#if !defined(RV_FP_TYPE) && defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING)
26#ifdef CONFIG_CPU_HAS_FPU_DOUBLE_PRECISION
27#define RV_FP_TYPE uint64_t
28#else
29#define RV_FP_TYPE uint32_t
30#endif
31#endif
32
33#ifdef CONFIG_RISCV_PMP
34#ifdef CONFIG_64BIT
35#define RISCV_PMP_CFG_NUM (CONFIG_PMP_SLOT >> 3)
36#else
37#define RISCV_PMP_CFG_NUM (CONFIG_PMP_SLOT >> 2)
38#endif
39#endif
40
41#ifdef CONFIG_PMP_STACK_GUARD
42/*
43 * PMP entries:
44 * (1 for interrupt stack guard: None)
45 * 4 for stacks guard: None
46 * 1 for RAM: RW
47 * 1 for other address space: RWX
48 */
49#define PMP_REGION_NUM_FOR_STACK_GUARD 6
50#define PMP_CFG_CSR_NUM_FOR_STACK_GUARD 2
51#endif /* CONFIG_PMP_STACK_GUARD */
52
53#ifdef CONFIG_PMP_POWER_OF_TWO_ALIGNMENT
54#ifdef CONFIG_USERSPACE
55#ifdef CONFIG_PMP_STACK_GUARD
56/*
57 * 1 for interrupt stack guard: None
58 * 1 for core state: R
59 * 1 for program and read only data: RX
60 * 1 for user thread stack: RW
61 */
62#define PMP_REGION_NUM_FOR_U_THREAD 4
63#else /* CONFIG_PMP_STACK_GUARD */
64/*
65 * 1 for core state: R
66 * 1 for program and read only data: RX
67 * 1 for user thread stack: RW
68 */
69#define PMP_REGION_NUM_FOR_U_THREAD 3
70#endif /* CONFIG_PMP_STACK_GUARD */
71#define PMP_MAX_DYNAMIC_REGION (CONFIG_PMP_SLOT - PMP_REGION_NUM_FOR_U_THREAD)
72#endif /* CONFIG_USERSPACE */
73
74#else /* CONFIG_PMP_POWER_OF_TWO_ALIGNMENT */
75
76#ifdef CONFIG_USERSPACE
77#ifdef CONFIG_PMP_STACK_GUARD
78/*
79 * 1 for interrupt stack guard: None
80 * 1 for core state: R
81 * 2 for program and read only data: RX
82 * 2 for user thread stack: RW
83 */
84#define PMP_REGION_NUM_FOR_U_THREAD 6
85#else /* CONFIG_PMP_STACK_GUARD */
86/*
87 * 1 for core state: R
88 * 2 for program and read only data: RX
89 * 2 for user thread stack: RW
90 */
91#define PMP_REGION_NUM_FOR_U_THREAD 5
92#endif /* CONFIG_PMP_STACK_GUARD */
93#define PMP_MAX_DYNAMIC_REGION ((CONFIG_PMP_SLOT - \
94 PMP_REGION_NUM_FOR_U_THREAD) >> 1)
95#endif /* CONFIG_USERSPACE */
96#endif /* CONFIG_PMP_POWER_OF_TWO_ALIGNMENT */
97
98/*
99 * The following structure defines the list of registers that need to be
100 * saved/restored when a cooperative context switch occurs.
101 */
102struct _callee_saved {
103 ulong_t sp; /* Stack pointer, (x2 register) */
104
105 ulong_t s0; /* saved register/frame pointer */
106 ulong_t s1; /* saved register */
107 ulong_t s2; /* saved register */
108 ulong_t s3; /* saved register */
109 ulong_t s4; /* saved register */
110 ulong_t s5; /* saved register */
111 ulong_t s6; /* saved register */
112 ulong_t s7; /* saved register */
113 ulong_t s8; /* saved register */
114 ulong_t s9; /* saved register */
115 ulong_t s10; /* saved register */
116 ulong_t s11; /* saved register */
117
118#if defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING)
119 uint32_t fcsr; /* Control and status register */
120 RV_FP_TYPE fs0; /* saved floating-point register */
121 RV_FP_TYPE fs1; /* saved floating-point register */
122 RV_FP_TYPE fs2; /* saved floating-point register */
123 RV_FP_TYPE fs3; /* saved floating-point register */
124 RV_FP_TYPE fs4; /* saved floating-point register */
125 RV_FP_TYPE fs5; /* saved floating-point register */
126 RV_FP_TYPE fs6; /* saved floating-point register */
127 RV_FP_TYPE fs7; /* saved floating-point register */
128 RV_FP_TYPE fs8; /* saved floating-point register */
129 RV_FP_TYPE fs9; /* saved floating-point register */
130 RV_FP_TYPE fs10; /* saved floating-point register */
131 RV_FP_TYPE fs11; /* saved floating-point register */
132#endif
133};
134typedef struct _callee_saved _callee_saved_t;
135
136struct _thread_arch {
137 uint32_t swap_return_value; /* Return value of z_swap() */
138
139#ifdef CONFIG_PMP_STACK_GUARD
140 ulong_t s_pmpcfg[PMP_CFG_CSR_NUM_FOR_STACK_GUARD];
141 ulong_t s_pmpaddr[PMP_REGION_NUM_FOR_STACK_GUARD];
142#endif
143
144#ifdef CONFIG_USERSPACE
145 ulong_t priv_stack_start;
146 ulong_t user_sp;
147 ulong_t unfinished_syscall;
148 ulong_t u_pmpcfg[RISCV_PMP_CFG_NUM];
149 ulong_t u_pmpaddr[CONFIG_PMP_SLOT];
150#endif
151};
152
153typedef struct _thread_arch _thread_arch_t;
154
155#endif /* _ASMLANGUAGE */
156
157#endif /* ZEPHYR_INCLUDE_ARCH_RISCV_THREAD_H_ */
#define RV_FP_TYPE
Definition: thread.h:29
unsigned long ulong_t
Definition: types.h:18
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60