aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-03-16 21:06:12 +0100
committerLukas Oesch <lukasoesch20@gmail.com>2026-03-17 16:44:31 +0100
commita20045fb209edc1e338039c28634c942e3113ea4 (patch)
treea41a6ba7e4e8530e9594066c66d0dae7fcb275ca /arch/x86_64/src
parent292c5ff7c0c0ae89cfed7124c3ad931b9f555d19 (diff)
downloadteachos-a20045fb209edc1e338039c28634c942e3113ea4.tar.xz
teachos-a20045fb209edc1e338039c28634c942e3113ea4.zip
Protect boot modules in region_allocator
Diffstat (limited to 'arch/x86_64/src')
-rw-r--r--arch/x86_64/src/memory/region_allocator.cpp43
1 files changed, 32 insertions, 11 deletions
diff --git a/arch/x86_64/src/memory/region_allocator.cpp b/arch/x86_64/src/memory/region_allocator.cpp
index facb1f2..2690a7c 100644
--- a/arch/x86_64/src/memory/region_allocator.cpp
+++ b/arch/x86_64/src/memory/region_allocator.cpp
@@ -35,7 +35,7 @@ namespace arch::memory
, m_kernel_end{kapi::memory::frame::containing(mem_info.image_range.second)}
, m_multiboot_start{kapi::memory::frame::containing(mem_info.mbi_range.first)}
, m_multiboot_end{kapi::memory::frame::containing(mem_info.mbi_range.second)}
- // TODO BA-FS26: Protect MB2 boot modules
+ , m_multiboot_information{mem_info.mbi}
{
choose_next_region();
}
@@ -76,19 +76,40 @@ namespace arch::memory
}
}
- if (falls_within(m_next_frame, m_kernel_start, m_kernel_end))
+ auto advanced = true;
+ while (advanced)
{
- m_next_frame = m_kernel_end + 1;
- }
+ advanced = false;
- if (falls_within(m_next_frame, m_multiboot_start, m_multiboot_end))
- {
- m_next_frame = m_multiboot_end + 1;
- }
+ if (falls_within(m_next_frame, m_kernel_start, m_kernel_end))
+ {
+ m_next_frame = m_kernel_end + 1;
+ advanced = true;
+ break;
+ }
- if (falls_within(m_next_frame, m_kernel_start, m_kernel_end))
- {
- m_next_frame = m_kernel_end + 1;
+ if (falls_within(m_next_frame, m_multiboot_start, m_multiboot_end))
+ {
+ m_next_frame = m_multiboot_end + 1;
+ advanced = true;
+ break;
+ }
+
+ if (m_multiboot_information)
+ {
+ for (auto const & module : m_multiboot_information->modules())
+ {
+ auto module_start = kapi::memory::frame::containing(kapi::memory::physical_address{module.start_address});
+ auto module_end = kapi::memory::frame::containing(kapi::memory::physical_address{module.end_address});
+
+ if (falls_within(m_next_frame, module_start, module_end))
+ {
+ m_next_frame = module_end + 1;
+ advanced = true;
+ break;
+ }
+ }
+ }
}
if (m_next_frame > last_frame(*m_current_region))