Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/acpitools/acpidump Import acpidump from FreeBSD per...



details:   https://anonhg.NetBSD.org/src/rev/cdf240e4c63a
branches:  trunk
changeset: 750250:cdf240e4c63a
user:      cegger <cegger%NetBSD.org@localhost>
date:      Tue Dec 22 08:44:03 2009 +0000

description:
Import acpidump from FreeBSD per request from jmcneill@
Changes made in the port:
- adapt path to iasl from /usr/sbin/iasl to /usr/bin/iasl
- fix realpath() usage to accomplish NetBSD's behaviour
- use EXIT_FAILURE/EXIT_SUCCESS everywhere
- fix crash on corrupt DSDT file and print proper error message
- implemented additional ACPI table parsers for
  BERT, BOOT, CPEP, DBGP, EINJ, ERST, HEST, MSCT, SBST,
  SLIT, SPCR, TCPA, WAET, WDAT and WDRT

diffstat:

 usr.sbin/acpitools/acpidump/acpidump.c |   147 +-
 usr.sbin/acpitools/acpidump/acpidump.h |   193 +--
 usr.sbin/acpitools/acpidump/aml_dump.c |    65 -
 usr.sbin/acpitools/acpidump/asl_dump.c |  1779 --------------------------------
 4 files changed, 141 insertions(+), 2043 deletions(-)

diffs (truncated from 2258 to 300 lines):

diff -r 567ff53aac0d -r cdf240e4c63a usr.sbin/acpitools/acpidump/acpidump.c
--- a/usr.sbin/acpitools/acpidump/acpidump.c    Tue Dec 22 08:44:02 2009 +0000
+++ b/usr.sbin/acpitools/acpidump/acpidump.c    Tue Dec 22 08:44:03 2009 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: acpidump.c,v 1.1 2007/01/14 04:36:13 christos Exp $    */
+/* $NetBSD: acpidump.c,v 1.2 2009/12/22 08:44:03 cegger Exp $ */
 
 /*-
  * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki%FreeBSD.org@localhost>
@@ -25,89 +25,126 @@
  * 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: src/usr.sbin/acpi/acpidump/acpidump.c,v 1.5 2002/01/02 07:01:34 msmith Exp $
+ *     $FreeBSD: src/usr.sbin/acpi/acpidump/acpidump.c,v 1.13 2009/08/25 20:35:57 jhb Exp $
  */
+
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: acpidump.c,v 1.1 2007/01/14 04:36:13 christos Exp $");
+__RCSID("$NetBSD: acpidump.c,v 1.2 2009/12/22 08:44:03 cegger Exp $");
+
 
 #include <sys/param.h>
-
 #include <assert.h>
 #include <err.h>
 #include <stdio.h>
-#include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
-#include <acpi_common.h>
 #include "acpidump.h"
 
-static void
-asl_dump_from_file(char *file)
-{
-       u_int8_t        *dp;
-       u_int8_t        *end;
-
-       acpi_load_dsdt(file, &dp, &end);
-       acpi_dump_dsdt(dp, end);
-}
+int    dflag;  /* Disassemble AML using iasl(8) */
+int    tflag;  /* Dump contents of SDT tables */
+int    vflag;  /* Use verbose messages */
 
 static void
-asl_dump_from_devmem(void)
+usage(void)
 {
-       struct  ACPIrsdp *rp;
-       struct  ACPIsdt *rsdp;
-
-       rp = acpi_find_rsd_ptr();
-       if (!rp)
-               errx(1, "Can't find ACPI information\n");
+       const char *progname = getprogname();
 
-       acpi_print_rsd_ptr(rp);
-       rsdp = (struct ACPIsdt *) acpi_map_sdt(rp->addr);
-       if (memcmp(rsdp->signature, "RSDT", 4) ||
-           acpi_checksum(rsdp, rsdp->len))
-               errx(1, "RSDT is corrupted\n");
-
-       acpi_handle_rsdt(rsdp);
-}
-
-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);
-       exit(1);
+       fprintf(stderr, "usage: %s [-d] [-t] [-h] [-v] [-f dsdt_input] "
+                       "[-o dsdt_output]\n", progname);
+       fprintf(stderr, "To send ASL:\n\t%s -dt | gzip -c9 > foo.asl.gz\n",
+           progname);
+       exit(EXIT_FAILURE);
 }
 
 int
 main(int argc, char *argv[])
 {
-       char    c, *progname;
+       ACPI_TABLE_HEADER *rsdt, *sdt;
+       char    c;
+       char    *dsdt_input_file, *dsdt_output_file;
 
-       progname = argv[0];
-       while ((c = getopt(argc, argv, "f:o:hr")) != -1) {
+       dsdt_input_file = dsdt_output_file = NULL;
+
+       if (argc < 2)
+               usage();
+
+       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();
+                       /* NOTREACHED */
                }
        }
+       argc -= optind;
+       argv += optind;
 
-       asl_dump_from_devmem();
-       return (0);
+       /* 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();
+               } else if (tflag != 0) {
+                       warnx("Can't use -t with DSDT input file");
+                       usage();
+               }
+               if (vflag)
+                       warnx("loading DSDT file: %s", dsdt_input_file);
+               rsdt = dsdt_load_file(dsdt_input_file);
+       } else {
+               if (vflag)
+                       warnx("loading RSD PTR from /dev/mem");
+               rsdt = 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(rsdt);
+       }
+
+       /* Translate RSDT to DSDT pointer */
+       if (dsdt_input_file == NULL) {
+               sdt = sdt_from_rsdt(rsdt, ACPI_SIG_FADT, NULL);
+               sdt = dsdt_from_fadt((ACPI_TABLE_FADT *)sdt);
+       } else {
+               sdt = rsdt;
+               rsdt = NULL;
+       }
+
+       /* Dump the DSDT and SSDTs to a file */
+       if (dsdt_output_file != NULL) {
+               if (vflag)
+                       warnx("saving DSDT file: %s", dsdt_output_file);
+               dsdt_save_file(dsdt_output_file, rsdt, sdt);
+       }
+
+       /* Disassemble the DSDT into ASL */
+       if (dflag) {
+               if (vflag)
+                       warnx("disassembling DSDT, iasl messages follow");
+               aml_disassemble(rsdt, sdt);
+               if (vflag)
+                       warnx("iasl processing complete");
+       }
+
+       exit(EXIT_SUCCESS);
 }
