Module Name:    src
Committed By:   martin
Date:           Tue Dec  4 11:58:11 UTC 2018

Modified Files:
        src/usr.sbin/acpitools/acpidump [netbsd-8]: acpi.c acpidump.8

Log Message:
Pull up the following, requested by msaitoh in ticket #1121:

        usr.sbin/acpitool/acpidump/acpi.c               1.30-1.37, 1.39 via 
patch
        usr.sbin/acpitool/acpidump/acpidump.8           1.11-1.13 via patch

- Add ACPI LPIT (Low Power Idle Table) from FreeBSD r336185.
- Decode DMAR's ANDD (ACPI Name Space).
- Add X2APIC_MODE flag of DMAR.
- Remove extra newline in SPMI table.
- FACS is optional if the HW_REDUCED_ACPI flag is set in the FADT.
- Print SPCR's Interface Type and ARMH GIC Interrupt Type.
- Decode Generic Timer Description Table(GTDT).
- Don't print PM_TMR_BLK if the value is 0.
- Don't print X_PM_TMR_BLK if the address value is 0.
- Decode CSRT (Core System Resources Table).


To generate a diff of this commit:
cvs rdiff -u -r1.15.8.1 -r1.15.8.2 src/usr.sbin/acpitools/acpidump/acpi.c
cvs rdiff -u -r1.7.18.1 -r1.7.18.2 src/usr.sbin/acpitools/acpidump/acpidump.8

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/acpitools/acpidump/acpi.c
diff -u src/usr.sbin/acpitools/acpidump/acpi.c:1.15.8.1 src/usr.sbin/acpitools/acpidump/acpi.c:1.15.8.2
--- src/usr.sbin/acpitools/acpidump/acpi.c:1.15.8.1	Wed Nov 22 15:54:09 2017
+++ src/usr.sbin/acpitools/acpidump/acpi.c	Tue Dec  4 11:58:10 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi.c,v 1.15.8.1 2017/11/22 15:54:09 martin Exp $ */
+/* $NetBSD: acpi.c,v 1.15.8.2 2018/12/04 11:58:10 martin Exp $ */
 
 /*-
  * Copyright (c) 1998 Doug Rabson
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: acpi.c,v 1.15.8.1 2017/11/22 15:54:09 martin Exp $");
+__RCSID("$NetBSD: acpi.c,v 1.15.8.2 2018/12/04 11:58:10 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/endian.h>
@@ -40,6 +40,7 @@ __RCSID("$NetBSD: acpi.c,v 1.15.8.1 2017
 #include <err.h>
 #include <fcntl.h>
 #include <paths.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -53,7 +54,11 @@ __RCSID("$NetBSD: acpi.c,v 1.15.8.1 2017
 #define BEGIN_COMMENT	"/*\n"
 #define END_COMMENT	" */\n"
 
+/* Commonly used helper functions */
 static void	acpi_print_string(char *s, size_t length);
+static void	acpi_print_tabs(unsigned int n);
+static void	acpi_dump_bytes(uint8_t *p, uint32_t len, unsigned int ntabs);
+static void	acpi_dump_table(ACPI_TABLE_HEADER *sdp);
 static void	acpi_print_gas(ACPI_GENERIC_ADDRESS *gas);
 static void	acpi_print_pci(uint16_t vendorid, uint16_t deviceid,
 		    uint8_t seg, uint8_t bus, uint8_t device, uint8_t func);
@@ -68,6 +73,8 @@ static void	acpi_print_whea(ACPI_WHEA_HE
 		    void (*print_ins)(ACPI_WHEA_HEADER *),
 		    void (*print_flags)(ACPI_WHEA_HEADER *));
 static uint64_t	acpi_select_address(uint32_t, uint64_t);
+
+/* Handlers for each table */
 static void	acpi_handle_fadt(ACPI_TABLE_HEADER *fadt);
 static void	acpi_print_cpu(u_char cpu_id);
 static void	acpi_print_cpu_uid(uint32_t uid, char *uid_string);
