git: 3ff9ea7dc2c5 - main - acpidump: Add -T TBLN to print a specific ACPI fixed table

From: Warner Losh <imp_at_FreeBSD.org>
Date: Tue, 15 Oct 2024 11:14:02 UTC
The branch main has been updated by imp:

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

commit 3ff9ea7dc2c52fcb67b7f6234cd351c3e2fbfafd
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2024-10-15 11:10:06 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
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 *);