From 2cb0b87a15682da4f19f707fa3ffece504f94b5a Mon Sep 17 00:00:00 2001 From: Al Stone Date: Sat, 19 Sep 2020 13:37:38 -0600 Subject: [PATCH 11/45] Support DBG2 table in a big-endian world Signed-off-by: Al Stone --- source/common/dmtbdump1.c | 37 ++++++++++++++++++-------------- source/compiler/dttable1.c | 43 ++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 32 deletions(-) Index: acpica-unix2-20210730/source/common/dmtbdump1.c =================================================================== --- acpica-unix2-20210730.orig/source/common/dmtbdump1.c +++ acpica-unix2-20210730/source/common/dmtbdump1.c @@ -593,7 +593,7 @@ AcpiDmDumpCsrt ( ACPI_CSRT_GROUP *Subtable; ACPI_CSRT_SHARED_INFO *SharedInfoTable; ACPI_CSRT_DESCRIPTOR *SubSubtable; - UINT32 Length = Table->Length; + UINT32 Length = AcpiUtReadUint32 (&Table->Length); UINT32 Offset = sizeof (ACPI_TABLE_CSRT); UINT32 SubOffset; UINT32 SubSubOffset; @@ -605,7 +605,7 @@ AcpiDmDumpCsrt ( /* Subtables (Resource Groups) */ Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); - while (Offset < Table->Length) + while (Offset < Length) { /* Resource group subtable */ @@ -639,7 +639,7 @@ AcpiDmDumpCsrt ( Offset + SubOffset); while ((SubOffset < Subtable->Length) && - ((Offset + SubOffset) < Table->Length)) + ((Offset + SubOffset) < Length)) { AcpiOsPrintf ("\n"); Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable, @@ -700,12 +700,13 @@ AcpiDmDumpDbg2 ( { ACPI_STATUS Status; ACPI_DBG2_DEVICE *Subtable; - UINT32 Length = Table->Length; + UINT32 Length = AcpiUtReadUint32 (&Table->Length); UINT32 Offset = sizeof (ACPI_TABLE_DBG2); UINT32 i; UINT32 ArrayOffset; UINT32 AbsoluteOffset; UINT8 *Array; + UINT16 SubtableLength; /* Main table */ @@ -719,11 +720,12 @@ AcpiDmDumpDbg2 ( /* Subtables */ Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); - while (Offset < Table->Length) + while (Offset < Length) { AcpiOsPrintf ("\n"); + SubtableLength = AcpiUtReadUint16 (&Subtable->Length); Status = AcpiDmDumpTable (Length, Offset, Subtable, - Subtable->Length, AcpiDmTableInfoDbg2Device); + SubtableLength, AcpiDmTableInfoDbg2Device); if (ACPI_FAILURE (Status)) { return; @@ -733,13 +735,13 @@ AcpiDmDumpDbg2 ( for (i = 0; i < Subtable->RegisterCount; i++) { - ArrayOffset = Subtable->BaseAddressOffset + + ArrayOffset = AcpiUtReadUint16 (&Subtable->BaseAddressOffset) + (sizeof (ACPI_GENERIC_ADDRESS) * i); AbsoluteOffset = Offset + ArrayOffset; Array = (UINT8 *) Subtable + ArrayOffset; Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, - Subtable->Length, AcpiDmTableInfoDbg2Addr); + SubtableLength, AcpiDmTableInfoDbg2Addr); if (ACPI_FAILURE (Status)) { return; @@ -750,13 +752,13 @@ AcpiDmDumpDbg2 ( for (i = 0; i < Subtable->RegisterCount; i++) { - ArrayOffset = Subtable->AddressSizeOffset + + ArrayOffset = AcpiUtReadUint16 (&Subtable->AddressSizeOffset) + (sizeof (UINT32) * i); AbsoluteOffset = Offset + ArrayOffset; Array = (UINT8 *) Subtable + ArrayOffset; Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, - Subtable->Length, AcpiDmTableInfoDbg2Size); + SubtableLength, AcpiDmTableInfoDbg2Size); if (ACPI_FAILURE (Status)) { return; @@ -766,12 +768,12 @@ AcpiDmDumpDbg2 ( /* Dump the Namestring (required) */ AcpiOsPrintf ("\n"); - ArrayOffset = Subtable->NamepathOffset; + ArrayOffset = AcpiUtReadUint16 (&Subtable->NamepathOffset); AbsoluteOffset = Offset + ArrayOffset; Array = (UINT8 *) Subtable + ArrayOffset; Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, - Subtable->Length, AcpiDmTableInfoDbg2Name); + SubtableLength, AcpiDmTableInfoDbg2Name); if (ACPI_FAILURE (Status)) { return; @@ -781,8 +783,11 @@ AcpiDmDumpDbg2 ( if (Subtable->OemDataOffset) { - Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset, - Table, Subtable->OemDataLength, + Array = (UINT8 *) Subtable + AcpiUtReadUint16 (&Subtable->OemDataOffset); + + Status = AcpiDmDumpTable (Length, + Offset + AcpiUtReadUint16 (&Subtable->OemDataOffset), + Array, AcpiUtReadUint16 (&Subtable->OemDataLength), AcpiDmTableInfoDbg2OemData); if (ACPI_FAILURE (Status)) { @@ -792,9 +797,9 @@ AcpiDmDumpDbg2 ( /* Point to next subtable */ - Offset += Subtable->Length; + Offset += SubtableLength; Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable, - Subtable->Length); + SubtableLength); } } Index: acpica-unix2-20210730/source/compiler/dttable1.c =================================================================== --- acpica-unix2-20210730.orig/source/compiler/dttable1.c +++ acpica-unix2-20210730/source/compiler/dttable1.c @@ -572,6 +572,7 @@ DtCompileCsrt ( DT_FIELD **PFieldList = (DT_FIELD **) List; UINT32 DescriptorCount; UINT32 GroupLength; + UINT32 Tmp; /* Subtables (Resource Groups) */ @@ -590,12 +591,13 @@ DtCompileCsrt ( /* Compute the number of resource descriptors */ - GroupLength = - (ACPI_CAST_PTR (ACPI_CSRT_GROUP, - Subtable->Buffer))->Length - - (ACPI_CAST_PTR (ACPI_CSRT_GROUP, - Subtable->Buffer))->SharedInfoLength - - sizeof (ACPI_CSRT_GROUP); + Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP, + Subtable->Buffer))->Length); + GroupLength = Tmp; + Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP, + Subtable->Buffer))->SharedInfoLength); + GroupLength -= Tmp; + GroupLength -= sizeof (ACPI_CSRT_GROUP); DescriptorCount = (GroupLength / sizeof (ACPI_CSRT_DESCRIPTOR)); @@ -683,6 +685,7 @@ DtCompileDbg2 ( ACPI_DBG2_DEVICE *DeviceInfo; UINT16 CurrentOffset; UINT32 i; + UINT32 Tmp; /* Main table */ @@ -699,10 +702,12 @@ DtCompileDbg2 ( /* Main table fields */ Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer); - Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF ( - ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header); + Tmp = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF ( + ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header); + AcpiUtWriteUint (&Dbg2Header->InfoOffset, sizeof (UINT32), + &Tmp, sizeof (UINT32)); - SubtableCount = Dbg2Header->InfoCount; + SubtableCount = Tmp; DtPushSubtable (Subtable); /* Process all Device Information subtables (Count = InfoCount) */ @@ -729,7 +734,8 @@ DtCompileDbg2 ( /* BaseAddressRegister GAS array (Required, size is RegisterCount) */ - DeviceInfo->BaseAddressOffset = CurrentOffset; + AcpiUtWriteUint (&DeviceInfo->BaseAddressOffset, sizeof (UINT16), + &CurrentOffset, sizeof (UINT16)); for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr, @@ -745,7 +751,8 @@ DtCompileDbg2 ( /* AddressSize array (Required, size = RegisterCount) */ - DeviceInfo->AddressSizeOffset = CurrentOffset; + AcpiUtWriteUint (&DeviceInfo->AddressSizeOffset, sizeof (UINT16), + &CurrentOffset, sizeof (UINT16)); for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size, @@ -761,7 +768,8 @@ DtCompileDbg2 ( /* NamespaceString device identifier (Required, size = NamePathLength) */ - DeviceInfo->NamepathOffset = CurrentOffset; + AcpiUtWriteUint (&DeviceInfo->NamepathOffset, sizeof (UINT16), + &CurrentOffset, sizeof (UINT16)); Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name, &Subtable); if (ACPI_FAILURE (Status)) @@ -771,8 +779,9 @@ DtCompileDbg2 ( /* Update the device info header */ - DeviceInfo->NamepathLength = (UINT16) Subtable->Length; - CurrentOffset += (UINT16) DeviceInfo->NamepathLength; + AcpiUtWriteUint (&DeviceInfo->NamepathLength, sizeof (UINT16), + &Subtable->Length, sizeof (UINT32)); + CurrentOffset += AcpiUtReadUint16 (&DeviceInfo->NamepathLength); DtInsertSubtable (ParentTable, Subtable); /* OemData - Variable-length data (Optional, size = OemDataLength) */ @@ -799,8 +808,10 @@ DtCompileDbg2 ( if (Subtable && Subtable->Length) { - DeviceInfo->OemDataOffset = CurrentOffset; - DeviceInfo->OemDataLength = (UINT16) Subtable->Length; + AcpiUtWriteUint (&DeviceInfo->OemDataOffset, sizeof (UINT16), + &CurrentOffset, sizeof (UINT16)); + AcpiUtWriteUint (&DeviceInfo->OemDataLength, sizeof (UINT16), + &Subtable->Length, sizeof (UINT32)); DtInsertSubtable (ParentTable, Subtable); }