Zephyr Project API  3.1.0
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_SLOTS >> 3)
36#else
37#define RISCV_PMP_CFG_NUM (CONFIG_PMP_SLOTS >> 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/*
54 * The following structure defines the list of registers that need to be
55 * saved/restored when a context switch occurs.
56 */
57struct _callee_saved {
58 ulong_t sp; /* Stack pointer, (x2 register) */
59 ulong_t ra; /* return address */
60 ulong_t tp; /* thread pointer */
61
62 ulong_t s0; /* saved register/frame pointer */
63 ulong_t s1; /* saved register */
64 ulong_t s2; /* saved register */
65 ulong_t s3; /* saved register */
66 ulong_t s4; /* saved register */
67 ulong_t s5; /* saved register */
68 ulong_t s6; /* saved register */
69 ulong_t s7; /* saved register */
70 ulong_t s8; /* saved register */
71 ulong_t s9; /* saved register */
72 ulong_t s10; /* saved register */
73 ulong_t s11; /* saved register */
74
75#if defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING)
76 uint32_t fcsr; /* Control and status register */
77 RV_FP_TYPE fs0; /* saved floating-point register */
78 RV_FP_TYPE fs1; /* saved floating-point register */
79 RV_FP_TYPE fs2; /* saved floating-point register */
80 RV_FP_TYPE fs3; /* saved floating-point register */
81 RV_FP_TYPE fs4; /* saved floating-point register */
82 RV_FP_TYPE fs5; /* saved floating-point register */
83 RV_FP_TYPE fs6; /* saved floating-point register */
84 RV_FP_TYPE fs7; /* saved floating-point register */
85 RV_FP_TYPE fs8; /* saved floating-point register */
86 RV_FP_TYPE fs9; /* saved floating-point register */
87 RV_FP_TYPE fs10; /* saved floating-point register */
88 RV_FP_TYPE fs11; /* saved floating-point register */
89#endif
90};
91typedef struct _callee_saved _callee_saved_t;
92
93#define PMP_M_MODE_SLOTS 8 /* 8 is plenty enough for m-mode */
94
95struct _thread_arch {
96#ifdef CONFIG_USERSPACE
97 ulong_t priv_stack_start;
98 ulong_t u_mode_pmpaddr_regs[CONFIG_PMP_SLOTS];
99 ulong_t u_mode_pmpcfg_regs[CONFIG_PMP_SLOTS / sizeof(ulong_t)];
100 unsigned int u_mode_pmp_domain_offset;
101 unsigned int u_mode_pmp_end_index;
102 unsigned int u_mode_pmp_update_nr;
103#endif
104#ifdef CONFIG_PMP_STACK_GUARD
105 unsigned int m_mode_pmp_end_index;
106 ulong_t m_mode_pmpaddr_regs[PMP_M_MODE_SLOTS];
107 ulong_t m_mode_pmpcfg_regs[PMP_M_MODE_SLOTS / sizeof(ulong_t)];
108#endif
109};
110
111typedef struct _thread_arch _thread_arch_t;
112
113#endif /* _ASMLANGUAGE */
114
115#endif /* ZEPHYR_INCLUDE_ARCH_RISCV_THREAD_H_ */
#define RV_FP_TYPE
Definition: thread.h:29
#define PMP_M_MODE_SLOTS
Definition: thread.h:93
unsigned long ulong_t
Definition: types.h:18
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
static ZTEST_DMEM int tp
Definition: main.c:62