First pass at enabling interrupts.
[akaros.git] / kern / drivers / dev / acpi.c
index f35a11c..39edf82 100644 (file)
 
 #define l16get(p)      (((p)[1]<<8)|(p)[0])
 #define l32get(p)      (((uint32_t)l16get(p+2)<<16)|l16get(p))
-static struct Atable* acpifadt( uint8_t *unused_uint8_p_t, int);
-static struct Atable* acpitable( uint8_t *unused_uint8_p_t, int);
-static struct Atable* acpimadt( uint8_t *unused_uint8_p_t, int);
-static struct Atable* acpimsct( uint8_t *unused_uint8_p_t, int);
-static struct Atable* acpisrat( uint8_t *unused_uint8_p_t, int);
-static struct Atable* acpislit( uint8_t *unused_uint8_p_t, int);
+static struct Atable* acpifadt( uint8_t *, int);
+static struct Atable* acpitable( uint8_t *, int);
+static struct Atable* acpimadt( uint8_t *, int);
+static struct Atable* acpimsct( uint8_t *, int);
+static struct Atable* acpisrat( uint8_t *, int);
+static struct Atable* acpislit( uint8_t *, int);
 
 
 static struct cmdtab ctls[] =
@@ -54,6 +54,9 @@ static struct dirtab acpidir[]={
        {"acpictl",     {Qctl},                 0,      0666},
        {"acpitbl",     {Qtbl},                 0,      0444},
        {"acpiregio",   {Qio},                  0,      0666},
+       {"acpipretty",  {Qpretty},              0,      0444},
+       {"ioapic",      {Qioapic},              0,      0444},
+       {"apic",        {Qapic},                0,      0444},
 };
 
 /*
@@ -79,7 +82,7 @@ static struct Fadt    fadt;   /* Fixed ACPI description. To reach ACPI registers */
 static struct Xsdt*    xsdt;   /* XSDT table */
 static struct Atable*  tfirst; /* loaded DSDT/SSDT/... tables */
 static struct Atable*  tlast;  /* pointer to last table */
-static struct Madt*    apics;  /* APIC info */
+struct Madt*   apics;  /* APIC info */
 static struct Srat*    srat;   /* System resource affinity, used by physalloc */
 static struct Slit*    slit;   /* System locality information table used by the scheduler */
 static struct Msct*    msct;   /* Maximum system characteristics table */
@@ -92,168 +95,123 @@ static char* regnames[] = {
        "smb", "cmos", "pcibar",
 };
 
+static char *
+dumpGas(char *start, char *end, char *prefix, struct Gas *g);
+
 static char*
 acpiregstr(int id)
 {
-       print_func_entry();
        static char buf[20];    /* BUG */
 
        if(id >= 0 && id < ARRAY_SIZE(regnames)) {
-               print_func_exit();
                return regnames[id];
        }
        seprintf(buf, buf+sizeof(buf), "spc:%#x", id);
-       print_func_exit();
        return buf;
 }
 
 static int
 acpiregid(char *s)
 {
-       print_func_entry();
        int i;
 
        for(i = 0; i < ARRAY_SIZE(regnames); i++)
                if(strcmp(regnames[i], s) == 0) {
-                       print_func_exit();
                        return i;
                }
-       print_func_exit();
        return -1;
 }
 
-static uint64_t
-l64get(uint8_t* p)
-{
-       print_func_entry();
-       /*
-        * Doing this as a define
-        * #define l64get(p)    (((u64int)l32get(p+4)<<32)|l32get(p))
-        * causes 8c to abort with "out of fixed registers" in
-        * rsdlink() below.
-        */
-       print_func_exit();
-       return (((uint64_t)l32get(p+4)<<32)|l32get(p));
-}
-
 static uint8_t
 mget8(uintptr_t p, void*unused)
 {
-       print_func_entry();
        uint8_t *cp = (uint8_t*)p;
-       print_func_exit();
        return *cp;
 }
 
 static void
 mset8(uintptr_t p, uint8_t v, void*unused)
 {
-       print_func_entry();
        uint8_t *cp = (uint8_t*)p;
        *cp = v;
-       print_func_exit();
 }
 
 static uint16_t
 mget16(uintptr_t p, void*unused)
 {
-       print_func_entry();
        uint16_t *cp = (uint16_t*)p;
-       print_func_exit();
        return *cp;
 }
 
 static void
 mset16(uintptr_t p, uint16_t v, void*unused)
 {
-       print_func_entry();
        uint16_t *cp = (uint16_t*)p;
        *cp = v;
-       print_func_exit();
 }
 
 static uint32_t
 mget32(uintptr_t p, void*unused)
 {
-       print_func_entry();
        uint32_t *cp = (uint32_t*)p;
-       print_func_exit();
        return *cp;
 }
 
 static void
 mset32(uintptr_t p, uint32_t v, void*unused)
 {
-       print_func_entry();
        uint32_t *cp = (uint32_t*)p;
        *cp = v;
-       print_func_exit();
 }
 
 static uint64_t
 mget64(uintptr_t p, void*unused)
 {
-       print_func_entry();
        uint64_t *cp = (uint64_t*)p;
-       print_func_exit();
        return *cp;
 }
 
 static void
 mset64(uintptr_t p, uint64_t v, void*unused)
 {
-       print_func_entry();
        uint64_t *cp = (uint64_t*)p;
        *cp = v;
-       print_func_exit();
 }
 
 static uint8_t
 ioget8(uintptr_t p, void*unused)
 {
-       print_func_entry();
-       print_func_exit();
        return inb(p);
 }
 
 static void
 ioset8(uintptr_t p, uint8_t v, void*unused)
 {
-       print_func_entry();
        outb(p, v);
-       print_func_exit();
 }
 
 static uint16_t
 ioget16(uintptr_t p, void*unused)
 {
-       print_func_entry();
-       print_func_exit();
        return inw(p);
 }
 
 static void
 ioset16(uintptr_t p, uint16_t v, void*unused)
 {
-       print_func_entry();
        outw(p, v);
-       print_func_exit();
 }
 
 static uint32_t
 ioget32(uintptr_t p, void*unused)
 {
-       print_func_entry();
-       print_func_exit();
        return inl(p);
 }
 
 static void
 ioset32(uintptr_t p, uint32_t v, void*unused)
 {
-       print_func_entry();
        outl(p, v);
-       print_func_exit();
 }
 
 #define explode_tbdf(tbdf) {pcidev.bus = tbdf >> 16;\
