diff --git a/Cargo.lock b/Cargo.lock index 481fa2f488..bf99b433b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -444,6 +444,7 @@ dependencies = [ "arm-gic", "bit_field", "bitflags 2.4.0", + "cfg-if", "crossbeam-utils", "dyn-clone", "float-cmp", diff --git a/Cargo.toml b/Cargo.toml index 0891f453b4..4a46058ba7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,6 +68,7 @@ ahash = { version = "0.8", default-features = false } align-address = "0.1" bit_field = "0.10" bitflags = "2.4" +cfg-if = "1" crossbeam-utils = { version = "0.8", default-features = false } dyn-clone = "1.0" hashbrown = { version = "0.14", default-features = false } diff --git a/src/arch/aarch64/mod.rs b/src/arch/aarch64/mod.rs index a459fd5479..f5717c958e 100644 --- a/src/arch/aarch64/mod.rs +++ b/src/arch/aarch64/mod.rs @@ -1,2 +1,18 @@ pub mod kernel; pub mod mm; + +/// Force strict CPU ordering, serializes load and store operations. +#[allow(dead_code)] +#[inline(always)] +pub(crate) fn memory_barrier() { + use core::arch::asm; + unsafe { + asm!("dmb ish", options(nostack, nomem, preserves_flags),); + } +} + +pub fn init_drivers() { + // Initialize PCI Drivers + #[cfg(feature = "pci")] + crate::drivers::pci::init_drivers(); +} diff --git a/src/arch/mod.rs b/src/arch/mod.rs index aec99a6a95..8d81850e91 100644 --- a/src/arch/mod.rs +++ b/src/arch/mod.rs @@ -1,97 +1,57 @@ -// Platform-specific implementations -#[cfg(target_arch = "aarch64")] -pub mod aarch64; +//! Architecture-specific architecture abstraction. -#[cfg(target_arch = "x86_64")] -pub mod x86_64; +cfg_if::cfg_if! { + if #[cfg(target_arch = "aarch64")] { + pub mod aarch64; + pub use self::aarch64::*; -// Export our platform-specific modules. -#[cfg(all(target_arch = "aarch64", target_os = "none"))] -pub use crate::arch::aarch64::kernel::boot_processor_init; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::core_local; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::interrupts; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::interrupts::wakeup_core; -#[cfg(all(target_arch = "aarch64", feature = "pci"))] -pub use crate::arch::aarch64::kernel::pci; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::processor; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::processor::set_oneshot_timer; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::scheduler; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::switch; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::systemtime::get_boot_time; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::kernel::{ - application_processor_init, boot_application_processors, get_processor_count, - message_output_init, output_message_buf, -}; -#[cfg(target_arch = "aarch64")] -pub use crate::arch::aarch64::*; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::apic::{set_oneshot_timer, wakeup_core}; -#[cfg(all(target_arch = "x86_64", target_os = "none", feature = "smp"))] -pub use crate::arch::x86_64::kernel::application_processor_init; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::core_local; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::gdt::set_current_kernel_stack; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::interrupts; -#[cfg(all(target_arch = "x86_64", feature = "pci"))] -pub use crate::arch::x86_64::kernel::pci; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::processor; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::scheduler; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::switch; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::systemtime::get_boot_time; -#[cfg(all(target_arch = "x86_64", target_os = "none"))] -pub use crate::arch::x86_64::kernel::{boot_application_processors, boot_processor_init}; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::kernel::{ - get_processor_count, message_output_init, output_message_buf, -}; -#[cfg(target_arch = "x86_64")] -pub use crate::arch::x86_64::*; + #[cfg(target_os = "none")] + pub use self::aarch64::kernel::boot_processor_init; + pub use self::aarch64::kernel::core_local; + pub use self::aarch64::kernel::interrupts; + pub use self::aarch64::kernel::interrupts::wakeup_core; + #[cfg(feature = "pci")] + pub use self::aarch64::kernel::pci; + pub use self::aarch64::kernel::processor; + pub use self::aarch64::kernel::processor::set_oneshot_timer; + pub use self::aarch64::kernel::scheduler; + pub use self::aarch64::kernel::switch; + pub use self::aarch64::kernel::systemtime::get_boot_time; + pub use self::aarch64::kernel::{ + application_processor_init, + boot_application_processors, + get_processor_count, + message_output_init, + output_message_buf, + }; + } else if #[cfg(target_arch = "x86_64")] { + pub mod x86_64; + pub use self::x86_64::*; -/// Force strict CPU ordering, serializes load and store operations. -#[allow(dead_code)] -#[cfg(target_arch = "aarch64")] -#[inline(always)] -pub(crate) fn memory_barrier() { - use core::arch::asm; - unsafe { - asm!("dmb ish", options(nostack, nomem, preserves_flags),); + pub use self::x86_64::kernel::apic::{ + set_oneshot_timer, + wakeup_core, + }; + #[cfg(all(target_os = "none", feature = "smp"))] + pub use self::x86_64::kernel::application_processor_init; + pub use self::x86_64::kernel::core_local; + pub use self::x86_64::kernel::gdt::set_current_kernel_stack; + pub use self::x86_64::kernel::interrupts; + #[cfg(feature = "pci")] + pub use self::x86_64::kernel::pci; + pub use self::x86_64::kernel::processor; + pub use self::x86_64::kernel::scheduler; + pub use self::x86_64::kernel::switch; + pub use self::x86_64::kernel::systemtime::get_boot_time; + #[cfg(target_os = "none")] + pub use self::x86_64::kernel::{ + boot_application_processors, + boot_processor_init, + }; + pub use self::x86_64::kernel::{ + get_processor_count, + message_output_init, + output_message_buf, + }; } } - -/// Force strict CPU ordering, serializes load and store operations. -#[allow(dead_code)] -#[cfg(target_arch = "x86_64")] -#[inline(always)] -pub(crate) fn memory_barrier() { - use core::arch::asm; - unsafe { - asm!("mfence", options(nostack, nomem, preserves_flags),); - } -} - -pub fn init_drivers() { - // Initialize PCI Drivers for x86_64 - #[cfg(feature = "pci")] - crate::drivers::pci::init_drivers(); - #[cfg(all( - target_arch = "x86_64", - not(feature = "pci"), - any(feature = "tcp", feature = "udp") - ))] - crate::arch::x86_64::kernel::mmio::init_drivers(); -} diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs index a459fd5479..7809b7212c 100644 --- a/src/arch/x86_64/mod.rs +++ b/src/arch/x86_64/mod.rs @@ -1,2 +1,20 @@ pub mod kernel; pub mod mm; + +/// Force strict CPU ordering, serializes load and store operations. +#[allow(dead_code)] +#[inline(always)] +pub(crate) fn memory_barrier() { + use core::arch::asm; + unsafe { + asm!("mfence", options(nostack, nomem, preserves_flags),); + } +} + +pub fn init_drivers() { + // Initialize PCI Drivers + #[cfg(feature = "pci")] + crate::drivers::pci::init_drivers(); + #[cfg(all(not(feature = "pci"), any(feature = "tcp", feature = "udp")))] + crate::arch::x86_64::kernel::mmio::init_drivers(); +}