Compare commits

..

No commits in common. "ee276a3a35ae1ba4181efc6d73ea27dd5f629658" and "8598b1e8fcaa8e863a693341499cf52082baa816" have entirely different histories.

5 changed files with 27 additions and 36 deletions

View File

@ -15,9 +15,9 @@ extern const u8 end_of_kernel_rodata[1];
extern const u8 start_of_kernel_data[1]; extern const u8 start_of_kernel_data[1];
extern const u8 end_of_kernel_data[1]; extern const u8 end_of_kernel_data[1];
static usize free_mem = 0; static u64 free_mem = 0;
static usize used_mem = 0; static u64 used_mem = 0;
static usize reserved_mem = 0; static u64 reserved_mem = 0;
static u64 start_index = 0; static u64 start_index = 0;
@ -38,12 +38,12 @@ namespace MemoryManager
{ {
Result<void> protect_kernel_sections() Result<void> protect_kernel_sections()
{ {
const usize rodata_size = (usize)(end_of_kernel_rodata - start_of_kernel_rodata); const u64 rodata_size = (u64)(end_of_kernel_rodata - start_of_kernel_rodata);
const usize rodata_pages = get_blocks_from_size(rodata_size, ARCH_PAGE_SIZE); const u64 rodata_pages = get_blocks_from_size(rodata_size, ARCH_PAGE_SIZE);
TRY(remap((u64)start_of_kernel_rodata, rodata_pages, MMU::NoExecute)); TRY(remap((u64)start_of_kernel_rodata, rodata_pages, MMU::NoExecute));
const usize data_size = (usize)(end_of_kernel_data - start_of_kernel_data); const u64 data_size = (u64)(end_of_kernel_data - start_of_kernel_data);
const usize data_pages = get_blocks_from_size(data_size, ARCH_PAGE_SIZE); const u64 data_pages = get_blocks_from_size(data_size, ARCH_PAGE_SIZE);
TRY(remap((u64)start_of_kernel_data, data_pages, MMU::NoExecute | MMU::ReadWrite)); TRY(remap((u64)start_of_kernel_data, data_pages, MMU::NoExecute | MMU::ReadWrite));
return {}; return {};
@ -81,7 +81,7 @@ namespace MemoryManager
while (iter.next().try_set_value(entry)) while (iter.next().try_set_value(entry))
{ {
const u64 index = entry.address() / ARCH_PAGE_SIZE; const u64 index = entry.address() / ARCH_PAGE_SIZE;
const usize pages = entry.size() / ARCH_PAGE_SIZE; const u64 pages = entry.size() / ARCH_PAGE_SIZE;
if (!entry.is_free()) { reserved_mem += entry.size(); } if (!entry.is_free()) { reserved_mem += entry.size(); }
else else
{ {
@ -99,17 +99,6 @@ namespace MemoryManager
init_physical_frame_allocator(); init_physical_frame_allocator();
KernelVM::init(); KernelVM::init();
MMU::setup_initial_page_directory(); MMU::setup_initial_page_directory();
// NOTE: We force these operations to succeed, because if we can't map the frame bitmap to virtual memory
// there's no point in continuing.
auto bitmap_pages = g_frame_bitmap.size_in_bytes() / ARCH_PAGE_SIZE;
auto virtual_bitmap_base = KernelVM::alloc_several_pages(bitmap_pages).release_value();
map_frames_at(virtual_bitmap_base, (u64)g_frame_bitmap.location(), bitmap_pages,
MMU::ReadWrite | MMU::NoExecute)
.release_value();
g_frame_bitmap.initialize((void*)virtual_bitmap_base, g_frame_bitmap.size_in_bytes());
} }
void lock_frame(u64 frame) void lock_frame(u64 frame)
@ -121,9 +110,9 @@ namespace MemoryManager
free_mem -= ARCH_PAGE_SIZE; free_mem -= ARCH_PAGE_SIZE;
} }
void lock_frames(u64 frames, usize count) void lock_frames(u64 frames, u64 count)
{ {
for (usize index = 0; index < count; index++) { lock_frame(frames + (index * ARCH_PAGE_SIZE)); } for (u64 index = 0; index < count; index++) { lock_frame(frames + (index * ARCH_PAGE_SIZE)); }
} }
Result<u64> alloc_frame() Result<u64> alloc_frame()
@ -253,22 +242,22 @@ namespace MemoryManager
return false; return false;
} }
usize free() u64 free()
{ {
return free_mem; return free_mem;
} }
usize used() u64 used()
{ {
return used_mem; return used_mem;
} }
usize reserved() u64 reserved()
{ {
return reserved_mem; return reserved_mem;
} }
usize total() u64 total()
{ {
return free_mem + used_mem + reserved_mem; return free_mem + used_mem + reserved_mem;
} }

View File

@ -12,7 +12,7 @@ namespace MemoryManager
Result<void> free_frame(u64 frame); Result<void> free_frame(u64 frame);
void lock_frame(u64 frame); void lock_frame(u64 frame);
void lock_frames(u64 frames, usize count); void lock_frames(u64 frames, u64 count);
Result<void> remap(u64 address, usize count, int flags); Result<void> remap(u64 address, usize count, int flags);
Result<void> remap_unaligned(u64 address, usize count, int flags); Result<void> remap_unaligned(u64 address, usize count, int flags);
@ -27,8 +27,8 @@ namespace MemoryManager
Result<void> unmap_owned(u64 virt, usize count); Result<void> unmap_owned(u64 virt, usize count);
Result<void> unmap_weak(u64 virt, usize count); Result<void> unmap_weak(u64 virt, usize count);
usize free(); u64 free();
usize used(); u64 used();
usize reserved(); u64 reserved();
usize total(); u64 total();
} }

