diff options
Diffstat (limited to 'source/common/dmtbdump2.c')
-rw-r--r-- | source/common/dmtbdump2.c | 107 |
1 files changed, 69 insertions, 38 deletions
diff --git a/source/common/dmtbdump2.c b/source/common/dmtbdump2.c index 71198f74a1b0..deff9c333906 100644 --- a/source/common/dmtbdump2.c +++ b/source/common/dmtbdump2.c @@ -1213,8 +1213,10 @@ AcpiDmDumpMpam ( ACPI_STATUS Status; ACPI_MPAM_MSC_NODE *MpamMscNode; ACPI_MPAM_RESOURCE_NODE *MpamResourceNode; + ACPI_MPAM_FUNC_DEPS *MpamFunctionalDependency; ACPI_DMTABLE_INFO *InfoTable; UINT32 Offset = sizeof(ACPI_TABLE_HEADER); + UINT32 TempOffset; UINT32 MpamResourceNodeLength = 0; while (Offset < Table->Length) @@ -1222,8 +1224,8 @@ AcpiDmDumpMpam ( MpamMscNode = ACPI_ADD_PTR (ACPI_MPAM_MSC_NODE, Table, Offset); /* Subtable: MSC */ - Status = AcpiDmDumpTable (MpamMscNode->Length, 0, MpamMscNode, 0, - AcpiDmTableInfoMpam0); + Status = AcpiDmDumpTable (Table->Length, Offset, MpamMscNode, + MpamMscNode->Length, AcpiDmTableInfoMpam0); if (ACPI_FAILURE (Status)) { return; @@ -1233,18 +1235,19 @@ AcpiDmDumpMpam ( Offset += sizeof(ACPI_MPAM_MSC_NODE); /* Subtable: MSC RIS(es) */ - for (UINT32 ResourceIdx = 0; ResourceIdx < MpamMscNode->NumResouceNodes; ResourceIdx++) + for (UINT32 ResourceIdx = 0; ResourceIdx < MpamMscNode->NumResourceNodes; ResourceIdx++) { + AcpiOsPrintf ("\n"); MpamResourceNode = ACPI_ADD_PTR (ACPI_MPAM_RESOURCE_NODE, Table, Offset); MpamResourceNodeLength = sizeof(ACPI_MPAM_RESOURCE_NODE) + MpamResourceNode->NumFunctionalDeps * sizeof(ACPI_MPAM_FUNC_DEPS); - + TempOffset = Offset; Offset += MpamResourceNodeLength; /* Subtable: MSC RIS */ - Status = AcpiDmDumpTable (MpamResourceNodeLength, 0, MpamResourceNode, 0, - AcpiDmTableInfoMpam1); + Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamResourceNode, + sizeof(ACPI_MPAM_RESOURCE_NODE), AcpiDmTableInfoMpam1); if (ACPI_FAILURE (Status)) { return; @@ -1279,30 +1282,40 @@ AcpiDmDumpMpam ( } /* Subtable: MSC Resource Locator(s) */ - Status = AcpiDmDumpTable (sizeof(ACPI_MPAM_RESOURCE_LOCATOR), 0, - &MpamResourceNode->Locator, 0, InfoTable); + TempOffset += ACPI_OFFSET(ACPI_MPAM_RESOURCE_NODE, Locator); + Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->Locator, + sizeof(ACPI_MPAM_RESOURCE_LOCATOR), InfoTable); if (ACPI_FAILURE (Status)) { return; } /* Get the number of functional dependencies of an RIS */ - Status = AcpiDmDumpTable (sizeof(UINT32), 0, &MpamResourceNode->NumFunctionalDeps, 0, - AcpiDmTableInfoMpam1Deps); + TempOffset += sizeof(ACPI_MPAM_RESOURCE_LOCATOR); + Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->NumFunctionalDeps, + sizeof(UINT32), AcpiDmTableInfoMpam1Deps); if (ACPI_FAILURE (Status)) { return; } + TempOffset += sizeof(UINT32); + MpamFunctionalDependency = ACPI_ADD_PTR (ACPI_MPAM_FUNC_DEPS, MpamResourceNode, + sizeof(ACPI_MPAM_RESOURCE_NODE)); /* Subtable: MSC functional dependencies */ for (UINT32 funcDep = 0; funcDep < MpamResourceNode->NumFunctionalDeps; funcDep++) { + AcpiOsPrintf ("\n"); Status = AcpiDmDumpTable (sizeof(ACPI_MPAM_FUNC_DEPS), 0, &MpamResourceNode->NumFunctionalDeps, 0, AcpiDmTableInfoMpam2); + Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamFunctionalDependency, + sizeof(ACPI_MPAM_FUNC_DEPS), AcpiDmTableInfoMpam2); if (ACPI_FAILURE (Status)) { return; } + TempOffset += sizeof(ACPI_MPAM_FUNC_DEPS); + MpamFunctionalDependency++; } AcpiOsPrintf ("\n\n"); @@ -1881,6 +1894,7 @@ AcpiDmDumpPhat ( ACPI_DMTABLE_INFO *InfoTable; ACPI_PHAT_HEADER *Subtable; ACPI_PHAT_VERSION_DATA *VersionData; + ACPI_PHAT_HEALTH_DATA *HealthData; UINT32 RecordCount; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_PHAT); @@ -1889,7 +1903,6 @@ AcpiDmDumpPhat ( UINT32 PathLength; UINT32 VendorLength; UINT16 RecordType; - const wchar_t *WideString; Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT)); @@ -1914,13 +1927,13 @@ AcpiDmDumpPhat ( case ACPI_PHAT_TYPE_FW_VERSION_DATA: InfoTable = AcpiDmTableInfoPhat0; - SubtableLength = Offset += sizeof (ACPI_PHAT_VERSION_DATA); + SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA); break; case ACPI_PHAT_TYPE_FW_HEALTH_DATA: InfoTable = AcpiDmTableInfoPhat1; - SubtableLength = Offset += sizeof (ACPI_PHAT_TYPE_FW_HEALTH_DATA); + SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA); break; default: @@ -1931,13 +1944,15 @@ AcpiDmDumpPhat ( return; } - Status = AcpiDmDumpTable (Length, SubtableLength, Subtable, + Status = AcpiDmDumpTable (Length, Offset, Subtable, SubtableLength, InfoTable); if (ACPI_FAILURE (Status)) { return; } + Offset += SubtableLength; + OriginalOffset = Offset; switch (Subtable->Type) { @@ -1993,39 +2008,55 @@ AcpiDmDumpPhat ( case ACPI_PHAT_TYPE_FW_HEALTH_DATA: - /* - * Get the length of the Device Path (UEFI wide string). - * Include the wide null terminator (+2), - */ - WideString = ACPI_ADD_PTR (wchar_t, Subtable, - sizeof (ACPI_PHAT_HEALTH_DATA)); - - PathLength = (wcslen (WideString) * 2) + 2; - DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X, Table->Length %X */\n", - __LINE__, PathLength, Offset, Length); + HealthData = ACPI_CAST_PTR (ACPI_PHAT_HEALTH_DATA, Subtable); + PathLength = Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA); + VendorLength = 0; - Status = AcpiDmDumpTable (Length, Offset, - ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)), - PathLength, AcpiDmTableInfoPhat1a); - Offset += PathLength; - if (ACPI_FAILURE (Status)) + /* An offset of 0 should be ignored */ + if (HealthData->DeviceSpecificOffset != 0) { - return; + if (HealthData->DeviceSpecificOffset > Subtable->Length) + { + AcpiOsPrintf ("\n/* Warning: Oversized device-specific data offset %X */\n" + "/* (maximum is %X -- ignoring device-specific data) */\n", + HealthData->DeviceSpecificOffset, Subtable->Length); + } + else if (HealthData->DeviceSpecificOffset < sizeof (ACPI_PHAT_HEALTH_DATA)) + { + AcpiOsPrintf ("\n/* Warning: Undersized device-specific data offset %X */\n" + "/* (minimum is %X -- ignoring device-specific data) */\n", + HealthData->DeviceSpecificOffset, (UINT8) sizeof (ACPI_PHAT_HEALTH_DATA)); + } + else + { + PathLength = HealthData->DeviceSpecificOffset - sizeof (ACPI_PHAT_HEALTH_DATA); + VendorLength = Subtable->Length - HealthData->DeviceSpecificOffset; + } } - /* Get Device-Specific Data - length of which is the remaining subtable length. */ + DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X */\n", + __LINE__, PathLength, Offset); - VendorLength = - Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; - DbgPrint (ASL_DEBUG_OUTPUT, "%u, Subtable->Length %X, VendorLength %X, Offset %X PathLength: %X\n", - __LINE__, Subtable->Length, VendorLength, Offset, PathLength); + if (PathLength) + { + Status = AcpiDmDumpTable (Length, Offset, + ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)), + PathLength, AcpiDmTableInfoPhat1a); + if (ACPI_FAILURE (Status)) + { + return; + } + + Offset += PathLength; + } + + DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, VendorLength %X, Offset %X */\n", + __LINE__, VendorLength, Offset); if (VendorLength) { - /* Point past the Device Path, Compile the Device-Specific Data */ - Status = AcpiDmDumpTable (Length, Offset, - ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength), + ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, HealthData->DeviceSpecificOffset), VendorLength, AcpiDmTableInfoPhat1b); if (ACPI_FAILURE (Status)) { |