Skip to content

Commit 8cbb773

Browse files
authored
Merge pull request rustsbi#2 from guttatus/edition2024
feat: update rust edition to 2024 and change `asm!` to `naked_asm!`
2 parents 65bf5df + b38b08b commit 8cbb773

File tree

10 files changed

+173
-159
lines changed

10 files changed

+173
-159
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
[workspace]
2+
resolver = "3"
23
members = ["xtask", "fast-trap", "test-app"]
34
default-members = ["xtask"]
5+
6+
[workspace.package]
7+
edition = "2024"

fast-trap/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "fast-trap"
33
description = "Provide a framework for bare-metal trap handling, aiming at ensuring performance while reusing code."
44
version = "0.0.1"
5-
edition = "2021"
5+
edition.workspace = true
66
authors = ["YdrMaster <ydrml@hotmail.com>"]
77
repository = "https://github.com/YdrMaster/fast-trap.git"
88
documentation = "https://docs.rs/fast-trap"

fast-trap/src/entire.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use crate::{FlowContext, TrapHandler};
1+
use crate::{FlowContext, TrapHandler};
22
use core::{
33
marker::PhantomData,
4-
mem::{forget, MaybeUninit},
4+
mem::{MaybeUninit, forget},
55
ops::{Deref, DerefMut},
66
ptr::NonNull,
77
};

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

Lines changed: 119 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -111,137 +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::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]
129130
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
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
}

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{trap_entry, FlowContext};
1+
use super::{FlowContext, trap_entry};
22
use core::arch::asm;
33

44
macro_rules! exchange {
@@ -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
}

0 commit comments

Comments
 (0)