Module Name: src Committed By: msaitoh Date: Thu Aug 31 06:53:58 UTC 2017
Modified Files: src/usr.sbin/acpitools/acpidump: acpi.c acpidump.8 Log Message: - Decode ACPI_HEST_GENERIC_V2. - Decode ACPI_MADT_GENERIC_MSI_FRAME. - Add NMI, CMCI, MCE, GPIO-Signal, ARMv8 SEA, ARMv8 SEI and GSIV in acpi_print_hest_notify(). - Add ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS and ACPI_EINJ_GET_EXECUTE_TIMINGS in acpi_print_einj_action(). - Add ACPI_ERST_EXECUTE_TIMINGS in acpi_print_erst_action(). - Decode NFIT (NVDIMM Firmware Interface Table) from FreeBSD. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/usr.sbin/acpitools/acpidump/acpi.c cvs rdiff -u -r1.8 -r1.9 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.18 src/usr.sbin/acpitools/acpidump/acpi.c:1.19 --- src/usr.sbin/acpitools/acpidump/acpi.c:1.18 Mon Aug 21 02:58:49 2017 +++ src/usr.sbin/acpitools/acpidump/acpi.c Thu Aug 31 06:53:58 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi.c,v 1.18 2017/08/21 02:58:49 msaitoh Exp $ */ +/* $NetBSD: acpi.c,v 1.19 2017/08/31 06:53:58 msaitoh Exp $ */ /*- * Copyright (c) 1998 Doug Rabson @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: acpi.c,v 1.18 2017/08/21 02:58:49 msaitoh Exp $"); +__RCSID("$NetBSD: acpi.c,v 1.19 2017/08/31 06:53:58 msaitoh Exp $"); #include <sys/param.h> #include <sys/endian.h> @@ -46,6 +46,7 @@ __RCSID("$NetBSD: acpi.c,v 1.18 2017/08/ #include <string.h> #include <unistd.h> #include <stddef.h> +#include <uuid.h> #include "acpidump.h" @@ -100,6 +101,8 @@ static void acpi_print_srat_memory(ACPI_ static void acpi_print_srat(ACPI_SUBTABLE_HEADER *srat); static void acpi_handle_srat(ACPI_TABLE_HEADER *sdp); static void acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp); +static void acpi_print_nfit(ACPI_NFIT_HEADER *nfit); +static void acpi_handle_nfit(ACPI_TABLE_HEADER *sdp); static void acpi_handle_waet(ACPI_TABLE_HEADER *sdp); static void acpi_handle_wdat(ACPI_TABLE_HEADER *sdp); static void acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp); @@ -113,6 +116,8 @@ static void acpi_print_rsd_ptr(ACPI_TABL static void acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp); static void acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first, void (*action)(ACPI_SUBTABLE_HEADER *)); +static void acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first, + void (*action)(ACPI_NFIT_HEADER *)); /* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */ static int addr_size; @@ -361,6 +366,9 @@ acpi_print_hest_header(ACPI_HEST_HEADER case ACPI_HEST_TYPE_GENERIC_ERROR: printf("Generic Hardware Error Source\n"); break; + case ACPI_HEST_TYPE_GENERIC_ERROR_V2: + printf("Generic Hardware Error Source version 2\n"); + break; case ACPI_HEST_TYPE_RESERVED: default: printf("Reserved\n"); @@ -420,6 +428,24 @@ acpi_print_hest_notify(ACPI_HEST_NOTIFY case ACPI_HEST_NOTIFY_NMI: printf("NMI"); break; + case ACPI_HEST_NOTIFY_CMCI: + printf("CMCI"); + break; + case ACPI_HEST_NOTIFY_MCE: + printf("MCE"); + break; + case ACPI_HEST_NOTIFY_GPIO: + printf("GPIO-Signal"); + break; + case ACPI_HEST_NOTIFY_SEA: + printf("ARMv8 SEA"); + break; + case ACPI_HEST_NOTIFY_SEI: + printf("ARMv8 SEI"); + break; + case ACPI_HEST_NOTIFY_GSIV: + printf("External Interrupt - GSIV"); + break; case ACPI_HEST_NOTIFY_RESERVED: printf("RESERVED"); break; @@ -656,6 +682,21 @@ acpi_print_hest_generic(ACPI_HEST_GENERI } static void +acpi_print_hest_generic_v2(ACPI_HEST_GENERIC_V2 *data) +{ + + /* The first 64 bytes are the same as ACPI_HEST_GENERIC */ + acpi_print_hest_generic((ACPI_HEST_GENERIC *)data); + + printf("\tError Status Address"); + acpi_print_gas(&data->ReadAckRegister); + printf("\tRead Ack Preserve=0x%016jx\n", + (uintmax_t)data->ReadAckPreserve); + printf("\tRead Ack Write=0x%016jx\n", + (uintmax_t)data->ReadAckWrite); +} + +static void acpi_handle_hest(ACPI_TABLE_HEADER *sdp) { ACPI_TABLE_HEST *hest; @@ -717,6 +758,11 @@ acpi_handle_hest(ACPI_TABLE_HEADER *sdp) pos += sizeof(ACPI_HEST_GENERIC); break; + case ACPI_HEST_TYPE_GENERIC_ERROR_V2: + acpi_print_hest_generic_v2(subtable); + pos += sizeof(ACPI_HEST_GENERIC_V2); + break; + case ACPI_HEST_TYPE_RESERVED: default: pos += sizeof(ACPI_HEST_HEADER); @@ -820,6 +866,27 @@ acpi_walk_subtables(ACPI_TABLE_HEADER *t } static void +acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first, + void (*action)(ACPI_NFIT_HEADER *)) +{ + ACPI_NFIT_HEADER *subtable; + char *end; + + subtable = first; + end = (char *)table + table->Length; + while ((char *)subtable < end) { + printf("\n"); + if (subtable->Length < sizeof(ACPI_NFIT_HEADER)) { + warnx("invalid subtable length %u", subtable->Length); + return; + } + action(subtable); + subtable = (ACPI_NFIT_HEADER *)((char *)subtable + + subtable->Length); + } +} + +static void acpi_print_cpu(u_char cpu_id) { @@ -954,6 +1021,17 @@ static const char *platform_int_types[] "Corrected Platform Error" }; static void +acpi_print_gicm_flags(ACPI_MADT_GENERIC_MSI_FRAME *gicm) +{ + uint32_t flags = gicm->Flags; + + printf("\tFLAGS={ "); + if (flags & ACPI_MADT_OVERRIDE_SPI_VALUES) + printf("SPI Count/Base Select"); + printf("}\n"); +} + +static void acpi_print_madt(ACPI_SUBTABLE_HEADER *mp) { ACPI_MADT_LOCAL_APIC *lapic; @@ -969,6 +1047,7 @@ acpi_print_madt(ACPI_SUBTABLE_HEADER *mp ACPI_MADT_LOCAL_X2APIC_NMI *x2apic_nmi; ACPI_MADT_GENERIC_INTERRUPT *gicc; ACPI_MADT_GENERIC_DISTRIBUTOR *gicd; + ACPI_MADT_GENERIC_MSI_FRAME *gicm; ACPI_MADT_GENERIC_REDISTRIBUTOR *gicr; ACPI_MADT_GENERIC_TRANSLATOR *gict; @@ -1066,6 +1145,13 @@ acpi_print_madt(ACPI_SUBTABLE_HEADER *mp printf("\tVector Base=%d\n", gicd->GlobalIrqBase); printf("\tGIC VERSION=%d\n", (u_int)gicd->Version); break; + case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: + gicm = (ACPI_MADT_GENERIC_MSI_FRAME*)mp; + printf("\tBase ADDR=%016jx\n", (uintmax_t)gicm->BaseAddress); + acpi_print_gicm_flags(gicm); + printf("\tSPI Count=%u\n", gicm->SpiCount); + printf("\tSPI Base=%u\n", gicm->SpiBase); + break; case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: gicr = (ACPI_MADT_GENERIC_REDISTRIBUTOR *)mp; printf("\tBase ADDR=%016jx\n", (uintmax_t)gicr->BaseAddress); @@ -1217,6 +1303,12 @@ acpi_print_einj_action(ACPI_WHEA_HEADER case ACPI_EINJ_GET_COMMAND_STATUS: printf("Get Command Status"); break; + case ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS: + printf("Set Error Type With Address"); + break; + case ACPI_EINJ_GET_EXECUTE_TIMINGS: + printf("Get Execute Operation Timings"); + break; case ACPI_EINJ_ACTION_RESERVED: printf("Preserved"); break; @@ -1353,6 +1445,9 @@ acpi_print_erst_action(ACPI_WHEA_HEADER case ACPI_ERST_GET_ERROR_ATTRIBUTES: printf("Get Error Attributes"); break; + case ACPI_ERST_EXECUTE_TIMINGS: + printf("Execute Operation Timings"); + break; case ACPI_ERST_ACTION_RESERVED: printf("Reserved"); break; @@ -1839,6 +1934,176 @@ acpi_handle_srat(ACPI_TABLE_HEADER *sdp) printf(END_COMMENT); } +static const char *nfit_types[] = { + [ACPI_NFIT_TYPE_SYSTEM_ADDRESS] = "System Address", + [ACPI_NFIT_TYPE_MEMORY_MAP] = "Memory Map", + [ACPI_NFIT_TYPE_INTERLEAVE] = "Interleave", + [ACPI_NFIT_TYPE_SMBIOS] = "SMBIOS", + [ACPI_NFIT_TYPE_CONTROL_REGION] = "Control Region", + [ACPI_NFIT_TYPE_DATA_REGION] = "Data Region", + [ACPI_NFIT_TYPE_FLUSH_ADDRESS] = "Flush Address" +}; + + +static void +acpi_print_nfit(ACPI_NFIT_HEADER *nfit) +{ + char *uuidstr; + uint32_t status; + + ACPI_NFIT_SYSTEM_ADDRESS *sysaddr; + ACPI_NFIT_MEMORY_MAP *mmap; + ACPI_NFIT_INTERLEAVE *ileave; + ACPI_NFIT_SMBIOS *smbios __unused; + ACPI_NFIT_CONTROL_REGION *ctlreg; + ACPI_NFIT_DATA_REGION *datareg; + ACPI_NFIT_FLUSH_ADDRESS *fladdr; + + if (nfit->Type < __arraycount(nfit_types)) + printf("\tType=%s\n", nfit_types[nfit->Type]); + else + printf("\tType=%u (unknown)\n", nfit->Type); + switch (nfit->Type) { + case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: + sysaddr = (ACPI_NFIT_SYSTEM_ADDRESS *)nfit; + printf("\tRangeIndex=%u\n", (u_int)sysaddr->RangeIndex); + printf("\tProximityDomain=%u\n", + (u_int)sysaddr->ProximityDomain); + uuid_to_string((uuid_t *)(sysaddr->RangeGuid), + &uuidstr, &status); + if (status != uuid_s_ok) + errx(1, "uuid_to_string: status=%u", status); + printf("\tRangeGuid=%s\n", uuidstr); + free(uuidstr); + printf("\tAddress=0x%016jx\n", (uintmax_t)sysaddr->Address); + printf("\tLength=0x%016jx\n", (uintmax_t)sysaddr->Length); + printf("\tMemoryMapping=0x%016jx\n", + (uintmax_t)sysaddr->MemoryMapping); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(sysaddr->Flags, ADD_ONLINE_ONLY); + PRINTFLAG(sysaddr->Flags, PROXIMITY_VALID); + PRINTFLAG_END(); + +#undef PRINTFLAG + + break; + case ACPI_NFIT_TYPE_MEMORY_MAP: + mmap = (ACPI_NFIT_MEMORY_MAP *)nfit; + printf("\tDeviceHandle=%u\n", (u_int)mmap->DeviceHandle); + printf("\tPhysicalId=%u\n", (u_int)mmap->PhysicalId); + printf("\tRegionId=%u\n", (u_int)mmap->RegionId); + printf("\tRangeIndex=%u\n", (u_int)mmap->RangeIndex); + printf("\tRegionIndex=%u\n", (u_int)mmap->RegionIndex); + printf("\tRegionSize=0x%016jx\n", (uintmax_t)mmap->RegionSize); + printf("\tRegionOffset=0x%016jx\n", + (uintmax_t)mmap->RegionOffset); + printf("\tAddress=0x%016jx\n", (uintmax_t)mmap->Address); + printf("\tInterleaveIndex=%u\n", (u_int)mmap->InterleaveIndex); + printf("\tInterleaveWays=%u\n", (u_int)mmap->InterleaveWays); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_MEM_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(mmap->Flags, SAVE_FAILED); + PRINTFLAG(mmap->Flags, RESTORE_FAILED); + PRINTFLAG(mmap->Flags, FLUSH_FAILED); + PRINTFLAG(mmap->Flags, NOT_ARMED); + PRINTFLAG(mmap->Flags, HEALTH_OBSERVED); + PRINTFLAG(mmap->Flags, HEALTH_ENABLED); + PRINTFLAG(mmap->Flags, MAP_FAILED); + PRINTFLAG_END(); + +#undef PRINTFLAG + + break; + case ACPI_NFIT_TYPE_INTERLEAVE: + ileave = (ACPI_NFIT_INTERLEAVE *)nfit; + printf("\tInterleaveIndex=%u\n", + (u_int)ileave->InterleaveIndex); + printf("\tLineCount=%u\n", (u_int)ileave->LineCount); + printf("\tLineSize=%u\n", (u_int)ileave->LineSize); + /* XXX ileave->LineOffset[i] output is not supported */ + break; + case ACPI_NFIT_TYPE_SMBIOS: + smbios = (ACPI_NFIT_SMBIOS *)nfit; + /* XXX smbios->Data[x] output is not supported */ + break; + case ACPI_NFIT_TYPE_CONTROL_REGION: + ctlreg = (ACPI_NFIT_CONTROL_REGION *)nfit; + printf("\tRegionIndex=%u\n", (u_int)ctlreg->RegionIndex); + printf("\tVendorId=0x%04x\n", (u_int)ctlreg->VendorId); + printf("\tDeviceId=0x%04x\n", (u_int)ctlreg->DeviceId); + printf("\tRevisionId=%u\n", (u_int)ctlreg->RevisionId); + printf("\tSubsystemVendorId=0x%04x\n", + (u_int)ctlreg->SubsystemVendorId); + printf("\tSubsystemDeviceId=0x%04x\n", + (u_int)ctlreg->SubsystemDeviceId); + printf("\tSubsystemRevisionId=%u\n", + (u_int)ctlreg->SubsystemRevisionId); + printf("\tValidFields=%u\n", (u_int)ctlreg->ValidFields); + printf("\tManufacturingLocation=%u\n", + (u_int)ctlreg->ManufacturingLocation); + printf("\tManufacturingDate=%u\n", + (u_int)ctlreg->ManufacturingDate); + printf("\tSerialNumber=%u\n", + (u_int)ctlreg->SerialNumber); + printf("\tCode=0x%04x\n", (u_int)ctlreg->Code); + printf("\tWindows=%u\n", (u_int)ctlreg->Windows); + printf("\tWindowSize=0x%016jx\n", + (uintmax_t)ctlreg->WindowSize); + printf("\tCommandOffset=0x%016jx\n", + (uintmax_t)ctlreg->CommandOffset); + printf("\tCommandSize=0x%016jx\n", + (uintmax_t)ctlreg->CommandSize); + printf("\tStatusOffset=0x%016jx\n", + (uintmax_t)ctlreg->StatusOffset); + printf("\tStatusSize=0x%016jx\n", + (uintmax_t)ctlreg->StatusSize); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(ctlreg->Flags, ADD_ONLINE_ONLY); + PRINTFLAG(ctlreg->Flags, PROXIMITY_VALID); + PRINTFLAG_END(); + +#undef PRINTFLAG + + break; + case ACPI_NFIT_TYPE_DATA_REGION: + datareg = (ACPI_NFIT_DATA_REGION *)nfit; + printf("\tRegionIndex=%u\n", (u_int)datareg->RegionIndex); + printf("\tWindows=%u\n", (u_int)datareg->Windows); + printf("\tOffset=0x%016jx\n", (uintmax_t)datareg->Offset); + printf("\tSize=0x%016jx\n", (uintmax_t)datareg->Size); + printf("\tCapacity=0x%016jx\n", (uintmax_t)datareg->Capacity); + printf("\tStartAddress=0x%016jx\n", + (uintmax_t)datareg->StartAddress); + break; + case ACPI_NFIT_TYPE_FLUSH_ADDRESS: + fladdr = (ACPI_NFIT_FLUSH_ADDRESS *)nfit; + printf("\tDeviceHandle=%u\n", (u_int)fladdr->DeviceHandle); + printf("\tHintCount=%u\n", (u_int)fladdr->HintCount); + /* XXX fladdr->HintAddress[i] output is not supported */ + break; + } +} + +static void +acpi_handle_nfit(ACPI_TABLE_HEADER *sdp) +{ + ACPI_TABLE_NFIT *nfit; + + printf(BEGIN_COMMENT); + acpi_print_sdt(sdp); + nfit = (ACPI_TABLE_NFIT *)sdp; + acpi_walk_nfit(sdp, (nfit + 1), acpi_print_nfit); + printf(END_COMMENT); +} + static char * acpi_tcpa_evname(struct TCPAevent *event) { @@ -2801,6 +3066,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp acpi_handle_srat(sdp); else if (!memcmp(sdp->Signature, ACPI_SIG_TCPA, 4)) acpi_handle_tcpa(sdp); + else if (!memcmp(sdp->Signature, ACPI_SIG_NFIT, 4)) + acpi_handle_nfit(sdp); else if (!memcmp(sdp->Signature, ACPI_SIG_WAET, 4)) acpi_handle_waet(sdp); else if (!memcmp(sdp->Signature, ACPI_SIG_WDAT, 4)) Index: src/usr.sbin/acpitools/acpidump/acpidump.8 diff -u src/usr.sbin/acpitools/acpidump/acpidump.8:1.8 src/usr.sbin/acpitools/acpidump/acpidump.8:1.9 --- src/usr.sbin/acpitools/acpidump/acpidump.8:1.8 Fri Aug 4 06:30:36 2017 +++ src/usr.sbin/acpitools/acpidump/acpidump.8 Thu Aug 31 06:53:58 2017 @@ -1,4 +1,4 @@ -.\" $NetBSD: acpidump.8,v 1.8 2017/08/04 06:30:36 msaitoh Exp $ +.\" $NetBSD: acpidump.8,v 1.9 2017/08/31 06:53:58 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 August 4, 2017 +.Dd August 31, 2017 .Dt ACPIDUMP 8 .Os .Sh NAME @@ -112,6 +112,7 @@ utility dumps contents of the following .It MADT .It MCFG .It MSCT +.It NFIT .It RSD PTR .It RSDT .It SBST