|
|
edb6c78 |
From 01aad41e59efd615ac075fcedbaab0c60f9e1e11 Mon Sep 17 00:00:00 2001
|
|
|
edb6c78 |
From: Al Stone <ahs3@redhat.com>
|
|
|
edb6c78 |
Date: Sat, 19 Sep 2020 15:22:00 -0600
|
|
|
edb6c78 |
Subject: [PATCH 09/40] Support DMAR in a big-endian world
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Signed-off-by: Al Stone <ahs3@redhat.com>
|
|
|
edb6c78 |
---
|
|
|
edb6c78 |
source/common/dmtable.c | 4 ++--
|
|
|
edb6c78 |
source/common/dmtbdump1.c | 26 +++++++++++++++-----------
|
|
|
edb6c78 |
source/compiler/dttable1.c | 12 +++++++-----
|
|
|
edb6c78 |
3 files changed, 24 insertions(+), 18 deletions(-)
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Index: acpica-unix2-20200925/source/common/dmtable.c
|
|
|
edb6c78 |
===================================================================
|
|
|
edb6c78 |
--- acpica-unix2-20200925.orig/source/common/dmtable.c
|
|
|
edb6c78 |
+++ acpica-unix2-20200925/source/common/dmtable.c
|
|
|
edb6c78 |
@@ -1244,13 +1244,13 @@ AcpiDmDumpTable (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* DMAR subtable types */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- Temp16 = ACPI_GET16 (Target);
|
|
|
edb6c78 |
+ Temp16 = AcpiUtReadUint16 (Target);
|
|
|
edb6c78 |
if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
Temp16 = ACPI_DMAR_TYPE_RESERVED;
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
|
|
|
edb6c78 |
+ AcpiOsPrintf (UINT16_FORMAT, Temp16,
|
|
|
edb6c78 |
AcpiDmDmarSubnames[Temp16]);
|
|
|
edb6c78 |
break;
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Index: acpica-unix2-20200925/source/common/dmtbdump1.c
|
|
|
edb6c78 |
===================================================================
|
|
|
edb6c78 |
--- acpica-unix2-20200925.orig/source/common/dmtbdump1.c
|
|
|
edb6c78 |
+++ acpica-unix2-20200925/source/common/dmtbdump1.c
|
|
|
edb6c78 |
@@ -526,13 +526,15 @@ AcpiDmDumpDmar (
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
ACPI_STATUS Status;
|
|
|
edb6c78 |
ACPI_DMAR_HEADER *Subtable;
|
|
|
edb6c78 |
- UINT32 Length = Table->Length;
|
|
|
edb6c78 |
+ UINT32 Length = AcpiUtReadUint32(&Table->Length);
|
|
|
edb6c78 |
UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
|
|
|
edb6c78 |
ACPI_DMTABLE_INFO *InfoTable;
|
|
|
edb6c78 |
ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
|
|
|
edb6c78 |
UINT32 ScopeOffset;
|
|
|
edb6c78 |
UINT8 *PciPath;
|
|
|
edb6c78 |
UINT32 PathOffset;
|
|
|
edb6c78 |
+ UINT16 SubtableType;
|
|
|
edb6c78 |
+ UINT16 SubtableLength;
|
|
|
edb6c78 |
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* Main table */
|
|
|
edb6c78 |
@@ -546,13 +548,14 @@ AcpiDmDumpDmar (
|
|
|
edb6c78 |
/* Subtables */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
|
|
|
edb6c78 |
- while (Offset < Table->Length)
|
|
|
edb6c78 |
+ while (Offset < Length)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
/* Common subtable header */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
AcpiOsPrintf ("\n");
|
|
|
edb6c78 |
+ SubtableLength = AcpiUtReadUint16(&Subtable->Length);
|
|
|
edb6c78 |
Status = AcpiDmDumpTable (Length, Offset, Subtable,
|
|
|
edb6c78 |
- Subtable->Length, AcpiDmTableInfoDmarHdr);
|
|
|
edb6c78 |
+ SubtableLength, AcpiDmTableInfoDmarHdr);
|
|
|
edb6c78 |
if (ACPI_FAILURE (Status))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
return;
|
|
|
edb6c78 |
@@ -560,7 +563,8 @@ AcpiDmDumpDmar (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
AcpiOsPrintf ("\n");
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- switch (Subtable->Type)
|
|
|
edb6c78 |
+ SubtableType = AcpiUtReadUint16(&Subtable->Type);
|
|
|
edb6c78 |
+ switch (SubtableType)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
case ACPI_DMAR_TYPE_HARDWARE_UNIT:
|
|
|
edb6c78 |
|
|
|
edb6c78 |
@@ -595,12 +599,12 @@ AcpiDmDumpDmar (
|
|
|
edb6c78 |
default:
|
|
|
edb6c78 |
|
|
|
edb6c78 |
AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
|
|
|
edb6c78 |
- Subtable->Type);
|
|
|
edb6c78 |
+ SubtableType);
|
|
|
edb6c78 |
return;
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Status = AcpiDmDumpTable (Length, Offset, Subtable,
|
|
|
edb6c78 |
- Subtable->Length, InfoTable);
|
|
|
edb6c78 |
+ SubtableLength, InfoTable);
|
|
|
edb6c78 |
if (ACPI_FAILURE (Status))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
return;
|
|
|
edb6c78 |
@@ -609,8 +613,8 @@ AcpiDmDumpDmar (
|
|
|
edb6c78 |
/*
|
|
|
edb6c78 |
* Dump the optional device scope entries
|
|
|
edb6c78 |
*/
|
|
|
edb6c78 |
- if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
|
|
|
edb6c78 |
- (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
|
|
|
edb6c78 |
+ if ((SubtableType == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
|
|
|
edb6c78 |
+ (SubtableType == ACPI_DMAR_TYPE_NAMESPACE))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
/* These types do not support device scopes */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
@@ -618,7 +622,7 @@ AcpiDmDumpDmar (
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
|
|
|
edb6c78 |
ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
|
|
|
edb6c78 |
- while (ScopeOffset < Subtable->Length)
|
|
|
edb6c78 |
+ while (ScopeOffset < SubtableLength)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
AcpiOsPrintf ("\n");
|
|
|
edb6c78 |
Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
|
|
|
edb6c78 |
@@ -659,9 +663,9 @@ AcpiDmDumpDmar (
|
|
|
edb6c78 |
NextSubtable:
|
|
|
edb6c78 |
/* Point to next subtable */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- Offset += Subtable->Length;
|
|
|
edb6c78 |
+ Offset += SubtableLength;
|
|
|
edb6c78 |
Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
|
|
|
edb6c78 |
- Subtable->Length);
|
|
|
edb6c78 |
+ SubtableLength);
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Index: acpica-unix2-20200925/source/compiler/dttable1.c
|
|
|
edb6c78 |
===================================================================
|
|
|
edb6c78 |
--- acpica-unix2-20200925.orig/source/compiler/dttable1.c
|
|
|
edb6c78 |
+++ acpica-unix2-20200925/source/compiler/dttable1.c
|
|
|
edb6c78 |
@@ -560,6 +560,7 @@ DtCompileDmar (
|
|
|
edb6c78 |
ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope;
|
|
|
edb6c78 |
UINT32 DeviceScopeLength;
|
|
|
edb6c78 |
UINT32 PciPathLength;
|
|
|
edb6c78 |
+ UINT16 DmarHeaderType;
|
|
|
edb6c78 |
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable);
|
|
|
edb6c78 |
@@ -590,7 +591,8 @@ DtCompileDmar (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- switch (DmarHeader->Type)
|
|
|
edb6c78 |
+ DmarHeaderType = AcpiUtReadUint16(&DmarHeader->Type);
|
|
|
edb6c78 |
+ switch (DmarHeaderType)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
case ACPI_DMAR_TYPE_HARDWARE_UNIT:
|
|
|
edb6c78 |
|
|
|
edb6c78 |
@@ -637,8 +639,8 @@ DtCompileDmar (
|
|
|
edb6c78 |
/*
|
|
|
edb6c78 |
* Optional Device Scope subtables
|
|
|
edb6c78 |
*/
|
|
|
edb6c78 |
- if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
|
|
|
edb6c78 |
- (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
|
|
|
edb6c78 |
+ if ((DmarHeaderType == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
|
|
|
edb6c78 |
+ (DmarHeaderType == ACPI_DMAR_TYPE_NAMESPACE))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
/* These types do not support device scopes */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
@@ -647,8 +649,8 @@ DtCompileDmar (
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
|
|
|
edb6c78 |
DtPushSubtable (Subtable);
|
|
|
edb6c78 |
- DeviceScopeLength = DmarHeader->Length - Subtable->Length -
|
|
|
edb6c78 |
- ParentTable->Length;
|
|
|
edb6c78 |
+ DeviceScopeLength = AcpiUtReadUint16(&DmarHeader->Length) -
|
|
|
edb6c78 |
+ Subtable->Length - ParentTable->Length;
|
|
|
edb6c78 |
while (DeviceScopeLength)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
|