diff -r 567ff53aac0d -r cdf240e4c63a usr.sbin/acpitools/acpidump/acpidump.h
--- a/usr.sbin/acpitools/acpidump/acpidump.h    Tue Dec 22 08:44:02 2009 +0000
+++ b/usr.sbin/acpitools/acpidump/acpidump.h    Tue Dec 22 08:44:03 2009 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: acpidump.h,v 1.1 2007/01/14 04:36:13 christos Exp $    */
+/* $NetBSD: acpidump.h,v 1.2 2009/12/22 08:44:03 cegger Exp $ */
 
 /*-
  * Copyright (c) 1999 Doug Rabson
@@ -26,158 +26,63 @@
  * 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: src/usr.sbin/acpi/acpidump/acpidump.h,v 1.5 2002/10/09 19:46:09 jhb Exp $
+ *     $FreeBSD: src/usr.sbin/acpi/acpidump/acpidump.h,v 1.24 2009/08/25 20:35:57 jhb Exp $
  */
 
 #ifndef _ACPIDUMP_H_
-#define _ACPIDUMP_H_
+#define        _ACPIDUMP_H_
 
-/* Generic Address structure */
-struct ACPIgas {
-       u_int8_t        address_space_id;
-#define ACPI_GAS_MEMORY                0
-#define ACPI_GAS_IO            1
-#define ACPI_GAS_PCI           2
-#define ACPI_GAS_EMBEDDED      3
-#define ACPI_GAS_SMBUS         4
-#define ACPI_GAS_FIXED         0x7f
-       u_int8_t        register_bit_width;
-       u_int8_t        register_bit_offset;
-       u_int8_t        res;
-       u_int64_t       address;
-} __packed;
+#include <stdlib.h> /* for size_t */
+#include <acpi_common.h>
+#include <dev/acpi/acpica.h>
 
-/* Root System Description Pointer */
-struct ACPIrsdp {
-       u_char          signature[8];
-       u_char          sum;
-       u_char          oem[6];
-       u_char          res;
-       u_int32_t       addr;
-} __packed;
+/* GAS address space ID constants. */
+#define        ACPI_GAS_MEMORY         0
+#define        ACPI_GAS_IO             1
+#define        ACPI_GAS_PCI            2
+#define        ACPI_GAS_EMBEDDED       3
+#define        ACPI_GAS_SMBUS          4
+#define        ACPI_GAS_CMOS           5
+#define        ACPI_GAS_PCIBAR         6
+#define        ACPI_GAS_DATATABLE      7
+#define        ACPI_GAS_FIXED          0x7f
 
-/* System Description Table */
-struct ACPIsdt {
-       u_char          signature[4];
-       u_int32_t       len;
-       u_char          rev;
-       u_char          check;
-       u_char          oemid[6];
-       u_char          oemtblid[8];
-       u_int32_t       oemrev;
-       u_char          creator[4];
-       u_int32_t       crerev;
-#define SIZEOF_SDT_HDR 36      /* struct size except body */
-       u_int32_t       body[1];/* This member should be casted */
-} __packed;
+/* Subfields in the HPET Id member. */
+#define        ACPI_HPET_ID_HARDWARE_REV_ID    0x000000ff
+#define        ACPI_HPET_ID_COMPARATORS        0x00001f00
+#define        ACPI_HPET_ID_COUNT_SIZE_CAP     0x00002000
+#define        ACPI_HPET_ID_LEGACY_CAPABLE     0x00008000
+#define        ACPI_HPET_ID_PCI_VENDOR_ID      0xffff0000
+
+/* Find and map the RSD PTR structure and return it for parsing */
+ACPI_TABLE_HEADER *sdt_load_devmem(void);
 
-/* Fixed ACPI Description Table (body) */
-struct FACPbody {
-       u_int32_t       facs_ptr;
-       u_int32_t       dsdt_ptr;
-       u_int8_t        int_model;
-#define ACPI_FACP_INTMODEL_PIC 0       /* Standard PC-AT PIC */
-#define ACPI_FACP_INTMODEL_APIC        1       /* Multiple APIC */
-       u_char          reserved1;
-       u_int16_t       sci_int;
-       u_int32_t       smi_cmd;
-       u_int8_t        acpi_enable;
-       u_int8_t        acpi_disable;
-       u_int8_t        s4biosreq;
-       u_int8_t        reserved2;
-       u_int32_t       pm1a_evt_blk;
-       u_int32_t       pm1b_evt_blk;
-       u_int32_t       pm1a_cnt_blk;
-       u_int32_t       pm1b_cnt_blk;
-       u_int32_t       pm2_cnt_blk;
-       u_int32_t       pm_tmr_blk;
-       u_int32_t       gpe0_blk;
-       u_int32_t       gpe1_blk;
-       u_int8_t        pm1_evt_len;
-       u_int8_t        pm1_cnt_len;
-       u_int8_t        pm2_cnt_len;
-       u_int8_t        pm_tmr_len;
-       u_int8_t        gpe0_len;



Home | Main Index | Thread Index | Old Index