Skip to content

Commit 97395c9

Browse files
committed
refactor: update fast-trap
Signed-off-by: YdrMaster <[email protected]>
1 parent a940605 commit 97395c9

File tree

4 files changed

+28
-14
lines changed

4 files changed

+28
-14
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

hsm-cell/src/lib.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,24 @@ impl<T> LocalHsmCell<'_, T> {
6565
Ordering::Relaxed,
6666
) {
6767
Ok(_) => break Ok(unsafe { (*self.0.val.get()).take().unwrap() }),
68+
Err(HART_STATE_START_PENDING_EXT) => spin_loop(),
6869
Err(HART_STATE_SUSPENDED) => {
6970
self.0.status.store(HART_STATE_STARTED, Ordering::Relaxed);
7071
break Ok(unsafe { (*self.0.val.get()).take().unwrap() });
7172
}
72-
Err(HART_STATE_START_PENDING_EXT) => spin_loop(),
7373
Err(s) => break Err(s),
7474
}
7575
}
7676
}
7777

78+
/// 关闭。
79+
#[inline]
80+
pub fn stop_pending(&self) {
81+
self.0
82+
.status
83+
.store(HART_STATE_STOP_PENDING, Ordering::Relaxed)
84+
}
85+
7886
/// 关闭。
7987
#[inline]
8088
pub fn stop(&self) {

rustsbi-qemu/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ dtb-walker = "=0.2.0-alpha.3"
2828
qemu-exit = "3.0"
2929

3030
hsm-cell = { path = "../hsm-cell" }
31-
fast-trap = { git = "https://github.com/YdrMaster/fast-trap", features = [
31+
fast-trap = { git = "https://github.com/YdrMaster/fast-trap", rev = "ffb40e2", features = [
3232
"riscv-m",
3333
] }

rustsbi-qemu/src/main.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,9 @@ extern "C" fn fast_handler(
238238
mie::write(mie::MSIE | mie::MTIE | mie::MEIE);
239239
load_trap_vec(true);
240240
}
241-
hart_ctx.trap.a[0] = hart_id;
242-
hart_ctx.trap.a[1] = supervisor.opaque;
243-
hart_ctx.trap.pc = supervisor.start_addr;
241+
ctx.regs().a[0] = hart_id;
242+
ctx.regs().a[1] = supervisor.opaque;
243+
ctx.regs().pc = supervisor.start_addr;
244244
}
245245
Err(_state) => {
246246
unsafe {
@@ -251,7 +251,7 @@ extern "C" fn fast_handler(
251251
mie::write(mie::MSIE);
252252
load_trap_vec(false);
253253
};
254-
hart_ctx.trap.pc = _stop as usize;
254+
ctx.regs().pc = _stop as usize;
255255
}
256256
}
257257
return ctx.call(2);
@@ -271,7 +271,8 @@ extern "C" fn fast_handler(
271271
unsafe {
272272
load_trap_vec(false);
273273
mie::write(mie::MSIE);
274-
ROOT_STACK[hart_id()].hart_context().trap.pc = _stop as usize;
274+
ROOT_STACK[hart_id()].hart_context().hsm.local().stop();
275+
ctx.regs().pc = _stop as usize;
275276
}
276277
return ctx.call(0);
277278
}
@@ -281,14 +282,13 @@ extern "C" fn fast_handler(
281282
{
282283
unsafe {
283284
load_trap_vec(false);
284-
ROOT_STACK[hart_id()].hart_context().trap.pc = _stop as usize;
285+
ctx.regs().pc = _stop as usize;
285286
}
286287
return ctx.call(0);
287288
}
288289
}
289290
mepc::next();
290-
ctx.save_args(ret.value, a2, a3, a4, a5, a6, a7);
291-
ctx.write_a(0, ret.error);
291+
ctx.regs().a = [ret.error, ret.value, a2, a3, a4, a5, a6, a7];
292292
ctx.restore()
293293
}
294294
// 其他陷入
@@ -444,7 +444,13 @@ impl rustsbi::Hsm for Hsm {
444444

445445
#[inline]
446446
fn hart_stop(&self) -> SbiRet {
447-
unsafe { ROOT_STACK[hart_id()].hart_context().hsm.local().stop() };
447+
unsafe {
448+
ROOT_STACK[hart_id()]
449+
.hart_context()
450+
.hsm
451+
.local()
452+
.stop_pending()
453+
};
448454
SbiRet::success(0)
449455
}
450456

0 commit comments

Comments
 (0)