ref: 72af9ac6db08637d4f431359df9b08e25fead5f2
parent: 174f60f46ce5e07302ac6f9ae6a99768b800ed9a
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Jun 18 17:49:19 EDT 2013
libaml: pikeshedd style, handle division by zero (thanks erik)
--- a/sys/src/libaml/aml.c
+++ b/sys/src/libaml/aml.c
@@ -47,7 +47,8 @@
"Smbus",
"Cmos",
"Pcibar",
- "Ipmi" };
+ "Ipmi",
+};
/* field flags */
enum {@@ -175,7 +176,8 @@
static uchar octab2[];
static Name*
-rootname(Name *dot){+rootname(Name *dot)
+{while(dot != dot->up)
dot = dot->up;
return dot;
@@ -182,8 +184,14 @@
}
static void
-gcmark(void *p){+gcmark(void *p)
+{+ int i;
+ Env *e;
+ Field *f;
Heap *h;
+ Name *n, *d;
+ Package *a;
if(p == nil)
return;
@@ -193,35 +201,29 @@
h->mark = 1;
switch(h->tag){case 'E':
- {- int i;
- Env *e = p;
- for(i=0; i<nelem(e->loc); i++)
- gcmark(e->loc[i]);
- for(i=0; i<nelem(e->arg); i++)
- gcmark(e->arg[i]);
- }
+ e = p;
+ for(i=0; i<nelem(e->loc); i++)
+ gcmark(e->loc[i]);
+ for(i=0; i<nelem(e->arg); i++)
+ gcmark(e->arg[i]);
break;
- case 'R': case 'A': case 'L':
+ case 'R':
+ case 'A':
+ case 'L':
gcmark(((Ref*)p)->ref);
break;
case 'N':
- {- Name *d, *n = p;
- gcmark(n->v);
- for(d = n->down; d; d = d->next)
- gcmark(d);
- gcmark(n->fork);
- gcmark(n->up);
- }
+ n = p;
+ gcmark(n->v);
+ for(d = n->down; d; d = d->next)
+ gcmark(d);
+ gcmark(n->fork);
+ gcmark(n->up);
break;
case 'p':
- {- int i;
- Package *a = p;
- for(i=0; i<a->n; i++)
- gcmark(a->a[i]);
- }
+ a = p;
+ for(i=0; i<a->n; i++)
+ gcmark(a->a[i]);
break;
case 'r':
gcmark(((Region*)p)->name);
@@ -231,21 +233,20 @@
break;
case 'f':
case 'u':
- {- Field *f = p;
- gcmark(f->reg);
- gcmark(f->index);
- gcmark(f->indexv);
- }
+ f = p;
+ gcmark(f->reg);
+ gcmark(f->index);
+ gcmark(f->indexv);
break;
}
}
static int
-gc(void){+gc(void)
+{+ int i;
Heap *h, **hh;
Frame *f;
- int i;
for(h = hp; h; h = h->link)
h->mark = 0;
@@ -277,7 +278,8 @@
}
static void*
-mk(int tag, int size){+mk(int tag, int size)
+{Heap *h;
int a;
@@ -291,14 +293,18 @@
}
static uvlong*
-mki(uvlong i){- uvlong *v = mk('i', sizeof(uvlong));+mki(uvlong i)
+{+ uvlong *v;
+
+ v = mk('i', sizeof(uvlong));*v = i;
return v;
}
static char*
-mks(char *s){+mks(char *s)
+{ char *r = mk('s', strlen(s)+1);strcpy(r, s);
return r;
@@ -305,7 +311,8 @@
}
static int
-pkglen(uchar *p, uchar *e, uchar **np){+pkglen(uchar *p, uchar *e, uchar **np)
+{ulong n;
uchar b;
@@ -336,7 +343,8 @@
}
static Name*
-forkname(Name *dot){+forkname(Name *dot)
+{Name *n;
n = mk('N', sizeof(Name));@@ -355,7 +363,8 @@
}
static Name*
-getseg(Name *dot, void *seg, int new){+getseg(Name *dot, void *seg, int new)
+{Name *n, *l;
for(n = l = nil; dot; dot = dot->fork){@@ -425,12 +434,15 @@
}
static uvlong
-ival(void *p){- if(p) switch(TAG(p)){- case 'i':
- return *((uvlong*)p);
- case 's':
- return strtoull((char*)p, 0, 0);
+ival(void *p)
+{+ if(p != nil){+ switch(TAG(p)){+ case 'i':
+ return *((uvlong*)p);
+ case 's':
+ return strtoull((char*)p, 0, 0);
+ }
}
return 0;
}
@@ -495,7 +507,8 @@
}
static void*
-rwfield(Field *f, void *v, int write){+rwfield(Field *f, void *v, int write)
+{int boff, blen, wo, ws, wl, wa, wd, i;
uvlong w, m;
void *reg;
@@ -552,6 +565,7 @@
return nil;
if(blen > 64)
return b;
+
w = 0;
for(i=0; i<SIZE(b); i++)
w |= ((uvlong)b[i]) << i*8;
@@ -559,7 +573,8 @@
}
static void*
-deref(void *p){+deref(void *p)
+{ if(p) switch(TAG(p)){case 'N':
return ((Name*)p)->v;
@@ -572,9 +587,11 @@
}
static void*
-copy(int tag, void *s){+copy(int tag, void *s)
+{void *d;
- if(s){+
+ if(s != nil){int n;
if(tag == 0)
tag = TAG(s);
@@ -597,7 +614,8 @@
}
static void*
-store(void *s, void *d){+store(void *s, void *d)
+{void *p, **pp;
if(d == nil)
@@ -641,10 +659,11 @@
}
static int
-Nfmt(Fmt *f){+Nfmt(Fmt *f)
+{char buf[5];
- Name *n;
int i;
+ Name *n;
n = va_arg(f->args, Name*);
if(n == nil)
@@ -664,9 +683,17 @@
}
static int
-Vfmt(Fmt *f){+Vfmt(Fmt *f)
+{void *p;
- int c;
+ int i, n, c;
+ Env *e;
+ Field *l;
+ Name *nm;
+ Method *m;
+ Package *a;
+ Region *g;
+ Ref *r;
p = va_arg(f->args, void*);
if(p == nil)
@@ -674,83 +701,66 @@
c = TAG(p);
switch(c){case 'N':
- {- Name *n = p;
-
- if(n->v != n)
- return fmtprint(f, "%N=%V", n, n->v);
- return fmtprint(f, "%N=*", n);
- }
- case 'A': case 'L':
- {- Ref *r = p;
- Env *e = r->ref;
- if(c == 'A')
- return fmtprint(f, "Arg%ld=%V", r->ptr - e->arg, *r->ptr);
- if(c == 'L')
- return fmtprint(f, "Local%ld=%V", r->ptr - e->loc, *r->ptr);
- }
+ nm = p;
+ if(nm->v != nm)
+ return fmtprint(f, "%N=%V", nm, nm->v);
+ return fmtprint(f, "%N=*", nm);
+ case 'A':
+ case 'L':
+ r = p;
+ e = r->ref;
+ if(c == 'A')
+ return fmtprint(f, "Arg%ld=%V", r->ptr - e->arg, *r->ptr);
+ if(c == 'L')
+ return fmtprint(f, "Local%ld=%V", r->ptr - e->loc, *r->ptr);
case 's':
return fmtprint(f, "\"%s\"", (char*)p);
case 'i':
- return fmtprint(f, "0x%llux", *((uvlong*)p));
+ return fmtprint(f, "%#llux", *((uvlong*)p));
case 'p':
- {- int i;
- Package *a = p;
- fmtprint(f, "Package(%d){", a->n);- for(i=0; i<a->n; i++){- if(i > 0)
- fmtprint(f, ", ");
- fmtprint(f, "%V", a->a[i]);
- }
- fmtprint(f, "}");
+ a = p;
+ fmtprint(f, "Package(%d){", a->n);+ for(i=0; i<a->n; i++){+ if(i > 0)
+ fmtprint(f, ", ");
+ fmtprint(f, "%V", a->a[i]);
}
+ fmtprint(f, "}");
return 0;
case 'b':
- {- int i, n;
- n = SIZE(p);
- fmtprint(f, "Buffer(%d){", n);- for(i=0; i<n; i++){- if(i > 0)
- fmtprint(f, ", ");
- fmtprint(f, "%.2uX", ((uchar*)p)[i]);
- }
- fmtprint(f, "}");
+ n = SIZE(p);
+ fmtprint(f, "Buffer(%d){", n);+ for(i=0; i<n; i++){+ if(i > 0)
+ fmtprint(f, ", ");
+ fmtprint(f, "%.2uX", ((uchar*)p)[i]);
}
+ fmtprint(f, "}");
return 0;
case 'r':
- {- Region *r = p;
- return fmtprint(f, "Region(%s, 0x%llux, 0x%llux)",
- spacename[r->space & 7], r->off, r->len);
- }
+ g = p;
+ return fmtprint(f, "Region(%s, %#llux, %#llux)",
+ spacename[g->space & 7], g->off, g->len);
case 'm':
- {- int i;
- Method *m = p;
- fmtprint(f, "%N(", m->name);- for(i=0; i < m->narg; i++){- if(i > 0)
- fmtprint(f, ", ");
- fmtprint(f, "Arg%d", i);
- }
- fmtprint(f, ")");
- return 0;
+ m = p;
+ fmtprint(f, "%N(", m->name);+ for(i=0; i < m->narg; i++){+ if(i > 0)
+ fmtprint(f, ", ");
+ fmtprint(f, "Arg%d", i);
}
+ fmtprint(f, ")");
+ return 0;
case 'u':
fmtprint(f, "Buffer");
/* no break */
case 'f':
- {- Field *l = p;
- if(l->index)
- return fmtprint(f, "IndexField(%x, %x, %x) @ %V[%V]",
- l->flags, l->bitoff, l->bitlen, l->index, l->indexv);
- return fmtprint(f, "Field(%x, %x, %x) @ %V",
- l->flags, l->bitoff, l->bitlen, l->reg);
- }
+ l = p;
+ if(l->index)
+ return fmtprint(f, "IndexField(%x, %x, %x) @ %V[%V]",
+ l->flags, l->bitoff, l->bitlen, l->index, l->indexv);
+ return fmtprint(f, "Field(%x, %x, %x) @ %V",
+ l->flags, l->bitoff, l->bitlen, l->reg);
default:
return fmtprint(f, "%c:%p", c, p);
}
@@ -757,7 +767,8 @@
}
static void
-dumpregs(void){+dumpregs(void)
+{Frame *f;
Env *e;
int i;
@@ -789,7 +800,8 @@
}
static int
-xec(uchar *pc, uchar *end, Name *dot, Env *env, void **pret){+xec(uchar *pc, uchar *end, Name *dot, Env *env, void **pret)
+{static int loop;
int i, c;
void *r;
@@ -820,12 +832,12 @@
default:
if(PC >= FP->end){Overrun:
- print("PC overrun frame end");+ print("aml: PC overrun frame end");goto Out;
}
FP++;
if(FP >= FT){- print("frame stack overflow");+ print("aml: frame stack overflow");goto Out;
}
*FP = FP[-1];
@@ -870,7 +882,10 @@
((uchar*)r)[c] = 0;
PC = end;
break;
- case '1': case '2': case '4': case '8':
+ case '1':
+ case '2':
+ case '4':
+ case '8':
end = PC+(c-'0');
if(end > FP->end)
goto Overrun;
@@ -950,7 +965,8 @@
}
static void*
-evalnamec(void){+evalnamec(void)
+{int s, c, new;
Name *x, *dot;
@@ -998,12 +1014,14 @@
}
static void*
-evaliarg0(){+evaliarg0(void)
+{return FP->arg[0];
}
static void*
-evalconst(void){+evalconst(void)
+{ switch(FP->start[0]){case 0x01:
return mki(1);
@@ -1014,7 +1032,8 @@
}
static void*
-evalbuf(void){+evalbuf(void)
+{int n, m;
uchar *p;
@@ -1029,12 +1048,13 @@
}
static void*
-evalpkg(void){+evalpkg(void)
+{Package *p;
void **x;
int n;
- if(p = FP->ref){+ if((p = FP->ref) != nil){x = FP->aux;
if(x >= &p->a[0] && x < &p->a[p->n]){*x++ = FP->arg[0];
@@ -1052,7 +1072,8 @@
}
static void*
-evalname(void){+evalname(void)
+{Name *n;
if(n = FP->arg[0])
@@ -1063,7 +1084,8 @@
}
static void*
-evalscope(void){+evalscope(void)
+{Name *n;
if(n = FP->arg[0])
@@ -1075,7 +1097,8 @@
}
static void*
-evalalias(void){+evalalias(void)
+{Name *n;
if(n = FP->arg[1])
@@ -1084,10 +1107,12 @@
}
static void*
-evalmet(void){+evalmet(void)
+{Name *n;
+ Method *m;
+
if(n = FP->arg[0]){- Method *m;
m = mk('m', sizeof(Method));m->narg = ival(FP->arg[1]) & 7;
m->start = PC;
@@ -1100,10 +1125,12 @@
}
static void*
-evalreg(void){+evalreg(void)
+{Name *n;
+ Region *r;
+
if(n = FP->arg[0]){- Region *r;
r = mk('r', sizeof(Region));r->space = ival(FP->arg[1]);
r->off = ival(FP->arg[2]);
@@ -1115,7 +1142,8 @@
}
static void*
-evalcfield(void){+evalcfield(void)
+{void *r;
Field *f;
Name *n;
@@ -1158,7 +1186,8 @@
}
static void*
-evalfield(void){+evalfield(void)
+{int flags, bitoff, wa, n;
Field *f, *df;
Name *d;
@@ -1226,15 +1255,17 @@
}
static void*
-evalnop(void){+evalnop(void)
+{return nil;
}
static void*
-evalbad(void){+evalbad(void)
+{int i;
- print("bad opcode %p: ", PC);+ print("aml: bad opcode %p: ", PC); for(i=0; i < 8 && (FP->start+i) < FP->end; i++){if(i > 0)
print(" ");@@ -1248,7 +1279,8 @@
}
static void*
-evalcond(void){+evalcond(void)
+{ switch(FP->op - optab){case Oif:
if(FP <= FB)
@@ -1283,7 +1315,8 @@
}
static void*
-evalcmp(void){+evalcmp(void)
+{void *a, *b;
int c;
@@ -1327,7 +1360,8 @@
}
static void*
-evalcall(void){+evalcall(void)
+{Method *m;
Env *e;
int i;
@@ -1360,7 +1394,8 @@
}
static void*
-evalret(void){+evalret(void)
+{void *r = FP->arg[0];
int brk = (FP->op - optab) != Oret;
while(--FP >= FB){@@ -1381,7 +1416,8 @@
}
static void*
-evalenv(void){+evalenv(void)
+{Ref *r;
Env *e;
int c;
@@ -1402,12 +1438,14 @@
}
static void*
-evalstore(void){+evalstore(void)
+{return store(FP->arg[0], FP->arg[1]);
}
static void*
-evalindex(void){+evalindex(void)
+{Field *f;
void *p;
Ref *r;
@@ -1441,7 +1479,8 @@
}
static void*
-evalcondref(void){+evalcondref(void)
+{void *s;
if((s = FP->arg[0]) == nil)
return nil;
@@ -1450,12 +1489,14 @@
}
static void*
-evalsize(void){+evalsize(void)
+{return mki(amllen(FP->arg[0]));
}
static void*
-evalderef(void){+evalderef(void)
+{void *p;
if(p = FP->arg[0]){@@ -1467,8 +1508,12 @@
}
static void*
-evalarith(void){- void *r = nil;
+evalarith(void)
+{+ uvlong v, d;
+ void *r;
+
+ r = nil;
switch(FP->op - optab){case Oadd:
r = mki(ival(FP->arg[0]) + ival(FP->arg[1]));
@@ -1476,27 +1521,24 @@
case Osub:
r = mki(ival(FP->arg[0]) - ival(FP->arg[1]));
break;
- case Omod:
- {- uvlong d;
- d = ival(FP->arg[1]);
- r = mki(ival(FP->arg[0]) % d);
- }
- break;
case Omul:
r = mki(ival(FP->arg[0]) * ival(FP->arg[1]));
break;
+ case Omod:
case Odiv:
- {- uvlong v, d;
- v = ival(FP->arg[0]);
- d = ival(FP->arg[1]);
- r = mki(v / d);
- if(FP->arg[2])
- store(mki(v % d), FP->arg[2]);
- store(r, FP->arg[3]);
- return r;
+ v = ival(FP->arg[0]);
+ d = ival(FP->arg[1]);
+ if(d == 0){+ print("aml: division by zero: PC=%#p\n", PC);+ return nil;
}
+ r = mki(v % d);
+ store(r, FP->arg[2]);
+ if((FP->op - optab) != Odiv)
+ return r;
+ r = mki(v / d);
+ store(r, FP->arg[3]);
+ return r;
case Oshl:
r = mki(ival(FP->arg[0]) << ival(FP->arg[1]));
break;
@@ -1701,12 +1743,14 @@
};
int
-amltag(void *p){+amltag(void *p)
+{return p ? TAG(p) : 0;
}
void*
-amlval(void *p){+amlval(void *p)
+{p = deref(p);
if(p && TAG(p) == 'p')
p = ((Package*)p)->a;
@@ -1714,12 +1758,14 @@
}
uvlong
-amlint(void *p){+amlint(void *p)
+{return ival(p);
}
int
-amllen(void *p){+amllen(void *p)
+{ while(p){ switch(TAG(p)){case 'R':
@@ -1737,7 +1783,8 @@
}
void
-amlinit(void){+amlinit(void)
+{Name *n;
fmtinstall('V', Vfmt);@@ -1771,7 +1818,8 @@
}
void
-amlexit(void){+amlexit(void)
+{amlroot = nil;
FP = FB-1;
gc();
@@ -1778,17 +1826,20 @@
}
int
-amlload(uchar *data, int len){+amlload(uchar *data, int len)
+{return xec(data, data+len, amlroot, nil, nil);
}
void*
-amlwalk(void *dot, char *name){+amlwalk(void *dot, char *name)
+{return getname(dot, name, 0);
}
void
-amlenum(void *dot, char *seg, int (*proc)(void *, void *), void *arg){+amlenum(void *dot, char *seg, int (*proc)(void *, void *), void *arg)
+{Name *n, *d;
int rec;
@@ -1806,7 +1857,8 @@
}
int
-amleval(void *dot, char *fmt, ...){+amleval(void *dot, char *fmt, ...)
+{va_list a;
Method *m;
void **r;
@@ -1830,13 +1882,14 @@
}
r = va_arg(a, void**);
va_end(a);
- if(dot = deref(dot)) switch(TAG(dot)){- case 'm':
+ if(dot = deref(dot))
+ if(TAG(dot) == 'm'){m = dot;
if(i != m->narg)
return -1;
return xec(m->start, m->end, forkname(m->name), e, r);
}
- if(r) *r = dot;
+ if(r != nil)
+ *r = dot;
return 0;
}
--
⑨