mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-21 18:33:23 +00:00
重写SMP模块 (#633)
* 修复cpumask的迭代器的错误。 * 能进系统(AP核心还没有初始化自身) * 初始化ap core * 修改percpu * 删除无用的cpu.c * riscv64编译通过
This commit is contained in:
@ -425,4 +425,15 @@ impl From<Duration> for smoltcp::time::Duration {
|
||||
pub trait TimeArch {
|
||||
/// Get CPU cycles (Read from register)
|
||||
fn get_cycles() -> usize;
|
||||
|
||||
/// Calculate expire cycles
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// - `ns` - The time to expire in nanoseconds
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// The expire cycles
|
||||
fn cal_expire_cycles(ns: usize) -> usize;
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ use system_error::SystemError;
|
||||
use crate::{
|
||||
arch::{sched::sched, CurrentIrqArch, CurrentTimeArch},
|
||||
exception::InterruptArch,
|
||||
include::bindings::bindings::{useconds_t, Cpu_tsc_freq},
|
||||
include::bindings::bindings::useconds_t,
|
||||
process::ProcessManager,
|
||||
time::timekeeping::getnstimeofday,
|
||||
};
|
||||
@ -29,11 +29,8 @@ pub fn nanosleep(sleep_time: TimeSpec) -> Result<TimeSpec, SystemError> {
|
||||
}
|
||||
// 对于小于500us的时间,使用spin/rdtsc来进行定时
|
||||
if sleep_time.tv_nsec < 500000 && sleep_time.tv_sec == 0 {
|
||||
let expired_tsc: u64 = unsafe {
|
||||
CurrentTimeArch::get_cycles() as u64
|
||||
+ (sleep_time.tv_nsec as u64 * Cpu_tsc_freq) / 1000000000
|
||||
};
|
||||
while (CurrentTimeArch::get_cycles() as u64) < expired_tsc {
|
||||
let expired_tsc: usize = CurrentTimeArch::cal_expire_cycles(sleep_time.tv_nsec as usize);
|
||||
while CurrentTimeArch::get_cycles() < expired_tsc {
|
||||
spin_loop()
|
||||
}
|
||||
return Ok(TimeSpec {
|
||||
|
@ -262,7 +262,9 @@ pub fn next_n_us_timer_jiffies(expire_us: u64) -> u64 {
|
||||
pub fn schedule_timeout(mut timeout: i64) -> Result<i64, SystemError> {
|
||||
// kdebug!("schedule_timeout");
|
||||
if timeout == MAX_TIMEOUT {
|
||||
let irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
|
||||
ProcessManager::mark_sleep(true).ok();
|
||||
drop(irq_guard);
|
||||
sched();
|
||||
return Ok(MAX_TIMEOUT);
|
||||
} else if timeout < 0 {
|
||||
|
Reference in New Issue
Block a user