From bd7889f22a59c567d205c32dc4ffc508b9780121 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Thu, 25 Apr 2024 19:03:35 +0200 Subject: [PATCH] Added printing memory map --- include/string.h | 5 +++++ src/kernel.c | 38 ++++++++++++++++++++++++++++++++++++++ src/stage2.asm | 23 +++++++++++------------ 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/include/string.h b/include/string.h index e8c282c..aeb80c1 100644 --- a/include/string.h +++ b/include/string.h @@ -9,6 +9,11 @@ char* itoa(uint32_t val, uint8_t base) { if (base == 0 || base > 16) { // TODO: Add errors!! + return NULL; + } + + if (val == 0) { + buf[0] = '0'; return buf; } diff --git a/src/kernel.c b/src/kernel.c index 5edfadf..be15675 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -11,10 +11,18 @@ #define PROMPT "#> " +typedef struct smapEntry_s { + uint64_t baseAddress; + uint64_t length; + uint32_t type; + uint32_t acpiAttr; +} __attribute__ ((packed)) smapEntry_t; + char* filetable = (char*)0x7000; // Pretty sure we don't have to care about the bootloader at 0x7c00 // Function declarations void printFiletable(char* ft); +void printPhysicalMemmap(); void main() { // Interrupts @@ -37,6 +45,8 @@ void main() { print("kern.\n\n"); diskRead(5, 1, filetable); // Read the filetable and store it in memory + + printPhysicalMemmap(); // Run Interactive Shell Program // TODO: Make it in another file @@ -282,3 +292,31 @@ void printFiletable(char* ft) { } } +void printPhysicalMemmap() { + uint32_t entryCount = *(uint32_t*)0x8500; + smapEntry_t* smapEntry = (smapEntry_t*)0x8504; + + for (uint32_t i = 0; i < entryCount; i++) { + print("Region "); + if (i) print(itoa(i, 10)); + else print("0"); + print(": base: 0x"); + print(itoa(smapEntry->baseAddress, 16)); + print(" length: 0x"); + print(itoa(smapEntry->length, 16)); + print(" type: 0x"); + print(itoa(smapEntry->type, 16)); + + switch (smapEntry->type) { + case 1: print(" (Available)"); break; + case 2: print(" (Reserved)"); break; + case 3: print(" (ACPI Reclaim)"); break; + case 4: print(" (ACPI NVS)"); break; + default: print(" (Reserved)"); break; + } + + putc('\n'); + smapEntry++; + } +} + diff --git a/src/stage2.asm b/src/stage2.asm index 8570419..e100908 100644 --- a/src/stage2.asm +++ b/src/stage2.asm @@ -13,7 +13,7 @@ start: memMapEntries equ 0x8500 getMemoryMap: - mov di, memMapEntries + 4 ; 4 bytes after memMapEntries + mov di, 0x8504 ; 4 bytes after memMapEntries xor ebx, ebx xor bp, bp mov edx, "PAMS" ; SMAP in little endian @@ -26,14 +26,21 @@ getMemoryMap: cmp eax, "PAMS" jne .error test ebx, ebx - jz .error + jnz .start + +.error: + mov si, acpiFuncErr + call print + cli + hlt .nextEntry: mov edx, "PAMS" ; In case BIOS messes with edx mov ecx, 24 mov eax, 0xe820 int 0x15 - + +.start: jcxz .skipEntry mov ecx, [es:di+8] ; Low 32 bits of length or ecx, [es:di+12] ; High 32 bits of length @@ -48,21 +55,13 @@ getMemoryMap: jz .done jmp .nextEntry -.error: - mov si, acpiFuncErr - call print - cli - hlt - .done: mov [memMapEntries], bp clc vbeSetup: ; Setup VBE info - xor ax, ax - mov es, ax - mov ah, 0x4f + mov ax, 0x4f00 mov di, vbeInfoBlock int 0x10