Skip to content

Commit 7bbc1a0

Browse files
committed
refactor: 启动时同步 clint 初始化
Signed-off-by: YdrMaster <[email protected]>
1 parent a4163f9 commit 7bbc1a0

File tree

3 files changed

+21
-26
lines changed

3 files changed

+21
-26
lines changed

rustsbi-qemu/src/clint.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
use crate::{hart_id, trap_stack::remote_hsm};
22
use aclint::SifiveClint;
3-
use core::{mem::MaybeUninit, ptr::NonNull};
3+
use core::{
4+
ptr::null_mut,
5+
sync::atomic::{AtomicPtr, Ordering},
6+
};
47
use rustsbi::{spec::binary::SbiRet, HartMask, Ipi, Timer};
58

69
pub(crate) struct Clint;
710

8-
pub(crate) static mut CLINT: MaybeUninit<NonNull<SifiveClint>> = MaybeUninit::uninit();
11+
pub(crate) static CLINT: AtomicPtr<SifiveClint> = AtomicPtr::new(null_mut());
912

1013
pub(crate) fn init(base: usize) {
11-
unsafe {
12-
CLINT
13-
.as_mut_ptr()
14-
.write_volatile(NonNull::new(base as _).unwrap())
15-
}
14+
CLINT.store(base as _, Ordering::Release);
1615
}
1716

1817
impl Ipi for Clint {
@@ -32,24 +31,25 @@ impl Timer for Clint {
3231
fn set_timer(&self, time_value: u64) {
3332
unsafe {
3433
riscv::register::mip::clear_stimer();
35-
clint().write_mtimecmp(hart_id(), time_value);
34+
(*CLINT.load(Ordering::Relaxed)).write_mtimecmp(hart_id(), time_value);
3635
}
3736
}
3837
}
3938

40-
#[inline]
41-
fn clint() -> &'static SifiveClint {
42-
unsafe { CLINT.as_ptr().read_volatile().as_ref() }
43-
}
44-
4539
#[inline]
4640
pub fn set_msip(hart_idx: usize) {
47-
clint().set_msip(hart_idx);
41+
unsafe { &*CLINT.load(Ordering::Relaxed) }.set_msip(hart_idx);
4842
}
4943

5044
#[inline]
5145
pub fn clear() {
52-
let clint = clint();
53-
clint.clear_msip(hart_id());
54-
clint.write_mtimecmp(hart_id(), u64::MAX);
46+
loop {
47+
if let Some(clint) = unsafe { CLINT.load(Ordering::Relaxed).as_ref() } {
48+
clint.clear_msip(hart_id());
49+
clint.write_mtimecmp(hart_id(), u64::MAX);
50+
break;
51+
} else {
52+
continue;
53+
}
54+
}
5555
}

rustsbi-qemu/src/main.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ unsafe extern "C" fn _stop() -> ! {
6868
/// rust 入口。
6969
extern "C" fn rust_main(hartid: usize, opaque: usize) {
7070
static GENESIS: AtomicBool = AtomicBool::new(true);
71-
static DONE: AtomicBool = AtomicBool::new(true);
7271
static BOARD_INFO: Once<BoardInfo> = Once::new();
7372

7473
// 全局初始化过程
@@ -130,15 +129,11 @@ extern "C" fn rust_main(hartid: usize, opaque: usize) {
130129
start_addr: SUPERVISOR_ENTRY,
131130
opaque,
132131
});
133-
DONE.store(false, Ordering::SeqCst);
134132
} else {
135133
// 设置 pmp
136134
set_pmp(BOARD_INFO.wait());
137135
// 设置陷入栈
138136
trap_stack::prepare_for_trap();
139-
while DONE.load(Ordering::SeqCst) {
140-
core::hint::spin_loop();
141-
}
142137
}
143138
// 清理 clint
144139
clint::clear();

rustsbi-qemu/src/trap_vec.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::clint::CLINT;
12
use aclint::SifiveClint as Clint;
23
use core::arch::asm;
34
use fast_trap::trap_entry;
@@ -63,7 +64,7 @@ unsafe extern "C" fn mtimer() {
6364
" la a0, {clint_ptr}
6465
ld a0, (a0)
6566
csrr a1, mhartid
66-
li a2, {u64_max}
67+
addi a2, zero, -1
6768
call {set_mtimecmp}
6869
",
6970
// 设置 stip
@@ -83,9 +84,8 @@ unsafe extern "C" fn mtimer() {
8384
" csrrw sp, mscratch, sp",
8485
// 返回
8586
" mret",
86-
u64_max = const u64::MAX,
8787
mip_stip = const 1 << 5,
88-
clint_ptr = sym crate::clint::CLINT,
88+
clint_ptr = sym CLINT,
8989
// Clint::write_mtimecmp_naked(&self, hart_idx, val)
9090
set_mtimecmp = sym Clint::write_mtimecmp_naked,
9191
options(noreturn)
@@ -129,7 +129,7 @@ unsafe extern "C" fn msoft() {
129129
" csrrw sp, mscratch, sp",
130130
// 返回
131131
" mret",
132-
clint_ptr = sym crate::clint::CLINT,
132+
clint_ptr = sym CLINT,
133133
// Clint::clear_msip_naked(&self, hart_idx)
134134
clear_msip = sym Clint::clear_msip_naked,
135135
options(noreturn)

0 commit comments

Comments
 (0)