Module Name:    src
Committed By:   msaitoh
Date:           Thu Nov  1 03:08:46 UTC 2018

Modified Files:
        src/usr.sbin/acpitools/acpidump: acpi.c acpidump.8

Log Message:
 Decode CSRT (Core System Resources Table).


To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/usr.sbin/acpitools/acpidump/acpi.c
cvs rdiff -u -r1.12 -r1.13 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.38 src/usr.sbin/acpitools/acpidump/acpi.c:1.39
--- src/usr.sbin/acpitools/acpidump/acpi.c:1.38	Thu Oct 18 05:20:05 2018
+++ src/usr.sbin/acpitools/acpidump/acpi.c	Thu Nov  1 03:08:46 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi.c,v 1.38 2018/10/18 05:20:05 msaitoh Exp $ */
+/* $NetBSD: acpi.c,v 1.39 2018/11/01 03:08:46 msaitoh Exp $ */
 
 /*-
  * Copyright (c) 1998 Doug Rabson
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: acpi.c,v 1.38 2018/10/18 05:20:05 msaitoh Exp $");
+__RCSID("$NetBSD: acpi.c,v 1.39 2018/11/01 03:08:46 msaitoh Exp $");
 
 #include <sys/param.h>
 #include <sys/endian.h>
@@ -40,6 +40,7 @@ __RCSID("$NetBSD: acpi.c,v 1.38 2018/10/
 #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.38 2018/10/
 #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,6 +88,7 @@ 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);
@@ -113,7 +121,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);
@@ -1249,6 +1256,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;
@@ -3388,30 +3519,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
@@ -3749,6 +3900,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))
@@ -3804,7 +3957,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.12 src/usr.sbin/acpitools/acpidump/acpidump.8:1.13
--- src/usr.sbin/acpitools/acpidump/acpidump.8:1.12	Fri Oct 19 05:04:45 2018
+++ src/usr.sbin/acpitools/acpidump/acpidump.8	Thu Nov  1 03:08:46 2018
@@ -1,4 +1,4 @@
-.\" $NetBSD: acpidump.8,v 1.12 2018/10/19 05:04:45 msaitoh Exp $
+.\" $NetBSD: acpidump.8,v 1.13 2018/11/01 03:08:46 msaitoh 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 October 19, 2018
+.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

Reply via email to