aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/memory')
-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))