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

+10 -12
View File
@@ -21,37 +21,35 @@ KSTATUS KeEventCreate(EVENT_TYPE type, uint32_t initialState, EVENT **out) {
void KeSignalEvent(EVENT* event) {
if (!event) return;
KeAcquireSpinlock(&event->Lock);
uintptr_t flags = KeAcquireSpinlock(&event->Lock);
if (event->Type == EventManualReset) {
// Wake all waiters.
event->Signaled = 1;
while (!LIST_IS_EMPTY(&event->WaitList)) {
LIST_ENTRY* node = ListPopHead(&event->WaitList);
THREAD* t = CONTAINING_RECORD(node, THREAD, SchedulerLink);
KeReleaseSpinlock(&event->Lock);
KeReleaseSpinlock(&event->Lock, flags);
KeUnblockThread(t);
KeAcquireSpinlock(&event->Lock);
flags = KeAcquireSpinlock(&event->Lock);
}
} else {
// Auto-reset: wake one waiter or set the flag for the next waiter.
if (!LIST_IS_EMPTY(&event->WaitList)) {
LIST_ENTRY* node = ListPopHead(&event->WaitList);
THREAD* t = CONTAINING_RECORD(node, THREAD, SchedulerLink);
KeReleaseSpinlock(&event->Lock);
KeReleaseSpinlock(&event->Lock, flags);
KeUnblockThread(t);
return;
}
event->Signaled = 1;
}
KeReleaseSpinlock(&event->Lock);
KeReleaseSpinlock(&event->Lock, flags);
}
void KeClearEvent(EVENT* event) {
if (!event) return;
KeAcquireSpinlock(&event->Lock);
uintptr_t flags = KeAcquireSpinlock(&event->Lock);
event->Signaled = 0;
KeReleaseSpinlock(&event->Lock);
KeReleaseSpinlock(&event->Lock, flags);
}
KSTATUS KeWaitForEvent(EVENT* event) {
@@ -59,14 +57,14 @@ KSTATUS KeWaitForEvent(EVENT* event) {
THREAD* self = KeCurrentThread();
for (;;) {
KeAcquireSpinlock(&event->Lock);
uintptr_t flags = KeAcquireSpinlock(&event->Lock);
if (event->Signaled) {
if (event->Type == EventAutoReset) event->Signaled = 0;
KeReleaseSpinlock(&event->Lock);
KeReleaseSpinlock(&event->Lock, flags);
return STATUS_SUCCESS;
}
ListInsertTail(&event->WaitList, &self->SchedulerLink);
KeReleaseSpinlock(&event->Lock);
KeReleaseSpinlock(&event->Lock, flags);
KeBlockThread(self, &event->Header);
}
}