[Zion] Add a method to dump the bootloader memory regions.
This commit is contained in:
parent
17ed4ca1f6
commit
a745f45b5d
|
@ -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)
|
||||
;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -13,6 +13,8 @@ void InitBootstrapPageAllocation();
|
|||
// Initializes the main physical memory manager.
|
||||
void InitPhysicalMemoryManager();
|
||||
|
||||
void DumpRegions();
|
||||
|
||||
uint64_t AllocatePage();
|
||||
uint64_t AllocateAndZeroPage();
|
||||
|
||||
|
|
|
@ -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.");
|
||||
|
||||
|
|
Loading…
Reference in New Issue