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