@@ -81,11 +88,14 @@ static void	acpi_print_madt(ACPI_SUBTABL
 static void	acpi_handle_bert(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_boot(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_cpep(ACPI_TABLE_HEADER *sdp);
+static void	acpi_handle_csrt(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_dbg2(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_einj(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_erst(ACPI_TABLE_HEADER *sdp);
+static void	acpi_handle_gtdt(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_hest(ACPI_TABLE_HEADER *sdp);
+static void	acpi_handle_lpit(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_madt(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_msct(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_ecdt(ACPI_TABLE_HEADER *sdp);
@@ -110,7 +120,6 @@ static void	acpi_handle_wdat(ACPI_TABLE_
 static void	acpi_handle_wddt(ACPI_TABLE_HEADER *sdp);
 static void	acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp);
 static void	acpi_print_sdt(ACPI_TABLE_HEADER *sdp);
-static void	acpi_dump_bytes(ACPI_TABLE_HEADER *sdp);
 static void	acpi_print_fadt(ACPI_TABLE_HEADER *sdp);
 static void	acpi_print_facs(ACPI_TABLE_FACS *facs);
 static void	acpi_print_dsdt(ACPI_TABLE_HEADER *dsdp);
@@ -210,7 +219,7 @@ acpi_print_string(char *s, size_t length
 static void
 acpi_print_gas(ACPI_GENERIC_ADDRESS *gas)
 {
-	switch(gas->SpaceId) {
+	switch (gas->SpaceId) {
 	case ACPI_ADR_SPACE_SYSTEM_MEMORY:
 		if (gas->BitWidth <= 32)
 			printf("0x%08x:%u[%u] (Memory)",
@@ -813,11 +822,16 @@ acpi_handle_fadt(ACPI_TABLE_HEADER *sdp)
 	fadt = (ACPI_TABLE_FADT *)sdp;
 	acpi_print_fadt(sdp);
 
-	facs = (ACPI_TABLE_FACS *)acpi_map_sdt(
-		acpi_select_address(fadt->Facs, fadt->XFacs));
-	if (memcmp(facs->Signature, ACPI_SIG_FACS, 4) != 0 || facs->Length < 64)
-		errx(EXIT_FAILURE, "FACS is corrupt");
-	acpi_print_facs(facs);
+	if (acpi_select_address(fadt->Facs, fadt->XFacs) == 0) {
+		if ((fadt->Flags & ACPI_FADT_HW_REDUCED) == 0)
+			errx(EXIT_FAILURE, "Missing FACS and HW_REDUCED_ACPI flag not set in FADT");
+	} else {
+		facs = (ACPI_TABLE_FACS *)acpi_map_sdt(
+			acpi_select_address(fadt->Facs, fadt->XFacs));
+		if (memcmp(facs->Signature, ACPI_SIG_FACS, 4) != 0 || facs->Length < 64)
+			errx(EXIT_FAILURE, "FACS is corrupt");
+		acpi_print_facs(facs);
+	}
 
 	dsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(
 		acpi_select_address(fadt->Dsdt, fadt->XDsdt));
@@ -1236,6 +1250,130 @@ acpi_handle_cpep(ACPI_TABLE_HEADER *sdp)
 }
 
 static void
+acpi_print_csrt_resource_group(ACPI_CSRT_GROUP *grp)
+{
+	ACPI_CSRT_DESCRIPTOR *desc;
+
+	printf("\tLength=%u\n", grp->Length);
+	printf("\tVendorId=");
+	acpi_print_string((char *)&grp->VendorId, 4);
+	printf("\n");
+	if (grp->SubvendorId != 0) {
+		printf("\tSubvendorId=");
+		acpi_print_string((char *)&grp->SubvendorId, 4);
+		printf("\n");
+	}
+	printf("\tDeviceId=0x%08x\n", grp->DeviceId);
+	if (grp->SubdeviceId != 0)
+		printf("\tSubdeviceId=0x%08x\n", grp->SubdeviceId);
+	printf("\tRevision=%hu\n", grp->Revision);
+	printf("\tSharedInfoLength=%u\n", grp->SharedInfoLength);
+
+	/* Next is Shared Info */
+	if (grp->SharedInfoLength != 0) {
+		printf("\tShared Info ");
+		acpi_dump_bytes((uint8_t *)(grp + 1),
+		    grp->SharedInfoLength, 1);
+	}
+
+	/* And then, Resource Descriptors */
+	desc = (ACPI_CSRT_DESCRIPTOR *)
+	    ((vaddr_t)(grp + 1) + grp->SharedInfoLength);
+	while (desc < (ACPI_CSRT_DESCRIPTOR *)((vaddr_t)grp + grp->Length)) {
+		bool unknownsubytpe = false;
+		printf("\n\tLength=%u\n", desc->Length);
+		printf("\tResource Type=");
+		switch (desc->Type) {
+		case ACPI_CSRT_TYPE_INTERRUPT:
+			printf("Interrupt");
+			switch (desc->Subtype) {
+			case ACPI_CSRT_XRUPT_LINE:
+				printf("(Interrupt line)\n");
+				break;
+			case ACPI_CSRT_XRUPT_CONTROLLER:
+				printf("(Interrupt controller)\n");
+				break;
+			default:
+				unknownsubytpe = true;
+				break;
+			}
+			break;
+		case ACPI_CSRT_TYPE_TIMER:
+			printf("Timer");
+			switch (desc->Subtype) {
+			case ACPI_CSRT_TIMER:
+				printf("\n");
+				break;
+			default:
+				unknownsubytpe = true;
+				break;
+			}
+			break;
+		case ACPI_CSRT_TYPE_DMA:
+			printf("DMA");
+			switch (desc->Subtype) {
+			case ACPI_CSRT_DMA_CHANNEL:
+				printf("(DMA channel)\n");
+				break;
+			case ACPI_CSRT_DMA_CONTROLLER:
+				printf("(DMA controller)\n");
+				break;
+			default:
+				unknownsubytpe = true;
+				break;
+			}
+			break;
+		case 0x0004: /* XXX Platform Security */
+			printf("Platform Security");
+			switch (desc->Subtype) {
+			case 0x0001:
+				printf("\n");
+				/* Platform Security */
+				break;
+			default:
+				unknownsubytpe = true;
+				break;
+			}
+			break;
+		default:
+			printf("Unknown (%hx)\n", desc->Type);
+			break;
+		}
+		if (unknownsubytpe)
+			printf("(unknown subtype(%hx))\n", desc->Subtype);
+
+		printf("\tUID=0x%08x\n", desc->Uid);
+		printf("\tVendor defined info ");
+		acpi_dump_bytes((uint8_t *)(desc + 1),
+		    desc->Length - sizeof(ACPI_CSRT_DESCRIPTOR), 1);
+
+		/* Next */
+		desc = (ACPI_CSRT_DESCRIPTOR *)((vaddr_t)desc + desc->Length);
+	}
+}
+
+static void
+acpi_handle_csrt(ACPI_TABLE_HEADER *sdp)
+{
+	ACPI_CSRT_GROUP *grp;
+	uint totallen = sdp->Length;
+
+	printf(BEGIN_COMMENT);
+	acpi_print_sdt(sdp);
+	grp = (ACPI_CSRT_GROUP *)(sdp + 1);
+
+	while (grp < (ACPI_CSRT_GROUP *)((vaddr_t)sdp + totallen)) {
+		printf("\n");
+		acpi_print_csrt_resource_group(grp);
+
+		/* Next */
+		grp = (ACPI_CSRT_GROUP *)((vaddr_t)grp + grp->Length);
+	}
+
+	printf(END_COMMENT);
+}
+
+static void
 acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp)
 {
 	ACPI_TABLE_DBGP *dbgp;
@@ -1259,6 +1397,39 @@ acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp)
 	printf(END_COMMENT);
 }
 
+/* This function is used by DBG2 and SPCR. */
+static void
+acpi_print_dbg2_serial_subtype(uint16_t subtype)
+{
+
+	switch (subtype) {
+	case ACPI_DBG2_16550_COMPATIBLE:
+		printf("Fully 16550 compatible\n");
+		break;
+	case ACPI_DBG2_16550_SUBSET:
+		printf("16550 subset with DBGP Rev. 1\n");
+		break;
+	case ACPI_DBG2_ARM_PL011:
+		printf("ARM PL011\n");
+		break;
+	case ACPI_DBG2_ARM_SBSA_32BIT:
+		printf("ARM SBSA 32bit only\n");
+		break;
+	case ACPI_DBG2_ARM_SBSA_GENERIC:
+		printf("ARM SBSA Generic\n");
+		break;
+	case ACPI_DBG2_ARM_DCC:
+		printf("ARM DCC\n");
+		break;
+	case ACPI_DBG2_BCM2835:
+		printf("BCM2835\n");
+		break;
+	default:
+		printf("reserved (%04hx)\n", subtype);
+		break;
+	}
+}
+
 static void
 acpi_print_dbg2_device(ACPI_DBG2_DEVICE *dev)
 {
@@ -1282,32 +1453,7 @@ acpi_print_dbg2_device(ACPI_DBG2_DEVICE 
 	switch (dev->PortType) {
 	case ACPI_DBG2_SERIAL_PORT:
 		printf("Serial\n" "\t\tPortSubtype=");
-		switch (dev->PortSubtype) {
-		case ACPI_DBG2_16550_COMPATIBLE:
-			printf("Fully 16550 compatible\n");
-			break;
-		case ACPI_DBG2_16550_SUBSET:
-			printf("16550 subset with DBGP Rev. 1\n");
-			break;
-		case ACPI_DBG2_ARM_PL011:
-			printf("ARM PL011\n");
-			break;
-		case ACPI_DBG2_ARM_SBSA_32BIT:
-			printf("ARM SBSA 32bit only\n");
-			break;
-		case ACPI_DBG2_ARM_SBSA_GENERIC:
-			printf("ARM SBSA Generic\n");
-			break;
-		case ACPI_DBG2_ARM_DCC:
-			printf("ARM DCC\n");
-			break;
-		case ACPI_DBG2_BCM2835:
-			printf("BCM2835\n");
-			break;
-		default:
-			printf("reserved (%04hx)\n", dev->PortSubtype);
-			break;
-		}
+		acpi_print_dbg2_serial_subtype(dev->PortSubtype);
 		break;
 	case ACPI_DBG2_1394_PORT:
 		printf("IEEE1394\n" "\t\tPortSubtype=");
@@ -1660,6 +1806,182 @@ acpi_handle_erst(ACPI_TABLE_HEADER *sdp)
 }
 
 static void
+acpi_print_gtd_timer(const char *name, uint32_t interrupt, uint32_t flags)
+{
+
+	printf("\t%s Timer GSIV=%d\n", name, interrupt);
+	printf("\t%s Flags={Mode=", name);
+	if (flags & ACPI_GTDT_INTERRUPT_MODE)
+		printf("edge");
+	else
+		printf("level");
+	printf(", Polarity=");
+	if (flags & ACPI_GTDT_INTERRUPT_POLARITY)
+		printf("active-lo");
+	else
+		printf("active-hi");
+	if (flags & ACPI_GTDT_ALWAYS_ON)
+		printf(", always-on");
+	printf("}\n");
+}
+
+static void
+acpi_print_gtd_block_timer_flags(const char *name, uint32_t interrupt,
+    uint32_t flags)
+{
+
+	printf("\t\t%s Timer GSIV=%d\n", name, interrupt);
+	printf("\t\t%s Timer Flags={Mode=", name);
+	if (flags & ACPI_GTDT_GT_IRQ_MODE)
+		printf("Secure");
+	else
+		printf("Non-Secure");
+	printf(", Polarity=");
+	if (flags & ACPI_GTDT_GT_IRQ_POLARITY)
+		printf("active-lo");
+	else
+		printf("active-hi");
+	printf("}\n");
+}
+
+static void
+acpi_print_gtblock(ACPI_GTDT_TIMER_BLOCK *gtblock)
+{
+	ACPI_GTDT_TIMER_ENTRY *entry;
+	unsigned int i;
+	
+	printf("\tType=GT Block\n");
+	printf("\tLength=%d\n", gtblock->Header.Length);
+	/* XXX might not 8byte aligned */
+	printf("\tBlockAddress=%016jx\n",
+	    (uintmax_t)gtblock->BlockAddress);
+
+	printf("\tGT Block Timer Count=%d\n", gtblock->TimerCount);
+	entry = (ACPI_GTDT_TIMER_ENTRY *)((vaddr_t)gtblock
+	    + gtblock->TimerOffset);
+	for (i = 0; i < gtblock->TimerCount; i++) {
+		printf("\n");
+		if (entry >= (ACPI_GTDT_TIMER_ENTRY *)((vaddr_t)gtblock
+		    + gtblock->Header.Length)) {
+			printf("\\ttWrong Timer entry\n");
+			break;
+		}
+		printf("\t\tFrame Number=%d\n", entry->FrameNumber);
+		/* XXX might not 8byte aligned */
+		printf("\t\tBaseAddress=%016jx\n",
+		    (uintmax_t)entry->BaseAddress);
+		/* XXX might not 8byte aligned */
+		printf("\t\tEl0BaseAddress=%016jx\n",
+		    (uintmax_t)entry->El0BaseAddress);
+
+		acpi_print_gtd_block_timer_flags("Physical",
+		    entry->TimerInterrupt, entry->TimerFlags);
+		acpi_print_gtd_block_timer_flags("Virtual",
+		    entry->VirtualTimerInterrupt, entry->VirtualTimerFlags);
+
+		printf("\t\tCommon Flags={Mode=");
+		if (entry->CommonFlags & ACPI_GTDT_GT_IS_SECURE_TIMER)
+			printf("Secure");
+		else
+			printf("Non-Secure");
+		if (entry->CommonFlags & ACPI_GTDT_GT_ALWAYS_ON)
+			printf(", always-on");
+		printf("}\n");
+
+		entry++;
+	}
+}
+
+static void
+acpi_print_sbsa_watchdog(ACPI_GTDT_WATCHDOG *wdog)
+{
+	
+	printf("\tType=Watchdog GT\n");
+	printf("\tLength=%d\n", wdog->Header.Length);
+	/* XXX might not 8byte aligned */
+	printf("\tRefreshFrameAddress=%016jx\n",
+	    (uintmax_t)wdog->RefreshFrameAddress);
+	/* XXX might not 8byte aligned */
+	printf("\tControlFrameAddress=%016jx\n",
+	    (uintmax_t)wdog->ControlFrameAddress);
+	printf("\tGSIV=%d\n", wdog->TimerInterrupt);
+
+	printf("\tFlags={Mode=");
+	if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_IRQ_MODE)
+		printf("edge");
+	else
+		printf("level");
+	printf(", Polarity=");
+	if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_IRQ_POLARITY)
+		printf("active-lo");
+	else
+		printf("active-hi");
+	if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_SECURE)
+		printf(", Secure");
+	else
+		printf(", Non-Secure");
+	printf("}\n");
+}
+
+static void
+acpi_handle_gtdt(ACPI_TABLE_HEADER *sdp)
+{
+	ACPI_TABLE_GTDT *gtdt;
+	ACPI_GTDT_HEADER *hdr;
+	u_int i;
+
+	printf(BEGIN_COMMENT);
+	acpi_print_sdt(sdp);
+	gtdt = (ACPI_TABLE_GTDT *)sdp;
+
+	printf("\tCounterBlockAddresss=%016jx\n",
+	    (uintmax_t)gtdt->CounterBlockAddresss); /* XXX not 8byte aligned */
+	printf("\tCounterReadBlockAddress=%016jx\n",
+	    (uintmax_t)gtdt->CounterReadBlockAddress);
+
+#define PRINTTIMER(gtdt, name) acpi_print_gtd_timer(	\
+		#name, (gtdt)-> name## Interrupt,	\
+	(gtdt)-> name ## Flags)
+
+	PRINTTIMER(gtdt, SecureEl1);
+	PRINTTIMER(gtdt, NonSecureEl1);
+	PRINTTIMER(gtdt, VirtualTimer);
+	PRINTTIMER(gtdt, NonSecureEl2);
+
+#undef PRINTTIMER
+
+	printf("\tPlatform Timer Count=%d\n", gtdt->PlatformTimerCount);
+
+	hdr = (ACPI_GTDT_HEADER *)((vaddr_t)sdp + gtdt->PlatformTimerOffset);
+	for (i = 0; i < gtdt->PlatformTimerCount; i++) {
+		printf("\n");
+		if (hdr >= (ACPI_GTDT_HEADER *)((vaddr_t)sdp + sdp->Length)) {
+			printf("\tWrong GTDT header"
+			    "(type = %hhu, length = %hu)\n",
+			    hdr->Type, hdr->Length);
+			break;
+		}
+
+		switch (hdr->Type) {
+		case ACPI_GTDT_TYPE_TIMER_BLOCK:
+			acpi_print_gtblock((ACPI_GTDT_TIMER_BLOCK *)hdr);
+			break;
+		case ACPI_GTDT_TYPE_WATCHDOG:
+			acpi_print_sbsa_watchdog((ACPI_GTDT_WATCHDOG *)hdr);
+			break;
+		default:
+			printf("\tUnknown Platform Timer Type"
+			    "(type = %hhu, length = %hu)\n",
+			    hdr->Type, hdr->Length);
+			break;
+		}
+		/* Next */
+		hdr = (ACPI_GTDT_HEADER *)((vaddr_t)hdr + hdr->Length);
+	}
+	printf(END_COMMENT);
+}
+
+static void
 acpi_handle_madt(ACPI_TABLE_HEADER *sdp)
 {
 	ACPI_TABLE_MADT *madt;
@@ -1704,6 +2026,79 @@ acpi_handle_hpet(ACPI_TABLE_HEADER *sdp)
 }
 
 static void
+acpi_print_native_lpit(ACPI_LPIT_NATIVE *nl)
+{
+	printf("\tEntryTrigger=");
+	acpi_print_gas(&nl->EntryTrigger);
+	printf("\tResidency=%u\n", nl->Residency);
+	printf("\tLatency=%u\n", nl->Latency);
+	if (nl->Header.Flags & ACPI_LPIT_NO_COUNTER)
+		printf("\tResidencyCounter=Not Present");
+	else {
+		printf("\tResidencyCounter=");
+		acpi_print_gas(&nl->ResidencyCounter);
+	}
+	if (nl->CounterFrequency)
+		printf("\tCounterFrequency=%ju\n", nl->CounterFrequency);
+	else
+		printf("\tCounterFrequency=TSC\n");
+}
+
+static void
+acpi_print_lpit(ACPI_LPIT_HEADER *lpit)
+{
+	if (lpit->Type == ACPI_LPIT_TYPE_NATIVE_CSTATE)
+		printf("\tType=ACPI_LPIT_TYPE_NATIVE_CSTATE\n");
+	else
+		warnx("unknown LPIT type %u", lpit->Type);
+
+	printf("\tLength=%u\n", lpit->Length);
+	printf("\tUniqueId=0x%04x\n", lpit->UniqueId);
+#define	PRINTFLAG(var, flag)	printflag((var), ACPI_LPIT_## flag, #flag)
+	printf("\tFlags=");
+	PRINTFLAG(lpit->Flags, STATE_DISABLED);
+	PRINTFLAG_END();
+#undef PRINTFLAG
+
+	if (lpit->Type == ACPI_LPIT_TYPE_NATIVE_CSTATE)
+		return acpi_print_native_lpit((ACPI_LPIT_NATIVE *)lpit);
+}
+
+static void
+acpi_walk_lpit(ACPI_TABLE_HEADER *table, void *first,
+    void (*action)(ACPI_LPIT_HEADER *))
+{
+	ACPI_LPIT_HEADER *subtable;
+	char *end;
+
+	subtable = first;
+	end = (char *)table + table->Length;
+	while ((char *)subtable < end) {
+		printf("\n");
+		if (subtable->Length < sizeof(ACPI_LPIT_HEADER)) {
+			warnx("invalid subtable length %u", subtable->Length);
+			return;
+		}
+		action(subtable);
+		subtable = (ACPI_LPIT_HEADER *)((char *)subtable +
+		    subtable->Length);
+	}
+}
+
+static void
+acpi_handle_lpit(ACPI_TABLE_HEADER *sdp)
+{
+	ACPI_TABLE_LPIT *lpit;
+
+	printf(BEGIN_COMMENT);
+	acpi_print_sdt(sdp);
+	lpit = (ACPI_TABLE_LPIT *)sdp;
+	acpi_walk_lpit(sdp, (lpit + 1), acpi_print_lpit);
+
+	printf(END_COMMENT);
+}
+
+static void
 acpi_handle_msct(ACPI_TABLE_HEADER *sdp)
 {
 	ACPI_TABLE_MSCT *msct;
@@ -1830,6 +2225,21 @@ acpi_handle_spcr(ACPI_TABLE_HEADER *sdp)
 	acpi_print_sdt(sdp);
 	spcr = (ACPI_TABLE_SPCR *)sdp;
 
+	printf("\n\tInterface Type=");
+	switch (sdp->Revision) {
+	case 1:
+		printf("full 16550%s\n",
+		    (spcr->InterfaceType == 1) ?
+		    "(must also accept writing FCR register)" : "");
+		break;
+	case 2:
+		acpi_print_dbg2_serial_subtype(spcr->InterfaceType);
+		break;
+	default:
+		printf("unknown Revision\n");
+		break;
+	}
+	
 	printf("\tSerial Port=");
 	acpi_print_gas(&spcr->SerialPort);
 	printf("\n\tInterrupt Type={");
@@ -1852,6 +2262,9 @@ acpi_handle_spcr(ACPI_TABLE_HEADER *sdp)
 	if (spcr->InterruptType & 0x4) {
 		printf("\n\t\tIO SAPIC={ GSI=%d }", spcr->Interrupt);
 	}
+	if (spcr->InterruptType & 0x8) {
+		printf("\n\t\tARMH GIC={ GSI=%d }", spcr->Interrupt);
+	}
 	printf("\n\t}\n");
 
 	printf("\tBaud Rate=");
@@ -1961,7 +2374,7 @@ acpi_handle_spmi(ACPI_TABLE_HEADER *sdp)
 		printf("Reserved(%d)", spmi->InterfaceType);
 		break;
 	}
-	printf("\n\tSpecRevision=%d.%d\n", spmi->SpecRevision >> 8,
+	printf("\n\tSpecRevision=%d.%d", spmi->SpecRevision >> 8,
 		spmi->SpecRevision & 0xff);
 
 	printf("\n\tInterrupt Type={");
@@ -2253,7 +2666,7 @@ acpi_tcpa_evname(struct TCPAevent *event
 
 	pc_event = (struct TCPApc_event *)(event + 1);
 
-	switch(event->event_type) {
+	switch (event->event_type) {
 	case PREBOOT:
 	case POST_CODE:
 	case UNUSED:
@@ -2366,7 +2779,7 @@ acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp)
 		printf(END_COMMENT);
 		return;
 	}
-	if(sdp->Revision == 1) {
+	if (sdp->Revision == 1) {
 		printf("\tOLD TCPA spec log found. Dumping not supported.\n");
 		printf(END_COMMENT);
 		return;
@@ -2426,6 +2839,8 @@ devscope_type2str(int type)
 		return ("IOAPIC");
 	case 4:
 		return ("HPET");
+	case 5:
+		return ("ACPI Name space");
 	default:
 		snprintf(typebuf, sizeof(typebuf), "%d", type);
 		return (typebuf);
@@ -2573,6 +2988,17 @@ acpi_handle_dmar_rhsa(ACPI_DMAR_RHSA *rh
 	printf("\tProximityDomain=0x%08x\n", rhsa->ProximityDomain);
 }
 
+static void
+acpi_handle_dmar_andd(ACPI_DMAR_ANDD *andd)
+{
+
+	printf("\n");
+	printf("\tType=ANDD\n");
+	printf("\tLength=%d\n", andd->Header.Length);
+	printf("\tDeviceNumber=%d\n", andd->DeviceNumber);
+	printf("\tDeviceName=0x%s\n", andd->DeviceName);
+}
+
 static int
 acpi_handle_dmar_remapping_structure(void *addr, int remaining)
 {
@@ -2597,6 +3023,9 @@ acpi_handle_dmar_remapping_structure(voi
 	case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
 		acpi_handle_dmar_rhsa(addr);
 		break;
+	case ACPI_DMAR_TYPE_NAMESPACE:
+		acpi_handle_dmar_andd(addr);
+		break;
 	default:
 		printf("\n");
 		printf("\tType=%d\n", hdr->Type);
@@ -2627,6 +3056,7 @@ acpi_handle_dmar(ACPI_TABLE_HEADER *sdp)
 	printf("\tFlags=");
 	PRINTFLAG(dmar->Flags, INTR_REMAP);
 	PRINTFLAG(dmar->Flags, X2APIC_OPT_OUT);
+	PRINTFLAG(dmar->Flags, X2APIC_MODE);
 	PRINTFLAG_END();
 
 #undef PRINTFLAG
@@ -2925,30 +3355,50 @@ acpi_print_sdt(ACPI_TABLE_HEADER *sdp)
 	printf(", Creator Revision=0x%x\n", sdp->AslCompilerRevision);
 }
 
+void
+acpi_print_tabs(unsigned int n)
+{
+
+	while (n-- > 0)
+		printf("\t");
+}
+
 static void
-acpi_dump_bytes(ACPI_TABLE_HEADER *sdp)
+acpi_dump_bytes(uint8_t *p, uint32_t len, unsigned int ntabs)
 {
 	unsigned int i;
-	uint8_t *p;
 
-	p = (uint8_t *)sdp;
-	printf("\n\tData={");
-	for (i = 0; i < sdp->Length; i++) {
+	acpi_print_tabs(ntabs);
+	printf("Data={");
+	for (i = 0; i < len; i++) {
 		if (cflag) {
-			if (i % 64 == 0)
-				printf("\n\t ");
-			else if (i % 16 == 0)
+			if (i % 64 == 0) {
+				printf("\n");
+				acpi_print_tabs(ntabs);
+				printf(" ");
+			}else if (i % 16 == 0)
 				printf(" ");
 			printf("%c", (p[i] >= ' ' && p[i] <= '~') ? p[i] : '.');
 		} else {
-			if (i % 16 == 0)
-				printf("\n\t\t");
-			else if (i % 8 == 0)
+			if (i % 16 == 0) {
+				printf("\n");
+				acpi_print_tabs(ntabs + 1);
+			} else if (i % 8 == 0)
 				printf("   ");
 			printf(" %02x", p[i]);
 		}
 	}
-	printf("\n\t}\n");
+	printf("\n");
+	acpi_print_tabs(ntabs);
+	printf("}\n");
+}
+
+/* Dump data which has ACPI_TABLE_HEADER */
+static void
+acpi_dump_table(ACPI_TABLE_HEADER *sdp)
+{
+
+	acpi_dump_bytes((uint8_t *)sdp, sdp->Length, 1);
 }
 
 static void
@@ -3025,9 +3475,10 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
 		printf("\tPM2_CNT_BLK=0x%x-0x%x\n",
 		       fadt->Pm2ControlBlock,
 		       fadt->Pm2ControlBlock + fadt->Pm2ControlLength - 1);
-	printf("\tPM_TMR_BLK=0x%x-0x%x\n",
-	       fadt->PmTimerBlock,
-	       fadt->PmTimerBlock + fadt->PmTimerLength - 1);
+	if (fadt->PmTimerBlock != 0)
+		printf("\tPM_TMR_BLK=0x%x-0x%x\n",
+		    fadt->PmTimerBlock,
+		    fadt->PmTimerBlock + fadt->PmTimerLength - 1);
 	if (fadt->Gpe0Block != 0)
 		printf("\tGPE0_BLK=0x%x-0x%x\n",
 		       fadt->Gpe0Block,
@@ -3123,8 +3574,10 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
 		printf("\n\tX_PM2_CNT_BLK=");
 		acpi_print_gas(&fadt->XPm2ControlBlock);
 	}
-	printf("\n\tX_PM_TMR_BLK=");
-	acpi_print_gas(&fadt->XPmTimerBlock);
+	if (fadt->XPmTimerBlock.Address != 0) {
+		printf("\n\tX_PM_TMR_BLK=");
+		acpi_print_gas(&fadt->XPmTimerBlock);
+	}
 	if (fadt->XGpe0Block.Address != 0) {
 		printf("\n\tX_GPE0_BLK=");
 		acpi_print_gas(&fadt->XGpe0Block);
@@ -3283,6 +3736,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp
 			acpi_handle_boot(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_CPEP, 4))
 			acpi_handle_cpep(sdp);
+		else if (!memcmp(sdp->Signature, ACPI_SIG_CSRT, 4))
+			acpi_handle_csrt(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_DBGP, 4))
 			acpi_handle_dbgp(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_DBG2, 4))
@@ -3293,6 +3748,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp
 			acpi_handle_einj(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_ERST, 4))
 			acpi_handle_erst(sdp);
+		else if (!memcmp(sdp->Signature, ACPI_SIG_GTDT, 4))
+			acpi_handle_gtdt(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_MADT, 4))
 			acpi_handle_madt(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_MSCT, 4))
@@ -3303,6 +3760,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp
 			acpi_handle_hpet(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_ECDT, 4))
 			acpi_handle_ecdt(sdp);
+		else if (!memcmp(sdp->Signature, ACPI_SIG_LPIT, 4))
+			acpi_handle_lpit(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_MCFG, 4))
 			acpi_handle_mcfg(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_SBST, 4))
@@ -3332,7 +3791,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp
 		else {
 			printf(BEGIN_COMMENT);
 			acpi_print_sdt(sdp);
-			acpi_dump_bytes(sdp);
+			printf("\n");
+			acpi_dump_table(sdp);
 			printf(END_COMMENT);
 		}
 	}

Index: src/usr.sbin/acpitools/acpidump/acpidump.8
diff -u src/usr.sbin/acpitools/acpidump/acpidump.8:1.7.18.1 src/usr.sbin/acpitools/acpidump/acpidump.8:1.7.18.2
--- src/usr.sbin/acpitools/acpidump/acpidump.8:1.7.18.1	Wed Nov 22 15:54:09 2017
+++ src/usr.sbin/acpitools/acpidump/acpidump.8	Tue Dec  4 11:58:10 2018
@@ -1,4 +1,4 @@
-.\" $NetBSD: acpidump.8,v 1.7.18.1 2017/11/22 15:54:09 martin Exp $
+.\" $NetBSD: acpidump.8,v 1.7.18.2 2018/12/04 11:58:10 martin Exp $
 .\" ACPI (ACPI Package)
 .\"
 .\" Copyright (c) 1999 Doug Rabson <d...@freebsd.org>
@@ -30,7 +30,7 @@
 .\"
 .\" $FreeBSD: head/usr.sbin/acpi/acpidump/acpidump.8 267668 2014-06-20 09:57:27Z bapt $
 .\"
-.Dd September 1, 2017
+.Dd November 1, 2018
 .Dt ACPIDUMP 8
 .Os
 .Sh NAME
@@ -99,6 +99,7 @@ utility dumps contents of the following 
 .It BERT
 .It BOOT
 .It CPEP
+.It CSRT
 .It DBG2
 .It DBGP
 .It DMAR
@@ -108,8 +109,10 @@ utility dumps contents of the following 
 .It ERST
 .It FACS
 .It FADT
+.It GTDT
 .It HEST
 .It HPET
+.It LPIT
 .It MADT
 .It MCFG
 .It MSCT

Reply via email to