@@ -264,73 +222,61 @@ ioset32(uintptr_t p, uint32_t v, void*unused)
 static uint8_t
 cfgget8(uintptr_t p, void* r)
 {
-       print_func_entry();
        struct Reg *ro = r;
        struct pci_device pcidev;
 
        explode_tbdf(ro->tbdf);
-       print_func_exit();
        return pcidev_read8(&pcidev, p);
 }
 
 static void
 cfgset8(uintptr_t p, uint8_t v, void* r)
 {
-       print_func_entry();
        struct Reg *ro = r;
        struct pci_device pcidev;
 
        explode_tbdf(ro->tbdf);
        pcidev_write8(&pcidev, p, v);
-       print_func_exit();
 }
 
 static uint16_t
 cfgget16(uintptr_t p, void* r)
 {
-       print_func_entry();
        struct Reg *ro = r;
        struct pci_device pcidev;
 
        explode_tbdf(ro->tbdf);
-       print_func_exit();
        return pcidev_read16(&pcidev, p);
 }
 
 static void
 cfgset16(uintptr_t p, uint16_t v, void* r)
 {
-       print_func_entry();
        struct Reg *ro = r;
        struct pci_device pcidev;
 
        explode_tbdf(ro->tbdf);
        pcidev_write16(&pcidev, p, v);
-       print_func_exit();
 }
 
 static uint32_t
 cfgget32(uintptr_t p, void* r)
 {
-       print_func_entry();
        struct Reg *ro = r;
        struct pci_device pcidev;
 
        explode_tbdf(ro->tbdf);
-       print_func_exit();
        return pcidev_read32(&pcidev, p);
 }
 
 static void
 cfgset32(uintptr_t p, uint32_t v, void* r)
 {
-       print_func_entry();
        struct Reg *ro = r;
        struct pci_device pcidev;
 
        explode_tbdf(ro->tbdf);
        pcidev_write32(&pcidev, p, v);
-       print_func_exit();
 }
 
 static struct Regio memio = 
@@ -361,7 +307,6 @@ static long
 regcpy(struct Regio *dio, uintptr_t da, struct Regio *sio,
        uintptr_t sa, long len, int align)
 {
-       print_func_entry();
        int n, i;
 
        printk("regcpy %#p %#p %#p %#p\n", da, sa, len, align);
@@ -392,7 +337,6 @@ regcpy(struct Regio *dio, uintptr_t da, struct Regio *sio,
                da += align;
                sa += align;
        }
-       print_func_exit();
        return n*align;
 }
 
