make apic functions completely private to apic.h rather than splitting them between fns.h and apic.h. also fix a nil dereference bug in mpacpi.c Reference: /n/atom/patch/applied2013/nixapicpriv Date: Mon Aug 26 17:58:00 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/mpacpi.c Mon Aug 26 17:57:10 2013 +++ /sys/src/nix/k10/mpacpi.c Mon Aug 26 17:57:10 2013 @@ -40,8 +40,11 @@ if((apic = ioapiclookup(st->ioapic.id)) != nil){ apic->ibase = st->ioapic.ibase; /* gnarly */ already = "(mp)"; - }else - ioapicinit(st->ioapic.id, st->ioapic.ibase, st->ioapic.addr); + }else{ + apic = ioapicinit(st->ioapic.id, st->ioapic.ibase, st->ioapic.addr); + if(apic == nil) + continue; + } print("ioapic: %d ", st->ioapic.id); print("addr %p base %d %s\n", apic->paddr, apic->ibase, already); break; --- /sys/src/nix/k10/main.c Mon Aug 26 17:57:10 2013 +++ /sys/src/nix/k10/main.c Mon Aug 26 17:57:10 2013 @@ -6,6 +6,7 @@ #include "init.h" #include "io.h" +#include "apic.h" Conf conf; uintptr kseg0 = KZERO; --- /sys/src/nix/k10/ioapic.c Mon Aug 26 17:57:10 2013 +++ /sys/src/nix/k10/ioapic.c Mon Aug 26 17:57:10 2013 @@ -200,7 +200,7 @@ return nil; } -void +Apic* ioapicinit(int id, int ibase, uintmem pa) { Apic *apic, *p; @@ -210,20 +210,22 @@ * Mark the IOAPIC useable if it has a good ID * and the registers can be mapped. */ - if(id >= Napic || (apic = xioapic+id)->useable) - return; + if(id >= Napic) + return nil; + if((apic = xioapic+id)->useable) + return apic; if((p = dupaddr(pa)) != nil){ print("ioapic%d: same pa as apic%ld\n", id, p-xioapic); if(ibase != -1) - return; /* mp irqs reference mp apic#s */ + return nil; /* mp irqs reference mp apic#s */ apic->addr = p->addr; } else{ adrmapck(pa, 1024, Aapic, Mfree); /* not in adr? */ if((apic->addr = vmap(pa, 1024)) == nil){ print("ioapic%d: can't vmap %#P\n", id, pa); - return; + return nil; } } apic->useable = 1; @@ -246,6 +248,8 @@ apic->addr[Ioregsel] = Ioapicid; apic->addr[Iowin] = id<<24; unlock(apic); + + return apic; } void --- /sys/src/nix/k10/fns.h Mon Aug 26 17:57:10 2013 +++ /sys/src/nix/k10/fns.h Mon Aug 26 17:57:10 2013 @@ -169,20 +169,6 @@ #define BIOSSEG(a) KADDR(((uint)(a))<<4) /* - * (l|io)apic.c - */ -int lapiceoi(int); -void lapicipi(int); -void lapicinit(int, uintmem, int); -int lapicisr(int); -int lapiconline(void); -void lapicpri(int); -void lapicsipi(int, uintmem); - -void ioapicinit(int, int, uintmem); -void ioapiconline(void); - -/* * archk10.c */ void k10mwait(void*); --- /sys/src/nix/k10/apic.h Mon Aug 26 17:57:10 2013 +++ /sys/src/nix/k10/apic.h Mon Aug 26 17:57:10 2013 @@ -80,10 +80,19 @@ void apictimerenab(void); int gsitoapicid(int, uint*); void ioapicdump(void); +Apic* ioapicinit(int, int, uintmem); void ioapicintrinit(int, int, int, int, int, u32int); Apic* ioapiclookup(uint); +void ioapiconline(void); void lapicdump(void); +int lapiceoi(int); +void lapicinit(int, uintmem, int); +void lapicipi(int); +int lapicisr(int); Apic* lapiclookup(uint); +int lapiconline(void); +void lapicpri(int); +void lapicsipi(int, uintmem); int pcimsienable(Pcidev*, uvlong); int pcimsimask(Pcidev*, int);