aboutsummaryrefslogtreecommitdiff
path: root/source/common/dmtbdump2.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/common/dmtbdump2.c')
-rw-r--r--source/common/dmtbdump2.c107
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))
{