@@ -403,11 +347,10 @@ regcpy(struct Regio *dio, uintptr_t da, struct Regio *sio,
 static long
 regio(struct Reg *r, void *p, uint32_t len, uintptr_t off, int iswr)
 {
-       print_func_entry();
        struct Regio rio;
        uintptr_t rp;
 
-       printk("reg%s %s %#p %#ullx %#lx sz=%d\n",
+       printk("reg%s %s %#p %#p %#lx sz=%d\n",
                iswr ? "out" : "in", r->name, p, off, len, r->accsz);
        rp = 0;
        if(off + len > r->len){
@@ -416,7 +359,6 @@ regio(struct Reg *r, void *p, uint32_t len, uintptr_t off, int iswr)
        }
        if(len <= 0){
                printd("regio: zero len\n");
-               print_func_exit();
                return 0;
        }
        switch(r->spc){
@@ -454,14 +396,12 @@ regio(struct Reg *r, void *p, uint32_t len, uintptr_t off, int iswr)
                regcpy(&rio, rp, &memio, (uintptr_t)p, len, r->accsz);
        else
                regcpy(&memio, (uintptr_t)p, &rio, rp, len, r->accsz);
-       print_func_exit();
        return len;
 }
 
 static struct Atable*
 newtable(uint8_t *p)
 {
-       print_func_entry();
        struct Atable *t;
        struct Sdthdr *h;
 
@@ -485,72 +425,60 @@ newtable(uint8_t *p)
                tlast->next = t;
                tlast = t;
        }
-       print_func_exit();
        return t;
 }
 
 static void*
 sdtchecksum(void* addr, int len)
 {
-       print_func_entry();
        uint8_t *p, sum;
 
        sum = 0;
        for(p = addr; len-- > 0; p++)
                sum += *p;
        if(sum == 0) {
-               print_func_exit();
                return addr;
        }
 
-       print_func_exit();
        return NULL;
 }
 
 static void *
 sdtmap(uintptr_t pa, int *n, int cksum)
 {
-       print_func_entry();
        struct Sdthdr* sdt;
 
        sdt = KADDR(pa); //vmap(pa, sizeof(struct Sdthdr));
        if(sdt == NULL){
                printk("acpi: vmap1: NULL\n");
-               print_func_exit();
                return NULL;
        }
        *n = l32get(sdt->length);
        //vunmap(sdt, sizeof(Sdthdr));
        if((sdt = KADDR(pa) /*vmap(pa, *n)*/) == NULL){
                printk("acpi: NULL vmap\n");
-               print_func_exit();
                return NULL;
        }
        if(cksum != 0 && sdtchecksum(sdt, *n) == NULL){
                printk("acpi: SDT: bad checksum\n");
                //vunmap(sdt, sizeof(Sdthdr));
-               print_func_exit();
                return NULL;
        }
-       print_func_exit();
        return sdt;
 }
 
 static int
 loadfacs(uintptr_t pa)
 {
-       print_func_entry();
        int n;
 
        facs = sdtmap(pa, &n, 0);
        if(facs == NULL) {
-               print_func_exit();
                return -1;
        }
        if(memcmp(facs, "FACS", 4) != 0){
                //vunmap(facs, n);
                facs = NULL;
-               print_func_exit();
                return -1;
        }
        /* no unmap */
@@ -562,103 +490,94 @@ loadfacs(uintptr_t pa)
        printk("acpi: facs: xwakingv: %#p\n", facs->xwakingv);
        printk("acpi: facs: vers: %#p\n", facs->vers);
        printk("acpi: facs: ospmflags: %#p\n", facs->ospmflags);
-       print_func_exit();
        return 0;
 }
 
 static void
 loaddsdt(uintptr_t pa)
 {
-       print_func_entry();
        int n;
        uint8_t *dsdtp;
 
        dsdtp = sdtmap(pa, &n, 1);
        if(dsdtp == NULL) {
-               print_func_exit();
                return;
        }
        if(acpitable(dsdtp, n) == NULL)
                ;//vunmap(dsdtp, n);
-       print_func_exit();
 }
 
 static void
 gasget(struct Gas *gas, uint8_t *p)
 {
-       print_func_entry();
        gas->spc = p[0];
        gas->len = p[1];
        gas->off = p[2];
        gas->accsz = p[3];
        gas->addr = l64get(p+4);
-       print_func_exit();
 }
 
-static void
-dumpfadt(struct Fadt *fp)
+static char *
+dumpfadt(char *start, char *end, struct Fadt *fp)
 {
-       print_func_entry();
        if(2 == 0) {
-               print_func_exit();
-               return;
+               return NULL;
        }
 
-       printk("acpi: fadt: facs: $%p\n", fp->facs);
-       printk("acpi: fadt: dsdt: $%p\n", fp->dsdt);
-       printk("acpi: fadt: pmprofile: $%p\n", fp->pmprofile);
-       printk("acpi: fadt: sciint: $%p\n", fp->sciint);
-       printk("acpi: fadt: smicmd: $%p\n", fp->smicmd);
-       printk("acpi: fadt: acpienable: $%p\n", fp->acpienable);
-       printk("acpi: fadt: acpidisable: $%p\n", fp->acpidisable);
-       printk("acpi: fadt: s4biosreq: $%p\n", fp->s4biosreq);
-       printk("acpi: fadt: pstatecnt: $%p\n", fp->pstatecnt);
-       printk("acpi: fadt: pm1aevtblk: $%p\n", fp->pm1aevtblk);
-       printk("acpi: fadt: pm1bevtblk: $%p\n", fp->pm1bevtblk);
-       printk("acpi: fadt: pm1acntblk: $%p\n", fp->pm1acntblk);
-       printk("acpi: fadt: pm1bcntblk: $%p\n", fp->pm1bcntblk);
-       printk("acpi: fadt: pm2cntblk: $%p\n", fp->pm2cntblk);
-       printk("acpi: fadt: pmtmrblk: $%p\n", fp->pmtmrblk);
-       printk("acpi: fadt: gpe0blk: $%p\n", fp->gpe0blk);
-       printk("acpi: fadt: gpe1blk: $%p\n", fp->gpe1blk);
-       printk("acpi: fadt: pm1evtlen: $%p\n", fp->pm1evtlen);
-       printk("acpi: fadt: pm1cntlen: $%p\n", fp->pm1cntlen);
-       printk("acpi: fadt: pm2cntlen: $%p\n", fp->pm2cntlen);
-       printk("acpi: fadt: pmtmrlen: $%p\n", fp->pmtmrlen);
-       printk("acpi: fadt: gpe0blklen: $%p\n", fp->gpe0blklen);
-       printk("acpi: fadt: gpe1blklen: $%p\n", fp->gpe1blklen);
-       printk("acpi: fadt: gp1base: $%p\n", fp->gp1base);
-       printk("acpi: fadt: cstcnt: $%p\n", fp->cstcnt);
-       printk("acpi: fadt: plvl2lat: $%p\n", fp->plvl2lat);
-       printk("acpi: fadt: plvl3lat: $%p\n", fp->plvl3lat);
-       printk("acpi: fadt: flushsz: $%p\n", fp->flushsz);
-       printk("acpi: fadt: flushstride: $%p\n", fp->flushstride);
-       printk("acpi: fadt: dutyoff: $%p\n", fp->dutyoff);
-       printk("acpi: fadt: dutywidth: $%p\n", fp->dutywidth);
-       printk("acpi: fadt: dayalrm: $%p\n", fp->dayalrm);
-       printk("acpi: fadt: monalrm: $%p\n", fp->monalrm);
-       printk("acpi: fadt: century: $%p\n", fp->century);
-       printk("acpi: fadt: iapcbootarch: $%p\n", fp->iapcbootarch);
-       printk("acpi: fadt: flags: $%p\n", fp->flags);
-       printk("acpi: fadt: resetreg: /*%G*/%p\n", &fp->resetreg);
-       printk("acpi: fadt: resetval: $%p\n", fp->resetval);
-       printk("acpi: fadt: xfacs: %#llux\n", fp->xfacs);
-       printk("acpi: fadt: xdsdt: %#llux\n", fp->xdsdt);
-       printk("acpi: fadt: xpm1aevtblk: /*%G*/%p\n", &fp->xpm1aevtblk);
-       printk("acpi: fadt: xpm1bevtblk: /*%G*/%p\n", &fp->xpm1bevtblk);
-       printk("acpi: fadt: xpm1acntblk: /*%G*/%p\n", &fp->xpm1acntblk);
-       printk("acpi: fadt: xpm1bcntblk: /*%G*/%p\n", &fp->xpm1bcntblk);
-       printk("acpi: fadt: xpm2cntblk: /*%G*/%p\n", &fp->xpm2cntblk);
-       printk("acpi: fadt: xpmtmrblk: /*%G*/%p\n", &fp->xpmtmrblk);
-       printk("acpi: fadt: xgpe0blk: /*%G*/%p\n", &fp->xgpe0blk);
-       printk("acpi: fadt: xgpe1blk: /*%G*/%p\n", &fp->xgpe1blk);
-       print_func_exit();
+       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);
+       start = seprintf(start, end, "acpi: fadt: sciint: $%p\n", fp->sciint);
+       start = seprintf(start, end, "acpi: fadt: smicmd: $%p\n", fp->smicmd);
+       start = seprintf(start, end, "acpi: fadt: acpienable: $%p\n", fp->acpienable);
+       start = seprintf(start, end, "acpi: fadt: acpidisable: $%p\n", fp->acpidisable);
+       start = seprintf(start, end, "acpi: fadt: s4biosreq: $%p\n", fp->s4biosreq);
+       start = seprintf(start, end, "acpi: fadt: pstatecnt: $%p\n", fp->pstatecnt);
+       start = seprintf(start, end, "acpi: fadt: pm1aevtblk: $%p\n", fp->pm1aevtblk);
+       start = seprintf(start, end, "acpi: fadt: pm1bevtblk: $%p\n", fp->pm1bevtblk);
+       start = seprintf(start, end, "acpi: fadt: pm1acntblk: $%p\n", fp->pm1acntblk);
+       start = seprintf(start, end, "acpi: fadt: pm1bcntblk: $%p\n", fp->pm1bcntblk);
+       start = seprintf(start, end, "acpi: fadt: pm2cntblk: $%p\n", fp->pm2cntblk);
+       start = seprintf(start, end, "acpi: fadt: pmtmrblk: $%p\n", fp->pmtmrblk);
+       start = seprintf(start, end, "acpi: fadt: gpe0blk: $%p\n", fp->gpe0blk);
+       start = seprintf(start, end, "acpi: fadt: gpe1blk: $%p\n", fp->gpe1blk);
+       start = seprintf(start, end, "acpi: fadt: pm1evtlen: $%p\n", fp->pm1evtlen);
+       start = seprintf(start, end, "acpi: fadt: pm1cntlen: $%p\n", fp->pm1cntlen);
+       start = seprintf(start, end, "acpi: fadt: pm2cntlen: $%p\n", fp->pm2cntlen);
+       start = seprintf(start, end, "acpi: fadt: pmtmrlen: $%p\n", fp->pmtmrlen);
+       start = seprintf(start, end, "acpi: fadt: gpe0blklen: $%p\n", fp->gpe0blklen);
+       start = seprintf(start, end, "acpi: fadt: gpe1blklen: $%p\n", fp->gpe1blklen);
+       start = seprintf(start, end, "acpi: fadt: gp1base: $%p\n", fp->gp1base);
+       start = seprintf(start, end, "acpi: fadt: cstcnt: $%p\n", fp->cstcnt);
+       start = seprintf(start, end, "acpi: fadt: plvl2lat: $%p\n", fp->plvl2lat);
+       start = seprintf(start, end, "acpi: fadt: plvl3lat: $%p\n", fp->plvl3lat);
+       start = seprintf(start, end, "acpi: fadt: flushsz: $%p\n", fp->flushsz);
+       start = seprintf(start, end, "acpi: fadt: flushstride: $%p\n", fp->flushstride);
+       start = seprintf(start, end, "acpi: fadt: dutyoff: $%p\n", fp->dutyoff);
+       start = seprintf(start, end, "acpi: fadt: dutywidth: $%p\n", fp->dutywidth);
+       start = seprintf(start, end, "acpi: fadt: dayalrm: $%p\n", fp->dayalrm);
+       start = seprintf(start, end, "acpi: fadt: monalrm: $%p\n", fp->monalrm);
+       start = seprintf(start, end, "acpi: fadt: century: $%p\n", fp->century);
+       start = seprintf(start, end, "acpi: fadt: iapcbootarch: $%p\n", fp->iapcbootarch);
+       start = seprintf(start, end, "acpi: fadt: flags: $%p\n", fp->flags);
+       start = dumpGas(start, end, "acpi: fadt: resetreg: ", &fp->resetreg);
+       start = seprintf(start, end, "acpi: fadt: resetval: $%p\n", fp->resetval);
+       start = seprintf(start, end, "acpi: fadt: xfacs: %p\n", fp->xfacs);
+       start = seprintf(start, end, "acpi: fadt: xdsdt: %p\n", fp->xdsdt);
+       start = dumpGas(start, end, "acpi: fadt: xpm1aevtblk:", &fp->xpm1aevtblk);
+       start = dumpGas(start, end, "acpi: fadt: xpm1bevtblk:", &fp->xpm1bevtblk);
+       start = dumpGas(start, end, "acpi: fadt: xpm1acntblk:", &fp->xpm1acntblk);
+       start = dumpGas(start, end, "acpi: fadt: xpm1bcntblk:", &fp->xpm1bcntblk);
+       start = dumpGas(start, end, "acpi: fadt: xpm2cntblk:", &fp->xpm2cntblk);
+       start = dumpGas(start, end, "acpi: fadt: xpmtmrblk:", &fp->xpmtmrblk);
+       start = dumpGas(start, end, "acpi: fadt: xgpe0blk:", &fp->xgpe0blk);
+       start = dumpGas(start, end, "acpi: fadt: xgpe1blk:", &fp->xgpe1blk);
+       return start;
 }
 
 static struct Atable*
 acpifadt(uint8_t *p, int unused)
 {
-       print_func_entry();
        struct Fadt *fp;
 
        fp = &fadt;
@@ -711,7 +630,12 @@ acpifadt(uint8_t *p, int unused)
        gasget(&fp->xgpe0blk, p+220);
        gasget(&fp->xgpe1blk, p+232);
 
-       dumpfadt(fp);
+#if 0
+       static char buf[8192]; // XXX
+       char *out;
+       out = dumpfadt(buf, &buf[8191], fp);
+       printk("%s\n", out);
+#endif
        if(fp->xfacs != 0)
                loadfacs(fp->xfacs);
        else
@@ -722,23 +646,23 @@ acpifadt(uint8_t *p, int unused)
        else
                loaddsdt(fp->dsdt);
 
-       print_func_exit();
        return NULL;    /* can be unmapped once parsed */
 }
 
-static void
-dumpmsct(struct Msct *msct)
+static char *
+dumpmsct(char *start, char *end, struct Msct *msct)
 {
-       print_func_entry();
        struct Mdom *st;
 
-       printk("acpi: msct: %d doms %d clkdoms %#ullx maxpa\n",
+       if (! msct)
+               return start;
+       start = seprintf(start, end, "acpi: msct: %d doms %d clkdoms %#p maxpa\n",
                msct->ndoms, msct->nclkdoms, msct->maxpa);
        for(st = msct->dom; st != NULL; st = st->next)
-               printk("\t[%d:%d] %d maxproc %#ullx maxmmem\n",
+               start = seprintf(start, end, "\t[%d:%d] %d maxproc %#p maxmmem\n",
                        st->start, st->end, st->maxproc, st->maxmem);
-       printk("\n");
-       print_func_exit();
+       start = seprintf(start, end, "\n");
+       return start;
 }
 
 /*
@@ -748,11 +672,11 @@ dumpmsct(struct Msct *msct)
 static struct Atable*
 acpimsct(uint8_t *p, int len)
 {
-       print_func_entry();
        uint8_t *pe;
        struct Mdom **stl, *st;
        int off;
 
+
        msct = kzmalloc(sizeof(struct Msct), KMALLOC_WAIT);
        msct->ndoms = l32get(p+40) + 1;
        msct->nclkdoms = l32get(p+44) + 1;
@@ -771,53 +695,56 @@ acpimsct(uint8_t *p, int len)
                *stl = st;
                stl = &st->next;
        }
-
-       dumpmsct(msct);
-       print_func_exit();
+#if 0
+       // no longer works if called from init.c
+       char *dump;
+       dump = kzmalloc(1024, KMALLOC_WAIT);
+       dumpmsct(dump, &dump[1023], msct);
+       printk("%s\n", dump);
+       kfree(dump);
+#endif
        return NULL;    /* can be unmapped once parsed */
 }
 
-static void
-dumpsrat(struct Srat *st)
+static char *
+dumpsrat(char *start, char *end, struct Srat *st)
 {
-       print_func_entry();
-       printk("acpi: srat:\n");
+       start = seprintf(start, end, "acpi: srat:\n");
        for(; st != NULL; st = st->next)
                switch(st->type){
                case SRlapic:
-                       printk("\tlapic: dom %d apic %d sapic %d clk %d\n",
+                       start = seprintf(start, end, "\tlapic: dom %d apic %d sapic %d clk %d\n",
                                st->lapic.dom, st->lapic.apic,
                                st->lapic.sapic, st->lapic.clkdom);
                        break;
                case SRmem:
-                       printk("\tmem: dom %d %#ullx %#ullx %c%c\n",
+                       start = seprintf(start, end, "\tmem: dom %d %#p %#p %c%c\n",
                                st->mem.dom, st->mem.addr, st->mem.len,
                                st->mem.hplug?'h':'-',
                                st->mem.nvram?'n':'-');
                        break;
                case SRlx2apic:
-                       printk("\tlx2apic: dom %d apic %d clk %d\n",
+                       start = seprintf(start, end, "\tlx2apic: dom %d apic %d clk %d\n",
                                st->lx2apic.dom, st->lx2apic.apic,
                                st->lx2apic.clkdom);
                        break;
                default:
-                       printk("\t<unknown srat entry>\n");
+                       start = seprintf(start, end, "\t<unknown srat entry>\n");
                }
-       printk("\n");
-       print_func_exit();
+       start = seprintf(start, end, "\n");
+       return start;
 }
 
 static struct Atable*
 acpisrat(uint8_t *p, int len)
 {
-       print_func_entry();
+
        struct Srat **stl, *st;
        uint8_t *pe;
        int stlen, flags;
 
        if(srat != NULL){
                printd("acpi: two SRATs?\n");
-               print_func_exit();
                return NULL;
        }
 
@@ -872,40 +799,46 @@ acpisrat(uint8_t *p, int len)
                }
        }
 
-       dumpsrat(srat);
-       print_func_exit();
+#if 0
+       char *dump;
+       dump = kzmalloc(8192, KMALLOC_WAIT);
+       dumpsrat(dump, &dump[8192], srat);
+       printk("%s\n", dump);
+       kfree(dump);
+#endif
        return NULL;    /* can be unmapped once parsed */
 }
 
-static void
-dumpslit(struct Slit *sl)
+static char *
+dumpslit(char *start, char *end, struct Slit *sl)
 {
-       print_func_entry();
        int i;
        
-       printk("acpi slit:\n");
+       if (! sl)
+               return start;
+       start = seprintf(start, end, "acpi slit:\n");
        for(i = 0; i < sl->rowlen*sl->rowlen; i++){
-               printk("slit: %ux\n", sl->e[i/sl->rowlen][i%sl->rowlen].dist);
+               start = seprintf(start, end,
+                               "slit: %ux\n", sl->e[i/sl->rowlen][i%sl->rowlen].dist);
        }
-       print_func_exit();
+       start = seprintf(start, end, "\n");
+       return start;
 }
 
 static int
 cmpslitent(void* v1, void* v2)
 {
-       print_func_entry();
        struct SlEntry *se1, *se2;
 
        se1 = v1;
        se2 = v2;
-       print_func_exit();
        return se1->dist - se2->dist;
 }
 
 static struct Atable*
 acpislit(uint8_t *p, int len)
 {
-       print_func_entry();
+
        uint8_t *pe;
        int i, j, k;
        struct SlEntry *se;
@@ -925,32 +858,33 @@ acpislit(uint8_t *p, int len)
                se->dom = k;
                se->dist = *p;
        }
-       dumpslit(slit);
+
 #warning "no qsort"
 #if 0
+       char *dump;
+       dump = kzmalloc(8192, KMALLOC_WAIT);
+       dumpslit(dump, &dump[8191], slit);
+       printk("%s", dump);
+       kfree(dump);
        for(i = 0; i < slit->rowlen; i++)
                qsort(slit->e[i], slit->rowlen, sizeof(slit->e[0][0]), cmpslitent);
        
        dumpslit(slit);
 #endif
-       print_func_exit();
        return NULL;    /* can be unmapped once parsed */
 }
 
 uintptr_t
 acpimblocksize(uintptr_t addr, int *dom)
 {
-       print_func_entry();
        struct Srat *sl;
 
        for(sl = srat; sl != NULL; sl = sl->next)
                if(sl->type == SRmem)
                if(sl->mem.addr <= addr && sl->mem.addr + sl->mem.len > addr){
                        *dom = sl->mem.dom;
-                       print_func_exit();
                        return sl->mem.len - (addr - sl->mem.addr);
                }
-       print_func_exit();
        return 0;
 }
 
@@ -962,9 +896,7 @@ acpimblocksize(uintptr_t addr, int *dom)
 int
 corecolor(int core)
 {
-print_func_entry();
 #warning "can't do core colors yet"
-       print_func_exit();
 return -1;
 #if 0
        struct Srat *sl;
@@ -993,80 +925,103 @@ return -1;
 int
 pickcore(int mycolor, int index)
 {
-       print_func_entry();
        int color;
        int ncorepercol;
 
        if(slit == NULL) {
-               print_func_exit();
                return 0;
        }
        ncorepercol = num_cpus/slit->rowlen;
        color = slit->e[mycolor][index/ncorepercol].dom;
-       print_func_exit();
        return color * ncorepercol + index % ncorepercol;
 }
 
 
-static void
-dumpmadt(struct Madt *apics)
+static char *polarity[4] = {
+       "polarity/trigger like in ISA",
+       "active high",
+       "BOGUS POLARITY",
+       "active low"
+};
+
+static char *trigger[] = {
+       "BOGUS TRIGGER",
+       "edge",
+       "BOGUS TRIGGER",
+       "level"
+};
+
+static char *printiflags(char *start, char *end, int flags)
+{
+
+       return seprintf(start, end, "[%s,%s]",
+               polarity[flags & AFpmask], 
+               trigger[(flags & AFtmask)>>2]);
+}
+
+static char *
+dumpmadt(char *start, char *end, struct Madt *apics)
 {
-       print_func_entry();
        struct Apicst *st;
 
-       printk("acpi: madt lapic paddr %llux pcat %d:\n", apics->lapicpa, apics->pcat);
+       start = seprintf(start, end, "acpi: madt lapic paddr %llux pcat %d:\n", apics->lapicpa, apics->pcat);
        for(st = apics->st; st != NULL; st = st->next)
+
                switch(st->type){
                case ASlapic:
-                       printk("\tlapic pid %d id %d\n", st->lapic.pid, st->lapic.id);
+                       start = seprintf(start, end, "\tlapic pid %d id %d\n", st->lapic.pid, st->lapic.id);
                        break;
                case ASioapic:
                case ASiosapic:
-                       printk("\tioapic id %d addr %#llux ibase %d\n",
-                               st->ioapic.id, st->ioapic.addr, st->ioapic.ibase);
+                       start = seprintf(start, end, "\tioapic id %d addr %#llux ibase %d\n",
+                                        st->ioapic.id, st->ioapic.addr, st->ioapic.ibase);
                        break;
                case ASintovr:
-                       printk("\tintovr irq %d intr %d flags $%p\n",
-                               st->intovr.irq, st->intovr.intr,st->intovr.flags);
+                       start = seprintf(start, end, "\tintovr irq %d intr %d flags $%p",
+                                        st->intovr.irq, st->intovr.intr,st->intovr.flags);
+                       start = printiflags(start, end, st->intovr.flags);
+                       start = seprintf(start, end, "\n");
                        break;
                case ASnmi:
-                       printk("\tnmi intr %d flags $%p\n",
+                       start = seprintf(start, end, "\tnmi intr %d flags $%p\n",
                                st->nmi.intr, st->nmi.flags);
                        break;
                case ASlnmi:
-                       printk("\tlnmi pid %d lint %d flags $%p\n",
+                       start = seprintf(start, end, "\tlnmi pid %d lint %d flags $%p\n",
                                st->lnmi.pid, st->lnmi.lint, st->lnmi.flags);
                        break;
                case ASlsapic:
-                       printk("\tlsapic pid %d id %d eid %d puid %d puids %s\n",
+                       start = seprintf(start, end, "\tlsapic pid %d id %d eid %d puid %d puids %s\n",
                                st->lsapic.pid, st->lsapic.id,
                                st->lsapic.eid, st->lsapic.puid,
                                st->lsapic.puids);
                        break;
                case ASintsrc:
-                       printk("\tintr type %d pid %d peid %d iosv %d intr %d %#x\n",
+                       start = seprintf(start, end, "\tintr type %d pid %d peid %d iosv %d intr %d %#x\n",
                                st->type, st->intsrc.pid,
                                st->intsrc.peid, st->intsrc.iosv,
                                st->intsrc.intr, st->intsrc.flags);
+                       start = printiflags(start, end, st->intsrc.flags);
+                       start = seprintf(start, end, "\n");
                        break;
                case ASlx2apic:
-                       printk("\tlx2apic puid %d id %d\n", st->lx2apic.puid, st->lx2apic.id);
+                       start = seprintf(start, end, "\tlx2apic puid %d id %d\n", st->lx2apic.puid, st->lx2apic.id);
                        break;
                case ASlx2nmi:
-                       printk("\tlx2nmi puid %d intr %d flags $%p\n",
+                       start = seprintf(start, end, "\tlx2nmi puid %d intr %d flags $%p\n",
                                st->lx2nmi.puid, st->lx2nmi.intr, st->lx2nmi.flags);
                        break;
                default:
-                       printk("\t<unknown madt entry>\n");
+                       start = seprintf(start, end, "\t<unknown madt entry>\n");
                }
-       printk("\n");
-       print_func_exit();
+       start = seprintf(start, end, "\n");
+       return start;
 }
 
 static struct Atable*
 acpimadt(uint8_t *p, int len)
 {
-       print_func_entry();
+
        uint8_t *pe;
        struct Apicst *st, *l, **stl;
        int stlen, id;
@@ -1179,9 +1134,13 @@ acpimadt(uint8_t *p, int len)
                        stl = &st->next;
                }
        }
-
-       dumpmadt(apics);
-       print_func_exit();
+#if 0
+       char *dump;
+       dump = kzmalloc(8192, KMALLOC_WAIT);
+       dumpmadt(dump, &dump[8191], apics);
+       printk("%s\n", dump);
+       kfree(dump);
+#endif
        return NULL;    /* can be unmapped once parsed */
 }
 
@@ -1191,44 +1150,39 @@ acpimadt(uint8_t *p, int len)
 static struct Atable*
 acpitable(uint8_t *p, int len)
 {
-       print_func_entry();
        if(len < Sdthdrsz) {
-               print_func_exit();
                return NULL;
        }
-       print_func_exit();
        return newtable(p);
 }
 
-static void
-dumptable(char *sig, uint8_t *p, int l)
+static char *
+dumptable(char *start, char *end, char *sig, uint8_t *p, int l)
 {
-       print_func_entry();
        int n, i;
 
        if(2 > 1){
-               printk("%s @ %#p\n", sig, p);
+               start = seprintf(start, end, "%s @ %#p\n", sig, p);
                if(2 > 2)
                        n = l;
                else
                        n = 256;
                for(i = 0; i < n; i++){
                        if((i % 16) == 0)
-                               printk("%x: ", i);
-                       printk(" %2.2ux", p[i]);
+                               start = seprintf(start, end, "%x: ", i);
+                       start = seprintf(start, end, " %2.2ux", p[i]);
                        if((i % 16) == 15)
-                               printk("\n");
+                               start = seprintf(start, end, "\n");
                }
-               printk("\n");
-               printk("\n");
+               start = seprintf(start, end, "\n");
+               start = seprintf(start, end, "\n");
        }
-       print_func_exit();
+       return start;
 }
 
 static char*
 seprinttable(char *s, char *e, struct Atable *t)
 {
-       print_func_entry();
        uint8_t *p;
        int i, n;
 
@@ -1242,7 +1196,6 @@ seprinttable(char *s, char *e, struct Atable *t)
                if((i % 16) == 15)
                        s = seprintf(s, e, "\n");
        }
-       print_func_exit();
        return seprintf(s, e, "\n\n");
 }
 
@@ -1253,11 +1206,11 @@ seprinttable(char *s, char *e, struct Atable *t)
 static int
 acpixsdtload(char *sig)
 {
-       print_func_entry();
        int i, l, t, unmap, found;
        uintptr_t dhpa;
        uint8_t *sdt;
        char tsig[5];
+       char table[128];
 
        found = 0;
        for(i = 0; i < xsdt->len; i += xsdt->asize){
@@ -1274,7 +1227,7 @@ acpixsdtload(char *sig)
                        printk("acpi: %s addr %#p\n", tsig, sdt);
                        for(t = 0; t < ARRAY_SIZE(ptables); t++)
                                if(strcmp(tsig, ptables[t].sig) == 0){
-                                       dumptable(tsig, sdt, l);
+                                       //dumptable(table, &table[127], tsig, sdt, l);
                                        unmap = ptables[t].f(sdt, l) == NULL;
                                        found = 1;
                                        break;
@@ -1283,14 +1236,12 @@ acpixsdtload(char *sig)
 //             if(unmap)
 //                     vunmap(sdt, l);
        }
-       print_func_exit();
        return found;
 }
 
 static void*
 rsdscan(uint8_t* addr, int len, char* signature)
 {
-       print_func_entry();
        int sl;
        uint8_t *e, *p;
 
@@ -1303,18 +1254,15 @@ rsdscan(uint8_t* addr, int len, char* signature)
                if(memcmp(p, signature, sl))
                        continue;
                printk("WE GOT %p\n", p);
-               print_func_exit();
                return p;
        }
 
-       print_func_exit();
        return NULL;
 }
 
 static void*
 rsdsearch(char* signature)
 {
-       print_func_entry();
        uintptr_t p;
        uint8_t *bda;
        void *rsd;
@@ -1323,20 +1271,17 @@ rsdsearch(char* signature)
         * Search for the data structure signature:
         * 1) in the BIOS ROM between 0xE0000 and 0xFFFFF.
         */
-       print_func_exit();
        return rsdscan(KADDR(0xE0000), 0x20000, signature);
 }
 
 static void
 acpirsdptr(void)
 {
-       print_func_entry();
        struct Rsdp *rsd;
        int asize;
        uintptr_t sdtpa;
 
        if((rsd = rsdsearch("RSD PTR ")) == NULL) {
-               print_func_exit();
                return;
        }
 
@@ -1349,7 +1294,6 @@ acpirsdptr(void)
        if(rsd->revision >= 2){
                if(sdtchecksum(rsd, 36) == NULL){
                        printk("acpi: RSD: bad checksum\n");
-                       print_func_exit();
                        return;
                }
                sdtpa = l64get(rsd->xaddr);
@@ -1358,7 +1302,6 @@ acpirsdptr(void)
        else{
                if(sdtchecksum(rsd, 20) == NULL){
                        printk("acpi: RSD: bad checksum\n");
-                       print_func_exit();
                        return;
                }
                sdtpa = l32get(rsd->raddr);
@@ -1371,12 +1314,10 @@ acpirsdptr(void)
        xsdt = kzmalloc(sizeof(struct Xsdt), 0);
        if(xsdt == NULL){
                printk("acpi: malloc failed\n");
-               print_func_exit();
                return;
        }
        if((xsdt->p = sdtmap(sdtpa, &xsdt->len, 1)) == NULL){
                printk("acpi: sdtmap failed\n");
-               print_func_exit();
                return;
        }
        if((xsdt->p[0] != 'R' && xsdt->p[0] != 'X') || memcmp(xsdt->p+1, "SDT", 3) != 0){
@@ -1385,7 +1326,6 @@ acpirsdptr(void)
                kfree(xsdt);
                xsdt = NULL;
                //vunmap(xsdt, xsdt->len);
-               print_func_exit();
                return;
        }
        xsdt->p += sizeof(struct Sdthdr);
@@ -1395,25 +1335,21 @@ acpirsdptr(void)
        acpixsdtload(NULL);
        /* xsdt is kept and not unmapped */
 
-       print_func_exit();
 }
 
 static int
 acpigen(struct chan *c, char *unused_char_p_t, struct dirtab *tab, int ntab, int i,
        struct dir *dp)
 {
-       print_func_entry();
        struct qid qid;
 
        if(i == DEVDOTDOT){
                mkqid(&qid, Qdir, 0, QTDIR);
                devdir(c, qid, ".", 0, eve, 0555, dp);
-               print_func_exit();
                return 1;
        }
        i++; /* skip first element for . itself */
        if(tab==0 || i>=ntab) {
-               print_func_exit();
                return -1;
        }
        tab += i;
@@ -1421,17 +1357,16 @@ acpigen(struct chan *c, char *unused_char_p_t, struct dirtab *tab, int ntab, int
        qid.path &= ~Qdir;
        qid.vers = 0;
        devdir(c, qid, tab->name, tab->length, eve, tab->perm, dp);
-       print_func_exit();
        return 1;
 }
 
-void
-Gfmt(void (*putch) (int, void **), void **putdat, struct Gas *g)
+static char *
+dumpGas(char *start, char *end, char *prefix, struct Gas *g)
 {
-       print_func_entry();
        static char* rnames[] = {
                        "mem", "io", "pcicfg", "embed",
                        "smb", "cmos", "pcibar", "ipmi"};
+       start = seprintf(start, end, "%s", prefix);
 
        switch(g->spc){
        case Rsysmem:
@@ -1441,29 +1376,29 @@ Gfmt(void (*putch) (int, void **), void **putdat, struct Gas *g)
        case Rcmos:
        case Rpcibar:
        case Ripmi:
-               printfmt(putch, putdat, "[%s ", rnames[g->spc]);
+               start = seprintf(start, end, "[%s ", rnames[g->spc]);
                break;
        case Rpcicfg:
-               printfmt(putch, putdat, "[pci ");
-               printfmt(putch, putdat, "dev %#p ", (uint32_t)(g->addr >> 32) & 0xFFFF);
-               printfmt(putch, putdat, "fn %#p ", (uint32_t)(g->addr & 0xFFFF0000) >> 16);
-               printfmt(putch, putdat, "adr %#p ", (uint32_t)(g->addr &0xFFFF));
+               start = seprintf(start, end, "[pci ");
+               start = seprintf(start, end, "dev %#p ", (uint32_t)(g->addr >> 32) & 0xFFFF);
+               start = seprintf(start, end, "fn %#p ", (uint32_t)(g->addr & 0xFFFF0000) >> 16);
+               start = seprintf(start, end, "adr %#p ", (uint32_t)(g->addr &0xFFFF));
                break;
        case Rfixedhw:
-               printfmt(putch, putdat, "[hw ");
+               start = seprintf(start, end, "[hw ");
                break;
        default:
-               printfmt(putch, putdat, "[spc=%#p ", g->spc);
+               start = seprintf(start, end, "[spc=%#p ", g->spc);
        }
-       printfmt(putch, putdat, "off %d len %d addr %#ullx sz%d]",
+       start = seprintf(start, end, "off %d len %d addr %#p sz%d]",
                g->off, g->len, g->addr, g->accsz);
-       print_func_exit();
+       start = seprintf(start, end, "\n");
+       return start;
 }
 
 static unsigned int
 getbanked(uintptr_t ra, uintptr_t rb, int sz)
 {
-       print_func_entry();
        unsigned int r;
 
        r = 0;
@@ -1489,14 +1424,12 @@ getbanked(uintptr_t ra, uintptr_t rb, int sz)
        default:
                printd("getbanked: wrong size\n");
        }
-       print_func_exit();
        return r;
 }
 
 static unsigned int
 setbanked(uintptr_t ra, uintptr_t rb, int sz, int v)
 {
-       print_func_entry();
        unsigned int r;
 
        r = -1;
@@ -1522,58 +1455,46 @@ setbanked(uintptr_t ra, uintptr_t rb, int sz, int v)
        default:
                printd("setbanked: wrong size\n");
        }
-       print_func_exit();
        return r;
 }
 
 static unsigned int
 getpm1ctl(void)
 {
-       print_func_entry();
-       print_func_exit();
        return getbanked(fadt.pm1acntblk, fadt.pm1bcntblk, fadt.pm1cntlen);
 }
 
 static void
 setpm1sts(unsigned int v)
 {
-       print_func_entry();
        printk("acpi: setpm1sts %#p\n", v);
        setbanked(fadt.pm1aevtblk, fadt.pm1bevtblk, fadt.pm1evtlen/2, v);
-       print_func_exit();
 }
 
 static unsigned int
 getpm1sts(void)
 {
-       print_func_entry();
-       print_func_exit();
        return getbanked(fadt.pm1aevtblk, fadt.pm1bevtblk, fadt.pm1evtlen/2);
 }
 
 static unsigned int
 getpm1en(void)
 {
-       print_func_entry();
        int sz;
 
        sz = fadt.pm1evtlen/2;
-       print_func_exit();
        return getbanked(fadt.pm1aevtblk+sz, fadt.pm1bevtblk+sz, sz);
 }
 
 static int
 getgpeen(int n)
 {
-       print_func_entry();
-       print_func_exit();
        return inb(gpes[n].enio) & 1<<gpes[n].enbit;
 }
 
 static void
 setgpeen(int n, unsigned int v)
 {
-       print_func_entry();
        int old;
 
        printk("acpi: setgpe %d %d\n", n, v);
@@ -1582,22 +1503,17 @@ setgpeen(int n, unsigned int v)
                outb(gpes[n].enio, old | 1<<gpes[n].enbit);
        else
                outb(gpes[n].enio, old & ~(1<<gpes[n].enbit));
-       print_func_exit();
 }
 
 static void
 clrgpests(int n)
 {
-       print_func_entry();
        outb(gpes[n].stsio, 1<<gpes[n].stsbit);
-       print_func_exit();
 }
 
 static unsigned int
 getgpests(int n)
 {
-       print_func_entry();
-       print_func_exit();
        return inb(gpes[n].stsio) & 1<<gpes[n].stsbit;
 }
 
@@ -1637,7 +1553,6 @@ acpiintr(Ureg*, void*)
 static void
 initgpes(void)
 {
-       print_func_entry();
        int i, n0, n1;
 
        n0 = fadt.gpe0blklen/2;
@@ -1662,41 +1577,39 @@ initgpes(void)
                setgpeen(i, 0);
                clrgpests(i);
        }
-       print_func_exit();
 }
 
 static void
 acpiioalloc(unsigned int addr, int len)
 {
-       print_func_entry();
        if(addr != 0){
                printk("Just TAKING port %016lx to %016lx\n", 
                       addr, addr + len);
                //ioalloc(addr, len, 0, "acpi");
        }
-       print_func_exit();
 }
 
 int
 acpiinit(void)
 {
-       print_func_entry();
+       /* this smicmd test implements 'run once' for now. */
        if(fadt.smicmd == 0){
                //fmtinstall('G', Gfmt);
                acpirsdptr();
                if(fadt.smicmd == 0) {
-                       print_func_exit();
+                       printk("acpiinit returns -1\n");
                        return -1;
                }
+               int mpacpi(int ncleft);
+               printk("mpacpi(32) is %d\n", mpacpi(32));
+
        }
-       print_func_exit();
        return 0;
 }
 
 static struct chan*
 acpiattach(char *spec)
 {
-       print_func_entry();
        int i;
 
        printk("ACPI attach\n");
@@ -1731,8 +1644,6 @@ acpiattach(char *spec)
         * This starts ACPI, which may require we handle
         * power mgmt events ourselves. Use with care.
         */
-       printk("acpi NOT starting\n");
-       if (0){
        outb(fadt.smicmd, fadt.acpienable);
        for(i = 0; i < 10; i++)
                if(getpm1ctl() & Pm1SciEn)
@@ -1741,40 +1652,30 @@ acpiattach(char *spec)
                error("acpi: failed to enable\n");
 //     if(fadt.sciint != 0)
 //             intrenable(fadt.sciint, acpiintr, 0, BUSUNKNOWN, "acpi");
-       }
-       print_func_exit();
        return devattach('a', spec);
 }
 
 static struct walkqid*
 acpiwalk(struct chan *c, struct chan *nc, char **name, int nname)
 {
-       print_func_entry();
-       print_func_exit();
        return devwalk(c, nc, name, nname, acpidir, ARRAY_SIZE(acpidir), acpigen);
 }
 
 static int
 acpistat(struct chan *c, uint8_t *dp, int n)
 {
-       print_func_entry();
-       print_func_exit();
        return devstat(c, dp, n, acpidir, ARRAY_SIZE(acpidir), acpigen);
 }
 
 static struct chan*
 acpiopen(struct chan *c, int omode)
 {
-       print_func_entry();
-       print_func_exit();
        return devopen(c, omode, acpidir, ARRAY_SIZE(acpidir), acpigen);
 }
 
 static void
 acpiclose(struct chan *unused)
 {
-print_func_entry();
-print_func_exit();
 }
 
 static char*ttext;
@@ -1783,62 +1684,68 @@ static int tlen;
 static long
 acpiread(struct chan *c, void *a, long n, int64_t off)
 {
-       print_func_entry();
        long q;
        struct Atable *t;
        char *ns, *s, *e, *ntext;
 
+       if (ttext == NULL) {
+               tlen = 32768;
+               ttext = kzmalloc(tlen, KMALLOC_WAIT);
+       }
+       if (ttext == NULL) {
+               error("acpiread: no memory");
+       }
        q = c->qid.path;
        switch(q){
        case Qdir:
-               print_func_exit();
                return devdirread(c, a, n, acpidir, ARRAY_SIZE(acpidir), acpigen);
        case Qtbl:
-               if(ttext == NULL){
-                       tlen = 1024;
-                       ttext = kzmalloc(tlen, 0);
-                       if(ttext == NULL){
-                               printd("acpi: no memory\n");
-                               print_func_exit();
-                               return 0;
-                       }
-                       s = ttext;
-                       e = ttext + tlen;
-                       strncpy(s,  "no tables\n", sizeof(s));
-                       for(t = tfirst; t != NULL; t = t->next){
+               s = ttext;
+               e = ttext + tlen;
+               strncpy(s,  "no tables\n", sizeof(s));
+               for(t = tfirst; t != NULL; t = t->next){
+                       ns = seprinttable(s, e, t);
+                       while(ns == e - 1){
+                               printk("acpiread: allocated %d\n", tlen*2);
+                               ntext = krealloc(ttext, tlen*2, 0);
+                               if(ntext == NULL)
+                                       panic("acpi: no memory\n");
+                               s = ntext + (ttext - s);
+                               ttext = ntext;
+                               tlen *= 2;
+                               e = ttext + tlen;
                                ns = seprinttable(s, e, t);
-                               while(ns == e - 1){
-                                       printk("acpiread: allocated %d\n", tlen*2);
-                                       ntext = krealloc(ttext, tlen*2, 0);
-                                       if(ntext == NULL)
-                                               panic("acpi: no memory\n");
-                                       s = ntext + (ttext - s);
-                                       ttext = ntext;
-                                       tlen *= 2;
-                                       e = ttext + tlen;
-                                       ns = seprinttable(s, e, t);
-                               }
-                               s = ns;
                        }
-                                       
+                       s = ns;
                }
-               print_func_exit();
+               return readstr(off, a, n, ttext);
+       case Qpretty:
+               s = ttext;
+               e = ttext + tlen;
+               s = dumpfadt(s, e, &fadt);
+               s = dumpmadt(s, e, apics);
+               s = dumpslit(s, e, slit);
+               s = dumpsrat(s, e, srat);
+               dumpmsct(s, e, msct);
+               return readstr(off, a, n, ttext);
+       case Qioapic:
+               s = ioapicdump(ttext, ttext + tlen);
+               return readstr(off, a, n, ttext);
+       case Qapic:
+               s = apicdump(ttext, ttext + tlen);
                return readstr(off, a, n, ttext);
        case Qio:
                if(reg == NULL)
                        error("region not configured");
-               print_func_exit();
                return regio(reg, a, n, off, 0);
        }
        error(Eperm);
-       print_func_exit();
        return -1;
 }
 
 static long
 acpiwrite(struct chan *c, void *a, long n, int64_t off)
 {
-       print_func_entry();
        ERRSTACK(2);
        struct cmdtab *ct;
        struct cmdbuf *cb;
@@ -1848,7 +1755,6 @@ acpiwrite(struct chan *c, void *a, long n, int64_t off)
        if(c->qid.path == Qio){
                if(reg == NULL)
                        error("region not configured");
-               print_func_exit();
                return regio(reg, a, n, off, 1);
        }
        if(c->qid.path != Qctl)
@@ -1909,7 +1815,6 @@ acpiwrite(struct chan *c, void *a, long n, int64_t off)
        }
        poperror();
        kfree(cb);
-       print_func_exit();
        return n;
 }