diff options
author | Nathan Ringo <nathan@remexre.com> | 2024-08-27 12:23:38 -0500 |
---|---|---|
committer | Nathan Ringo <nathan@remexre.com> | 2024-08-27 12:23:38 -0500 |
commit | 15fd8115739da57c6aa64da9a2ac6e0f0b7ba088 (patch) | |
tree | 28a9032f3b0a3089f5fc1e8cf7587d6803085071 /kernel/src/lib.rs | |
parent | 251ea035fa2338db7b001af338d65875a9bc65ad (diff) |
The start of the buddy allocator.
Diffstat (limited to 'kernel/src/lib.rs')
-rw-r--r-- | kernel/src/lib.rs | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 5e23109..e369864 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -4,17 +4,15 @@ pub mod util; pub mod allocators; +pub mod arch; pub mod collections; pub mod console; pub mod device_tree; pub mod drivers; -pub mod interrupts; -pub mod prelude; - -#[cfg(not(test))] mod panic; +pub mod prelude; -use crate::{allocators::physical_memory_free_list::FreeList, prelude::*}; +use crate::{allocators::physical_memory_free_list::FreeList, arch::sleep_forever, prelude::*}; /// The entrypoint to the kernel. This should be executed by hart0 alone. It performs some early /// boot tasks, then wakes up any other harts. @@ -42,16 +40,7 @@ pub unsafe extern "C" fn hart0_boot(device_tree: *const u8) -> ! { let mut physical_memory_free_list = FreeList::new(&flattened_device_tree); flattened_device_tree .for_each_node(|node| { - if node.is_unit(&["", "cpus"]) { - // TODO: Do this later. - if let Some(timebase_frequency) = node.get_prop_u32("timebase-frequency") { - // SAFETY: Other harts are not concurrently running, so they can't be - // concurrently accessing or modifying this. - unsafe { - drivers::riscv_timer::TIMEBASE_FREQUENCY = timebase_frequency; - } - } - } else if node.is_unit(&["", "memory"]) { + if node.is_unit(&["", "memory"]) { // Get the memory ranges. let Some(reg) = node.get_reg_usize() else { warn!("{}reg was not valid", node.name()); @@ -60,7 +49,6 @@ pub unsafe extern "C" fn hart0_boot(device_tree: *const u8) -> ! { for (addr, size) in reg { physical_memory_free_list.add_range(addr..addr + size); - info!("found memory: addr = {addr:#x}, size = {size:#x}"); } } Ok(()) @@ -88,9 +76,24 @@ pub unsafe extern "C" fn hart0_boot(device_tree: *const u8) -> ! { } // After this point, everything else is for debugging. - interrupts::example_timer(); - info!("sleeping forever..."); - loop { - unsafe { core::arch::asm!("wfi") } + #[cfg(target_arch = "riscv64")] + { + flattened_device_tree + .for_each_node(|node| { + if node.is_unit(&["", "cpus"]) { + if let Some(timebase_frequency) = node.get_prop_u32("timebase-frequency") { + // SAFETY: Other harts are not concurrently running, so they can't be + // concurrently accessing or modifying this. + unsafe { + drivers::riscv_timer::TIMEBASE_FREQUENCY = timebase_frequency; + } + } + } + Ok(()) + }) + .unwrap_or_else(|err| void::unreachable(err)); + arch::interrupts::example_timer(); } + info!("sleeping forever..."); + sleep_forever(); } |