Start putting together ACPI for guests.
[akaros.git] / kern / drivers / dev / acpi.c
index 9497051..d5aa3a3 100644 (file)
@@ -64,6 +64,7 @@ static struct dirtab acpidir[] = {
        {"acpipretty", {Qpretty}, 0, 0444},
        {"ioapic", {Qioapic}, 0, 0444},
        {"apic", {Qapic}, 0, 0444},
+       {"raw", {Qraw}, 0, 0444},
 };
 
 /*
@@ -497,6 +498,7 @@ static char *dumpfadt(char *start, char *end, struct Fadt *fp)
                return NULL;
        }
 
+       start = seprintf(start, end, "acpi: FADT@%p\n", fp);
        start = seprintf(start, end, "acpi: fadt: facs: $%p\n", fp->facs);
        start = seprintf(start, end, "acpi: fadt: dsdt: $%p\n", fp->dsdt);
        start = seprintf(start, end, "acpi: fadt: pmprofile: $%p\n", fp->pmprofile);
@@ -683,7 +685,7 @@ static struct Atable *acpimsct(uint8_t * p, int len)
 
 static char *dumpsrat(char *start, char *end, struct Srat *st)
 {
-       start = seprintf(start, end, "acpi: srat:\n");
+       start = seprintf(start, end, "acpi: START@%p:\n", st);
        for (; st != NULL; st = st->next)
                switch (st->type) {
                        case SRlapic:
@@ -884,8 +886,8 @@ static char *dumpmadt(char *start, char *end, struct Madt *apics)
        struct Apicst *st;
 
        start =
-               seprintf(start, end, "acpi: madt lapic paddr %llux pcat %d:\n",
-                                apics->lapicpa, apics->pcat);
+               seprintf(start, end, "acpi: MADT@%p: lapic paddr %p pcat %d:\n",
+                               apics, apics->lapicpa, apics->pcat);
        for (st = apics->st; st != NULL; st = st->next)
 
                switch (st->type) {
@@ -898,7 +900,7 @@ static char *dumpmadt(char *start, char *end, struct Madt *apics)
                        case ASiosapic:
                                start =
                                        seprintf(start, end,
-                                                        "\tioapic id %d addr %#llux ibase %d\n",
+                                                        "\tioapic id %d addr %p ibase %d\n",
                                                         st->ioapic.id, st->ioapic.addr, st->ioapic.ibase);
                                break;
                        case ASintovr:
@@ -1178,10 +1180,16 @@ static void acpirsdptr(void)
        uintptr_t sdtpa;
 
        if ((rsd = rsdsearch("RSD PTR ")) == NULL) {
+               printk("NO RSDP\n");
                return;
        }
 
+
        assert(sizeof(struct Sdthdr) == 36);
+       printd("/* RSDP */ struct Rsdp = {%08c, %x, %06c, %x, %p, %d, %p, %x}\n",
+              rsd->signature, rsd->rchecksum, rsd->oemid, rsd->revision,
+              *(uint32_t *)rsd->raddr, *(uint32_t *)rsd->length,
+              *(uint32_t *)rsd->xaddr, rsd->xchecksum);
 
        printd("acpi: RSD PTR@ %#p, physaddr $%p length %ud %#llux rev %d\n",
                   rsd, l32get(rsd->raddr), l32get(rsd->length),
@@ -1567,6 +1575,9 @@ static long acpiread(struct chan *c, void *a, long n, int64_t off)
        switch (q) {
                case Qdir:
                        return devdirread(c, a, n, acpidir, ARRAY_SIZE(acpidir), acpigen);
+               case Qraw:
+                       return readmem(off, a, n, ttext, tlen);
+                       break;
                case Qtbl:
                        s = ttext;
                        e = ttext + tlen;