The branch main has been updated by imp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=3ff9ea7dc2c52fcb67b7f6234cd351c3e2fbfafd

commit 3ff9ea7dc2c52fcb67b7f6234cd351c3e2fbfafd
Author:     Warner Losh <[email protected]>
AuthorDate: 2024-10-15 11:10:06 +0000
Commit:     Warner Losh <[email protected]>
CommitDate: 2024-10-15 11:10:06 +0000

    acpidump: Add -T TBLN to print a specific ACPI fixed table
    
    Add the ability to dump a specific ACPI table rather than all of them.
    
    Sponsored by:           Netflix
    Reviewed by:            andrew
    Differential Revision:  https://reviews.freebsd.org/D47082
---
 usr.sbin/acpi/acpidump/acpi.c     | 21 +++++++++++++++------
 usr.sbin/acpi/acpidump/acpidump.8 |  4 ++++
 usr.sbin/acpi/acpidump/acpidump.c | 16 ++++++++++++----
 usr.sbin/acpi/acpidump/acpidump.h |  2 +-
 4 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/usr.sbin/acpi/acpidump/acpi.c b/usr.sbin/acpi/acpidump/acpi.c
index 04097e7a5318..18a0ae486387 100644
--- a/usr.sbin/acpi/acpidump/acpi.c
+++ b/usr.sbin/acpi/acpidump/acpi.c
@@ -87,7 +87,7 @@ static void   acpi_print_facs(ACPI_TABLE_FACS *facs);
 static void    acpi_print_dsdt(ACPI_TABLE_HEADER *dsdp);
 static ACPI_TABLE_HEADER *acpi_map_sdt(vm_offset_t pa);
 static void    acpi_print_rsd_ptr(ACPI_TABLE_RSDP *rp);
-static void    acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp);
+static void    acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp, const char *elm);
 static void    acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first,
                    void (*action)(ACPI_SUBTABLE_HEADER *));
 static void    acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first,
@@ -275,7 +275,7 @@ acpi_handle_fadt(ACPI_TABLE_HEADER *sdp)
        if (addr != 0) {
                facs = (ACPI_TABLE_FACS *)acpi_map_sdt(addr);
 
-               if (memcmp(facs->Signature, ACPI_SIG_FACS, 4) != 0 ||
+               if (memcmp(facs->Signature, ACPI_SIG_FACS, ACPI_NAMESEG_SIZE) 
!= 0 ||
                    facs->Length < 64)
                        errx(1, "FACS is corrupt");
                acpi_print_facs(facs);
@@ -2589,7 +2589,7 @@ acpi_report_sdp(ACPI_TABLE_HEADER *sdp)
 }
 
 static void
-acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp)
+acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp, const char *tbl)
 {
        ACPI_TABLE_HEADER *sdp;
        ACPI_TABLE_RSDT *rsdt;
@@ -2597,7 +2597,14 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp)
        vm_offset_t addr;
        int entries, i;
 
-       acpi_print_rsdt(rsdp);
+       if (tbl == NULL) {
+               acpi_print_rsdt(rsdp);
+       } else {
+               if (memcmp(tbl, rsdp->Signature, ACPI_NAMESEG_SIZE) == 0) {
+                       acpi_print_rsdt(rsdp);
+                       return;
+               }
+       }
        rsdt = (ACPI_TABLE_RSDT *)rsdp;
        xsdt = (ACPI_TABLE_XSDT *)rsdp;
        entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
@@ -2614,6 +2621,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp)
                            sdp->Signature);
                        continue;
                }
+               if (tbl != NULL && memcmp(sdp->Signature, tbl, 
ACPI_NAMESEG_SIZE) != 0)
+                       continue;
                acpi_report_sdp(sdp);
        }
 }
@@ -2802,9 +2811,9 @@ aml_disassemble_separate(ACPI_TABLE_HEADER *rsdt, 
ACPI_TABLE_HEADER *dsdp)
 }
 
 void
-sdt_print_all(ACPI_TABLE_HEADER *rsdp)
+sdt_print_all(ACPI_TABLE_HEADER *rsdp, const char *tbl)
 {
-       acpi_handle_rsdt(rsdp);
+       acpi_handle_rsdt(rsdp, tbl);
 }
 
 /* Fetch a table matching the given signature via the RSDT. */
