5 typedef struct Interp Interp;
6 typedef struct Frame Frame;
7 typedef struct Heap Heap;
9 typedef struct Method Method;
10 typedef struct Region Region;
11 typedef struct Field Field;
13 typedef struct Name Name;
14 typedef struct Ref Ref;
15 typedef struct Env Env;
25 #define H2D(h) (((Heap*)(h))+1)
26 #define D2H(d) (((Heap*)(d))-1)
27 #define TAG(d) D2H(d)->tag
28 #define SIZE(d) D2H(d)->size
30 static char *spacename[] = {
73 void *reg; /* Buffer or Region */
128 static Interp interp;
129 static Frame stack[32];
134 #define FT &stack[nelem(stack)]
140 Ostr, Obyte, Oword, Odword, Oqword, Oconst,
141 Onamec, Oname, Oscope, Oalias,
142 Oreg, Ofld, Oxfld, Opkg, Ovpkg, Oenv, Obuf, Omet,
143 Odev, Ocpu, Othz, Oprc,
144 Oadd, Osub, Omod, Omul, Odiv, Oshl, Oshr, Oand, Onand, Oor,
145 Onor, Oxor, Onot, Olbit, Orbit, Oinc, Odec,
146 Oland, Olor, Olnot, Oleq, Olgt, Ollt,
147 Oindex, Omutex, Oevent,
148 Ocfld, Ocfld0, Ocfld1, Ocfld2, Ocfld4, Ocfld8,
149 Oif, Oelse, Owhile, Obreak, Oret, Ocall,
150 Ostore, Oderef, Osize, Oref, Ocref, Ocat,
151 Oacq, Orel, Ostall, Osleep, Oload, Ounload,
155 static uchar octab1[];
156 static uchar octab2[];
161 while(dot != dot->up)
184 for(i=0; i<nelem(e->loc); i++)
186 for(i=0; i<nelem(e->arg); i++)
192 gcmark(((Ref*)p)->ref);
197 for(d = n->down; d; d = d->next)
203 for(i=0; i<(SIZE(p)/sizeof(void*)); i++)
204 gcmark(((void**)p)[i]);
207 gcmark(((Region*)p)->name);
210 gcmark(((Method*)p)->name);
229 for(h = hp; h; h = h->link)
232 for(h = hp; h; h = h->link)
236 for(f = FP; f >= FB; f--){
237 for(i=0; i<f->narg; i++)
255 Region *r = (void*)H2D(h);
258 print("\namlunmapio(%N): %-8s %llux - %llux\n",
259 (Name*)r->name, spacename[r->space],
260 r->off, r->off + r->len);
269 memset(h, ~0, sizeof(Heap)+h->size);
278 mk(int tag, int size)
283 a = sizeof(Heap) + size;
297 v = mk('i', sizeof(uvlong));
305 char *r = mk('s', strlen(s)+1);
311 pkglen(uchar *p, uchar *e, uchar **np)
347 n = mk('N', sizeof(Name));
350 n->next = n->down = nil;
356 if(n->up = forkname(dot->up))
363 getseg(Name *dot, void *seg, int new)
367 for(n = l = nil; dot; dot = dot->fork){
368 for(n = dot->down; n; n = n->next){
369 if(memcmp(seg, n->seg, 4) == 0)
374 n = mk('N', sizeof(Name));
375 memmove(n->seg, seg, sizeof(n->seg));
389 getname(Name *dot, char *path, int new)
408 if(*path == 0 || *path == '.')
418 if(x = getseg(dot, seg, 0))
427 dot = getseg(dot, seg, new);
428 } while(*path++ == '.');
434 fixnames(void *dot, void *arg)
440 r = &((Name*)dot)->v;
444 if(v == nil || v == dot)
448 for(i=0; i<(SIZE(r)/sizeof(void*)); i++)
452 if(TAG(v) == 'n' && (v = getname(dot, v, 0)) != nil)
458 getle(uchar *p, int len)
465 v |= ((uvlong)p[i]) << i*8;
470 putle(uchar *p, int len, uvlong v)
474 for(i=0; i<len; i++){
481 rwreg(void *reg, int off, int len, uvlong v, int write)
489 if((off+len) > SIZE(p))
500 if((off+len) > r->len)
504 print("\namlmapio(%N): %-8s %llux - %llux\n",
505 (Name*)r->name, spacename[r->space],
506 r->off, r->off + r->len);
517 if(len > sizeof(buf))
524 print("\nrwreg(%N): %-8s [%llux+%x]/%d <- %llux\n",
525 (Name*)r->name, spacename[r->space],
526 r->off, off, len, v);
529 if((*r->write)(r, p, len, off) != len)
535 if((*r->read)(r, p, len, off) != len)
541 print("\nrwreg(%N): %-8s [%llux+%x]/%d -> %llux\n",
542 (Name*)r->name, spacename[r->space],
543 r->off, off, len, v);
559 return *((uvlong*)p);
563 return strtoull((char*)p, 0, 16);
568 return rwreg(p, 0, n, 0, 0);
575 static void *deref(void *p);
576 static void *store(void *s, void *d);
579 fieldalign(int flags)
581 switch(flags & AccMask){
597 rwfield(Field *f, void *v, int write)
599 int boff, blen, wo, ws, wl, wa, wd, i;
604 if(f == nil || (reg = deref(f->reg)) == nil)
607 store(f->indexv, f->index);
610 if(v && TAG(v) == 'b'){
616 b = mk('b', (blen+7)/8);
617 putle(b, SIZE(b), w);
620 b = mk('b', (blen+7)/8);
621 wa = fieldalign(f->flags);
624 while((wl = (blen-boff)) > 0){
625 wo = (f->bitoff+boff) / wd;
626 ws = (f->bitoff+boff) % wd;
631 for(i = 0; i < wl; i++, boff++)
632 if(b[boff/8] & (1<<(boff%8)))
636 m = ((1ULL<<wl)-1) << ws;
637 w |= rwreg(reg, wo*wa, wa, 0, 0) & ~m;
639 rwreg(reg, wo*wa, wa, w, 1);
641 w = rwreg(reg, wo*wa, wa, 0, 0) >> ws;
642 for(i = 0; i < wl; i++, boff++){
643 b[boff/8] |= (w&1)<<(boff%8);
652 w = getle(b, SIZE(b));
659 if(p) switch(TAG(p)){
661 return ((Name*)p)->v;
662 case 'R': case 'A': case 'L':
663 return *((Ref*)p)->ptr;
665 return rwfield(p, nil, 0);
671 copy(int tag, void *s)
673 static char hex[] = "0123456789ABCDEF";
683 if(s == nil || TAG(s) == 'i'){
686 if(v > 0xFFFFFFFFULL)
691 rwreg(d, 0, n, v, 1);
698 ((char*)d)[--n] = hex[v & 0xF];
712 d = mk(tag, n*3 + 1);
714 ((char*)d)[i*3 + 0] = hex[((uchar*)s)[i] >> 4];
715 ((char*)d)[i*3 + 1] = hex[((uchar*)s)[i] & 0xF];
716 ((char*)d)[i*3 + 2] = ' ';
725 /* zero length string is converted to zero length buffer */
737 store(void *s, void *d)
751 while((p = *pp) != nil){
753 case 'R': case 'A': case 'L':
769 if(p != nil && TAG(p) != 'N'){
776 if(TAG(d) != 'A' && TAG(d) != 'L'){
777 *pp = copy(TAG(p), s);
792 n = va_arg(f->args, Name*);
794 return fmtprint(f, "?NIL");
796 return fmtprint(f, "\\");
797 strncpy(buf, n->seg, 4);
804 if(n->up == n->up->up)
805 return fmtprint(f, "\\%s", buf);
806 return fmtprint(f, "%N.%s", n->up, buf);
821 p = va_arg(f->args, void*);
823 return fmtprint(f, "nil");
829 return fmtprint(f, "%N=%V", nm, nm->v);
830 return fmtprint(f, "%N=*", nm);
836 return fmtprint(f, "Arg%ld=%V", r->ptr - e->arg, *r->ptr);
838 return fmtprint(f, "Local%ld=%V", r->ptr - e->loc, *r->ptr);
840 return fmtprint(f, "%s", (char*)p);
842 return fmtprint(f, "\"%s\"", (char*)p);
844 return fmtprint(f, "%#llux", *((uvlong*)p));
846 n = SIZE(p)/sizeof(void*);
847 fmtprint(f, "Package(%d){", n);
851 fmtprint(f, "%V", ((void**)p)[i]);
857 fmtprint(f, "Buffer(%d){", n);
861 fmtprint(f, "%.2uX", ((uchar*)p)[i]);
867 return fmtprint(f, "Region(%s, %#llux, %#llux)",
868 spacename[g->space & 7], g->off, g->len);
871 fmtprint(f, "%N(", m->name);
872 for(i=0; i < m->narg; i++){
875 fmtprint(f, "Arg%d", i);
880 fmtprint(f, "Buffer");
885 return fmtprint(f, "IndexField(%x, %x, %x) @ %V[%V]",
886 l->flags, l->bitoff, l->bitlen, l->index, l->indexv);
887 return fmtprint(f, "Field(%x, %x, %x) @ %V",
888 l->flags, l->bitoff, l->bitlen, l->reg);
890 return fmtprint(f, "%c:%p", c, p);
901 print("\n*** dumpregs: PC=%p FP=%p\n", PC, FP);
903 for(f = FP; f >= FB; f--){
904 print("%.8p.%.2lx: %-8s %N\t", f->start, f-FB, f->phase, f->dot);
906 print("%s", f->op->name);
908 for(i=0; i<f->narg; i++){
911 print("%V", f->arg[i]);
917 for(i=0; i<nelem(e->arg); i++)
918 print("Arg%d=%V ", i, e->arg[i]);
920 for(i=0; i<nelem(e->loc); i++)
921 print("Local%d=%V ", i, e->loc[i]);
928 xec(uchar *pc, uchar *end, Name *dot, Env *env, void **pret)
950 if((++loop & 127) == 0)
953 print("\n%.8p.%.2lx %-8s\t%N\t", PC, FP - FB, FP->phase, FP->dot);
960 print("aml: PC overrun frame end");
965 print("aml: frame stack overflow");
974 if(amldebug) print("%.2X", c);
979 if(amldebug) print("%.2X", c);
985 FP->phase = FP->op->sequence;
986 if(amldebug) print("\t%s %s", FP->op->name, FP->phase);
990 c = pkglen(PC, FP->end, &PC);
992 if(c < 0 || end > FP->end)
1000 if(end = memchr(PC, 0, FP->end - PC))
1019 for(i = 8; PC < end; i += 8)
1020 *((uvlong*)r) |= ((uvlong)*PC++) << i;
1027 print("*%p,%V\t%s(", FP->aux, FP->ref, FP->op->name);
1028 for(i = 0; i < FP->narg; i++){
1031 print("%V", FP->arg[i]);
1035 for(i = FP->narg; i < nelem(FP->arg); i++)
1043 if(c == '}' && PC < FP->end){
1049 if(r) switch(FP->tag){
1058 if((r = deref(r)) == nil)
1062 r = rwfield(r, nil, 0);
1068 FP->phase = "********}" + (8 - m->narg);
1069 FP->op = &optab[Ocall];
1079 if(amldebug) print(" -> %V\n", r);
1084 FP->arg[FP->narg++] = r;
1095 static char name[1024];
1106 if(d >= &name[sizeof(name)-1]){
1109 print("aml: name too long: %s\n", name);
1118 } else if(*PC == '/'){
1121 } else if(*PC == 0){
1126 if(d >= &name[sizeof(name)-5])
1132 while((d > &name[0]) && (d[-1] == '_' || d[-1] == 0))
1138 if((r = getname(FP->dot, name, FP->tag == 'N')) == nil){
1140 D2H(r)->tag = 'n'; /* unresolved name */
1154 switch(FP->start[0]){
1169 n = ival(FP->arg[0]);
1185 if((p = FP->ref) != nil){
1187 if(x >= p && x < (p+(SIZE(p)/sizeof(void*)))){
1192 n = ival(FP->arg[0]);
1194 p = mk('p', n*sizeof(void*));
1232 n->v = deref(FP->arg[0]);
1242 if((n = FP->arg[0]) != nil){
1243 m = mk('m', sizeof(Method));
1244 m->narg = ival(FP->arg[1]) & 7;
1260 if((n = FP->arg[0]) != nil){
1261 r = mk('r', sizeof(Region));
1262 r->space = ival(FP->arg[1]);
1263 r->off = ival(FP->arg[2]);
1264 r->len = ival(FP->arg[3]);
1281 if(r == nil || (TAG(r) != 'b' && TAG(r) != 'r'))
1288 if(n == nil || TAG(n) != 'N')
1291 f = mk('u', sizeof(Field));
1293 f = mk('f', sizeof(Field));
1296 f->bitoff = ival(FP->arg[1]);
1297 f->bitlen = ival(FP->arg[2]);
1300 f->bitoff = ival(FP->arg[1]);
1307 f->bitoff = 8*ival(FP->arg[1]);
1308 f->bitlen = 8*(c - Ocfld0);
1319 int flags, bitoff, wa, n;
1327 switch(FP->op - optab){
1329 flags = ival(FP->arg[1]);
1332 df = deref(FP->arg[1]);
1333 if(df == nil || TAG(df) != 'f')
1335 flags = ival(FP->arg[2]);
1344 if((n = pkglen(p, FP->end, &p)) < 0)
1357 if((d = getseg(FP->dot, p, 1)) == nil)
1359 if((n = pkglen(p+4, FP->end, &p)) < 0)
1361 f = mk('f', sizeof(Field));
1364 switch(FP->op - optab){
1366 f->reg = FP->arg[0];
1370 wa = fieldalign(df->flags);
1372 f->bitoff = df->bitoff + (bitoff % (wa*8));
1373 f->indexv = mki((bitoff/(wa*8))*wa);
1374 f->index = FP->arg[0];
1396 print("aml: bad opcode %p: ", PC);
1397 for(i=0; i < 8 && (FP->start+i) < FP->end; i++){
1400 print("%.2X", FP->start[i]);
1402 if((FP->start+i) < FP->end)
1412 switch(FP->op - optab){
1416 FP[-1].cond = ival(FP->arg[0]) != 0;
1435 if(ival(FP->arg[0]) == 0){
1453 if(a == nil || TAG(a) == 'i'){
1454 c = ival(a) - ival(b);
1457 if(b == nil || TAG(b) != tag)
1460 return nil; /* botch */
1463 return nil; /* botch */
1465 c = strcmp((char*)a, (char*)b);
1468 if((c = SIZE(a) - SIZE(b)) == 0)
1469 c = memcmp(a, b, SIZE(a));
1474 switch(FP->op - optab){
1476 if(c == 0) return mki(1);
1479 if(c > 0) return mki(1);
1482 if(c < 0) return mki(1);
1503 e = mk('E', sizeof(Env));
1504 for(i=0; i<FP->narg; i++)
1505 e->arg[i] = deref(FP->arg[i]);
1512 return (*m->eval)();
1514 FP->dot = forkname(FP->dot);
1516 FP->start = m->start;
1525 void *r = FP->arg[0];
1526 int brk = (FP->op - optab) != Oret;
1528 switch(FP->op - optab){
1551 if((e = FP->env) == nil)
1554 if(c >= 0x60 && c <= 0x67){
1555 r = mk('L', sizeof(Ref));
1556 r->ptr = &e->loc[c - 0x60];
1557 } else if(c >= 0x68 && c <= 0x6E){
1558 r = mk('A', sizeof(Ref));
1559 r->ptr = &e->arg[c - 0x68];
1569 return store(FP->arg[0], FP->arg[1]);
1580 if(a == nil || TAG(a) == 'i')
1581 a = copy('b', a); /* Concat(Int, ???) -> Buf */
1583 if(b == nil || TAG(b) != tag)
1586 return nil; /* botch */
1589 return nil; /* botch */
1595 memmove((uchar*)r + n, b, m);
1598 n = strlen((char*)a);
1599 m = strlen((char*)b);
1600 r = mk('s', n + m + 1);
1602 memmove((char*)r + n, b, m);
1603 ((char*)r)[n+m] = 0;
1606 store(r, FP->arg[2]);
1618 x = ival(FP->arg[1]);
1619 if(p = deref(FP->arg[0])) switch(TAG(p)){
1621 if(x >= strlen((char*)p))
1625 if(x < 0 || x >= SIZE(p))
1627 f = mk('u', sizeof(Field));
1631 store(f, FP->arg[2]);
1634 if(x < 0 || x >= (SIZE(p)/sizeof(void*)))
1636 if(TAG(FP->arg[0]) == 'A' || TAG(FP->arg[0]) == 'L')
1637 r = mk(TAG(FP->arg[0]), sizeof(Ref));
1639 r = mk('R', sizeof(Ref));
1641 r->ptr = ((void**)p) + x;
1642 store(r, FP->arg[2]);
1652 if((s = FP->arg[0]) == nil)
1654 store(s, FP->arg[1]);
1661 return mki(amllen(FP->arg[0]));
1670 if(TAG(p) == 's' || TAG(p) == 'n')
1671 p = getname(FP->dot, (char*)p, 0);
1685 switch(FP->op - optab){
1687 r = mki(ival(FP->arg[0]) + ival(FP->arg[1]));
1690 r = mki(ival(FP->arg[0]) - ival(FP->arg[1]));
1693 r = mki(ival(FP->arg[0]) * ival(FP->arg[1]));
1697 v = ival(FP->arg[0]);
1698 d = ival(FP->arg[1]);
1700 print("aml: division by zero: PC=%#p\n", PC);
1704 store(r, FP->arg[2]);
1705 if((FP->op - optab) != Odiv)
1708 store(r, FP->arg[3]);
1711 r = mki(ival(FP->arg[0]) << ival(FP->arg[1]));
1714 r = mki(ival(FP->arg[0]) >> ival(FP->arg[1]));
1717 r = mki(ival(FP->arg[0]) & ival(FP->arg[1]));
1720 r = mki(~(ival(FP->arg[0]) & ival(FP->arg[1])));
1723 r = mki(ival(FP->arg[0]) | ival(FP->arg[1]));
1726 r = mki(~(ival(FP->arg[0]) | ival(FP->arg[1])));
1729 r = mki(ival(FP->arg[0]) ^ ival(FP->arg[1]));
1732 r = mki(~ival(FP->arg[0]));
1733 store(r, FP->arg[1]);
1736 v = ival(FP->arg[0]);
1739 for(i=0; (v & 1) == 0; i++)
1744 v = ival(FP->arg[0]);
1747 for(i=0; v != 0; i++)
1752 return mki(ival(FP->arg[0]) && ival(FP->arg[1]));
1754 return mki(ival(FP->arg[0]) || ival(FP->arg[1]));
1756 return mki(ival(FP->arg[0]) == 0);
1759 r = mki(ival(deref(FP->arg[0]))+1);
1760 store(r, FP->arg[0]);
1763 r = mki(ival(deref(FP->arg[0]))-1);
1764 store(r, FP->arg[0]);
1768 store(r, FP->arg[2]);
1775 enum { LenOffset = 4, HdrLen = 36 };
1783 amlenum(amlroot, nil, fixnames, nil);
1786 tid = mki(1); /* fake */
1789 store(nil, FP->arg[1]);
1790 if(FP->arg[0] == nil)
1793 l = rwreg(FP->arg[0], LenOffset, 4, 0, 0);
1797 FP->aux = PC; /* save */
1798 FP->ref = FP->arg[0];
1799 switch(TAG(FP->ref)){
1801 if(SIZE(FP->ref) < l)
1803 PC = (uchar*)FP->ref + HdrLen;
1807 if(r->len < l || r->va == nil || r->mapped <= 0)
1809 PC = (uchar*)r->va + HdrLen;
1814 FP->end = PC + (l - HdrLen);
1818 tid = mki(1); /* fake */
1819 store(tid, FP->arg[1]);
1827 amldelay(ival(FP->arg[0]));
1834 amldelay(ival(FP->arg[0])*1000);
1838 static Op optab[] = {
1839 [Obad] "", "", evalbad,
1840 [Onop] "Noop", "", evalnop,
1841 [Odebug] "Debug", "", evalnop,
1843 [Ostr] ".str", "s", evaliarg0,
1844 [Obyte] ".byte", "1", evaliarg0,
1845 [Oword] ".word", "2", evaliarg0,
1846 [Odword] ".dword", "4", evaliarg0,
1847 [Oqword] ".qword", "8", evaliarg0,
1848 [Oconst] ".const", "", evalconst,
1849 [Onamec] ".name", "", evalnamec,
1850 [Oenv] ".env", "", evalenv,
1852 [Oname] "Name", "N*", evalname,
1853 [Oscope] "Scope", "{n}", evalscope,
1854 [Oalias] "Alias", "nN", evalalias,
1856 [Odev] "Device", "{N}", evalscope,
1857 [Ocpu] "Processor", "{N141}", evalscope,
1858 [Othz] "ThermalZone", "{N}", evalscope,
1859 [Oprc] "PowerResource", "{N12}", evalscope,
1861 [Oreg] "OperationRegion", "N1ii", evalreg,
1862 [Ofld] "Field", "{n1", evalfield,
1863 [Oxfld] "IndexField", "{nn1", evalfield,
1865 [Ocfld] "CreateField", "*iiN", evalcfield,
1866 [Ocfld0] "CreateBitField", "*iN", evalcfield,
1867 [Ocfld1] "CreateByteField", "*iN", evalcfield,
1868 [Ocfld2] "CreateWordField", "*iN", evalcfield,
1869 [Ocfld4] "CreateDWordField", "*iN", evalcfield,
1870 [Ocfld8] "CreateQWordField", "*iN", evalcfield,
1872 [Opkg] "Package", "{1}", evalpkg,
1873 [Ovpkg] "VarPackage", "{i}", evalpkg,
1874 [Obuf] "Buffer", "{i", evalbuf,
1875 [Omet] "Method", "{N1", evalmet,
1877 [Oadd] "Add", "ii@", evalarith,
1878 [Osub] "Subtract", "ii@", evalarith,
1879 [Omod] "Mod", "ii@", evalarith,
1880 [Omul] "Multiply", "ii@", evalarith,
1881 [Odiv] "Divide", "ii@@", evalarith,
1882 [Oshl] "ShiftLef", "ii@", evalarith,
1883 [Oshr] "ShiftRight", "ii@", evalarith,
1884 [Oand] "And", "ii@", evalarith,
1885 [Onand] "Nand", "ii@", evalarith,
1886 [Oor] "Or", "ii@", evalarith,
1887 [Onor] "Nor", "ii@", evalarith,
1888 [Oxor] "Xor", "ii@", evalarith,
1889 [Onot] "Not", "i@", evalarith,
1891 [Olbit] "FindSetLeftBit", "i@", evalarith,
1892 [Orbit] "FindSetRightBit", "i@", evalarith,
1894 [Oinc] "Increment", "@", evalarith,
1895 [Odec] "Decrement", "@", evalarith,
1897 [Oland] "LAnd", "ii", evalarith,
1898 [Olor] "LOr", "ii", evalarith,
1899 [Olnot] "LNot", "i", evalarith,
1901 [Oleq] "LEqual", "**", evalcmp,
1902 [Olgt] "LGreater", "**", evalcmp,
1903 [Ollt] "LLess", "**", evalcmp,
1905 [Omutex] "Mutex", "N1", evalnop,
1906 [Oevent] "Event", "N", evalnop,
1908 [Oif] "If", "{i}", evalcond,
1909 [Oelse] "Else", "{}", evalcond,
1910 [Owhile] "While", "{,i}", evalcond,
1911 [Obreak] "Break", "", evalret,
1912 [Oret] "Return", "*", evalret,
1913 [Ocall] "Call", "", evalcall,
1915 [Ostore] "Store", "*@", evalstore,
1916 [Oindex] "Index", "@i@", evalindex,
1917 [Osize] "SizeOf", "*", evalsize,
1918 [Oref] "RefOf", "@", evaliarg0,
1919 [Ocref] "CondRefOf", "@@", evalcondref,
1920 [Oderef] "DerefOf", "@", evalderef,
1921 [Ocat] "Concatenate", "**@", evalcat,
1923 [Oacq] "Acquire", "@2", evalnop,
1924 [Orel] "Release", "@", evalnop,
1925 [Ostall] "Stall", "i", evalstall,
1926 [Osleep] "Sleep", "i", evalsleep,
1927 [Oload] "Load", "*@}", evalload,
1928 [Ounload] "Unload", "@", evalnop,
1931 static uchar octab1[] = {
1932 /* 00 */ Oconst, Oconst, Obad, Obad, Obad, Obad, Oalias, Obad,
1933 /* 08 */ Oname, Obad, Obyte, Oword, Odword, Ostr, Oqword, Obad,
1934 /* 10 */ Oscope, Obuf, Opkg, Ovpkg, Omet, Obad, Obad, Obad,
1935 /* 18 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1936 /* 20 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1937 /* 28 */ Obad, Obad, Obad, Obad, Obad, Obad, Onamec, Onamec,
1938 /* 30 */ Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec,
1939 /* 38 */ Onamec, Onamec, Obad, Obad, Obad, Obad, Obad, Obad,
1940 /* 40 */ Obad, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec,
1941 /* 48 */ Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec,
1942 /* 50 */ Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec,
1943 /* 58 */ Onamec, Onamec, Onamec, Obad, Onamec, Obad, Onamec, Onamec,
1944 /* 60 */ Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Oenv,
1945 /* 68 */ Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Obad,
1946 /* 70 */ Ostore, Oref, Oadd, Ocat, Osub, Oinc, Odec, Omul,
1947 /* 78 */ Odiv, Oshl, Oshr, Oand, Onand, Oor, Onor, Oxor,
1948 /* 80 */ Onot, Olbit, Orbit, Oderef, Obad, Omod, Obad, Osize,
1949 /* 88 */ Oindex, Obad, Ocfld4, Ocfld2, Ocfld1, Ocfld0, Obad, Ocfld8,
1950 /* 90 */ Oland, Olor, Olnot, Oleq, Olgt, Ollt, Obad, Obad,
1951 /* 98 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1952 /* A0 */ Oif, Oelse, Owhile, Onop, Oret, Obreak, Obad, Obad,
1953 /* A8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1954 /* B0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1955 /* B8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1956 /* C0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1957 /* C8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1958 /* D0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1959 /* D8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1960 /* E0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1961 /* E8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1962 /* F0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1963 /* F8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Oconst,
1966 static uchar octab2[] = {
1967 /* 00 */ Obad, Omutex, Oevent, Obad, Obad, Obad, Obad, Obad,
1968 /* 08 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1969 /* 10 */ Obad, Obad, Ocref, Ocfld, Obad, Obad, Obad, Obad,
1970 /* 18 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1971 /* 20 */ Oload, Ostall, Osleep, Oacq, Obad, Obad, Obad, Orel,
1972 /* 28 */ Obad, Obad, Ounload,Obad, Obad, Obad, Obad, Obad,
1973 /* 30 */ Obad, Odebug, Obad, Obad, Obad, Obad, Obad, Obad,
1974 /* 38 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1975 /* 40 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1976 /* 48 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1977 /* 50 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1978 /* 58 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1979 /* 60 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1980 /* 68 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1981 /* 70 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1982 /* 78 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1983 /* 80 */ Oreg, Ofld, Odev, Ocpu, Oprc, Othz, Oxfld, Obad,
1984 /* 88 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1985 /* 90 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1986 /* 98 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1987 /* A0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1988 /* A8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1989 /* B0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1990 /* B8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1991 /* C0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1992 /* C8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1993 /* D0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1994 /* D8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1995 /* E0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1996 /* E8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1997 /* F0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
1998 /* F8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2004 return p ? TAG(p) : 0;
2025 p = *((Ref*)p)->ptr;
2029 return strlen((char*)p);
2031 return SIZE(p)/sizeof(void*);
2040 amlnew(char tag, int len)
2047 return mk(tag, len + 1);
2049 return mk(tag, len * sizeof(void*));
2051 return mk(tag, len);
2058 static char *w[] = {
2067 s = FP->env->arg[0];
2068 if(s == nil || TAG(s) != 's')
2070 for(i = 0; i < nelem(w); i++)
2071 if(strcmp(s, w[i]) == 0)
2072 return mki(0xFFFFFFFF);
2081 fmtinstall('V', Vfmt);
2082 fmtinstall('N', Nfmt);
2084 n = mk('N', sizeof(Name));
2089 getname(amlroot, "_GPE", 1);
2090 getname(amlroot, "_PR", 1);
2091 getname(amlroot, "_SB", 1);
2092 getname(amlroot, "_TZ", 1);
2093 getname(amlroot, "_SI", 1);
2094 getname(amlroot, "_GL", 1);
2096 if(n = getname(amlroot, "_REV", 1))
2098 if(n = getname(amlroot, "_OS", 1))
2099 n->v = mks("Microsoft Windows");
2100 if(n = getname(amlroot, "_OSI", 1)){
2103 m = mk('m', sizeof(Method));
2120 amlload(uchar *data, int len)
2124 ret = xec(data, data+len, amlroot, nil, nil);
2125 amlenum(amlroot, nil, fixnames, nil);
2130 amlwalk(void *dot, char *name)
2132 return getname(dot, name, 0);
2136 amlenum(void *dot, char *seg, int (*proc)(void *, void *), void *arg)
2142 if(d == nil || TAG(d) != 'N')
2146 if(seg == nil || memcmp(seg, d->seg, sizeof(d->seg)) == 0)
2147 rec = (*proc)(d, arg) == 0;
2148 for(n = d->down; n && rec; n = n->next)
2149 amlenum(n, seg, proc, arg);
2155 amleval(void *dot, char *fmt, ...)
2164 e = mk('E', sizeof(Env));
2165 for(i=0;*fmt;fmt++){
2170 e->arg[i++] = mks(va_arg(a, char*));
2173 e->arg[i++] = mki(va_arg(a, int));
2176 e->arg[i++] = mki(va_arg(a, uvlong));
2181 e->arg[i++] = va_arg(a, void*);
2185 r = va_arg(a, void**);
2187 if(dot = deref(dot))
2188 if(TAG(dot) == 'm'){
2193 return xec(m->start, m->end, forkname(m->name), e, r);
2199 FP->ref = FP->aux = nil;