Added printing memory map

This commit is contained in:
2024-04-25 19:03:35 +02:00
parent f3c41cc6de
commit bd7889f22a
3 changed files with 54 additions and 12 deletions
+5
View File
@@ -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;
}
+38
View File
@@ -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++;
}
}
+11 -12
View File
@@ -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