x86-64: implement ACPI stall function

This commit is contained in:
Mark Poliakov 2023-08-31 19:54:09 +03:00
parent 12e3e2fe28
commit b00670ea77
3 changed files with 22 additions and 0 deletions

View File

@ -24,6 +24,7 @@ use crate::{
},
mem::{heap::GLOBAL_HEAP, ConvertAddress},
sync::IrqSafeSpinlock,
util,
};
use super::intrinsics;
@ -198,6 +199,10 @@ impl acpi_system::Handler for AcpiHandlerImpl {
Ok(())
}
fn stall(duration: Duration) {
util::polling_sleep(duration).ok();
}
}
impl aml::Handler for AcpiHandlerImpl {

View File

@ -46,6 +46,7 @@ pub mod proc;
pub mod sync;
pub mod syscall;
pub mod task;
pub mod util;
static CPU_INIT_FENCE: SpinFence = SpinFence::new();

16
src/util.rs Normal file
View File

@ -0,0 +1,16 @@
use core::time::Duration;
use yggdrasil_abi::error::Error;
use crate::arch::{Architecture, ARCHITECTURE};
pub fn polling_sleep(duration: Duration) -> Result<(), Error> {
let timer = ARCHITECTURE.monotonic_timer();
let deadline = timer.monotonic_timestamp()? + duration;
while timer.monotonic_timestamp()? < deadline {
core::hint::spin_loop();
}
Ok(())
}