📄 dmtable.c
字号:
} else { AcpiOsPrintf ("%42s : ", Name); }}voidAcpiDmLineHeader2 ( UINT32 Offset, UINT32 ByteLength, char *Name, UINT32 Value){ if (ByteLength) { AcpiOsPrintf ("[%3.3Xh %3.3d% 3d] %24s % 3d : ", Offset, Offset, ByteLength, Name, Value); } else { AcpiOsPrintf ("[%3.3Xh %3.3d ] %24s % 3d : ", Offset, Offset, Name, Value); }}/******************************************************************************* * * FUNCTION: AcpiDmDumpTable * * PARAMETERS: TableLength - Length of the entire ACPI table * TableOffset - Starting offset within the table for this * sub-descriptor (0 if main table) * Table - The ACPI table * SubtableLength - Length of this sub-descriptor * Info - Info table for this ACPI table * * RETURN: None * * DESCRIPTION: Display ACPI table contents by walking the Info table. * ******************************************************************************/ACPI_STATUSAcpiDmDumpTable ( UINT32 TableLength, UINT32 TableOffset, void *Table, UINT32 SubtableLength, ACPI_DMTABLE_INFO *Info){ UINT8 *Target; UINT32 CurrentOffset; UINT32 ByteLength; UINT8 Temp8; UINT16 Temp16; ACPI_DMTABLE_DATA *TableData; BOOLEAN LastOutputBlankLine = FALSE; if (!Info) { AcpiOsPrintf ("Display not implemented\n"); return (AE_NOT_IMPLEMENTED); } /* Walk entire Info table; Null name terminates */ for (; Info->Name; Info++) { /* * Target points to the field within the ACPI Table. CurrentOffset is * the offset of the field from the start of the main table. */ Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); CurrentOffset = TableOffset + Info->Offset; /* Check for beyond EOT or beyond subtable end */ if ((CurrentOffset >= TableLength) || (SubtableLength && (Info->Offset >= SubtableLength))) { AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); return (AE_BAD_DATA); } /* Generate the byte length for this field */ switch (Info->Opcode) { case ACPI_DMT_UINT8: case ACPI_DMT_CHKSUM: case ACPI_DMT_SPACEID: case ACPI_DMT_MADT: case ACPI_DMT_SRAT: case ACPI_DMT_ASF: case ACPI_DMT_HESTNTYP: ByteLength = 1; break; case ACPI_DMT_UINT16: case ACPI_DMT_DMAR: case ACPI_DMT_HEST: ByteLength = 2; break; case ACPI_DMT_UINT24: ByteLength = 3; break; case ACPI_DMT_UINT32: case ACPI_DMT_NAME4: case ACPI_DMT_SIG: ByteLength = 4; break; case ACPI_DMT_NAME6: ByteLength = 6; break; case ACPI_DMT_UINT56: ByteLength = 7; break; case ACPI_DMT_UINT64: case ACPI_DMT_NAME8: ByteLength = 8; break; case ACPI_DMT_STRING: ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; break; case ACPI_DMT_GAS: if (!LastOutputBlankLine) { AcpiOsPrintf ("\n"); LastOutputBlankLine = TRUE; } ByteLength = sizeof (ACPI_GENERIC_ADDRESS); break; case ACPI_DMT_HESTNTFY: if (!LastOutputBlankLine) { AcpiOsPrintf ("\n"); LastOutputBlankLine = TRUE; } ByteLength = sizeof (ACPI_HEST_NOTIFY); break; default: ByteLength = 0; break; } if (CurrentOffset + ByteLength > TableLength) { AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); return (AE_BAD_DATA); } /* Start a new line and decode the opcode */ AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); switch (Info->Opcode) { /* Single-bit Flag fields. Note: Opcode is the bit position */ case ACPI_DMT_FLAG0: case ACPI_DMT_FLAG1: case ACPI_DMT_FLAG2: case ACPI_DMT_FLAG3: case ACPI_DMT_FLAG4: case ACPI_DMT_FLAG5: case ACPI_DMT_FLAG6: case ACPI_DMT_FLAG7: AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); break; /* 2-bit Flag fields */ case ACPI_DMT_FLAGS0: AcpiOsPrintf ("%1.1X\n", *Target & 0x03); break; case ACPI_DMT_FLAGS2: AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); break; /* Standard Data Types */ case ACPI_DMT_UINT8: AcpiOsPrintf ("%2.2X\n", *Target); break; case ACPI_DMT_UINT16: AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target)); break; case ACPI_DMT_UINT24: AcpiOsPrintf ("%2.2X%2.2X%2.2X\n", *Target, *(Target + 1), *(Target + 2)); break; case ACPI_DMT_UINT32: AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target)); break; case ACPI_DMT_UINT56: for (Temp8 = 0; Temp8 < 7; Temp8++) { AcpiOsPrintf ("%2.2X", Target[Temp8]); } AcpiOsPrintf ("\n"); break; case ACPI_DMT_UINT64: AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (ACPI_GET64 (Target))); break; case ACPI_DMT_STRING: AcpiOsPrintf ("%s\n", ACPI_CAST_PTR (char, Target)); break; /* Fixed length ASCII name fields */ case ACPI_DMT_SIG: AcpiDmCheckAscii (Target, 4); AcpiOsPrintf ("\"%4.4s\" ", Target); TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target)); if (TableData) { AcpiOsPrintf ("/* %s */", TableData->Name); } AcpiOsPrintf ("\n"); break; case ACPI_DMT_NAME4: AcpiDmCheckAscii (Target, 4); AcpiOsPrintf ("\"%4.4s\"\n", Target); break; case ACPI_DMT_NAME6: AcpiDmCheckAscii (Target, 6); AcpiOsPrintf ("\"%6.6s\"\n", Target); break; case ACPI_DMT_NAME8: AcpiDmCheckAscii (Target, 8); AcpiOsPrintf ("\"%8.8s\"\n", Target); break; /* Special Data Types */ case ACPI_DMT_CHKSUM: /* Checksum, display and validate */ AcpiOsPrintf ("%2.2X", *Target); Temp8 = AcpiTbGenerateChecksum (Table); if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) { AcpiOsPrintf ( " /* Incorrect checksum, should be %2.2X */", Temp8); } AcpiOsPrintf ("\n"); break; case ACPI_DMT_SPACEID: /* Address Space ID */ AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiUtGetRegionName (*Target)); break; case ACPI_DMT_GAS: /* Generic Address Structure */ AcpiOsPrintf ("<Generic Address Structure>\n"); AcpiDmDumpTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, CurrentOffset, Target, 0, AcpiDmTableInfoGas); AcpiOsPrintf ("\n"); LastOutputBlankLine = TRUE; break; case ACPI_DMT_ASF: /* ASF subtable types */ Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ if (Temp16 > ACPI_ASF_TYPE_RESERVED) { Temp16 = ACPI_ASF_TYPE_RESERVED; } AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmAsfSubnames[Temp16]); break; case ACPI_DMT_DMAR: /* DMAR subtable types */ Temp16 = *Target; if (Temp16 > ACPI_DMAR_TYPE_RESERVED) { Temp16 = ACPI_DMAR_TYPE_RESERVED; } AcpiOsPrintf ("%4.4X <%s>\n", *Target, AcpiDmDmarSubnames[Temp16]); break; case ACPI_DMT_HEST: /* HEST subtable types */ Temp16 = *Target; if (Temp16 > ACPI_HEST_TYPE_RESERVED) { Temp16 = ACPI_HEST_TYPE_RESERVED; } AcpiOsPrintf ("%4.4X (%s)\n", *Target, AcpiDmHestSubnames[Temp16]); break; case ACPI_DMT_HESTNTFY: AcpiOsPrintf ("<Hardware Error Notification Structure>\n"); AcpiDmDumpTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, CurrentOffset, Target, 0, AcpiDmTableInfoHestNotify); AcpiOsPrintf ("\n"); LastOutputBlankLine = TRUE; break; case ACPI_DMT_HESTNTYP: /* HEST Notify types */ Temp8 = *Target; if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) { Temp8 = ACPI_HEST_NOTIFY_RESERVED; } AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmHestNotifySubnames[Temp8]); break; case ACPI_DMT_MADT: /* MADT subtable types */ Temp8 = *Target; if (Temp8 > ACPI_MADT_TYPE_RESERVED) { Temp8 = ACPI_MADT_TYPE_RESERVED; } AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]); break; case ACPI_DMT_SRAT: /* SRAT subtable types */ Temp8 = *Target; if (Temp8 > ACPI_SRAT_TYPE_RESERVED) { Temp8 = ACPI_SRAT_TYPE_RESERVED; } AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]); break; case ACPI_DMT_EXIT: return (AE_OK); default: ACPI_ERROR ((AE_INFO, "**** Invalid table opcode [%X] ****\n", Info->Opcode)); return (AE_SUPPORT); } } return (AE_OK);}/******************************************************************************* * * FUNCTION: AcpiDmCheckAscii * * PARAMETERS: Name - Ascii string * Count - Number of characters to check * * RETURN: None * * DESCRIPTION: Ensure that the requested number of characters are printable * Ascii characters. Sets non-printable and null chars to <space>. * ******************************************************************************/static voidAcpiDmCheckAscii ( UINT8 *Name, UINT32 Count){ UINT32 i; for (i = 0; i < Count; i++) { if (!Name[i] || !isprint (Name[i])) { Name[i] = ' '; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -