* Do not use KernelMapper for ACPI SDT mapping

* Clarify doc comment
This commit is contained in:
R Aadarsh
2026-07-18 17:25:02 +05:30
parent 4251102f0b
commit eaf50894aa
5 changed files with 32 additions and 16 deletions
+19 -7
View File
@@ -6,6 +6,7 @@ use core::ptr::NonNull;
use alloc::{boxed::Box, string::String, vec::Vec};
use hashbrown::HashMap;
use rmm::{BumpAllocator, FrameAllocator, PageMapper};
use spin::{Once, RwLock};
use crate::{
@@ -31,7 +32,11 @@ mod spcr;
pub mod srat;
mod xsdt;
unsafe fn map_linearly(addr: PhysicalAddress, len: usize, mapper: &mut crate::memory::PageMapper) {
unsafe fn map_linearly(
addr: PhysicalAddress,
len: usize,
mapper: &mut PageMapper<RmmA, impl FrameAllocator>,
) {
unsafe {
let base = PhysicalAddress::new(crate::memory::round_down_pages(addr.data()));
let aligned_len = crate::memory::round_up_pages(len + (addr.data() - base.data()));
@@ -48,7 +53,10 @@ unsafe fn map_linearly(addr: PhysicalAddress, len: usize, mapper: &mut crate::me
}
}
pub fn get_sdt(sdt_address: PhysicalAddress, mapper: &mut KernelMapper<true>) -> &'static Sdt {
pub fn get_sdt(
sdt_address: PhysicalAddress,
mapper: &mut PageMapper<RmmA, impl FrameAllocator>,
) -> &'static Sdt {
let sdt;
unsafe {
@@ -91,16 +99,20 @@ impl Rxsdt for RxsdtEnum {
pub static RXSDT_ENUM: Once<RxsdtEnum> = Once::new();
/// Initialses the global `RXSDT_ENUM` if RSDT or XSDT was found and maps the SDT pages.
/// It does not perform any allocations
pub unsafe fn init_before_mem(already_supplied_rsdp: Option<NonNull<u8>>) {
/// Initialises the global `RXSDT_ENUM` if RSDT or XSDT was found and maps the SDT pages.
///
/// It does not use `TheFrameAllocator` nor does it heap-allocate.
pub unsafe fn init_before_mem(
already_supplied_rsdp: Option<NonNull<u8>>,
mapper: &mut PageMapper<RmmA, BumpAllocator<RmmA>>,
) {
unsafe {
// Search for RSDP
let rsdp_opt = Rsdp::get_rsdp(already_supplied_rsdp);
if let Some(rsdp) = rsdp_opt {
debug!("SDT address: {:#x}", rsdp.sdt_address().data());
let rxsdt = get_sdt(rsdp.sdt_address(), &mut KernelMapper::lock_rw());
let rxsdt = get_sdt(rsdp.sdt_address(), mapper);
let rxsdt = if let Some(rsdt) = Rsdt::new(rxsdt) {
let mut initialized = false;
@@ -137,7 +149,7 @@ pub unsafe fn init_before_mem(already_supplied_rsdp: Option<NonNull<u8>>) {
// TODO: Don't touch ACPI tables in kernel?
for sdt in rxsdt.iter() {
get_sdt(sdt, &mut KernelMapper::lock_rw());
get_sdt(sdt, mapper);
}
} else {
error!("NO RSDP FOUND");
+3 -2
View File
@@ -100,13 +100,14 @@ unsafe extern "C" fn start(args_ptr: *const KernelArgs) -> ! {
// Initialize paging
paging::init();
let mut mapper = rmm::PageMapper::current(rmm::TableKind::Kernel, bump_allocator);
#[cfg(feature = "acpi")]
{
use crate::acpi;
acpi::init_before_mem(args.acpi_rsdp());
acpi::init_before_mem(args.acpi_rsdp(), &mut mapper);
}
crate::memory::init_mm(bump_allocator);
crate::memory::init_mm(mapper.allocator_mut());
crate::arch::misc::init(crate::cpu_set::LogicalCpuId::new(0));
+2 -2
View File
@@ -105,7 +105,7 @@ unsafe extern "C" fn start(args_ptr: *const KernelArgs) -> ! {
}
// Initialize RMM
let bump_allocator = crate::startup::memory::init(&args, None, None);
let mut bump_allocator = crate::startup::memory::init(&args, None, None);
let boot_hart_id =
get_boot_hart_id(args.env()).expect("Didn't get boot HART id from bootloader");
@@ -114,7 +114,7 @@ unsafe extern "C" fn start(args_ptr: *const KernelArgs) -> ! {
paging::init();
crate::memory::init_mm(bump_allocator);
crate::memory::init_mm(&mut bump_allocator);
crate::arch::misc::init(crate::cpu_set::LogicalCpuId::new(0));
+6 -3
View File
@@ -4,6 +4,8 @@
//! defined in other files inside of the `arch` module
use core::{arch::naked_asm, cell::SyncUnsafeCell, mem::offset_of};
use rmm::PageMapper;
use crate::{
allocator,
arch::{device, gdt, idt, interrupt, paging},
@@ -112,13 +114,14 @@ unsafe extern "C" fn start(args_ptr: *const KernelArgs, stack_end: usize) -> ! {
// Initialize paging
paging::init();
let mut mapper = PageMapper::current(rmm::TableKind::Kernel, bump_allocator);
if cfg!(feature = "acpi") {
crate::acpi::init_before_mem(args.acpi_rsdp());
crate::acpi::init_before_mem(args.acpi_rsdp(), &mut mapper);
}
numa::init(&mut bump_allocator);
numa::init(mapper.allocator_mut());
crate::memory::init_mm(bump_allocator);
crate::memory::init_mm(mapper.allocator_mut());
#[cfg(target_arch = "x86_64")]
crate::arch::alternative::early_init(true);
+2 -2
View File
@@ -549,7 +549,7 @@ const _: () = {
};
#[cold]
fn init_sections(mut allocator: BumpAllocator<RmmA>) {
fn init_sections(mut allocator: &mut BumpAllocator<RmmA>) {
let number_of_memory_regions = numa::number_of_memory_regions();
let (free_areas, offset_into_first_free_area) = allocator.free_areas();
@@ -958,7 +958,7 @@ fn init_sections(mut allocator: BumpAllocator<RmmA>) {
}
#[cold]
pub fn init_mm(allocator: BumpAllocator<RmmA>) {
pub fn init_mm(allocator: &mut BumpAllocator<RmmA>) {
init_sections(allocator);
unsafe {