2 #include </386/include/ureg.h>
8 ulong PM1A_CNT_BLK, PM1B_CNT_BLK, SLP_TYPa, SLP_TYPb;
10 typedef struct Tbl Tbl;
36 return p[3]<<24 | p[2]<<16 | p[1]<<8 | p[0];
43 if(write(fd, &u, sizeof u) < 0)
44 sysfatal("write: %r");
46 if(read(fd, &u, sizeof u) < 0)
49 sysfatal("apm: %lux", (u.ax>>8) & 0xFF);
62 t = malloc(sizeof(*t));
63 if((n = readn(fd, t, sizeof(*t))) <= 0)
72 if(readn(fd, t->data, l) != l)
74 if(memcmp("DSDT", t->sig, 4) == 0)
76 else if(memcmp("SSDT", t->sig, 4) == 0)
78 else if(memcmp("FACP", t->sig, 4) == 0){
79 PM1A_CNT_BLK = get32(((uchar*)t) + 64);
80 PM1B_CNT_BLK = get32(((uchar*)t) + 68);
85 if(amleval(amlwalk(amlroot, "_S5"), "", &r) < 0)
87 if(amltag(r) != 'p' || amllen(r) < 2)
90 SLP_TYPa = (amlint(rr[1]) & 0xFF) << 10;
91 SLP_TYPb = ((amlint(rr[1]) >> 8) & 0xFF) << 10;
96 outw(long addr, short val)
102 pwrite(iofd, buf, 2, addr);
108 if((fd = open("/dev/apm", ORDWR)) < 0)
109 if((fd = open("#P/apm", ORDWR)) < 0)
122 if((fd = open("/dev/acpitbls", OREAD)) < 0)
123 if((fd = open("#P/acpitbls", OREAD)) < 0)
125 if((iofd = open("/dev/iow", OWRITE)) < 0)
126 if((iofd = open("#P/iow", OWRITE)) < 0)
130 outw(PM1A_CNT_BLK, SLP_TYPa | 0x2000);
131 if(PM1B_CNT_BLK != 0)
132 outw(PM1B_CNT_BLK, SLP_TYPb | 0x2000);