summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2018-05-17 09:22:18 +0000
committerkettenis <kettenis@openbsd.org>2018-05-17 09:22:18 +0000
commite03d4ee11b409b284858a05d221d75eadc5cae8e (patch)
treeb3ae480bbf46e2403cbdc3c7f218e48dc2eaee2a
parentMake VMM_DEBUG kernels compile again; ok mlarkin (diff)
downloadwireguard-openbsd-e03d4ee11b409b284858a05d221d75eadc5cae8e.tar.xz
wireguard-openbsd-e03d4ee11b409b284858a05d221d75eadc5cae8e.zip
Implement LoadTable().
ok mlarkin@
-rw-r--r--sys/dev/acpi/dsdt.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/sys/dev/acpi/dsdt.c b/sys/dev/acpi/dsdt.c
index 1c38be3bbfa..339f745c845 100644
--- a/sys/dev/acpi/dsdt.c
+++ b/sys/dev/acpi/dsdt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dsdt.c,v 1.236 2017/11/29 15:22:22 kettenis Exp $ */
+/* $OpenBSD: dsdt.c,v 1.237 2018/05/17 09:22:18 kettenis Exp $ */
/*
* Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
*
@@ -46,6 +46,9 @@
#define AML_INTSTRLEN 16
#define AML_NAMESEG_LEN 4
+struct aml_value *aml_loadtable(struct acpi_softc *, const char *,
+ const char *, const char *, const char *,
+ const char *, struct aml_value *);
struct aml_scope *aml_load(struct acpi_softc *, struct aml_scope *,
struct aml_value *, struct aml_value *);
@@ -3530,6 +3533,37 @@ aml_seterror(struct aml_scope *scope, const char *fmt, ...)
return aml_allocvalue(AML_OBJTYPE_INTEGER, 0, 0);
}
+struct aml_value *
+aml_loadtable(struct acpi_softc *sc, const char *signature,
+ const char *oemid, const char *oemtableid, const char *rootpath,
+ const char *parameterpath, struct aml_value *parameterdata)
+{
+ struct acpi_table_header *hdr;
+ struct acpi_dsdt *p_dsdt;
+ struct acpi_q *entry;
+
+ if (strlen(rootpath) > 0)
+ aml_die("LoadTable: RootPathString unsupported");
+ if (strlen(parameterpath) > 0)
+ aml_die("LoadTable: ParameterPathString unsupported");
+
+ SIMPLEQ_FOREACH(entry, &sc->sc_tables, q_next) {
+ hdr = entry->q_table;
+ if (strncmp(hdr->signature, signature,
+ sizeof(hdr->signature)) == 0 &&
+ strncmp(hdr->oemid, oemid, sizeof(hdr->oemid)) == 0 &&
+ strncmp(hdr->oemtableid, oemtableid,
+ sizeof(hdr->oemtableid)) == 0) {
+ p_dsdt = entry->q_table;
+ acpi_parse_aml(sc, p_dsdt->aml, p_dsdt->hdr_length -
+ sizeof(p_dsdt->hdr));
+ return aml_allocvalue(AML_OBJTYPE_DDBHANDLE, 0, 0);
+ }
+ }
+
+ return aml_allocvalue(AML_OBJTYPE_INTEGER, 0, 0);
+}
+
/* Load new SSDT scope from memory address */
struct aml_scope *
aml_load(struct acpi_softc *sc, struct aml_scope *scope,
@@ -4191,7 +4225,9 @@ aml_parse(struct aml_scope *scope, int ret_type, const char *stype)
case AMLOP_LOADTABLE:
/* LoadTable(Sig:Str, OEMID:Str, OEMTable:Str, [RootPath:Str], [ParmPath:Str],
[ParmData:DataRefObj]) => DDBHandle */
- aml_die("LoadTable");
+ my_ret = aml_loadtable(acpi_softc, opargs[0]->v_string,
+ opargs[1]->v_string, opargs[2]->v_string,
+ opargs[3]->v_string, opargs[4]->v_string, opargs[5]);
break;
case AMLOP_LOAD:
/* Load(Object:NameString, DDBHandle:SuperName) */