summaryrefslogtreecommitdiff
path: root/kernel/src/lib.rs
diff options
context:
space:
mode:
authorNathan Ringo <nathan@remexre.com>2024-09-01 19:59:44 -0500
committerNathan Ringo <nathan@remexre.com>2024-09-01 19:59:44 -0500
commit386df39c9866a4d945de46ef0dcab2363c674e0e (patch)
treec0572ce6a2c81c93546210f599dff553783c5760 /kernel/src/lib.rs
parent6b98b6afea6e790abe738a67aa28bab54c91afe0 (diff)
Move almost all the kernel into crates/.
Diffstat (limited to 'kernel/src/lib.rs')
-rw-r--r--kernel/src/lib.rs99
1 files changed, 0 insertions, 99 deletions
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs
deleted file mode 100644
index e369864..0000000
--- a/kernel/src/lib.rs
+++ /dev/null
@@ -1,99 +0,0 @@
-#![no_std]
-
-#[macro_use]
-pub mod util;
-
-pub mod allocators;
-pub mod arch;
-pub mod collections;
-pub mod console;
-pub mod device_tree;
-pub mod drivers;
-mod panic;
-pub mod 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.
-///
-/// # Safety
-///
-/// - The `device_tree` pointer must be a valid pointer into physical memory. See
-/// `device_tree::FlattenedDeviceTree::from_ptr` for the precise requirements.
-/// - This must be called in supervisor mode with paging and traps disabled, but with all traps
-/// delegated to supervisor mode.
-/// - Any other harts must not be running concurrently with us. TODO: Define their state.
-#[no_mangle]
-pub unsafe extern "C" fn hart0_boot(device_tree: *const u8) -> ! {
- // Set up the logger.
- //
- // TODO: This should really be named something better than console.
- console::init();
-
- // Parse the DeviceTree.
- let flattened_device_tree = unsafe { device_tree::FlattenedDeviceTree::from_ptr(device_tree) }
- .expect("invalid DeviceTree");
-
- // Find the available physical memory areas and initialize the physical memory
- // free-list.
- let mut physical_memory_free_list = FreeList::new(&flattened_device_tree);
- flattened_device_tree
- .for_each_node(|node| {
- if node.is_unit(&["", "memory"]) {
- // Get the memory ranges.
- let Some(reg) = node.get_reg_usize() else {
- warn!("{}reg was not valid", node.name());
- return Ok(());
- };
-
- for (addr, size) in reg {
- physical_memory_free_list.add_range(addr..addr + size);
- }
- }
- Ok(())
- })
- .unwrap_or_else(|err| void::unreachable(err));
-
- // Log the physical memory we found.
- debug!(
- "found {} usable regions of physical memory{}",
- physical_memory_free_list.len(),
- if physical_memory_free_list.is_empty() {
- ""
- } else {
- ":"
- }
- );
- for region in physical_memory_free_list.drain() {
- debug!(
- "{:p}..{:p} ({} byte{})",
- region.start as *const u8,
- region.end as *const u8,
- region.len(),
- if region.len() == 1 { "" } else { "s" }
- )
- }
-
- // After this point, everything else is for debugging.
- #[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();
-}