add a big kernel lock for SMP

Guards the scheduler and IPC; held across the context switch.
This commit is contained in:
Daniel Samson
2026-07-08 12:35:30 +01:00
parent cf7c6df41c
commit 941ab091db
5 changed files with 129 additions and 21 deletions
+6 -1
View File
@@ -63,9 +63,14 @@ switch_context:
ret # return into the new task's saved instruction pointer
# task_trampoline: the first thing a freshly-spawned task runs. init_task_stack
# leaves its entry function in r15. New tasks start with interrupts enabled.
# leaves its entry function in r15. A fresh task is switched to with the big kernel
# lock held (the hand-off rule in sync.zig) but has no enter/leave frame of its own,
# so it releases the lock here before running its body. r15 survives the call (it's
# callee-saved). New tasks then start with interrupts enabled.
.extern releaseForFreshTask
.global task_trampoline
task_trampoline:
call releaseForFreshTask # drop the kernel lock we inherited across the switch
sti
call *%r15 # call the task entry (fn() void)
1: hlt # if the entry returns, idle (still preemptible)