Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F143109662
D54308.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D54308.diff
View Options
diff --git a/usr.sbin/acpi/acpidump/acpi.c b/usr.sbin/acpi/acpidump/acpi.c
--- a/usr.sbin/acpi/acpidump/acpi.c
+++ b/usr.sbin/acpi/acpidump/acpi.c
@@ -623,16 +623,89 @@
printf(END_COMMENT);
}
+static const char *
+einj_action(UINT8 Action)
+{
+ static char buf[32];
+
+#define ACTION(name) \
+ case __CONCAT(ACPI_EINJ_, name): \
+ return (__STRING(name))
+#define ACTIONV2(name) \
+ case __CONCAT(ACPI_EINJV2_, name): \
+ return (__XSTRING(__CONCAT(V2_, name)))
+
+ switch (Action) {
+ ACTION(BEGIN_OPERATION);
+ ACTION(GET_TRIGGER_TABLE);
+ ACTION(SET_ERROR_TYPE);
+ ACTION(GET_ERROR_TYPE);
+ ACTION(END_OPERATION);
+ ACTION(EXECUTE_OPERATION);
+ ACTION(CHECK_BUSY_STATUS);
+ ACTION(GET_COMMAND_STATUS);
+ ACTION(SET_ERROR_TYPE_WITH_ADDRESS);
+ ACTION(GET_EXECUTE_TIMINGS);
+ ACTIONV2(GET_ERROR_TYPE);
+ ACTION(TRIGGER_ERROR);
+ default:
+ snprintf(buf, sizeof(buf), "UNKNOWN (%#x)", Action);
+ return (buf);
+ }
+
+#undef ACTION
+#undef ACTIONV2
+}
+
+static const char *
+einj_instruction(UINT8 Instruction)
+{
+ static char buf[32];
+
+#define INSTRUCTION(name) \
+ case __CONCAT(ACPI_EINJ_, name): \
+ return (__STRING(name))
+
+ switch (Instruction) {
+ INSTRUCTION(READ_REGISTER);
+ INSTRUCTION(READ_REGISTER_VALUE);
+ INSTRUCTION(WRITE_REGISTER);
+ INSTRUCTION(WRITE_REGISTER_VALUE);
+ INSTRUCTION(NOOP);
+ INSTRUCTION(FLUSH_CACHELINE);
+ default:
+ snprintf(buf, sizeof(buf), "UNKNOWN (%#x)", Instruction);
+ return (buf);
+ }
+
+#undef INSTRUCTION
+}
+
static void
-acpi_print_whea(ACPI_WHEA_HEADER *w)
+acpi_print_einj_entry(ACPI_EINJ_ENTRY *entry)
{
+ ACPI_WHEA_HEADER *w = &entry->WheaHeader;
- printf("\n\tAction=%d\n", w->Action);
- printf("\tInstruction=%d\n", w->Instruction);
- printf("\tFlags=%02x\n", w->Flags);
+ printf("\n\tAction=%s\n", einj_action(w->Action));
+ printf("\tInstruction=%s\n", einj_instruction(w->Instruction));
+ if (w->Flags != 0) {
+ printf("\tFlags=%02x", w->Flags);
+ if (w->Flags & 0x1)
+ printf("<PRESERVE_REGISTER>");
+ printf("\n");
+ }
printf("\tRegisterRegion=");
acpi_print_gas(&w->RegisterRegion);
- printf("\n\tValue=0x%016jx\n", w->Value);
+ printf("\n");
+ switch (w->Instruction) {
+ case ACPI_EINJ_READ_REGISTER:
+ case ACPI_EINJ_WRITE_REGISTER:
+ case ACPI_EINJ_NOOP:
+ case ACPI_EINJ_FLUSH_CACHELINE:
+ break;
+ default:
+ printf("\tValue=0x%016jx\n", w->Value);
+ }
printf("\tMask=0x%016jx\n", w->Mask);
}
@@ -640,7 +713,7 @@
acpi_handle_einj(ACPI_TABLE_HEADER *sdp)
{
ACPI_TABLE_EINJ *einj;
- ACPI_WHEA_HEADER *w;
+ ACPI_EINJ_ENTRY *w;
u_int i;
printf(BEGIN_COMMENT);
@@ -649,18 +722,125 @@
printf("\tHeaderLength=%d\n", einj->HeaderLength);
printf("\tFlags=0x%02x\n", einj->Flags);
printf("\tEntries=%d\n", einj->Entries);
- w = (ACPI_WHEA_HEADER *)(einj + 1);
+ w = (ACPI_EINJ_ENTRY *)(einj + 1);
for (i = 0; i < MIN(einj->Entries, (sdp->Length -
- sizeof(ACPI_TABLE_EINJ)) / sizeof(ACPI_WHEA_HEADER)); i++)
- acpi_print_whea(w + i);
+ sizeof(ACPI_TABLE_EINJ)) / sizeof(ACPI_EINJ_ENTRY)); i++)
+ acpi_print_einj_entry(w + i);
printf(END_COMMENT);
}
+static const char *
+erst_action(UINT8 Action)
+{
+ static char buf[32];
+
+#define ACTION(name) \
+ case __CONCAT(ACPI_ERST_, name): \
+ return (__STRING(name))
+
+ switch (Action) {
+ ACTION(BEGIN_WRITE);
+ ACTION(BEGIN_READ);
+ ACTION(BEGIN_CLEAR);
+ ACTION(END);
+ ACTION(SET_RECORD_OFFSET);
+ ACTION(EXECUTE_OPERATION);
+ ACTION(CHECK_BUSY_STATUS);
+ ACTION(GET_COMMAND_STATUS);
+ ACTION(GET_RECORD_ID);
+ ACTION(SET_RECORD_ID);
+ ACTION(GET_RECORD_COUNT);
+ ACTION(BEGIN_DUMMY_WRIITE);
+ ACTION(GET_ERROR_RANGE);
+ ACTION(GET_ERROR_LENGTH);
+ ACTION(GET_ERROR_ATTRIBUTES);
+ ACTION(EXECUTE_TIMINGS);
+ default:
+ snprintf(buf, sizeof(buf), "UNKNOWN (%#x)", Action);
+ return (buf);
+ }
+
+#undef ACTION
+}
+
+static const char *
+erst_instruction(UINT8 Instruction)
+{
+ static char buf[32];
+
+#define INSTRUCTION(name) \
+ case __CONCAT(ACPI_ERST_, name): \
+ return (__STRING(name))
+
+ switch (Instruction) {
+ INSTRUCTION(READ_REGISTER);
+ INSTRUCTION(READ_REGISTER_VALUE);
+ INSTRUCTION(WRITE_REGISTER);
+ INSTRUCTION(WRITE_REGISTER_VALUE);
+ INSTRUCTION(NOOP);
+ INSTRUCTION(LOAD_VAR1);
+ INSTRUCTION(LOAD_VAR2);
+ INSTRUCTION(STORE_VAR1);
+ INSTRUCTION(ADD);
+ INSTRUCTION(SUBTRACT);
+ INSTRUCTION(ADD_VALUE);
+ INSTRUCTION(SUBTRACT_VALUE);
+ INSTRUCTION(STALL);
+ INSTRUCTION(STALL_WHILE_TRUE);
+ INSTRUCTION(SKIP_NEXT_IF_TRUE);
+ INSTRUCTION(GOTO);
+ INSTRUCTION(SET_SRC_ADDRESS_BASE);
+ INSTRUCTION(SET_DST_ADDRESS_BASE);
+ INSTRUCTION(MOVE_DATA);
+ default:
+ snprintf(buf, sizeof(buf), "UNKNOWN (%#x)", Instruction);
+ return (buf);
+ }
+
+#undef INSTRUCTION
+}
+
+static void
+acpi_print_erst_entry(ACPI_ERST_ENTRY *entry)
+{
+ ACPI_WHEA_HEADER *w = &entry->WheaHeader;
+
+ printf("\n\tAction=%s\n", erst_action(w->Action));
+ printf("\tInstruction=%s\n", erst_instruction(w->Instruction));
+ if (w->Flags != 0) {
+ printf("\tFlags=%02x", w->Flags);
+ if (w->Flags & 0x1)
+ printf("<PRESERVE_REGISTER>");
+ printf("\n");
+ }
+ printf("\tRegisterRegion=");
+ acpi_print_gas(&w->RegisterRegion);
+ printf("\n");
+ switch (w->Instruction) {
+ case ACPI_ERST_READ_REGISTER:
+ case ACPI_ERST_WRITE_REGISTER:
+ case ACPI_ERST_NOOP:
+ case ACPI_ERST_LOAD_VAR1:
+ case ACPI_ERST_LOAD_VAR2:
+ case ACPI_ERST_STORE_VAR1:
+ case ACPI_ERST_ADD:
+ case ACPI_ERST_SUBTRACT:
+ case ACPI_ERST_SET_SRC_ADDRESS_BASE:
+ case ACPI_ERST_SET_DST_ADDRESS_BASE:
+ case ACPI_ERST_MOVE_DATA:
+ break;
+ default:
+ printf("\tValue=0x%016jx\n", w->Value);
+ break;
+ }
+ printf("\tMask=0x%016jx\n", w->Mask);
+}
+
static void
acpi_handle_erst(ACPI_TABLE_HEADER *sdp)
{
ACPI_TABLE_ERST *erst;
- ACPI_WHEA_HEADER *w;
+ ACPI_ERST_ENTRY *w;
u_int i;
printf(BEGIN_COMMENT);
@@ -668,10 +848,10 @@
erst = (ACPI_TABLE_ERST *)sdp;
printf("\tHeaderLength=%d\n", erst->HeaderLength);
printf("\tEntries=%d\n", erst->Entries);
- w = (ACPI_WHEA_HEADER *)(erst + 1);
+ w = (ACPI_ERST_ENTRY *)(erst + 1);
for (i = 0; i < MIN(erst->Entries, (sdp->Length -
- sizeof(ACPI_TABLE_ERST)) / sizeof(ACPI_WHEA_HEADER)); i++)
- acpi_print_whea(w + i);
+ sizeof(ACPI_TABLE_ERST)) / sizeof(ACPI_ERST_ENTRY)); i++)
+ acpi_print_erst_entry(w + i);
printf(END_COMMENT);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Jan 27, 2:31 AM (14 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27098308
Default Alt Text
D54308.diff (6 KB)
Attached To
Mode
D54308: acpidump: Extend the decoding of entries in the EINJ and ERST tables
Attached
Detach File
Event Timeline
Log In to Comment