1 /*
2  * Copyright (c) 2016 Jean-Paul Etienne <fractalclone@gmail.com>
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  * @brief RISCV32 kernel structure member offset definition file
10  *
11  * This module is responsible for the generation of the absolute symbols whose
12  * value represents the member offsets for various RISCV32 kernel
13  * structures.
14  */
15 
16 #include <zephyr/arch/exception.h>
17 #include <zephyr/kernel.h>
18 #include <kernel_arch_data.h>
19 #include <gen_offset.h>
20 
21 #ifdef CONFIG_RISCV_SOC_CONTEXT_SAVE
22 #include <soc_context.h>
23 #endif
24 #ifdef CONFIG_RISCV_SOC_OFFSETS
25 #include <soc_offsets.h>
26 #endif
27 
28 #include <kernel_offsets.h>
29 
30 /* struct _callee_saved member offsets */
31 GEN_OFFSET_SYM(_callee_saved_t, sp);
32 GEN_OFFSET_SYM(_callee_saved_t, ra);
33 GEN_OFFSET_SYM(_callee_saved_t, s0);
34 GEN_OFFSET_SYM(_callee_saved_t, s1);
35 #if !defined(CONFIG_RISCV_ISA_RV32E)
36 GEN_OFFSET_SYM(_callee_saved_t, s2);
37 GEN_OFFSET_SYM(_callee_saved_t, s3);
38 GEN_OFFSET_SYM(_callee_saved_t, s4);
39 GEN_OFFSET_SYM(_callee_saved_t, s5);
40 GEN_OFFSET_SYM(_callee_saved_t, s6);
41 GEN_OFFSET_SYM(_callee_saved_t, s7);
42 GEN_OFFSET_SYM(_callee_saved_t, s8);
43 GEN_OFFSET_SYM(_callee_saved_t, s9);
44 GEN_OFFSET_SYM(_callee_saved_t, s10);
45 GEN_OFFSET_SYM(_callee_saved_t, s11);
46 #endif /* !CONFIG_RISCV_ISA_RV32E */
47 
48 #if defined(CONFIG_FPU_SHARING)
49 
50 GEN_OFFSET_SYM(z_riscv_fp_context_t, fa0);
51 GEN_OFFSET_SYM(z_riscv_fp_context_t, fa1);
52 GEN_OFFSET_SYM(z_riscv_fp_context_t, fa2);
53 GEN_OFFSET_SYM(z_riscv_fp_context_t, fa3);
54 GEN_OFFSET_SYM(z_riscv_fp_context_t, fa4);
55 GEN_OFFSET_SYM(z_riscv_fp_context_t, fa5);
56 GEN_OFFSET_SYM(z_riscv_fp_context_t, fa6);
57 GEN_OFFSET_SYM(z_riscv_fp_context_t, fa7);
58 
59 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft0);
60 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft1);
61 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft2);
62 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft3);
63 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft4);
64 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft5);
65 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft6);
66 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft7);
67 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft8);
68 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft9);
69 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft10);
70 GEN_OFFSET_SYM(z_riscv_fp_context_t, ft11);
71 
72 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs0);
73 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs1);
74 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs2);
75 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs3);
76 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs4);
77 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs5);
78 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs6);
79 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs7);
80 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs8);
81 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs9);
82 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs10);
83 GEN_OFFSET_SYM(z_riscv_fp_context_t, fs11);
84 
85 GEN_OFFSET_SYM(z_riscv_fp_context_t, fcsr);
86 
87 GEN_OFFSET_SYM(_thread_arch_t, exception_depth);
88 
89 #endif /* CONFIG_FPU_SHARING */
90 
91 /* esf member offsets */
92 GEN_OFFSET_STRUCT(arch_esf, ra);
93 GEN_OFFSET_STRUCT(arch_esf, t0);
94 GEN_OFFSET_STRUCT(arch_esf, t1);
95 GEN_OFFSET_STRUCT(arch_esf, t2);
96 GEN_OFFSET_STRUCT(arch_esf, a0);
97 GEN_OFFSET_STRUCT(arch_esf, a1);
98 GEN_OFFSET_STRUCT(arch_esf, a2);
99 GEN_OFFSET_STRUCT(arch_esf, a3);
100 GEN_OFFSET_STRUCT(arch_esf, a4);
101 GEN_OFFSET_STRUCT(arch_esf, a5);
102 
103 #if !defined(CONFIG_RISCV_ISA_RV32E)
104 GEN_OFFSET_STRUCT(arch_esf, t3);
105 GEN_OFFSET_STRUCT(arch_esf, t4);
106 GEN_OFFSET_STRUCT(arch_esf, t5);
107 GEN_OFFSET_STRUCT(arch_esf, t6);
108 GEN_OFFSET_STRUCT(arch_esf, a6);
109 GEN_OFFSET_STRUCT(arch_esf, a7);
110 #endif /* !CONFIG_RISCV_ISA_RV32E */
111 
112 GEN_OFFSET_STRUCT(arch_esf, mepc);
113 GEN_OFFSET_STRUCT(arch_esf, mstatus);
114 
115 GEN_OFFSET_STRUCT(arch_esf, s0);
116 
117 #ifdef CONFIG_USERSPACE
118 GEN_OFFSET_STRUCT(arch_esf, sp);
119 #endif
120 
121 #ifdef CONFIG_EXTRA_EXCEPTION_INFO
122 GEN_OFFSET_STRUCT(arch_esf, csf);
123 #endif /* CONFIG_EXTRA_EXCEPTION_INFO */
124 
125 #if defined(CONFIG_RISCV_SOC_CONTEXT_SAVE)
126 GEN_OFFSET_STRUCT(arch_esf, soc_context);
127 #endif
128 #if defined(CONFIG_RISCV_SOC_OFFSETS)
129 GEN_SOC_OFFSET_SYMS();
130 #endif
131 
132 GEN_ABSOLUTE_SYM(__struct_arch_esf_SIZEOF, sizeof(struct arch_esf));
133 
134 #ifdef CONFIG_EXCEPTION_DEBUG
135 GEN_ABSOLUTE_SYM(__callee_saved_t_SIZEOF, ROUND_UP(sizeof(_callee_saved_t), ARCH_STACK_PTR_ALIGN));
136 #endif /* CONFIG_EXCEPTION_DEBUG */
137 
138 #ifdef CONFIG_USERSPACE
139 GEN_OFFSET_SYM(_cpu_arch_t, user_exc_sp);
140 GEN_OFFSET_SYM(_cpu_arch_t, user_exc_tmp0);
141 GEN_OFFSET_SYM(_cpu_arch_t, user_exc_tmp1);
142 #endif
143 
144 GEN_ABS_SYM_END
145