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.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"); }