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