From b00670ea7764d61c9e18cd56b142c620bc51ee4a Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Thu, 31 Aug 2023 19:54:09 +0300 Subject: [PATCH] x86-64: implement ACPI stall function --- src/arch/x86_64/acpi.rs | 5 +++++ src/main.rs | 1 + src/util.rs | 16 ++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 src/util.rs 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(()) +}