Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

riscv: fix the timer and cpu frequency are not related #41

Merged
merged 2 commits into from
May 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions modules/axhal/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ raw-cpuid = "11.0"
[target.'cfg(any(target_arch = "riscv32", target_arch = "riscv64"))'.dependencies]
riscv = "0.10"
sbi-rt = { version = "0.0.2", features = ["legacy"] }
of = { path = "../../crates/of"}

[target.'cfg(target_arch = "aarch64")'.dependencies]
aarch64-cpu = "9.3"
Expand Down
18 changes: 18 additions & 0 deletions modules/axhal/src/platform/riscv64_qemu_virt/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,35 @@ pub mod irq;
#[cfg(feature = "smp")]
pub mod mp;

use of;

extern "C" {
fn trap_vector_base();
fn rust_main(cpu_id: usize, dtb: usize);
#[cfg(feature = "smp")]
fn rust_main_secondary(cpu_id: usize);
}

fn init_board_info(dtb: usize) {
unsafe {
of::init_fdt_ptr(dtb as *const u8);
}
let mut of_cpus = of::cpus();
let freq = {
if let Some(cpu) = of_cpus.nth(0) {
cpu.timebase_frequency()
} else {
axconfig::TIMER_FREQUENCY
}
};
self::time::init_cpu_freq(freq as u64);
}

unsafe extern "C" fn rust_entry(cpu_id: usize, dtb: usize) {
crate::mem::clear_bss();
crate::cpu::init_primary(cpu_id);
crate::arch::set_trap_vector_base(trap_vector_base as usize);
init_board_info(dtb);
rust_main(cpu_id, dtb);
}

Expand Down
32 changes: 30 additions & 2 deletions modules/axhal/src/platform/riscv64_qemu_virt/time.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,39 @@
use lazy_init::LazyInit;
use riscv::register::time;

static CPU_FREQ: LazyInit<u64> = LazyInit::new();
static LOOPS_PRE_TICK: LazyInit<u64> = LazyInit::new();
const NANOS_PER_TICK: u64 = crate::time::NANOS_PER_SEC / axconfig::TIMER_FREQUENCY as u64;

// Initializes the frequency of cpu.
#[inline]
pub fn init_cpu_freq(freq: u64) {
if !CPU_FREQ.is_init() {
CPU_FREQ.init_by(freq);
}

if !LOOPS_PRE_TICK.is_init() {
LOOPS_PRE_TICK.init_by(freq / axconfig::TIMER_FREQUENCY as u64);
}
}

/// Returns the frequency of cpu.
#[inline]
#[allow(unused)]
pub fn cpu_freq() -> u64 {
*CPU_FREQ
}

/// Returns loops per tick.
#[inline]
pub fn loops_pre_tick() -> u64 {
*LOOPS_PRE_TICK
}

/// Returns the current clock time in hardware ticks.
#[inline]
pub fn current_ticks() -> u64 {
time::read() as u64
time::read() as u64 / loops_pre_tick()
}

/// Converts hardware ticks to nanoseconds.
Expand All @@ -25,7 +53,7 @@ pub const fn nanos_to_ticks(nanos: u64) -> u64 {
/// A timer interrupt will be triggered at the given deadline (in nanoseconds).
#[cfg(feature = "irq")]
pub fn set_oneshot_timer(deadline_ns: u64) {
sbi_rt::set_timer(nanos_to_ticks(deadline_ns));
sbi_rt::set_timer(nanos_to_ticks(deadline_ns) * loops_pre_tick());
}

pub(super) fn init_percpu() {
Expand Down
4 changes: 2 additions & 2 deletions scripts/test/app_test_for_monolithic.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

APP=
ROOT=$(realpath $(dirname $0))/../../
TIMEOUT=60s
TIMEOUT=120s
EXIT_STATUS=0

S_PASS=0
Expand Down Expand Up @@ -51,7 +51,7 @@ function run_and_compare() {
EXIT_NORMALLY="System halted with exit code 0"
if [ `grep -c "$EXIT_NORMALLY" $actual` -eq '0' ];then
return $S_FAILED
else
else
return $S_PASS
fi
}
Expand Down
Loading