View File

@ -2,7 +2,7 @@
extern const BOOTBOOT bootboot; extern const BOOTBOOT bootboot;
MemoryMapEntry::MemoryMapEntry(u64 address, usize size, bool is_free) MemoryMapEntry::MemoryMapEntry(u64 address, u64 size, bool is_free)
: m_address(address), m_size(size), m_is_free(is_free) : m_address(address), m_size(size), m_is_free(is_free)
{ {
} }

View File

@ -7,7 +7,7 @@ struct MemoryMapEntry
{ {
MemoryMapEntry() = default; MemoryMapEntry() = default;
MemoryMapEntry(const MemoryMapEntry& other) = default; MemoryMapEntry(const MemoryMapEntry& other) = default;
MemoryMapEntry(u64 address, usize size, bool is_free); MemoryMapEntry(u64 address, u64 size, bool is_free);
u64 address() const u64 address() const
{ {
@ -19,7 +19,7 @@ struct MemoryMapEntry
return (void*)m_address; return (void*)m_address;
} }
usize size() const u64 size() const
{ {
return m_size; return m_size;
} }
@ -33,7 +33,7 @@ struct MemoryMapEntry
private: private:
u64 m_address; u64 m_address;
usize m_size; u64 m_size;
bool m_is_free; bool m_is_free;
}; };

View File

@ -1,14 +1,16 @@
#pragma once #pragma once
#include <luna/PlacementNew.h>
#include <luna/Result.h> #include <luna/Result.h>
#include <luna/SafeArithmetic.h>
template <typename T, class... Args> [[nodiscard]] Result<T*> make(Args... args) template <typename T, class... Args> Result<T*> make(Args... args)
{ {
T* const result = new T(args...); T* const result = new T(args...);
if (!result) return err(ENOMEM); if (!result) return err(ENOMEM);
return result; return result;
} }
template <typename T> [[nodiscard]] Result<T*> make_array(usize count) template <typename T> Result<T*> make_array(usize count)
{ {
T* const result = new T[count]; T* const result = new T[count];
if (!result) return err(ENOMEM); if (!result) return err(ENOMEM);