1 /*
2  * Copyright (c) 2016 Jean-Paul Etienne <fractalclone@gmail.com>
3  * Copyright (c) 2018 Foundries.io Ltd
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 /**
9  * @file
10  * @brief RISCV public exception handling
11  *
12  * RISCV-specific kernel exception handling interface.
13  */
14 
15 #ifndef ZEPHYR_INCLUDE_ARCH_RISCV_EXCEPTION_H_
16 #define ZEPHYR_INCLUDE_ARCH_RISCV_EXCEPTION_H_
17 
18 #ifndef _ASMLANGUAGE
19 #include <zephyr/types.h>
20 #include <zephyr/toolchain.h>
21 
22 #ifdef CONFIG_RISCV_SOC_CONTEXT_SAVE
23 #include <soc_context.h>
24 #endif
25 
26 #ifdef CONFIG_RISCV_SOC_HAS_ISR_STACKING
27 #include <soc_isr_stacking.h>
28 #endif
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 /*
35  * The name of the structure which contains soc-specific state, if
36  * any, as well as the soc_esf_t typedef below, are part of the RISC-V
37  * arch API.
38  *
39  * The contents of the struct are provided by a SOC-specific
40  * definition in soc_context.h.
41  */
42 #ifdef CONFIG_RISCV_SOC_CONTEXT_SAVE
43 struct soc_esf {
44 	SOC_ESF_MEMBERS;
45 };
46 #endif
47 
48 #ifdef CONFIG_EXTRA_EXCEPTION_INFO
49 /* Forward declaration */
50 struct _callee_saved;
51 typedef struct _callee_saved _callee_saved_t;
52 #endif /* CONFIG_EXTRA_EXCEPTION_INFO */
53 
54 #if defined(CONFIG_RISCV_SOC_HAS_ISR_STACKING)
55 	SOC_ISR_STACKING_ESF_DECLARE;
56 #else
57 struct arch_esf {
58 	unsigned long ra;		/* return address */
59 
60 	unsigned long t0;		/* Caller-saved temporary register */
61 	unsigned long t1;		/* Caller-saved temporary register */
62 	unsigned long t2;		/* Caller-saved temporary register */
63 #if !defined(CONFIG_RISCV_ISA_RV32E)
64 	unsigned long t3;		/* Caller-saved temporary register */
65 	unsigned long t4;		/* Caller-saved temporary register */
66 	unsigned long t5;		/* Caller-saved temporary register */
67 	unsigned long t6;		/* Caller-saved temporary register */
68 #endif /* !CONFIG_RISCV_ISA_RV32E */
69 
70 	unsigned long a0;		/* function argument/return value */
71 	unsigned long a1;		/* function argument */
72 	unsigned long a2;		/* function argument */
73 	unsigned long a3;		/* function argument */
74 	unsigned long a4;		/* function argument */
75 	unsigned long a5;		/* function argument */
76 #if !defined(CONFIG_RISCV_ISA_RV32E)
77 	unsigned long a6;		/* function argument */
78 	unsigned long a7;		/* function argument */
79 #endif /* !CONFIG_RISCV_ISA_RV32E */
80 
81 	unsigned long mepc;		/* machine exception program counter */
82 	unsigned long mstatus;	/* machine status register */
83 
84 	unsigned long s0;		/* callee-saved s0 */
85 
86 #ifdef CONFIG_USERSPACE
87 	unsigned long sp;		/* preserved (user or kernel) stack pointer */
88 #endif
89 
90 #ifdef CONFIG_EXTRA_EXCEPTION_INFO
91 	_callee_saved_t *csf;		/* pointer to callee-saved-registers */
92 #endif /* CONFIG_EXTRA_EXCEPTION_INFO */
93 
94 #ifdef CONFIG_RISCV_SOC_CONTEXT_SAVE
95 	struct soc_esf soc_context;
96 #endif
97 } __aligned(16);
98 #endif /* CONFIG_RISCV_SOC_HAS_ISR_STACKING */
99 
100 #ifdef CONFIG_RISCV_SOC_CONTEXT_SAVE
101 typedef struct soc_esf soc_esf_t;
102 #endif
103 
104 #ifdef __cplusplus
105 }
106 #endif
107 
108 #endif /* _ASMLANGUAGE */
109 
110 #endif /* ZEPHYR_INCLUDE_ARCH_RISCV_EXCEPTION_H_ */
111