- Load IDT on APs via idt_load_ap() — root cause of AP crashes was
missing lidt, causing triple-fault when LAPIC timer fires
- Create per-CPU idle process for each AP in sched_ap_init()
- Start LAPIC timer on APs using BSP-calibrated ticks (no PIT
recalibration needed — all CPUs share same bus clock)
- AP timer handler calls schedule() for local CPU runqueue
- BSP signals APs via ap_sched_go flag after timer_init completes
- Allocations in sched_ap_init done outside sched_lock to avoid
ABBA deadlock with heap lock
- TSS updates restricted to CPU 0 (shared TSS, only BSP runs
user processes)
- AP stack increased to 8KB to match kernel thread stack size
All processes still assigned to CPU 0 — Phase 4 will add load
balancing to distribute processes across CPUs.