fix a few bugs in scheduling and synchronization, separate OVMF_VARS for debug

This commit is contained in:
maksw committed 2026-05-02 11:34:30 +02:00
1 parent 5cf7a20ea2
commit 129be91e15
17 files changed
+174 -211

No files matched your search

+6 -6
View File
@@ -243,7 +243,7 @@ static void* HeapAlloc(HEAP* h, size_t size) {
if (!size) return (void *)0;
size = (size + 7) & ~7ULL; // 8-byte align
KeAcquireSpinlock(&h->Lock);
uintptr_t flags = KeAcquireSpinlock(&h->Lock);
// Best-fit search.
BLOCK_HDR* best = (BLOCK_HDR *)0;
@@ -256,14 +256,14 @@ static void* HeapAlloc(HEAP* h, size_t size) {
if (!best) {
if (!HeapGrow(h, size + OVERHEAD)) {
KeReleaseSpinlock(&h->Lock);
KeReleaseSpinlock(&h->Lock, flags);
return (void *)0;
}
// Re-search; HeapGrow inserted at the front.
best = h->FreeList;
while (best && best->Size < size) best = best->NextFree;
if (!best) {
KeReleaseSpinlock(&h->Lock);
KeReleaseSpinlock(&h->Lock, flags);
return (void *)0;
}
}
@@ -292,7 +292,7 @@ static void* HeapAlloc(HEAP* h, size_t size) {
HdrToFtr(best)->Magic = BLOCK_MAGIC;
HdrToFtr(best)->Size = best->Size;
KeReleaseSpinlock(&h->Lock);
KeReleaseSpinlock(&h->Lock, flags);
return (char *)best + HDR_SIZE;
}
@@ -301,7 +301,7 @@ static void HeapFree(HEAP* h, void* ptr) {
BLOCK_HDR* blk = (BLOCK_HDR *)((char *)ptr - HDR_SIZE);
if (blk->Magic != BLOCK_MAGIC || blk->Free) return; // double-free / corrupt
KeAcquireSpinlock(&h->Lock);
uintptr_t flags = KeAcquireSpinlock(&h->Lock);
blk->Free = 1;
@@ -338,7 +338,7 @@ static void HeapFree(HEAP* h, void* ptr) {
HdrToFtr(blk)->Free = 1;
HdrToFtr(blk)->Magic = BLOCK_MAGIC;
KeReleaseSpinlock(&h->Lock);
KeReleaseSpinlock(&h->Lock, flags);
}
static void* HeapRealloc(HEAP* h, void* ptr, size_t new_size) {