Skip to content

Commit b38b08b

Browse files
committed
fix: add unsafe blocks to inline assembly
1 parent 85163df commit b38b08b

File tree

4 files changed

+156
-144
lines changed

4 files changed

+156
-144
lines changed

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

Lines changed: 119 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -111,135 +111,139 @@ impl FlowContext {
111111
#[naked]
112112
pub unsafe extern "C" fn reuse_stack_for_trap() {
113113
const LAYOUT: Layout = Layout::new::<TrapHandler>();
114-
core::arch::naked_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-
)
120+
size = const -(LAYOUT.size() as isize),
121+
mask = const !(LAYOUT.align() as isize - 1) ,
122+
)
123+
}
122124
}
123125

124126
/// # Safety
125127
///
126128
/// See [proto](crate::hal::doc::trap_entry).
127129
#[naked]
128130
pub unsafe extern "C" fn trap_entry() {
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
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
171174
beqz a0, 1f
172175
",
173-
// 2:设置所有调用者寄存器
174-
" addi a0, a0, -1
176+
// 2:设置所有调用者寄存器
177+
" addi a0, a0, -1
175178
beqz a0, 2f
176179
",
177-
// 3:设置所有寄存器
178-
" addi a0, a0, -1
180+
// 3:设置所有寄存器
181+
" addi a0, a0, -1
179182
beqz a0, 3f
180183
",
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-
)
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+
}
245249
}

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

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,19 @@ impl FlowContext {
2323
/// 从上下文向硬件加载非调用规范约定的寄存器。
2424
#[inline]
2525
pub(crate) unsafe fn load_others(&self) {
26-
asm!(
27-
" mv gp, {gp}
26+
unsafe {
27+
asm!(
28+
" mv gp, {gp}
2829
mv tp, {tp}
2930
csrw mscratch, {sp}
3031
csrw mepc, {pc}
3132
",
32-
gp = in(reg) self.gp,
33-
tp = in(reg) self.tp,
34-
sp = in(reg) self.sp,
35-
pc = in(reg) self.pc,
36-
);
33+
gp = in(reg) self.gp,
34+
tp = in(reg) self.tp,
35+
sp = in(reg) self.sp,
36+
pc = in(reg) self.pc,
37+
);
38+
}
3739
}
3840
}
3941

@@ -49,23 +51,25 @@ pub(crate) fn exchange_scratch(mut val: usize) -> usize {
4951
/// See [proto](crate::hal::doc::soft_trap).
5052
#[inline]
5153
pub unsafe fn soft_trap(cause: usize) {
52-
asm!(
53-
" la {0}, 1f
54+
unsafe {
55+
asm!(
56+
" la {0}, 1f
5457
csrw mepc, {0}
5558
csrw mcause, {cause}
5659
j {trap}
5760
1:
5861
",
59-
out(reg) _,
60-
cause = in(reg) cause,
61-
trap = sym trap_entry,
62-
);
62+
out(reg) _,
63+
cause = in(reg) cause,
64+
trap = sym trap_entry,
65+
);
66+
}
6367
}
6468

6569
/// # Safety
6670
///
6771
/// See [proto](crate::hal::doc::load_direct_trap_entry).
6872
#[inline]
6973
pub unsafe fn load_direct_trap_entry() {
70-
asm!("csrw mtvec, {0}", in(reg) trap_entry, options(nomem))
74+
unsafe { asm!("csrw mtvec, {0}", in(reg) trap_entry, options(nomem)) }
7175
}

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

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,19 @@ impl FlowContext {
2323
/// 从上下文向硬件加载非调用规范约定的寄存器。
2424
#[inline]
2525
pub(crate) unsafe fn load_others(&self) {
26-
asm!(
27-
" mv gp, {gp}
26+
unsafe {
27+
asm!(
28+
" mv gp, {gp}
2829
mv tp, {tp}
2930
csrw sscratch, {sp}
3031
csrw sepc, {pc}
3132
",
32-
gp = in(reg) self.gp,
33-
tp = in(reg) self.tp,
34-
sp = in(reg) self.sp,
35-
pc = in(reg) self.pc,
36-
);
33+
gp = in(reg) self.gp,
34+
tp = in(reg) self.tp,
35+
sp = in(reg) self.sp,
36+
pc = in(reg) self.pc,
37+
);
38+
}
3739
}
3840
}
3941

@@ -51,17 +53,19 @@ pub(crate) fn exchange_scratch(mut val: usize) -> usize {
5153
/// 如同发生一个陷入。
5254
#[inline]
5355
pub unsafe fn soft_trap(cause: usize) {
54-
asm!(
55-
" la {0}, 1f
56+
unsafe {
57+
asm!(
58+
" la {0}, 1f
5659
csrw sepc, {0}
5760
csrw scause, {cause}
5861
j {trap}
5962
1:
6063
",
61-
out(reg) _,
62-
cause = in(reg) cause,
63-
trap = sym trap_entry,
64-
);
64+
out(reg) _,
65+
cause = in(reg) cause,
66+
trap = sym trap_entry,
67+
);
68+
}
6569
}
6670

6771
/// 设置全局陷入入口。
@@ -71,5 +75,5 @@ pub unsafe fn soft_trap(cause: usize) {
7175
/// 这个函数操作硬件寄存器,寄存器里原本的值将丢弃。
7276
#[inline]
7377
pub unsafe fn load_direct_trap_entry() {
74-
asm!("csrw stvec, {0}", in(reg) trap_entry, options(nomem))
78+
unsafe { asm!("csrw stvec, {0}", in(reg) trap_entry, options(nomem)) }
7579
}

fast-trap/src/lib.rs

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

77
mod entire;

0 commit comments

Comments
 (0)