fix: plug memory map leak, save sp_el0, dynamic UART, kill loop
- Bootloader: reallocate memory map buffer when ExitBootServices fails, so GetMemoryMap doesn't scribble past the old allocation on retry. - vectors.S: actually store sp_el0 into the exception frame. Previously it was read into x24 and then… vanished. EL0 tasks would wake up with a corrupted stack pointer. Not great. - Serial: split hardcoded 0x09000000 into a fallback default; add SerialUpdate() so the DTB-parsed UART address actually gets used. - DTB: add bounds check on reserved[] with PMM's 3 extra slots accounted for, so malformed/overstuffed DTBs don't silently corrupt memory. - PMM.h: bump kVMMaxReservedRegions 128→256, define kPMMReservedRegionCount. - Types.h: remove `#define loop while(1)`. while(true) is fine. - Rename IOSerial* → Serial* — the IO prefix was redundant, Serial.c already lives under IO/.
This commit is contained in:
@@ -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) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
ret
|
||||
|
||||
Reference in New Issue
Block a user