Skip to content

Commit 4cb9443

Browse files
committed
fix: remove unnecessary unsafe block and remove #![feature(naked_functions)]
Signed-off-by: guttatus <[email protected]>
1 parent 438763c commit 4cb9443

File tree

3 files changed

+124
-131
lines changed

3 files changed

+124
-131
lines changed

fast-trap/src/hal/riscv/mod.rs

Lines changed: 115 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -111,139 +111,135 @@ impl FlowContext {
111111
#[unsafe(naked)]
112112
pub unsafe extern "C" fn reuse_stack_for_trap() {
113113
const LAYOUT: Layout = Layout::new::<TrapHandler>();
114-
unsafe {
115-
core::arch::naked_asm!(
116-
" addi sp, sp, {size}
114+
core::arch::naked_asm!(
115+
" addi sp, sp, {size}
117116
andi sp, sp, {mask}
118117
ret
119118
",
120-
size = const -(LAYOUT.size() as isize),
121-
mask = const !(LAYOUT.align() as isize - 1) ,
122-
)
123-
}
119+
size = const -(LAYOUT.size() as isize),
120+
mask = const !(LAYOUT.align() as isize - 1) ,
121+
)
124122
}
125123

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

fast-trap/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! 快速陷入处理。
22
33
#![no_std]
4-
#![feature(naked_functions)]
54
#![deny(warnings, missing_docs)]
65

76
mod entire;

test-app/src/main.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,23 @@ static mut ROOT_CONTEXT: FlowContext = FlowContext::ZERO;
2727
#[unsafe(no_mangle)]
2828
#[unsafe(link_section = ".text.entry")]
2929
unsafe extern "C" fn _start() -> ! {
30-
unsafe {
31-
naked_asm!(
32-
" la sp, {stack} + {stack_size}
30+
naked_asm!(
31+
" la sp, {stack} + {stack_size}
3332
call {move_stack}
3433
call {main}
3534
j {trap}
3635
",
37-
stack_size = const 4096,
38-
stack = sym ROOT_STACK,
39-
move_stack = sym reuse_stack_for_trap,
40-
main = sym rust_main,
41-
trap = sym trap_entry,
42-
)
43-
}
36+
stack_size = const 4096,
37+
stack = sym ROOT_STACK,
38+
move_stack = sym reuse_stack_for_trap,
39+
main = sym rust_main,
40+
trap = sym trap_entry,
41+
)
4442
}
4543

4644
#[unsafe(naked)]
4745
unsafe extern "C" fn exception() -> ! {
48-
unsafe { naked_asm!("unimp") }
46+
naked_asm!("unimp")
4947
}
5048

5149
extern "C" fn rust_main(_hartid: usize, dtb: *const u8) {

0 commit comments

Comments
 (0)