diff --git a/src/arch/x86_64/acpi.rs b/src/arch/x86_64/acpi.rs index bf92a485..d9a1871f 100644 --- a/src/arch/x86_64/acpi.rs +++ b/src/arch/x86_64/acpi.rs @@ -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 { diff --git a/src/main.rs b/src/main.rs index 7de3c63e..63732170 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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(); diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 00000000..d03dd27f --- /dev/null +++ b/src/util.rs @@ -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(()) +}