Misc. Design Issues


It looks like we'll be abandoning the apic_id as a table index, and reverting back to cpu-specific pages. The apic id and logical cpu number will be present in the page and will be maintained by swtch(). The IO operation penalty to access the local apic is too great when we can avoid it. Unfortunately this requires that we finish the idle loop support (get rid of the busy-spin idleprocs) and have a per-cpu idle context. That means that there will be for each cpu: 1 page directory table page, 1 pde page, 1 pcb, 1 kstack, 1 "idle" context (a cut-down process) that will not appear on the 'ps' listing. There will be a set of variables at a fixed virtual address in the unique page. Things like curproc, curpcb, runtime will be in there. Each page will be double mapped into "normal" kernel VM space. There will be a new P_ONCPU process flag, and a table pointing to all the cpu's private pages in "normal" space. ie: if you need to send a pmap_update to a currently running process (ie: P_ONCPU set), you check against your curproc, then walk the tables to see which other cpu is currently running it.