diff --git a/Bootloader/Source/main.c b/Bootloader/Source/main.c index 1193ffd..2a6df3d 100644 --- a/Bootloader/Source/main.c +++ b/Bootloader/Source/main.c @@ -192,6 +192,7 @@ static efi_status_t populate_memory_map(Bootinfo* boot_info) { while (1) { status = gBS->GetMemoryMap(&map_size, map, &map_key, &descriptor_size, &descriptor_version); if (EFI_ERROR(status)) { + gBS->FreePool(map); return status; } @@ -206,7 +207,12 @@ static efi_status_t populate_memory_map(Bootinfo* boot_info) { return EFI_SUCCESS; } + gBS->FreePool(map); map_size += 2 * descriptor_size; + status = gBS->AllocatePool(EfiLoaderData, map_size, (void**)&map); + if (EFI_ERROR(status)) { + return status; + } } } diff --git a/Kernel/Include/IO/Serial.h b/Kernel/Include/IO/Serial.h index f87d102..25dc8d0 100644 --- a/Kernel/Include/IO/Serial.h +++ b/Kernel/Include/IO/Serial.h @@ -2,8 +2,9 @@ #include enum { - kUARTBaseAddress = 0x09000000, // TODO: make it dynamic by parsing DTB + kUARTBaseAddress = 0x09000000, }; -Int32 IOSerialPutCharacter(ASCII character); -Int32 IOSerialPutString(const ASCII* string); \ No newline at end of file +void SerialUpdate(UInt64 address); +Int32 SerialPutCharacter(ASCII character); +Int32 SerialPutString(const ASCII* string); diff --git a/Kernel/Include/Types.h b/Kernel/Include/Types.h index 16ab7bf..96dba99 100644 --- a/Kernel/Include/Types.h +++ b/Kernel/Include/Types.h @@ -12,7 +12,7 @@ typedef unsigned char UInt8; typedef unsigned short UInt16; typedef unsigned int UInt32; -typedef unsigned long long UInt64; +typedef unsigned long long UInt64; typedef unsigned long long UInt; typedef void* Pointer; @@ -31,4 +31,3 @@ typedef UInt64 Size; typedef char ASCII; typedef _Bool Boolean; -#define loop while (1) \ No newline at end of file diff --git a/Kernel/Include/VM/PMM.h b/Kernel/Include/VM/PMM.h index e7eb1e4..da2c560 100644 --- a/Kernel/Include/VM/PMM.h +++ b/Kernel/Include/VM/PMM.h @@ -4,7 +4,8 @@ enum { kVMPageSize = 4096, kVMBlocksPerByte = 8, - kVMMaxReservedRegions = 128, + kVMMaxReservedRegions = 256, + kPMMReservedRegionCount = 3, }; typedef struct { @@ -28,4 +29,4 @@ typedef struct { void PMMInitialize(VMBootMemoryMap* bootMap); Pointer PMMAllocatePage(); -void PMMFreePage(Address address); \ No newline at end of file +void PMMFreePage(Address address); diff --git a/Kernel/Source/Arch/DTB.c b/Kernel/Source/Arch/DTB.c index 961a1f6..1a02290 100644 --- a/Kernel/Source/Arch/DTB.c +++ b/Kernel/Source/Arch/DTB.c @@ -24,10 +24,13 @@ void DTBParse(Pointer dtb, VMBootMemoryMap* bootMap) { ASCII* currentNode = ""; UInt32 currentDepth = 0; - UInt32 reservedMemoryDepth = 0; + UInt32 reservedMemoryDepth = 0; Boolean inReservedMemory = false; while (true) { + if (bootMap->reservedCount + kPMMReservedRegionCount >= kVMMaxReservedRegions) { + OSPanic("Too many reserved memory regions!"); // should never occur but jic + } UInt32 token = BytesSwap32(*(UInt32*)structs); structs += 4; @@ -81,7 +84,7 @@ void DTBParse(Pointer dtb, VMBootMemoryMap* bootMap) { bootMap->GIC.GICD.base = Merge32To64(BytesSwap32(cells[1]), BytesSwap32(cells[0])); bootMap->GIC.GICD.size = Merge32To64(BytesSwap32(cells[3]), BytesSwap32(cells[2])); - + bootMap->GIC.GICC.base = Merge32To64(BytesSwap32(cells[5]), BytesSwap32(cells[4])); bootMap->GIC.GICC.size = Merge32To64(BytesSwap32(cells[7]), BytesSwap32(cells[6])); } @@ -99,7 +102,7 @@ void DTBParse(Pointer dtb, VMBootMemoryMap* bootMap) { currentDepth--; break; } - + case FDTTokenNOP: continue; case FDTTokenEnd: return; default: @@ -107,4 +110,4 @@ void DTBParse(Pointer dtb, VMBootMemoryMap* bootMap) { } } -} \ No newline at end of file +} diff --git a/Kernel/Source/Arch/vectors.S b/Kernel/Source/Arch/vectors.S index 59db0d4..617f180 100644 --- a/Kernel/Source/Arch/vectors.S +++ b/Kernel/Source/Arch/vectors.S @@ -1,7 +1,7 @@ .macro ventry type .align 7 sub sp, sp, #288 // save 288 bytes of stack - stp x0, x1, [sp, #0] // move stack + stp x0, x1, [sp, #0] // move stack mov x1, #\type // move type to x1 b ExceptionsTrapEntry .endm @@ -54,6 +54,7 @@ ExceptionsTrapEntry: stp x30, x21, [sp, #16 * 15] stp x22, x23, [sp, #16 * 16] + stp x24, xzr, [sp, #16 * 17] mov x0, sp bl ExceptionsHandler @@ -92,4 +93,4 @@ ExceptionsVectorsInit: adr x0, ExceptionsVectorsTable msr vbar_el1, x0 isb - ret \ No newline at end of file + ret diff --git a/Kernel/Source/IO/Serial.c b/Kernel/Source/IO/Serial.c index 68f7ef9..3775c9a 100644 --- a/Kernel/Source/IO/Serial.c +++ b/Kernel/Source/IO/Serial.c @@ -2,22 +2,28 @@ #include #include -Int32 IOSerialPutCharacter(ASCII character) { +static UInt64 sUARTAddress = kUARTBaseAddress; + +void SerialUpdate(UInt64 address) { + sUARTAddress = address; +} + +Int32 SerialPutCharacter(ASCII character) { // TXFF -- TRansmit FIFO Full for PL011 is 5 bit of FR reg (0x18) - UInt64 uartFR = kUARTBaseAddress + 0x18; + UInt64 uartFR = sUARTAddress + 0x18; while ((IOAddressRead32(uartFR) & (1 << 5)) != 0) { CPUYield(); } - IOAddressWrite32(kUARTBaseAddress, character); + IOAddressWrite32(sUARTAddress, character); return character; } -Int32 IOSerialPutString(const ASCII* string) { +Int32 SerialPutString(const ASCII* string) { Int i = 0; while (string[i] != '\0') { - IOSerialPutCharacter(string[i]); + SerialPutCharacter(string[i]); i++; } diff --git a/Kernel/Source/KernelMain.c b/Kernel/Source/KernelMain.c index a94658e..ae6a2d7 100644 --- a/Kernel/Source/KernelMain.c +++ b/Kernel/Source/KernelMain.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -17,9 +18,10 @@ void KernelMain(Bootinfo* bootinfo) { } VMBootMemoryMap bootMap = {0}; - + bootMap.reservedCount = 0; DTBParse(bootinfo->dtb, &bootMap); + SerialUpdate(bootMap.UART.base); PMMInitialize(&bootMap); VMMInitialize(&bootMap, bootinfo); diff --git a/Kernel/Source/OS/Log.c b/Kernel/Source/OS/Log.c index d69be46..668381e 100644 --- a/Kernel/Source/OS/Log.c +++ b/Kernel/Source/OS/Log.c @@ -5,11 +5,11 @@ void OSLog(const ASCII* format, ...) { ASCII buffer[kOSLogBufferSize]; - + va_list args; va_start(args, format); StringFormatVariadic(buffer, kOSLogBufferSize, format, args); va_end(args); - IOSerialPutString(buffer); -} \ No newline at end of file + SerialPutString(buffer); +} diff --git a/Kernel/Source/OS/Panic.c b/Kernel/Source/OS/Panic.c index 51140a7..ab9138e 100644 --- a/Kernel/Source/OS/Panic.c +++ b/Kernel/Source/OS/Panic.c @@ -40,7 +40,7 @@ static const ASCII* sFunMessages[] = { }; __attribute__((noreturn)) static void Halt() { - loop { + while (true) { CPUDisableInterrupts(); CPUWaitForInterrupt(); } @@ -134,4 +134,4 @@ __attribute__((noreturn)) void OSPanicException(ExceptionsContext* frame) { DrawPanicFooter(); Halt(); -} \ No newline at end of file +} diff --git a/Kernel/Source/OS/Scheduler.c b/Kernel/Source/OS/Scheduler.c index 3310c91..d2d21a0 100644 --- a/Kernel/Source/OS/Scheduler.c +++ b/Kernel/Source/OS/Scheduler.c @@ -85,11 +85,11 @@ Address SchedulerNext(Address stackPointer) { if (taskIterator->sleepTicks > 0) taskIterator->sleepTicks--; taskIterator = taskIterator->next; } while (taskIterator != gOSSchedulerCurrentTask->next); - + if (gOSSchedulerCurrentTask->sleepTicks > 0) gOSSchedulerCurrentTask->sleepTicks--; OSTask* nextTask = gOSSchedulerCurrentTask->next; - loop { + while (true) { if (nextTask->state == OSTaskStateDead) { nextTask = nextTask->next; if (nextTask == gOSSchedulerCurrentTask) OSPanic("No running tasks"); @@ -110,7 +110,7 @@ Address SchedulerNext(Address stackPointer) { CPUSwitchAddressSpace(physicalL0Table); } gOSSchedulerCurrentTask = nextTask; - + return gOSSchedulerCurrentTask->stackPointer; } @@ -118,4 +118,4 @@ void SchedulerYield(UInt64 ticks) { gOSSchedulerCurrentTask->sleepTicks = ticks; gOSSchedulerCurrentTask->state = OSTaskStateSleeping; CPUException(kOSSchedulerExceptionNumber); -} \ No newline at end of file +}