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.
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 30 Nov 2020 21:00:23 -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 30 Nov 2020 21:00:23 -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 30 Nov 2020 21:00:23 -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 30 Nov 2020 21:00:23 -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 30 Nov 2020 21:00:23 -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 30 Nov 2020 21:00:23 -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,12 @@ 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]; + } else if (my_ret->type == AML_OBJTYPE_OBJREF) { my_ret = my_ret->v_objref.ref; aml_addref(my_ret, "de-alias"); } @@ -4617,15 +4614,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 +4641,5 @@ acpi_freedevlist(struct acpi_devlist_hea acpi_os_free(dl); } } + #endif /* SMALL_KERNEL */