diff options
-rw-r--r-- | sys/dev/acpi/dsdt.c | 400 |
1 files changed, 163 insertions, 237 deletions
diff --git a/sys/dev/acpi/dsdt.c b/sys/dev/acpi/dsdt.c index f700c8d5451..c0909b6f307 100644 --- a/sys/dev/acpi/dsdt.c +++ b/sys/dev/acpi/dsdt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsdt.c,v 1.138 2009/03/05 04:59:58 jordan Exp $ */ +/* $OpenBSD: dsdt.c,v 1.139 2009/03/07 07:04:38 jordan Exp $ */ /* * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org> * @@ -905,7 +905,7 @@ _aml_setvalue(struct aml_value *lhs, int type, int64_t ival, const void *bval) lhs->v_nameref = (uint8_t *)bval; break; case AML_OBJTYPE_OBJREF: - lhs->v_objref.index = ival; + lhs->v_objref.type = ival; lhs->v_objref.ref = (struct aml_value *)bval; break; case AML_OBJTYPE_BUFFER: @@ -1406,25 +1406,6 @@ aml_getpciaddr(struct acpi_softc *sc, struct aml_node *root) return pciaddr; } -/* Fixup references for BufferFields/FieldUnits */ -#if 0 -void aml_fixref(struct aml_value **); - -void -aml_fixref(struct aml_value **res) -{ - struct aml_value *oldres; - - while (*res && (*res)->type == AML_OBJTYPE_OBJREF && - (*res)->v_objref.index == -1) { - oldres = (*res)->v_objref.ref; - aml_delref(res); - aml_addref(oldres); - *res = oldres; - } -} -#endif - /* * @@@: Opcode functions */ @@ -1449,49 +1430,6 @@ aml_eisaid(u_int32_t pid) return id; } -#if 0 -/* - * @@@: Fixup DSDT code - */ -struct aml_fixup { - int offset; - u_int8_t oldv, newv; -} __ibm300gl[] = { - { 0x19, 0x3a, 0x3b }, - { -1 } -}; - -struct aml_blacklist { - const char *oem, *oemtbl; - struct aml_fixup *fixtab; - u_int8_t cksum; -} amlfix_list[] = { - { "IBM ", "CDTPWSNH", __ibm300gl, 0x41 }, - { NULL }, -}; - -void -aml_fixup_dsdt(u_int8_t *acpi_hdr, u_int8_t *base, int len) -{ - struct acpi_table_header *hdr = (struct acpi_table_header *)acpi_hdr; - struct aml_blacklist *fixlist; - struct aml_fixup *fixtab; - - for (fixlist = amlfix_list; fixlist->oem; fixlist++) { - if (!memcmp(fixlist->oem, hdr->oemid, 6) && - !memcmp(fixlist->oemtbl, hdr->oemtableid, 8) && - fixlist->cksum == hdr->checksum) { - /* Found a potential fixup entry */ - for (fixtab = fixlist->fixtab; fixtab->offset != -1; - fixtab++) { - if (base[fixtab->offset] == fixtab->oldv) - base[fixtab->offset] = fixtab->newv; - } - } - } -} -#endif - /* * @@@: Default Object creation */ @@ -1685,27 +1623,6 @@ aml_foreachpkg(struct aml_value *pkg, int start, fn(pkg->v_package[idx], arg); } -#if 0 -int -acpi_parse_aml(struct acpi_softc *sc, u_int8_t *start, u_int32_t length) -{ - u_int8_t *end; - - dsdt_softc = sc; - - strlcpy(aml_root.name, "\\", sizeof(aml_root.name)); - if (aml_root.start == NULL) { - aml_root.start = start; - aml_root.end = start+length; - } - end = start+length; - aml_parsenode(NULL, &aml_root, start, &end, NULL); - dnprintf(50, " : parsed %d AML bytes\n", length); - - return (0); -} -#endif - /* * Walk nodes and perform fixups for nameref */ @@ -1723,7 +1640,7 @@ int aml_fixup_node(struct aml_node *node, void *arg) else if (val->type == AML_OBJTYPE_NAMEREF) { node = aml_searchname(node, val->v_nameref); if (node && node->value) { - _aml_setvalue(val, AML_OBJTYPE_OBJREF, -1, + _aml_setvalue(val, AML_OBJTYPE_OBJREF, AMLOP_NAMECHAR, node->value); } } else if (val->type == AML_OBJTYPE_PACKAGE) { @@ -1781,6 +1698,7 @@ aml_val_to_string(const struct aml_value *val) /* * XXX: NEW PARSER CODE GOES HERE */ +struct aml_value *aml_gettgt(struct aml_value *, int); struct aml_value *aml_xeval(struct aml_scope *, struct aml_value *, int, int, struct aml_value *); struct aml_value *aml_xparsesimple(struct aml_scope *, char, @@ -1793,18 +1711,16 @@ struct aml_scope *aml_xpushscope(struct aml_scope *, struct aml_value *, struct aml_scope *aml_xpopscope(struct aml_scope *); void aml_showstack(struct aml_scope *); -void aml_xconvert(struct aml_value *, struct aml_value **, int, int); +struct aml_value *aml_xconvert(struct aml_value *, int, int); int aml_xmatchtest(int64_t, int64_t, int); int aml_xmatch(struct aml_value *, int, int, int, int, int); int aml_xcompare(struct aml_value *, struct aml_value *, int); -void aml_xconcat(struct aml_value *, struct aml_value *, - struct aml_value **); -void aml_xconcatres(struct aml_value *, struct aml_value *, - struct aml_value **); +struct aml_value *aml_xconcat(struct aml_value *, struct aml_value *); +struct aml_value *aml_xconcatres(struct aml_value *, struct aml_value *); +struct aml_value *aml_xmid(struct aml_value *, int, int); int aml_ccrlen(union acpi_resource *, void *); -void aml_xmid(struct aml_value *, int, int, struct aml_value **); void aml_xstore(struct aml_scope *, struct aml_value *, int64_t, struct aml_value *); @@ -2044,7 +1960,7 @@ aml_xmatch(struct aml_value *pkg, int index, while (index < pkg->length) { /* Convert package value to integer */ - aml_xconvert(pkg->v_package[index], &tmp, + tmp = aml_xconvert(pkg->v_package[index], AML_OBJTYPE_INTEGER, 0); /* Perform test */ @@ -2179,16 +2095,15 @@ aml_hextoint(const char *str) } -void -aml_xconvert(struct aml_value *a, struct aml_value **b, int ctype, int mode) +struct aml_value * +aml_xconvert(struct aml_value *a, int ctype, int mode) { struct aml_value *c = NULL; /* Object is already this type */ if (a->type == ctype) { aml_xaddref(a, "XConvert"); - *b = a; - return; + return a; } switch (ctype) { case AML_OBJTYPE_BUFFER: @@ -2242,7 +2157,7 @@ aml_xconvert(struct aml_value *a, struct aml_value **b, int ctype, int mode) #endif aml_die("Could not convert!!!\n"); } - *b = c; + return c; } int @@ -2251,7 +2166,7 @@ aml_xcompare(struct aml_value *a1, struct aml_value *a2, int opcode) int rc = 0; /* Convert A2 to type of A1 */ - aml_xconvert(a2, &a2, a1->type, 0); + a2 = aml_xconvert(a2, a1->type, 0); if (a1->type == AML_OBJTYPE_INTEGER) { rc = aml_evalexpr(a1->v_integer, a2->v_integer, opcode); } @@ -2272,13 +2187,13 @@ aml_xcompare(struct aml_value *a1, struct aml_value *a2, int opcode) } /* Concatenate two objects, returning pointer to new object */ -void -aml_xconcat(struct aml_value *a1, struct aml_value *a2, struct aml_value **res) +struct aml_value * +aml_xconcat(struct aml_value *a1, struct aml_value *a2) { struct aml_value *c; /* Convert arg2 to type of arg1 */ - aml_xconvert(a2, &a2, a1->type, 0); + a2 = aml_xconvert(a2, a1->type, 0); switch (a1->type) { case AML_OBJTYPE_INTEGER: c = aml_allocvalue(AML_OBJTYPE_BUFFER, @@ -2304,7 +2219,7 @@ aml_xconcat(struct aml_value *a1, struct aml_value *a2, struct aml_value **res) } /* Either deletes temp buffer, or decrease refcnt on original A2 */ aml_xdelref(&a2, "xconcat"); - *res = c; + return c; } /* Calculate length of Resource Template */ @@ -2318,11 +2233,12 @@ aml_ccrlen(union acpi_resource *rs, void *arg) } /* Concatenate resource templates, returning pointer to new object */ -void -aml_xconcatres(struct aml_value *a1, struct aml_value *a2, struct aml_value **res) +struct aml_value * +aml_xconcatres(struct aml_value *a1, struct aml_value *a2) { struct aml_value *c; - int l1 = 0, l2 = 0; + int l1 = 0, l2 = 0, l3 = 2; + uint8_t a3[] = { 0x79, 0x00 }; if (a1->type != AML_OBJTYPE_BUFFER || a2->type != AML_OBJTYPE_BUFFER) { aml_die("concatres: not buffers\n"); @@ -2333,28 +2249,23 @@ aml_xconcatres(struct aml_value *a1, struct aml_value *a2, struct aml_value **re aml_parse_resource(a2->length, a2->v_buffer, aml_ccrlen, &l2); /* Concatenate buffers, add end tag */ - c = aml_allocvalue(AML_OBJTYPE_BUFFER, l1+l2+2, NULL); + c = aml_allocvalue(AML_OBJTYPE_BUFFER, l1+l2+l3, NULL); memcpy(c->v_buffer, a1->v_buffer, l1); memcpy(c->v_buffer+l1, a2->v_buffer, l2); - c->v_buffer[l1+l2+0] = 0x79; - c->v_buffer[l1+l2+1] = 0x00; + memcpy(c->v_buffer+l1+l2, a3, l3); - *res = c; + return c; } /* Extract substring from string or buffer */ -void -aml_xmid(struct aml_value *src, int index, int length, struct aml_value **res) +struct aml_value * +aml_xmid(struct aml_value *src, int index, int length) { - int idx; - - for (idx=index; idx<index+length; idx++) { - if (idx >= src->length) - break; - if (src->v_buffer[idx] == 0) - break; - } - aml_die("mid\n"); + if (index > src->length) + index = 0; + if ((index + length) > src->length) + length = src->length - index; + return aml_allocvalue(src->type, length, src->v_buffer + index); } /* @@ -2510,7 +2421,7 @@ aml_rwgas(struct aml_value *rgn, int bpos, int blen, struct aml_value *val, int } else { /* Write to a large field.. create or convert buffer */ - aml_xconvert(val, &val, AML_OBJTYPE_BUFFER, 0); + val = aml_xconvert(val, AML_OBJTYPE_BUFFER, 0); } _aml_setvalue(&tmp, AML_OBJTYPE_BUFFER, slen, 0); tbit = tmp.v_buffer; @@ -2522,7 +2433,7 @@ aml_rwgas(struct aml_value *rgn, int bpos, int blen, struct aml_value *val, int } else { /* Write to a short field.. convert to integer */ - aml_xconvert(val, &val, AML_OBJTYPE_INTEGER, 0); + val = aml_xconvert(val, AML_OBJTYPE_INTEGER, 0); } if (mode == ACPI_IOREAD) { @@ -2585,7 +2496,7 @@ aml_rwfield(struct aml_value *fld, int bpos, int blen, struct aml_value *val, in } else { /* bufferfield:write */ - aml_xconvert(val, &val, AML_OBJTYPE_INTEGER, 0); + val = aml_xconvert(val, AML_OBJTYPE_INTEGER, 0); aml_bufcpy(ref1->v_buffer, fld->v_field.bitpos, &val->v_integer, 0, fld->v_field.bitlen); aml_xdelref(&val, "wrbuffld"); } @@ -2661,7 +2572,7 @@ aml_xcreatefield(struct aml_value *field, int opcode, { printf("WARN: %s not buffer\n", aml_nodename(data->node)); - aml_xconvert(data, &data, AML_OBJTYPE_BUFFER, 0); + data = aml_xconvert(data, AML_OBJTYPE_BUFFER, 0); } field->v_field.type = opcode; field->v_field.bitpos = bpos; @@ -2812,9 +2723,7 @@ aml_xstore(struct aml_scope *scope, struct aml_value *lhs , int64_t ival, if (lhs->stack >= AMLOP_LOCAL0 && lhs->stack <= AMLOP_LOCAL7) aml_freevalue(lhs); - while (lhs->type == AML_OBJTYPE_OBJREF) { - lhs = lhs->v_objref.ref; - } + lhs = aml_gettgt(lhs, AMLOP_STORE); switch (lhs->type) { case AML_OBJTYPE_UNINITIALIZED: aml_copyvalue(lhs, rhs); @@ -2826,13 +2735,13 @@ aml_xstore(struct aml_scope *scope, struct aml_value *lhs , int64_t ival, case AML_OBJTYPE_DEBUGOBJ: break; case AML_OBJTYPE_INTEGER: - aml_xconvert(rhs, &rhs, lhs->type, 0); + rhs = aml_xconvert(rhs, lhs->type, 0); lhs->v_integer = rhs->v_integer; aml_xdelref(&rhs, "store.int"); break; case AML_OBJTYPE_BUFFER: case AML_OBJTYPE_STRING: - aml_xconvert(rhs, &rhs, lhs->type, 0); + rhs = aml_xconvert(rhs, lhs->type, 0); if (lhs->length < rhs->length) { dnprintf(10,"Overrun! %d,%d\n", lhs->length, rhs->length); aml_freevalue(lhs); @@ -3254,8 +3163,7 @@ aml_xeval(struct aml_scope *scope, struct aml_value *my_ret, int ret_type, aml_copyvalue(sp, &argv[idx]); } else { - sp->type = AML_OBJTYPE_OBJREF; - sp->v_objref.type = AMLOP_ARG0 + idx; + _aml_setvalue(sp, AML_OBJTYPE_OBJREF, AMLOP_ARG0 + idx, 0); sp->v_objref.ref = aml_xparse(scope, 't', "ARGX"); } } @@ -3471,11 +3379,20 @@ aml_xparsesimple(struct aml_scope *scope, char ch, struct aml_value *rv) int maxdp; struct aml_value * +aml_gettgt(struct aml_value *val, int opcode) +{ + while (val && val->type == AML_OBJTYPE_OBJREF) { + val = val->v_objref.ref; + } + return val; +} + +struct aml_value * aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) { int opcode, idx, pc, optype[8]; struct aml_opcode *htab; - struct aml_value *opargs[8], *my_ret, *tmp, *cname; + struct aml_value *opargs[8], *my_ret, *rv; struct aml_scope *mscope, *iscope; const char *ch; int64_t ival; @@ -3505,12 +3422,10 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) dnprintf(18,"%.4x %s\n", pc, aml_mnem(opcode, scope->pos)); /* --== Stage 1: Process opcode arguments ==-- */ - cname = NULL; memset(opargs, 0, sizeof(opargs)); memset(optype, 0, sizeof(optype)); idx = 0; for (ch = htab->args; *ch; ch++) { - struct aml_value *rv; uint8_t *end; rv = NULL; @@ -3559,10 +3474,9 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) break; case AML_ARG_CREATENAME: rv = aml_xparsesimple(scope, *ch, NULL); - cname = rv; - if (cname->type != 0 && opcode != AMLOP_SCOPE) + if (rv->type != 0 && opcode != AMLOP_SCOPE) dnprintf(10, "%s value already exists %s\n", - aml_nodename(cname->node), + aml_nodename(rv->node), htab->mnem); break; case AML_ARG_SEARCHNAME: @@ -3668,26 +3582,26 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) for (idx=0; idx<my_ret->length; idx++) { const char *nn; - tmp = aml_xparse(mscope, 'o', "Package"); - if (tmp == NULL) { + rv = aml_xparse(mscope, 'o', "Package"); + if (rv == NULL) { continue; } nn = NULL; - if (tmp->node) + if (rv->node) /* Object is a named node: store as string */ - nn = aml_nodename(tmp->node); - else if (tmp->type == AML_OBJTYPE_NAMEREF) + nn = aml_nodename(rv->node); + else if (rv->type == AML_OBJTYPE_NAMEREF) /* Object is nameref: store as string */ - nn = aml_getname(tmp->v_nameref); + nn = aml_getname(rv->v_nameref); if (nn != NULL) { - aml_xdelref(&tmp, "pkg.node"); - tmp = aml_allocvalue(AML_OBJTYPE_STRING, + aml_xdelref(&rv, "pkg.node"); + rv = aml_allocvalue(AML_OBJTYPE_STRING, -1, nn); } /* Package value already allocated; delete it * and replace with pointer to return value */ aml_xdelref(&my_ret->v_package[idx], "pkg/init"); - my_ret->v_package[idx] = tmp; + my_ret->v_package[idx] = rv; } aml_xpopscope(mscope); mscope = NULL; @@ -3764,8 +3678,7 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) aml_freevalue(opargs[1]); /* Create Object Reference */ - _aml_setvalue(opargs[1], AML_OBJTYPE_OBJREF, 0, opargs[0]); - opargs[1]->v_objref.type = AMLOP_REFOF; + _aml_setvalue(opargs[1], AML_OBJTYPE_OBJREF, opcode, opargs[0]); aml_xaddref(opargs[1], "CondRef"); /* Mark that we found it */ @@ -3774,8 +3687,7 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) break; case AMLOP_REFOF: /* RefOf: r => ObjRef */ - my_ret = aml_allocvalue(AML_OBJTYPE_OBJREF, 0, opargs[0]); - my_ret->v_objref.type = AMLOP_REFOF; + my_ret = aml_allocvalue(AML_OBJTYPE_OBJREF, opcode, opargs[0]); aml_xaddref(my_ret->v_objref.ref, "RefOf"); break; case AMLOP_INDEX: @@ -3796,9 +3708,8 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) aml_xaddref(my_ret, "Index.Package"); } else { - my_ret = aml_allocvalue(AML_OBJTYPE_OBJREF, 0, + my_ret = aml_allocvalue(AML_OBJTYPE_OBJREF, AMLOP_PACKAGE, opargs[0]->v_package[idx]); - my_ret->v_objref.type = AMLOP_PACKAGE; aml_xaddref(my_ret->v_objref.ref, "Index.Package"); } @@ -3806,19 +3717,19 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) case AML_OBJTYPE_BUFFER: case AML_OBJTYPE_STRING: case AML_OBJTYPE_INTEGER: - aml_xconvert(opargs[0], &tmp, AML_OBJTYPE_BUFFER, 0); + rv = aml_xconvert(opargs[0], AML_OBJTYPE_BUFFER, 0); if (ret_type == 't' || ret_type == 'i' || ret_type == 'T') { dnprintf(12,"Index.Buf Term: %d = %x\n", - idx, tmp->v_buffer[idx]); - ival = tmp->v_buffer[idx]; + idx, rv->v_buffer[idx]); + ival = rv->v_buffer[idx]; } else { dnprintf(12, "Index.Buf Targ\n"); my_ret = aml_allocvalue(0,0,NULL); - aml_xcreatefield(my_ret, AMLOP_INDEX, tmp, + aml_xcreatefield(my_ret, AMLOP_INDEX, rv, 8 * idx, 8, NULL, 0, AML_FIELD_BYTEACC); } - aml_xdelref(&tmp, "Index.BufStr"); + aml_xdelref(&rv, "Index.BufStr"); break; default: aml_die("Unknown index : %x\n", opargs[0]->type); @@ -3852,43 +3763,43 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) /* Conversion */ case AMLOP_TOINTEGER: /* Source:CData, Result => Integer */ - aml_xconvert(opargs[0], &my_ret, AML_OBJTYPE_INTEGER, 0); + my_ret = aml_xconvert(opargs[0], AML_OBJTYPE_INTEGER, 0); aml_xstore(scope, opargs[1], 0, my_ret); break; case AMLOP_TOBUFFER: /* Source:CData, Result => Buffer */ - aml_xconvert(opargs[0], &my_ret, AML_OBJTYPE_BUFFER, 0); + my_ret = aml_xconvert(opargs[0], AML_OBJTYPE_BUFFER, 0); aml_xstore(scope, opargs[1], 0, my_ret); break; case AMLOP_TOHEXSTRING: /* Source:CData, Result => String */ - aml_xconvert(opargs[0], &my_ret, AML_OBJTYPE_STRING, 'x'); + my_ret = aml_xconvert(opargs[0], AML_OBJTYPE_STRING, 'x'); aml_xstore(scope, opargs[1], 0, my_ret); break; case AMLOP_TODECSTRING: /* Source:CData, Result => String */ - aml_xconvert(opargs[0], &my_ret, AML_OBJTYPE_STRING, 'd'); + my_ret = aml_xconvert(opargs[0], AML_OBJTYPE_STRING, 'd'); aml_xstore(scope, opargs[1], 0, my_ret); break; case AMLOP_TOSTRING: /* Source:B, Length:I, Result => String */ - aml_xconvert(opargs[0], &my_ret, AML_OBJTYPE_STRING, 0); + my_ret = aml_xconvert(opargs[0], AML_OBJTYPE_STRING, 0); aml_die("tostring\n"); break; case AMLOP_CONCAT: /* Source1:CData, Source2:CData, Result => CData */ - aml_xconcat(opargs[0], opargs[1], &my_ret); + my_ret = aml_xconcat(opargs[0], opargs[1]); aml_xstore(scope, opargs[2], 0, my_ret); break; case AMLOP_CONCATRES: /* Concat two resource buffers: buf1, buf2, result => Buffer */ - aml_xconcatres(opargs[0], opargs[1], &my_ret); + my_ret = aml_xconcatres(opargs[0], opargs[1]); aml_xstore(scope, opargs[2], 0, my_ret); break; case AMLOP_MID: /* Source:BS, Index:I, Length:I, Result => BS */ - aml_xmid(opargs[0], opargs[1]->v_integer, - opargs[2]->v_integer, &my_ret); + my_ret = aml_xmid(opargs[0], opargs[1]->v_integer, + opargs[2]->v_integer); aml_xstore(scope, opargs[3], 0, my_ret); break; case AMLOP_MATCH: @@ -3899,150 +3810,163 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) break; case AMLOP_SIZEOF: /* Sizeof: S => i */ - if (opargs[0]->type == AML_OBJTYPE_OBJREF) - ival = opargs[0]->v_objref.ref->length; - else - ival = opargs[0]->length; + rv = aml_gettgt(opargs[0], opcode); + ival = rv->length; break; case AMLOP_OBJECTTYPE: /* ObjectType: S => i */ - ival = opargs[0]->type; + rv = aml_gettgt(opargs[0], opcode); + ival = rv->type; break; /* Mutex/Event handlers */ case AMLOP_ACQUIRE: /* Acquire: Sw => Bool */ - ival = acpi_xmutex_acquire(scope, opargs[0], + rv = aml_gettgt(opargs[0], opcode); + ival = acpi_xmutex_acquire(scope, rv, opargs[1]->v_integer); break; case AMLOP_RELEASE: /* Release: S */ - acpi_xmutex_release(scope, opargs[0]); + rv = aml_gettgt(opargs[0], opcode); + acpi_xmutex_release(scope, rv); break; case AMLOP_WAIT: /* Wait: Si => Bool */ - ival = acpi_xevent_wait(scope, opargs[0], + rv = aml_gettgt(opargs[0], opcode); + ival = acpi_xevent_wait(scope, rv, opargs[1]->v_integer); break; case AMLOP_RESET: /* Reset: S */ - acpi_xevent_reset(scope, opargs[0]); + rv = aml_gettgt(opargs[0], opcode); + acpi_xevent_reset(scope, rv); break; case AMLOP_SIGNAL: /* Signal: S */ - acpi_xevent_signal(scope, opargs[0]); + rv = aml_gettgt(opargs[0], opcode); + acpi_xevent_signal(scope, rv); break; /* Named objects */ case AMLOP_NAME: /* Name: Nt */ - aml_freevalue(cname); - aml_copyvalue(cname, opargs[1]); + rv = opargs[0]; + aml_freevalue(rv); + if (!strcmp(rv->node->name, "_HID") && opargs[1]->type == AML_OBJTYPE_INTEGER) { + /* Shortcut for _HID: autoconvert to string */ + _aml_setvalue(rv, AML_OBJTYPE_STRING, -1, aml_eisaid(opargs[1]->v_integer)); + } + else { + aml_copyvalue(rv, opargs[1]); + } break; case AMLOP_ALIAS: /* Alias: nN */ - cname->type = AML_OBJTYPE_OBJREF; - cname->v_objref.type = AMLOP_ALIAS; - cname->v_objref.ref = opargs[0]; - while (cname->v_objref.ref->type == AML_OBJTYPE_OBJREF) { - /* Single indirection level */ - cname->v_objref.ref = cname->v_objref.ref->v_objref.ref; - } - aml_xaddref(cname->v_objref.ref, "Alias"); + rv = _aml_setvalue(opargs[1], AML_OBJTYPE_OBJREF, opcode, 0); + rv->v_objref.ref = aml_gettgt(opargs[0], opcode); + aml_xaddref(rv->v_objref.ref, "Alias"); break; case AMLOP_OPREGION: /* OpRegion: Nbii */ - cname->type = AML_OBJTYPE_OPREGION; - cname->v_opregion.iospace = opargs[1]->v_integer; - cname->v_opregion.iobase = opargs[2]->v_integer; - cname->v_opregion.iolen = opargs[3]->v_integer; - cname->v_opregion.flag = 0; + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_OPREGION, 0, 0); + rv->v_opregion.iospace = opargs[1]->v_integer; + rv->v_opregion.iobase = opargs[2]->v_integer; + rv->v_opregion.iolen = opargs[3]->v_integer; + rv->v_opregion.flag = 0; break; case AMLOP_DATAREGION: /* DataTableRegion: N,t:SigStr,t:OemIDStr,t:OemTableIDStr */ - cname->type = AML_OBJTYPE_OPREGION; - cname->v_opregion.iospace = GAS_SYSTEM_MEMORY; - cname->v_opregion.iobase = 0; - cname->v_opregion.iolen = 0; + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_OPREGION, 0, 0); + rv->v_opregion.iospace = GAS_SYSTEM_MEMORY; + rv->v_opregion.iobase = 0; + rv->v_opregion.iolen = 0; aml_die("AML-DataTableRegion\n"); break; case AMLOP_EVENT: /* Event: N */ - cname->type = AML_OBJTYPE_EVENT; - cname->v_integer = 0; + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_EVENT, 0, 0); + rv->v_integer = 0; break; case AMLOP_MUTEX: /* Mutex: Nw */ - cname->type = AML_OBJTYPE_MUTEX; - cname->v_mtx.synclvl = opargs[1]->v_integer; + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_MUTEX, 0, 0); + rv->v_mtx.synclvl = opargs[1]->v_integer; break; case AMLOP_SCOPE: /* Scope: NT */ - mscope = aml_xpushscope(scope, opargs[1], cname->node, opcode); + rv = opargs[0]; + mscope = aml_xpushscope(scope, opargs[1], rv->node, opcode); break; case AMLOP_DEVICE: /* Device: NT */ - cname->type = AML_OBJTYPE_DEVICE; - mscope = aml_xpushscope(scope, opargs[1], cname->node, opcode); + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_DEVICE, 0, 0); + mscope = aml_xpushscope(scope, opargs[1], rv->node, opcode); break; case AMLOP_THERMALZONE: /* ThermalZone: NT */ - cname->type = AML_OBJTYPE_THERMZONE; - mscope = aml_xpushscope(scope, opargs[1], cname->node, opcode); + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_THERMZONE, 0, 0); + mscope = aml_xpushscope(scope, opargs[1], rv->node, opcode); break; case AMLOP_POWERRSRC: /* PowerRsrc: NbwT */ - cname->type = AML_OBJTYPE_POWERRSRC; - cname->v_powerrsrc.pwr_level = opargs[1]->v_integer; - cname->v_powerrsrc.pwr_order = opargs[2]->v_integer; - mscope = aml_xpushscope(scope, opargs[3], cname->node, opcode); + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_POWERRSRC, 0, 0); + rv->v_powerrsrc.pwr_level = opargs[1]->v_integer; + rv->v_powerrsrc.pwr_order = opargs[2]->v_integer; + mscope = aml_xpushscope(scope, opargs[3], rv->node, opcode); break; case AMLOP_PROCESSOR: /* Processor: NbdbT */ - cname->type = AML_OBJTYPE_PROCESSOR; - cname->v_processor.proc_id = opargs[1]->v_integer; - cname->v_processor.proc_addr = opargs[2]->v_integer; - cname->v_processor.proc_len = opargs[3]->v_integer; - mscope = aml_xpushscope(scope, opargs[4], cname->node, opcode); + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_PROCESSOR, 0, 0); + rv->v_processor.proc_id = opargs[1]->v_integer; + rv->v_processor.proc_addr = opargs[2]->v_integer; + rv->v_processor.proc_len = opargs[3]->v_integer; + mscope = aml_xpushscope(scope, opargs[4], rv->node, opcode); break; case AMLOP_METHOD: /* Method: NbM */ - cname->type = AML_OBJTYPE_METHOD; - cname->v_method.flags = opargs[1]->v_integer; - cname->v_method.start = opargs[2]->v_buffer; - cname->v_method.end = cname->v_method.start + opargs[2]->length; - cname->v_method.base = aml_root.start; + rv = _aml_setvalue(opargs[0], AML_OBJTYPE_METHOD, 0, 0); + rv->v_method.flags = opargs[1]->v_integer; + rv->v_method.start = opargs[2]->v_buffer; + rv->v_method.end = rv->v_method.start + opargs[2]->length; + rv->v_method.base = aml_root.start; break; /* Field objects */ case AMLOP_CREATEFIELD: /* Source:B, BitIndex:I, NumBits:I, FieldName */ - aml_xcreatefield(cname, opcode, opargs[0], opargs[1]->v_integer, + rv = _aml_setvalue(opargs[3], AML_OBJTYPE_BUFFERFIELD, 0, 0); + aml_xcreatefield(rv, opcode, opargs[0], opargs[1]->v_integer, opargs[2]->v_integer, NULL, 0, 0); break; case AMLOP_CREATEBITFIELD: /* Source:B, BitIndex:I, FieldName */ - aml_xcreatefield(cname, opcode, opargs[0], opargs[1]->v_integer, + rv = _aml_setvalue(opargs[2], AML_OBJTYPE_BUFFERFIELD, 0, 0); + aml_xcreatefield(rv, opcode, opargs[0], opargs[1]->v_integer, 1, NULL, 0, 0); break; case AMLOP_CREATEBYTEFIELD: /* Source:B, ByteIndex:I, FieldName */ - aml_xcreatefield(cname, opcode, opargs[0], opargs[1]->v_integer*8, + rv = _aml_setvalue(opargs[2], AML_OBJTYPE_BUFFERFIELD, 0, 0); + aml_xcreatefield(rv, opcode, opargs[0], opargs[1]->v_integer*8, 8, NULL, 0, AML_FIELD_BYTEACC); break; case AMLOP_CREATEWORDFIELD: /* Source:B, ByteIndex:I, FieldName */ - aml_xcreatefield(cname, opcode, opargs[0], opargs[1]->v_integer*8, + rv = _aml_setvalue(opargs[2], AML_OBJTYPE_BUFFERFIELD, 0, 0); + aml_xcreatefield(rv, opcode, opargs[0], opargs[1]->v_integer*8, 16, NULL, 0, AML_FIELD_WORDACC); break; case AMLOP_CREATEDWORDFIELD: /* Source:B, ByteIndex:I, FieldName */ - aml_xcreatefield(cname, opcode, opargs[0], opargs[1]->v_integer*8, + rv = _aml_setvalue(opargs[2], AML_OBJTYPE_BUFFERFIELD, 0, 0); + aml_xcreatefield(rv, opcode, opargs[0], opargs[1]->v_integer*8, 32, NULL, 0, AML_FIELD_DWORDACC); break; case AMLOP_CREATEQWORDFIELD: /* Source:B, ByteIndex:I, FieldName */ - aml_xcreatefield(cname, opcode, opargs[0], opargs[1]->v_integer*8, + rv = _aml_setvalue(opargs[2], AML_OBJTYPE_BUFFERFIELD, 0, 0); + aml_xcreatefield(rv, opcode, opargs[0], opargs[1]->v_integer*8, 64, NULL, 0, AML_FIELD_QWORDACC); break; case AMLOP_FIELD: @@ -4078,10 +4002,11 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) break; case AMLOP_NOTIFY: /* Notify: Si */ + rv = aml_gettgt(opargs[0], opcode); dnprintf(50,"Notifying: %s %x\n", - aml_nodename(opargs[0]->node), + aml_nodename(rv->node), opargs[1]->v_integer); - aml_notify(opargs[0]->node, opargs[1]->v_integer); + aml_notify(rv->node, opargs[1]->v_integer); break; case AMLOP_TIMER: /* Timer: => i */ @@ -4100,17 +4025,17 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) break; case AMLOP_LOAD: /* Load(Object:NameString, DDBHandle:SuperName) */ - tmp = opargs[0]; - if (tmp->type != AML_OBJTYPE_OPREGION || - tmp->v_opregion.iospace != GAS_SYSTEM_MEMORY) { + rv = opargs[0]; + if (rv->type != AML_OBJTYPE_OPREGION || + rv->v_opregion.iospace != GAS_SYSTEM_MEMORY) { aml_die("LOAD: not a memory region!\n"); } /* Create buffer and read from memory */ _aml_setvalue(opargs[1], AML_OBJTYPE_BUFFER, - tmp->v_opregion.iolen, NULL); - aml_xgasio(tmp->v_opregion.iospace, tmp->v_opregion.iobase, - tmp->v_opregion.iolen, + rv->v_opregion.iolen, NULL); + aml_xgasio(rv->v_opregion.iospace, rv->v_opregion.iobase, + rv->v_opregion.iolen, opargs[1]->v_buffer, ACPI_IOREAD, 8, ""); /* Validate that this is a SSDT */ @@ -4149,9 +4074,9 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) while (mscope->pos != NULL) { /* At beginning of scope.. reset and perform test */ mscope->pos = mscope->start; - tmp = aml_xparse(mscope, AML_ARG_INTEGER, "While-Test"); - ival = tmp->v_integer; - aml_xdelref(&tmp, "while"); + rv = aml_xparse(mscope, AML_ARG_INTEGER, "While-Test"); + ival = rv->v_integer; + aml_xdelref(&rv, "while"); dnprintf(10,"@@@@@@ WHILE: %llx @ %x\n", ival, pc); if (ival == 0) { @@ -4196,7 +4121,7 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) if (ret_type == 'i' && my_ret && my_ret->type != AML_OBJTYPE_INTEGER) { dnprintf(10,"quick: %.4x convert to integer %s -> %s\n", pc, htab->mnem, stype); - aml_xconvert(my_ret, &my_ret, AML_OBJTYPE_INTEGER, 0); + my_ret = aml_xconvert(my_ret, AML_OBJTYPE_INTEGER, 0); } if (my_ret != NULL) { /* Display result */ @@ -4225,6 +4150,7 @@ aml_xparse(struct aml_scope *scope, int ret_type, const char *stype) odp--; dnprintf(50, ">>return [%s] %s %c %p\n", aml_nodename(scope->node), stype, ret_type, my_ret); + return my_ret; } |