1 #include "u.h"
2 #include "../port/lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6
7 #include "io.h"
8 #include "mp.h"
9 #include "apic.h"
10 #include "acpi.h"
11
12 extern Madt* apics;
13
14 void
mpacpi(void)15 mpacpi(void)
16 {
17 char *already;
18 int nprocid, bp;
19 Apic *apic;
20 Apicst *st;
21
22 DBG("APIC mpacpi lapic addr %#p, flags %#ux\n",
23 apics->lapicpa, apics->pcat);
24
25 nprocid = 0;
26 for(st = apics->st; st != nil; st = st->next){
27 already = "";
28 switch(st->type){
29 case ASlapic:
30 if(st->lapic.id > Napic)
31 break;
32 apic = &xapic[st->lapic.id];
33 bp = (nprocid++ == 0);
34 if(apic->useable)
35 already = "(on)";
36 else
37 apicinit(st->lapic.id, apics->lapicpa, bp);
38 USED(already);
39 DBG("apic proc %d/%d apicid %d %s\n", nprocid-1,
40 apic->machno, st->lapic.id, already);
41 break;
42 case ASioapic:
43 if(st->ioapic.id > Napic)
44 break;
45 apic = &ioapic[st->ioapic.id];
46 if(apic->useable){
47 apic->gsib = st->ioapic.ibase;
48 already = "(on)";
49 }else
50 ioapicinit(st->ioapic.id, st->ioapic.addr);
51 USED(already);
52 DBG("ioapic %d addr %p gsib %d %s\n",
53 st->ioapic.id, apic->addr, apic->gsib, already);
54 break;
55 }
56 }
57 }
58