Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F135013268
D11479.id30497.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D11479.id30497.diff
View Options
Index: usr.sbin/acpi/acpidump/acpi.c
===================================================================
--- usr.sbin/acpi/acpidump/acpi.c
+++ usr.sbin/acpi/acpidump/acpi.c
@@ -40,6 +40,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <uuid.h>
#include "acpidump.h"
@@ -70,6 +71,8 @@
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_print_sdt(ACPI_TABLE_HEADER *sdp);
static void acpi_print_fadt(ACPI_TABLE_HEADER *sdp);
static void acpi_print_facs(ACPI_TABLE_FACS *facs);
@@ -79,6 +82,8 @@
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;
@@ -270,6 +275,10 @@
end = (char *)table + table->Length;
while ((char *)subtable < end) {
printf("\n");
+ if (subtable->Length < sizeof(ACPI_SUBTABLE_HEADER)) {
+ warn("Invalid subtable length %d", subtable->Length);
+ return;
+ }
action(subtable);
subtable = (ACPI_SUBTABLE_HEADER *)((char *)subtable +
subtable->Length);
@@ -277,6 +286,27 @@
}
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)) {
+ warn("Invalid subtable length %d", subtable->Length);
+ return;
+ }
+ action(subtable);
+ subtable = (ACPI_NFIT_HEADER *)((char *)subtable +
+ subtable->Length);
+ }
+}
+
+static void
acpi_print_cpu(u_char cpu_id)
{
@@ -1123,6 +1153,149 @@
printf(END_COMMENT);
}
+static const char *nfit_types[] = { "System Address", "Memory Map",
+ "Interleave", "SMBIOS",
+ "Control Region", "Data Region",
+ "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;
+ ACPI_NFIT_CONTROL_REGION *ctlreg;
+ ACPI_NFIT_DATA_REGION *datareg;
+ ACPI_NFIT_FLUSH_ADDRESS *fladdr;
+
+ if (nfit->Type < nitems(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);
+ 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=%u\n", (u_int)mmap->RegionSize);
+ printf("\tRegionOffset=%u\n", (u_int)mmap->RegionOffset);
+ printf("\tAddress=0x%016jx\n", (uintmax_t)mmap->Address);
+ printf("\tInterleaveIndex=%u\n", (u_int)mmap->InterleaveIndex);
+
+#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);
+ printf("\tLineOffset=%u\n", (u_int)ileave->LineOffset[1]);
+ break;
+ case ACPI_NFIT_TYPE_SMBIOS:
+ smbios = (ACPI_NFIT_SMBIOS *)nfit;
+ printf("\tData=%u\n", (u_int)smbios->Data[1]);
+ 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("\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(mmap->Flags, ADD_ONLINE_ONLY);
+ PRINTFLAG(mmap->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);
+ printf("\tHintAddress=0x%016jx\n", (uintmax_t)fladdr->HintAddress[1]);
+ 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 void
acpi_print_sdt(ACPI_TABLE_HEADER *sdp)
{
@@ -1438,6 +1611,8 @@
acpi_handle_tcpa(sdp);
else if (!memcmp(sdp->Signature, ACPI_SIG_DMAR, 4))
acpi_handle_dmar(sdp);
+ else if (!memcmp(sdp->Signature, ACPI_SIG_NFIT, 4))
+ acpi_handle_nfit(sdp);
else {
printf(BEGIN_COMMENT);
acpi_print_sdt(sdp);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Nov 6, 8:27 PM (5 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24950273
Default Alt Text
D11479.id30497.diff (7 KB)
Attached To
Mode
D11479: Add NFIT tables to `acpidump -t` output
Attached
Detach File
Event Timeline
Log In to Comment