Skip to content

Commit 734dd3d

Browse files
committed
refactor: 只用 stringify!
Signed-off-by: YdrMaster <[email protected]>
1 parent 2f605ee commit 734dd3d

File tree

2 files changed

+102
-78
lines changed

2 files changed

+102
-78
lines changed

.vscode/settings.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
2-
// Prevent "can't find crate for `test`" error on no_std
3-
// Ref: https://github.com/rust-lang/vscode-rust/issues/729
42
"rust-analyzer.cargo.target": "riscv64imac-unknown-none-elf",
5-
"rust-analyzer.checkOnSave.enable": false,
63
"rust-analyzer.cargo.features": [
74
"m-mode"
8-
]
5+
],
6+
// Prevent "can't find crate for `test`" error on no_std
7+
// Ref: https://github.com/rust-lang/vscode-rust/issues/729
8+
"rust-analyzer.checkOnSave.enable": false
99
}

fast-trap/src/hal/riscv.rs

Lines changed: 98 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,61 @@ use core::alloc::Layout;
55
#[macro_use]
66
mod arch {
77
macro_rules! save {
8-
($reg:expr => $ptr:expr; $pos:expr) => {
9-
concat!("sw ", $reg, ", 4*", $pos, "(", $ptr, ")")
8+
($reg:ident => $ptr:ident; $pos:expr) => {
9+
concat!(
10+
"sw ",
11+
stringify!($reg),
12+
", 4*",
13+
$pos,
14+
'(',
15+
stringify!($ptr),
16+
')'
17+
)
1018
};
1119
}
1220

1321
macro_rules! load {
14-
($ptr:expr; $pos:expr => $reg:expr) => {
15-
concat!("lw ", $reg, ", 4*", $pos, "(", $ptr, ")")
16-
};
17-
18-
($ptr:expr; $pos:expr => $reg:expr, label: $label:expr) => {
19-
concat!($label, ":", load!($ptr;$pos => $reg))
22+
($ptr:ident; $pos:expr => $reg:ident) => {
23+
concat!(
24+
"lw ",
25+
stringify!($reg),
26+
", 4*",
27+
$pos,
28+
'(',
29+
stringify!($ptr),
30+
')'
31+
)
2032
};
2133
}
2234
}
2335
#[cfg(target_arch = "riscv64")]
2436
#[macro_use]
2537
mod arch {
2638
macro_rules! save {
27-
($reg:expr => $ptr:expr; $pos:expr) => {
28-
concat!("sd ", $reg, ", 8*", $pos, '(', $ptr, ')')
39+
($reg:ident => $ptr:ident; $pos:expr) => {
40+
concat!(
41+
"sd ",
42+
stringify!($reg),
43+
", 8*",
44+
$pos,
45+
'(',
46+
stringify!($ptr),
47+
')'
48+
)
2949
};
3050
}
3151

3252
macro_rules! load {
33-
($ptr:expr; $pos:expr => $reg:expr) => {
34-
concat!("ld ", $reg, ", 8*", $pos, '(', $ptr, ')')
35-
};
36-
37-
($ptr:expr; $pos:expr => $reg:expr, label: $label:expr) => {
38-
concat!($label, ':', load!($ptr;$pos => $reg))
53+
($ptr:ident; $pos:expr => $reg:ident) => {
54+
concat!(
55+
"ld ",
56+
stringify!($reg),
57+
", 8*",
58+
$pos,
59+
'(',
60+
stringify!($ptr),
61+
')'
62+
)
3963
};
4064
}
4165
}
@@ -103,17 +127,17 @@ pub unsafe extern "C" fn trap_entry() {
103127
// 换栈
104128
exchange!(),
105129
// 加载上下文指针
106-
save!("a0" => "sp";2),
107-
load!("sp";0 => "a0"),
130+
save!(a0 => sp;2),
131+
load!(sp;0 => a0),
108132
// 保存尽量少的寄存器
109-
save!("ra" => "a0";0),
110-
save!("t0" => "a0";1),
111-
save!("t1" => "a0";2),
112-
save!("t2" => "a0";3),
113-
save!("t3" => "a0";4),
114-
save!("t4" => "a0";5),
115-
save!("t5" => "a0";6),
116-
save!("t6" => "a0";7),
133+
save!(ra => a0;0),
134+
save!(t0 => a0;1),
135+
save!(t1 => a0;2),
136+
save!(t2 => a0;3),
137+
save!(t3 => a0;4),
138+
save!(t4 => a0;5),
139+
save!(t5 => a0;6),
140+
save!(t6 => a0;7),
117141
// 调用快速路径函数
118142
//
119143
// | reg | position
@@ -132,10 +156,10 @@ pub unsafe extern "C" fn trap_entry() {
132156
// >
133157
// > 若要切换上下文,在快速路径设置 gp/tp/sscratch/sepc 和 sstatus。
134158
"mv a0, sp",
135-
load!("sp";1 => "ra"),
159+
load!(sp;1 => ra),
136160
"jalr ra",
137-
// 加载上下文指针
138-
load!("sp";0 => "a1", label: 0),
161+
"0:", // 加载上下文指针
162+
load!(sp;0 => a1),
139163
// 0:设置少量参数寄存器
140164
" beqz a0, 0f",
141165
// 1:设置所有参数寄存器
@@ -151,18 +175,18 @@ pub unsafe extern "C" fn trap_entry() {
151175
beqz a0, 3f
152176
",
153177
// 4:完整路径
154-
save!("s0" => "a1";16),
155-
save!("s1" => "a1";17),
156-
save!("s2" => "a1";18),
157-
save!("s3" => "a1";19),
158-
save!("s4" => "a1";20),
159-
save!("s5" => "a1";21),
160-
save!("s6" => "a1";22),
161-
save!("s7" => "a1";23),
162-
save!("s8" => "a1";24),
163-
save!("s9" => "a1";25),
164-
save!("s10" => "a1";26),
165-
save!("s11" => "a1";27),
178+
save!(s0 => a1;16),
179+
save!(s1 => a1;17),
180+
save!(s2 => a1;18),
181+
save!(s3 => a1;19),
182+
save!(s4 => a1;20),
183+
save!(s5 => a1;21),
184+
save!(s6 => a1;22),
185+
save!(s7 => a1;23),
186+
save!(s8 => a1;24),
187+
save!(s9 => a1;25),
188+
save!(s10 => a1;26),
189+
save!(s11 => a1;27),
166190
// 调用完整路径函数
167191
//
168192
// | reg | position
@@ -176,41 +200,41 @@ pub unsafe extern "C" fn trap_entry() {
176200
// >
177201
// > 若要切换上下文,在完整路径设置 gp/tp/sscratch/sepc 和 sstatus。
178202
"mv a0, sp",
179-
load!("sp"; 2 => "ra"),
203+
load!(sp; 2 => ra),
180204
"jalr ra",
181205
"j 0b",
182-
// 设置所有寄存器
183-
load!("a1";16 => "s0", label: 3),
184-
load!("a1";17 => "s1"),
185-
load!("a1";18 => "s2"),
186-
load!("a1";19 => "s3"),
187-
load!("a1";20 => "s4"),
188-
load!("a1";21 => "s5"),
189-
load!("a1";22 => "s6"),
190-
load!("a1";23 => "s7"),
191-
load!("a1";24 => "s8"),
192-
load!("a1";25 => "s9"),
193-
load!("a1";26 => "s10"),
194-
load!("a1";27 => "s11"),
195-
// 设置所有调用者寄存器
196-
load!("a1"; 0 => "ra", label: 2),
197-
load!("a1"; 1 => "t0"),
198-
load!("a1"; 2 => "t1"),
199-
load!("a1"; 3 => "t2"),
200-
load!("a1"; 4 => "t3"),
201-
load!("a1"; 5 => "t4"),
202-
load!("a1"; 6 => "t5"),
203-
load!("a1"; 7 => "t6"),
204-
// 设置所有参数寄存器
205-
load!("a1";10 => "a2", label: 1),
206-
load!("a1";11 => "a3"),
207-
load!("a1";12 => "a4"),
208-
load!("a1";13 => "a5"),
209-
load!("a1";14 => "a6"),
210-
load!("a1";15 => "a7"),
211-
// 设置少量参数寄存器
212-
load!("a1"; 8 => "a0", label: 0),
213-
load!("a1"; 9 => "a1"),
206+
"3:", // 设置所有寄存器
207+
load!(a1;16 => s0),
208+
load!(a1;17 => s1),
209+
load!(a1;18 => s2),
210+
load!(a1;19 => s3),
211+
load!(a1;20 => s4),
212+
load!(a1;21 => s5),
213+
load!(a1;22 => s6),
214+
load!(a1;23 => s7),
215+
load!(a1;24 => s8),
216+
load!(a1;25 => s9),
217+
load!(a1;26 => s10),
218+
load!(a1;27 => s11),
219+
"2:", // 设置所有调用者寄存器
220+
load!(a1; 0 => ra),
221+
load!(a1; 1 => t0),
222+
load!(a1; 2 => t1),
223+
load!(a1; 3 => t2),
224+
load!(a1; 4 => t3),
225+
load!(a1; 5 => t4),
226+
load!(a1; 6 => t5),
227+
load!(a1; 7 => t6),
228+
"1:", // 设置所有参数寄存器
229+
load!(a1;10 => a2),
230+
load!(a1;11 => a3),
231+
load!(a1;12 => a4),
232+
load!(a1;13 => a5),
233+
load!(a1;14 => a6),
234+
load!(a1;15 => a7),
235+
"0:", // 设置少量参数寄存器
236+
load!(a1; 8 => a0),
237+
load!(a1; 9 => a1),
214238
exchange!(),
215239
r#return!(),
216240
options(noreturn),

0 commit comments

Comments
 (0)