@@ -111,137 +111,139 @@ impl FlowContext {
111
111
#[ naked]
112
112
pub unsafe extern "C" fn reuse_stack_for_trap ( ) {
113
113
const LAYOUT : Layout = Layout :: new :: < TrapHandler > ( ) ;
114
- core:: arch:: asm!(
115
- " addi sp, sp, {size}
114
+ unsafe {
115
+ core:: arch:: naked_asm!(
116
+ " addi sp, sp, {size}
116
117
andi sp, sp, {mask}
117
118
ret
118
119
" ,
119
- size = const -( LAYOUT . size( ) as isize ) ,
120
- mask = const !( LAYOUT . align( ) as isize - 1 ) ,
121
- options ( noreturn )
122
- )
120
+ size = const -( LAYOUT . size( ) as isize ) ,
121
+ mask = const !( LAYOUT . align( ) as isize - 1 ) ,
122
+ )
123
+ }
123
124
}
124
125
125
126
/// # Safety
126
127
///
127
128
/// See [proto](crate::hal::doc::trap_entry).
128
129
#[ naked]
129
130
pub unsafe extern "C" fn trap_entry ( ) {
130
- core:: arch:: asm!(
131
- ".align 2" ,
132
- // 换栈
133
- exchange!( ) ,
134
- // 加载上下文指针
135
- save!( a0 => sp[ 2 ] ) ,
136
- load!( sp[ 0 ] => a0) ,
137
- // 保存尽量少的寄存器
138
- save!( ra => a0[ 0 ] ) ,
139
- save!( t0 => a0[ 1 ] ) ,
140
- save!( t1 => a0[ 2 ] ) ,
141
- save!( t2 => a0[ 3 ] ) ,
142
- save!( t3 => a0[ 4 ] ) ,
143
- save!( t4 => a0[ 5 ] ) ,
144
- save!( t5 => a0[ 6 ] ) ,
145
- save!( t6 => a0[ 7 ] ) ,
146
- // 调用快速路径函数
147
- //
148
- // | reg | position
149
- // | ------ | -
150
- // | ra | `TrapHandler.context`
151
- // | t0-t6 | `TrapHandler.context`
152
- // | a0 | `TrapHandler.scratch`
153
- // | a1-a7 | 参数寄存器
154
- // | sp | sscratch
155
- // | gp, tp | gp, tp
156
- // | s0-s11 | 不支持
157
- //
158
- // > 若要保留陷入上下文,
159
- // > 必须在快速路径保存 a0-a7 到 `TrapHandler.context`,
160
- // > 并进入完整路径执行后续操作。
161
- // >
162
- // > 若要切换上下文,在快速路径设置 gp/tp/sscratch/sepc 和 sstatus。
163
- "mv a0, sp" ,
164
- load!( sp[ 1 ] => ra) ,
165
- "jalr ra" ,
166
- "0:" , // 加载上下文指针
167
- load!( sp[ 0 ] => a1) ,
168
- // 0:设置少量参数寄存器
169
- " beqz a0, 0f" ,
170
- // 1:设置所有参数寄存器
171
- " addi a0, a0, -1
131
+ unsafe {
132
+ core:: arch:: naked_asm!(
133
+ ".align 2" ,
134
+ // 换栈
135
+ exchange!( ) ,
136
+ // 加载上下文指针
137
+ save!( a0 => sp[ 2 ] ) ,
138
+ load!( sp[ 0 ] => a0) ,
139
+ // 保存尽量少的寄存器
140
+ save!( ra => a0[ 0 ] ) ,
141
+ save!( t0 => a0[ 1 ] ) ,
142
+ save!( t1 => a0[ 2 ] ) ,
143
+ save!( t2 => a0[ 3 ] ) ,
144
+ save!( t3 => a0[ 4 ] ) ,
145
+ save!( t4 => a0[ 5 ] ) ,
146
+ save!( t5 => a0[ 6 ] ) ,
147
+ save!( t6 => a0[ 7 ] ) ,
148
+ // 调用快速路径函数
149
+ //
150
+ // | reg | position
151
+ // | ------ | -
152
+ // | ra | `TrapHandler.context`
153
+ // | t0-t6 | `TrapHandler.context`
154
+ // | a0 | `TrapHandler.scratch`
155
+ // | a1-a7 | 参数寄存器
156
+ // | sp | sscratch
157
+ // | gp, tp | gp, tp
158
+ // | s0-s11 | 不支持
159
+ //
160
+ // > 若要保留陷入上下文,
161
+ // > 必须在快速路径保存 a0-a7 到 `TrapHandler.context`,
162
+ // > 并进入完整路径执行后续操作。
163
+ // >
164
+ // > 若要切换上下文,在快速路径设置 gp/tp/sscratch/sepc 和 sstatus。
165
+ "mv a0, sp" ,
166
+ load!( sp[ 1 ] => ra) ,
167
+ "jalr ra" ,
168
+ "0:" , // 加载上下文指针
169
+ load!( sp[ 0 ] => a1) ,
170
+ // 0:设置少量参数寄存器
171
+ " beqz a0, 0f" ,
172
+ // 1:设置所有参数寄存器
173
+ " addi a0, a0, -1
172
174
beqz a0, 1f
173
175
" ,
174
- // 2:设置所有调用者寄存器
175
- " addi a0, a0, -1
176
+ // 2:设置所有调用者寄存器
177
+ " addi a0, a0, -1
176
178
beqz a0, 2f
177
179
" ,
178
- // 3:设置所有寄存器
179
- " addi a0, a0, -1
180
+ // 3:设置所有寄存器
181
+ " addi a0, a0, -1
180
182
beqz a0, 3f
181
183
" ,
182
- // 4:完整路径
183
- save!( s0 => a1[ 16 ] ) ,
184
- save!( s1 => a1[ 17 ] ) ,
185
- save!( s2 => a1[ 18 ] ) ,
186
- save!( s3 => a1[ 19 ] ) ,
187
- save!( s4 => a1[ 20 ] ) ,
188
- save!( s5 => a1[ 21 ] ) ,
189
- save!( s6 => a1[ 22 ] ) ,
190
- save!( s7 => a1[ 23 ] ) ,
191
- save!( s8 => a1[ 24 ] ) ,
192
- save!( s9 => a1[ 25 ] ) ,
193
- save!( s10 => a1[ 26 ] ) ,
194
- save!( s11 => a1[ 27 ] ) ,
195
- // 调用完整路径函数
196
- //
197
- // | reg | position
198
- // | ------ | -
199
- // | sp | sscratch
200
- // | gp, tp | gp, tp
201
- // | else | `TrapHandler.context`
202
- //
203
- // > 若要保留陷入上下文,
204
- // > 在完整路径中保存 gp/tp/sp/pc 到 `TrapHandler.context`。
205
- // >
206
- // > 若要切换上下文,在完整路径设置 gp/tp/sscratch/sepc 和 sstatus。
207
- "mv a0, sp" ,
208
- load!( sp[ 2 ] => ra) ,
209
- "jalr ra" ,
210
- "j 0b" ,
211
- "3:" , // 设置所有寄存器
212
- load!( a1[ 16 ] => s0) ,
213
- load!( a1[ 17 ] => s1) ,
214
- load!( a1[ 18 ] => s2) ,
215
- load!( a1[ 19 ] => s3) ,
216
- load!( a1[ 20 ] => s4) ,
217
- load!( a1[ 21 ] => s5) ,
218
- load!( a1[ 22 ] => s6) ,
219
- load!( a1[ 23 ] => s7) ,
220
- load!( a1[ 24 ] => s8) ,
221
- load!( a1[ 25 ] => s9) ,
222
- load!( a1[ 26 ] => s10) ,
223
- load!( a1[ 27 ] => s11) ,
224
- "2:" , // 设置所有调用者寄存器
225
- load!( a1[ 0 ] => ra) ,
226
- load!( a1[ 1 ] => t0) ,
227
- load!( a1[ 2 ] => t1) ,
228
- load!( a1[ 3 ] => t2) ,
229
- load!( a1[ 4 ] => t3) ,
230
- load!( a1[ 5 ] => t4) ,
231
- load!( a1[ 6 ] => t5) ,
232
- load!( a1[ 7 ] => t6) ,
233
- "1:" , // 设置所有参数寄存器
234
- load!( a1[ 10 ] => a2) ,
235
- load!( a1[ 11 ] => a3) ,
236
- load!( a1[ 12 ] => a4) ,
237
- load!( a1[ 13 ] => a5) ,
238
- load!( a1[ 14 ] => a6) ,
239
- load!( a1[ 15 ] => a7) ,
240
- "0:" , // 设置少量参数寄存器
241
- load!( a1[ 8 ] => a0) ,
242
- load!( a1[ 9 ] => a1) ,
243
- exchange!( ) ,
244
- r#return!( ) ,
245
- options ( noreturn ) ,
246
- )
184
+ // 4:完整路径
185
+ save!( s0 => a1[ 16 ] ) ,
186
+ save!( s1 => a1[ 17 ] ) ,
187
+ save!( s2 => a1[ 18 ] ) ,
188
+ save!( s3 => a1[ 19 ] ) ,
189
+ save!( s4 => a1[ 20 ] ) ,
190
+ save!( s5 => a1[ 21 ] ) ,
191
+ save!( s6 => a1[ 22 ] ) ,
192
+ save!( s7 => a1[ 23 ] ) ,
193
+ save!( s8 => a1[ 24 ] ) ,
194
+ save!( s9 => a1[ 25 ] ) ,
195
+ save!( s10 => a1[ 26 ] ) ,
196
+ save!( s11 => a1[ 27 ] ) ,
197
+ // 调用完整路径函数
198
+ //
199
+ // | reg | position
200
+ // | ------ | -
201
+ // | sp | sscratch
202
+ // | gp, tp | gp, tp
203
+ // | else | `TrapHandler.context`
204
+ //
205
+ // > 若要保留陷入上下文,
206
+ // > 在完整路径中保存 gp/tp/sp/pc 到 `TrapHandler.context`。
207
+ // >
208
+ // > 若要切换上下文,在完整路径设置 gp/tp/sscratch/sepc 和 sstatus。
209
+ "mv a0, sp" ,
210
+ load!( sp[ 2 ] => ra) ,
211
+ "jalr ra" ,
212
+ "j 0b" ,
213
+ "3:" , // 设置所有寄存器
214
+ load!( a1[ 16 ] => s0) ,
215
+ load!( a1[ 17 ] => s1) ,
216
+ load!( a1[ 18 ] => s2) ,
217
+ load!( a1[ 19 ] => s3) ,
218
+ load!( a1[ 20 ] => s4) ,
219
+ load!( a1[ 21 ] => s5) ,
220
+ load!( a1[ 22 ] => s6) ,
221
+ load!( a1[ 23 ] => s7) ,
222
+ load!( a1[ 24 ] => s8) ,
223
+ load!( a1[ 25 ] => s9) ,
224
+ load!( a1[ 26 ] => s10) ,
225
+ load!( a1[ 27 ] => s11) ,
226
+ "2:" , // 设置所有调用者寄存器
227
+ load!( a1[ 0 ] => ra) ,
228
+ load!( a1[ 1 ] => t0) ,
229
+ load!( a1[ 2 ] => t1) ,
230
+ load!( a1[ 3 ] => t2) ,
231
+ load!( a1[ 4 ] => t3) ,
232
+ load!( a1[ 5 ] => t4) ,
233
+ load!( a1[ 6 ] => t5) ,
234
+ load!( a1[ 7 ] => t6) ,
235
+ "1:" , // 设置所有参数寄存器
236
+ load!( a1[ 10 ] => a2) ,
237
+ load!( a1[ 11 ] => a3) ,
238
+ load!( a1[ 12 ] => a4) ,
239
+ load!( a1[ 13 ] => a5) ,
240
+ load!( a1[ 14 ] => a6) ,
241
+ load!( a1[ 15 ] => a7) ,
242
+ "0:" , // 设置少量参数寄存器
243
+ load!( a1[ 8 ] => a0) ,
244
+ load!( a1[ 9 ] => a1) ,
245
+ exchange!( ) ,
246
+ r#return!( ) ,
247
+ )
248
+ }
247
249
}
0 commit comments