> 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 */

Reply via email to