summaryrefslogtreecommitdiff
path: root/kernel/src/lib.rs
diff options
context:
space:
mode:
authorNathan Ringo <nathan@remexre.com>2024-08-27 12:23:38 -0500
committerNathan Ringo <nathan@remexre.com>2024-08-27 12:23:38 -0500
commit15fd8115739da57c6aa64da9a2ac6e0f0b7ba088 (patch)
tree28a9032f3b0a3089f5fc1e8cf7587d6803085071 /kernel/src/lib.rs
parent251ea035fa2338db7b001af338d65875a9bc65ad (diff)
The start of the buddy allocator.
Diffstat (limited to 'kernel/src/lib.rs')
-rw-r--r--kernel/src/lib.rs43
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();
}