diff options
| -rw-r--r-- | sys/src/9/pc/archacpi.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/sys/src/9/pc/archacpi.c b/sys/src/9/pc/archacpi.c index 3a5cc3506..0b6e7ea48 100644 --- a/sys/src/9/pc/archacpi.c +++ b/sys/src/9/pc/archacpi.c @@ -461,7 +461,7 @@ acpiinit(void) Tbl *t; Apic *a; void *va; - uchar *p, *e; + uchar *s, *p, *e; ulong lapicbase; int machno, i, c; @@ -497,16 +497,16 @@ acpiinit(void) return; Foundapic: - p = t->data; - e = p + tbldlen(t); - lapicbase = get32(p); p += 8; + s = t->data; + e = s + tbldlen(t); + lapicbase = get32(s); s += 8; va = vmap(lapicbase, 1024); print("LAPIC: %.8lux %#p\n", lapicbase, va); if(va == nil) panic("acpiinit: cannot map lapic %.8lux", lapicbase); machno = 0; - for(; p < e; p += c){ + for(p = s; p < e; p += c){ c = p[1]; if(c < 2 || (p+c) > e) break; @@ -555,6 +555,18 @@ Foundapic: mpioapic[a->apicno] = a; ioapicinit(a, a->apicno); break; + } + } + + /* + * need 2nd pass as vbox puts interrupt overrides + * *before* the ioapic entries (!) + */ + for(p = s; p < e; p += c){ + c = p[1]; + if(c < 2 || (p+c) > e) + break; + switch(*p){ case 0x02: /* Interrupt Source Override */ addirq(get32(p+4), BusISA, 0, p[3], get16(p+8)); break; |
