From a745f45b5d2a5402caa90d3c2123186e5a45933d Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Wed, 8 Nov 2023 08:07:57 -0800 Subject: [PATCH] [Zion] Add a method to dump the bootloader memory regions. --- zion/debug/debug.cpp | 136 +------------------------------- zion/memory/physical_memory.cpp | 37 ++++++++- zion/memory/physical_memory.h | 2 + zion/zion.cpp | 1 + 4 files changed, 40 insertions(+), 136 deletions(-) diff --git a/zion/debug/debug.cpp b/zion/debug/debug.cpp index 57d41f4..0256bdd 100644 --- a/zion/debug/debug.cpp +++ b/zion/debug/debug.cpp @@ -27,59 +27,6 @@ void dbg(const glcr::StringView& str) { } } -void U64ToStr(uint64_t u, char* str) { - uint64_t len = 0; - uint64_t u2 = u; - while (u2 != 0) { - len++; - u2 /= 10; - } - - if (len == 0) { - len = 1; - } - - str[len] = '\0'; - - for (int64_t i = len - 1; i >= 0; i--) { - str[i] = (u % 10) + '0'; - u /= 10; - } -} - -void HexToStr(uint64_t u, char* str) { - uint64_t len = 0; - uint64_t u2 = u; - while (u2 != 0) { - len++; - u2 /= 16; - } - - if (len == 0) { - len = 1; - } - - len += 2; - str[0] = '0'; - str[1] = 'x'; - str[len] = '\0'; - const char* hex = "0123456789ABCDEF"; - for (uint64_t i = len - 1; i > 1; i--) { - str[i] = hex[u & 0xF]; - u >>= 4; - } -} - -void MemToStr(uint64_t u, char* str) { - str[0] = '0'; - str[1] = 'x'; - const char* hex = "0123456789ABCDEF"; - for (uint64_t i = 0; i < 16; i++) { - str[17 - i] = hex[(u >> (i * 4)) & 0xF]; - } - str[18] = '\0'; -} - void AddProcPrefix() { if (gScheduler != nullptr) { auto t = gScheduler->CurrentThread(); @@ -87,90 +34,15 @@ void AddProcPrefix() { } } -void dbg_internal(const char* fmt, va_list args) { - for (; *fmt != '\0'; fmt++) { - if (*fmt != '%') { - dbgputchar(*fmt); - continue; - } - fmt++; - switch (*fmt) { - case '%': - dbgputchar('%'); - break; - case 's': { - char* str = va_arg(args, char*); - dbgcstr(str); - break; - } - case 'c': { - char c = va_arg(args, int); - dbgputchar(c); - break; - } - case 'u': { - uint64_t u = va_arg(args, uint64_t); - char str[21]; - U64ToStr(u, str); - dbgcstr(str); - break; - } - case 'x': { - uint64_t u = va_arg(args, uint64_t); - char str[19]; - HexToStr(u, str); - dbgcstr(str); - break; - } - case 'm': { - uint64_t u = va_arg(args, uint64_t); - char str[19]; - MemToStr(u, str); - dbgcstr(str); - break; - } - default: { - panic("Bad format char: %c", *fmt); - } - } - } -} - } // namespace -void early_dbgln(const char* str) { dbgcstr(str); } +void early_dbgln(const char* str) { + dbgcstr(str); + dbgcstr("\n"); +} void dbgln(const glcr::StringView& str) { AddProcPrefix(); dbg(str); dbg("\n"); } - -void dbg(const char* fmt, ...) { - va_list arg; - va_start(arg, fmt); - dbg_internal(fmt, arg); - va_end(arg); -} - -void dbgln(const char* fmt, ...) { - AddProcPrefix(); - va_list arg; - va_start(arg, fmt); - dbg_internal(fmt, arg); - va_end(arg); - dbgputchar('\n'); -} - -void panic(const char* fmt, ...) { - asm volatile("cli"); - AddProcPrefix(); - va_list arg; - va_start(arg, fmt); - dbg_internal(fmt, arg); - va_end(arg); - dbgputchar('\n'); - dbgln("PANIC"); - while (1) - ; -} diff --git a/zion/memory/physical_memory.cpp b/zion/memory/physical_memory.cpp index 6efc8dd..1326209 100644 --- a/zion/memory/physical_memory.cpp +++ b/zion/memory/physical_memory.cpp @@ -36,9 +36,6 @@ class PhysicalMemoryManager { const limine_memmap_response& memmap = boot::GetMemoryMap(); for (uint64_t i = 0; i < memmap.entry_count; i++) { const limine_memmap_entry& entry = *memmap.entries[i]; -#if K_PHYS_DEBUG - dbgln("Region({}) at {x}:{x}", entry.type, entry.base, entry.length); -#endif if (entry.type == 0) { uint64_t base = entry.base; uint64_t size = entry.length; @@ -155,6 +152,38 @@ void InitBootstrapPageAllocation() { void InitPhysicalMemoryManager() { gPmm = new PhysicalMemoryManager(); } +glcr::StringView MemoryRegionStr(uint64_t type) { + switch (type) { + case LIMINE_MEMMAP_USABLE: + return "USABLE"; + case LIMINE_MEMMAP_RESERVED: + return "RESRVD"; + case LIMINE_MEMMAP_ACPI_RECLAIMABLE: + return "ACPIREC"; + case LIMINE_MEMMAP_ACPI_NVS: + return "ACPINVS"; + case LIMINE_MEMMAP_BAD_MEMORY: + return "BADMEM"; + case LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE: + return "LIMINE"; + case LIMINE_MEMMAP_KERNEL_AND_MODULES: + return "KERNEL"; + case LIMINE_MEMMAP_FRAMEBUFFER: + return "FRMBFR"; + default: + return "UNKNWN"; + } +} + +void DumpRegions() { + const limine_memmap_response& memmap = boot::GetMemoryMap(); + for (uint64_t i = 0; i < memmap.entry_count; i++) { + const limine_memmap_entry& entry = *memmap.entries[i]; + dbgln("Region({}) at {x}:{x} ({x})", MemoryRegionStr(entry.type), + entry.base, entry.base + entry.length, entry.length); + } +} + uint64_t AllocatePage() { if (gPmm != nullptr) { return gPmm->AllocatePage(); @@ -164,7 +193,7 @@ uint64_t AllocatePage() { } #if K_PHYS_DEBUG - dbgln("[PMM] Boostrap Alloc!"); + early_dbgln("[PMM] Boostrap Alloc!"); #endif uint64_t page = gBootstrap.next_page; diff --git a/zion/memory/physical_memory.h b/zion/memory/physical_memory.h index 573a13f..c4830a5 100644 --- a/zion/memory/physical_memory.h +++ b/zion/memory/physical_memory.h @@ -13,6 +13,8 @@ void InitBootstrapPageAllocation(); // Initializes the main physical memory manager. void InitPhysicalMemoryManager(); +void DumpRegions(); + uint64_t AllocatePage(); uint64_t AllocateAndZeroPage(); diff --git a/zion/zion.cpp b/zion/zion.cpp index 876c221..6e5d7cd 100644 --- a/zion/zion.cpp +++ b/zion/zion.cpp @@ -26,6 +26,7 @@ extern "C" void zion() { KernelHeap heap(0xFFFFFFFF'40000000, 0xFFFFFFFF'80000000); phys_mem::InitPhysicalMemoryManager(); heap.InitializeSlabAllocators(); + phys_mem::DumpRegions(); dbgln("[boot] Memory allocations available now.");