summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2003-08-28 03:33:07 +0000
committernjl <njl@FreeBSD.org>2003-08-28 03:33:07 +0000
commitf51148df74471b2de10f2c7d9e0848512ec9e982 (patch)
treeee3d0ffe27722c875de6baf4aaf067ff286036a6 /usr.sbin
parent3a01d6b42ea551b4fd0e4c57177c70e390b38547 (diff)
downloadFreeBSD-src-f51148df74471b2de10f2c7d9e0848512ec9e982.zip
FreeBSD-src-f51148df74471b2de10f2c7d9e0848512ec9e982.tar.gz
Modify acpidump to use iasl(8) as the backend for disassembling AML.
Also clean up the output of dumped tables. Update the man page for the new usage. Make WARNS=6 clean.
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/acpi/acpidump/Makefile9
-rw-r--r--usr.sbin/acpi/acpidump/acpi.c357
-rw-r--r--usr.sbin/acpi/acpidump/acpi_user.c59
-rw-r--r--usr.sbin/acpi/acpidump/acpidump.8149
-rw-r--r--usr.sbin/acpi/acpidump/acpidump.c126
-rw-r--r--usr.sbin/acpi/acpidump/acpidump.h48
-rw-r--r--usr.sbin/acpi/acpidump/aml_dump.c60
-rw-r--r--usr.sbin/acpi/acpidump/asl_dump.c1644
8 files changed, 366 insertions, 2086 deletions
diff --git a/usr.sbin/acpi/acpidump/Makefile b/usr.sbin/acpi/acpidump/Makefile
index 9000dd9..21a4140 100644
--- a/usr.sbin/acpi/acpidump/Makefile
+++ b/usr.sbin/acpi/acpidump/Makefile
@@ -1,13 +1,8 @@
-# $Id: Makefile,v 1.2 2000/07/14 18:16:29 iwasaki Exp $
# $FreeBSD$
PROG= acpidump
MAN= acpidump.8
-SRCS= acpi.c acpi_user.c asl_dump.c aml_dump.c acpidump.c
-SRCS+= aml_parse.c aml_name.c aml_amlmem.c aml_memman.c aml_store.c \
- aml_obj.c aml_evalobj.c aml_common.c
-
-CFLAGS+= -I${.CURDIR}/../amldb
+SRCS= acpi.c acpi_user.c acpidump.c
+WARNS?= 6
.include <bsd.prog.mk>
-.PATH: ${.CURDIR}/../amldb/aml
diff --git a/usr.sbin/acpi/acpidump/acpi.c b/usr.sbin/acpi/acpidump/acpi.c
index cecbdc1..ee07f64 100644
--- a/usr.sbin/acpi/acpidump/acpi.c
+++ b/usr.sbin/acpi/acpidump/acpi.c
@@ -24,62 +24,44 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: acpi.c,v 1.4 2000/08/09 14:47:52 iwasaki Exp $
* $FreeBSD$
*/
+#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
-
+#include <sys/wait.h>
#include <assert.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
+#include <string.h>
#include <unistd.h>
#include "acpidump.h"
-#include "aml/aml_env.h"
-#include "aml/aml_common.h"
-
#define BEGIN_COMMENT "/*\n"
#define END_COMMENT " */\n"
-struct ACPIsdt dsdt_header = {
- "DSDT", 0, 1, 0, "OEMID", "OEMTBLID", 0x12345678, "CRTR", 0x12345678
-};
-
-static void
-acpi_trim_string(char *s, size_t length)
-{
-
- /* Trim trailing spaces and NULLs */
- while (length > 0 && (s[length - 1] == ' ' || s[length - 1] == '\0'))
- s[length-- - 1] = '\0';
-}
-
-static void
-acpi_print_dsdt_definition(void)
-{
- char oemid[6 + 1];
- char oemtblid[8 + 1];
-
- acpi_trim_string(dsdt_header.oemid, 6);
- acpi_trim_string(dsdt_header.oemtblid, 8);
- strncpy(oemid, dsdt_header.oemid, 6);
- oemid[6] = '\0';
- strncpy(oemtblid, dsdt_header.oemtblid, 8);
- oemtblid[8] = '\0';
-
- printf("DefinitionBlock (\n"
- " \"acpi_dsdt.aml\", //Output filename\n"
- " \"DSDT\", //Signature\n"
- " 0x%x, //DSDT Revision\n"
- " \"%s\", //OEMID\n"
- " \"%s\", //TABLE ID\n"
- " 0x%x //OEM Revision\n)\n",
- dsdt_header.rev, oemid, oemtblid, dsdt_header.oemrev);
-}
+static void acpi_print_string(char *s, size_t length);
+static void acpi_handle_facp(struct FACPbody *facp);
+static void acpi_print_cpu(u_char cpu_id);
+static void acpi_print_local_apic(u_char cpu_id, u_char apic_id,
+ u_int32_t flags);
+static void acpi_print_io_apic(u_char apic_id, u_int32_t int_base,
+ u_int64_t apic_addr);
+static void acpi_print_mps_flags(u_int16_t flags);
+static void acpi_print_intr(u_int32_t intr, u_int16_t mps_flags);
+static void acpi_print_apic(struct MADT_APIC *mp);
+static void acpi_handle_apic(struct ACPIsdt *sdp);
+static void acpi_handle_hpet(struct ACPIsdt *sdp);
+static void acpi_print_sdt(struct ACPIsdt *sdp, int endcomment);
+static void acpi_print_facp(struct FACPbody *facp);
+static void acpi_print_dsdt(struct ACPIsdt *dsdp);
+static struct ACPIsdt *
+ acpi_map_sdt(vm_offset_t pa);
+static void acpi_print_rsd_ptr(struct ACPIrsdp *rp);
+static void acpi_handle_rsdt(struct ACPIsdt *rsdp);
static void
acpi_print_string(char *s, size_t length)
@@ -97,29 +79,15 @@ acpi_print_string(char *s, size_t length)
}
static void
-acpi_handle_dsdt(struct ACPIsdt *dsdp)
-{
- u_int8_t *dp;
- u_int8_t *end;
-
- acpi_print_dsdt(dsdp);
- dp = (u_int8_t *)dsdp->body;
- end = (u_int8_t *)dsdp + dsdp->len;
-
- acpi_dump_dsdt(dp, end);
-}
-
-static void
acpi_handle_facp(struct FACPbody *facp)
{
struct ACPIsdt *dsdp;
acpi_print_facp(facp);
- dsdp = (struct ACPIsdt *) acpi_map_sdt(facp->dsdt_ptr);
+ dsdp = (struct ACPIsdt *)acpi_map_sdt(facp->dsdt_ptr);
if (acpi_checksum(dsdp, dsdp->len))
- errx(1, "DSDT is corrupt\n");
- acpi_handle_dsdt(dsdp);
- aml_dump(dsdp);
+ errx(1, "DSDT is corrupt");
+ acpi_print_dsdt(dsdp);
}
static void
@@ -149,17 +117,9 @@ acpi_print_local_apic(u_char cpu_id, u_char apic_id, u_int32_t flags)
static void
acpi_print_io_apic(u_char apic_id, u_int32_t int_base, u_int64_t apic_addr)
{
- u_int addr_hi;
-
printf("\tAPIC ID=%d\n", (u_int)apic_id);
printf("\tINT BASE=%d\n", int_base);
- printf("\tADDR=0x");
- addr_hi = apic_addr >> 32;
- if (addr_hi != 0) {
- printf("%08x", addr_hi);
- apic_addr &= 0xffffffff;
- }
- printf("%08x\n", (u_int)apic_addr);
+ printf("\tADDR=0x%016jx\n", apic_addr);
}
static void
@@ -242,9 +202,8 @@ acpi_print_apic(struct MADT_APIC *mp)
acpi_print_mps_flags(mp->body.local_nmi.mps_flags);
break;
case ACPI_MADT_APIC_TYPE_LOCAL_OVERRIDE:
- printf("\tLocal APIC ADDR=0x%08x%08x\n",
- (u_int)(mp->body.local_apic_override.apic_addr >> 32),
- (u_int)(mp->body.local_apic_override.apic_addr & 0xffffffff));
+ printf("\tLocal APIC ADDR=0x%016jx\n",
+ mp->body.local_apic_override.apic_addr);
break;
case ACPI_MADT_APIC_TYPE_IO_SAPIC:
acpi_print_io_apic(mp->body.io_sapic.apic_id,
@@ -268,6 +227,7 @@ acpi_print_apic(struct MADT_APIC *mp)
break;
default:
printf("\tUnknown type %d\n", (u_int)mp->type);
+ break;
}
}
@@ -277,15 +237,14 @@ acpi_handle_apic(struct ACPIsdt *sdp)
struct MADTbody *madtp;
struct MADT_APIC *madt_apicp;
- acpi_print_sdt(sdp);
+ acpi_print_sdt(sdp, /*endcomment*/0);
madtp = (struct MADTbody *) sdp->body;
- printf(BEGIN_COMMENT);
printf("\tLocal APIC ADDR=0x%08x\n", madtp->lapic_addr);
printf("\tFlags={");
if (madtp->flags & ACPI_APIC_FLAG_PCAT_COMPAT)
printf("PC-AT");
printf("}\n");
- madt_apicp = (struct MADT_APIC *) madtp->body;
+ madt_apicp = (struct MADT_APIC *)madtp->body;
while (((uintptr_t)madt_apicp) - ((uintptr_t)sdp) < sdp->len) {
printf("\n");
acpi_print_apic(madt_apicp);
@@ -300,9 +259,8 @@ acpi_handle_hpet(struct ACPIsdt *sdp)
{
struct HPETbody *hpetp;
- acpi_print_sdt(sdp);
+ acpi_print_sdt(sdp, /*endcomment*/0);
hpetp = (struct HPETbody *) sdp->body;
- printf(BEGIN_COMMENT);
printf("\tHPET Number=%d\n", hpetp->hpet_number);
printf("\tADDR=0x%08x\n", hpetp->base_addr);
printf("\tHW Rev=0x%x\n", hpetp->block_hwrev);
@@ -319,58 +277,9 @@ acpi_handle_hpet(struct ACPIsdt *sdp)
}
static void
-init_namespace()
+acpi_print_sdt(struct ACPIsdt *sdp, int endcomment)
{
- struct aml_environ env;
- struct aml_name *newname;
-
- aml_new_name_group(AML_NAME_GROUP_OS_DEFINED);
- env.curname = aml_get_rootname();
- newname = aml_create_name(&env, "\\_OS_");
- newname->property = aml_alloc_object(aml_t_string, NULL);
- newname->property->str.needfree = 0;
- newname->property->str.string = "Microsoft Windows NT";
-}
-
-/*
- * Public interfaces
- */
-
-void
-acpi_dump_dsdt(u_int8_t *dp, u_int8_t *end)
-{
- extern struct aml_environ asl_env;
-
- acpi_print_dsdt_definition();
-
- /* 1st stage: parse only w/o printing */
- init_namespace();
- aml_new_name_group((int)dp);
- bzero(&asl_env, sizeof(asl_env));
-
- asl_env.dp = dp;
- asl_env.end = end;
- asl_env.curname = aml_get_rootname();
-
- aml_local_stack_push(aml_local_stack_create());
- aml_parse_objectlist(&asl_env, 0);
- aml_local_stack_delete(aml_local_stack_pop());
-
- assert(asl_env.dp == asl_env.end);
- asl_env.dp = dp;
-
- /* 2nd stage: dump whole object list */
- printf("\n{\n");
- asl_dump_objectlist(&dp, end, 0);
- printf("\n}\n");
- assert(dp == end);
-}
-
-void
-acpi_print_sdt(struct ACPIsdt *sdp)
-{
-
- printf(BEGIN_COMMENT);
+ printf(BEGIN_COMMENT " ");
acpi_print_string(sdp->signature, 4);
printf(": Length=%d, Revision=%d, Checksum=%d,\n",
sdp->len, sdp->rev, sdp->check);
@@ -382,20 +291,17 @@ acpi_print_sdt(struct ACPIsdt *sdp)
printf("\tCreator ID=");
acpi_print_string(sdp->creator, 4);
printf(", Creator Revision=0x%x\n", sdp->crerev);
- printf(END_COMMENT);
- if (!memcmp(sdp->signature, "DSDT", 4)) {
- memcpy(&dsdt_header, sdp, sizeof(dsdt_header));
- }
+ if (endcomment)
+ printf(END_COMMENT);
}
-void
+static void
acpi_print_rsdt(struct ACPIsdt *rsdp)
{
int i, entries;
- acpi_print_sdt(rsdp);
+ acpi_print_sdt(rsdp, /*endcomment*/0);
entries = (rsdp->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t);
- printf(BEGIN_COMMENT);
printf("\tEntries={ ");
for (i = 0; i < entries; i++) {
if (i > 0)
@@ -406,13 +312,13 @@ acpi_print_rsdt(struct ACPIsdt *rsdp)
printf(END_COMMENT);
}
-void
+static void
acpi_print_facp(struct FACPbody *facp)
{
char sep;
printf(BEGIN_COMMENT);
- printf("\tDSDT=0x%x\n", facp->dsdt_ptr);
+ printf(" FACP:\tDSDT=0x%x\n", facp->dsdt_ptr);
printf("\tINT_MODEL=%s\n", facp->int_model ? "APIC" : "PIC");
printf("\tSCI_INT=%d\n", facp->sci_int);
printf("\tSMI_CMD=0x%x, ", facp->smi_cmd);
@@ -486,11 +392,10 @@ acpi_print_facp(struct FACPbody *facp)
printf(END_COMMENT);
}
-void
+static void
acpi_print_dsdt(struct ACPIsdt *dsdp)
{
-
- acpi_print_sdt(dsdp);
+ acpi_print_sdt(dsdp, /*endcomment*/1);
}
int
@@ -507,7 +412,7 @@ acpi_checksum(void *p, size_t length)
return (sum);
}
-struct ACPIsdt *
+static struct ACPIsdt *
acpi_map_sdt(vm_offset_t pa)
{
struct ACPIsdt *sp;
@@ -517,18 +422,18 @@ acpi_map_sdt(vm_offset_t pa)
return (sp);
}
-void
+static void
acpi_print_rsd_ptr(struct ACPIrsdp *rp)
{
printf(BEGIN_COMMENT);
- printf("RSD PTR: Checksum=%d, OEMID=", rp->sum);
+ printf(" RSD PTR: Checksum=%d, OEMID=", rp->sum);
acpi_print_string(rp->oem, 6);
printf(", RsdtAddress=0x%08x\n", rp->rsdt_addr);
printf(END_COMMENT);
}
-void
+static void
acpi_handle_rsdt(struct ACPIsdt *rsdp)
{
int i;
@@ -538,100 +443,134 @@ acpi_handle_rsdt(struct ACPIsdt *rsdp)
entries = (rsdp->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t);
acpi_print_rsdt(rsdp);
for (i = 0; i < entries; i++) {
- sdp = (struct ACPIsdt *) acpi_map_sdt(rsdp->body[i]);
+ sdp = (struct ACPIsdt *)acpi_map_sdt(rsdp->body[i]);
if (acpi_checksum(sdp, sdp->len))
- errx(1, "RSDT entry %d is corrupt\n", i);
- if (!memcmp(sdp->signature, "FACP", 4)) {
+ errx(1, "RSDT entry %d is corrupt", i);
+ if (!memcmp(sdp->signature, "FACP", 4))
acpi_handle_facp((struct FACPbody *) sdp->body);
- } else if (!memcmp(sdp->signature, "APIC", 4)) {
+ else if (!memcmp(sdp->signature, "APIC", 4))
acpi_handle_apic(sdp);
- } else if (!memcmp(sdp->signature, "HPET", 4)) {
+ else if (!memcmp(sdp->signature, "HPET", 4))
acpi_handle_hpet(sdp);
- } else {
- acpi_print_sdt(sdp);
- }
+ else
+ acpi_print_sdt(sdp, /*endcomment*/1);
}
}
-/*
- * Dummy functions
- */
-
-void
-aml_dbgr(struct aml_environ *env1, struct aml_environ *env2)
+struct ACPIsdt *
+sdt_load_devmem()
{
- /* do nothing */
-}
+ struct ACPIrsdp *rp;
+ struct ACPIsdt *rsdp;
-int
-aml_region_read_simple(struct aml_region_handle *h, vm_offset_t offset,
- u_int32_t *valuep)
-{
- return (0);
-}
+ rp = acpi_find_rsd_ptr();
+ if (!rp)
+ errx(1, "Can't find ACPI information");
-int
-aml_region_write_simple(struct aml_region_handle *h, vm_offset_t offset,
- u_int32_t value)
-{
- return (0);
-}
+ if (tflag)
+ acpi_print_rsd_ptr(rp);
+ rsdp = (struct ACPIsdt *)acpi_map_sdt(rp->rsdt_addr);
+ if (memcmp(rsdp->signature, "RSDT", 4) != 0 ||
+ acpi_checksum(rsdp, rsdp->len) != 0)
+ errx(1, "RSDT is corrupted");
-u_int32_t
-aml_region_prompt_read(struct aml_region_handle *h, u_int32_t value)
-{
- return (0);
+ return (rsdp);
}
-u_int32_t
-aml_region_prompt_write(struct aml_region_handle *h, u_int32_t value)
+void
+dsdt_save_file(char *outfile, struct ACPIsdt *dsdp)
{
- return (0);
-}
+ int fd;
+ mode_t mode;
-int
-aml_region_prompt_update_value(u_int32_t orgval, u_int32_t value,
- struct aml_region_handle *h)
-{
- return (0);
+ assert(outfile != NULL);
+ mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+ fd = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, mode);
+ if (fd == -1) {
+ perror("dsdt_save_file");
+ return;
+ }
+ write(fd, dsdp, SIZEOF_SDT_HDR);
+ write(fd, dsdp->body, dsdp->len - SIZEOF_SDT_HDR);
+ close(fd);
}
-u_int32_t
-aml_region_read(struct aml_environ *env, int regtype, u_int32_t flags,
- u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen)
+void
+aml_disassemble(struct ACPIsdt *dsdp)
{
- return (0);
-}
+ char tmpstr[32], buf[256];
+ FILE *fp;
+ int fd, len;
-int
-aml_region_write(struct aml_environ *env, int regtype, u_int32_t flags,
- u_int32_t value, u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen)
-{
- return (0);
+ strcpy(tmpstr, "/tmp/acpidump.XXXXXX");
+ fd = mkstemp(tmpstr);
+ if (fd < 0) {
+ perror("iasl tmp file");
+ return;
+ }
+
+ /* Dump DSDT to the temp file */
+ write(fd, dsdp, SIZEOF_SDT_HDR);
+ write(fd, dsdp->body, dsdp->len - SIZEOF_SDT_HDR);
+ close(fd);
+
+ /* Run iasl -d on the temp file */
+ if (fork() == 0) {
+ close(STDOUT_FILENO);
+ if (vflag == 0)
+ close(STDERR_FILENO);
+ execl("/usr/sbin/iasl", "iasl", "-d", tmpstr, 0);
+ err(1, "exec");
+ }
+
+ wait(NULL);
+ unlink(tmpstr);
+
+ /* Dump iasl's output to stdout */
+ fp = fopen("acpidump.dsl", "r");
+ unlink("acpidump.dsl");
+ if (fp == NULL) {
+ perror("iasl tmp file (read)");
+ return;
+ }
+ while ((len = fread(buf, 1, sizeof(buf), fp)) > 0)
+ fwrite(buf, 1, len, stdout);
+ fclose(fp);
}
-int
-aml_region_write_from_buffer(struct aml_environ *env, int regtype,
- u_int32_t flags, u_int8_t *buffer, u_int32_t addr, u_int32_t bitoffset,
- u_int32_t bitlen)
+void
+sdt_print_all(struct ACPIsdt *rsdp)
{
- return (0);
+ acpi_handle_rsdt(rsdp);
}
-int
-aml_region_bcopy(struct aml_environ *env, int regtype, u_int32_t flags,
- u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen,
- u_int32_t dflags, u_int32_t daddr,
- u_int32_t dbitoffset, u_int32_t dbitlen)
+/* Fetch a table matching the given signature via the RSDT */
+struct ACPIsdt *
+sdt_from_rsdt(struct ACPIsdt *rsdt, const char *sig)
{
- return (0);
+ int i;
+ int entries;
+ struct ACPIsdt *sdt;
+
+ entries = (rsdt->len - SIZEOF_SDT_HDR) / sizeof(uint32_t);
+ for (i = 0; i < entries; i++) {
+ sdt = (struct ACPIsdt *)acpi_map_sdt(rsdt->body[i]);
+ if (acpi_checksum(sdt, sdt->len))
+ errx(1, "RSDT entry %d is corrupt", i);
+ if (!memcmp(sdt->signature, sig, strlen(sig)))
+ return (sdt);
+ }
+
+ return (NULL);
}
-int
-aml_region_read_into_buffer(struct aml_environ *env, int regtype,
- u_int32_t flags, u_int32_t addr, u_int32_t bitoffset,
- u_int32_t bitlen, u_int8_t *buffer)
+struct ACPIsdt *
+dsdt_from_facp(struct FACPbody *facp)
{
- return (0);
-}
+ struct ACPIsdt *sdt;
+ sdt = (struct ACPIsdt *)acpi_map_sdt(facp->dsdt_ptr);
+ if (acpi_checksum(sdt, sdt->len))
+ errx(1, "DSDT is corrupt\n");
+ return (sdt);
+}
diff --git a/usr.sbin/acpi/acpidump/acpi_user.c b/usr.sbin/acpi/acpidump/acpi_user.c
index 8361ef6..4b38fef 100644
--- a/usr.sbin/acpi/acpidump/acpi_user.c
+++ b/usr.sbin/acpi/acpidump/acpi_user.c
@@ -24,7 +24,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: acpi_user.c,v 1.5 2000/08/09 14:47:52 iwasaki Exp $
* $FreeBSD$
*/
@@ -32,6 +31,7 @@
#include <sys/mman.h>
#include <sys/queue.h>
#include <sys/stat.h>
+#include <sys/sysctl.h>
#include <err.h>
#include <fcntl.h>
@@ -41,8 +41,7 @@
#include "acpidump.h"
-static char machdep_acpi_root[] = "machdep.acpi_root";
-
+static char machdep_acpi_root[] = "machdep.acpi_root";
static int acpi_mem_fd = -1;
struct acpi_user_mapping {
@@ -55,7 +54,7 @@ struct acpi_user_mapping {
LIST_HEAD(acpi_user_mapping_list, acpi_user_mapping) maplist;
static void
-acpi_user_init()
+acpi_user_init(void)
{
if (acpi_mem_fd == -1) {
@@ -96,31 +95,32 @@ acpi_user_find_mapping(vm_offset_t pa, size_t size)
/*
* Public interfaces
*/
-
struct ACPIrsdp *
acpi_find_rsd_ptr()
{
struct ACPIrsdp rsdp;
u_long addr;
- int len;
+ size_t len;
acpi_user_init();
+ /* Attempt to use sysctl to find RSD PTR record */
len = sizeof(addr);
if (sysctlbyname(machdep_acpi_root, &addr, &len, NULL, 0) == 0) {
pread(acpi_mem_fd, &rsdp, sizeof(rsdp), addr);
- if (memcmp(rsdp.signature, "RSD PTR ", 8))
- errx(1, "sysctl %s does not point to RSDP\n",
- machdep_acpi_root);
+ if (memcmp(rsdp.signature, "RSD PTR ", 8) != 0)
+ errx(1, "sysctl %s does not point to RSDP",
+ machdep_acpi_root);
len = 20; /* size of ACPI 1.0 table */
if (acpi_checksum(&rsdp, len))
- warnx("RSDP has invalid checksum\n");
+ warnx("RSDP has invalid checksum");
if (rsdp.revision > 0)
len = rsdp.length;
return (acpi_map_physical(addr, len));
}
-#if !defined(__ia64__)
+#if !defined(__ia64__) && !defined(__amd64__)
+ /* On ia32, scan physical memory for RSD PTR if above failed */
for (addr = 0UL; addr < 1024UL * 1024UL; addr += 16UL) {
pread(acpi_mem_fd, &rsdp, 8, addr);
if (memcmp(rsdp.signature, "RSD PTR ", 8))
@@ -148,35 +148,28 @@ acpi_map_physical(vm_offset_t pa, size_t size)
return (map->va + (pa - map->pa));
}
-void
-acpi_load_dsdt(char *dumpfile, u_int8_t **dpp, u_int8_t **endp)
+struct ACPIsdt *
+dsdt_load_file(char *infile)
{
- u_int8_t *dp;
- u_int8_t *end;
- struct stat sb;
+ struct ACPIsdt *sdt;
+ uint8_t *dp;
+ struct stat sb;
- if ((acpi_mem_fd = open(dumpfile, O_RDONLY)) == -1) {
- errx(1, "opening %s\n", dumpfile);
- }
+ if ((acpi_mem_fd = open(infile, O_RDONLY)) == -1)
+ errx(1, "opening %s", infile);
LIST_INIT(&maplist);
- if (fstat(acpi_mem_fd, &sb) == -1) {
- errx(1, "fstat %s\n", dumpfile);
- }
+ if (fstat(acpi_mem_fd, &sb) == -1)
+ errx(1, "fstat %s", infile);
dp = mmap(0, sb.st_size, PROT_READ, MAP_PRIVATE, acpi_mem_fd, 0);
- if (dp == NULL) {
- errx(1, "mmap %s\n", dumpfile);
- }
+ if (dp == NULL)
+ errx(1, "mmap %s", infile);
- if (strncmp(dp, "DSDT", 4) == 0) {
- memcpy(&dsdt_header, dp, SIZEOF_SDT_HDR);
- dp += SIZEOF_SDT_HDR;
- sb.st_size -= SIZEOF_SDT_HDR;
- }
+ sdt = (struct ACPIsdt *)dp;
+ if (strncmp(dp, "DSDT", 4) != 0 || acpi_checksum(sdt, sdt->len) != 0)
+ return (NULL);
- end = (u_int8_t *) dp + sb.st_size;
- *dpp = dp;
- *endp = end;
+ return (sdt);
}
diff --git a/usr.sbin/acpi/acpidump/acpidump.8 b/usr.sbin/acpi/acpidump/acpidump.8
index ecb0a7e..c2b7f5a 100644
--- a/usr.sbin/acpi/acpidump/acpidump.8
+++ b/usr.sbin/acpi/acpidump/acpidump.8
@@ -34,47 +34,45 @@
.Os
.Sh NAME
.Nm acpidump
-.Nd dump ACPI tables
+.Nd dump ACPI tables and ASL
.Sh SYNOPSIS
.Nm
-.Op Fl r
-.Nm
-.Op Fl r
-.Op Fl o Ar dsdt_file_for_output
-.Nm
-.Op Fl r
-.Op Fl f Ar dsdt_file_for_input
+.Op Fl d
+.Op Fl t
+.Op Fl h
+.Op Fl v
+.Op Fl f Ar dsdt_input
+.Op Fl o Ar dsdt_output
.Sh DESCRIPTION
The
.Nm
-utility analyzes ACPI tables in physical memory and dumps them to
-standard output.
+utility analyzes ACPI tables in physical memory and can dump them to a file.
In addition,
.Nm
-can disassemble AML
+can call
+.Xr iasl 8
+to disassemble AML
(ACPI Machine Language)
found in these tables and dump them as ASL
-(ACPI Source Language).
+(ACPI Source Language)
+to stdout.
.Pp
ACPI tables have an essential data block (the DSDT,
-Differentiated System Description Table),
+Differentiated System Description Table)
that includes information used on the kernel side such as
detailed information about PnP hardware, procedures for controlling
-power management support and so on.
+power management support, and so on.
The
.Nm
utility can extract the DSDT data block from physical memory and store it into
-a DSDT data file, and also can generate an output in ASL
-from a given DSDT data file.
+a DSDT output file and optionally also disassemble it.
.Pp
When
.Nm
is invoked without the
.Fl f
-option, it will read ACPI tables from physical
-memory via a special file
-.Pa /dev/mem
-and dump them.
+option, it will read ACPI tables from physical memory via
+.Pa /dev/mem .
First it searches for the RSDP
(Root System Description Pointer),
which has the signature
@@ -89,65 +87,74 @@ called SDTs
and their header has a common format which consists of items
such as Signature, Length, Revision, Checksum, OEMID, OEM Table ID,
OEM Revision, Creator ID and Creator Revision.
-The
+When invoked with the
+.Fl t
+flag, the
.Nm
-utility dumps contents of these SDTs.
-For further information about formats of each table,
-see chapter 5:
-.Dq ACPI Software Programming Model
-from the ACPI specifications referenced below.
+utility dumps contents of the following tables:
.Pp
-There is always a pointer to a physical memory address in RSDT for FACP
+.Bl -tag -offset indent -width 12345 -compact
+.It DSDT
+.It FADT
+.It HPET
+.It MADT
+.It RSD PTR
+.It RSDT
+.El
+.Pp
+The RSDT contains a pointer to the physical memory address of the FACP
(Fixed ACPI Description Table).
The FACP defines static system information about power management support
(ACPI Hardware Register Implementation)
-such as interrupt mode
-(INT_MODEL),
-SCI interrupt number, SMI command port
-(SMI_CMD)
-and location of ACPI registers.
-The FACP also has a pointer to a physical memory address for DSDT,
-which includes information used on the kernel side such as
-PnP, power management support and so on.
-While the other tables are described in fixed format,
-the DSDT consists of AML data which is compiled from sources
-written in free formated ASL, which is the description language for ACPI.
-When
-.Nm
-outputs DSDT, it disassembles the AML data and
-formats it as ASL.
+such as interrupt mode (INT_MODEL),
+SCI interrupt number, SMI command port (SMI_CMD)
+and the location of ACPI registers.
+The FACP also has a pointer to a physical memory address for the DSDT.
+While the other tables are fixed format,
+the DSDT consists of free-formatted AML data.
.Sh OPTIONS
The following options are supported by
.Nm :
.Bl -tag -width indent
-.It Fl o Ar dsdt_file_for_output
-Stores DSDT data block from physical memory into a file specified in
-.Ar dsdt_file_for_output
-in addition to behavior with no option.
-.It Fl f Ar dsdt_file_for_input
-Interprets AML data in DSDT from a file specified in
-.Ar dsdt_file_for_input
-and dumps them in ASL to standard output.
-.It Fl r
-Additionally outputs commented ResourceTemplate() macros for Buffer
-objects that contain valid resource streams.
-These macros are defined in the ACPI 2.0 specification section
-16.2.4.
+.It Fl d
+Disassemble the DSDT into ASL using
+.Xr iasl 8
+and print the results to stdout.
+.It Fl t
+Dump the contents of the various fixed tables listed above.
.It Fl h
Displays usage and exit.
+.It Fl v
+Enable verbose messages.
+.It Fl f Ar dsdt_input
+Load the DSDT from the specified file instead of physical memory.
+Since only the DSDT is stored in the file, the
+.Fl t
+flag may not be used with this option.
+.It Fl o Ar dsdt_output
+Store the DSDT data block from physical memory into the specified file.
.El
.Sh EXAMPLES
-This is an example to get a dump of SDTs and a DSDT data file
-simultaneously on a machine that supports ACPI BIOS.
+This example dumps the DSDT from physical memory to foo.dsdt.
+It also prints the contents of various system tables and disassembles
+the AML contained in the DSDT to stdout, redirecting the output
+to foo.asl.
+.Bd -literal -offset indent
+# acpidump -t -d -o foo.dsdt > foo.asl
+.Ed
+.Pp
+This example reads a DSDT file and disassembles it to stdout.
+Verbose messages are enabled.
.Bd -literal -offset indent
-# acpidump -o foo.dsdt > foo.asl
+# acpidump -v -d -f foo.dsdt
.Ed
.Sh BUGS
In the current implementation,
.Nm
-doesn't dump any information of Firmware ACPI Control Structure
-(FACS)
-specified by a pointer in FACP.
+doesn't dump the Firmware ACPI Control Structure (FACS),
+Secondary System Descriptor Table (SSDT),
+Embedded Controller Descriptor Table (ECDT),
+or BOOT structures.
.Sh FILES
.Bl -tag -width /dev/mem
.It Pa /dev/mem
@@ -156,16 +163,8 @@ specified by a pointer in FACP.
.Xr acpi 4 ,
.Xr mem 4 ,
.Xr acpiconf 8 ,
-.Xr amldb 8
-.Pp
-.Dq Advanced Configuration and Power Interface Specification
-.Bd -literal -offset indent -compact
-Intel
-Microsoft
-Toshiba
-Revision 1.0b, 2.0
-.Ed
-<URL:http://www.teleport.com/~acpi/>
+.Xr acpidb 8 ,
+.Xr iasl 8
.Sh AUTHORS
.An Doug Rabson Aq dfr@FreeBSD.org
.An Mitsuru IWASAKI Aq iwasaki@FreeBSD.org
@@ -183,5 +182,9 @@ and
.Sh HISTORY
The
.Nm
-utility appeared in
-.Fx 5.0 .
+utility first appeared in
+.Fx 5.0
+and was rewritten to use
+.Xr iasl 8
+for
+.Fx 5.2 .
diff --git a/usr.sbin/acpi/acpidump/acpidump.c b/usr.sbin/acpi/acpidump/acpidump.c
index df6ce1f6..8e27a4e 100644
--- a/usr.sbin/acpi/acpidump/acpidump.c
+++ b/usr.sbin/acpi/acpidump/acpidump.c
@@ -23,56 +23,29 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: acpidump.c,v 1.3 2000/08/08 14:12:21 iwasaki Exp $
* $FreeBSD$
*/
#include <sys/param.h>
-
#include <assert.h>
#include <err.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include "acpidump.h"
-static void
-asl_dump_from_file(char *file)
-{
- u_int8_t *dp;
- u_int8_t *end;
- struct ACPIsdt *dsdt;
-
- acpi_load_dsdt(file, &dp, &end);
- acpi_dump_dsdt(dp, end);
-}
-
-static void
-asl_dump_from_devmem()
-{
- struct ACPIrsdp *rp;
- struct ACPIsdt *rsdp;
-
- rp = acpi_find_rsd_ptr();
- if (!rp)
- errx(1, "Can't find ACPI information\n");
-
- acpi_print_rsd_ptr(rp);
- rsdp = (struct ACPIsdt *) acpi_map_sdt(rp->rsdt_addr);
- if (memcmp(rsdp->signature, "RSDT", 4) ||
- acpi_checksum(rsdp, rsdp->len))
- errx(1, "RSDT is corrupted\n");
-
- acpi_handle_rsdt(rsdp);
-}
+int dflag; /* Disassemble AML using iasl(8) */
+int tflag; /* Dump contents of SDT tables */
+int vflag; /* Use verbose messages */
static void
usage(const char *progname)
{
- printf("usage:\t%s [-r] [-o dsdt_file_for_output]\n", progname);
- printf("\t%s [-r] [-f dsdt_file_for_input]\n", progname);
- printf("\t%s [-h]\n", progname);
+ fprintf(stderr, "usage: %s [-d] [-t] [-h] [-v] [-f dsdt_input] "
+ "[-o dsdt_output]\n", progname);
exit(1);
}
@@ -80,28 +53,87 @@ int
main(int argc, char *argv[])
{
char c, *progname;
+ char *dsdt_input_file, *dsdt_output_file;
+ struct ACPIsdt *sdt;
+ dsdt_input_file = dsdt_output_file = NULL;
progname = argv[0];
- while ((c = getopt(argc, argv, "f:o:hr")) != -1) {
+
+ if (argc < 2)
+ usage(progname);
+
+ while ((c = getopt(argc, argv, "dhtvf:o:")) != -1) {
switch (c) {
+ case 'd':
+ dflag = 1;
+ break;
+ case 't':
+ tflag = 1;
+ break;
+ case 'v':
+ vflag = 1;
+ break;
case 'f':
- asl_dump_from_file(optarg);
- return (0);
+ dsdt_input_file = optarg;
+ break;
case 'o':
- aml_dumpfile = optarg;
+ dsdt_output_file = optarg;
break;
case 'h':
- usage(progname);
- break;
- case 'r':
- rflag++;
- break;
default:
- argc -= optind;
- argv += optind;
+ usage(progname);
+ /* NOTREACHED */
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ /* Get input either from file or /dev/mem */
+ if (dsdt_input_file != NULL) {
+ if (dflag == 0 && tflag == 0) {
+ warnx("Need to specify -d or -t with DSDT input file");
+ usage(progname);
+ } else if (tflag != 0) {
+ warnx("Can't use -t with DSDT input file");
+ usage(progname);
}
+ if (vflag)
+ warnx("loading DSDT file: %s", dsdt_input_file);
+ sdt = dsdt_load_file(dsdt_input_file);
+ } else {
+ if (vflag)
+ warnx("loading RSD PTR from /dev/mem");
+ sdt = sdt_load_devmem();
+ }
+
+ /* Display misc. SDT tables (only available when using /dev/mem) */
+ if (tflag) {
+ if (vflag)
+ warnx("printing various SDT tables");
+ sdt_print_all(sdt);
+ }
+
+ /* Translate RSDT to DSDT pointer */
+ if (dsdt_input_file == NULL) {
+ sdt = sdt_from_rsdt(sdt, "FACP");
+ sdt = dsdt_from_facp((struct FACPbody *)sdt->body);
+ }
+
+ /* Dump the DSDT to a file */
+ if (dsdt_output_file != NULL) {
+ if (vflag)
+ warnx("saving DSDT file: %s", dsdt_output_file);
+ dsdt_save_file(dsdt_output_file, sdt);
+ }
+
+ /* Disassemble the DSDT into ASL */
+ if (dflag) {
+ if (vflag)
+ warnx("disassembling DSDT, iasl messages follow");
+ aml_disassemble(sdt);
+ if (vflag)
+ warnx("iasl processing complete");
}
- asl_dump_from_devmem();
- return (0);
+ exit(0);
}
diff --git a/usr.sbin/acpi/acpidump/acpidump.h b/usr.sbin/acpi/acpidump/acpidump.h
index 5863c9c..31aeb28 100644
--- a/usr.sbin/acpi/acpidump/acpidump.h
+++ b/usr.sbin/acpi/acpidump/acpidump.h
@@ -24,7 +24,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: acpidump.h,v 1.3 2000/08/09 14:47:52 iwasaki Exp $
* $FreeBSD$
*/
@@ -154,9 +153,9 @@ struct FACS {
u_int32_t g_lock; /* bit field */
/* 5.2.6.1 Global Lock */
#define ACPI_GLOBAL_LOCK_PENDING 1
-#define ACPI_GLOBAL_LOCK_OWNED 2
+#define ACPI_GLOBAL_LOCK_OWNED 2
u_int32_t flags; /* bit field */
-#define ACPI_FACS_FLAG_S4BIOS_F 1 /* Supports S4BIOS_SEQ */
+#define ACPI_FACS_FLAG_S4BIOS_F 1 /* Supports S4BIOS_SEQ */
char reserved[40];
} __packed;
@@ -261,7 +260,7 @@ struct MADT_APIC {
struct MADTbody {
u_int32_t lapic_addr;
u_int32_t flags;
-#define ACPI_APIC_FLAG_PCAT_COMPAT 1 /* Syetem has dual-8259 setup. */
+#define ACPI_APIC_FLAG_PCAT_COMPAT 1 /* System has dual-8259 setup. */
u_char body[1];
} __packed;
@@ -278,6 +277,7 @@ struct HPETbody {
u_int16_t clock_tick __packed;
} __packed;
+#if 0
void *acpi_map_physical(vm_offset_t, size_t);
struct ACPIrsdp *acpi_find_rsd_ptr(void);
int acpi_checksum(void *, size_t);
@@ -287,17 +287,39 @@ void acpi_print_sdt(struct ACPIsdt *);
void acpi_print_rsdt(struct ACPIsdt *);
void acpi_print_facp(struct FACPbody *);
void acpi_print_dsdt(struct ACPIsdt *);
-
-void asl_dump_termobj(u_int8_t **, int);
-void asl_dump_objectlist(u_int8_t **, u_int8_t *, int);
-
-void aml_dump(struct ACPIsdt *);
-
void acpi_handle_rsdt(struct ACPIsdt *);
void acpi_load_dsdt(char *, u_int8_t **, u_int8_t **);
void acpi_dump_dsdt(u_int8_t *, u_int8_t *);
-extern char *aml_dumpfile;
-extern struct ACPIsdt dsdt_header;
-extern int rflag;
+#endif
+
+/* Find and map the RSD PTR structure and return it for parsing */
+struct ACPIsdt *sdt_load_devmem(void);
+
+/*
+ * Load the DSDT from a previous save file. Note that other tables are
+ * not saved (i.e. FADT)
+ */
+struct ACPIsdt *dsdt_load_file(char *);
+
+/* Save the DSDT to a file */
+void dsdt_save_file(char *, struct ACPIsdt *);
+
+/* Print out as many fixed tables as possible, given the RSD PTR */
+void sdt_print_all(struct ACPIsdt *);
+
+/* Disassemble the AML in the DSDT */
+void aml_disassemble(struct ACPIsdt *);
+
+/* Routines for accessing tables in physical memory */
+struct ACPIrsdp *acpi_find_rsd_ptr(void);
+void * acpi_map_physical(vm_offset_t, size_t);
+struct ACPIsdt *sdt_from_rsdt(struct ACPIsdt *, const char *);
+struct ACPIsdt *dsdt_from_facp(struct FACPbody *);
+int acpi_checksum(void *, size_t);
+
+/* Command line flags */
+extern int dflag;
+extern int tflag;
+extern int vflag;
#endif /* !_ACPIDUMP_H_ */
diff --git a/usr.sbin/acpi/acpidump/aml_dump.c b/usr.sbin/acpi/acpidump/aml_dump.c
deleted file mode 100644
index 434001f..0000000
--- a/usr.sbin/acpi/acpidump/aml_dump.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*-
- * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: aml_dump.c,v 1.3 2000/08/08 14:12:21 iwasaki Exp $
- * $FreeBSD$
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "acpidump.h"
-
-char *aml_dumpfile = NULL;
-
-void
-aml_dump(struct ACPIsdt *dsdp)
-{
- int fd;
- mode_t mode;
-
- if (aml_dumpfile == NULL) {
- return;
- }
-
- mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- fd = open(aml_dumpfile, O_WRONLY | O_CREAT | O_TRUNC, mode);
- if (fd == -1) {
- return;
- }
- write(fd, dsdp, SIZEOF_SDT_HDR);
- write(fd, dsdp->body, dsdp->len - SIZEOF_SDT_HDR);
- close(fd);
-}
-
diff --git a/usr.sbin/acpi/acpidump/asl_dump.c b/usr.sbin/acpi/acpidump/asl_dump.c
deleted file mode 100644
index 2d645a1..0000000
--- a/usr.sbin/acpi/acpidump/asl_dump.c
+++ /dev/null
@@ -1,1644 +0,0 @@
-/*-
- * Copyright (c) 1999 Doug Rabson
- * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: asl_dump.c,v 1.6 2000/08/09 14:47:52 iwasaki Exp $
- * $FreeBSD$
- */
-
-#include <sys/param.h>
-
-#include <assert.h>
-#include <err.h>
-#include <stdio.h>
-
-#include "acpidump.h"
-
-#include "aml/aml_env.h"
-
-struct aml_environ asl_env;
-int rflag;
-
-static u_int32_t
-asl_dump_pkglength(u_int8_t **dpp)
-{
- u_int8_t *dp;
- u_int32_t pkglength;
-
- dp = *dpp;
- pkglength = *dp++;
- switch (pkglength >> 6) {
- case 0:
- break;
- case 1:
- pkglength = (pkglength & 0xf) + (dp[0] << 4);
- dp += 1;
- break;
- case 2:
- pkglength = (pkglength & 0xf) + (dp[0] << 4) + (dp[1] << 12);
- dp += 2;
- break;
- case 3:
- pkglength = (pkglength & 0xf)
- + (dp[0] << 4) + (dp[1] << 12) + (dp[2] << 20);
- dp += 3;
- break;
- }
-
- *dpp = dp;
- return (pkglength);
-}
-
-static void
-print_nameseg(u_int8_t *dp)
-{
-
- if (dp[3] != '_')
- printf("%c%c%c%c", dp[0], dp[1], dp[2], dp[3]);
- else if (dp[2] != '_')
- printf("%c%c%c_", dp[0], dp[1], dp[2]);
- else if (dp[1] != '_')
- printf("%c%c__", dp[0], dp[1]);
- else if (dp[0] != '_')
- printf("%c___", dp[0]);
-}
-
-static u_int8_t
-asl_dump_bytedata(u_int8_t **dpp)
-{
- u_int8_t *dp;
- u_int8_t data;
-
- dp = *dpp;
- data = dp[0];
- *dpp = dp + 1;
- return (data);
-}
-
-static u_int16_t
-asl_dump_worddata(u_int8_t **dpp)
-{
- u_int8_t *dp;
- u_int16_t data;
-
- dp = *dpp;
- data = dp[0] + (dp[1] << 8);
- *dpp = dp + 2;
- return (data);
-}
-
-static u_int32_t
-asl_dump_dworddata(u_int8_t **dpp)
-{
- u_int8_t *dp;
- u_int32_t data;
-
- dp = *dpp;
- data = dp[0] + (dp[1] << 8) + (dp[2] << 16) + (dp[3] << 24);
- *dpp = dp + 4;
- return (data);
-}
-
-static u_int8_t *
-asl_dump_namestring(u_int8_t **dpp)
-{
- u_int8_t *dp;
- u_int8_t *name;
-
- dp = *dpp;
- name = dp;
- if (dp[0] == '\\')
- dp++;
- else if (dp[0] == '^')
- while (dp[0] == '^')
- dp++;
- if (dp[0] == 0x00) /* NullName */
- dp++;
- else if (dp[0] == 0x2e) /* DualNamePrefix */
- dp += 1 + 4 + 4;/* NameSeg, NameSeg */
- else if (dp[0] == 0x2f) { /* MultiNamePrefix */
- int segcount = dp[1];
- dp += 1 + 1 + segcount * 4; /* segcount * NameSeg */
- } else
- dp += 4; /* NameSeg */
-
- *dpp = dp;
- return (name);
-}
-
-static void
-print_namestring(u_int8_t *dp)
-{
-
- if (dp[0] == '\\') {
- putchar(dp[0]);
- dp++;
- } else if (dp[0] == '^') {
- while (dp[0] == '^') {
- putchar(dp[0]);
- dp++;
- }
- }
- if (dp[0] == 0x00) { /* NullName */
- /* printf("<null>"); */
- dp++;
- } else if (dp[0] == 0x2e) { /* DualNamePrefix */
- print_nameseg(dp + 1);
- putchar('.');
- print_nameseg(dp + 5);
- } else if (dp[0] == 0x2f) { /* MultiNamePrefix */
- int segcount = dp[1];
- int i;
- for (i = 0, dp += 2; i < segcount; i++, dp += 4) {
- if (i > 0)
- putchar('.');
- print_nameseg(dp);
- }
- } else /* NameSeg */
- print_nameseg(dp);
-}
-
-static void
-print_indent(int indent)
-{
- int i;
-
- for (i = 0; i < indent; i++)
- printf(" ");
-}
-
-#define ASL_ENTER_SCOPE(dp_orig, old_name) do { \
- u_int8_t *dp_copy; \
- u_int8_t *name; \
- old_name = asl_env.curname; \
- dp_copy = dp_orig; \
- name = asl_dump_namestring(&dp_copy); \
- asl_env.curname = aml_search_name(&asl_env, name); \
-} while(0)
-
-#define ASL_LEAVE_SCOPE(old_name) do { \
- asl_env.curname = old_name; \
-} while(0)
-
-#define ASL_CREATE_LOCALNAMEOBJ(dp) do { \
- if(scope_within_method){ \
- aml_create_name(&asl_env, dp); \
- } \
-}while(0);
-
-static void
-asl_dump_defscope(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int32_t pkglength;
- struct aml_name *oname;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
-
- printf("Scope(");
- ASL_ENTER_SCOPE(dp, oname);
- asl_dump_termobj(&dp, indent);
- printf(") {\n");
- end = start + pkglength;
- asl_dump_objectlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
- ASL_LEAVE_SCOPE(oname);
- *dpp = dp;
-}
-
-static void
-asl_dump_resourcebuffer(u_int8_t *dp, u_int8_t *end, int indent)
-{
- u_int8_t *p;
- int print, len, name, indep, i, ofs;
-
- print = 0;
- indep = 0;
-restart:
- if (print) {
- printf("\n");
- print_indent(indent);
- printf("/* ResourceTemplate() {\n");
- }
- for (p = dp; p < end; ) {
- ofs = p - dp;
- if (*p & 0x80) { /* large resource */
- if ((end - p) < 3) {
- return;
- }
- name = *p;
- len = ((int)*(p + 2) << 8) + *(p + 1);
- p += 3;
- } else { /* small resource */
- name = (*p >> 3) & 0x0f;
- len = *p & 0x7;
- p++;
- }
- if (name == 0xf) { /* end tag */
- if (print == 0) {
- print = 1;
- goto restart;
- } else {
- print_indent(indent);
- printf("} */\n");
- print_indent(indent);
- break;
- }
- }
-
- if (print) {
- print_indent(indent);
- switch (name) {
- case 0x06:
- if (indep) {
- printf(" }\n");
- print_indent(indent);
- }
- printf(" StartDependentFn(");
- if (len == 1)
- printf("%d, %d",
- *p & 0x3,
- (*p >> 2) & 0x3);
- printf(") {\n");
- indep = 1;
- continue;
- case 0x07:
- if (indep)
- printf(" }\n");
- print_indent(indent);
- printf(" EndDependentFn() {}\n");
- indep = 0;
- continue;
- }
-
- printf("%s 0x%-04.4x ", indep ? " " : "", ofs);
- switch (name) {
- case 0x04: /* IRQ() { } */
- {
- int i, first;
-
- printf("IRQ(");
- if (len == 3) {
- printf("%s, Active%s, %s",
- *(p + 2) & 0x01 ? "Edge" : "Level",
- *(p + 2) & 0x08 ? "Low" : "High",
- *(p + 2) & 0x10 ? "Shared" :
- "Exclusive");
- }
- printf(")");
- first = 1;
- for (i = 0; i < 16; i++) {
- if (*(p + (i / 8)) & (1 << (i % 8))) {
- if (first) {
- printf(" {");
- first = 0;
- } else {
- printf(", ");
- }
- printf("%d", i);
- }
- }
- if (!first)
- printf("}");
- printf("\n");
- break;
- }
-
- case 0x05: /* DMA() { } */
- {
- int i, first;
-
- printf("DMA(%s, %sBusMaster, Transfer%s)",
- (*(p + 1) & 0x60) == 0 ? "Compatibility" :
- (*(p + 1) & 0x60) == 1 ? "TypeA" :
- (*(p + 1) & 0x60) == 2 ? "TypeB" : "TypeF",
- *(p + 1) & 0x04 ? "" : "Not",
- (*(p + 1) & 0x03) == 0 ? "8" :
- (*(p + 1) & 0x03) == 1 ? "8_16" : "16");
- first = 1;
- for (i = 0; i < 8; i++) {
- if (*p & (1 << i)) {
- if (first) {
- printf(" {");
- first = 0;
- } else {
- printf(", ");
- }
- printf("%d", i);
- }
- }
- if (!first)
- printf("}");
- printf("\n");
- break;
- }
- case 0x08: /* IO() */
- printf("IO(Decode%s, 0x%x, 0x%x, 0x%x, 0x%x)\n",
- *p & 0x01 ? "16" : "10",
- (int)*(u_int16_t *)(p + 1),
- (int)*(u_int16_t *)(p + 3),
- *(p + 5),
- *(p + 6));
- break;
-
- case 0x09: /* FixedIO() */
- printf("FixedIO(0x%x, 0x%x)\n",
- *p + ((int)*(p + 1) << 8),
- *(p + 2));
- break;
-
- case 0x0e: /* VendorShort() { }*/
- case 0x84: /* VendorLong() { } */
- {
- int i, first;
-
- printf("Vendor%s()", name == 0x0e ? "Short" : "Long");
- first = 0;
- for (i = 0; i < len; i++) {
- if (first) {
- printf(" {");
- first = 0;
- } else {
- printf(", ");
- }
- printf("0x%02x", *(p + i));
- }
- if (!first)
- printf("}");
- printf("\n");
- break;
- }
- case 0x81: /* Memory24() */
- printf("Memory24(Read%s, 0x%06x, 0x%06x, 0x%x, 0x%x)\n",
- *p & 0x01 ? "Write" : "Only",
- (u_int32_t)*(u_int16_t *)(p + 1) << 8,
- (u_int32_t)*(u_int16_t *)(p + 3) << 8,
- (int)*(u_int16_t *)(p + 5),
- (int)*(u_int16_t *)(p + 7));
- break;
-
- case 0x82: /* Register() */
- printf("Register(%s, %d, %d, 0x%016llx)\n",
- *p == 0x00 ? "SystemMemory" :
- *p == 0x01 ? "SystemIO" :
- *p == 0x02 ? "PCIConfigSpace" :
- *p == 0x03 ? "EmbeddedController" :
- *p == 0x04 ? "SMBus" :
- *p == 0x7f ? "FunctionalFixedHardware" : "Unknown",
- *(p + 1),
- *(p + 2),
- *(u_int64_t *)(p + 3));
- break;
-
- case 0x85: /* Memory32() */
- printf("Memory32(Read%s, 0x%08x, 0x%08x, 0x%x, 0x%x)\n",
- *p & 0x01 ? "Write" : "Only",
- *(u_int32_t *)(p + 1),
- *(u_int32_t *)(p + 5),
- *(u_int32_t *)(p + 9),
- *(u_int32_t *)(p + 13));
- break;
-
- case 0x86: /* Memory32Fixed() */
- printf("Memory32Fixed(Read%s, 0x%08x, 0x%x)\n",
- *p & 0x01 ? "Write" : "Only",
- *(u_int32_t *)(p + 1),
- *(u_int32_t *)(p + 5));
- break;
-
- case 0x87: /* DWordMemory() / DWordIO() */
- case 0x88: /* WordMemory() / WordIO() */
- case 0x8a: /* QWordMemory() / QWordIO() */
- {
- u_int64_t granularity, minimum, maximum, translation, length;
- char *size, *source;
- int index, slen;
-
- switch (name) {
- case 0x87:
- size = "D";
- granularity = *(u_int32_t *)(p + 3);
- minimum = *(u_int32_t *)(p + 7);
- maximum = *(u_int32_t *)(p + 11);
- translation = *(u_int32_t *)(p + 15);
- length = *(u_int32_t *)(p + 19);
- index = *(p + 23);
- source = p + 24;
- slen = len - 24;
- break;
- case 0x88:
- size = "";
- granularity = *(u_int16_t *)(p + 3);
- minimum = *(u_int16_t *)(p + 5);
- maximum = *(u_int16_t *)(p + 7);
- translation = *(u_int16_t *)(p + 9);
- length = *(u_int16_t *)(p + 11);
- index = *(p + 13);
- source = p + 14;
- slen = len - 14;
- break;
- case 0x8a:
- size = "Q";
- granularity = *(u_int64_t *)(p + 3);
- minimum = *(u_int64_t *)(p + 11);
- maximum = *(u_int64_t *)(p + 19);
- translation = *(u_int64_t *)(p + 27);
- length = *(u_int64_t *)(p + 35);
- index = *(p + 43);
- source = p + 44;
- slen = len - 44;
- break;
- }
- switch(*p) {
- case 0:
- printf("%sWordMemory("
- "Resource%s, "
- "%sDecode, "
- "Min%sFixed, "
- "Max%sFixed, "
- "%s, "
- "Read%s, "
- "0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, "
- "%d, '%.*s', "
- "AddressRange%s, "
- "Type%s)\n",
- size,
- *(p + 1) & 0x01 ? "Consumer" : "Producer",
- *(p + 1) & 0x02 ? "Sub" : "Pos",
- *(p + 1) & 0x04 ? "" : "Not",
- *(p + 1) & 0x08 ? "" : "Not",
- (*(p + 2) >> 1) == 0 ? "NonCacheable" :
- (*(p + 2) >> 1) == 1 ? "Cacheable" :
- (*(p + 2) >> 1) == 2 ? "WriteCombining" :
- "Prefetchable",
- *(p + 2) & 0x01 ? "Write" : "Only",
- granularity, minimum, maximum, translation, length,
- index, slen, source,
- ((*(p + 2) >> 3) & 0x03) == 0 ? "Memory" :
- ((*(p + 2) >> 3) & 0x03) == 1 ? "Reserved" :
- ((*(p + 2) >> 3) & 0x03) == 2 ? "ACPI" : "NVS",
- *(p + 2) & 0x20 ? "Translation" : "Static");
- break;
- case 1:
- printf("%sWordIO("
- "Resource%s, "
- "Min%sFixed, "
- "Max%sFixed, "
- "%sDecode, "
- "%s, "
- "0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, "
- "%d, '%.*s', "
- "Type%s, "
- "%sTranslation)\n",
- size,
- *(p + 1) & 0x01 ? "Consumer" : "Producer",
- *(p + 1) & 0x04 ? "" : "Not",
- *(p + 1) & 0x08 ? "" : "Not",
- *(p + 1) & 0x02 ? "Sub" : "Pos",
- (*(p + 2) & 0x03) == 0 ? "EntireRange" :
- (*(p + 2) & 0x03) == 1 ? "NonISAOnlyRanges" :
- (*(p + 2) & 0x03) == 2 ? "ISAOnlyRanges" : "EntireRange",
- granularity, minimum, maximum, translation, length,
- index, slen, source,
- *(p + 2) & 0x10 ? "Translation" : "Static",
- *(p + 2) & 0x20 ? "Sparse" : "Dense");
- break;
- case 2:
- printf("%sWordBus("
- "Resource%s, "
- "%sDecode, "
- "Min%sFixed, "
- "Max%sFixed, "
- "0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, "
- "%d, '%.*s')\n",
- size,
- *(p + 1) & 0x01 ? "Consumer" : "Producer",
- *(p + 1) & 0x02 ? "Sub" : "Pos",
- *(p + 1) & 0x04 ? "" : "Not",
- *(p + 1) & 0x08 ? "" : "Not",
- granularity, minimum, maximum, translation, length,
- index, slen, source);
- break;
- default:
- printf("%sWordUnknown()\n", size);
- }
- break;
- }
- case 0x89: /* Interrupt() { } */
- {
- int i, first, pad, sl;
- char *rp;
-
- pad = *(p + 1) * 4;
- rp = p + 1 + pad;
- sl = len - pad - 3;
- printf("Interrupt(Resource%s, %s, Active%s, %s, %d, %.*s)",
- *p & 0x01 ? "Producer" : "Consumer",
- *p & 0x02 ? "Edge" : "Level",
- *p & 0x04 ? "Low" : "High",
- *p & 0x08 ? "Shared" : "Exclusive",
- (int)*(p + 1 + pad),
- sl,
- rp);
- first = 1;
- for (i = 0; i < *(p + 1); i++) {
- if (first) {
- printf(" {");
- first = 0;
- } else {
- printf(", ");
- }
- printf("%u", *(u_int32_t *)(p + 2 + (i * 4)));
- }
- if (!first)
- printf("}");
- printf("\n");
- break;
- }
- default:
- printf("Unknown(0x%x, %d)\n", name, len);
- break;
- }
- }
- p += len;
- }
-}
-
-static void
-asl_dump_defbuffer(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int32_t pkglength;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
- printf("Buffer(");
- asl_dump_termobj(&dp, indent);
- start = dp;
- printf(") {");
- while (dp < end) {
- printf("0x%x", *dp++);
- if (dp < end)
- printf(", ");
- }
- if (rflag)
- asl_dump_resourcebuffer(start, end, indent);
- printf(" }");
-
- *dpp = dp;
-}
-
-static void
-asl_dump_defpackage(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int8_t numelements;
- u_int32_t pkglength;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- numelements = asl_dump_bytedata(&dp);
- end = start + pkglength;
- printf("Package(0x%x) {\n", numelements);
- while (dp < end) {
- print_indent(indent + 1);
- asl_dump_termobj(&dp, indent + 1);
- printf(",\n");
- }
-
- print_indent(indent);
- printf("}");
-
- dp = end;
-
- *dpp = dp;
-}
-
-int scope_within_method = 0;
-
-static void
-asl_dump_defmethod(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int8_t flags;
- u_int32_t pkglength;
- struct aml_name *oname;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
-
- printf("Method(");
- ASL_ENTER_SCOPE(dp, oname);
- asl_dump_termobj(&dp, indent);
- flags = *dp++;
- if (flags) {
- printf(", %d", flags & 7);
- if (flags & 8) {
- printf(", Serialized");
- }
- }
- printf(") {\n");
- end = start + pkglength;
- scope_within_method = 1;
- asl_dump_objectlist(&dp, end, indent + 1);
- scope_within_method = 0;
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
- ASL_LEAVE_SCOPE(oname);
- *dpp = dp;
-}
-
-
-static void
-asl_dump_defopregion(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- const char *regions[] = {
- "SystemMemory",
- "SystemIO",
- "PCI_Config",
- "EmbeddedControl",
- "SMBus",
- };
-
- dp = *dpp;
- printf("OperationRegion(");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent); /* Name */
- printf(", %s, ", regions[*dp++]); /* Space */
- asl_dump_termobj(&dp, indent); /* Offset */
- printf(", ");
- asl_dump_termobj(&dp, indent); /* Length */
- printf(")");
-
- *dpp = dp;
-}
-
-static const char *accessnames[] = {
- "AnyAcc",
- "ByteAcc",
- "WordAcc",
- "DWordAcc",
- "BlockAcc",
- "SMBSendRecvAcc",
- "SMBQuickAcc"
-};
-
-static int
-asl_dump_field(u_int8_t **dpp, u_int32_t offset)
-{
- u_int8_t *dp;
- u_int8_t *name;
- u_int8_t access, attribute;
- u_int32_t width;
-
- dp = *dpp;
- switch (*dp) {
- case '\\':
- case '^':
- case 'A' ... 'Z':
- case '_':
- case '.':
- case '/':
- ASL_CREATE_LOCALNAMEOBJ(dp);
- name = asl_dump_namestring(&dp);
- width = asl_dump_pkglength(&dp);
- offset += width;
- print_namestring(name);
- printf(",\t%d", width);
- break;
- case 0x00:
- dp++;
- width = asl_dump_pkglength(&dp);
- offset += width;
- if ((offset % 8) == 0) {
- printf("Offset(0x%x)", offset / 8);
- } else {
- printf(",\t%d", width);
- }
- break;
- case 0x01:
- access = dp[1];
- attribute = dp[2];
- dp += 3;
- printf("AccessAs(%s, %d)", accessnames[access], attribute);
- break;
- }
-
- *dpp = dp;
- return (offset);
-}
-
-static void
-asl_dump_fieldlist(u_int8_t **dpp, u_int8_t *end, int indent)
-{
- u_int8_t *dp;
- u_int32_t offset;
-
- dp = *dpp;
- offset = 0;
- while (dp < end) {
- print_indent(indent);
- offset = asl_dump_field(&dp, offset);
- if (dp < end)
- printf(",\n");
- else
- printf("\n");
- }
-
- *dpp = dp;
-}
-
-static void
-asl_dump_deffield(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int8_t flags;
- u_int32_t pkglength;
- static const char *lockrules[] = {"NoLock", "Lock"};
- static const char *updaterules[] = {"Preserve", "WriteAsOnes",
- "WriteAsZeros", "*Error*"};
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("Field(");
- asl_dump_termobj(&dp, indent); /* Name */
- flags = asl_dump_bytedata(&dp);
- printf(", %s, %s, %s) {\n",
- accessnames[flags & 0xf],
- lockrules[(flags >> 4) & 1],
- updaterules[(flags >> 5) & 3]);
- asl_dump_fieldlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- *dpp = dp;
-}
-
-static void
-asl_dump_defindexfield(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int8_t flags;
- u_int32_t pkglength;
- static const char *lockrules[] = {"NoLock", "Lock"};
- static const char *updaterules[] = {"Preserve", "WriteAsOnes",
- "WriteAsZeros", "*Error*"};
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("IndexField(");
- asl_dump_termobj(&dp, indent); /* Name1 */
- printf(", ");
- asl_dump_termobj(&dp, indent); /* Name2 */
- flags = asl_dump_bytedata(&dp);
- printf(", %s, %s, %s) {\n",
- accessnames[flags & 0xf],
- lockrules[(flags >> 4) & 1],
- updaterules[(flags >> 5) & 3]);
- asl_dump_fieldlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- *dpp = dp;
-}
-
-static void
-asl_dump_defbankfield(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int8_t flags;
- u_int32_t pkglength;
- static const char *lockrules[] = {"NoLock", "Lock"};
- static const char *updaterules[] = {"Preserve", "WriteAsOnes",
- "WriteAsZeros", "*Error*"};
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("BankField(");
- asl_dump_termobj(&dp, indent); /* Name1 */
- printf(", ");
- asl_dump_termobj(&dp, indent); /* Name2 */
- printf(", ");
- asl_dump_termobj(&dp, indent); /* BankValue */
- flags = asl_dump_bytedata(&dp);
- printf(", %s, %s, %s) {\n",
- accessnames[flags & 0xf],
- lockrules[(flags >> 4) & 1],
- updaterules[(flags >> 5) & 3]);
- asl_dump_fieldlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- *dpp = dp;
-}
-
-static void
-asl_dump_defdevice(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int32_t pkglength;
- struct aml_name *oname;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("Device(");
- ASL_ENTER_SCOPE(dp, oname);
- asl_dump_termobj(&dp, indent);
- printf(") {\n");
- asl_dump_objectlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- ASL_LEAVE_SCOPE(oname);
- *dpp = dp;
-}
-
-static void
-asl_dump_defprocessor(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int8_t procid;
- u_int8_t pblklen;
- u_int32_t pkglength;
- u_int32_t pblkaddr;
- struct aml_name *oname;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("Processor(");
- ASL_ENTER_SCOPE(dp, oname);
- asl_dump_termobj(&dp, indent);
- procid = asl_dump_bytedata(&dp);
- pblkaddr = asl_dump_dworddata(&dp);
- pblklen = asl_dump_bytedata(&dp);
- printf(", %d, 0x%x, 0x%x) {\n", procid, pblkaddr, pblklen);
- asl_dump_objectlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- ASL_LEAVE_SCOPE(oname);
- *dpp = dp;
-}
-
-static void
-asl_dump_defpowerres(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int8_t systemlevel;
- u_int16_t resourceorder;
- u_int32_t pkglength;
- struct aml_name *oname;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("PowerResource(");
- ASL_ENTER_SCOPE(dp, oname);
- asl_dump_termobj(&dp, indent);
- systemlevel = asl_dump_bytedata(&dp);
- resourceorder = asl_dump_worddata(&dp);
- printf(", %d, %d) {\n", systemlevel, resourceorder);
- asl_dump_objectlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- ASL_LEAVE_SCOPE(oname);
- *dpp = dp;
-}
-
-static void
-asl_dump_defthermalzone(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int32_t pkglength;
- struct aml_name *oname;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("ThermalZone(");
- ASL_ENTER_SCOPE(dp, oname);
- asl_dump_termobj(&dp, indent);
- printf(") {\n");
- asl_dump_objectlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- ASL_LEAVE_SCOPE(oname);
- *dpp = dp;
-}
-
-static void
-asl_dump_defif(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int32_t pkglength;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("If(");
- asl_dump_termobj(&dp, indent);
- printf(") {\n");
- asl_dump_objectlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- *dpp = dp;
-}
-
-static void
-asl_dump_defelse(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int32_t pkglength;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("Else {\n");
- asl_dump_objectlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- *dpp = dp;
-}
-
-static void
-asl_dump_defwhile(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *start;
- u_int8_t *end;
- u_int32_t pkglength;
-
- dp = *dpp;
- start = dp;
- pkglength = asl_dump_pkglength(&dp);
- end = start + pkglength;
-
- printf("While(");
- asl_dump_termobj(&dp, indent);
- printf(") {\n");
- asl_dump_objectlist(&dp, end, indent + 1);
- print_indent(indent);
- printf("}");
-
- assert(dp == end);
-
- *dpp = dp;
-}
-
-/*
- * Public interfaces
- */
-
-void
-asl_dump_termobj(u_int8_t **dpp, int indent)
-{
- u_int8_t *dp;
- u_int8_t *name;
- u_int8_t opcode;
- struct aml_name *method;
- const char *matchstr[] = {
- "MTR", "MEQ", "MLE", "MLT", "MGE", "MGT",
- };
-
-#define OPTARG() do { \
- printf(", "); \
- if (*dp == 0x00) { \
- dp++; \
- } else { \
- asl_dump_termobj(&dp, indent); \
- } \
-} while (0)
-
- dp = *dpp;
- opcode = *dp++;
- switch (opcode) {
- case '\\':
- case '^':
- case 'A' ... 'Z':
- case '_':
- case '.':
- case '/':
- dp--;
- print_namestring((name = asl_dump_namestring(&dp)));
- if (scope_within_method == 1) {
- method = aml_search_name(&asl_env, name);
- if (method != NULL && method->property != NULL &&
- method->property->type == aml_t_method) {
- int i, argnum;
-
- argnum = method->property->meth.argnum & 7;
- printf("(");
- for (i = 0; i < argnum; i++) {
- asl_dump_termobj(&dp, indent);
- if (i < (argnum-1)) {
- printf(", ");
- }
- }
- printf(")");
- }
- }
- break;
- case 0x0a: /* BytePrefix */
- printf("0x%x", asl_dump_bytedata(&dp));
- break;
- case 0x0b: /* WordPrefix */
- printf("0x%04x", asl_dump_worddata(&dp));
- break;
- case 0x0c: /* DWordPrefix */
- printf("0x%08x", asl_dump_dworddata(&dp));
- break;
- case 0x0d: /* StringPrefix */
- printf("\"%s\"", (const char *) dp);
- while (*dp)
- dp++;
- dp++; /* NUL terminate */
- break;
- case 0x00: /* ZeroOp */
- printf("Zero");
- break;
- case 0x01: /* OneOp */
- printf("One");
- break;
- case 0xff: /* OnesOp */
- printf("Ones");
- break;
- case 0x06: /* AliasOp */
- printf("Alias(");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x08: /* NameOp */
- printf("Name(");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x10: /* ScopeOp */
- asl_dump_defscope(&dp, indent);
- break;
- case 0x11: /* BufferOp */
- asl_dump_defbuffer(&dp, indent);
- break;
- case 0x12: /* PackageOp */
- asl_dump_defpackage(&dp, indent);
- break;
- case 0x14: /* MethodOp */
- asl_dump_defmethod(&dp, indent);
- break;
- case 0x5b: /* ExtOpPrefix */
- opcode = *dp++;
- switch (opcode) {
- case 0x01: /* MutexOp */
- printf("Mutex(");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent);
- printf(", %d)", *dp++);
- break;
- case 0x02: /* EventOp */
- printf("Event(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x12: /* CondRefOfOp */
- printf("CondRefOf(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x13: /* CreateFieldOp */
- printf("CreateField(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x20: /* LoadOp */
- printf("Load(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x21: /* StallOp */
- printf("Stall(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x22: /* SleepOp */
- printf("Sleep(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x23: /* AcquireOp */
- printf("Acquire(");
- asl_dump_termobj(&dp, indent);
- printf(", 0x%x)", asl_dump_worddata(&dp));
- break;
- case 0x24: /* SignalOp */
- printf("Signal(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x25: /* WaitOp */
- printf("Wait(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x26: /* ResetOp */
- printf("Reset(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x27: /* ReleaseOp */
- printf("Release(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x28: /* FromBCDOp */
- printf("FromBCD(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x29: /* ToBCDOp */
- printf("ToBCD(");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x2a: /* UnloadOp */
- printf("Unload(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x30:
- printf("Revision");
- break;
- case 0x31:
- printf("Debug");
- break;
- case 0x32: /* FatalOp */
- printf("Fatal(");
- printf("0x%x, ", asl_dump_bytedata(&dp));
- printf("0x%x, ", asl_dump_dworddata(&dp));
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x80: /* OpRegionOp */
- asl_dump_defopregion(&dp, indent);
- break;
- case 0x81: /* FieldOp */
- asl_dump_deffield(&dp, indent);
- break;
- case 0x82: /* DeviceOp */
- asl_dump_defdevice(&dp, indent);
- break;
- case 0x83: /* ProcessorOp */
- asl_dump_defprocessor(&dp, indent);
- break;
- case 0x84: /* PowerResOp */
- asl_dump_defpowerres(&dp, indent);
- break;
- case 0x85: /* ThermalZoneOp */
- asl_dump_defthermalzone(&dp, indent);
- break;
- case 0x86: /* IndexFieldOp */
- asl_dump_defindexfield(&dp, indent);
- break;
- case 0x87: /* BankFieldOp */
- asl_dump_defbankfield(&dp, indent);
- break;
- default:
- errx(1, "strange opcode 0x5b, 0x%x\n", opcode);
- }
- break;
- case 0x68 ... 0x6e: /* ArgN */
- printf("Arg%d", opcode - 0x68);
- break;
- case 0x60 ... 0x67:
- printf("Local%d", opcode - 0x60);
- break;
- case 0x70: /* StoreOp */
- printf("Store(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x71: /* RefOfOp */
- printf("RefOf(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x72: /* AddOp */
- printf("Add(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x73: /* ConcatenateOp */
- printf("Concatenate(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x74: /* SubtractOp */
- printf("Subtract(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x75: /* IncrementOp */
- printf("Increment(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x76: /* DecrementOp */
- printf("Decrement(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x77: /* MultiplyOp */
- printf("Multiply(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x78: /* DivideOp */
- printf("Divide(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- OPTARG();
- printf(")");
- break;
- case 0x79: /* ShiftLeftOp */
- printf("ShiftLeft(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x7a: /* ShiftRightOp */
- printf("ShiftRight(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x7b: /* AndOp */
- printf("And(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x7c: /* NAndOp */
- printf("NAnd(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x7d: /* OrOp */
- printf("Or(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x7e: /* NOrOp */
- printf("NOr(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x7f: /* XOrOp */
- printf("XOr(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x80: /* NotOp */
- printf("Not(");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x81: /* FindSetLeftBitOp */
- printf("FindSetLeftBit(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x82: /* FindSetRightBitOp */
- printf("FindSetRightBit(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x83: /* DerefOp */
- printf("DerefOf(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x86: /* NotifyOp */
- printf("Notify(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x87: /* SizeOfOp */
- printf("SizeOf(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x88: /* IndexOp */
- printf("Index(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- OPTARG();
- printf(")");
- break;
- case 0x89: /* MatchOp */
- printf("Match(");
- asl_dump_termobj(&dp, indent);
- printf(", %s, ", matchstr[*dp++]);
- asl_dump_termobj(&dp, indent);
- printf(", %s, ", matchstr[*dp++]);
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x8a: /* CreateDWordFieldOp */
- printf("CreateDWordField(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x8b: /* CreateWordFieldOp */
- printf("CreateWordField(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x8c: /* CreateByteFieldOp */
- printf("CreateByteField(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x8d: /* CreateBitFieldOp */
- printf("CreateBitField(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- ASL_CREATE_LOCALNAMEOBJ(dp);
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x8e: /* ObjectTypeOp */
- printf("ObjectType(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x90:
- printf("LAnd(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x91:
- printf("LOr(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x92:
- printf("LNot(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x93:
- printf("LEqual(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x94:
- printf("LGreater(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0x95:
- printf("LLess(");
- asl_dump_termobj(&dp, indent);
- printf(", ");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0xa0: /* IfOp */
- asl_dump_defif(&dp, indent);
- break;
- case 0xa1: /* ElseOp */
- asl_dump_defelse(&dp, indent);
- break;
- case 0xa2: /* WhileOp */
- asl_dump_defwhile(&dp, indent);
- break;
- case 0xa3: /* NoopOp */
- printf("Noop");
- break;
- case 0xa5: /* BreakOp */
- printf("Break");
- break;
- case 0xa4: /* ReturnOp */
- printf("Return(");
- asl_dump_termobj(&dp, indent);
- printf(")");
- break;
- case 0xcc: /* BreakPointOp */
- printf("BreakPoint");
- break;
- default:
- errx(1, "strange opcode 0x%x\n", opcode);
- }
-
- *dpp = dp;
-}
-
-void
-asl_dump_objectlist(u_int8_t **dpp, u_int8_t *end, int indent)
-{
- u_int8_t *dp;
-
- dp = *dpp;
- while (dp < end) {
- print_indent(indent);
- asl_dump_termobj(&dp, indent);
- printf("\n");
- }
-
- *dpp = dp;
-}
OpenPOWER on IntegriCloud