diff --git a/usr.sbin/acpi/acpidump/acpidump.8 
b/usr.sbin/acpi/acpidump/acpidump.8
index 98e0a4d9f524..70a53b479fc4 100644
--- a/usr.sbin/acpi/acpidump/acpidump.8
+++ b/usr.sbin/acpi/acpidump/acpidump.8
@@ -40,6 +40,7 @@
 .Op Fl h
 .Op Fl o Ar dsdt_output
 .Op Fl t
+.Op Fl T Ar table_name
 .Op Fl v
 .Sh DESCRIPTION
 The
@@ -175,6 +176,9 @@ Concatenate the DSDT and the SSDT's into single image and 
disassemble the image
 and print the results to stdout.
 .It Fl t
 Dump the contents of the various fixed tables listed above.
+.It Fl T ar table_name
+Dump the contents of the specific table.
+All ACPI tables are exactly 4 characters long.
 .It Fl h
 Displays usage and exit.
 .It Fl s
diff --git a/usr.sbin/acpi/acpidump/acpidump.c 
b/usr.sbin/acpi/acpidump/acpidump.c
index 0fad7e68ef47..477b56958d1f 100644
--- a/usr.sbin/acpi/acpidump/acpidump.c
+++ b/usr.sbin/acpi/acpidump/acpidump.c
@@ -45,7 +45,7 @@ usage(const char *progname)
 {
 
        fprintf(stderr, "usage: %s [-d] [-t] [-h] [-v] [-f dsdt_input] "
-                       "[-o dsdt_output]\n", progname);
+                       "[-o dsdt_output] [-T table_name]\n", progname);
        fprintf(stderr, "To send ASL:\n\t%s -dt | gzip -c9 > foo.asl.gz\n",
            progname);
        exit(1);
@@ -58,6 +58,7 @@ main(int argc, char *argv[])
        int     c;
        char    *progname;
        char    *dsdt_input_file, *dsdt_output_file;
+       char    *tbl = NULL;
 
        dsdt_input_file = dsdt_output_file = NULL;
        progname = argv[0];
@@ -65,11 +66,18 @@ main(int argc, char *argv[])
        if (argc < 2)
                usage(progname);
 
-       while ((c = getopt(argc, argv, "dhtvsf:o:")) != -1) {
+       while ((c = getopt(argc, argv, "df:ho:tT:vs")) != -1) {
                switch (c) {
                case 'd':
                        dflag = 1;
                        break;
+               case 'T':
+                       tbl = optarg;
+                       if (strlen(tbl) != 4) {
+                               warnx("Illegal table name %s", tbl);
+                               usage(progname);
+                       }
+                       break;
                case 't':
                        tflag = 1;
                        break;
@@ -113,10 +121,10 @@ main(int argc, char *argv[])
        }
 
        /* Display misc. SDT tables (only available when using /dev/mem) */
-       if (tflag) {
+       if (tflag || tbl != NULL) {
                if (vflag)
                        warnx("printing various SDT tables");
-               sdt_print_all(rsdt);
+               sdt_print_all(rsdt, tbl);
        }
 
        /* Translate RSDT to DSDT pointer */
diff --git a/usr.sbin/acpi/acpidump/acpidump.h 
b/usr.sbin/acpi/acpidump/acpidump.h
index 872facbad59d..8755a96dd8af 100644
--- a/usr.sbin/acpi/acpidump/acpidump.h
+++ b/usr.sbin/acpi/acpidump/acpidump.h
@@ -140,7 +140,7 @@ ACPI_TABLE_HEADER *dsdt_load_file(char *);
 void    dsdt_save_file(char *, ACPI_TABLE_HEADER *, ACPI_TABLE_HEADER *);
 
 /* Print out as many fixed tables as possible, given the RSD PTR */
-void    sdt_print_all(ACPI_TABLE_HEADER *);
+void    sdt_print_all(ACPI_TABLE_HEADER *, const char *);
 
 /* Disassemble the AML in the DSDT */
 void    aml_disassemble(ACPI_TABLE_HEADER *, ACPI_TABLE_HEADER *);

Reply via email to