> From: Greg Steuck <gne...@openbsd.org> > Date: Mon, 30 Nov 2020 20:54:59 -0800 > > Mark Kettenis <mark.kette...@xs4all.nl> writes: > > > The diff below fixes the way we handle named references in AML > > packages. This fixes some bugs but I'd like to make sure that this > > doesn't inadvertedly break things. So tests on a wide variety of > > machines are welcome. > > I see a prompt crash:
Does this one work better? Index: dev/acpi/acpi.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpi.c,v retrieving revision 1.391 diff -u -p -r1.391 acpi.c --- dev/acpi/acpi.c 27 Aug 2020 01:08:55 -0000 1.391 +++ dev/acpi/acpi.c 1 Dec 2020 21:40:03 -0000 @@ -2980,21 +2980,24 @@ acpi_getprop(struct aml_node *node, cons /* Check properties. */ for (i = 0; i < dsd.v_package[1]->length; i++) { struct aml_value *res = dsd.v_package[1]->v_package[i]; + struct aml_value *val; int len; if (res->type != AML_OBJTYPE_PACKAGE || res->length != 2 || res->v_package[0]->type != AML_OBJTYPE_STRING) continue; - len = res->v_package[1]->length; - switch (res->v_package[1]->type) { + val = res->v_package[1]; + if (val->type == AML_OBJTYPE_OBJREF) + val = val->v_objref.ref; + + len = val->length; + switch (val->type) { case AML_OBJTYPE_BUFFER: - memcpy(buf, res->v_package[1]->v_buffer, - min(len, buflen)); + memcpy(buf, val->v_buffer, min(len, buflen)); return len; case AML_OBJTYPE_STRING: - memcpy(buf, res->v_package[1]->v_string, - min(len, buflen)); + memcpy(buf, val->v_string, min(len, buflen)); return len; } } @@ -3031,14 +3034,22 @@ acpi_getpropint(struct aml_node *node, c /* Check properties. */ for (i = 0; i < dsd.v_package[1]->length; i++) { struct aml_value *res = dsd.v_package[1]->v_package[i]; + struct aml_value *val; if (res->type != AML_OBJTYPE_PACKAGE || res->length != 2 || - res->v_package[0]->type != AML_OBJTYPE_STRING || - res->v_package[1]->type != AML_OBJTYPE_INTEGER) + res->v_package[0]->type != AML_OBJTYPE_STRING) + continue; + + val = res->v_package[1]; + if (val->type == AML_OBJTYPE_OBJREF) + val = val->v_objref.ref; + + if (val->type != AML_OBJTYPE_INTEGER) continue; - if (strcmp(res->v_package[0]->v_string, prop) == 0) - return res->v_package[1]->v_integer; + if (strcmp(res->v_package[0]->v_string, prop) == 0 && + val->type == AML_OBJTYPE_INTEGER) + return val->v_integer; } return defval; @@ -3130,7 +3141,7 @@ const char *acpi_isa_hids[] = { void acpi_attach_deps(struct acpi_softc *sc, struct aml_node *node) { - struct aml_value res; + struct aml_value res, *val; struct aml_node *dep; int i; @@ -3141,9 +3152,14 @@ acpi_attach_deps(struct acpi_softc *sc, return; for (i = 0; i < res.length; i++) { - if (res.v_package[i]->type != AML_OBJTYPE_STRING) + val = res.v_package[i]; + if (val->type == AML_OBJTYPE_OBJREF) + val = val->v_objref.ref; + if (val->type != AML_OBJTYPE_DEVICE) { + printf("%s: type %d\n", __func__, val->type); continue; - dep = aml_searchrel(node, res.v_package[i]->v_string); + } + dep = val->node; if (dep == NULL || dep->attached) continue; dep = aml_searchname(dep, "_HID"); Index: dev/acpi/acpiprt.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpiprt.c,v retrieving revision 1.49 diff -u -p -r1.49 acpiprt.c --- dev/acpi/acpiprt.c 11 Apr 2020 11:01:18 -0000 1.49 +++ dev/acpi/acpiprt.c 1 Dec 2020 21:40:03 -0000 @@ -272,14 +272,6 @@ acpiprt_prt_add(struct acpiprt_softc *sc } pp = v->v_package[2]; - if (pp->type == AML_OBJTYPE_STRING) { - node = aml_searchrel(sc->sc_devnode, pp->v_string); - if (node == NULL) { - printf("Invalid device\n"); - return; - } - pp = node->value; - } if (pp->type == AML_OBJTYPE_NAMEREF) { node = aml_searchrel(sc->sc_devnode, pp->v_nameref); if (node == NULL) { Index: dev/acpi/acpipwrres.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpipwrres.c,v retrieving revision 1.8 diff -u -p -r1.8 acpipwrres.c --- dev/acpi/acpipwrres.c 6 Apr 2020 00:01:08 -0000 1.8 +++ dev/acpi/acpipwrres.c 1 Dec 2020 21:40:03 -0000 @@ -291,10 +291,10 @@ acpipwrres_foundcons(struct aml_node *no for (; i < res.length; i++) { ref = res.v_package[i]; - if (ref->type == AML_OBJTYPE_STRING) { + if (ref->type == AML_OBJTYPE_NAMEREF) { struct aml_node *pnode; - pnode = aml_searchrel(&aml_root, ref->v_string); + pnode = aml_searchrel(&aml_root, ref->v_nameref); if (pnode == NULL) { DPRINTF(("%s: device %s not found\n", DEVNAME(sc), ref->v_string)); Index: dev/acpi/acpitz.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpitz.c,v retrieving revision 1.54 diff -u -p -r1.54 acpitz.c --- dev/acpi/acpitz.c 29 Jun 2018 17:39:18 -0000 1.54 +++ dev/acpi/acpitz.c 1 Dec 2020 21:40:03 -0000 @@ -304,9 +304,9 @@ acpitz_setfan(struct acpitz_softc *sc, i } for (y = 0; y < res1.length; y++) { ref = res1.v_package[y]; - if (ref->type == AML_OBJTYPE_STRING) { + if (ref->type == AML_OBJTYPE_NAMEREF) { node = aml_searchrel(sc->sc_devnode, - ref->v_string); + ref->v_nameref); if (node == NULL) { printf("%s: %s[%d.%d] _PR0" " not a valid device\n", Index: dev/acpi/atk0110.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/atk0110.c,v retrieving revision 1.15 diff -u -p -r1.15 atk0110.c --- dev/acpi/atk0110.c 29 Jun 2018 17:39:18 -0000 1.15 +++ dev/acpi/atk0110.c 1 Dec 2020 21:40:03 -0000 @@ -230,12 +230,12 @@ aibs_attach_sif(struct aibs_softc *sc, e } for (i = 0, v++; i < n; i++, v++) { - if(v[0]->type != AML_OBJTYPE_STRING) { - printf("%s: %s: %i: not a string: %i type\n", + if(v[0]->type != AML_OBJTYPE_NAMEREF) { + printf("%s: %s: %i: not a nameref: %i type\n", DEVNAME(sc), name, i, v[0]->type); continue; } - aibs_add_sensor(sc, v[0]->v_string); + aibs_add_sensor(sc, v[0]->v_nameref); } aml_freevalue(&res); Index: dev/acpi/dsdt.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/dsdt.c,v retrieving revision 1.256 diff -u -p -r1.256 dsdt.c --- dev/acpi/dsdt.c 27 Sep 2020 16:46:15 -0000 1.256 +++ dev/acpi/dsdt.c 1 Dec 2020 21:40:03 -0000 @@ -965,6 +965,7 @@ aml_copyvalue(struct aml_value *lhs, str lhs->v_mutex = rhs->v_mutex; break; case AML_OBJTYPE_POWERRSRC: + lhs->node = rhs->node; lhs->v_powerrsrc = rhs->v_powerrsrc; break; case AML_OBJTYPE_METHOD: @@ -980,6 +981,7 @@ aml_copyvalue(struct aml_value *lhs, str lhs->v_opregion = rhs->v_opregion; break; case AML_OBJTYPE_PROCESSOR: + lhs->node = rhs->node; lhs->v_processor = rhs->v_processor; break; case AML_OBJTYPE_NAMEREF: @@ -995,6 +997,8 @@ aml_copyvalue(struct aml_value *lhs, str aml_addref(lhs->v_objref.ref, ""); break; case AML_OBJTYPE_DEVICE: + case AML_OBJTYPE_THERMZONE: + lhs->node = rhs->node; break; default: printf("copyvalue: %x", rhs->type); @@ -1035,10 +1039,8 @@ aml_freevalue(struct aml_value *val) acpi_os_free(val->v_buffer); break; case AML_OBJTYPE_PACKAGE: - for (idx = 0; idx < val->length; idx++) { - aml_freevalue(val->v_package[idx]); - acpi_os_free(val->v_package[idx]); - } + for (idx = 0; idx < val->length; idx++) + aml_delref(&val->v_package[idx], ""); acpi_os_free(val->v_package); break; case AML_OBJTYPE_OBJREF: @@ -1471,11 +1473,11 @@ struct aml_defval { { "_OSI", AML_OBJTYPE_METHOD, 1, aml_callosi }, /* Create default scopes */ - { "_GPE" }, - { "_PR_" }, - { "_SB_" }, - { "_TZ_" }, - { "_SI_" }, + { "_GPE", AML_OBJTYPE_DEVICE }, + { "_PR_", AML_OBJTYPE_DEVICE }, + { "_SB_", AML_OBJTYPE_DEVICE }, + { "_TZ_", AML_OBJTYPE_DEVICE }, + { "_SI_", AML_OBJTYPE_DEVICE }, { NULL } }; @@ -3875,17 +3877,13 @@ aml_parse(struct aml_scope *scope, int r case AMLOP_NAMECHAR: /* opargs[0] = named object (node != NULL), or nameref */ my_ret = opargs[0]; - if (scope->type == AMLOP_PACKAGE) { + if (scope->type == AMLOP_PACKAGE && my_ret->node) { /* 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 = aml_allocvalue(AML_OBJTYPE_OBJREF, + AMLOP_NAMECHAR, 0); + my_ret->v_objref.ref = opargs[0]; + aml_addref(my_ret, "package"); + } else if (my_ret->type == AML_OBJTYPE_OBJREF) { my_ret = my_ret->v_objref.ref; aml_addref(my_ret, "de-alias"); } @@ -4617,15 +4615,17 @@ acpi_getdevlist(struct acpi_devlist_head struct aml_value *pkg, int off) { struct acpi_devlist *dl; - struct aml_node *node; + struct aml_value *val; int idx; - for (idx=off; idx<pkg->length; idx++) { - node = aml_searchname(root, pkg->v_package[idx]->v_string); - if (node) { + for (idx = off; idx < pkg->length; idx++) { + val = pkg->v_package[idx]; + if (val->type == AML_OBJTYPE_OBJREF) + val = val->v_objref.ref; + if (val->node) { dl = acpi_os_malloc(sizeof(*dl)); if (dl) { - dl->dev_node = node; + dl->dev_node = val->node; TAILQ_INSERT_TAIL(list, dl, dev_link); } } @@ -4642,4 +4642,5 @@ acpi_freedevlist(struct acpi_devlist_hea acpi_os_free(dl); } } + #endif /* SMALL_KERNEL */