diff --git a/usr.sbin/acpi/acpidump/acpi.c b/usr.sbin/acpi/acpidump/acpi.c --- a/usr.sbin/acpi/acpidump/acpi.c +++ b/usr.sbin/acpi/acpidump/acpi.c @@ -2643,6 +2643,22 @@ perror("rmdir"); } +void +aml_disassemble_separate(ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp) +{ + ACPI_TABLE_HEADER *ssdt = NULL; + + aml_disassemble(NULL, dsdp); + if (rsdt != NULL) { + for (;;) { + ssdt = sdt_from_rsdt(rsdt, "SSDT", ssdt); + if (ssdt == NULL) + break; + aml_disassemble(NULL, ssdt); + } + } +} + void sdt_print_all(ACPI_TABLE_HEADER *rsdp) { diff --git a/usr.sbin/acpi/acpidump/acpidump.h b/usr.sbin/acpi/acpidump/acpidump.h --- a/usr.sbin/acpi/acpidump/acpidump.h +++ b/usr.sbin/acpi/acpidump/acpidump.h @@ -144,6 +144,7 @@ /* Disassemble the AML in the DSDT */ void aml_disassemble(ACPI_TABLE_HEADER *, ACPI_TABLE_HEADER *); +void aml_disassemble_separate(ACPI_TABLE_HEADER *, ACPI_TABLE_HEADER *); /* Routines for accessing tables in physical memory */ ACPI_TABLE_RSDP *acpi_find_rsd_ptr(void); diff --git a/usr.sbin/acpi/acpidump/acpidump.8 b/usr.sbin/acpi/acpidump/acpidump.8 --- a/usr.sbin/acpi/acpidump/acpidump.8 +++ b/usr.sbin/acpi/acpidump/acpidump.8 @@ -133,13 +133,25 @@ .Nm : .Bl -tag -width indent .It Fl d -Disassemble the DSDT into ASL using +Concatenate the DSDT and the SSDT's into single image and disassemble the image 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 s +Disassemble each of the DSDT and the SSDT's into ASL using +.Xr iasl 8 +and print the results to stdout. +This will avoid +.Xr iasl 8 +error on disassembling concatenated image. +If both +.Fl d +and +.Fl s +are specified, the last option is effective. .It Fl v Enable verbose messages. .It Fl f Ar dsdt_input diff --git a/usr.sbin/acpi/acpidump/acpidump.c b/usr.sbin/acpi/acpidump/acpidump.c --- a/usr.sbin/acpi/acpidump/acpidump.c +++ b/usr.sbin/acpi/acpidump/acpidump.c @@ -65,7 +65,7 @@ if (argc < 2) usage(progname); - while ((c = getopt(argc, argv, "dhtvf:o:")) != -1) { + while ((c = getopt(argc, argv, "dhtvsf:o:")) != -1) { switch (c) { case 'd': dflag = 1; @@ -82,6 +82,9 @@ case 'o': dsdt_output_file = optarg; break; + case 's': + dflag = 2; + break; case 'h': default: usage(progname); @@ -136,7 +139,11 @@ if (dflag) { if (vflag) warnx("disassembling DSDT, iasl messages follow"); - aml_disassemble(rsdt, sdt); + if (dflag == 1) { + aml_disassemble(rsdt, sdt); + } else { + aml_disassemble_separate(rsdt, sdt); + } if (vflag) warnx("iasl processing complete"); }