move the running task into per-CPU state

PerCpu.current via the GS base; ready queues stay global.
This commit is contained in:
Daniel Samson
2026-07-08 12:35:30 +01:00
parent 941ab091db
commit 36c29d2d6d
2 changed files with 95 additions and 23 deletions
+18
View File
@@ -81,6 +81,24 @@ pub fn readCr3() u64 {
);
}
/// IA32_GS_BASE: the hidden base of the GS segment. We repurpose it as the per-CPU
/// data pointer (there's no user mode yet, so no `swapgs` dance — GS base is always
/// the running core's per-CPU block). Set once per core during bring-up, after the
/// GDT is loaded (loading a GS *selector* would otherwise clobber this base).
const ia32_gs_base = 0xC000_0101;
/// Publish this core's per-CPU data pointer so `cpuLocal` can retrieve it. Each
/// core calls this once, after its GDT is in place.
pub fn setCpuLocal(ptr: usize) void {
io.wrmsr(ia32_gs_base, ptr);
}
/// This core's per-CPU data pointer (the value `setCpuLocal` stored). Reads the GS
/// base MSR — a per-core register, so each core sees its own without any locking.
pub fn cpuLocal() usize {
return io.rdmsr(ia32_gs_base);
}
/// Kernel tick rate: 1000 Hz (1 ms), the scheduler's time quantum.
pub const timer_hz = 1000;