@@ -111,137 +111,139 @@ impl FlowContext {
111111#[ naked]
112112pub unsafe extern "C" fn reuse_stack_for_trap ( ) {
113113 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}
116117 andi sp, sp, {mask}
117118 ret
118119 " ,
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+ }
123124}
124125
125126/// # Safety
126127///
127128/// See [proto](crate::hal::doc::trap_entry).
128129#[ naked]
129130pub 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
172174 beqz a0, 1f
173175 " ,
174- // 2:设置所有调用者寄存器
175- " addi a0, a0, -1
176+ // 2:设置所有调用者寄存器
177+ " addi a0, a0, -1
176178 beqz a0, 2f
177179 " ,
178- // 3:设置所有寄存器
179- " addi a0, a0, -1
180+ // 3:设置所有寄存器
181+ " addi a0, a0, -1
180182 beqz a0, 3f
181183 " ,
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+ }
247249}
0 commit comments