Module Name: src
Committed By: msaitoh
Date: Fri Aug 4 06:30:36 UTC 2017
Modified Files:
src/usr.sbin/acpitools/acpidump: acpi.c acpi_user.c acpidump.8
acpidump.c acpidump.h
Log Message:
Sync with FreeBSD's r321294:
- Dump TCG ACPI spec table (TCPA) more.
- Dump DMA Remapping Reporting table (DMAR).
- Consistently cast ACPICA 64-bit integer types when we print them.
- Display the 'Flags' field in the HPET Description Table.
- Do not crash when RSDT/XSDT contains an empty entry.
- Print 64-bit addresses clearly with leading zeros to avoid confusions.
- Create temp file safely.
- Add missing flags into FADT.
- Print some new ACPI 5.1 MADT entries.
- Use __arraycount().
- Warn and exit loop on invalid subtable length.
- Fix the type used to hold the value returned from getopt. On arm64 char is
unsigned so will never be -1.
To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/usr.sbin/acpitools/acpidump/acpi.c
cvs rdiff -u -r1.3 -r1.4 src/usr.sbin/acpitools/acpidump/acpi_user.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/acpitools/acpidump/acpidump.8
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/acpitools/acpidump/acpidump.c
cvs rdiff -u -r1.5 -r1.6 src/usr.sbin/acpitools/acpidump/acpidump.h
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 src/usr.sbin/acpitools/acpidump/acpi.c:1.16
--- src/usr.sbin/acpitools/acpidump/acpi.c:1.15 Sat Feb 27 16:40:22 2016
+++ src/usr.sbin/acpitools/acpidump/acpi.c Fri Aug 4 06:30:36 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi.c,v 1.15 2016/02/27 16:40:22 christos Exp $ */
+/* $NetBSD: acpi.c,v 1.16 2017/08/04 06:30:36 msaitoh Exp $ */
/*-
* Copyright (c) 1998 Doug Rabson
@@ -26,11 +26,11 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/usr.sbin/acpi/acpidump/acpi.c,v 1.37 2009/08/25 20:35:57 jhb Exp $
+ * $FreeBSD: head/usr.sbin/acpi/acpidump/acpi.c 321299 2017-07-20 17:36:17Z emaste $
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: acpi.c,v 1.15 2016/02/27 16:40:22 christos Exp $");
+__RCSID("$NetBSD: acpi.c,v 1.16 2017/08/04 06:30:36 msaitoh Exp $");
#include <sys/param.h>
#include <sys/endian.h>
@@ -116,6 +116,71 @@ static void acpi_walk_subtables(ACPI_TAB
/* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */
static int addr_size;
+/* Strings used in the TCPA table */
+static const char *tcpa_event_type_strings[] = {
+ "PREBOOT Certificate",
+ "POST Code",
+ "Unused",
+ "No Action",
+ "Separator",
+ "Action",
+ "Event Tag",
+ "S-CRTM Contents",
+ "S-CRTM Version",
+ "CPU Microcode",
+ "Platform Config Flags",
+ "Table of Devices",
+ "Compact Hash",
+ "IPL",
+ "IPL Partition Data",
+ "Non-Host Code",
+ "Non-Host Config",
+ "Non-Host Info"
+};
+
+static const char *TCPA_pcclient_strings[] = {
+ "<undefined>",
+ "SMBIOS",
+ "BIS Certificate",
+ "POST BIOS ROM Strings",
+ "ESCD",
+ "CMOS",
+ "NVRAM",
+ "Option ROM Execute",
+ "Option ROM Configurateion",
+ "<undefined>",
+ "Option ROM Microcode Update ",
+ "S-CRTM Version String",
+ "S-CRTM Contents",
+ "POST Contents",
+ "Table of Devices",
+};
+
+#define PRINTFLAG_END() printflag_end()
+
+static char pf_sep = '{';
+
+static void
+printflag_end(void)
+{
+
+ if (pf_sep != '{') {
+ printf("}");
+ pf_sep = '{';
+ }
+ printf("\n");
+}
+
+static void
+printflag(uint64_t var, uint64_t mask, const char *name)
+{
+
+ if (var & mask) {
+ printf("%c%s", pf_sep, name);
+ pf_sep = ',';
+ }
+}
+
static void
acpi_print_string(char *s, size_t length)
{
@@ -136,12 +201,18 @@ acpi_print_gas(ACPI_GENERIC_ADDRESS *gas
{
switch(gas->SpaceId) {
case ACPI_GAS_MEMORY:
- printf("0x%08lx:%u[%u] (Memory)", (u_long)gas->Address,
- gas->BitOffset, gas->BitWidth);
+ if (gas->BitWidth <= 32)
+ printf("0x%08x:%u[%u] (Memory)",
+ (u_int)gas->Address, gas->BitOffset,
+ gas->BitWidth);
+ else
+ printf("0x%016jx:%u[%u] (Memory)",
+ (uintmax_t)gas->Address, gas->BitOffset,
+ gas->BitWidth);
break;
case ACPI_GAS_IO:
- printf("0x%02lx:%u[%u] (IO)", (u_long)gas->Address,
- gas->BitOffset, gas->BitWidth);
+ printf("0x%02x:%u[%u] (IO)", (u_int)gas->Address,
+ gas->BitOffset, gas->BitWidth);
break;
case ACPI_GAS_PCI:
printf("%x:%x+0x%x (PCI)", (uint16_t)(gas->Address >> 32),
@@ -162,7 +233,7 @@ acpi_print_gas(ACPI_GENERIC_ADDRESS *gas
case ACPI_GAS_DATATABLE:
case ACPI_GAS_FIXED:
default:
- printf("0x%08lx (?)", (u_long)gas->Address);
+ printf("0x%016jx (?)", (uintmax_t)gas->Address);
break;
}
}
@@ -720,6 +791,10 @@ acpi_walk_subtables(ACPI_TABLE_HEADER *t
end = (char *)table + table->Length;
while ((char *)subtable < end) {
printf("\n");
+ if (subtable->Length < sizeof(ACPI_SUBTABLE_HEADER)) {
+ warnx("invalid subtable length %u", subtable->Length);
+ return;
+ }
action(subtable);
subtable = (ACPI_SUBTABLE_HEADER *)((char *)subtable +
subtable->Length);
@@ -806,6 +881,23 @@ acpi_print_mps_flags(uint16_t flags)
}
static void
+acpi_print_gicc_flags(uint32_t flags)
+{
+
+ printf("\tFlags={Performance intr=");
+ if (flags & ACPI_MADT_PERFORMANCE_IRQ_MODE)
+ printf("edge");
+ else
+ printf("level");
+ printf(", VGIC intr=");
+ if (flags & ACPI_MADT_VGIC_IRQ_MODE)
+ printf("edge");
+ else
+ printf("level");
+ printf("}\n");
+}
+
+static void
acpi_print_intr(uint32_t intr, uint16_t mps_flags)
{
@@ -821,12 +913,27 @@ acpi_print_local_nmi(u_int lint, uint16_
acpi_print_mps_flags(mps_flags);
}
-const char *apic_types[] = { "Local APIC", "IO APIC", "INT Override", "NMI",
- "Local APIC NMI", "Local APIC Override",
- "IO SAPIC", "Local SAPIC", "Platform Interrupt",
- "Local X2APIC", "Local X2APIC NMI" };
-const char *platform_int_types[] = { "0 (unknown)", "PMI", "INIT",
- "Corrected Platform Error" };
+static const char *apic_types[] = {
+ [ACPI_MADT_TYPE_LOCAL_APIC] = "Local APIC",
+ [ACPI_MADT_TYPE_IO_APIC] = "IO APIC",
+ [ACPI_MADT_TYPE_INTERRUPT_OVERRIDE] = "INT Override",
+ [ACPI_MADT_TYPE_NMI_SOURCE] = "NMI",
+ [ACPI_MADT_TYPE_LOCAL_APIC_NMI] = "Local APIC NMI",
+ [ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE] = "Local APIC Override",
+ [ACPI_MADT_TYPE_IO_SAPIC] = "IO SAPIC",
+ [ACPI_MADT_TYPE_LOCAL_SAPIC] = "Local SAPIC",
+ [ACPI_MADT_TYPE_INTERRUPT_SOURCE] = "Platform Interrupt",
+ [ACPI_MADT_TYPE_LOCAL_X2APIC] = "Local X2APIC",
+ [ACPI_MADT_TYPE_LOCAL_X2APIC_NMI] = "Local X2APIC NMI",
+ [ACPI_MADT_TYPE_GENERIC_INTERRUPT] = "GIC CPU Interface Structure",
+ [ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR] = "GIC Distributor Structure",
+ [ACPI_MADT_TYPE_GENERIC_MSI_FRAME] = "GICv2m MSI Frame",
+ [ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR] = "GIC Redistributor Structure",
+ [ACPI_MADT_TYPE_GENERIC_TRANSLATOR] = "GIC ITS Structure"
+};
+
+static const char *platform_int_types[] = { "0 (unknown)", "PMI", "INIT",
+ "Corrected Platform Error" };
static void
acpi_print_madt(ACPI_SUBTABLE_HEADER *mp)
@@ -842,8 +949,12 @@ acpi_print_madt(ACPI_SUBTABLE_HEADER *mp
ACPI_MADT_INTERRUPT_SOURCE *isrc;
ACPI_MADT_LOCAL_X2APIC *x2apic;
ACPI_MADT_LOCAL_X2APIC_NMI *x2apic_nmi;
+ ACPI_MADT_GENERIC_INTERRUPT *gicc;
+ ACPI_MADT_GENERIC_DISTRIBUTOR *gicd;
+ ACPI_MADT_GENERIC_REDISTRIBUTOR *gicr;
+ ACPI_MADT_GENERIC_TRANSLATOR *gict;
- if (mp->Type < sizeof(apic_types) / sizeof(apic_types[0]))
+ if (mp->Type < __arraycount(apic_types))
printf("\tType=%s\n", apic_types[mp->Type]);
else
printf("\tType=%d (unknown)\n", mp->Type);
@@ -893,8 +1004,7 @@ acpi_print_madt(ACPI_SUBTABLE_HEADER *mp
break;
case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
isrc = (ACPI_MADT_INTERRUPT_SOURCE *)mp;
- if (isrc->Type < sizeof(platform_int_types) /
- sizeof(platform_int_types[0]))
+ if (isrc->Type < __arraycount(platform_int_types))
printf("\tType=%s\n", platform_int_types[isrc->Type]);
else
printf("\tType=%d (unknown)\n", isrc->Type);
@@ -913,6 +1023,41 @@ acpi_print_madt(ACPI_SUBTABLE_HEADER *mp
acpi_print_cpu_uid(x2apic_nmi->Uid, NULL);
acpi_print_local_nmi(x2apic_nmi->Lint, x2apic_nmi->IntiFlags);
break;
+ case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
+ gicc = (ACPI_MADT_GENERIC_INTERRUPT *)mp;
+ acpi_print_cpu_uid(gicc->Uid, NULL);
+ printf("\tCPU INTERFACE=%x\n", gicc->CpuInterfaceNumber);
+ acpi_print_gicc_flags(gicc->Flags);
+ printf("\tParking Protocol Version=%x\n", gicc->ParkingVersion);
+ printf("\tPERF INTR=%d\n", gicc->PerformanceInterrupt);
+ printf("\tParked ADDR=%016jx\n",
+ (uintmax_t)gicc->ParkedAddress);
+ printf("\tBase ADDR=%016jx\n", (uintmax_t)gicc->BaseAddress);
+ printf("\tGICV=%016jx\n", (uintmax_t)gicc->GicvBaseAddress);
+ printf("\tGICH=%016jx\n", (uintmax_t)gicc->GichBaseAddress);
+ printf("\tVGIC INTR=%d\n", gicc->VgicInterrupt);
+ printf("\tGICR ADDR=%016jx\n",
+ (uintmax_t)gicc->GicrBaseAddress);
+ printf("\tMPIDR=%jx\n", (uintmax_t)gicc->ArmMpidr);
+ printf("\tEfficency Class=%d\n", (u_int)gicc->EfficiencyClass);
+ break;
+ case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
+ gicd = (ACPI_MADT_GENERIC_DISTRIBUTOR *)mp;
+ printf("\tGIC ID=%d\n", (u_int)gicd->GicId);
+ printf("\tBase ADDR=%016jx\n", (uintmax_t)gicd->BaseAddress);
+ printf("\tVector Base=%d\n", gicd->GlobalIrqBase);
+ printf("\tGIC VERSION=%d\n", (u_int)gicd->Version);
+ break;
+ case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
+ gicr = (ACPI_MADT_GENERIC_REDISTRIBUTOR *)mp;
+ printf("\tBase ADDR=%016jx\n", (uintmax_t)gicr->BaseAddress);
+ printf("\tLength=%08x\n", gicr->Length);
+ break;
+ case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
+ gict = (ACPI_MADT_GENERIC_TRANSLATOR *)mp;
+ printf("\tGIC ITS ID=%d\n", gict->TranslationId);
+ printf("\tBase ADDR=%016jx\n", (uintmax_t)gict->BaseAddress);
+ break;
}
}
@@ -1349,6 +1494,7 @@ acpi_handle_hpet(ACPI_TABLE_HEADER *sdp)
printf("FALSE}\n");
printf("\tPCI Vendor ID=0x%04x\n", hpet->Id >> 16);
printf("\tMinimal Tick=%d\n", hpet->MinimumTick);
+ printf("\tFlags=0x%02x\n", hpet->Flags);
printf(END_COMMENT);
}
@@ -1420,7 +1566,7 @@ acpi_handle_mcfg(ACPI_TABLE_HEADER *sdp)
alloc = (ACPI_MCFG_ALLOCATION *)(mcfg + 1);
for (i = 0; i < entries; i++, alloc++) {
printf("\n");
- printf("\tBase Address=0x%016jx\n", alloc->Address);
+ printf("\tBase Address=0x%016jx\n", (uintmax_t)alloc->Address);
printf("\tSegment Group=0x%04x\n", alloc->PciSegment);
printf("\tStart Bus=%d\n", alloc->StartBusNumber);
printf("\tEnd Bus=%d\n", alloc->EndBusNumber);
@@ -1456,7 +1602,7 @@ acpi_handle_slit(ACPI_TABLE_HEADER *sdp)
slit = (ACPI_TABLE_SLIT *)sdp;
cnt = slit->LocalityCount * slit->LocalityCount;
- printf("\tLocalityCount=%"PRIu64"\n", slit->LocalityCount);
+ printf("\tLocalityCount=%ju\n", (uintmax_t)slit->LocalityCount);
printf("\tEntry=\n\t");
for (idx = 0; idx < cnt; idx++) {
printf("%u ", slit->Entry[idx]);
@@ -1618,15 +1764,21 @@ acpi_print_srat_memory(ACPI_SRAT_MEM_AFF
printf("\tProximity Domain=%d\n", mp->ProximityDomain);
}
-const char *srat_types[] = { "CPU", "Memory", "X2APIC" };
+static const char *srat_types[] = {
+ [ACPI_SRAT_TYPE_CPU_AFFINITY] = "CPU",
+ [ACPI_SRAT_TYPE_MEMORY_AFFINITY] = "Memory",
+ [ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY] = "X2APIC",
+ [ACPI_SRAT_TYPE_GICC_AFFINITY] = "GICC",
+};
static void
acpi_print_srat(ACPI_SUBTABLE_HEADER *srat)
{
ACPI_SRAT_CPU_AFFINITY *cpu;
ACPI_SRAT_X2APIC_CPU_AFFINITY *x2apic;
+ ACPI_SRAT_GICC_AFFINITY *gic;
- if (srat->Type < sizeof(srat_types) / sizeof(srat_types[0]))
+ if (srat->Type < __arraycount(srat_types))
printf("\tType=%s\n", srat_types[srat->Type]);
else
printf("\tType=%d (unknown)\n", srat->Type);
@@ -1648,6 +1800,11 @@ acpi_print_srat(ACPI_SUBTABLE_HEADER *sr
acpi_print_srat_cpu(x2apic->ApicId, x2apic->ProximityDomain,
x2apic->Flags, x2apic->ClockDomain);
break;
+ case ACPI_SRAT_TYPE_GICC_AFFINITY:
+ gic = (ACPI_SRAT_GICC_AFFINITY *)srat;
+ acpi_print_srat_cpu(gic->AcpiProcessorUid, gic->ProximityDomain,
+ gic->Flags, gic->ClockDomain);
+ break;
}
}
@@ -1664,38 +1821,401 @@ acpi_handle_srat(ACPI_TABLE_HEADER *sdp)
printf(END_COMMENT);
}
+static char *
+acpi_tcpa_evname(struct TCPAevent *event)
+{
+ struct TCPApc_event *pc_event;
+ char *eventname = NULL;
+
+ pc_event = (struct TCPApc_event *)(event + 1);
+
+ switch(event->event_type) {
+ case PREBOOT:
+ case POST_CODE:
+ case UNUSED:
+ case NO_ACTION:
+ case SEPARATOR:
+ case SCRTM_CONTENTS:
+ case SCRTM_VERSION:
+ case CPU_MICROCODE:
+ case PLATFORM_CONFIG_FLAGS:
+ case TABLE_OF_DEVICES:
+ case COMPACT_HASH:
+ case IPL:
+ case IPL_PARTITION_DATA:
+ case NONHOST_CODE:
+ case NONHOST_CONFIG:
+ case NONHOST_INFO:
+ asprintf(&eventname, "%s",
+ tcpa_event_type_strings[event->event_type]);
+ break;
+
+ case ACTION:
+ eventname = calloc(event->event_size + 1, sizeof(char));
+ memcpy(eventname, pc_event, event->event_size);
+ break;
+
+ case EVENT_TAG:
+ switch (pc_event->event_id) {
+ case SMBIOS:
+ case BIS_CERT:
+ case CMOS:
+ case NVRAM:
+ case OPTION_ROM_EXEC:
+ case OPTION_ROM_CONFIG:
+ case S_CRTM_VERSION:
+ case POST_BIOS_ROM:
+ case ESCD:
+ case OPTION_ROM_MICROCODE:
+ case S_CRTM_CONTENTS:
+ case POST_CONTENTS:
+ asprintf(&eventname, "%s",
+ TCPA_pcclient_strings[pc_event->event_id]);
+ break;
+
+ default:
+ asprintf(&eventname, "<unknown tag 0x%02x>",
+ pc_event->event_id);
+ break;
+ }
+ break;
+
+ default:
+ asprintf(&eventname, "<unknown 0x%02x>", event->event_type);
+ break;
+ }
+
+ return eventname;
+}
+
+static void
+acpi_print_tcpa(struct TCPAevent *event)
+{
+ int i;
+ char *eventname;
+
+ eventname = acpi_tcpa_evname(event);
+
+ printf("\t%d", event->pcr_index);
+ printf(" 0x");
+ for (i = 0; i < 20; i++)
+ printf("%02x", event->pcr_value[i]);
+ printf(" [%s]\n", eventname ? eventname : "<unknown>");
+
+ free(eventname);
+}
+
static void
acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp)
{
- ACPI_TABLE_TCPA_HDR *tcpah;
- ACPI_TABLE_TCPA_CLIENT *tcpac;
- ACPI_TABLE_TCPA_SERVER *tcpas;
+ struct TCPAbody *tcpa;
+ struct TCPAevent *event;
+ uintmax_t len, paddr;
+ unsigned char *vaddr = NULL;
+ unsigned char *vend = NULL;
printf(BEGIN_COMMENT);
acpi_print_sdt(sdp);
- tcpah = (void *)sdp;
- switch (tcpah->PlatformClass) {
- case ACPI_TCPA_CLIENT_TABLE:
- tcpac = (void *)((char *)sdp + sizeof(*tcpah));
- printf("\tMinimum Length of Event Log Area=%"PRIu32"\n",
- tcpac->MinimumLogLength);
- printf("\tPhysical Address of Log Area=0x%08"PRIx64"\n",
- tcpac->LogAddress);
+ tcpa = (struct TCPAbody *) sdp;
+
+ switch (tcpa->platform_class) {
+ case ACPI_TCPA_BIOS_CLIENT:
+ len = tcpa->client.log_max_len;
+ paddr = tcpa->client.log_start_addr;
break;
- case ACPI_TCPA_SERVER_TABLE:
- tcpas = (void *)((char *)sdp + sizeof(*tcpah));
- printf("\tMinimum Length of Event Log Area=%"PRIu64"\n",
- tcpas->MinimumLogLength);
- printf("\tPhysical Address of Log Area=0x%08"PRIx64"\n",
- tcpas->LogAddress);
+ case ACPI_TCPA_BIOS_SERVER:
+ len = tcpa->server.log_max_len;
+ paddr = tcpa->server.log_start_addr;
break;
default:
- printf ("\tUnknown TCPA Platform Class 0x%X\n",
- tcpah->PlatformClass);
+ printf("XXX");
+ printf(END_COMMENT);
+ return;
+ }
+ printf("\tClass %u Base Address 0x%jx Length %ju\n\n",
+ tcpa->platform_class, paddr, len);
+
+ if (len == 0) {
+ printf("\tEmpty TCPA table\n");
+ printf(END_COMMENT);
+ return;
+ }
+ if(sdp->Revision == 1) {
+ printf("\tOLD TCPA spec log found. Dumping not supported.\n");
+ printf(END_COMMENT);
+ return;
+ }
+
+ vaddr = (unsigned char *)acpi_map_physical(paddr, len);
+ vend = vaddr + len;
+
+ while (vaddr != NULL) {
+ if ((vaddr + sizeof(struct TCPAevent) >= vend)||
+ (vaddr + sizeof(struct TCPAevent) < vaddr))
+ break;
+ event = (struct TCPAevent *)(void *)vaddr;
+ if (vaddr + event->event_size >= vend)
+ break;
+ if (vaddr + event->event_size < vaddr)
+ break;
+ if (event->event_type == 0 && event->event_size == 0)
+ break;
+#if 0
+ {
+ unsigned int i, j, k;
+
+ printf("\n\tsize %d\n\t\t%p ", event->event_size, vaddr);
+ for (j = 0, i = 0; i <
+ sizeof(struct TCPAevent) + event->event_size; i++) {
+ printf("%02x ", vaddr[i]);
+ if ((i+1) % 8 == 0) {
+ for (k = 0; k < 8; k++)
+ printf("%c", isprint(vaddr[j+k]) ?
+ vaddr[j+k] : '.');
+ printf("\n\t\t%p ", &vaddr[i + 1]);
+ j = i + 1;
+ }
+ }
+ printf("\n"); }
+#endif
+ acpi_print_tcpa(event);
+
+ vaddr += sizeof(struct TCPAevent) + event->event_size;
+ }
+
+ printf(END_COMMENT);
+}
+
+static const char *
+devscope_type2str(int type)
+{
+ static char typebuf[16];
+
+ switch (type) {
+ case 1:
+ return ("PCI Endpoint Device");
+ case 2:
+ return ("PCI Sub-Hierarchy");
+ case 3:
+ return ("IOAPIC");
+ case 4:
+ return ("HPET");
+ default:
+ snprintf(typebuf, sizeof(typebuf), "%d", type);
+ return (typebuf);
+ }
+}
+
+static int
+acpi_handle_dmar_devscope(void *addr, int remaining)
+{
+ char sep;
+ int pathlen;
+ ACPI_DMAR_PCI_PATH *path, *pathend;
+ ACPI_DMAR_DEVICE_SCOPE *devscope = addr;
+
+ if (remaining < (int)sizeof(ACPI_DMAR_DEVICE_SCOPE))
+ return (-1);
+
+ if (remaining < devscope->Length)
+ return (-1);
+
+ printf("\n");
+ printf("\t\tType=%s\n", devscope_type2str(devscope->EntryType));
+ printf("\t\tLength=%d\n", devscope->Length);
+ printf("\t\tEnumerationId=%d\n", devscope->EnumerationId);
+ printf("\t\tStartBusNumber=%d\n", devscope->Bus);
+
+ path = (ACPI_DMAR_PCI_PATH *)(devscope + 1);
+ pathlen = devscope->Length - sizeof(ACPI_DMAR_DEVICE_SCOPE);
+ pathend = path + pathlen / sizeof(ACPI_DMAR_PCI_PATH);
+ if (path < pathend) {
+ sep = '{';
+ printf("\t\tPath=");
+ do {
+ printf("%c%d:%d", sep, path->Device, path->Function);
+ sep=',';
+ path++;
+ } while (path < pathend);
+ printf("}\n");
+ }
+
+ return (devscope->Length);
+}
+
+static void
+acpi_handle_dmar_drhd(ACPI_DMAR_HARDWARE_UNIT *drhd)
+{
+ char *cp;
+ int remaining, consumed;
+
+ printf("\n");
+ printf("\tType=DRHD\n");
+ printf("\tLength=%d\n", drhd->Header.Length);
+
+#define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag)
+
+ printf("\tFlags=");
+ PRINTFLAG(drhd->Flags, INCLUDE_ALL);
+ PRINTFLAG_END();
+
+#undef PRINTFLAG
+
+ printf("\tSegment=%d\n", drhd->Segment);
+ printf("\tAddress=0x%016jx\n", (uintmax_t)drhd->Address);
+
+ remaining = drhd->Header.Length - sizeof(ACPI_DMAR_HARDWARE_UNIT);
+ if (remaining > 0)
+ printf("\tDevice Scope:");
+ while (remaining > 0) {
+ cp = (char *)drhd + drhd->Header.Length - remaining;
+ consumed = acpi_handle_dmar_devscope(cp, remaining);
+ if (consumed <= 0)
+ break;
+ else
+ remaining -= consumed;
+ }
+}
+
+static void
+acpi_handle_dmar_rmrr(ACPI_DMAR_RESERVED_MEMORY *rmrr)
+{
+ char *cp;
+ int remaining, consumed;
+
+ printf("\n");
+ printf("\tType=RMRR\n");
+ printf("\tLength=%d\n", rmrr->Header.Length);
+ printf("\tSegment=%d\n", rmrr->Segment);
+ printf("\tBaseAddress=0x%016jx\n", (uintmax_t)rmrr->BaseAddress);
+ printf("\tLimitAddress=0x%016jx\n", (uintmax_t)rmrr->EndAddress);
+
+ remaining = rmrr->Header.Length - sizeof(ACPI_DMAR_RESERVED_MEMORY);
+ if (remaining > 0)
+ printf("\tDevice Scope:");
+ while (remaining > 0) {
+ cp = (char *)rmrr + rmrr->Header.Length - remaining;
+ consumed = acpi_handle_dmar_devscope(cp, remaining);
+ if (consumed <= 0)
+ break;
+ else
+ remaining -= consumed;
+ }
+}
+
+static void
+acpi_handle_dmar_atsr(ACPI_DMAR_ATSR *atsr)
+{
+ char *cp;
+ int remaining, consumed;
+
+ printf("\n");
+ printf("\tType=ATSR\n");
+ printf("\tLength=%d\n", atsr->Header.Length);
+
+#define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag)
+
+ printf("\tFlags=");
+ PRINTFLAG(atsr->Flags, ALL_PORTS);
+ PRINTFLAG_END();
+
+#undef PRINTFLAG
+
+ printf("\tSegment=%d\n", atsr->Segment);
+
+ remaining = atsr->Header.Length - sizeof(ACPI_DMAR_ATSR);
+ if (remaining > 0)
+ printf("\tDevice Scope:");
+ while (remaining > 0) {
+ cp = (char *)atsr + atsr->Header.Length - remaining;
+ consumed = acpi_handle_dmar_devscope(cp, remaining);
+ if (consumed <= 0)
+ break;
+ else
+ remaining -= consumed;
+ }
+}
+
+static void
+acpi_handle_dmar_rhsa(ACPI_DMAR_RHSA *rhsa)
+{
+
+ printf("\n");
+ printf("\tType=RHSA\n");
+ printf("\tLength=%d\n", rhsa->Header.Length);
+ printf("\tBaseAddress=0x%016jx\n", (uintmax_t)rhsa->BaseAddress);
+ printf("\tProximityDomain=0x%08x\n", rhsa->ProximityDomain);
+}
+
+static int
+acpi_handle_dmar_remapping_structure(void *addr, int remaining)
+{
+ ACPI_DMAR_HEADER *hdr = addr;
+
+ if (remaining < (int)sizeof(ACPI_DMAR_HEADER))
+ return (-1);
+
+ if (remaining < hdr->Length)
+ return (-1);
+
+ switch (hdr->Type) {
+ case ACPI_DMAR_TYPE_HARDWARE_UNIT:
+ acpi_handle_dmar_drhd(addr);
+ break;
+ case ACPI_DMAR_TYPE_RESERVED_MEMORY:
+ acpi_handle_dmar_rmrr(addr);
+ break;
+ case ACPI_DMAR_TYPE_ROOT_ATS:
+ acpi_handle_dmar_atsr(addr);
+ break;
+ case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
+ acpi_handle_dmar_rhsa(addr);
+ break;
+ default:
+ printf("\n");
+ printf("\tType=%d\n", hdr->Type);
+ printf("\tLength=%d\n", hdr->Length);
break;
}
+ return (hdr->Length);
+}
+
+#ifndef ACPI_DMAR_X2APIC_OPT_OUT
+#define ACPI_DMAR_X2APIC_OPT_OUT (0x2)
+#endif
+
+static void
+acpi_handle_dmar(ACPI_TABLE_HEADER *sdp)
+{
+ char *cp;
+ int remaining, consumed;
+ ACPI_TABLE_DMAR *dmar;
+
+ printf(BEGIN_COMMENT);
+ acpi_print_sdt(sdp);
+ dmar = (ACPI_TABLE_DMAR *)sdp;
+ printf("\tHost Address Width=%d\n", dmar->Width + 1);
+
+#define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag)
+
+ printf("\tFlags=");
+ PRINTFLAG(dmar->Flags, INTR_REMAP);
+ PRINTFLAG(dmar->Flags, X2APIC_OPT_OUT);
+ PRINTFLAG_END();
+
+#undef PRINTFLAG
+
+ remaining = sdp->Length - sizeof(ACPI_TABLE_DMAR);
+ while (remaining > 0) {
+ cp = (char *)sdp + sdp->Length - remaining;
+ consumed = acpi_handle_dmar_remapping_structure(cp, remaining);
+ if (consumed <= 0)
+ break;
+ else
+ remaining -= consumed;
+ }
printf(END_COMMENT);
}
@@ -1950,7 +2470,6 @@ acpi_print_rsdt(ACPI_TABLE_HEADER *rsdp)
ACPI_TABLE_RSDT *rsdt;
ACPI_TABLE_XSDT *xsdt;
int i, entries;
- u_long addr = 0;
rsdt = (ACPI_TABLE_RSDT *)rsdp;
xsdt = (ACPI_TABLE_XSDT *)rsdp;
@@ -1961,17 +2480,11 @@ acpi_print_rsdt(ACPI_TABLE_HEADER *rsdp)
for (i = 0; i < entries; i++) {
if (i > 0)
printf(", ");
- switch (addr_size) {
- case 4:
- addr = le32toh(rsdt->TableOffsetEntry[i]);
- break;
- case 8:
- addr = le64toh(xsdt->TableOffsetEntry[i]);
- break;
- default:
- assert(addr == 0);
- }
- printf("0x%08lx", addr);
+ if (addr_size == 4)
+ printf("0x%08x", le32toh(rsdt->TableOffsetEntry[i]));
+ else
+ printf("0x%016jx",
+ (uintmax_t)le64toh(xsdt->TableOffsetEntry[i]));
}
printf(" }\n");
printf(END_COMMENT);
@@ -1987,7 +2500,6 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
{
ACPI_TABLE_FADT *fadt;
const char *pm;
- char sep;
fadt = (ACPI_TABLE_FADT *)sdp;
printf(BEGIN_COMMENT);
@@ -2047,25 +2559,18 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
printf("\tDAY_ALRM=%d, MON_ALRM=%d, CENTURY=%d\n",
fadt->DayAlarm, fadt->MonthAlarm, fadt->Century);
-#define PRINTFLAG(var, flag) do { \
- if ((var) & ACPI_FADT_## flag) { \
- printf("%c%s", sep, #flag); sep = ','; \
- } \
-} while (0)
+#define PRINTFLAG(var, flag) printflag((var), ACPI_FADT_## flag, #flag)
printf("\tIAPC_BOOT_ARCH=");
- sep = '{';
PRINTFLAG(fadt->BootFlags, LEGACY_DEVICES);
PRINTFLAG(fadt->BootFlags, 8042);
PRINTFLAG(fadt->BootFlags, NO_VGA);
PRINTFLAG(fadt->BootFlags, NO_MSI);
PRINTFLAG(fadt->BootFlags, NO_ASPM);
- if (fadt->BootFlags != 0)
- printf("}");
- printf("\n");
+ PRINTFLAG(fadt->BootFlags, NO_CMOS_RTC);
+ PRINTFLAG_END();
printf("\tFlags=");
- sep = '{';
PRINTFLAG(fadt->Flags, WBINVD);
PRINTFLAG(fadt->Flags, WBINVD_FLUSH);
PRINTFLAG(fadt->Flags, C1_SUPPORTED);
@@ -2086,8 +2591,9 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
PRINTFLAG(fadt->Flags, REMOTE_POWER_ON);
PRINTFLAG(fadt->Flags, APIC_CLUSTER);
PRINTFLAG(fadt->Flags, APIC_PHYSICAL);
- if (fadt->Flags != 0)
- printf("}\n");
+ PRINTFLAG(fadt->Flags, HW_REDUCED);
+ PRINTFLAG(fadt->Flags, LOW_POWER_S0);
+ PRINTFLAG_END();
#undef PRINTFLAG
@@ -2097,8 +2603,8 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
printf(", RESET_VALUE=%#x\n", fadt->ResetValue);
}
if (acpi_get_fadt_revision(fadt) > 1) {
- printf("\tX_FACS=0x%08lx, ", (u_long)fadt->XFacs);
- printf("X_DSDT=0x%08lx\n", (u_long)fadt->XDsdt);
+ printf("\tX_FACS=0x%016jx, ", (uintmax_t)fadt->XFacs);
+ printf("X_DSDT=0x%016jx\n", (uintmax_t)fadt->XDsdt);
printf("\tX_PM1a_EVT_BLK=");
acpi_print_gas(&fadt->XPm1aEventBlock);
if (fadt->XPm1bEventBlock.Address != 0) {
@@ -2153,10 +2659,9 @@ acpi_print_facs(ACPI_TABLE_FACS *facs)
printf("S4BIOS");
printf("\n");
- if (facs->XFirmwareWakingVector != 0) {
- printf("\tX_Firm_Wake_Vec=%08lx\n",
- (u_long)facs->XFirmwareWakingVector);
- }
+ if (facs->XFirmwareWakingVector != 0)
+ printf("\tX_Firm_Wake_Vec=%016jx\n",
+ (uintmax_t)facs->XFirmwareWakingVector);
printf("\tVersion=%u\n", facs->Version);
printf(END_COMMENT);
@@ -2206,8 +2711,8 @@ acpi_print_rsd_ptr(ACPI_TABLE_RSDP *rp)
printf("\tRSDT=0x%08x, cksum=%u\n", rp->RsdtPhysicalAddress,
rp->Checksum);
} else {
- printf("\tXSDT=0x%08lx, length=%u, cksum=%u\n",
- (u_long)rp->XsdtPhysicalAddress, rp->Length,
+ printf("\tXSDT=0x%016jx, length=%u, cksum=%u\n",
+ (uintmax_t)rp->XsdtPhysicalAddress, rp->Length,
rp->ExtendedChecksum);
}
printf(END_COMMENT);
@@ -2227,17 +2732,12 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp
xsdt = (ACPI_TABLE_XSDT *)rsdp;
entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
for (i = 0; i < entries; i++) {
- switch (addr_size) {
- case 4:
+ if (addr_size == 4)
addr = le32toh(rsdt->TableOffsetEntry[i]);
- break;
- case 8:
+ else
addr = le64toh(xsdt->TableOffsetEntry[i]);
- break;
- default:
- assert(addr == 0);
- }
-
+ if (addr == 0)
+ continue;
sdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(addr);
if (acpi_checksum(sdp, sdp->Length)) {
warnx("RSDT entry %d (sig %.4s) is corrupt", i,
@@ -2255,6 +2755,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp
acpi_handle_cpep(sdp);
else if (!memcmp(sdp->Signature, ACPI_SIG_DBGP, 4))
acpi_handle_dbgp(sdp);
+ else if (!memcmp(sdp->Signature, ACPI_SIG_DMAR, 4))
+ acpi_handle_dmar(sdp);
else if (!memcmp(sdp->Signature, ACPI_SIG_EINJ, 4))
acpi_handle_einj(sdp);
else if (!memcmp(sdp->Signature, ACPI_SIG_ERST, 4))
@@ -2385,12 +2887,14 @@ dsdt_save_file(char *outfile, ACPI_TABLE
void
aml_disassemble(ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp)
{
- char buf[MAXPATHLEN], tmpstr[MAXPATHLEN];
+ char buf[MAXPATHLEN], tmpstr[MAXPATHLEN], wrkdir[MAXPATHLEN];
+ const char *iname = "/acpdump.din";
+ const char *oname = "/acpdump.dsl";
const char *tmpdir;
- char *tmpext;
FILE *fp;
size_t len;
- int fd;
+ int fd, status;
+ pid_t pid;
if (rsdt == NULL)
errx(EXIT_FAILURE, "aml_disassemble: invalid rsdt");
@@ -2400,17 +2904,22 @@ aml_disassemble(ACPI_TABLE_HEADER *rsdt,
tmpdir = getenv("TMPDIR");
if (tmpdir == NULL)
tmpdir = _PATH_TMP;
- strlcpy(tmpstr, tmpdir, sizeof(tmpstr));
- if (realpath(tmpstr, buf) == NULL) {
- perror("realpath tmp file");
+ if (realpath(tmpdir, buf) == NULL) {
+ perror("realpath tmp dir");
return;
}
- strlcpy(tmpstr, buf, sizeof(tmpstr));
- strlcat(tmpstr, "/acpidump.", sizeof(tmpstr));
- len = strlen(tmpstr);
- tmpext = tmpstr + len;
- strlcpy(tmpext, "XXXXXX", sizeof(tmpstr) - len);
- fd = mkstemp(tmpstr);
+ len = sizeof(wrkdir) - strlen(iname);
+ if ((size_t)snprintf(wrkdir, len, "%s/acpidump.XXXXXX", buf) > len-1 ) {
+ fprintf(stderr, "$TMPDIR too long\n");
+ return;
+ }
+ if (mkdtemp(wrkdir) == NULL) {
+ perror("mkdtemp tmp working dir");
+ return;
+ }
+ len = (size_t)snprintf(tmpstr, sizeof(tmpstr), "%s%s", wrkdir, iname);
+ assert(len <= sizeof(tmpstr) - 1);
+ fd = open(tmpstr, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
if (fd < 0) {
perror("iasl tmp file");
return;
@@ -2419,28 +2928,46 @@ aml_disassemble(ACPI_TABLE_HEADER *rsdt,
close(fd);
/* Run iasl -d on the temp file */
- if (fork() == 0) {
+ if ((pid = fork()) == 0) {
close(STDOUT_FILENO);
if (vflag == 0)
close(STDERR_FILENO);
execl("/usr/bin/iasl", "iasl", "-d", tmpstr, NULL);
err(EXIT_FAILURE, "exec");
}
-
- wait(NULL);
- unlink(tmpstr);
+ if (pid > 0)
+ wait(&status);
+ if (unlink(tmpstr) < 0) {
+ perror("unlink");
+ goto out;
+ }
+ if (pid < 0) {
+ perror("fork");
+ goto out;
+ }
+ if (status != 0) {
+ fprintf(stderr, "iast exit status = %d\n", status);
+ }
/* Dump iasl's output to stdout */
- strlcpy(tmpext, "dsl", sizeof(tmpstr) - len);
+ len = (size_t)snprintf(tmpstr, sizeof(tmpstr), "%s%s", wrkdir, oname);
+ assert(len <= sizeof(tmpstr) - 1);
fp = fopen(tmpstr, "r");
- unlink(tmpstr);
+ if (unlink(tmpstr) < 0) {
+ perror("unlink");
+ goto out;
+ }
if (fp == NULL) {
perror("iasl tmp file (read)");
- return;
+ goto out;
}
while ((len = fread(buf, 1, sizeof(buf), fp)) > 0)
fwrite(buf, 1, len, stdout);
fclose(fp);
+
+ out:
+ if (rmdir(wrkdir) < 0)
+ perror("rmdir");
}
void
@@ -2463,16 +2990,12 @@ sdt_from_rsdt(ACPI_TABLE_HEADER *rsdp, c
xsdt = (ACPI_TABLE_XSDT *)rsdp;
entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
for (i = 0; i < entries; i++) {
- switch (addr_size) {
- case 4:
+ if (addr_size == 4)
addr = le32toh(rsdt->TableOffsetEntry[i]);
- break;
- case 8:
+ else
addr = le64toh(xsdt->TableOffsetEntry[i]);
- break;
- default:
- assert(addr == 0);
- }
+ if (addr == 0)
+ continue;
sdt = (ACPI_TABLE_HEADER *)acpi_map_sdt(addr);
if (last != NULL) {
if (sdt == last)
Index: src/usr.sbin/acpitools/acpidump/acpi_user.c
diff -u src/usr.sbin/acpitools/acpidump/acpi_user.c:1.3 src/usr.sbin/acpitools/acpidump/acpi_user.c:1.4
--- src/usr.sbin/acpitools/acpidump/acpi_user.c:1.3 Thu Aug 3 05:54:45 2017
+++ src/usr.sbin/acpitools/acpidump/acpi_user.c Fri Aug 4 06:30:36 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_user.c,v 1.3 2017/08/03 05:54:45 msaitoh Exp $ */
+/* $NetBSD: acpi_user.c,v 1.4 2017/08/04 06:30:36 msaitoh Exp $ */
/*-
* Copyright (c) 1999 Doug Rabson
@@ -26,11 +26,11 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/usr.sbin/acpi/acpidump/acpi_user.c,v 1.15 2009/08/25 20:35:57 jhb Exp $
+ * $FreeBSD: head/usr.sbin/acpi/acpidump/acpi_user.c 251186 2013-05-31 17:23:38Z jkim $
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: acpi_user.c,v 1.3 2017/08/03 05:54:45 msaitoh Exp $");
+__RCSID("$NetBSD: acpi_user.c,v 1.4 2017/08/04 06:30:36 msaitoh Exp $");
#include <sys/param.h>
#include <sys/mman.h>
@@ -56,7 +56,7 @@ struct acpi_user_mapping {
size_t size;
};
-LIST_HEAD(acpi_user_mapping_list, acpi_user_mapping) maplist;
+static LIST_HEAD(acpi_user_mapping_list, acpi_user_mapping) maplist;
static void
acpi_user_init(void)
@@ -122,7 +122,7 @@ acpi_get_rsdp(u_long addr)
/* If the revision is 0, assume a version 1 length. */
if (rsdp.Revision == 0)
- len = ACPI_RSDP_REV0_SIZE;
+ len = sizeof(ACPI_RSDP_COMMON);
else
len = rsdp.Length;
Index: src/usr.sbin/acpitools/acpidump/acpidump.8
diff -u src/usr.sbin/acpitools/acpidump/acpidump.8:1.7 src/usr.sbin/acpitools/acpidump/acpidump.8:1.8
--- src/usr.sbin/acpitools/acpidump/acpidump.8:1.7 Tue Mar 18 18:20:46 2014
+++ src/usr.sbin/acpitools/acpidump/acpidump.8 Fri Aug 4 06:30:36 2017
@@ -1,4 +1,4 @@
-.\" $NetBSD: acpidump.8,v 1.7 2014/03/18 18:20:46 riastradh Exp $
+.\" $NetBSD: acpidump.8,v 1.8 2017/08/04 06:30:36 msaitoh Exp $
.\" ACPI (ACPI Package)
.\"
.\" Copyright (c) 1999 Doug Rabson <[email protected]>
@@ -28,9 +28,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: src/usr.sbin/acpi/acpidump/acpidump.8,v 1.24 2007/03/14 22:55:30 njl Exp $
+.\" $FreeBSD: head/usr.sbin/acpi/acpidump/acpidump.8 267668 2014-06-20 09:57:27Z bapt $
.\"
-.Dd February 17, 2011
+.Dd August 4, 2017
.Dt ACPIDUMP 8
.Os
.Sh NAME
@@ -100,6 +100,7 @@ utility dumps contents of the following
.It BOOT
.It CPEP
.It DBGP
+.It DMAR
.It DSDT
.It ECDT
.It EINJ
Index: src/usr.sbin/acpitools/acpidump/acpidump.c
diff -u src/usr.sbin/acpitools/acpidump/acpidump.c:1.6 src/usr.sbin/acpitools/acpidump/acpidump.c:1.7
--- src/usr.sbin/acpitools/acpidump/acpidump.c:1.6 Sun Sep 20 17:45:25 2015
+++ src/usr.sbin/acpitools/acpidump/acpidump.c Fri Aug 4 06:30:36 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: acpidump.c,v 1.6 2015/09/20 17:45:25 wiz Exp $ */
+/* $NetBSD: acpidump.c,v 1.7 2017/08/04 06:30:36 msaitoh Exp $ */
/*-
* Copyright (c) 2000 Mitsuru IWASAKI <[email protected]>
@@ -25,11 +25,11 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/usr.sbin/acpi/acpidump/acpidump.c,v 1.13 2009/08/25 20:35:57 jhb Exp $
+ * $FreeBSD: head/usr.sbin/acpi/acpidump/acpidump.c 302788 2016-07-13 22:53:30Z andrew $
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: acpidump.c,v 1.6 2015/09/20 17:45:25 wiz Exp $");
+__RCSID("$NetBSD: acpidump.c,v 1.7 2017/08/04 06:30:36 msaitoh Exp $");
#include <sys/param.h>
@@ -64,7 +64,7 @@ int
main(int argc, char *argv[])
{
ACPI_TABLE_HEADER *rsdt, *sdt;
- char c;
+ int c;
char *dsdt_input_file, *dsdt_output_file;
dsdt_input_file = dsdt_output_file = NULL;
Index: src/usr.sbin/acpitools/acpidump/acpidump.h
diff -u src/usr.sbin/acpitools/acpidump/acpidump.h:1.5 src/usr.sbin/acpitools/acpidump/acpidump.h:1.6
--- src/usr.sbin/acpitools/acpidump/acpidump.h:1.5 Thu Feb 17 15:06:34 2011
+++ src/usr.sbin/acpitools/acpidump/acpidump.h Fri Aug 4 06:30:36 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: acpidump.h,v 1.5 2011/02/17 15:06:34 jruoho Exp $ */
+/* $NetBSD: acpidump.h,v 1.6 2017/08/04 06:30:36 msaitoh Exp $ */
/*-
* Copyright (c) 1999 Doug Rabson
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/usr.sbin/acpi/acpidump/acpidump.h,v 1.24 2009/08/25 20:35:57 jhb Exp $
+ * $FreeBSD$
*/
#ifndef _ACPIDUMP_H_
@@ -54,11 +54,81 @@
#define ACPI_HPET_ID_LEGACY_CAPABLE 0x00008000
#define ACPI_HPET_ID_PCI_VENDOR_ID 0xffff0000
-#define ACPI_RSDP_REV0_SIZE 20 /* Size of original ACPI 1.0 RSDP */
-
/* Find and map the RSD PTR structure and return it for parsing */
ACPI_TABLE_HEADER *sdt_load_devmem(void);
+/* TCPA */
+struct TCPAbody {
+ ACPI_TABLE_HEADER header;
+ uint16_t platform_class;
+#define ACPI_TCPA_BIOS_CLIENT 0x00
+#define ACPI_TCPA_BIOS_SERVER 0x01
+ union {
+ struct client_hdr {
+ uint32_t log_max_len __packed;
+ uint64_t log_start_addr __packed;
+ } client;
+ struct server_hdr {
+ uint16_t reserved;
+ uint64_t log_max_len __packed;
+ uint64_t log_start_addr __packed;
+ } server;
+ };
+} __packed;
+
+struct TCPAevent {
+ u_int32_t pcr_index;
+ u_int32_t event_type;
+ u_int8_t pcr_value[20];
+ u_int32_t event_size;
+ u_int8_t event_data[0];
+};
+
+struct TCPApc_event {
+ u_int32_t event_id;
+ u_int32_t event_size;
+ u_int8_t event_data[0];
+};
+
+enum TCPAevent_types {
+ PREBOOT = 0,
+ POST_CODE,
+ UNUSED,
+ NO_ACTION,
+ SEPARATOR,
+ ACTION,
+ EVENT_TAG,
+ SCRTM_CONTENTS,
+ SCRTM_VERSION,
+ CPU_MICROCODE,
+ PLATFORM_CONFIG_FLAGS,
+ TABLE_OF_DEVICES,
+ COMPACT_HASH,
+ IPL,
+ IPL_PARTITION_DATA,
+ NONHOST_CODE,
+ NONHOST_CONFIG,
+ NONHOST_INFO,
+ EVENT_TYPE_MAX,
+};
+
+enum TCPApcclient_ids {
+ SMBIOS = 1,
+ BIS_CERT,
+ POST_BIOS_ROM,
+ ESCD,
+ CMOS,
+ NVRAM,
+ OPTION_ROM_EXEC,
+ OPTION_ROM_CONFIG,
+ OPTION_ROM_MICROCODE = 10,
+ S_CRTM_VERSION,
+ S_CRTM_CONTENTS,
+ POST_CONTENTS,
+ HOST_TABLE_OF_DEVICES,
+ PCCLIENT_ID_MAX,
+};
+
/*
* Load the DSDT from a previous save file. Note that other tables are
* not saved (i.e. FADT)