edb6c78416
This update also means a major update for all of the big-endian patching that has been done. The older mechanism was getting to unwieldy to keep maintained, and too sensitive to upstream changes. Hence, redid all of the old patches, and took the opportunity to make them more amenable to change over time. Ultimately, the goal is to have upstream accept these in some form. Signed-off-by: Al Stone <ahs3@redhat.com>
217 lines
8.5 KiB
Diff
217 lines
8.5 KiB
Diff
From b55af37d2419fc5ea630774f49b4ed9b724451b3 Mon Sep 17 00:00:00 2001
|
|
From: Al Stone <ahs3@redhat.com>
|
|
Date: Mon, 28 Sep 2020 18:37:04 -0600
|
|
Subject: [PATCH 35/40] Support PMTT in a big-endian world
|
|
|
|
Signed-off-by: Al Stone <ahs3@redhat.com>
|
|
---
|
|
source/common/dmtbdump2.c | 66 +++++++++++++++++++++-----------------
|
|
source/compiler/dttable2.c | 5 ++-
|
|
2 files changed, 41 insertions(+), 30 deletions(-)
|
|
|
|
Index: acpica-unix2-20200925/source/common/dmtbdump2.c
|
|
===================================================================
|
|
--- acpica-unix2-20200925.orig/source/common/dmtbdump2.c
|
|
+++ acpica-unix2-20200925/source/common/dmtbdump2.c
|
|
@@ -1442,17 +1442,21 @@ AcpiDmDumpPmtt (
|
|
ACPI_PMTT_HEADER *MemSubtable;
|
|
ACPI_PMTT_HEADER *DimmSubtable;
|
|
ACPI_PMTT_DOMAIN *DomainArray;
|
|
- UINT32 Length = Table->Length;
|
|
+ UINT32 TableLength = AcpiUtReadUint32(&Table->Length);
|
|
UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
|
|
UINT32 MemOffset;
|
|
UINT32 DimmOffset;
|
|
UINT32 DomainOffset;
|
|
UINT32 DomainCount;
|
|
+ UINT16 SubtableLength;
|
|
+ UINT16 MemSubtableLength;
|
|
+ UINT16 DimmSubtableLength;
|
|
+ UINT16 Tmp16;
|
|
|
|
|
|
/* Main table */
|
|
|
|
- Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
|
|
+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoPmtt);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1461,13 +1465,14 @@ AcpiDmDumpPmtt (
|
|
/* Subtables */
|
|
|
|
Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
|
|
- while (Offset < Table->Length)
|
|
+ while (Offset < TableLength)
|
|
{
|
|
/* Common subtable header */
|
|
|
|
AcpiOsPrintf ("\n");
|
|
- Status = AcpiDmDumpTable (Length, Offset, Subtable,
|
|
- Subtable->Length, AcpiDmTableInfoPmttHdr);
|
|
+ SubtableLength = AcpiUtReadUint16(&Subtable->Length);
|
|
+ Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
|
|
+ SubtableLength, AcpiDmTableInfoPmttHdr);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1485,8 +1490,8 @@ AcpiDmDumpPmtt (
|
|
|
|
/* Dump the fixed-length portion of the subtable */
|
|
|
|
- Status = AcpiDmDumpTable (Length, Offset, Subtable,
|
|
- Subtable->Length, AcpiDmTableInfoPmtt0);
|
|
+ Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
|
|
+ SubtableLength, AcpiDmTableInfoPmtt0);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1498,15 +1503,16 @@ AcpiDmDumpPmtt (
|
|
MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
|
|
sizeof (ACPI_PMTT_SOCKET));
|
|
|
|
- while (((Offset + MemOffset) < Table->Length) &&
|
|
- (MemOffset < Subtable->Length))
|
|
+ while (((Offset + MemOffset) < TableLength) &&
|
|
+ (MemOffset < SubtableLength))
|
|
{
|
|
/* Common subtable header */
|
|
|
|
AcpiOsPrintf ("\n");
|
|
- Status = AcpiDmDumpTable (Length,
|
|
+ MemSubtableLength = AcpiUtReadUint16(&MemSubtable->Length);
|
|
+ Status = AcpiDmDumpTable (TableLength,
|
|
Offset + MemOffset, MemSubtable,
|
|
- MemSubtable->Length, AcpiDmTableInfoPmttHdr);
|
|
+ MemSubtableLength, AcpiDmTableInfoPmttHdr);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1524,9 +1530,9 @@ AcpiDmDumpPmtt (
|
|
|
|
/* Dump the fixed-length portion of the controller subtable */
|
|
|
|
- Status = AcpiDmDumpTable (Length,
|
|
+ Status = AcpiDmDumpTable (TableLength,
|
|
Offset + MemOffset, MemSubtable,
|
|
- MemSubtable->Length, AcpiDmTableInfoPmtt1);
|
|
+ MemSubtableLength, AcpiDmTableInfoPmtt1);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1534,16 +1540,17 @@ AcpiDmDumpPmtt (
|
|
|
|
/* Walk the variable count of proximity domains */
|
|
|
|
- DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
|
|
+ Tmp16 = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
|
|
+ DomainCount = AcpiUtReadUint16(&Tmp16);
|
|
DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
|
|
DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
|
|
sizeof (ACPI_PMTT_CONTROLLER));
|
|
|
|
- while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
|
|
- ((MemOffset + DomainOffset) < Subtable->Length) &&
|
|
+ while (((Offset + MemOffset + DomainOffset) < TableLength) &&
|
|
+ ((MemOffset + DomainOffset) < SubtableLength) &&
|
|
DomainCount)
|
|
{
|
|
- Status = AcpiDmDumpTable (Length,
|
|
+ Status = AcpiDmDumpTable (TableLength,
|
|
Offset + MemOffset + DomainOffset, DomainArray,
|
|
sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
|
|
if (ACPI_FAILURE (Status))
|
|
@@ -1568,15 +1575,16 @@ AcpiDmDumpPmtt (
|
|
DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
|
|
DomainOffset);
|
|
|
|
- while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
|
|
- (DimmOffset < MemSubtable->Length))
|
|
+ while (((Offset + MemOffset + DimmOffset) < TableLength) &&
|
|
+ (DimmOffset < MemSubtableLength))
|
|
{
|
|
/* Common subtable header */
|
|
|
|
AcpiOsPrintf ("\n");
|
|
- Status = AcpiDmDumpTable (Length,
|
|
+ DimmSubtableLength = AcpiUtReadUint16(&DimmSubtable->Length);
|
|
+ Status = AcpiDmDumpTable (TableLength,
|
|
Offset + MemOffset + DimmOffset, DimmSubtable,
|
|
- DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
|
|
+ DimmSubtableLength, AcpiDmTableInfoPmttHdr);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1594,9 +1602,9 @@ AcpiDmDumpPmtt (
|
|
|
|
/* Dump the fixed-length DIMM subtable */
|
|
|
|
- Status = AcpiDmDumpTable (Length,
|
|
+ Status = AcpiDmDumpTable (TableLength,
|
|
Offset + MemOffset + DimmOffset, DimmSubtable,
|
|
- DimmSubtable->Length, AcpiDmTableInfoPmtt2);
|
|
+ DimmSubtableLength, AcpiDmTableInfoPmtt2);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1604,23 +1612,23 @@ AcpiDmDumpPmtt (
|
|
|
|
/* Point to next DIMM subtable */
|
|
|
|
- DimmOffset += DimmSubtable->Length;
|
|
+ DimmOffset += DimmSubtableLength;
|
|
DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
|
|
- DimmSubtable, DimmSubtable->Length);
|
|
+ DimmSubtable, DimmSubtableLength);
|
|
}
|
|
|
|
/* Point to next Controller subtable */
|
|
|
|
- MemOffset += MemSubtable->Length;
|
|
+ MemOffset += MemSubtableLength;
|
|
MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
|
|
- MemSubtable, MemSubtable->Length);
|
|
+ MemSubtable, MemSubtableLength);
|
|
}
|
|
|
|
/* Point to next Socket subtable */
|
|
|
|
- Offset += Subtable->Length;
|
|
+ Offset += SubtableLength;
|
|
Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
|
|
- Subtable, Subtable->Length);
|
|
+ Subtable, SubtableLength);
|
|
}
|
|
}
|
|
|
|
Index: acpica-unix2-20200925/source/compiler/dttable2.c
|
|
===================================================================
|
|
--- acpica-unix2-20200925.orig/source/compiler/dttable2.c
|
|
+++ acpica-unix2-20200925/source/compiler/dttable2.c
|
|
@@ -885,6 +885,7 @@ DtCompilePmtt (
|
|
ACPI_PMTT_HEADER *PmttHeader;
|
|
ACPI_PMTT_CONTROLLER *PmttController;
|
|
UINT16 DomainCount;
|
|
+ UINT16 Length;
|
|
UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
|
|
|
|
|
|
@@ -929,6 +930,8 @@ DtCompilePmtt (
|
|
DtInsertSubtable (ParentTable, Subtable);
|
|
DtPushSubtable (Subtable);
|
|
|
|
+ Length = AcpiUtReadUint16(&PmttHeader->Length);
|
|
+ PmttHeader->Length = Length;
|
|
switch (PmttHeader->Type)
|
|
{
|
|
case ACPI_PMTT_TYPE_SOCKET:
|
|
@@ -962,7 +965,7 @@ DtCompilePmtt (
|
|
|
|
PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
|
|
(Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
|
|
- DomainCount = PmttController->DomainCount;
|
|
+ DomainCount = AcpiUtReadUint16(&PmttController->DomainCount);
|
|
|
|
while (DomainCount)
|
|
{
|