@@ -5,37 +5,61 @@ use core::alloc::Layout;
5
5
#[ macro_use]
6
6
mod arch {
7
7
macro_rules! save {
8
- ( $reg: expr => $ptr: expr; $pos: expr) => {
9
- concat!( "sw " , $reg, ", 4*" , $pos, "(" , $ptr, ")" )
8
+ ( $reg: ident => $ptr: ident; $pos: expr) => {
9
+ concat!(
10
+ "sw " ,
11
+ stringify!( $reg) ,
12
+ ", 4*" ,
13
+ $pos,
14
+ '(' ,
15
+ stringify!( $ptr) ,
16
+ ')'
17
+ )
10
18
} ;
11
19
}
12
20
13
21
macro_rules! load {
14
- ( $ptr: expr; $pos: expr => $reg: expr) => {
15
- concat!( "lw " , $reg, ", 4*" , $pos, "(" , $ptr, ")" )
16
- } ;
17
-
18
- ( $ptr: expr; $pos: expr => $reg: expr, label: $label: expr) => {
19
- concat!( $label, ":" , load!( $ptr; $pos => $reg) )
22
+ ( $ptr: ident; $pos: expr => $reg: ident) => {
23
+ concat!(
24
+ "lw " ,
25
+ stringify!( $reg) ,
26
+ ", 4*" ,
27
+ $pos,
28
+ '(' ,
29
+ stringify!( $ptr) ,
30
+ ')'
31
+ )
20
32
} ;
21
33
}
22
34
}
23
35
#[ cfg( target_arch = "riscv64" ) ]
24
36
#[ macro_use]
25
37
mod arch {
26
38
macro_rules! save {
27
- ( $reg: expr => $ptr: expr; $pos: expr) => {
28
- concat!( "sd " , $reg, ", 8*" , $pos, '(' , $ptr, ')' )
39
+ ( $reg: ident => $ptr: ident; $pos: expr) => {
40
+ concat!(
41
+ "sd " ,
42
+ stringify!( $reg) ,
43
+ ", 8*" ,
44
+ $pos,
45
+ '(' ,
46
+ stringify!( $ptr) ,
47
+ ')'
48
+ )
29
49
} ;
30
50
}
31
51
32
52
macro_rules! load {
33
- ( $ptr: expr; $pos: expr => $reg: expr) => {
34
- concat!( "ld " , $reg, ", 8*" , $pos, '(' , $ptr, ')' )
35
- } ;
36
-
37
- ( $ptr: expr; $pos: expr => $reg: expr, label: $label: expr) => {
38
- concat!( $label, ':' , load!( $ptr; $pos => $reg) )
53
+ ( $ptr: ident; $pos: expr => $reg: ident) => {
54
+ concat!(
55
+ "ld " ,
56
+ stringify!( $reg) ,
57
+ ", 8*" ,
58
+ $pos,
59
+ '(' ,
60
+ stringify!( $ptr) ,
61
+ ')'
62
+ )
39
63
} ;
40
64
}
41
65
}
@@ -103,17 +127,17 @@ pub unsafe extern "C" fn trap_entry() {
103
127
// 换栈
104
128
exchange!( ) ,
105
129
// 加载上下文指针
106
- save!( "a0" => "sp" ; 2 ) ,
107
- load!( "sp" ; 0 => "a0" ) ,
130
+ save!( a0 => sp ; 2 ) ,
131
+ load!( sp ; 0 => a0 ) ,
108
132
// 保存尽量少的寄存器
109
- save!( "ra" => "a0" ; 0 ) ,
110
- save!( "t0" => "a0" ; 1 ) ,
111
- save!( "t1" => "a0" ; 2 ) ,
112
- save!( "t2" => "a0" ; 3 ) ,
113
- save!( "t3" => "a0" ; 4 ) ,
114
- save!( "t4" => "a0" ; 5 ) ,
115
- save!( "t5" => "a0" ; 6 ) ,
116
- save!( "t6" => "a0" ; 7 ) ,
133
+ save!( ra => a0 ; 0 ) ,
134
+ save!( t0 => a0 ; 1 ) ,
135
+ save!( t1 => a0 ; 2 ) ,
136
+ save!( t2 => a0 ; 3 ) ,
137
+ save!( t3 => a0 ; 4 ) ,
138
+ save!( t4 => a0 ; 5 ) ,
139
+ save!( t5 => a0 ; 6 ) ,
140
+ save!( t6 => a0 ; 7 ) ,
117
141
// 调用快速路径函数
118
142
//
119
143
// | reg | position
@@ -132,10 +156,10 @@ pub unsafe extern "C" fn trap_entry() {
132
156
// >
133
157
// > 若要切换上下文,在快速路径设置 gp/tp/sscratch/sepc 和 sstatus。
134
158
"mv a0, sp" ,
135
- load!( "sp" ; 1 => "ra" ) ,
159
+ load!( sp ; 1 => ra ) ,
136
160
"jalr ra" ,
137
- // 加载上下文指针
138
- load!( "sp" ; 0 => "a1" , label : 0 ) ,
161
+ "0:" , // 加载上下文指针
162
+ load!( sp ; 0 => a1 ) ,
139
163
// 0:设置少量参数寄存器
140
164
" beqz a0, 0f" ,
141
165
// 1:设置所有参数寄存器
@@ -151,18 +175,18 @@ pub unsafe extern "C" fn trap_entry() {
151
175
beqz a0, 3f
152
176
" ,
153
177
// 4:完整路径
154
- save!( "s0" => "a1" ; 16 ) ,
155
- save!( "s1" => "a1" ; 17 ) ,
156
- save!( "s2" => "a1" ; 18 ) ,
157
- save!( "s3" => "a1" ; 19 ) ,
158
- save!( "s4" => "a1" ; 20 ) ,
159
- save!( "s5" => "a1" ; 21 ) ,
160
- save!( "s6" => "a1" ; 22 ) ,
161
- save!( "s7" => "a1" ; 23 ) ,
162
- save!( "s8" => "a1" ; 24 ) ,
163
- save!( "s9" => "a1" ; 25 ) ,
164
- save!( " s10" => "a1" ; 26 ) ,
165
- save!( " s11" => "a1" ; 27 ) ,
178
+ save!( s0 => a1 ; 16 ) ,
179
+ save!( s1 => a1 ; 17 ) ,
180
+ save!( s2 => a1 ; 18 ) ,
181
+ save!( s3 => a1 ; 19 ) ,
182
+ save!( s4 => a1 ; 20 ) ,
183
+ save!( s5 => a1 ; 21 ) ,
184
+ save!( s6 => a1 ; 22 ) ,
185
+ save!( s7 => a1 ; 23 ) ,
186
+ save!( s8 => a1 ; 24 ) ,
187
+ save!( s9 => a1 ; 25 ) ,
188
+ save!( s10 => a1 ; 26 ) ,
189
+ save!( s11 => a1 ; 27 ) ,
166
190
// 调用完整路径函数
167
191
//
168
192
// | reg | position
@@ -176,41 +200,41 @@ pub unsafe extern "C" fn trap_entry() {
176
200
// >
177
201
// > 若要切换上下文,在完整路径设置 gp/tp/sscratch/sepc 和 sstatus。
178
202
"mv a0, sp" ,
179
- load!( "sp" ; 2 => "ra" ) ,
203
+ load!( sp ; 2 => ra ) ,
180
204
"jalr ra" ,
181
205
"j 0b" ,
182
- // 设置所有寄存器
183
- load!( "a1" ; 16 => "s0" , label : 3 ) ,
184
- load!( "a1" ; 17 => "s1" ) ,
185
- load!( "a1" ; 18 => "s2" ) ,
186
- load!( "a1" ; 19 => "s3" ) ,
187
- load!( "a1" ; 20 => "s4" ) ,
188
- load!( "a1" ; 21 => "s5" ) ,
189
- load!( "a1" ; 22 => "s6" ) ,
190
- load!( "a1" ; 23 => "s7" ) ,
191
- load!( "a1" ; 24 => "s8" ) ,
192
- load!( "a1" ; 25 => "s9" ) ,
193
- load!( "a1" ; 26 => " s10" ) ,
194
- load!( "a1" ; 27 => " s11" ) ,
195
- // 设置所有调用者寄存器
196
- load!( "a1" ; 0 => "ra" , label : 2 ) ,
197
- load!( "a1" ; 1 => "t0" ) ,
198
- load!( "a1" ; 2 => "t1" ) ,
199
- load!( "a1" ; 3 => "t2" ) ,
200
- load!( "a1" ; 4 => "t3" ) ,
201
- load!( "a1" ; 5 => "t4" ) ,
202
- load!( "a1" ; 6 => "t5" ) ,
203
- load!( "a1" ; 7 => "t6" ) ,
204
- // 设置所有参数寄存器
205
- load!( "a1" ; 10 => "a2" , label : 1 ) ,
206
- load!( "a1" ; 11 => "a3" ) ,
207
- load!( "a1" ; 12 => "a4" ) ,
208
- load!( "a1" ; 13 => "a5" ) ,
209
- load!( "a1" ; 14 => "a6" ) ,
210
- load!( "a1" ; 15 => "a7" ) ,
211
- // 设置少量参数寄存器
212
- load!( "a1" ; 8 => "a0" , label : 0 ) ,
213
- load!( "a1" ; 9 => "a1" ) ,
206
+ "3:" , // 设置所有寄存器
207
+ load!( a1 ; 16 => s0 ) ,
208
+ load!( a1 ; 17 => s1 ) ,
209
+ load!( a1 ; 18 => s2 ) ,
210
+ load!( a1 ; 19 => s3 ) ,
211
+ load!( a1 ; 20 => s4 ) ,
212
+ load!( a1 ; 21 => s5 ) ,
213
+ load!( a1 ; 22 => s6 ) ,
214
+ load!( a1 ; 23 => s7 ) ,
215
+ load!( a1 ; 24 => s8 ) ,
216
+ load!( a1 ; 25 => s9 ) ,
217
+ load!( a1 ; 26 => s10) ,
218
+ load!( a1 ; 27 => s11) ,
219
+ "2:" , // 设置所有调用者寄存器
220
+ load!( a1 ; 0 => ra ) ,
221
+ load!( a1 ; 1 => t0 ) ,
222
+ load!( a1 ; 2 => t1 ) ,
223
+ load!( a1 ; 3 => t2 ) ,
224
+ load!( a1 ; 4 => t3 ) ,
225
+ load!( a1 ; 5 => t4 ) ,
226
+ load!( a1 ; 6 => t5 ) ,
227
+ load!( a1 ; 7 => t6 ) ,
228
+ "1:" , // 设置所有参数寄存器
229
+ load!( a1 ; 10 => a2 ) ,
230
+ load!( a1 ; 11 => a3 ) ,
231
+ load!( a1 ; 12 => a4 ) ,
232
+ load!( a1 ; 13 => a5 ) ,
233
+ load!( a1 ; 14 => a6 ) ,
234
+ load!( a1 ; 15 => a7 ) ,
235
+ "0:" , // 设置少量参数寄存器
236
+ load!( a1 ; 8 => a0 ) ,
237
+ load!( a1 ; 9 => a1 ) ,
214
238
exchange!( ) ,
215
239
r#return!( ) ,
216
240
options( noreturn) ,
0 commit comments