Turns out there is an alternate way to encode AttribBytes/AttribRawBytes (and AttribRawProcessBytes) that I didn't implement. In fact our parsing of fields has always been wrong when this alternative encoding is present. But for some reason we lucked out the parser didn't go fully off the rails.
Diff below fixes this issue and makes the battery status on my Asus Transformerr Book T100HA work. ok? Index: dev/acpi/dsdt.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/dsdt.c,v retrieving revision 1.238 diff -u -p -r1.238 dsdt.c --- dev/acpi/dsdt.c 17 May 2018 20:21:15 -0000 1.238 +++ dev/acpi/dsdt.c 18 May 2018 18:51:36 -0000 @@ -2293,7 +2293,7 @@ aml_register_regionspace(struct aml_node void aml_rwgen(struct aml_value *, int, int, struct aml_value *, int, int); void aml_rwgpio(struct aml_value *, int, int, struct aml_value *, int, int); -void aml_rwgsb(struct aml_value *, int, int, struct aml_value *, int, int); +void aml_rwgsb(struct aml_value *, int, int, int, struct aml_value *, int, int); void aml_rwindexfield(struct aml_value *, struct aml_value *val, int); void aml_rwfield(struct aml_value *, int, int, struct aml_value *, int); @@ -2518,8 +2518,8 @@ aml_rwgpio(struct aml_value *conn, int b } void -aml_rwgsb(struct aml_value *conn, int bpos, int blen, struct aml_value *val, - int mode, int flag) +aml_rwgsb(struct aml_value *conn, int alen, int bpos, int blen, + struct aml_value *val, int mode, int flag) { union acpi_resource *crs = (union acpi_resource *)conn->v_buffer; struct aml_node *node; @@ -2564,6 +2564,14 @@ aml_rwgsb(struct aml_value *conn, int bp cmdlen = 1; buflen = 2; break; + case 0x0b: /* AttribBytes */ + cmdlen = 1; + buflen = alen; + break; + case 0x0e: /* AttribRawBytes */ + cmdlen = 1; + cmdlen = alen; + break; default: aml_die("unsupported access type 0x%x", flag); break; @@ -2709,7 +2717,8 @@ aml_rwfield(struct aml_value *fld, int b fld->v_field.flags); break; case ACPI_OPREG_GSB: - aml_rwgsb(ref2, fld->v_field.bitpos + bpos, blen, + aml_rwgsb(ref2, fld->v_field.ref3, + fld->v_field.bitpos + bpos, blen, val, mode, fld->v_field.flags); break; default: @@ -2795,17 +2804,17 @@ aml_parsefieldlist(struct aml_scope *msc bpos = 0; while (mscope->pos < mscope->end) { switch (*mscope->pos) { - case 0x00: /* reserved, length */ + case 0x00: /* ReservedField */ mscope->pos++; blen = aml_parselength(mscope); break; - case 0x01: /* attrib */ + case 0x01: /* AccessField */ mscope->pos++; blen = 0; flags = aml_get8(mscope->pos++); flags |= aml_get8(mscope->pos++) << 8; break; - case 0x02: /* connection */ + case 0x02: /* ConnectionField */ mscope->pos++; blen = 0; conn = aml_parse(mscope, 'o', "Connection"); @@ -2813,7 +2822,14 @@ aml_parsefieldlist(struct aml_scope *msc aml_die("Could not parse connection"); conn->node = mscope->node; break; - default: /* 4-byte name, length */ + case 0x03: /* ExtendedAccessField */ + mscope->pos++; + blen = 0; + flags = aml_get8(mscope->pos++); + flags |= aml_get8(mscope->pos++) << 8; + indexval = aml_get8(mscope->pos++); + break; + default: /* NamedField */ mscope->pos = aml_parsename(mscope->node, mscope->pos, &rv, 1); blen = aml_parselength(mscope);