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, Obfld, 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, Omatch, 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,
156 static uchar octab1[];
157 static uchar octab2[];
162 while(dot != dot->up)
185 for(i=0; i<nelem(e->loc); i++)
187 for(i=0; i<nelem(e->arg); i++)
193 gcmark(((Ref*)p)->ref);
198 for(d = n->down; d; d = d->next)
204 for(i=0; i<(SIZE(p)/sizeof(void*)); i++)
205 gcmark(((void**)p)[i]);
208 gcmark(((Region*)p)->name);
211 gcmark(((Method*)p)->name);
230 for(h = hp; h; h = h->link)
233 for(h = hp; h; h = h->link)
237 for(f = FP; f >= FB; f--){
238 for(i=0; i<f->narg; i++)
256 Region *r = (void*)H2D(h);
259 print("\namlunmapio(%N): %-8s %llux - %llux\n",
260 (Name*)r->name, spacename[r->space],
261 r->off, r->off + r->len);
270 memset(h, ~0, sizeof(Heap)+h->size);
279 mk(int tag, int size)
284 a = sizeof(Heap) + size;
299 v = mk('i', sizeof(uvlong));
307 char *r = mk('s', strlen(s)+1);
313 pkglen(uchar *p, uchar *e, uchar **np)
349 n = mk('N', sizeof(Name));
352 n->next = n->down = nil;
358 if(n->up = forkname(dot->up))
365 getseg(Name *dot, void *seg, int new)
369 for(n = l = nil; dot; dot = dot->fork){
370 for(n = dot->down; n; n = n->next){
371 if(memcmp(seg, n->seg, 4) == 0)
376 n = mk('N', sizeof(Name));
377 memmove(n->seg, seg, sizeof(n->seg));
391 getname(Name *dot, char *path, int new)
413 if(*path == 0 || *path == '.')
423 if(x = getseg(dot, seg, 0))
432 dot = getseg(dot, seg, new);
433 } while(*path++ == '.');
439 fixnames(void *dot, void *arg)
445 r = &((Name*)dot)->v;
449 if(v == nil || v == dot)
453 for(i=0; i<(SIZE(r)/sizeof(void*)); i++)
457 if(TAG(v) == 'n' && (v = getname(dot, v, 0)) != nil)
463 getle(uchar *p, int len)
470 v |= ((uvlong)p[i]) << i*8;
475 putle(uchar *p, int len, uvlong v)
479 for(i=0; i<len; i++){
486 rwreg(void *reg, int off, int len, uvlong v, int write)
494 if((off+len) > SIZE(p))
505 if((off+len) > r->len)
509 print("\namlmapio(%N): %-8s %llux - %llux\n",
510 (Name*)r->name, spacename[r->space],
511 r->off, r->off + r->len);
522 if(len > sizeof(buf))
529 print("\nrwreg(%N): %-8s [%llux+%x]/%d <- %llux\n",
530 (Name*)r->name, spacename[r->space],
531 r->off, off, len, v);
534 if((*r->write)(r, p, len, off) != len)
540 if((*r->read)(r, p, len, off) != len)
546 print("\nrwreg(%N): %-8s [%llux+%x]/%d -> %llux\n",
547 (Name*)r->name, spacename[r->space],
548 r->off, off, len, v);
564 return *((uvlong*)p);
568 return strtoull((char*)p, 0, 16);
573 return rwreg(p, 0, n, 0, 0);
580 static void *deref(void *p);
581 static void *store(void *s, void *d);
584 fieldalign(int flags)
586 switch(flags & AccMask){
602 rwfield(Field *f, void *v, int write)
604 int boff, blen, wo, ws, wl, wa, wd, i;
609 if(f == nil || (reg = deref(f->reg)) == nil)
612 store(f->indexv, f->index);
615 if(v && TAG(v) == 'b'){
621 b = mk('b', (blen+7)/8);
622 putle(b, SIZE(b), w);
625 b = mk('b', (blen+7)/8);
626 wa = fieldalign(f->flags);
629 while((wl = (blen-boff)) > 0){
630 wo = (f->bitoff+boff) / wd;
631 ws = (f->bitoff+boff) % wd;
636 for(i = 0; i < wl; i++, boff++)
637 if(b[boff/8] & (1<<(boff%8)))
641 m = ((1ULL<<wl)-1) << ws;
642 w |= rwreg(reg, wo*wa, wa, 0, 0) & ~m;
644 rwreg(reg, wo*wa, wa, w, 1);
646 w = rwreg(reg, wo*wa, wa, 0, 0) >> ws;
647 for(i = 0; i < wl; i++, boff++){
648 b[boff/8] |= (w&1)<<(boff%8);
657 w = getle(b, SIZE(b));
664 if(p) switch(TAG(p)){
666 return ((Name*)p)->v;
667 case 'R': case 'A': case 'L':
668 return *((Ref*)p)->ptr;
670 return rwfield(p, nil, 0);
676 copy(int tag, void *s)
678 static char hex[] = "0123456789ABCDEF";
688 if(s == nil || TAG(s) == 'i'){
691 if(v > 0xFFFFFFFFULL)
696 rwreg(d, 0, n, v, 1);
703 ((char*)d)[--n] = hex[v & 0xF];
717 d = mk(tag, n*3 + 1);
719 ((char*)d)[i*3 + 0] = hex[((uchar*)s)[i] >> 4];
720 ((char*)d)[i*3 + 1] = hex[((uchar*)s)[i] & 0xF];
721 ((char*)d)[i*3 + 2] = ' ';
730 /* zero length string is converted to zero length buffer */
742 store(void *s, void *d)
756 while((p = *pp) != nil){
758 case 'R': case 'A': case 'L':
774 if(p != nil && TAG(p) != 'N'){
781 if(TAG(d) != 'A' && TAG(d) != 'L'){
782 *pp = copy(TAG(p), s);
797 n = va_arg(f->args, Name*);
799 return fmtprint(f, "?NIL");
801 return fmtprint(f, "\\");
802 strncpy(buf, n->seg, 4);
809 if(n->up == n->up->up)
810 return fmtprint(f, "\\%s", buf);
811 return fmtprint(f, "%N.%s", n->up, buf);
826 p = va_arg(f->args, void*);
828 return fmtprint(f, "nil");
834 return fmtprint(f, "%N=%V", nm, nm->v);
835 return fmtprint(f, "%N=*", nm);
841 return fmtprint(f, "Arg%zd=%V", r->ptr - e->arg, *r->ptr);
843 return fmtprint(f, "Local%zd=%V", r->ptr - e->loc, *r->ptr);
845 return fmtprint(f, "%s", (char*)p);
847 return fmtprint(f, "\"%s\"", (char*)p);
849 return fmtprint(f, "%#llux", *((uvlong*)p));
851 n = SIZE(p)/sizeof(void*);
852 fmtprint(f, "Package(%d){", n);
856 fmtprint(f, "%V", ((void**)p)[i]);
862 fmtprint(f, "Buffer(%d){", n);
866 fmtprint(f, "%.2uX", ((uchar*)p)[i]);
872 return fmtprint(f, "Region(%s, %#llux, %#llux)",
873 spacename[g->space & 7], g->off, g->len);
876 fmtprint(f, "%N(", m->name);
877 for(i=0; i < m->narg; i++){
880 fmtprint(f, "Arg%d", i);
885 fmtprint(f, "Buffer");
890 return fmtprint(f, "IndexField(%x, %x, %x) @ %V[%V]",
891 l->flags, l->bitoff, l->bitlen, l->index, l->indexv);
892 return fmtprint(f, "Field(%x, %x, %x) @ %V",
893 l->flags, l->bitoff, l->bitlen, l->reg);
895 return fmtprint(f, "%c:%p", c, p);
906 print("\n*** dumpregs: PC=%p FP=%p\n", PC, FP);
908 for(f = FP; f >= FB; f--){
909 print("%.8p.%.2zx: %-8s %N\t", f->start, f-FB, f->phase, f->dot);
911 print("%s", f->op->name);
913 for(i=0; i<f->narg; i++){
916 print("%V", f->arg[i]);
922 for(i=0; i<nelem(e->arg); i++)
923 print("Arg%d=%V ", i, e->arg[i]);
925 for(i=0; i<nelem(e->loc); i++)
926 print("Local%d=%V ", i, e->loc[i]);
933 xec(uchar *pc, uchar *end, Name *dot, Env *env, void **pret)
955 if((++loop & 127) == 0)
958 print("\n%.8p.%.2zx %-8s\t%N\t", PC, FP - FB, FP->phase, FP->dot);
965 print("aml: PC overrun frame end");
970 print("aml: frame stack overflow");
979 if(amldebug) print("%.2X", c);
984 if(amldebug) print("%.2X", c);
990 FP->phase = FP->op->sequence;
991 if(amldebug) print("\t%s %s", FP->op->name, FP->phase);
995 c = pkglen(PC, FP->end, &PC);
997 if(c < 0 || end > FP->end)
1005 if(end = memchr(PC, 0, FP->end - PC))
1024 for(i = 8; PC < end; i += 8)
1025 *((uvlong*)r) |= ((uvlong)*PC++) << i;
1032 print("*%p,%V\t%s(", FP->aux, FP->ref, FP->op->name);
1033 for(i = 0; i < FP->narg; i++){
1036 print("%V", FP->arg[i]);
1040 for(i = FP->narg; i < nelem(FP->arg); i++)
1048 if(c == '}' && PC < FP->end){
1054 if(r) switch(FP->tag){
1063 if((r = deref(r)) == nil)
1067 r = rwfield(r, nil, 0);
1073 FP->phase = "********}" + (8 - m->narg);
1074 FP->op = &optab[Ocall];
1084 if(amldebug) print(" -> %V\n", r);
1089 FP->arg[FP->narg++] = r;
1100 static char name[1024];
1111 if(d >= &name[sizeof(name)-1]){
1114 print("aml: name too long: %s\n", name);
1123 } else if(*PC == '/'){
1126 } else if(*PC == 0){
1131 if(d >= &name[sizeof(name)-5])
1137 while((d > &name[0]) && (d[-1] == '_' || d[-1] == 0))
1143 if((r = getname(FP->dot, name, FP->tag == 'N')) == nil){
1145 D2H(r)->tag = 'n'; /* unresolved name */
1159 switch(FP->start[0]){
1174 n = ival(FP->arg[0]);
1190 if((p = FP->ref) != nil){
1192 if(x >= p && x < (p+(SIZE(p)/sizeof(void*)))){
1197 n = ival(FP->arg[0]);
1199 p = mk('p', n*sizeof(void*));
1237 n->v = deref(FP->arg[0]);
1247 if((n = FP->arg[0]) != nil){
1248 m = mk('m', sizeof(Method));
1249 m->narg = ival(FP->arg[1]) & 7;
1265 if((n = FP->arg[0]) != nil){
1266 r = mk('r', sizeof(Region));
1267 r->space = ival(FP->arg[1]);
1268 r->off = ival(FP->arg[2]);
1269 r->len = ival(FP->arg[3]);
1286 if(r == nil || (TAG(r) != 'b' && TAG(r) != 'r'))
1293 if(n == nil || TAG(n) != 'N')
1296 f = mk('u', sizeof(Field));
1298 f = mk('f', sizeof(Field));
1301 f->bitoff = ival(FP->arg[1]);
1302 f->bitlen = ival(FP->arg[2]);
1305 f->bitoff = ival(FP->arg[1]);
1312 f->bitoff = 8*ival(FP->arg[1]);
1313 f->bitlen = 8*(c - Ocfld0);
1324 int flags, bitoff, wa, n;
1332 switch(FP->op - optab){
1334 flags = ival(FP->arg[1]);
1337 df = deref(FP->arg[1]);
1338 if(df == nil || TAG(df) != 'f')
1340 flags = ival(FP->arg[2]);
1343 df = deref(FP->arg[1]);
1344 if(df == nil || TAG(df) != 'f')
1346 flags = ival(FP->arg[3]);
1355 if((n = pkglen(p, FP->end, &p)) < 0)
1368 if((d = getseg(FP->dot, p, 1)) == nil)
1370 if((n = pkglen(p+4, FP->end, &p)) < 0)
1372 f = mk('f', sizeof(Field));
1375 switch(FP->op - optab){
1377 f->reg = FP->arg[0];
1381 wa = fieldalign(df->flags);
1383 f->bitoff = df->bitoff + (bitoff % (wa*8));
1384 f->indexv = mki((bitoff/(wa*8))*wa);
1385 f->index = FP->arg[0];
1388 f->reg = FP->arg[0];
1390 f->indexv = FP->arg[2];
1413 print("aml: bad opcode %p: ", PC);
1414 for(i=0; i < 8 && (FP->start+i) < FP->end; i++){
1417 print("%.2X", FP->start[i]);
1419 if((FP->start+i) < FP->end)
1429 switch(FP->op - optab){
1433 FP[-1].cond = ival(FP->arg[0]) != 0;
1452 if(ival(FP->arg[0]) == 0){
1463 cmp1(void *a, void *b)
1468 if(a == nil || TAG(a) == 'i'){
1469 c = ival(a) - ival(b);
1472 if(b == nil || TAG(b) != tag)
1475 return -1; /* botch */
1478 return -1; /* botch */
1480 c = strcmp((char*)a, (char*)b);
1483 c = SIZE(a) - SIZE(b);
1485 c = memcmp(a, b, SIZE(a));
1495 vlong c = cmp1(FP->arg[0], FP->arg[1]);
1496 switch(FP->op - optab){
1498 if(c == 0) return mki(1);
1501 if(c > 0) return mki(1);
1504 if(c < 0) return mki(1);
1525 e = mk('E', sizeof(Env));
1526 for(i=0; i<FP->narg; i++)
1527 e->arg[i] = deref(FP->arg[i]);
1534 return (*m->eval)();
1536 FP->dot = forkname(FP->dot);
1538 FP->start = m->start;
1547 void *r = FP->arg[0];
1548 int brk = (FP->op - optab) != Oret;
1550 switch(FP->op - optab){
1573 if((e = FP->env) == nil)
1576 if(c >= 0x60 && c <= 0x67){
1577 r = mk('L', sizeof(Ref));
1578 r->ptr = &e->loc[c - 0x60];
1579 } else if(c >= 0x68 && c <= 0x6E){
1580 r = mk('A', sizeof(Ref));
1581 r->ptr = &e->arg[c - 0x68];
1591 return store(FP->arg[0], FP->arg[1]);
1602 if(a == nil || TAG(a) == 'i')
1603 a = copy('b', a); /* Concat(Int, ???) -> Buf */
1605 if(b == nil || TAG(b) != tag)
1608 return nil; /* botch */
1611 return nil; /* botch */
1617 memmove((uchar*)r + n, b, m);
1620 n = strlen((char*)a);
1621 m = strlen((char*)b);
1622 r = mk('s', n + m + 1);
1624 memmove((char*)r + n, b, m);
1625 ((char*)r)[n+m] = 0;
1628 store(r, FP->arg[2]);
1640 x = ival(FP->arg[1]);
1641 if(p = deref(FP->arg[0])) switch(TAG(p)){
1643 if(x >= strlen((char*)p))
1649 f = mk('u', sizeof(Field));
1653 store(f, FP->arg[2]);
1656 if(x >= (SIZE(p)/sizeof(void*)))
1658 if(TAG(FP->arg[0]) == 'A' || TAG(FP->arg[0]) == 'L')
1659 r = mk(TAG(FP->arg[0]), sizeof(Ref));
1661 r = mk('R', sizeof(Ref));
1663 r->ptr = ((void**)p) + x;
1664 store(r, FP->arg[2]);
1671 match1(int op, void *a, void *b)
1673 vlong c = cmp1(a, b);
1676 case 1: return c == 0;
1677 case 2: return c <= 0;
1678 case 3: return c < 0;
1679 case 4: return c >= 0;
1680 case 5: return c > 0;
1688 void **p = FP->arg[0];
1689 if(p != nil && TAG(p) == 'p'){
1690 uvlong i, n = SIZE(p)/sizeof(void*);
1691 int o1 = ival(FP->arg[1]), o2 = ival(FP->arg[3]);
1692 for(i=ival(FP->arg[5]); i<n; i++){
1693 void *a = deref(p[i]);
1694 if(match1(o1, a, FP->arg[2]) && match1(o2, a, FP->arg[4]))
1705 if((s = FP->arg[0]) == nil)
1707 store(s, FP->arg[1]);
1714 return mki(amllen(FP->arg[0]));
1723 if(TAG(p) == 's' || TAG(p) == 'n')
1724 p = getname(FP->dot, (char*)p, 0);
1738 switch(FP->op - optab){
1740 r = mki(ival(FP->arg[0]) + ival(FP->arg[1]));
1743 r = mki(ival(FP->arg[0]) - ival(FP->arg[1]));
1746 r = mki(ival(FP->arg[0]) * ival(FP->arg[1]));
1750 v = ival(FP->arg[0]);
1751 d = ival(FP->arg[1]);
1753 print("aml: division by zero: PC=%#p\n", PC);
1757 store(r, FP->arg[2]);
1758 if((FP->op - optab) != Odiv)
1761 store(r, FP->arg[3]);
1764 r = mki(ival(FP->arg[0]) << ival(FP->arg[1]));
1767 r = mki(ival(FP->arg[0]) >> ival(FP->arg[1]));
1770 r = mki(ival(FP->arg[0]) & ival(FP->arg[1]));
1773 r = mki(~(ival(FP->arg[0]) & ival(FP->arg[1])));
1776 r = mki(ival(FP->arg[0]) | ival(FP->arg[1]));
1779 r = mki(~(ival(FP->arg[0]) | ival(FP->arg[1])));
1782 r = mki(ival(FP->arg[0]) ^ ival(FP->arg[1]));
1785 r = mki(~ival(FP->arg[0]));
1786 store(r, FP->arg[1]);
1789 v = ival(FP->arg[0]);
1792 for(i=0; (v & 1) == 0; i++)
1797 v = ival(FP->arg[0]);
1800 for(i=0; v != 0; i++)
1805 return mki(ival(FP->arg[0]) && ival(FP->arg[1]));
1807 return mki(ival(FP->arg[0]) || ival(FP->arg[1]));
1809 return mki(ival(FP->arg[0]) == 0);
1812 r = mki(ival(deref(FP->arg[0]))+1);
1813 store(r, FP->arg[0]);
1816 r = mki(ival(deref(FP->arg[0]))-1);
1817 store(r, FP->arg[0]);
1821 store(r, FP->arg[2]);
1828 enum { LenOffset = 4, HdrLen = 36 };
1836 amlenum(amlroot, nil, fixnames, nil);
1839 tid = mki(1); /* fake */
1842 store(nil, FP->arg[1]);
1843 if(FP->arg[0] == nil)
1846 l = rwreg(FP->arg[0], LenOffset, 4, 0, 0);
1850 FP->aux = PC; /* save */
1851 FP->ref = FP->arg[0];
1852 switch(TAG(FP->ref)){
1854 if(SIZE(FP->ref) < l)
1856 PC = (uchar*)FP->ref + HdrLen;
1860 if(r->len < l || r->va == nil || r->mapped <= 0)
1862 PC = (uchar*)r->va + HdrLen;
1867 FP->end = PC + (l - HdrLen);
1871 tid = mki(1); /* fake */
1872 store(tid, FP->arg[1]);
1880 amldelay(ival(FP->arg[0]));
1887 amldelay(ival(FP->arg[0])*1000);
1897 switch(FP->op - optab){
1899 if(FP->arg[0] != nil && TAG(FP->arg[0]) == 's')
1900 r = mki(strtoull((char*)FP->arg[0], 0, 0));
1902 r = mki(ival(FP->arg[0]));
1905 store(r, FP->arg[1]);
1909 static Op optab[] = {
1910 [Obad] "", "", evalbad,
1911 [Onop] "Noop", "", evalnop,
1912 [Odebug] "Debug", "", evalnop,
1914 [Ostr] ".str", "s", evaliarg0,
1915 [Obyte] ".byte", "1", evaliarg0,
1916 [Oword] ".word", "2", evaliarg0,
1917 [Odword] ".dword", "4", evaliarg0,
1918 [Oqword] ".qword", "8", evaliarg0,
1919 [Oconst] ".const", "", evalconst,
1920 [Onamec] ".name", "", evalnamec,
1921 [Oenv] ".env", "", evalenv,
1923 [Oname] "Name", "N*", evalname,
1924 [Oscope] "Scope", "{n}", evalscope,
1925 [Oalias] "Alias", "nN", evalalias,
1927 [Odev] "Device", "{N}", evalscope,
1928 [Ocpu] "Processor", "{N141}", evalscope,
1929 [Othz] "ThermalZone", "{N}", evalscope,
1930 [Oprc] "PowerResource", "{N12}", evalscope,
1932 [Oreg] "OperationRegion", "N1ii", evalreg,
1933 [Ofld] "Field", "{n1", evalfield,
1934 [Oxfld] "IndexField", "{nn1", evalfield,
1935 [Obfld] "BankField", "{nni1", evalfield,
1937 [Ocfld] "CreateField", "*iiN", evalcfield,
1938 [Ocfld0] "CreateBitField", "*iN", evalcfield,
1939 [Ocfld1] "CreateByteField", "*iN", evalcfield,
1940 [Ocfld2] "CreateWordField", "*iN", evalcfield,
1941 [Ocfld4] "CreateDWordField", "*iN", evalcfield,
1942 [Ocfld8] "CreateQWordField", "*iN", evalcfield,
1944 [Opkg] "Package", "{1}", evalpkg,
1945 [Ovpkg] "VarPackage", "{i}", evalpkg,
1946 [Obuf] "Buffer", "{i", evalbuf,
1947 [Omet] "Method", "{N1", evalmet,
1949 [Oadd] "Add", "ii@", evalarith,
1950 [Osub] "Subtract", "ii@", evalarith,
1951 [Omod] "Mod", "ii@", evalarith,
1952 [Omul] "Multiply", "ii@", evalarith,
1953 [Odiv] "Divide", "ii@@", evalarith,
1954 [Oshl] "ShiftLef", "ii@", evalarith,
1955 [Oshr] "ShiftRight", "ii@", evalarith,
1956 [Oand] "And", "ii@", evalarith,
1957 [Onand] "Nand", "ii@", evalarith,
1958 [Oor] "Or", "ii@", evalarith,
1959 [Onor] "Nor", "ii@", evalarith,
1960 [Oxor] "Xor", "ii@", evalarith,
1961 [Onot] "Not", "i@", evalarith,
1963 [Olbit] "FindSetLeftBit", "i@", evalarith,
1964 [Orbit] "FindSetRightBit", "i@", evalarith,
1966 [Oinc] "Increment", "@", evalarith,
1967 [Odec] "Decrement", "@", evalarith,
1969 [Oland] "LAnd", "ii", evalarith,
1970 [Olor] "LOr", "ii", evalarith,
1971 [Olnot] "LNot", "i", evalarith,
1973 [Oleq] "LEqual", "**", evalcmp,
1974 [Olgt] "LGreater", "**", evalcmp,
1975 [Ollt] "LLess", "**", evalcmp,
1977 [Omutex] "Mutex", "N1", evalnop,
1978 [Oevent] "Event", "N", evalnop,
1980 [Oif] "If", "{i}", evalcond,
1981 [Oelse] "Else", "{}", evalcond,
1982 [Owhile] "While", "{,i}", evalcond,
1983 [Obreak] "Break", "", evalret,
1984 [Oret] "Return", "*", evalret,
1985 [Ocall] "Call", "", evalcall,
1987 [Ostore] "Store", "*@", evalstore,
1988 [Oindex] "Index", "@i@", evalindex,
1989 [Omatch] "Match", "*1*1*i", evalmatch,
1990 [Osize] "SizeOf", "*", evalsize,
1991 [Oref] "RefOf", "@", evaliarg0,
1992 [Ocref] "CondRefOf", "@@", evalcondref,
1993 [Oderef] "DerefOf", "@", evalderef,
1994 [Ocat] "Concatenate", "**@", evalcat,
1996 [Oacq] "Acquire", "@2", evalnop,
1997 [Orel] "Release", "@", evalnop,
1998 [Ostall] "Stall", "i", evalstall,
1999 [Osleep] "Sleep", "i", evalsleep,
2000 [Oload] "Load", "*@}", evalload,
2001 [Ounload] "Unload", "@", evalnop,
2003 [Otoint] "ToInteger", "*@", evalconv,
2006 static uchar octab1[] = {
2007 /* 00 */ Oconst, Oconst, Obad, Obad, Obad, Obad, Oalias, Obad,
2008 /* 08 */ Oname, Obad, Obyte, Oword, Odword, Ostr, Oqword, Obad,
2009 /* 10 */ Oscope, Obuf, Opkg, Ovpkg, Omet, Obad, Obad, Obad,
2010 /* 18 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2011 /* 20 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2012 /* 28 */ Obad, Obad, Obad, Obad, Obad, Obad, Onamec, Onamec,
2013 /* 30 */ Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec,
2014 /* 38 */ Onamec, Onamec, Obad, Obad, Obad, Obad, Obad, Obad,
2015 /* 40 */ Obad, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec,
2016 /* 48 */ Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec,
2017 /* 50 */ Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec, Onamec,
2018 /* 58 */ Onamec, Onamec, Onamec, Obad, Onamec, Obad, Onamec, Onamec,
2019 /* 60 */ Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Oenv,
2020 /* 68 */ Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Oenv, Obad,
2021 /* 70 */ Ostore, Oref, Oadd, Ocat, Osub, Oinc, Odec, Omul,
2022 /* 78 */ Odiv, Oshl, Oshr, Oand, Onand, Oor, Onor, Oxor,
2023 /* 80 */ Onot, Olbit, Orbit, Oderef, Obad, Omod, Obad, Osize,
2024 /* 88 */ Oindex, Omatch, Ocfld4, Ocfld2, Ocfld1, Ocfld0, Obad, Ocfld8,
2025 /* 90 */ Oland, Olor, Olnot, Oleq, Olgt, Ollt, Obad, Obad,
2026 /* 98 */ Obad, Otoint, Obad, Obad, Obad, Obad, Obad, Obad,
2027 /* A0 */ Oif, Oelse, Owhile, Onop, Oret, Obreak, Obad, Obad,
2028 /* A8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2029 /* B0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2030 /* B8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2031 /* C0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2032 /* C8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2033 /* D0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2034 /* D8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2035 /* E0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2036 /* E8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2037 /* F0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2038 /* F8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Oconst,
2041 static uchar octab2[] = {
2042 /* 00 */ Obad, Omutex, Oevent, Obad, Obad, Obad, Obad, Obad,
2043 /* 08 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2044 /* 10 */ Obad, Obad, Ocref, Ocfld, Obad, Obad, Obad, Obad,
2045 /* 18 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2046 /* 20 */ Oload, Ostall, Osleep, Oacq, Obad, Obad, Obad, Orel,
2047 /* 28 */ Obad, Obad, Ounload,Obad, Obad, Obad, Obad, Obad,
2048 /* 30 */ Obad, Odebug, Obad, Obad, Obad, Obad, Obad, Obad,
2049 /* 38 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2050 /* 40 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2051 /* 48 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2052 /* 50 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2053 /* 58 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2054 /* 60 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2055 /* 68 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2056 /* 70 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2057 /* 78 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2058 /* 80 */ Oreg, Ofld, Odev, Ocpu, Oprc, Othz, Oxfld, Obfld,
2059 /* 88 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2060 /* 90 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2061 /* 98 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2062 /* A0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2063 /* A8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2064 /* B0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2065 /* B8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2066 /* C0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2067 /* C8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2068 /* D0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2069 /* D8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2070 /* E0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2071 /* E8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2072 /* F0 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2073 /* F8 */ Obad, Obad, Obad, Obad, Obad, Obad, Obad, Obad,
2079 return p ? TAG(p) : 0;
2100 p = *((Ref*)p)->ptr;
2104 return strlen((char*)p);
2106 return SIZE(p)/sizeof(void*);
2115 amlnew(char tag, int len)
2122 return mk(tag, len + 1);
2124 return mk(tag, len * sizeof(void*));
2126 return mk(tag, len);
2133 static char *w[] = {
2142 s = FP->env->arg[0];
2143 if(s == nil || TAG(s) != 's')
2145 for(i = 0; i < nelem(w); i++)
2146 if(strcmp(s, w[i]) == 0)
2147 return mki(0xFFFFFFFF);
2156 fmtinstall('V', Vfmt);
2157 fmtinstall('N', Nfmt);
2162 n = mk('N', sizeof(Name));
2167 getname(amlroot, "_GPE", 1);
2168 getname(amlroot, "_PR", 1);
2169 getname(amlroot, "_SB", 1);
2170 getname(amlroot, "_TZ", 1);
2171 getname(amlroot, "_SI", 1);
2172 getname(amlroot, "_GL", 1);
2174 if(n = getname(amlroot, "_REV", 1))
2176 if(n = getname(amlroot, "_OS", 1))
2177 n->v = mks("Microsoft Windows");
2178 if(n = getname(amlroot, "_OSI", 1)){
2181 m = mk('m', sizeof(Method));
2198 amlload(uchar *data, int len)
2202 ret = xec(data, data+len, amlroot, nil, nil);
2203 amlenum(amlroot, nil, fixnames, nil);
2208 amlwalk(void *dot, char *name)
2210 return getname(dot, name, 0);
2214 amlenum(void *dot, char *seg, int (*proc)(void *, void *), void *arg)
2220 if(d == nil || TAG(d) != 'N')
2224 if(seg == nil || memcmp(seg, d->seg, sizeof(d->seg)) == 0)
2225 rec = (*proc)(d, arg) == 0;
2226 for(n = d->down; n && rec; n = n->next)
2227 amlenum(n, seg, proc, arg);
2233 amleval(void *dot, char *fmt, ...)
2242 e = mk('E', sizeof(Env));
2243 for(i=0;*fmt;fmt++){
2248 e->arg[i++] = mks(va_arg(a, char*));
2251 e->arg[i++] = mki(va_arg(a, int));
2254 e->arg[i++] = mki(va_arg(a, uvlong));
2259 e->arg[i++] = va_arg(a, void*);
2263 r = va_arg(a, void**);
2265 if(dot = deref(dot))
2266 if(TAG(dot) == 'm'){
2271 return xec(m->start, m->end, forkname(m->name), e, r);
2277 FP->ref = FP->aux = nil;