We only have 2 results. Please test this!!
On Tue, May 19, 2009 at 07:17:31AM -0500, Marco Peereboom wrote:
> Now with diff.
>
> Index: acpidebug.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpidebug.c,v
> retrieving revision 1.22
> diff -u -p -u -p -b -r1.22 acpidebug.c
> --- acpidebug.c 12 Jun 2008 20:36:50 -0000 1.22
> +++ acpidebug.c 19 May 2009 05:11:25 -0000
> @@ -100,7 +100,7 @@ db_aml_showvalue(struct aml_value *value
> if (value->node)
> db_printf("[%s] ", aml_nodename(value->node));
>
> - switch (value->type & ~AML_STATIC) {
> + switch (value->type) {
> case AML_OBJTYPE_OBJREF:
> db_printf("refof: %x {\n", value->v_objref.index);
> db_aml_showvalue(value->v_objref.ref);
> @@ -110,8 +110,7 @@ db_aml_showvalue(struct aml_value *value
> db_printf("nameref: %s\n", value->v_nameref);
> break;
> case AML_OBJTYPE_INTEGER:
> - db_printf("integer: %llx %s\n", value->v_integer,
> - (value->type & AML_STATIC) ? "(static)" : "");
> + db_printf("integer: %llx\n", value->v_integer);
> break;
> case AML_OBJTYPE_STRING:
> db_printf("string: %s\n", value->v_string);
> @@ -194,8 +193,6 @@ db_aml_objtype(struct aml_value *val)
> return "nil";
>
> switch (val->type) {
> - case AML_OBJTYPE_INTEGER+AML_STATIC:
> - return "staticint";
> case AML_OBJTYPE_INTEGER:
> return "integer";
> case AML_OBJTYPE_STRING:
> Index: amltypes.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/amltypes.h,v
> retrieving revision 1.31
> diff -u -p -u -p -b -r1.31 amltypes.h
> --- amltypes.h 27 Apr 2009 23:39:14 -0000 1.31
> +++ amltypes.h 19 May 2009 05:11:26 -0000
> @@ -157,8 +157,6 @@
> #define AML_MATCH_GE 4
> #define AML_MATCH_GT 5
>
> -#define AML_STATIC 0x8000
> -
> /* Defined types for ObjectType() */
> enum aml_objecttype {
> AML_OBJTYPE_UNINITIALIZED = 0,
> @@ -183,7 +181,6 @@ enum aml_objecttype {
> AML_OBJTYPE_OBJREF,
> AML_OBJTYPE_SCOPE,
> AML_OBJTYPE_NOTARGET,
> - AML_OBJTYPE_STATICINT = AML_OBJTYPE_INTEGER|AML_STATIC,
> AML_OBJTYPE_HEXSTRING,
> AML_OBJTYPE_DECSTRING,
> };
> Index: dsdt.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/dsdt.c,v
> retrieving revision 1.147
> diff -u -p -u -p -b -r1.147 dsdt.c
> --- dsdt.c 27 Apr 2009 23:39:14 -0000 1.147
> +++ dsdt.c 19 May 2009 05:11:28 -0000
> @@ -781,7 +781,6 @@ aml_showvalue(struct aml_value *val, int
> printf(" [%s]", aml_nodename(val->node));
> printf(" %p cnt:%.2x stk:%.2x", val, val->refcnt, val->stack);
> switch (val->type) {
> - case AML_OBJTYPE_STATICINT:
> case AML_OBJTYPE_INTEGER:
> printf(" integer: %llx\n", val->v_integer);
> break;
> @@ -866,7 +865,6 @@ aml_val2int(struct aml_value *rval)
> }
> switch (rval->type) {
> case AML_OBJTYPE_INTEGER:
> - case AML_OBJTYPE_STATICINT:
> ival = rval->v_integer;
> break;
> case AML_OBJTYPE_BUFFER:
> @@ -889,7 +887,6 @@ _aml_setvalue(struct aml_value *lhs, int
> lhs->type = type;
> switch (lhs->type) {
> case AML_OBJTYPE_INTEGER:
> - case AML_OBJTYPE_STATICINT:
> lhs->length = aml_intlen>>3;
> lhs->v_integer = ival;
> break;
> @@ -936,11 +933,10 @@ aml_copyvalue(struct aml_value *lhs, str
> {
> int idx;
>
> - lhs->type = rhs->type & ~AML_STATIC;
> + lhs->type = rhs->type;
> switch (lhs->type) {
> case AML_OBJTYPE_UNINITIALIZED:
> break;
> - case AML_OBJTYPE_STATICINT:
> case AML_OBJTYPE_INTEGER:
> lhs->length = aml_intlen>>3;
> lhs->v_integer = rhs->v_integer;
> @@ -1692,12 +1688,15 @@ aml_val_to_string(const struct aml_value
> /*
> * XXX: NEW PARSER CODE GOES HERE
> */
> +int aml_error;
> +
> 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,
> struct aml_value *);
> struct aml_value *aml_xparse(struct aml_scope *, int, const char *);
> +struct aml_value *aml_seterror(struct aml_scope *, const char *, ...);
>
> struct aml_scope *aml_xfindscope(struct aml_scope *, int, int);
> struct aml_scope *aml_xpushscope(struct aml_scope *, struct aml_value *,
> @@ -3146,6 +3145,10 @@ aml_xeval(struct aml_scope *scope, struc
> int idx;
>
> switch (tmp->type) {
> + case AML_OBJTYPE_NAMEREF:
> + my_ret = aml_seterror(scope, "Undefined name: %s",
> + aml_getname(my_ret->v_nameref));
> + break;
> case AML_OBJTYPE_METHOD:
> dnprintf(10,"\n--== Eval Method [%s, %d args] to %c ==--\n",
> aml_nodename(tmp->node),
> @@ -3387,9 +3390,27 @@ aml_gettgt(struct aml_value *val, int op
> }
>
> struct aml_value *
> +aml_seterror(struct aml_scope *scope, const char *fmt, ...)
> +{
> + va_list ap;
> +
> + va_start(ap, fmt);
> + printf("### AML PARSE ERROR (0x%x): ", aml_pc(scope->pos));
> + vprintf(fmt, ap);
> + printf("\n");
> +
> + while (scope) {
> + scope->pos = scope->end;
> + scope = scope->parent;
> + }
> + aml_error++;
> + return aml_allocvalue(AML_OBJTYPE_INTEGER, 0, 0);
> +}
> +
> +struct aml_value *
> aml_xparse(struct aml_scope *scope, int ret_type, const char *stype)
> {
> - int opcode, idx, pc, optype[8];
> + int opcode, idx, pc;
> struct aml_opcode *htab;
> struct aml_value *opargs[8], *my_ret, *rv;
> struct aml_scope *mscope, *iscope;
> @@ -3422,7 +3443,6 @@ aml_xparse(struct aml_scope *scope, int
>
> /* --== Stage 1: Process opcode arguments ==-- */
> memset(opargs, 0, sizeof(opargs));
> - memset(optype, 0, sizeof(optype));
> idx = 0;
> for (ch = htab->args; *ch; ch++) {
> uint8_t *end;
> @@ -3451,8 +3471,8 @@ aml_xparse(struct aml_scope *scope, int
> }
> else {
> rv = aml_xparse(scope, *ch, htab->mnem);
> - if (rv == NULL)
> - aml_die("NULL RESULT");
> + if (rv == NULL || aml_error)
> + goto parse_error;
> }
> break;
>
> @@ -3477,6 +3497,7 @@ aml_xparse(struct aml_scope *scope, int
> dnprintf(10, "%s value already exists %s\n",
> aml_nodename(rv->node),
> htab->mnem);
> + aml_xaddref(rv, "Create Name");
> break;
> case AML_ARG_SEARCHNAME:
> rv = aml_xparsesimple(scope, *ch, NULL);
> @@ -3500,11 +3521,9 @@ aml_xparse(struct aml_scope *scope, int
> aml_die("Unknown arg type: %c\n", *ch);
> break;
> }
> - if (rv != NULL) {
> - optype[idx] = *ch;
> + if (rv != NULL)
> opargs[idx++] = rv;
> }
> - }
>
> /* --== Stage 2: Process opcode ==-- */
> ival = 0;
> @@ -3535,6 +3554,16 @@ aml_xparse(struct aml_scope *scope, int
> case AMLOP_NAMECHAR:
> /* opargs[0] = named object (node != NULL), or nameref */
> my_ret = opargs[0];
> + if (scope->type == AMLOP_PACKAGE) {
> + /* Special case for package */
> + if (my_ret->type == AML_OBJTYPE_NAMEREF)
> + my_ret = aml_allocvalue(AML_OBJTYPE_STRING, -1,
> + aml_getname(my_ret->v_nameref));
> + else if (my_ret->node)
> + my_ret = aml_allocvalue(AML_OBJTYPE_STRING, -1,
> + aml_nodename(my_ret->node));
> + break;
> + }
> if (my_ret->type == AML_OBJTYPE_OBJREF) {
> my_ret = my_ret->v_objref.ref;
> aml_xaddref(my_ret, "de-alias");
> @@ -3578,30 +3607,14 @@ aml_xparse(struct aml_scope *scope, int
> mscope = aml_xpushscope(scope, opargs[1], scope->node,
> AMLOP_PACKAGE);
>
> + /* Recursively parse package contents */
> for (idx=0; idx<my_ret->length; idx++) {
> - const char *nn;
> -
> rv = aml_xparse(mscope, 'o', "Package");
> - if (rv == NULL) {
> - continue;
> - }
> - nn = NULL;
> - if (rv->node)
> - /* Object is a named node: store as string */
> - nn = aml_nodename(rv->node);
> - else if (rv->type == AML_OBJTYPE_NAMEREF)
> - /* Object is nameref: store as string */
> - nn = aml_getname(rv->v_nameref);
> - if (nn != NULL) {
> - 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");
> + if (rv != NULL) {
> + aml_xdelref(&my_ret->v_package[idx], "pkginit");
> my_ret->v_package[idx] = rv;
> }
> + }
> aml_xpopscope(mscope);
> mscope = NULL;
> break;
> @@ -3625,6 +3638,10 @@ aml_xparse(struct aml_scope *scope, int
> break;
> case AMLOP_DIVIDE:
> /* Divide: iirr => I */
> + if (opargs[1]->v_integer == 0) {
> + my_ret = aml_seterror(scope, "Divide by Zero!");
>
> + break;
> + }
> ival = aml_evalexpr(opargs[0]->v_integer,
> opargs[1]->v_integer, AMLOP_MOD);
> aml_xstore(scope, opargs[2], ival, NULL);
> @@ -4129,8 +4146,9 @@ aml_xparse(struct aml_scope *scope, int
> }
>
> /* End opcode: display/free arguments */
> - for (idx=0; optype[idx] != 0; idx++) {
> - if (opargs[idx] == my_ret || optype[idx] == 'N')
> +parse_error:
> + for (idx=0; idx<8; idx++) {
> + if (opargs[idx] == my_ret)
> opargs[idx] = NULL;
> aml_xdelref(&opargs[idx], "oparg");
> }
> @@ -4168,12 +4186,17 @@ acpi_parse_aml(struct acpi_softc *sc, u_
> res.v_buffer = start;
>
> /* Push toplevel scope, parse AML */
> + aml_error = 0;
> scope = aml_xpushscope(NULL, &res, &aml_root, AMLOP_SCOPE);
> aml_busy++;
> aml_xparse(scope, 'T', "TopLevel");
> aml_busy--;
> aml_xpopscope(scope);
>
> + if (aml_error) {
> + printf("error in acpi_parse_aml\n");
> + return -1;
> + }
> return 0;
> }
>
> @@ -4188,41 +4211,23 @@ aml_evalnode(struct acpi_softc *sc, stru
> int argc, struct aml_value *argv, struct aml_value *res)
> {
> struct aml_value *xres;
> -#ifdef ACPI_MEMDEBUG
> - static int wmstate;
> -#endif
>
> if (res)
> memset(res, 0, sizeof(*res));
> if (node == NULL || node->value == NULL)
> return (ACPI_E_BADVALUE);
> dnprintf(12,"EVALNODE: %s %d\n", aml_nodename(node), acpi_nalloc);
> - switch (node->value->type) {
> - case AML_OBJTYPE_INTEGER:
> - case AML_OBJTYPE_PACKAGE:
> - case AML_OBJTYPE_STRING:
> - case AML_OBJTYPE_BUFFER:
> - case AML_OBJTYPE_PROCESSOR:
> - case AML_OBJTYPE_THERMZONE:
> - case AML_OBJTYPE_POWERRSRC:
> - if (res)
> - aml_copyvalue(res, node->value);
> - break;
> - case AML_OBJTYPE_BUFFERFIELD:
> - case AML_OBJTYPE_FIELDUNIT:
> - case AML_OBJTYPE_METHOD:
> - aml_busy++;
> -#ifdef ACPI_MEMDEBUG
> - wmstate = acpi_walkmem(wmstate, aml_nodename(node));
> -#endif
> +
> + aml_error = 0;
> xres = aml_xeval(NULL, node->value, 't', argc, argv);
> - aml_busy--;
> - if (res && xres)
> + if (xres) {
> + if (res)
> aml_copyvalue(res, xres);
> if (xres != node->value)
> - aml_xdelref(&xres, "EvalNode");
> - break;
> - default:
> + aml_xdelref(&xres, "evalnode");
> + }
> + if (aml_error) {
> + printf("error evaluating: %s\n", aml_nodename(node));
> return (-1);
> }
> return (0);