]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/scram.c
aux/realemu: run cpuproc in same fd group as fileserver
[plan9front.git] / sys / src / cmd / scram.c
index cbbe8d90d4ab59d99086e5d9cf2d2bf3d013d3cc..32d4bc389f764996bb97b734e03d924c4c5779f7 100644 (file)
@@ -6,6 +6,7 @@
 int fd, iofd;
 struct Ureg u;
 ulong PM1a_CNT_BLK, PM1b_CNT_BLK, SLP_TYPa, SLP_TYPb;
+ulong GPE0_BLK, GPE1_BLK, GPE0_BLK_LEN, GPE1_BLK_LEN;
 enum {
        SLP_EN = 0x2000,
        SLP_TM = 0x1c00,
@@ -25,15 +26,9 @@ struct Tbl {
        uchar   data[];
 };
 
-void*
-amlalloc(int n){
-       return mallocz(n, 1);
-}
-
-void
-amlfree(void *p){
-       free(p);
-}
+enum {
+       Tblsz   = 4+4+1+1+6+8+4+4+4,
+};
 
 static ulong
 get32(uchar *p){
@@ -64,24 +59,30 @@ loadacpi(void)
        amlinit();
        for(;;){
                t = malloc(sizeof(*t));
-               if((n = readn(fd, t, sizeof(*t))) <= 0)
+               if((n = readn(fd, t, Tblsz)) <= 0)
                        break;
-               if(n != sizeof(*t))
+               if(n != Tblsz)
                        return -1;
                l = get32(t->len);
-               if(l < sizeof(*t))
+               if(l < Tblsz)
                        return -1;
-               t = realloc(t, l);
-               l -= sizeof(*t);
+               l -= Tblsz;
+               t = realloc(t, sizeof(*t) + l);
                if(readn(fd, t->data, l) != l)
                        return -1;
-               if(memcmp("DSDT", t->sig, 4) == 0)
+               if(memcmp("DSDT", t->sig, 4) == 0){
+                       amlintmask = (~0ULL) >> (t->rev <= 1)*32;
                        amlload(t->data, l);
+               }
                else if(memcmp("SSDT", t->sig, 4) == 0)
                        amlload(t->data, l);
                else if(memcmp("FACP", t->sig, 4) == 0){
                        PM1a_CNT_BLK = get32(((uchar*)t) + 64);
                        PM1b_CNT_BLK = get32(((uchar*)t) + 68);
+                       GPE0_BLK = get32(((uchar*)t) + 80);
+                       GPE1_BLK = get32(((uchar*)t) + 84);
+                       GPE0_BLK_LEN = *(((uchar*)t) + 92);
+                       GPE1_BLK_LEN = *(((uchar*)t) + 93);
                }
        }
        if(amleval(amlwalk(amlroot, "_S5"), "", &r) < 0)
@@ -125,6 +126,8 @@ wirecpu0(void)
 void
 main()
 {
+       int n;
+
        wirecpu0();
 
        if((fd = open("/dev/apm", ORDWR)) < 0)
@@ -150,6 +153,16 @@ tryacpi:
        if(loadacpi() < 0)
                goto fail;
 
+       /* disable GPEs */
+       for(n = 0; GPE0_BLK > 0 && n < GPE0_BLK_LEN/2; n += 2){
+               outw(GPE0_BLK + GPE0_BLK_LEN/2 + n, 0); /* EN */
+               outw(GPE0_BLK + n, 0xffff); /* STS */
+       }
+       for(n = 0; GPE1_BLK > 0 && n < GPE1_BLK_LEN/2; n += 2){
+               outw(GPE1_BLK + GPE1_BLK_LEN/2 + n, 0); /* EN */
+               outw(GPE1_BLK + n, 0xffff); /* STS */
+       }
+
        outw(PM1a_CNT_BLK, ((SLP_TYPa << 10) & SLP_TM) | SLP_EN);
        outw(PM1b_CNT_BLK, ((SLP_TYPb << 10) & SLP_TM) | SLP_EN);
        sleep(100);