diff --git a/.acpica-tools.metadata b/.acpica-tools.metadata new file mode 100644 index 0000000..39c398e --- /dev/null +++ b/.acpica-tools.metadata @@ -0,0 +1,2 @@ +5b87f09fecda40cb089bdeb83e3a01d7615617dd SOURCES/acpica-unix2-20210604.tar_0.gz +1085e6c2a793cb2e3aca94c420e8300afe9eae59 SOURCES/acpitests-unix-20210604.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9cd9cd3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +SOURCES/acpica-unix2-20210604.tar_0.gz +SOURCES/acpitests-unix-20210604.tar.gz diff --git a/SOURCES/0001-Add-in-basic-infrastructure-for-big-endian-support.patch b/SOURCES/0001-Add-in-basic-infrastructure-for-big-endian-support.patch new file mode 100644 index 0000000..3a667ea --- /dev/null +++ b/SOURCES/0001-Add-in-basic-infrastructure-for-big-endian-support.patch @@ -0,0 +1,530 @@ +From 4594630ec2e6a33efce3047a86b08fa170b75848 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Thu, 15 Oct 2020 11:53:33 -0600 +Subject: [PATCH 01/45] Add in basic infrastructure for big-endian support + +This adds in some basic functions -- AcpiUtReadUint32(), for example, +to read a UINT32 value in little-endian form and return it in host-native +format -- along with AcpiUtWriteUint() that writes out an integer in +host-native format as a little-endian value. + +But, to do that, I'm adding the functions in a new file: utendian.c. So, +the header files need fixing, and the makefiles need to be sure to compile +the new code. Further, UtIsBigEndianMachine() needed to be moved out of +compiler/aslutils.c so it could be used in the new functions and avoid +having to do some conditional compilation depending on endian-ness. + +However, this sets things up for the future, where endian-aware code can +be added as the need is uncovered. For now, these functions cover all of +the cases I know about. + +Signed-off-by: Al Stone +--- + generate/unix/acpibin/Makefile | 1 + + generate/unix/acpidump/Makefile | 1 + + generate/unix/acpiexamples/Makefile | 1 + + generate/unix/acpiexec/Makefile | 1 + + generate/unix/acpihelp/Makefile | 1 + + generate/unix/iasl/Makefile | 1 + + source/compiler/aslcompiler.h | 4 - + source/compiler/aslutils.c | 27 --- + source/components/utilities/utendian.c | 236 +++++++++++++++++++++++++ + source/include/acmacros.h | 56 ------ + source/include/acutils.h | 32 ++++ + source/include/platform/aclinux.h | 1 + + 12 files changed, 275 insertions(+), 87 deletions(-) + create mode 100644 source/components/utilities/utendian.c + +Index: acpica-unix2-20210604/generate/unix/acpibin/Makefile +=================================================================== +--- acpica-unix2-20210604.orig/generate/unix/acpibin/Makefile ++++ acpica-unix2-20210604/generate/unix/acpibin/Makefile +@@ -37,6 +37,7 @@ OBJECTS = \ + $(OBJDIR)/utcache.o\ + $(OBJDIR)/utdebug.o\ + $(OBJDIR)/utdecode.o\ ++ $(OBJDIR)/utendian.o\ + $(OBJDIR)/utexcep.o\ + $(OBJDIR)/utglobal.o\ + $(OBJDIR)/utlock.o\ +Index: acpica-unix2-20210604/generate/unix/acpidump/Makefile +=================================================================== +--- acpica-unix2-20210604.orig/generate/unix/acpidump/Makefile ++++ acpica-unix2-20210604/generate/unix/acpidump/Makefile +@@ -36,6 +36,7 @@ OBJECTS = \ + $(OBJDIR)/osunixdir.o\ + $(OBJDIR)/osunixmap.o\ + $(OBJDIR)/osunixxf.o\ ++ $(OBJDIR)/utendian.o\ + $(OBJDIR)/tbprint.o\ + $(OBJDIR)/tbxfroot.o\ + $(OBJDIR)/utascii.o\ +Index: acpica-unix2-20210604/generate/unix/acpiexamples/Makefile +=================================================================== +--- acpica-unix2-20210604.orig/generate/unix/acpiexamples/Makefile ++++ acpica-unix2-20210604/generate/unix/acpiexamples/Makefile +@@ -139,6 +139,7 @@ OBJECTS = \ + $(OBJDIR)/utdebug.o\ + $(OBJDIR)/utdecode.o\ + $(OBJDIR)/utdelete.o\ ++ $(OBJDIR)/utendian.o\ + $(OBJDIR)/uterror.o\ + $(OBJDIR)/uteval.o\ + $(OBJDIR)/utexcep.o\ +Index: acpica-unix2-20210604/generate/unix/acpiexec/Makefile +=================================================================== +--- acpica-unix2-20210604.orig/generate/unix/acpiexec/Makefile ++++ acpica-unix2-20210604/generate/unix/acpiexec/Makefile +@@ -214,6 +214,7 @@ OBJECTS = \ + $(OBJDIR)/utdebug.o\ + $(OBJDIR)/utdecode.o\ + $(OBJDIR)/utdelete.o\ ++ $(OBJDIR)/utendian.o\ + $(OBJDIR)/uterror.o\ + $(OBJDIR)/uteval.o\ + $(OBJDIR)/utexcep.o\ +Index: acpica-unix2-20210604/generate/unix/acpihelp/Makefile +=================================================================== +--- acpica-unix2-20210604.orig/generate/unix/acpihelp/Makefile ++++ acpica-unix2-20210604/generate/unix/acpihelp/Makefile +@@ -45,6 +45,7 @@ OBJECTS = \ + $(OBJDIR)/getopt.o\ + $(OBJDIR)/osunixxf.o\ + $(OBJDIR)/utdebug.o\ ++ $(OBJDIR)/utendian.o\ + $(OBJDIR)/utexcep.o\ + $(OBJDIR)/utglobal.o\ + $(OBJDIR)/uthex.o\ +Index: acpica-unix2-20210604/generate/unix/iasl/Makefile +=================================================================== +--- acpica-unix2-20210604.orig/generate/unix/iasl/Makefile ++++ acpica-unix2-20210604/generate/unix/iasl/Makefile +@@ -225,6 +225,7 @@ OBJECTS = \ + $(OBJDIR)/utdebug.o\ + $(OBJDIR)/utdecode.o\ + $(OBJDIR)/utdelete.o\ ++ $(OBJDIR)/utendian.o\ + $(OBJDIR)/uterror.o\ + $(OBJDIR)/utexcep.o\ + $(OBJDIR)/utglobal.o\ +Index: acpica-unix2-20210604/source/compiler/aslcompiler.h +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslcompiler.h ++++ acpica-unix2-20210604/source/compiler/aslcompiler.h +@@ -1120,10 +1120,6 @@ BOOLEAN + UtIsIdInteger ( + UINT8 *Target); + +-UINT8 +-UtIsBigEndianMachine ( +- void); +- + BOOLEAN + UtQueryForOverwrite ( + char *Pathname); +Index: acpica-unix2-20210604/source/compiler/aslutils.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslutils.c ++++ acpica-unix2-20210604/source/compiler/aslutils.c +@@ -73,33 +73,6 @@ UtDisplayErrorSummary ( + + /******************************************************************************* + * +- * FUNCTION: UtIsBigEndianMachine +- * +- * PARAMETERS: None +- * +- * RETURN: TRUE if machine is big endian +- * FALSE if machine is little endian +- * +- * DESCRIPTION: Detect whether machine is little endian or big endian. +- * +- ******************************************************************************/ +- +-UINT8 +-UtIsBigEndianMachine ( +- void) +-{ +- union { +- UINT32 Integer; +- UINT8 Bytes[4]; +- } Overlay = {0xFF000000}; +- +- +- return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */ +-} +- +- +-/******************************************************************************* +- * + * FUNCTION: UtIsIdInteger + * + * PARAMETERS: Pointer to an ACPI ID (HID, CID) string +Index: acpica-unix2-20210604/source/components/utilities/utendian.c +=================================================================== +--- /dev/null ++++ acpica-unix2-20210604/source/components/utilities/utendian.c +@@ -0,0 +1,236 @@ ++/****************************************************************************** ++ * ++ * Module Name: utendian -- byte swapping support for other-endianness ++ * ++ *****************************************************************************/ ++ ++/***************************************************************************** ++ * ++ * Copyright (c) 2020, Al Stone ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions, and the following disclaimer, ++ * without modification. ++ * 2. Redistributions in binary form must reproduce at minimum a disclaimer ++ * substantially similar to the "NO WARRANTY" disclaimer below ++ * ("Disclaimer") and any redistribution must be conditioned upon ++ * including a substantially similar Disclaimer requirement for further ++ * binary redistribution. ++ * 3. Neither the names of the above-listed copyright holders nor the names ++ * of any contributors may be used to endorse or promote products derived ++ * from this software without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ * ++ * Alternatively, you may choose to be licensed under the terms of the ++ * GNU General Public License ("GPL") version 2 as published by the Free ++ * Software Foundation. ++ * ++ *****************************************************************************/ ++ ++#include "acpi.h" ++#include "accommon.h" ++ ++#define _COMPONENT ACPI_COMPILER ++ ACPI_MODULE_NAME ("utendian") ++ ++/* ++ * Endianness support functions. ++ * ++ * Ultimately, everything in ACPI tables or AML must be in little-endian ++ * format. However, we sometimes find it necessary to run on a big-endian ++ * machine and create or read those little-endian values. This is a small ++ * libary of functions to make that easier, and more visible. ++ * ++ */ ++ ++/******************************************************************************* ++ * ++ * FUNCTION: UtIsBigEndianMachine ++ * ++ * PARAMETERS: None ++ * ++ * RETURN: TRUE if machine is big endian ++ * FALSE if machine is little endian ++ * ++ * DESCRIPTION: Detect whether machine is little endian or big endian. ++ * ++ ******************************************************************************/ ++ ++UINT8 ++UtIsBigEndianMachine ( ++ void) ++{ ++ union { ++ UINT32 Integer; ++ UINT8 Bytes[4]; ++ } Overlay = {0xFF000000}; ++ ++ ++ return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */ ++} ++ ++ ++/******************************************************************************* ++ * ++ * FUNCTION: AcpiUtReadUint16 ++ * ++ * PARAMETERS: Src - location containing the little-endian ++ * value ++ * ++ * RETURN: UINT16 value in host-native form ++ * ++ * DESCRIPTION: Read a UINT16 little-endian value from a given location ++ * and return it in host-native form ++ * ++ ******************************************************************************/ ++ ++UINT16 ++AcpiUtReadUint16 ( ++ void *SrcPtr) ++{ ++ UINT16 Result = 0; ++ UINT8 *Dst = (UINT8 *) &Result; ++ UINT8 *Src = (UINT8 *) SrcPtr; ++ ++ if (!UtIsBigEndianMachine()) ++ { ++ return (*(UINT16 *) SrcPtr); ++ } ++ ++ Dst[0] = Src[1]; ++ Dst[1] = Src[0]; ++ ++ return (Result); ++} ++ ++/******************************************************************************* ++ * ++ * FUNCTION: AcpiUtReadUint32 ++ * ++ * PARAMETERS: Src - location containing the little-endian ++ * value ++ * ++ * RETURN: UINT32 value in host-native form ++ * ++ * DESCRIPTION: Read a UINT32 little-endian value from a given location ++ * and return it in host-native form ++ * ++ ******************************************************************************/ ++ ++UINT32 ++AcpiUtReadUint32 ( ++ void *SrcPtr) ++{ ++ UINT32 Result = 0; ++ UINT8 *Dst = (UINT8 *) &Result; ++ UINT8 *Src = (UINT8 *) SrcPtr; ++ ++ if (!UtIsBigEndianMachine()) ++ { ++ return (*(UINT32 *) SrcPtr); ++ } ++ ++ Dst[0] = Src[3]; ++ Dst[1] = Src[2]; ++ Dst[2] = Src[1]; ++ Dst[3] = Src[0]; ++ ++ return (Result); ++} ++ ++/******************************************************************************* ++ * ++ * FUNCTION: AcpiUtReadUint64 ++ * ++ * PARAMETERS: Src - location containing the little-endian ++ * value ++ * ++ * RETURN: UINT64 value in host-native form ++ * ++ * DESCRIPTION: Read a UINT64 little-endian value from a given location ++ * and return it in host-native form ++ * ++ ******************************************************************************/ ++ ++UINT64 ++AcpiUtReadUint64 ( ++ void *SrcPtr) ++{ ++ UINT64 Result = 0; ++ UINT8 *Dst = (UINT8 *) &Result; ++ UINT8 *Src = (UINT8 *) SrcPtr; ++ ++ if (!UtIsBigEndianMachine()) ++ { ++ return (*(UINT64 *) SrcPtr); ++ } ++ ++ Dst[0] = Src[7]; ++ Dst[1] = Src[6]; ++ Dst[2] = Src[5]; ++ Dst[3] = Src[4]; ++ Dst[4] = Src[3]; ++ Dst[5] = Src[2]; ++ Dst[6] = Src[1]; ++ Dst[7] = Src[0]; ++ ++ return (Result); ++} ++ ++/******************************************************************************* ++ * ++ * FUNCTION: AcpiUtWriteUint ++ * ++ * PARAMETERS: DstPtr - where to place the retrieved value ++ * DstLength - space in bytes for this int type ++ * SrcPtr - where the little-endian value lives ++ * SrcLength - space in bytes for this int type ++ * ++ * RETURN: None. ++ * ++ * DESCRIPTION: Write a host-native integer value of the given size, and ++ * store it in the location specified in little-endian form. ++ * Given the amount of integer type casting done, this general ++ * version seems the most useful (vs 32->32, 32->16, 16->32, ++ * ad infinitum) ++ * ++ ******************************************************************************/ ++ ++void ++AcpiUtWriteUint ( ++ void *DstPtr, ++ int DstLength, ++ const void *SrcPtr, ++ const int SrcLength) ++{ ++ UINT8 *Dst = (UINT8 *) DstPtr; ++ UINT8 *Src = (UINT8 *) SrcPtr; ++ int Length; ++ int ii; ++ ++ if (!UtIsBigEndianMachine()) ++ { ++ Length = SrcLength > DstLength ? DstLength : SrcLength; ++ memcpy (Dst, Src, Length); ++ return; ++ } ++ ++ Length = SrcLength >= DstLength ? DstLength : SrcLength; ++ for (ii = 0; ii < Length; ii++) ++ Dst[ii] = Src[SrcLength - ii - 1]; ++ ++} +Index: acpica-unix2-20210604/source/include/acmacros.h +=================================================================== +--- acpica-unix2-20210604.orig/source/include/acmacros.h ++++ acpica-unix2-20210604/source/include/acmacros.h +@@ -76,61 +76,6 @@ + * If the hardware supports the transfer of unaligned data, just do the store. + * Otherwise, we have to move one byte at a time. + */ +-#ifdef ACPI_BIG_ENDIAN +-/* +- * Macros for big-endian machines +- */ +- +-/* These macros reverse the bytes during the move, converting little-endian to big endian */ +- +- /* Big Endian <== Little Endian */ +- /* Hi...Lo Lo...Hi */ +-/* 16-bit source, 16/32/64 destination */ +- +-#define ACPI_MOVE_16_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[1];\ +- (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[0];} +- +-#define ACPI_MOVE_16_TO_32(d, s) {(*(UINT32 *)(void *)(d))=0;\ +- ((UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[1];\ +- ((UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[0];} +- +-#define ACPI_MOVE_16_TO_64(d, s) {(*(UINT64 *)(void *)(d))=0;\ +- ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\ +- ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];} +- +-/* 32-bit source, 16/32/64 destination */ +- +-#define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ +- +-#define ACPI_MOVE_32_TO_32(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\ +- (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];\ +- (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[1];\ +- (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[0];} +- +-#define ACPI_MOVE_32_TO_64(d, s) {(*(UINT64 *)(void *)(d))=0;\ +- ((UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[3];\ +- ((UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[2];\ +- ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\ +- ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];} +- +-/* 64-bit source, 16/32/64 destination */ +- +-#define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ +- +-#define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ +- +-#define ACPI_MOVE_64_TO_64(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\ +- (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\ +- (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[5];\ +- (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[4];\ +- (( UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[3];\ +- (( UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[2];\ +- (( UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\ +- (( UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];} +-#else +-/* +- * Macros for little-endian machines +- */ + + #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED + +@@ -193,7 +138,6 @@ + (( UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[6];\ + (( UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[7];} + #endif +-#endif + + + /* +Index: acpica-unix2-20210604/source/include/acutils.h +=================================================================== +--- acpica-unix2-20210604.orig/source/include/acutils.h ++++ acpica-unix2-20210604/source/include/acutils.h +@@ -1167,4 +1167,36 @@ AcpiUtConvertUuidToString ( + char *OutString); + #endif + ++ ++/* ++ * utendian -- byte-swapping for big-endian support ++ */ ++ ++UINT8 ++UtIsBigEndianMachine ( ++ void); ++ ++#if defined(ACPI_ASL_COMPILER) || defined(ACPI_EXEC_APP) || \ ++ defined(ACPI_HELP_APP) || defined(ACPI_DUMP_APP) || \ ++ defined(ACPI_EXAMPLE_APP) || defined(ACPI_BIN_APP) ++UINT32 ++AcpiUtReadUint32 ( ++ void *SrcPtr); ++ ++UINT16 ++AcpiUtReadUint16 ( ++ void *SrcPtr); ++ ++UINT64 ++AcpiUtReadUint64 ( ++ void *SrcPtr); ++ ++void ++AcpiUtWriteUint ( ++ void *DstPtr, ++ int DstLength, ++ const void *SrcPtr, ++ const int SrcLength); ++#endif ++ + #endif /* _ACUTILS_H */ +Index: acpica-unix2-20210604/source/include/platform/aclinux.h +=================================================================== +--- acpica-unix2-20210604.orig/source/include/platform/aclinux.h ++++ acpica-unix2-20210604/source/include/platform/aclinux.h +@@ -198,6 +198,7 @@ + + #ifdef ACPI_USE_STANDARD_HEADERS + #include ++#include + #endif + + /* Define/disable kernel-specific declarators */ diff --git a/SOURCES/0002-Modify-utility-functions-to-be-endian-agnostic.patch b/SOURCES/0002-Modify-utility-functions-to-be-endian-agnostic.patch new file mode 100644 index 0000000..2f3f51e --- /dev/null +++ b/SOURCES/0002-Modify-utility-functions-to-be-endian-agnostic.patch @@ -0,0 +1,200 @@ +From 51b0d06c0a6c4d4e19432ebf930299855c8fcf23 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 18 Sep 2020 15:14:30 -0600 +Subject: [PATCH 02/45] Modify utility functions to be endian-agnostic + +All of the modifications here use the big-endian code previously added +(see utendian.c) to make themselves endian-agnostic; i.e., that the code +does not need to change further to work on both big- and little-endian +machines. + +These particular files were changed to handle the reading and writing +of files (the length is often embedded in the binary stream), and to +handle the reading and writing of integer values. The common cases are +to "read" a 32-bit unsigned int in little-endian format, but convert it +to host-native, and to write a byte, word, double word or quad word value +as little-endian, regardless of host-native format. + +Signed-off-by: Al Stone +--- + source/common/acfileio.c | 16 ++++++++++------ + source/common/dmtable.c | 8 ++++---- + source/compiler/dtfield.c | 2 +- + source/compiler/dtsubtable.c | 4 ++-- + source/components/tables/tbprint.c | 13 +++++++++---- + 5 files changed, 26 insertions(+), 17 deletions(-) + +Index: acpica-unix2-20210604/source/common/acfileio.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/acfileio.c ++++ acpica-unix2-20210604/source/common/acfileio.c +@@ -280,6 +280,7 @@ AcGetOneTableFromFile ( + ACPI_TABLE_HEADER *Table; + INT32 Count; + long TableOffset; ++ UINT32 Length; + + + *ReturnTable = NULL; +@@ -319,7 +320,8 @@ AcGetOneTableFromFile ( + + /* Allocate a buffer for the entire table */ + +- Table = AcpiOsAllocate ((ACPI_SIZE) TableHeader.Length); ++ Length = AcpiUtReadUint32 (&TableHeader.Length); ++ Table = AcpiOsAllocate ((ACPI_SIZE) Length); + if (!Table) + { + return (AE_NO_MEMORY); +@@ -329,13 +331,13 @@ AcGetOneTableFromFile ( + + fseek (File, TableOffset, SEEK_SET); + +- Count = fread (Table, 1, TableHeader.Length, File); ++ Count = fread (Table, 1, Length, File); + + /* + * Checks for data table headers happen later in the execution. Only verify + * for Aml tables at this point in the code. + */ +- if (GetOnlyAmlTables && Count != (INT32) TableHeader.Length) ++ if (GetOnlyAmlTables && Count != (INT32) Length) + { + Status = AE_ERROR; + goto ErrorExit; +@@ -343,7 +345,7 @@ AcGetOneTableFromFile ( + + /* Validate the checksum (just issue a warning) */ + +- Status = AcpiTbVerifyChecksum (Table, TableHeader.Length); ++ Status = AcpiTbVerifyChecksum (Table, Length); + if (ACPI_FAILURE (Status)) + { + Status = AcCheckTextModeCorruption (Table); +@@ -436,6 +438,7 @@ AcValidateTableHeader ( + long OriginalOffset; + UINT32 FileSize; + UINT32 i; ++ UINT32 Length; + + + ACPI_FUNCTION_TRACE (AcValidateTableHeader); +@@ -467,11 +470,12 @@ AcValidateTableHeader ( + /* Validate table length against bytes remaining in the file */ + + FileSize = CmGetFileSize (File); +- if (TableHeader.Length > (UINT32) (FileSize - TableOffset)) ++ Length = AcpiUtReadUint32 (&TableHeader.Length); ++ if (Length > (UINT32) (FileSize - TableOffset)) + { + fprintf (stderr, "Table [%4.4s] is too long for file - " + "needs: 0x%.2X, remaining in file: 0x%.2X\n", +- TableHeader.Signature, TableHeader.Length, ++ TableHeader.Signature, Length, + (UINT32) (FileSize - TableOffset)); + return (AE_BAD_HEADER); + } +Index: acpica-unix2-20210604/source/common/dmtable.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtable.c ++++ acpica-unix2-20210604/source/common/dmtable.c +@@ -591,7 +591,7 @@ AcpiDmDumpDataTable ( + { + /* Dump the raw table data */ + +- Length = Table->Length; ++ Length = AcpiUtReadUint32 (&Table->Length); + + AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n", + ACPI_RAW_TABLE_DATA_HEADER, Length, Length); +@@ -608,7 +608,7 @@ AcpiDmDumpDataTable ( + */ + if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) + { +- Length = Table->Length; ++ Length = AcpiUtReadUint32 (&Table->Length); + Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); + if (ACPI_FAILURE (Status)) + { +@@ -628,7 +628,7 @@ AcpiDmDumpDataTable ( + /* + * All other tables must use the common ACPI table header, dump it now + */ +- Length = Table->Length; ++ Length = AcpiUtReadUint32(&Table->Length); + Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); + if (ACPI_FAILURE (Status)) + { +@@ -1262,7 +1262,7 @@ AcpiDmDumpTable ( + + AcpiOsPrintf ("%2.2X", *Target); + Temp8 = AcpiDmGenerateChecksum (Table, +- ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, ++ AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length)), + ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); + + if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) +Index: acpica-unix2-20210604/source/compiler/dtfield.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dtfield.c ++++ acpica-unix2-20210604/source/compiler/dtfield.c +@@ -361,7 +361,7 @@ DtCompileInteger ( + DtError (ASL_ERROR, ASL_MSG_INTEGER_SIZE, Field, AslGbl_MsgBuffer); + } + +- memcpy (Buffer, &Value, ByteLength); ++ AcpiUtWriteUint (Buffer, ByteLength, &Value, sizeof (UINT64)); + return; + } + +Index: acpica-unix2-20210604/source/compiler/dtsubtable.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dtsubtable.c ++++ acpica-unix2-20210604/source/compiler/dtsubtable.c +@@ -378,6 +378,6 @@ DtSetSubtableLength ( + return; + } + +- memcpy (Subtable->LengthField, &Subtable->TotalLength, +- Subtable->SizeOfLengthField); ++ AcpiUtWriteUint (Subtable->LengthField, Subtable->SizeOfLengthField, ++ &Subtable->TotalLength, sizeof (Subtable->TotalLength)); + } +Index: acpica-unix2-20210604/source/components/tables/tbprint.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/tables/tbprint.c ++++ acpica-unix2-20210604/source/components/tables/tbprint.c +@@ -44,6 +44,8 @@ + #include "acpi.h" + #include "accommon.h" + #include "actables.h" ++#include "platform/acenv.h" ++#include "acutils.h" + + #define _COMPONENT ACPI_TABLES + ACPI_MODULE_NAME ("tbprint") +@@ -151,7 +153,7 @@ AcpiTbPrintTableHeader ( + + ACPI_INFO (("%-4.4s 0x%8.8X%8.8X %06X", + Header->Signature, ACPI_FORMAT_UINT64 (Address), +- Header->Length)); ++ AcpiUtReadUint32 (&Header->Length))); + } + else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) + { +@@ -178,9 +180,12 @@ AcpiTbPrintTableHeader ( + "%-4.4s 0x%8.8X%8.8X" + " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", + LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address), +- LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, +- LocalHeader.OemTableId, LocalHeader.OemRevision, +- LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); ++ AcpiUtReadUint32 (&LocalHeader.Length), ++ LocalHeader.Revision, LocalHeader.OemId, ++ LocalHeader.OemTableId, ++ AcpiUtReadUint32 (&LocalHeader.OemRevision), ++ LocalHeader.AslCompilerId, ++ AcpiUtReadUint32 (&LocalHeader.AslCompilerRevision))); + } + } + diff --git a/SOURCES/0003-Always-display-table-header-content-in-human-readabl.patch b/SOURCES/0003-Always-display-table-header-content-in-human-readabl.patch new file mode 100644 index 0000000..6dddba1 --- /dev/null +++ b/SOURCES/0003-Always-display-table-header-content-in-human-readabl.patch @@ -0,0 +1,45 @@ +From 62cc2f4ae212bd0fad83f643921ac216ebb9a986 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 18 Sep 2020 15:20:37 -0600 +Subject: [PATCH 03/45] Always display table header content in human-readable + form + +When comparing two binary data tables, little-endian values are read +from each table header and printed out. Make sure they show up in a +form that makes sense to humans. + +Signed-off-by: Al Stone +--- + source/tools/acpibin/abcompare.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +Index: acpica-unix2-20210604/source/tools/acpibin/abcompare.c +=================================================================== +--- acpica-unix2-20210604.orig/source/tools/acpibin/abcompare.c ++++ acpica-unix2-20210604/source/tools/acpibin/abcompare.c +@@ -42,6 +42,7 @@ + */ + + #include "acpibin.h" ++#include "acutils.h" + + + ACPI_TABLE_HEADER Header1; +@@ -179,14 +180,14 @@ AbPrintHeadersInfo ( + /* Display header information for both headers */ + + printf ("Signature %8.4s : %4.4s\n", Header->Signature, Header2->Signature); +- printf ("Length %8.8X : %8.8X\n", Header->Length, Header2->Length); ++ printf ("Length %8.8X : %8.8X\n", AcpiUtReadUint32 (&Header->Length), AcpiUtReadUint32 (&Header2->Length)); + printf ("Revision %8.2X : %2.2X\n", Header->Revision, Header2->Revision); + printf ("Checksum %8.2X : %2.2X\n", Header->Checksum, Header2->Checksum); + printf ("OEM ID %8.6s : %.6s\n", Header->OemId, Header2->OemId); + printf ("OEM Table ID %8.8s : %.8s\n", Header->OemTableId, Header2->OemTableId); +- printf ("OEM Revision %8.8X : %8.8X\n", Header->OemRevision, Header2->OemRevision); ++ printf ("OEM Revision %8.8X : %8.8X\n", AcpiUtReadUint32 (&Header->OemRevision), AcpiUtReadUint32 (&Header2->OemRevision)); + printf ("ASL Compiler ID %8.4s : %.4s\n", Header->AslCompilerId, Header2->AslCompilerId); +- printf ("Compiler Revision %8.8X : %8.8X\n", Header->AslCompilerRevision, Header2->AslCompilerRevision); ++ printf ("Compiler Revision %8.8X : %8.8X\n", AcpiUtReadUint32 (&Header->AslCompilerRevision), AcpiUtReadUint32 (&Header2->AslCompilerRevision)); + printf ("\n"); + } + diff --git a/SOURCES/0004-Re-enable-support-for-big-endian-machines.patch b/SOURCES/0004-Re-enable-support-for-big-endian-machines.patch new file mode 100644 index 0000000..1422b26 --- /dev/null +++ b/SOURCES/0004-Re-enable-support-for-big-endian-machines.patch @@ -0,0 +1,78 @@ +From 16734feab4204d6930c1ede62e527920607daace Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 16 Sep 2020 16:27:06 -0600 +Subject: [PATCH 04/45] Re-enable support for big-endian machines + +First, disable the big-endian check and fail. Then, make sure the +namespace gets initialized properly (NB: needed even if we are only +compiling/disassembling data tables). + +Signed-off-by: Al Stone +--- + source/compiler/aslmain.c | 12 ------------ + source/components/namespace/nsutils.c | 7 +++++-- + 2 files changed, 5 insertions(+), 14 deletions(-) + +Index: acpica-unix2-20210604/source/compiler/aslmain.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslmain.c ++++ acpica-unix2-20210604/source/compiler/aslmain.c +@@ -101,18 +101,6 @@ main ( + + signal (SIGINT, AslSignalHandler); + +- /* +- * Big-endian machines are not currently supported. ACPI tables must +- * be little-endian, and support for big-endian machines needs to +- * be implemented. +- */ +- if (UtIsBigEndianMachine ()) +- { +- fprintf (stderr, +- "iASL is not currently supported on big-endian machines.\n"); +- return (-1); +- } +- + AcpiOsInitialize (); + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ + +Index: acpica-unix2-20210604/source/components/namespace/nsutils.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/namespace/nsutils.c ++++ acpica-unix2-20210604/source/components/namespace/nsutils.c +@@ -272,6 +272,7 @@ AcpiNsBuildInternalName ( + const char *ExternalName = Info->NextExternalChar; + char *Result = NULL; + UINT32 i; ++ char TmpSeg[ACPI_NAMESEG_SIZE+1]; + + + ACPI_FUNCTION_TRACE (NsBuildInternalName); +@@ -335,6 +336,7 @@ AcpiNsBuildInternalName ( + + for (; NumSegments; NumSegments--) + { ++ memset (TmpSeg, 0, ACPI_NAMESEG_SIZE+1); + for (i = 0; i < ACPI_NAMESEG_SIZE; i++) + { + if (ACPI_IS_PATH_SEPARATOR (*ExternalName) || +@@ -342,16 +344,17 @@ AcpiNsBuildInternalName ( + { + /* Pad the segment with underscore(s) if segment is short */ + +- Result[i] = '_'; ++ TmpSeg[i] = '_'; + } + else + { + /* Convert the character to uppercase and save it */ + +- Result[i] = (char) toupper ((int) *ExternalName); ++ TmpSeg[i] = (char) toupper ((int) *ExternalName); + ExternalName++; + } + } ++ AcpiUtWriteUint (Result, ACPI_NAMESEG_SIZE, TmpSeg, ACPI_NAMESEG_SIZE); + + /* Now we must have a path separator, or the pathname is bad */ + diff --git a/SOURCES/0005-Correct-an-endian-ness-problem-when-converting-ASL-t.patch b/SOURCES/0005-Correct-an-endian-ness-problem-when-converting-ASL-t.patch new file mode 100644 index 0000000..3074e05 --- /dev/null +++ b/SOURCES/0005-Correct-an-endian-ness-problem-when-converting-ASL-t.patch @@ -0,0 +1,41 @@ +From 055fee09d8f9244b6c437ad18b98edb81a87e8bc Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 27 Oct 2020 17:50:52 -0600 +Subject: [PATCH 05/45] Correct an endian-ness problem when converting ASL to + ASL+ + +Signed-off-by: Al Stone +--- + source/compiler/cvparser.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/compiler/cvparser.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/cvparser.c ++++ acpica-unix2-20210604/source/compiler/cvparser.c +@@ -144,6 +144,7 @@ CvInitFileTree ( + char *ChildFilename = NULL; + UINT8 *AmlStart; + UINT32 AmlLength; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + if (!AcpiGbl_CaptureComments) +@@ -152,7 +153,7 @@ CvInitFileTree ( + } + + +- AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER); ++ AmlLength = TableLength - sizeof (ACPI_TABLE_HEADER); + AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)); + + CvDbgPrint ("AmlLength: %x\n", AmlLength); +@@ -162,7 +163,7 @@ CvInitFileTree ( + AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache); + + AcpiGbl_FileTreeRoot->FileStart = (char *)(AmlStart); +- AcpiGbl_FileTreeRoot->FileEnd = (char *)(AmlStart + Table->Length); ++ AcpiGbl_FileTreeRoot->FileEnd = (char *)(AmlStart + TableLength); + AcpiGbl_FileTreeRoot->Next = NULL; + AcpiGbl_FileTreeRoot->Parent = NULL; + AcpiGbl_FileTreeRoot->Filename = (char *)(AmlStart+2); diff --git a/SOURCES/0006-Use-more-reliable-ACPI_COPY_NAMSEG-in-GPE-name-check.patch b/SOURCES/0006-Use-more-reliable-ACPI_COPY_NAMSEG-in-GPE-name-check.patch new file mode 100644 index 0000000..7b7ed81 --- /dev/null +++ b/SOURCES/0006-Use-more-reliable-ACPI_COPY_NAMSEG-in-GPE-name-check.patch @@ -0,0 +1,32 @@ +From 790c016107e98ded2d0ae579f84dd4cd3fa06587 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 29 Jun 2021 17:48:31 -0600 +Subject: [PATCH 06/45] Use more reliable ACPI_COPY_NAMSEG in GPE name checks + +Signed-off-by: Al Stone +--- + source/compiler/aslanalyze.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/compiler/aslanalyze.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslanalyze.c ++++ acpica-unix2-20210604/source/compiler/aslanalyze.c +@@ -469,7 +469,7 @@ ApCheckForGpeNameConflict ( + + /* Need a null-terminated string version of NameSeg */ + +- ACPI_MOVE_32_TO_32 (Name, Op->Asl.NameSeg); ++ ACPI_COPY_NAMESEG (Name, Op->Asl.NameSeg); + Name[ACPI_NAMESEG_SIZE] = 0; + + /* +@@ -496,7 +496,7 @@ ApCheckForGpeNameConflict ( + * We are now sure we have an _Lxx or _Exx. + * Create the target name that would cause collision (Flip E/L) + */ +- ACPI_MOVE_32_TO_32 (Target, Name); ++ ACPI_COPY_NAMESEG (Target, Name); + + /* Inject opposite letter ("L" versus "E") */ + diff --git a/SOURCES/0007-Handle-dumping-Unicode-properly-when-big-endian.patch b/SOURCES/0007-Handle-dumping-Unicode-properly-when-big-endian.patch new file mode 100644 index 0000000..ade4c9a --- /dev/null +++ b/SOURCES/0007-Handle-dumping-Unicode-properly-when-big-endian.patch @@ -0,0 +1,53 @@ +From 9a4a32c597fcdfa8a3bc33230c40a18e39c3449d Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Thu, 1 Jul 2021 17:46:19 -0600 +Subject: [PATCH 07/45] Handle dumping Unicode properly when big-endian + +Signed-off-by: Al Stone +--- + source/common/dmtbdump.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump.c ++++ acpica-unix2-20210604/source/common/dmtbdump.c +@@ -146,6 +146,8 @@ AcpiDmDumpUnicode ( + UINT8 *Buffer; + UINT32 Length; + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 start; + + + Buffer = ((UINT8 *) Table) + BufferOffset; +@@ -155,7 +157,8 @@ AcpiDmDumpUnicode ( + + for (i = 0; i < Length; i += 2) + { +- if (!isprint (Buffer[i])) ++ Tmp16 = AcpiUtReadUint16 (&Buffer[i]); ++ if (!isprint (Tmp16)) + { + goto DumpRawBuffer; + } +@@ -163,7 +166,8 @@ AcpiDmDumpUnicode ( + + /* Ensure all high bytes are zero */ + +- for (i = 1; i < Length; i += 2) ++ start = UtIsBigEndianMachine() ? 0 : 1; ++ for (i = start; i < Length; i += 2) + { + if (Buffer[i]) + { +@@ -176,7 +180,8 @@ AcpiDmDumpUnicode ( + AcpiOsPrintf ("\""); + for (i = 0; i < Length; i += 2) + { +- AcpiOsPrintf ("%c", Buffer[i]); ++ Tmp16 = AcpiUtReadUint16 (&Buffer[i]); ++ AcpiOsPrintf ("%c", Tmp16); + } + + AcpiOsPrintf ("\"\n"); diff --git a/SOURCES/0008-Support-MADT-aka-APIC-in-a-big-endian-world.patch b/SOURCES/0008-Support-MADT-aka-APIC-in-a-big-endian-world.patch new file mode 100644 index 0000000..ad4214d --- /dev/null +++ b/SOURCES/0008-Support-MADT-aka-APIC-in-a-big-endian-world.patch @@ -0,0 +1,32 @@ +From 7b107ab7348d903108140f6033e90596b12325c4 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Thu, 15 Oct 2020 12:12:11 -0600 +Subject: [PATCH 08/45] Support MADT (aka APIC) in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -763,7 +763,7 @@ AcpiDmDumpMadt ( + { + ACPI_STATUS Status; + ACPI_SUBTABLE_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 Length = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_MADT); + ACPI_DMTABLE_INFO *InfoTable; + +@@ -779,7 +779,7 @@ AcpiDmDumpMadt ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < Length) + { + /* Common subtable header */ + diff --git a/SOURCES/0009-Support-ASF-tables-in-a-big-endian-world.patch b/SOURCES/0009-Support-ASF-tables-in-a-big-endian-world.patch new file mode 100644 index 0000000..5e21344 --- /dev/null +++ b/SOURCES/0009-Support-ASF-tables-in-a-big-endian-world.patch @@ -0,0 +1,55 @@ +From ce811b4c38b9a09533ee8bafa22813f6e43c023d Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 18 Sep 2020 16:41:02 -0600 +Subject: [PATCH 09/45] Support ASF! tables in a big-endian world + +Read the table length properly and it all works right for big-endian. + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -79,16 +79,18 @@ AcpiDmDumpAsf ( + UINT32 DataOffset = 0; + UINT32 i; + UINT8 Type; ++ UINT32 TableLength; + + + /* No main table, only subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); +- while (Offset < Table->Length) ++ TableLength = AcpiUtReadUint32 (&Table->Length); ++ while (Offset < TableLength) + { + /* Common subtable header */ + +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Header.Length, AcpiDmTableInfoAsfHdr); + if (ACPI_FAILURE (Status)) + { +@@ -146,7 +148,7 @@ AcpiDmDumpAsf ( + return; + } + +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Header.Length, InfoTable); + if (ACPI_FAILURE (Status)) + { +@@ -163,7 +165,7 @@ AcpiDmDumpAsf ( + for (i = 0; i < DataCount; i++) + { + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, DataOffset, ++ Status = AcpiDmDumpTable (TableLength, DataOffset, + DataTable, DataLength, DataInfoTable); + if (ACPI_FAILURE (Status)) + { diff --git a/SOURCES/0010-Support-CPEP-tables-in-a-big-endian-world.patch b/SOURCES/0010-Support-CPEP-tables-in-a-big-endian-world.patch new file mode 100644 index 0000000..aa677b7 --- /dev/null +++ b/SOURCES/0010-Support-CPEP-tables-in-a-big-endian-world.patch @@ -0,0 +1,32 @@ +From 0c4be57a5e0e45b4197c2d9a0b26462d3b1a9b80 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 18 Sep 2020 16:54:13 -0600 +Subject: [PATCH 10/45] Support CPEP tables in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -319,7 +319,7 @@ AcpiDmDumpCpep ( + { + ACPI_STATUS Status; + ACPI_CPEP_POLLING *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 Length = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_CPEP); + + +@@ -334,7 +334,7 @@ AcpiDmDumpCpep ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < Length) + { + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Length, Offset, Subtable, diff --git a/SOURCES/0011-Support-DBG2-table-in-a-big-endian-world.patch b/SOURCES/0011-Support-DBG2-table-in-a-big-endian-world.patch new file mode 100644 index 0000000..cc613fc --- /dev/null +++ b/SOURCES/0011-Support-DBG2-table-in-a-big-endian-world.patch @@ -0,0 +1,256 @@ +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-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -374,7 +374,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; +@@ -386,7 +386,7 @@ AcpiDmDumpCsrt ( + /* Subtables (Resource Groups) */ + + Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < Length) + { + /* Resource group subtable */ + +@@ -420,7 +420,7 @@ AcpiDmDumpCsrt ( + Offset + SubOffset); + + while ((SubOffset < Subtable->Length) && +- ((Offset + SubOffset) < Table->Length)) ++ ((Offset + SubOffset) < Length)) + { + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable, +@@ -481,12 +481,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 */ +@@ -500,11 +501,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; +@@ -514,13 +516,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; +@@ -531,13 +533,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; +@@ -547,12 +549,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; +@@ -562,8 +564,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)) + { +@@ -573,9 +578,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-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -355,6 +355,7 @@ DtCompileCsrt ( + DT_FIELD **PFieldList = (DT_FIELD **) List; + UINT32 DescriptorCount; + UINT32 GroupLength; ++ UINT32 Tmp; + + + /* Subtables (Resource Groups) */ +@@ -373,12 +374,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)); +@@ -466,6 +468,7 @@ DtCompileDbg2 ( + ACPI_DBG2_DEVICE *DeviceInfo; + UINT16 CurrentOffset; + UINT32 i; ++ UINT32 Tmp; + + + /* Main table */ +@@ -482,10 +485,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) */ +@@ -512,7 +517,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, +@@ -528,7 +534,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, +@@ -544,7 +551,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)) +@@ -554,8 +562,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) */ +@@ -582,8 +591,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); + } diff --git a/SOURCES/0012-Support-DMAR-in-a-big-endian-world.patch b/SOURCES/0012-Support-DMAR-in-a-big-endian-world.patch new file mode 100644 index 0000000..3a3f33b --- /dev/null +++ b/SOURCES/0012-Support-DMAR-in-a-big-endian-world.patch @@ -0,0 +1,171 @@ +From 06623392351dfea54bd69507b6672c933a5e3fd2 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Sat, 19 Sep 2020 15:22:00 -0600 +Subject: [PATCH 12/45] Support DMAR in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtable.c | 4 ++-- + source/common/dmtbdump1.c | 26 +++++++++++++++----------- + source/compiler/dttable1.c | 12 +++++++----- + 3 files changed, 24 insertions(+), 18 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtable.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtable.c ++++ acpica-unix2-20210604/source/common/dmtable.c +@@ -1341,13 +1341,13 @@ AcpiDmDumpTable ( + + /* DMAR subtable types */ + +- Temp16 = ACPI_GET16 (Target); ++ Temp16 = AcpiUtReadUint16 (Target); + if (Temp16 > ACPI_DMAR_TYPE_RESERVED) + { + Temp16 = ACPI_DMAR_TYPE_RESERVED; + } + +- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), ++ AcpiOsPrintf (UINT16_FORMAT, Temp16, + AcpiDmDmarSubnames[Temp16]); + break; + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -604,13 +604,15 @@ AcpiDmDumpDmar ( + { + ACPI_STATUS Status; + ACPI_DMAR_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 Length = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_DMAR); + ACPI_DMTABLE_INFO *InfoTable; + ACPI_DMAR_DEVICE_SCOPE *ScopeTable; + UINT32 ScopeOffset; + UINT8 *PciPath; + UINT32 PathOffset; ++ UINT16 SubtableType; ++ UINT16 SubtableLength; + + + /* Main table */ +@@ -624,13 +626,14 @@ AcpiDmDumpDmar ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < Length) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); ++ SubtableLength = AcpiUtReadUint16 (&Subtable->Length); + Status = AcpiDmDumpTable (Length, Offset, Subtable, +- Subtable->Length, AcpiDmTableInfoDmarHdr); ++ SubtableLength, AcpiDmTableInfoDmarHdr); + if (ACPI_FAILURE (Status)) + { + return; +@@ -638,7 +641,8 @@ AcpiDmDumpDmar ( + + AcpiOsPrintf ("\n"); + +- switch (Subtable->Type) ++ SubtableType = AcpiUtReadUint16 (&Subtable->Type); ++ switch (SubtableType) + { + case ACPI_DMAR_TYPE_HARDWARE_UNIT: + +@@ -673,12 +677,12 @@ AcpiDmDumpDmar ( + default: + + AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", +- Subtable->Type); ++ SubtableType); + return; + } + + Status = AcpiDmDumpTable (Length, Offset, Subtable, +- Subtable->Length, InfoTable); ++ SubtableLength, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; +@@ -687,8 +691,8 @@ AcpiDmDumpDmar ( + /* + * Dump the optional device scope entries + */ +- if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || +- (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE)) ++ if ((SubtableType == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || ++ (SubtableType == ACPI_DMAR_TYPE_NAMESPACE)) + { + /* These types do not support device scopes */ + +@@ -696,7 +700,7 @@ AcpiDmDumpDmar ( + } + + ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset); +- while (ScopeOffset < Subtable->Length) ++ while (ScopeOffset < SubtableLength) + { + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable, +@@ -737,9 +741,9 @@ AcpiDmDumpDmar ( + NextSubtable: + /* Point to next subtable */ + +- Offset += Subtable->Length; ++ Offset += SubtableLength; + Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable, +- Subtable->Length); ++ SubtableLength); + } + } + +Index: acpica-unix2-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -634,6 +634,7 @@ DtCompileDmar ( + ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope; + UINT32 DeviceScopeLength; + UINT32 PciPathLength; ++ UINT16 DmarHeaderType; + + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable); +@@ -664,7 +665,8 @@ DtCompileDmar ( + + DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer); + +- switch (DmarHeader->Type) ++ DmarHeaderType = AcpiUtReadUint16 (&DmarHeader->Type); ++ switch (DmarHeaderType) + { + case ACPI_DMAR_TYPE_HARDWARE_UNIT: + +@@ -711,8 +713,8 @@ DtCompileDmar ( + /* + * Optional Device Scope subtables + */ +- if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || +- (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE)) ++ if ((DmarHeaderType == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || ++ (DmarHeaderType == ACPI_DMAR_TYPE_NAMESPACE)) + { + /* These types do not support device scopes */ + +@@ -721,8 +723,8 @@ DtCompileDmar ( + } + + DtPushSubtable (Subtable); +- DeviceScopeLength = DmarHeader->Length - Subtable->Length - +- ParentTable->Length; ++ DeviceScopeLength = AcpiUtReadUint16 (&DmarHeader->Length) - ++ Subtable->Length - ParentTable->Length; + while (DeviceScopeLength) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope, diff --git a/SOURCES/0013-Support-DRTM-in-a-big-endian-world.patch b/SOURCES/0013-Support-DRTM-in-a-big-endian-world.patch new file mode 100644 index 0000000..ac21497 --- /dev/null +++ b/SOURCES/0013-Support-DRTM-in-a-big-endian-world.patch @@ -0,0 +1,112 @@ +From bcdec27f562b0df37546b5e8ad2eab76348062eb Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Sat, 19 Sep 2020 15:44:06 -0600 +Subject: [PATCH 13/45] Support DRTM in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 25 +++++++++++++++---------- + source/compiler/dttable1.c | 6 ++++-- + 2 files changed, 19 insertions(+), 12 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -770,11 +770,14 @@ AcpiDmDumpDrtm ( + ACPI_DRTM_RESOURCE_LIST *DrtmRl; + ACPI_DRTM_DPS_ID *DrtmDps; + UINT32 Count; ++ UINT32 ResourceCount; ++ UINT32 ValidatedTableCount; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, + AcpiDmTableInfoDrtm); + if (ACPI_FAILURE (Status)) + { +@@ -789,7 +792,7 @@ AcpiDmDumpDrtm ( + + DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset); + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, ++ Status = AcpiDmDumpTable (TableLength, Offset, + DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables), + AcpiDmTableInfoDrtm0); + if (ACPI_FAILURE (Status)) +@@ -802,10 +805,11 @@ AcpiDmDumpDrtm ( + /* Dump Validated table addresses */ + + Count = 0; +- while ((Offset < Table->Length) && +- (DrtmVtl->ValidatedTableCount > Count)) ++ ValidatedTableCount = AcpiUtReadUint32 (&DrtmVtl->ValidatedTableCount); ++ while ((Offset < TableLength) && ++ (ValidatedTableCount > Count)) + { +- Status = AcpiDmDumpTable (Table->Length, Offset, ++ Status = AcpiDmDumpTable (TableLength, Offset, + ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64), + AcpiDmTableInfoDrtm0a); + if (ACPI_FAILURE (Status)) +@@ -821,7 +825,7 @@ AcpiDmDumpDrtm ( + + DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset); + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, ++ Status = AcpiDmDumpTable (TableLength, Offset, + DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources), + AcpiDmTableInfoDrtm1); + if (ACPI_FAILURE (Status)) +@@ -834,10 +838,11 @@ AcpiDmDumpDrtm ( + /* Dump the Resource List */ + + Count = 0; +- while ((Offset < Table->Length) && +- (DrtmRl->ResourceCount > Count)) ++ ResourceCount = AcpiUtReadUint32 (&DrtmRl->ResourceCount); ++ while ((Offset < TableLength) && ++ (ResourceCount > Count)) + { +- Status = AcpiDmDumpTable (Table->Length, Offset, ++ Status = AcpiDmDumpTable (TableLength, Offset, + ACPI_ADD_PTR (void, Table, Offset), + sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a); + if (ACPI_FAILURE (Status)) +@@ -853,7 +858,7 @@ AcpiDmDumpDrtm ( + + DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset); + AcpiOsPrintf ("\n"); +- (void) AcpiDmDumpTable (Table->Length, Offset, ++ (void) AcpiDmDumpTable (TableLength, Offset, + DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2); + } + +Index: acpica-unix2-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -849,7 +849,8 @@ DtCompileDrtm ( + Count++; + } + +- DrtmVtl->ValidatedTableCount = Count; ++ AcpiUtWriteUint (&DrtmVtl->ValidatedTableCount, sizeof (UINT32), ++ &Count, sizeof (UINT32)); + DtPopSubtable (); + ParentTable = DtPeekSubtable (); + +@@ -887,7 +888,8 @@ DtCompileDrtm ( + Count++; + } + +- DrtmRl->ResourceCount = Count; ++ AcpiUtWriteUint(&DrtmRl->ResourceCount, sizeof(UINT32), ++ &Count, sizeof(UINT32)); + DtPopSubtable (); + ParentTable = DtPeekSubtable (); + diff --git a/SOURCES/0014-Support-EINJ-in-a-big-endian-world.patch b/SOURCES/0014-Support-EINJ-in-a-big-endian-world.patch new file mode 100644 index 0000000..b28a42e --- /dev/null +++ b/SOURCES/0014-Support-EINJ-in-a-big-endian-world.patch @@ -0,0 +1,32 @@ +From 70d1047abe010c80c2dd74f6afdc7005b91e6163 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Sat, 19 Sep 2020 15:50:19 -0600 +Subject: [PATCH 14/45] Support EINJ in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -882,7 +882,7 @@ AcpiDmDumpEinj ( + { + ACPI_STATUS Status; + ACPI_WHEA_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 Length = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_EINJ); + + +@@ -897,7 +897,7 @@ AcpiDmDumpEinj ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < Length) + { + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Length, Offset, Subtable, diff --git a/SOURCES/0015-Support-ERST-in-a-big-endian-world.patch b/SOURCES/0015-Support-ERST-in-a-big-endian-world.patch new file mode 100644 index 0000000..1438b85 --- /dev/null +++ b/SOURCES/0015-Support-ERST-in-a-big-endian-world.patch @@ -0,0 +1,32 @@ +From e588961ca36e70c24aa1c49e96bcd1997bf98f89 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Sat, 19 Sep 2020 15:54:56 -0600 +Subject: [PATCH 15/45] Support ERST in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -935,7 +935,7 @@ AcpiDmDumpErst ( + { + ACPI_STATUS Status; + ACPI_WHEA_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 Length = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_ERST); + + +@@ -950,7 +950,7 @@ AcpiDmDumpErst ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < Length) + { + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Length, Offset, Subtable, diff --git a/SOURCES/0016-Support-FADT-aka-FACP-in-a-big-endian-world.patch b/SOURCES/0016-Support-FADT-aka-FACP-in-a-big-endian-world.patch new file mode 100644 index 0000000..51e4257 --- /dev/null +++ b/SOURCES/0016-Support-FADT-aka-FACP-in-a-big-endian-world.patch @@ -0,0 +1,189 @@ +From b3051bc2bad8988f3ad81a8307de6f1d0eef4ace Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Sun, 20 Sep 2020 11:42:21 -0600 +Subject: [PATCH 16/45] Support FADT (aka, FACP) in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump.c | 25 ++++++++++++----------- + source/components/tables/tbfadt.c | 34 +++++++++++++++++++++++-------- + 2 files changed, 38 insertions(+), 21 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump.c ++++ acpica-unix2-20210604/source/common/dmtbdump.c +@@ -363,11 +363,12 @@ AcpiDmDumpFadt ( + ACPI_TABLE_HEADER *Table) + { + ACPI_STATUS Status; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, + AcpiDmTableInfoFadt1); + if (ACPI_FAILURE (Status)) + { +@@ -376,10 +377,10 @@ AcpiDmDumpFadt ( + + /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */ + +- if ((Table->Length > ACPI_FADT_V1_SIZE) && +- (Table->Length <= ACPI_FADT_V2_SIZE)) ++ if ((TableLength > ACPI_FADT_V1_SIZE) && ++ (TableLength <= ACPI_FADT_V2_SIZE)) + { +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, + AcpiDmTableInfoFadt2); + if (ACPI_FAILURE (Status)) + { +@@ -389,9 +390,9 @@ AcpiDmDumpFadt ( + + /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */ + +- else if (Table->Length > ACPI_FADT_V2_SIZE) ++ else if (TableLength > ACPI_FADT_V2_SIZE) + { +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, + AcpiDmTableInfoFadt3); + if (ACPI_FAILURE (Status)) + { +@@ -400,9 +401,9 @@ AcpiDmDumpFadt ( + + /* Check for FADT revision 5 fields and up (ACPI 5.0+) */ + +- if (Table->Length > ACPI_FADT_V3_SIZE) ++ if (TableLength > ACPI_FADT_V3_SIZE) + { +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, + AcpiDmTableInfoFadt5); + if (ACPI_FAILURE (Status)) + { +@@ -412,9 +413,9 @@ AcpiDmDumpFadt ( + + /* Check for FADT revision 6 fields and up (ACPI 6.0+) */ + +- if (Table->Length > ACPI_FADT_V3_SIZE) ++ if (TableLength > ACPI_FADT_V3_SIZE) + { +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, + AcpiDmTableInfoFadt6); + if (ACPI_FAILURE (Status)) + { +@@ -425,11 +426,11 @@ AcpiDmDumpFadt ( + + /* Validate various fields in the FADT, including length */ + +- AcpiTbCreateLocalFadt (Table, Table->Length); ++ AcpiTbCreateLocalFadt (Table, TableLength); + + /* Validate FADT length against the revision */ + +- AcpiDmValidateFadtLength (Table->Revision, Table->Length); ++ AcpiDmValidateFadtLength (Table->Revision, TableLength); + } + + +Index: acpica-unix2-20210604/source/components/tables/tbfadt.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/tables/tbfadt.c ++++ acpica-unix2-20210604/source/components/tables/tbfadt.c +@@ -289,7 +289,6 @@ AcpiTbSelectAddress ( + UINT32 Address32, + UINT64 Address64) + { +- + if (!Address64) + { + /* 64-bit address is zero, use 32-bit address */ +@@ -520,6 +519,9 @@ AcpiTbConvertFadt ( + UINT8 Length; + UINT8 Flags; + UINT32 i; ++ UINT32 Tmp; ++ UINT32 Value32; ++ UINT64 Value64; + + + /* +@@ -533,7 +535,7 @@ AcpiTbConvertFadt ( + * Note: The FADT revision value is unreliable. Only the length can be + * trusted. + */ +- if (AcpiGbl_FADT.Header.Length <= ACPI_FADT_V2_SIZE) ++ if (AcpiUtReadUint32 (&AcpiGbl_FADT.Header.Length) <= ACPI_FADT_V2_SIZE) + { + AcpiGbl_FADT.PreferredProfile = 0; + AcpiGbl_FADT.PstateControl = 0; +@@ -546,14 +548,19 @@ AcpiTbConvertFadt ( + * current FADT version as defined by the ACPI specification. + * Thus, we will have a common FADT internally. + */ +- AcpiGbl_FADT.Header.Length = sizeof (ACPI_TABLE_FADT); ++ Tmp = sizeof (ACPI_TABLE_FADT); ++ AcpiUtWriteUint (&AcpiGbl_FADT.Header.Length, sizeof (UINT32), ++ &Tmp, sizeof (UINT32)); + + /* + * Expand the 32-bit DSDT addresses to 64-bit as necessary. + * Later ACPICA code will always use the X 64-bit field. + */ +- AcpiGbl_FADT.XDsdt = AcpiTbSelectAddress ("DSDT", +- AcpiGbl_FADT.Dsdt, AcpiGbl_FADT.XDsdt); ++ Value32 = AcpiUtReadUint32 (&AcpiGbl_FADT.Dsdt); ++ Value64 = AcpiUtReadUint64 (&AcpiGbl_FADT.XDsdt); ++ Value64 = AcpiTbSelectAddress ("DSDT", Value32, Value64); ++ AcpiUtWriteUint (&AcpiGbl_FADT.XDsdt, sizeof (UINT64), ++ &Value64, sizeof (UINT64)); + + /* If Hardware Reduced flag is set, we are all done */ + +@@ -614,7 +621,11 @@ AcpiTbConvertFadt ( + { + if (Address64->Address) + { +- if (Address64->Address != (UINT64) Address32) ++ Value32 = AcpiUtReadUint32 (&Address32); ++ Value64 = AcpiUtReadUint64 (&Address64->Address); ++ ++ /* if (Address64->Address != (UINT64) Address32) */ ++ if (Value64 != (UINT64) Value32) + { + /* Address mismatch */ + +@@ -655,9 +666,10 @@ AcpiTbConvertFadt ( + */ + if (!Address64->Address || AcpiGbl_Use32BitFadtAddresses) + { ++ Value32 = AcpiUtReadUint32 (&Address32); + AcpiTbInitGenericAddress (Address64, + ACPI_ADR_SPACE_SYSTEM_IO, Length, +- (UINT64) Address32, Name, Flags); ++ (UINT64) Value32, Name, Flags); + } + } + +@@ -780,10 +792,14 @@ AcpiTbSetupFadtRegisters ( + + if (Source64->Address) + { ++ UINT64 Address64; ++ ++ Address64 = AcpiUtReadUint64 (&Source64->Address); ++ Address64 += ++ (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth); + AcpiTbInitGenericAddress (FadtPmInfoTable[i].Target, + Source64->SpaceId, Pm1RegisterByteWidth, +- Source64->Address + +- (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth), ++ Address64, + "PmRegisters", 0); + } + } diff --git a/SOURCES/0017-Support-most-FPDTs-in-a-big-endian-world.patch b/SOURCES/0017-Support-most-FPDTs-in-a-big-endian-world.patch new file mode 100644 index 0000000..abeed59 --- /dev/null +++ b/SOURCES/0017-Support-most-FPDTs-in-a-big-endian-world.patch @@ -0,0 +1,85 @@ +From 35f533074fb78d52e87c5a14406a136480a6fe62 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 22 Sep 2020 17:51:45 -0600 +Subject: [PATCH 17/45] Support most FPDTs in a big-endian world + +NB: there is no support for vendor specific records even in +the little-endian version. + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 12 +++++++----- + source/compiler/dttable1.c | 4 +++- + 2 files changed, 10 insertions(+), 6 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -988,9 +988,10 @@ AcpiDmDumpFpdt ( + { + ACPI_STATUS Status; + ACPI_FPDT_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_FPDT); + ACPI_DMTABLE_INFO *InfoTable; ++ UINT16 SubtableType; + + + /* There is no main table (other than the standard ACPI header) */ +@@ -998,19 +999,20 @@ AcpiDmDumpFpdt ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoFpdtHdr); + if (ACPI_FAILURE (Status)) + { + return; + } + +- switch (Subtable->Type) ++ SubtableType = AcpiUtReadUint16 (&Subtable->Type); ++ switch (SubtableType) + { + case ACPI_FPDT_TYPE_BOOT: + +@@ -1037,7 +1039,7 @@ AcpiDmDumpFpdt ( + goto NextSubtable; + } + +- Status = AcpiDmDumpTable (Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Length, InfoTable); + if (ACPI_FAILURE (Status)) + { +Index: acpica-unix2-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -1125,6 +1125,7 @@ DtCompileFpdt ( + ACPI_DMTABLE_INFO *InfoTable; + DT_FIELD **PFieldList = (DT_FIELD **) List; + DT_FIELD *SubtableStart; ++ UINT16 SubtableType; + + + while (*PFieldList) +@@ -1143,7 +1144,8 @@ DtCompileFpdt ( + + FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); + +- switch (FpdtHeader->Type) ++ SubtableType = AcpiUtReadUint16 (&FpdtHeader->Type); ++ switch (SubtableType) + { + case ACPI_FPDT_TYPE_BOOT: + diff --git a/SOURCES/0018-Support-GTDT-in-a-big-endian-world.patch b/SOURCES/0018-Support-GTDT-in-a-big-endian-world.patch new file mode 100644 index 0000000..df3f181 --- /dev/null +++ b/SOURCES/0018-Support-GTDT-in-a-big-endian-world.patch @@ -0,0 +1,69 @@ +From 492e41a24fd088c7ab609ee8ad518f69c9cd29e3 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 22 Sep 2020 18:12:01 -0600 +Subject: [PATCH 18/45] Support GTDT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 13 +++++++++---- + source/compiler/dttable1.c | 9 +++++++-- + 2 files changed, 16 insertions(+), 6 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -1075,7 +1075,7 @@ AcpiDmDumpGtdt ( + { + ACPI_STATUS Status; + ACPI_GTDT_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 Length = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_GTDT); + ACPI_DMTABLE_INFO *InfoTable; + UINT32 SubtableLength; +@@ -1111,7 +1111,7 @@ AcpiDmDumpGtdt ( + + /* Subtables */ + +- while (Offset < Table->Length) ++ while (Offset < Length) + { + /* Common subtable header */ + +@@ -1129,8 +1129,13 @@ AcpiDmDumpGtdt ( + case ACPI_GTDT_TYPE_TIMER_BLOCK: + + SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK); +- GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, +- Subtable))->TimerCount; ++ { ++ UINT32 Tmp32; ++ ++ Tmp32 = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, ++ Subtable))->TimerCount; ++ GtCount = AcpiUtReadUint32 (&Tmp32); ++ } + + InfoTable = AcpiDmTableInfoGtdt0; + break; +Index: acpica-unix2-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -1071,8 +1071,13 @@ DtCompileGtdt ( + DtPushSubtable (Subtable); + ParentTable = DtPeekSubtable (); + +- GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, +- Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount; ++ { ++ UINT32 Tmp32; ++ ++ Tmp32 = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, ++ Subtable->Buffer - sizeof (ACPI_GTDT_HEADER)))->TimerCount; ++ GtCount = AcpiUtReadUint32 (&Tmp32); ++ } + + while (GtCount) + { diff --git a/SOURCES/0019-Support-HEST-in-a-big-endian-world.patch b/SOURCES/0019-Support-HEST-in-a-big-endian-world.patch new file mode 100644 index 0000000..baad30e --- /dev/null +++ b/SOURCES/0019-Support-HEST-in-a-big-endian-world.patch @@ -0,0 +1,75 @@ +From 6b73a4881e436bb8cf86c05c1cc4b5360efe1c7f Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 23 Sep 2020 11:54:49 -0600 +Subject: [PATCH 19/45] Support HEST in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 10 ++++++---- + source/compiler/dttable1.c | 4 +++- + 2 files changed, 9 insertions(+), 5 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -1216,12 +1216,13 @@ AcpiDmDumpHest ( + { + ACPI_STATUS Status; + ACPI_HEST_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 Length = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_HEST); + ACPI_DMTABLE_INFO *InfoTable; + UINT32 SubtableLength; + UINT32 BankCount; + ACPI_HEST_IA_ERROR_BANK *BankTable; ++ UINT16 SubtableType; + + + /* Main table */ +@@ -1235,10 +1236,11 @@ AcpiDmDumpHest ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < Length) + { + BankCount = 0; +- switch (Subtable->Type) ++ SubtableType = Subtable->Type; ++ switch (SubtableType) + { + case ACPI_HEST_TYPE_IA32_CHECK: + +@@ -1305,7 +1307,7 @@ AcpiDmDumpHest ( + /* Cannot continue on unknown type - no length */ + + AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", +- Subtable->Type); ++ SubtableType); + return; + } + +Index: acpica-unix2-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -1207,6 +1207,7 @@ DtCompileHest ( + DT_FIELD *SubtableStart; + ACPI_DMTABLE_INFO *InfoTable; + UINT16 Type; ++ UINT16 Tmp16; + UINT32 BankCount; + + +@@ -1225,7 +1226,8 @@ DtCompileHest ( + /* Get subtable type */ + + SubtableStart = *PFieldList; +- DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); ++ DtCompileInteger ((UINT8 *) &Tmp16, *PFieldList, 2, 0); ++ Type = AcpiUtReadUint32 (&Tmp16); + + switch (Type) + { diff --git a/SOURCES/0020-Support-RSDT-RSD-PTR-in-a-big-endian-world.patch b/SOURCES/0020-Support-RSDT-RSD-PTR-in-a-big-endian-world.patch new file mode 100644 index 0000000..6c2d0f0 --- /dev/null +++ b/SOURCES/0020-Support-RSDT-RSD-PTR-in-a-big-endian-world.patch @@ -0,0 +1,37 @@ +From 198abe6e9fcb03676513146bf2f9b8ccc49e5827 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 23 Sep 2020 12:11:46 -0600 +Subject: [PATCH 20/45] Support RSDT ('RSD PTR') in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump.c ++++ acpica-unix2-20210604/source/common/dmtbdump.c +@@ -282,6 +282,7 @@ AcpiDmDumpRsdt ( + UINT32 Entries; + UINT32 Offset; + UINT32 i; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Point to start of table pointer array */ +@@ -291,12 +292,12 @@ AcpiDmDumpRsdt ( + + /* RSDT uses 32-bit pointers */ + +- Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32); ++ Entries = (TableLength - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32); + + for (i = 0; i < Entries; i++) + { + AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i); +- AcpiOsPrintf ("%8.8X\n", Array[i]); ++ AcpiOsPrintf ("%8.8X\n", AcpiUtReadUint32 (&Array[i])); + Offset += sizeof (UINT32); + } + } diff --git a/SOURCES/0021-Support-XSDT-in-a-big-endian-world.patch b/SOURCES/0021-Support-XSDT-in-a-big-endian-world.patch new file mode 100644 index 0000000..83877c5 --- /dev/null +++ b/SOURCES/0021-Support-XSDT-in-a-big-endian-world.patch @@ -0,0 +1,38 @@ +From 75d974e42fefabfd6684d62f58bff678b55f396b Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 23 Sep 2020 12:16:37 -0600 +Subject: [PATCH 21/45] Support XSDT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump.c ++++ acpica-unix2-20210604/source/common/dmtbdump.c +@@ -323,6 +323,7 @@ AcpiDmDumpXsdt ( + UINT32 Entries; + UINT32 Offset; + UINT32 i; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Point to start of table pointer array */ +@@ -332,12 +333,13 @@ AcpiDmDumpXsdt ( + + /* XSDT uses 64-bit pointers */ + +- Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64); ++ Entries = (TableLength - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64); + + for (i = 0; i < Entries; i++) + { + AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i); +- AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i])); ++ AcpiOsPrintf ("%8.8X%8.8X\n", ++ ACPI_FORMAT_UINT64 (AcpiUtReadUint64 (&Array[i]))); + Offset += sizeof (UINT64); + } + } diff --git a/SOURCES/0022-Support-SRAT-in-a-big-endian-world.patch b/SOURCES/0022-Support-SRAT-in-a-big-endian-world.patch new file mode 100644 index 0000000..75bcc04 --- /dev/null +++ b/SOURCES/0022-Support-SRAT-in-a-big-endian-world.patch @@ -0,0 +1,52 @@ +From 724fcc83d359e4c8abbd2a48755e96049afa06d6 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 23 Sep 2020 12:25:38 -0600 +Subject: [PATCH 22/45] Support SRAT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump3.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump3.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump3.c ++++ acpica-unix2-20210604/source/common/dmtbdump3.c +@@ -173,11 +173,12 @@ AcpiDmDumpSrat ( + UINT32 Offset = sizeof (ACPI_TABLE_SRAT); + ACPI_SUBTABLE_HEADER *Subtable; + ACPI_DMTABLE_INFO *InfoTable; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoSrat); + if (ACPI_FAILURE (Status)) + { + return; +@@ -186,12 +187,12 @@ AcpiDmDumpSrat ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoSratHdr); + if (ACPI_FAILURE (Status)) + { +@@ -245,7 +246,7 @@ AcpiDmDumpSrat ( + } + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Length, InfoTable); + if (ACPI_FAILURE (Status)) + { diff --git a/SOURCES/0023-Support-SLIT-in-a-big-endian-world.patch b/SOURCES/0023-Support-SLIT-in-a-big-endian-world.patch new file mode 100644 index 0000000..e0e324f --- /dev/null +++ b/SOURCES/0023-Support-SLIT-in-a-big-endian-world.patch @@ -0,0 +1,61 @@ +From b11d50752feb9f1b52db076d1fb4753b30a53642 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 23 Sep 2020 12:49:52 -0600 +Subject: [PATCH 23/45] Support SLIT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump3.c | 8 +++++--- + source/compiler/dttable2.c | 2 +- + 2 files changed, 6 insertions(+), 4 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump3.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump3.c ++++ acpica-unix2-20210604/source/common/dmtbdump3.c +@@ -96,11 +96,12 @@ AcpiDmDumpSlit ( + UINT32 Localities; + UINT32 i; + UINT32 j; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoSlit); + if (ACPI_FAILURE (Status)) + { + return; +@@ -108,7 +109,8 @@ AcpiDmDumpSlit ( + + /* Display the Locality NxN Matrix */ + +- Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount; ++ Localities = (UINT32) ++ AcpiUtReadUint64 (&ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount); + Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]); + Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry; + +@@ -121,7 +123,7 @@ AcpiDmDumpSlit ( + { + /* Check for beyond EOT */ + +- if (Offset >= Table->Length) ++ if (Offset >= TableLength) + { + AcpiOsPrintf ( + "\n**** Not enough room in table for all localities\n"); +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -1837,7 +1837,7 @@ DtCompileSlit ( + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + +- Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); ++ Localities = (UINT32) AcpiUtReadUint64 (Subtable->Buffer); + LocalityBuffer = UtLocalCalloc (Localities); + LocalityListLength = 0; + diff --git a/SOURCES/0024-Support-MSCT-in-a-big-endian-world.patch b/SOURCES/0024-Support-MSCT-in-a-big-endian-world.patch new file mode 100644 index 0000000..bb93fe2 --- /dev/null +++ b/SOURCES/0024-Support-MSCT-in-a-big-endian-world.patch @@ -0,0 +1,43 @@ +From ae38e1578d18abf41330bb3dbaef9ea56a52f49b Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 23 Sep 2020 15:44:21 -0600 +Subject: [PATCH 24/45] Support MSCT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -1133,11 +1133,12 @@ AcpiDmDumpMsct ( + ACPI_STATUS Status; + UINT32 Offset = sizeof (ACPI_TABLE_MSCT); + ACPI_MSCT_PROXIMITY *Subtable; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoMsct); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1146,12 +1147,12 @@ AcpiDmDumpMsct ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); + if (ACPI_FAILURE (Status)) + { diff --git a/SOURCES/0025-Support-MPST-in-a-big-endian-world.patch b/SOURCES/0025-Support-MPST-in-a-big-endian-world.patch new file mode 100644 index 0000000..600c6ec --- /dev/null +++ b/SOURCES/0025-Support-MPST-in-a-big-endian-world.patch @@ -0,0 +1,152 @@ +From 0a25688f36df62579f4dd0444ceba33a0f8d4dcc Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 23 Sep 2020 16:08:24 -0600 +Subject: [PATCH 25/45] Support MPST in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 33 +++++++++++++++++++-------------- + source/compiler/dttable2.c | 8 ++++---- + 2 files changed, 23 insertions(+), 18 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -995,11 +995,13 @@ AcpiDmDumpMpst ( + UINT16 SubtableCount; + UINT32 PowerStateCount; + UINT32 ComponentCount; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); ++ UINT16 Tmp16; + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoMpst); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1007,13 +1009,14 @@ AcpiDmDumpMpst ( + + /* Subtable: Memory Power Node(s) */ + +- SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; ++ Tmp16 = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; ++ SubtableCount = AcpiUtReadUint16 (&Tmp16); + Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); + +- while ((Offset < Table->Length) && SubtableCount) ++ while ((Offset < TableLength) && SubtableCount) + { + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable0, + sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); + if (ACPI_FAILURE (Status)) + { +@@ -1022,8 +1025,8 @@ AcpiDmDumpMpst ( + + /* Extract the sub-subtable counts */ + +- PowerStateCount = Subtable0->NumPowerStates; +- ComponentCount = Subtable0->NumPhysicalComponents; ++ PowerStateCount = AcpiUtReadUint16 (&Subtable0->NumPowerStates); ++ ComponentCount = AcpiUtReadUint16 (&Subtable0->NumPhysicalComponents); + Offset += sizeof (ACPI_MPST_POWER_NODE); + + /* Sub-subtables - Memory Power State Structure(s) */ +@@ -1034,7 +1037,7 @@ AcpiDmDumpMpst ( + while (PowerStateCount) + { + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable0A, + sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); + if (ACPI_FAILURE (Status)) + { +@@ -1057,7 +1060,7 @@ AcpiDmDumpMpst ( + + while (ComponentCount) + { +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable0B, + sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); + if (ACPI_FAILURE (Status)) + { +@@ -1074,22 +1077,24 @@ AcpiDmDumpMpst ( + SubtableCount--; + Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0, + sizeof (ACPI_MPST_POWER_NODE) + +- (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) + +- (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents)); ++ (sizeof (ACPI_MPST_POWER_STATE) * ++ AcpiUtReadUint16 (&Subtable0->NumPowerStates)) + ++ (sizeof (ACPI_MPST_COMPONENT) * ++ AcpiUtReadUint16 (&Subtable0->NumPhysicalComponents))); + } + + /* Subtable: Count of Memory Power State Characteristic structures */ + + AcpiOsPrintf ("\n"); + Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable1, + sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); + if (ACPI_FAILURE (Status)) + { + return; + } + +- SubtableCount = Subtable1->CharacteristicsCount; ++ SubtableCount = AcpiUtReadUint16 (&Subtable1->CharacteristicsCount); + Offset += sizeof (ACPI_MPST_DATA_HDR); + + /* Subtable: Memory Power State Characteristics structure(s) */ +@@ -1097,10 +1102,10 @@ AcpiDmDumpMpst ( + Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1, + sizeof (ACPI_MPST_DATA_HDR)); + +- while ((Offset < Table->Length) && SubtableCount) ++ while ((Offset < TableLength) && SubtableCount) + { + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable2, + sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); + if (ACPI_FAILURE (Status)) + { +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -350,7 +350,7 @@ DtCompileMpst ( + DtPushSubtable (Subtable); + + MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer); +- SubtableCount = MpstChannelInfo->PowerNodeCount; ++ SubtableCount = AcpiUtReadUint16 (&MpstChannelInfo->PowerNodeCount); + + while (*PFieldList && SubtableCount) + { +@@ -368,8 +368,8 @@ DtCompileMpst ( + DtPushSubtable (Subtable); + + MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer); +- PowerStateCount = MpstPowerNode->NumPowerStates; +- ComponentCount = MpstPowerNode->NumPhysicalComponents; ++ PowerStateCount = AcpiUtReadUint16 (&MpstPowerNode->NumPowerStates); ++ ComponentCount = AcpiUtReadUint16 (&MpstPowerNode->NumPhysicalComponents); + + ParentTable = DtPeekSubtable (); + +@@ -422,7 +422,7 @@ DtCompileMpst ( + DtPushSubtable (Subtable); + + MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer); +- SubtableCount = MpstDataHeader->CharacteristicsCount; ++ SubtableCount = AcpiUtReadUint16(&MpstDataHeader->CharacteristicsCount); + + ParentTable = DtPeekSubtable (); + diff --git a/SOURCES/0026-Support-NFIT-in-a-big-endian-world.patch b/SOURCES/0026-Support-NFIT-in-a-big-endian-world.patch new file mode 100644 index 0000000..cf5267d --- /dev/null +++ b/SOURCES/0026-Support-NFIT-in-a-big-endian-world.patch @@ -0,0 +1,227 @@ +From 5aec8511fc433a71cb8b6d26be464355d0c3f5cc Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Thu, 24 Sep 2020 15:25:53 -0600 +Subject: [PATCH 26/45] Support NFIT in a big-endian world + +NB: this required correcting the starting pointer for the NFIT +SMBIOS subtable; otherwise, disassembly did not work properly. + +Signed-off-by: Al Stone +--- + source/common/dmtable.c | 4 ++-- + source/common/dmtbdump2.c | 49 ++++++++++++++++++++++---------------- + source/compiler/dttable2.c | 11 ++++++--- + 3 files changed, 39 insertions(+), 25 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtable.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtable.c ++++ acpica-unix2-20210604/source/common/dmtable.c +@@ -1526,13 +1526,13 @@ AcpiDmDumpTable ( + + /* NFIT subtable types */ + +- Temp16 = ACPI_GET16 (Target); ++ Temp16 = AcpiUtReadUint16 (Target); + if (Temp16 > ACPI_NFIT_TYPE_RESERVED) + { + Temp16 = ACPI_NFIT_TYPE_RESERVED; + } + +- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), ++ AcpiOsPrintf (UINT16_FORMAT, Temp16, + AcpiDmNfitSubnames[Temp16]); + break; + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -1192,18 +1192,23 @@ AcpiDmDumpNfit ( + ACPI_STATUS Status; + UINT32 Offset = sizeof (ACPI_TABLE_NFIT); + UINT32 FieldOffset = 0; +- UINT32 Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + ACPI_NFIT_HEADER *Subtable; + ACPI_DMTABLE_INFO *InfoTable; + ACPI_NFIT_INTERLEAVE *Interleave = NULL; + ACPI_NFIT_SMBIOS *SmbiosInfo = NULL; + ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; + UINT32 i; ++ UINT32 Length; ++ UINT32 LineCount; ++ UINT16 SubtableLength; ++ UINT16 SubtableType; ++ UINT16 HintCount; + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNfit); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1212,19 +1217,21 @@ AcpiDmDumpNfit ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* NFIT subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, +- Subtable->Length, AcpiDmTableInfoNfitHdr); ++ SubtableType = AcpiUtReadUint16 (&Subtable->Type); ++ SubtableLength = AcpiUtReadUint16 (&Subtable->Length); ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, ++ SubtableLength, AcpiDmTableInfoNfitHdr); + if (ACPI_FAILURE (Status)) + { + return; + } + +- switch (Subtable->Type) ++ switch (SubtableType) + { + case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: + +@@ -1275,11 +1282,11 @@ AcpiDmDumpNfit ( + + default: + AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", +- Subtable->Type); ++ SubtableType); + + /* Attempt to continue */ + +- if (!Subtable->Length) ++ if (!SubtableLength) + { + AcpiOsPrintf ("Invalid zero length subtable\n"); + return; +@@ -1288,8 +1295,8 @@ AcpiDmDumpNfit ( + } + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, +- Subtable->Length, InfoTable); ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, ++ SubtableLength, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1297,14 +1304,15 @@ AcpiDmDumpNfit ( + + /* Per-subtable variable-length fields */ + +- switch (Subtable->Type) ++ switch (SubtableType) + { + case ACPI_NFIT_TYPE_INTERLEAVE: + + Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable); +- for (i = 0; i < Interleave->LineCount; i++) ++ LineCount = AcpiUtReadUint32 (&Interleave->LineCount); ++ for (i = 0; i < LineCount; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset, + &Interleave->LineOffset[i], + sizeof (UINT32), AcpiDmTableInfoNfit2a); + if (ACPI_FAILURE (Status)) +@@ -1318,14 +1326,14 @@ AcpiDmDumpNfit ( + + case ACPI_NFIT_TYPE_SMBIOS: + +- Length = Subtable->Length - ++ Length = SubtableLength - + sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8); + + if (Length) + { +- Status = AcpiDmDumpTable (Table->Length, ++ Status = AcpiDmDumpTable (TableLength, + sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8), +- SmbiosInfo, ++ SmbiosInfo + Offset, + Length, AcpiDmTableInfoNfit3a); + if (ACPI_FAILURE (Status)) + { +@@ -1338,9 +1346,10 @@ AcpiDmDumpNfit ( + case ACPI_NFIT_TYPE_FLUSH_ADDRESS: + + Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable); +- for (i = 0; i < Hint->HintCount; i++) ++ HintCount = AcpiUtReadUint16 (&Hint->HintCount); ++ for (i = 0; i < HintCount; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset, + &Hint->HintAddress[i], + sizeof (UINT64), AcpiDmTableInfoNfit6a); + if (ACPI_FAILURE (Status)) +@@ -1359,8 +1368,8 @@ AcpiDmDumpNfit ( + NextSubtable: + /* Point to next subtable */ + +- Offset += Subtable->Length; +- Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length); ++ Offset += SubtableLength; ++ Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, SubtableLength); + } + } + +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -497,6 +497,7 @@ DtCompileNfit ( + UINT32 Count; + ACPI_NFIT_INTERLEAVE *Interleave = NULL; + ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; ++ UINT16 NfitHeaderType; + + + /* Main table */ +@@ -530,7 +531,8 @@ DtCompileNfit ( + + NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer); + +- switch (NfitHeader->Type) ++ NfitHeaderType = AcpiUtReadUint16 (&NfitHeader->Type); ++ switch (NfitHeaderType) + { + case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: + +@@ -590,7 +592,7 @@ DtCompileNfit ( + DtInsertSubtable (ParentTable, Subtable); + DtPopSubtable (); + +- switch (NfitHeader->Type) ++ switch (NfitHeaderType) + { + case ACPI_NFIT_TYPE_INTERLEAVE: + +@@ -616,7 +618,8 @@ DtCompileNfit ( + Count++; + } + +- Interleave->LineCount = Count; ++ AcpiUtWriteUint (&Interleave->LineCount, sizeof (UINT32), ++ &Count, sizeof (UINT32)); + break; + + case ACPI_NFIT_TYPE_SMBIOS: +@@ -662,6 +665,8 @@ DtCompileNfit ( + } + + Hint->HintCount = (UINT16) Count; ++ AcpiUtWriteUint (&Hint->HintCount, sizeof (UINT16), ++ &Count, sizeof (UINT32)); + break; + + default: diff --git a/SOURCES/0027-Support-SDEV-in-a-big-endian-world.patch b/SOURCES/0027-Support-SDEV-in-a-big-endian-world.patch new file mode 100644 index 0000000..800098e --- /dev/null +++ b/SOURCES/0027-Support-SDEV-in-a-big-endian-world.patch @@ -0,0 +1,206 @@ +From 3d1ac6e76ad0c0d6454671b190ccbbfafb0cb4cc Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 29 Jun 2021 16:03:36 -0600 +Subject: [PATCH 27/45] Support SDEV in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 48 +++++++++++++++++++++----------------- + source/compiler/dttable2.c | 27 ++++++++++++++++++++- + 2 files changed, 52 insertions(+), 23 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -2125,7 +2125,7 @@ AcpiDmDumpSdev ( + ACPI_SDEV_NAMESPACE *Namesp; + ACPI_DMTABLE_INFO *InfoTable; + ACPI_DMTABLE_INFO *SecureComponentInfoTable; +- UINT32 Length = Table->Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_SDEV); + UINT16 PathOffset; + UINT16 PathLength; +@@ -2133,11 +2133,12 @@ AcpiDmDumpSdev ( + UINT16 VendorDataLength; + ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL; + UINT32 CurrentOffset = 0; ++ UINT16 SubtableLength; + + + /* Main table */ + +- Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoSdev); + if (ACPI_FAILURE (Status)) + { + return; +@@ -2146,13 +2147,14 @@ AcpiDmDumpSdev ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, +- Subtable->Length, AcpiDmTableInfoSdevHdr); ++ SubtableLength = AcpiUtReadUint16 (&Subtable->Length); ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, ++ SubtableLength, AcpiDmTableInfoSdevHdr); + if (ACPI_FAILURE (Status)) + { + return; +@@ -2175,8 +2177,8 @@ AcpiDmDumpSdev ( + } + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, 0, Subtable, +- Subtable->Length, InfoTable); ++ Status = AcpiDmDumpTable (TableLength, 0, Subtable, ++ SubtableLength, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; +@@ -2235,12 +2237,12 @@ AcpiDmDumpSdev ( + /* Dump the PCIe device ID(s) */ + + Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable); +- PathOffset = Namesp->DeviceIdOffset; +- PathLength = Namesp->DeviceIdLength; ++ PathOffset = AcpiUtReadUint16 (&Namesp->DeviceIdOffset); ++ PathLength = AcpiUtReadUint16 (&Namesp->DeviceIdLength); + + if (PathLength) + { +- Status = AcpiDmDumpTable (Table->Length, CurrentOffset, ++ Status = AcpiDmDumpTable (TableLength, CurrentOffset, + ACPI_ADD_PTR (UINT8, Namesp, PathOffset), + PathLength, AcpiDmTableInfoSdev0a); + if (ACPI_FAILURE (Status)) +@@ -2252,14 +2254,14 @@ AcpiDmDumpSdev ( + + /* Dump the vendor-specific data */ + +- VendorDataLength = +- Namesp->VendorDataLength; ++ VendorDataLength = AcpiUtReadUint16 (&Namesp->VendorDataLength); + VendorDataOffset = +- Namesp->DeviceIdOffset + Namesp->DeviceIdLength; ++ AcpiUtReadUint16 (&Namesp->DeviceIdOffset) + ++ AcpiUtReadUint16 (&Namesp->DeviceIdLength); + + if (VendorDataLength) + { +- Status = AcpiDmDumpTable (Table->Length, 0, ++ Status = AcpiDmDumpTable (TableLength, 0, + ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset), + VendorDataLength, AcpiDmTableInfoSdev1b); + if (ACPI_FAILURE (Status)) +@@ -2274,12 +2276,12 @@ AcpiDmDumpSdev ( + /* PCI path substructures */ + + Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable); +- PathOffset = Pcie->PathOffset; +- PathLength = Pcie->PathLength; ++ PathOffset = AcpiUtReadUint16 (&Pcie->PathOffset); ++ PathLength = AcpiUtReadUint16 (&Pcie->PathLength); + + while (PathLength) + { +- Status = AcpiDmDumpTable (Table->Length, ++ Status = AcpiDmDumpTable (TableLength, + PathOffset + Offset, + ACPI_ADD_PTR (UINT8, Pcie, PathOffset), + sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a); +@@ -2294,12 +2296,14 @@ AcpiDmDumpSdev ( + + /* VendorData */ + +- VendorDataLength = Pcie->VendorDataLength; +- VendorDataOffset = Pcie->PathOffset + Pcie->PathLength; ++ VendorDataLength = AcpiUtReadUint16 (&Pcie->VendorDataLength); ++ VendorDataOffset = ++ AcpiUtReadUint16 (&Pcie->PathOffset) + ++ AcpiUtReadUint16 (&Pcie->PathLength); + + if (VendorDataLength) + { +- Status = AcpiDmDumpTable (Table->Length, 0, ++ Status = AcpiDmDumpTable (TableLength, 0, + ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset), + VendorDataLength, AcpiDmTableInfoSdev1b); + if (ACPI_FAILURE (Status)) +@@ -2316,8 +2320,8 @@ AcpiDmDumpSdev ( + NextSubtable: + /* Point to next subtable */ + +- Offset += Subtable->Length; ++ Offset += SubtableLength; + Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable, +- Subtable->Length); ++ SubtableLength); + } + } +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -1493,6 +1493,7 @@ DtCompileSdev ( + UINT32 EntryCount; + ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL; + UINT16 ComponentLength = 0; ++ UINT16 Tmp16; + + + /* Subtables */ +@@ -1514,7 +1515,7 @@ DtCompileSdev ( + DtPushSubtable (Subtable); + + SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer); +- SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER)); ++ SdevHeader->Length = (UINT16) (sizeof (ACPI_SDEV_HEADER)); + + switch (SdevHeader->Type) + { +@@ -1687,6 +1688,18 @@ DtCompileSdev ( + } + } + ++ /* Make sure everything is now little-endian */ ++ Tmp16 = AcpiUtReadUint16 (&SdevHeader->Length); ++ SdevHeader->Length = Tmp16; ++ Tmp16 = AcpiUtReadUint16 (&Namesp->DeviceIdOffset); ++ Namesp->DeviceIdOffset = Tmp16; ++ Tmp16 = AcpiUtReadUint16 (&Namesp->DeviceIdLength); ++ Namesp->DeviceIdLength = Tmp16; ++ Tmp16 = AcpiUtReadUint16 (&Namesp->VendorDataOffset); ++ Namesp->VendorDataOffset = Tmp16; ++ Tmp16 = AcpiUtReadUint16 (&Namesp->VendorDataLength); ++ Namesp->VendorDataLength = Tmp16; ++ + break; + + case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: +@@ -1749,6 +1762,18 @@ DtCompileSdev ( + SdevHeader->Length = + sizeof (ACPI_SDEV_PCIE) + + Pcie->PathLength + Pcie->VendorDataLength; ++ ++ Tmp16 = AcpiUtReadUint16 (&SdevHeader->Length); ++ SdevHeader->Length = Tmp16; ++ Tmp16 = AcpiUtReadUint16 (&Pcie->PathOffset); ++ Pcie->PathOffset = Tmp16; ++ Tmp16 = AcpiUtReadUint16 (&Pcie->PathLength); ++ Pcie->PathLength = Tmp16; ++ Tmp16 = AcpiUtReadUint16 (&Pcie->VendorDataOffset); ++ Pcie->VendorDataOffset = Tmp16; ++ Tmp16 = AcpiUtReadUint16 (&Pcie->VendorDataLength); ++ Pcie->VendorDataLength = Tmp16; ++ + break; + + default: diff --git a/SOURCES/0028-Support-HMAT-in-a-big-endian-world.patch b/SOURCES/0028-Support-HMAT-in-a-big-endian-world.patch new file mode 100644 index 0000000..eb37f70 --- /dev/null +++ b/SOURCES/0028-Support-HMAT-in-a-big-endian-world.patch @@ -0,0 +1,278 @@ +From 915b8b70726fd01befdeac0c8630db528ac40552 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 25 Sep 2020 16:56:55 -0600 +Subject: [PATCH 28/45] Support HMAT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 70 ++++++++++++++++++++++---------------- + source/compiler/dttable1.c | 24 ++++++++++--- + 2 files changed, 59 insertions(+), 35 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -1379,37 +1379,45 @@ AcpiDmDumpHmat ( + UINT32 Length; + ACPI_DMTABLE_INFO *InfoTable; + UINT32 i, j; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); ++ UINT16 HmatStructType; ++ UINT32 HmatStructLength; ++ UINT32 InitPDs; ++ UINT32 TgtPDs; ++ UINT16 SMBIOSHandles; + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoHmat); + if (ACPI_FAILURE (Status)) + { + return; + } + Offset = sizeof (ACPI_TABLE_HMAT); + +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + AcpiOsPrintf ("\n"); + + /* Dump HMAT structure header */ + + HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset); +- if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE)) ++ HmatStructLength = AcpiUtReadUint32 (&HmatStruct->Length); ++ if (HmatStructLength < sizeof (ACPI_HMAT_STRUCTURE)) + { + AcpiOsPrintf ("Invalid HMAT structure length\n"); + return; + } +- Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct, +- HmatStruct->Length, AcpiDmTableInfoHmatHdr); ++ Status = AcpiDmDumpTable (TableLength, Offset, HmatStruct, ++ HmatStructLength, AcpiDmTableInfoHmatHdr); + if (ACPI_FAILURE (Status)) + { + return; + } + +- switch (HmatStruct->Type) ++ HmatStructType = AcpiUtReadUint16 (&HmatStruct->Type); ++ switch (HmatStructType) + { + case ACPI_HMAT_TYPE_ADDRESS_RANGE: + +@@ -1432,7 +1440,7 @@ AcpiDmDumpHmat ( + default: + + AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n", +- HmatStruct->Type); ++ HmatStructType); + + /* Attempt to continue */ + +@@ -1441,13 +1449,13 @@ AcpiDmDumpHmat ( + + /* Dump HMAT structure body */ + +- if (HmatStruct->Length < Length) ++ if (HmatStructLength < Length) + { + AcpiOsPrintf ("Invalid HMAT structure length\n"); + return; + } +- Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct, +- HmatStruct->Length, InfoTable); ++ Status = AcpiDmDumpTable (TableLength, Offset, HmatStruct, ++ HmatStructLength, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1455,7 +1463,7 @@ AcpiDmDumpHmat ( + + /* Dump HMAT structure additionals */ + +- switch (HmatStruct->Type) ++ switch (HmatStructType) + { + case ACPI_HMAT_TYPE_LOCALITY: + +@@ -1464,15 +1472,16 @@ AcpiDmDumpHmat ( + + /* Dump initiator proximity domains */ + +- if ((UINT32)(HmatStruct->Length - SubtableOffset) < +- (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4)) ++ InitPDs = AcpiUtReadUint32 (&HmatLocality->NumberOfInitiatorPDs); ++ if ((UINT32) (HmatStructLength - SubtableOffset) < ++ (UINT32) (InitPDs * 4)) + { + AcpiOsPrintf ("Invalid initiator proximity domain number\n"); + return; + } +- for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++) ++ for (i = 0; i < InitPDs; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), + 4, AcpiDmTableInfoHmat1a); + if (ACPI_FAILURE (Status)) +@@ -1485,15 +1494,16 @@ AcpiDmDumpHmat ( + + /* Dump target proximity domains */ + +- if ((UINT32)(HmatStruct->Length - SubtableOffset) < +- (UINT32)(HmatLocality->NumberOfTargetPDs * 4)) ++ TgtPDs = AcpiUtReadUint32 (&HmatLocality->NumberOfTargetPDs); ++ if ((UINT32) (HmatStructLength - SubtableOffset) < ++ (UINT32) (TgtPDs * 4)) + { + AcpiOsPrintf ("Invalid target proximity domain number\n"); + return; + } +- for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++) ++ for (i = 0; i < TgtPDs; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), + 4, AcpiDmTableInfoHmat1b); + if (ACPI_FAILURE (Status)) +@@ -1506,18 +1516,17 @@ AcpiDmDumpHmat ( + + /* Dump latency/bandwidth entris */ + +- if ((UINT32)(HmatStruct->Length - SubtableOffset) < +- (UINT32)(HmatLocality->NumberOfInitiatorPDs * +- HmatLocality->NumberOfTargetPDs * 2)) ++ if ((UINT32) (HmatStructLength - SubtableOffset) < ++ (UINT32) (InitPDs * TgtPDs * 2)) + { + AcpiOsPrintf ("Invalid latency/bandwidth entry number\n"); + return; + } +- for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++) ++ for (i = 0; i < InitPDs; i++) + { +- for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++) ++ for (j = 0; j < TgtPDs; j++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), + 2, AcpiDmTableInfoHmat1c); + if (ACPI_FAILURE(Status)) +@@ -1537,15 +1546,16 @@ AcpiDmDumpHmat ( + + /* Dump SMBIOS handles */ + +- if ((UINT32)(HmatStruct->Length - SubtableOffset) < +- (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2)) ++ SMBIOSHandles = AcpiUtReadUint16 (&HmatCache->NumberOfSMBIOSHandles); ++ if ((UINT32) (HmatStructLength - SubtableOffset) < ++ (UINT32) (SMBIOSHandles * 2)) + { + AcpiOsPrintf ("Invalid SMBIOS handle number\n"); + return; + } +- for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++) ++ for (i = 0; i < SMBIOSHandles; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), + 2, AcpiDmTableInfoHmat2a); + if (ACPI_FAILURE (Status)) +@@ -1565,6 +1575,6 @@ AcpiDmDumpHmat ( + NextSubtable: + /* Point to next HMAT structure subtable */ + +- Offset += (HmatStruct->Length); ++ Offset += (HmatStructLength); + } + } +Index: acpica-unix2-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -1369,6 +1369,8 @@ DtCompileHmat ( + UINT32 TgtPDNumber; + UINT64 EntryNumber; + UINT16 SMBIOSHandleNumber; ++ UINT16 HmatStructType; ++ UINT32 Length; + + + ParentTable = DtPeekSubtable (); +@@ -1399,7 +1401,8 @@ DtCompileHmat ( + + /* Compile HMAT structure body */ + +- switch (HmatStruct->Type) ++ HmatStructType = AcpiUtReadUint16 (&HmatStruct->Type); ++ switch (HmatStructType) + { + case ACPI_HMAT_TYPE_ADDRESS_RANGE: + +@@ -1432,7 +1435,7 @@ DtCompileHmat ( + + /* Compile HMAT structure additionals */ + +- switch (HmatStruct->Type) ++ switch (HmatStructType) + { + case ACPI_HMAT_TYPE_LOCALITY: + +@@ -1458,7 +1461,7 @@ DtCompileHmat ( + HmatStruct->Length += Subtable->Length; + IntPDNumber++; + } +- HmatLocality->NumberOfInitiatorPDs = IntPDNumber; ++ HmatLocality->NumberOfInitiatorPDs = AcpiUtReadUint32 (&IntPDNumber); + + /* Compile target proximity domain list */ + +@@ -1479,7 +1482,7 @@ DtCompileHmat ( + HmatStruct->Length += Subtable->Length; + TgtPDNumber++; + } +- HmatLocality->NumberOfTargetPDs = TgtPDNumber; ++ HmatLocality->NumberOfTargetPDs = AcpiUtReadUint32 (&TgtPDNumber); + + /* Save start of the entries for reporting errors */ + +@@ -1505,6 +1508,9 @@ DtCompileHmat ( + EntryNumber++; + } + ++ Length = AcpiUtReadUint32 (&HmatStruct->Length); ++ HmatStruct->Length = Length; ++ + /* Validate number of entries */ + + if (EntryNumber != +@@ -1538,11 +1544,19 @@ DtCompileHmat ( + HmatStruct->Length += Subtable->Length; + SMBIOSHandleNumber++; + } +- HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber; ++ HmatCache->NumberOfSMBIOSHandles = ++ AcpiUtReadUint16 (&SMBIOSHandleNumber); ++ ++ Length = AcpiUtReadUint32 (&HmatStruct->Length); ++ HmatStruct->Length = Length; ++ + break; + + default: + ++ Length = AcpiUtReadUint32(&HmatStruct->Length); ++ HmatStruct->Length = Length; ++ + break; + } + } diff --git a/SOURCES/0029-Support-PDTT-in-a-big-endian-world.patch b/SOURCES/0029-Support-PDTT-in-a-big-endian-world.patch new file mode 100644 index 0000000..8511288 --- /dev/null +++ b/SOURCES/0029-Support-PDTT-in-a-big-endian-world.patch @@ -0,0 +1,43 @@ +From 253fe3545e7d4eaa9cb93c771c9619f410109a02 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 25 Sep 2020 17:03:05 -0600 +Subject: [PATCH 29/45] Support PDTT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -1498,13 +1498,13 @@ AcpiDmDumpPdtt ( + { + ACPI_STATUS Status; + ACPI_PDTT_CHANNEL *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_PDTT); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoPdtt); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1513,10 +1513,10 @@ AcpiDmDumpPdtt ( + /* Subtables. Currently there is only one type, but can be multiples */ + + Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0); + if (ACPI_FAILURE (Status)) + { diff --git a/SOURCES/0030-Support-PPTT-in-a-big-endian-world.patch b/SOURCES/0030-Support-PPTT-in-a-big-endian-world.patch new file mode 100644 index 0000000..c4d062a --- /dev/null +++ b/SOURCES/0030-Support-PPTT-in-a-big-endian-world.patch @@ -0,0 +1,105 @@ +From 8923211d8bc1b0e4d3af6ff31ed6479057f612f6 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 25 Sep 2020 17:16:12 -0600 +Subject: [PATCH 30/45] Support PPTT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 17 ++++++++++------- + source/compiler/dttable2.c | 7 +++++-- + 2 files changed, 15 insertions(+), 9 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -1785,6 +1785,8 @@ AcpiDmDumpPptt ( + UINT32 Offset = sizeof (ACPI_TABLE_FPDT); + ACPI_DMTABLE_INFO *InfoTable; + UINT32 i; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); ++ UINT32 NumPrivRes; + + + /* There is no main table (other than the standard ACPI header) */ +@@ -1792,7 +1794,7 @@ AcpiDmDumpPptt ( + /* Subtables */ + + Offset = sizeof (ACPI_TABLE_HEADER); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + AcpiOsPrintf ("\n"); + +@@ -1804,7 +1806,7 @@ AcpiDmDumpPptt ( + AcpiOsPrintf ("Invalid subtable length\n"); + return; + } +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoPpttHdr); + if (ACPI_FAILURE (Status)) + { +@@ -1846,7 +1848,7 @@ AcpiDmDumpPptt ( + AcpiOsPrintf ("Invalid subtable length\n"); + return; + } +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Length, InfoTable); + if (ACPI_FAILURE (Status)) + { +@@ -1862,15 +1864,16 @@ AcpiDmDumpPptt ( + + /* Dump SMBIOS handles */ + +- if ((UINT8)(Subtable->Length - SubtableOffset) < +- (UINT8)(PpttProcessor->NumberOfPrivResources * 4)) ++ NumPrivRes = AcpiUtReadUint32 (&PpttProcessor->NumberOfPrivResources); ++ if ((UINT8) (Subtable->Length - SubtableOffset) < ++ (UINT8) (NumPrivRes * 4)) + { + AcpiOsPrintf ("Invalid private resource number\n"); + return; + } +- for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++) ++ for (i = 0; i < NumPrivRes; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset), + 4, AcpiDmTableInfoPptt0a); + if (ACPI_FAILURE (Status)) +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -1123,6 +1123,7 @@ DtCompilePptt ( + DT_FIELD **PFieldList = (DT_FIELD **) List; + DT_FIELD *SubtableStart; + ACPI_TABLE_HEADER *PpttAcpiHeader; ++ UINT32 NumPrivRes; + + + ParentTable = DtPeekSubtable (); +@@ -1187,7 +1188,7 @@ DtCompilePptt ( + { + /* Compile initiator proximity domain list */ + +- PpttProcessor->NumberOfPrivResources = 0; ++ NumPrivRes = 0; + while (*PFieldList) + { + Status = DtCompileTable (PFieldList, +@@ -1203,8 +1204,10 @@ DtCompilePptt ( + + DtInsertSubtable (ParentTable, Subtable); + PpttHeader->Length += (UINT8)(Subtable->Length); +- PpttProcessor->NumberOfPrivResources++; ++ NumPrivRes++; + } ++ PpttProcessor->NumberOfPrivResources = ++ AcpiUtReadUint32 (&NumPrivRes); + } + break; + diff --git a/SOURCES/0031-Support-PCCT-in-a-big-endian-world.patch b/SOURCES/0031-Support-PCCT-in-a-big-endian-world.patch new file mode 100644 index 0000000..00d908e --- /dev/null +++ b/SOURCES/0031-Support-PCCT-in-a-big-endian-world.patch @@ -0,0 +1,54 @@ +From a58ff76fc6e68488d93b55016a7aeb257971a252 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 25 Sep 2020 17:39:34 -0600 +Subject: [PATCH 31/45] Support PCCT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -1394,13 +1394,13 @@ AcpiDmDumpPcct ( + ACPI_STATUS Status; + ACPI_PCCT_SUBSPACE *Subtable; + ACPI_DMTABLE_INFO *InfoTable; +- UINT32 Length = Table->Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_PCCT); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoPcct); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1409,12 +1409,12 @@ AcpiDmDumpPcct ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Header.Length, AcpiDmTableInfoPcctHdr); + if (ACPI_FAILURE (Status)) + { +@@ -1462,7 +1462,7 @@ AcpiDmDumpPcct ( + } + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Subtable->Header.Length, InfoTable); + if (ACPI_FAILURE (Status)) + { diff --git a/SOURCES/0032-Support-WDAT-in-a-big-endian-world.patch b/SOURCES/0032-Support-WDAT-in-a-big-endian-world.patch new file mode 100644 index 0000000..d28ec57 --- /dev/null +++ b/SOURCES/0032-Support-WDAT-in-a-big-endian-world.patch @@ -0,0 +1,43 @@ +From ff1449919ee7d395d301e3a56a4ba333604d0458 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 25 Sep 2020 18:13:20 -0600 +Subject: [PATCH 32/45] Support WDAT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump3.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump3.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump3.c ++++ acpica-unix2-20210604/source/common/dmtbdump3.c +@@ -675,11 +675,12 @@ AcpiDmDumpWdat ( + ACPI_STATUS Status; + UINT32 Offset = sizeof (ACPI_TABLE_WDAT); + ACPI_WDAT_ENTRY *Subtable; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoWdat); + if (ACPI_FAILURE (Status)) + { + return; +@@ -688,12 +689,12 @@ AcpiDmDumpWdat ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0); + if (ACPI_FAILURE (Status)) + { diff --git a/SOURCES/0033-Support-TCPA-in-a-big-endian-world.patch b/SOURCES/0033-Support-TCPA-in-a-big-endian-world.patch new file mode 100644 index 0000000..21e8818 --- /dev/null +++ b/SOURCES/0033-Support-TCPA-in-a-big-endian-world.patch @@ -0,0 +1,76 @@ +From b69b833f5a9205080b27d83379a31fad7fca1575 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Sun, 27 Sep 2020 12:09:28 -0600 +Subject: [PATCH 33/45] Support TCPA in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump3.c | 13 ++++++++----- + source/compiler/dttable2.c | 4 +++- + 2 files changed, 11 insertions(+), 6 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump3.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump3.c ++++ acpica-unix2-20210604/source/common/dmtbdump3.c +@@ -401,11 +401,13 @@ AcpiDmDumpTcpa ( + ACPI_TABLE_TCPA_HDR *Subtable = ACPI_ADD_PTR ( + ACPI_TABLE_TCPA_HDR, Table, Offset); + ACPI_STATUS Status; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); ++ UINT16 PlatformClass; + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, ++ Status = AcpiDmDumpTable (TableLength, 0, Table, + 0, AcpiDmTableInfoTcpaHdr); + if (ACPI_FAILURE (Status)) + { +@@ -416,18 +418,19 @@ AcpiDmDumpTcpa ( + * Examine the PlatformClass field to determine the table type. + * Either a client or server table. Only one. + */ +- switch (CommonHeader->PlatformClass) ++ PlatformClass = AcpiUtReadUint16 (&CommonHeader->PlatformClass); ++ switch (PlatformClass) + { + case ACPI_TCPA_CLIENT_TABLE: + +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + Table->Length - Offset, AcpiDmTableInfoTcpaClient); + break; + + case ACPI_TCPA_SERVER_TABLE: + +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, +- Table->Length - Offset, AcpiDmTableInfoTcpaServer); ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, ++ TableLength - Offset, AcpiDmTableInfoTcpaServer); + break; + + default: +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -2139,6 +2139,7 @@ DtCompileTcpa ( + ACPI_TABLE_TCPA_HDR *TcpaHeader; + DT_SUBTABLE *ParentTable; + ACPI_STATUS Status; ++ UINT16 PlatformClass; + + + /* Compile the main table */ +@@ -2159,7 +2160,8 @@ DtCompileTcpa ( + */ + TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer); + +- switch (TcpaHeader->PlatformClass) ++ PlatformClass = AcpiUtReadUint16 (&TcpaHeader->PlatformClass); ++ switch (PlatformClass) + { + case ACPI_TCPA_CLIENT_TABLE: + diff --git a/SOURCES/0034-Support-STAO-in-a-big-endian-world.patch b/SOURCES/0034-Support-STAO-in-a-big-endian-world.patch new file mode 100644 index 0000000..e338c5f --- /dev/null +++ b/SOURCES/0034-Support-STAO-in-a-big-endian-world.patch @@ -0,0 +1,40 @@ +From c313a76ce818135f02ab158a9f0c8e4b8e96698a Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Mon, 28 Sep 2020 11:49:42 -0600 +Subject: [PATCH 34/45] Support STAO in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump3.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump3.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump3.c ++++ acpica-unix2-20210604/source/common/dmtbdump3.c +@@ -285,14 +285,14 @@ AcpiDmDumpStao ( + { + ACPI_STATUS Status; + char *Namepath; +- UINT32 Length = Table->Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT32 StringLength; + UINT32 Offset = sizeof (ACPI_TABLE_STAO); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoStao); + if (ACPI_FAILURE (Status)) + { + return; +@@ -300,7 +300,7 @@ AcpiDmDumpStao ( + + /* The rest of the table consists of Namepath strings */ + +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + Namepath = ACPI_ADD_PTR (char, Table, Offset); + StringLength = strlen (Namepath) + 1; diff --git a/SOURCES/0035-Support-SLIC-and-MSDM-in-a-big-endian-world.patch b/SOURCES/0035-Support-SLIC-and-MSDM-in-a-big-endian-world.patch new file mode 100644 index 0000000..3f8fa6d --- /dev/null +++ b/SOURCES/0035-Support-SLIC-and-MSDM-in-a-big-endian-world.patch @@ -0,0 +1,33 @@ +From 948bebd1a0999bc3481641d3fc996c49432709c6 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Mon, 28 Sep 2020 12:49:23 -0600 +Subject: [PATCH 35/45] Support SLIC and MSDM in a big-endian world + +When dumping the SLIC table, it was also found that the code was +not starting at the proper offset on disassembly. Set the offset +to the first byte after the header instead of the very beginning +of the table. + +Signed-off-by: Al Stone +--- + source/common/dmtbdump3.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump3.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump3.c ++++ acpica-unix2-20210604/source/common/dmtbdump3.c +@@ -68,9 +68,11 @@ void + AcpiDmDumpSlic ( + ACPI_TABLE_HEADER *Table) + { ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + +- (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table, +- Table->Length - sizeof (*Table), AcpiDmTableInfoSlic); ++ (void) AcpiDmDumpTable (TableLength, sizeof (ACPI_TABLE_HEADER), ++ (void *) (Table + sizeof (*Table)), ++ TableLength - sizeof (*Table), AcpiDmTableInfoSlic); + } + + diff --git a/SOURCES/0036-Support-MCFG-in-a-big-endian-world.patch b/SOURCES/0036-Support-MCFG-in-a-big-endian-world.patch new file mode 100644 index 0000000..c5a30da --- /dev/null +++ b/SOURCES/0036-Support-MCFG-in-a-big-endian-world.patch @@ -0,0 +1,50 @@ +From 0fb79a24fb70ab1e1e4879220af82a9fa00af586 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Mon, 28 Sep 2020 13:01:18 -0600 +Subject: [PATCH 36/45] Support MCFG in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -930,11 +930,12 @@ AcpiDmDumpMcfg ( + ACPI_STATUS Status; + UINT32 Offset = sizeof (ACPI_TABLE_MCFG); + ACPI_MCFG_ALLOCATION *Subtable; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoMcfg); + if (ACPI_FAILURE (Status)) + { + return; +@@ -943,17 +944,17 @@ AcpiDmDumpMcfg ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { +- if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) ++ if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > TableLength) + { + AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n", +- (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length)); ++ (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - TableLength)); + return; + } + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); + if (ACPI_FAILURE (Status)) + { diff --git a/SOURCES/0037-Support-LPIT-in-a-big-endian-world.patch b/SOURCES/0037-Support-LPIT-in-a-big-endian-world.patch new file mode 100644 index 0000000..e5e83d3 --- /dev/null +++ b/SOURCES/0037-Support-LPIT-in-a-big-endian-world.patch @@ -0,0 +1,46 @@ +From d10bfd67b5352ff5587e06fc1f82b896bab49614 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Mon, 28 Sep 2020 16:49:30 -0600 +Subject: [PATCH 37/45] Support LPIT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -690,7 +690,7 @@ AcpiDmDumpLpit ( + { + ACPI_STATUS Status; + ACPI_LPIT_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_LPIT); + ACPI_DMTABLE_INFO *InfoTable; + UINT32 SubtableLength; +@@ -699,11 +699,11 @@ AcpiDmDumpLpit ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* Common subtable header */ + +- Status = AcpiDmDumpTable (Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr); + if (ACPI_FAILURE (Status)) + { +@@ -727,7 +727,7 @@ AcpiDmDumpLpit ( + return; + } + +- Status = AcpiDmDumpTable (Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, + SubtableLength, InfoTable); + if (ACPI_FAILURE (Status)) + { diff --git a/SOURCES/0038-Support-PMTT-in-a-big-endian-world.patch b/SOURCES/0038-Support-PMTT-in-a-big-endian-world.patch new file mode 100644 index 0000000..4c6338c --- /dev/null +++ b/SOURCES/0038-Support-PMTT-in-a-big-endian-world.patch @@ -0,0 +1,85 @@ +From bd19995fa268ed3e93c071162d0e9c2d35ada0d4 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 29 Jun 2021 16:23:30 -0600 +Subject: [PATCH 38/45] Support PMTT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -1686,8 +1686,9 @@ AcpiDmDumpPmtt ( + { + ACPI_STATUS Status; + ACPI_PMTT_HEADER *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 Length = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_PMTT); ++ UINT16 SubtableLength; + + + /* Main table */ +@@ -1701,17 +1702,18 @@ AcpiDmDumpPmtt ( + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); +- while (Offset < Table->Length) ++ while (Offset < Length) + { + /* Each of the types below contain the common subtable header */ + + AcpiOsPrintf ("\n"); ++ SubtableLength = AcpiUtReadUint16 (&Subtable->Length); + switch (Subtable->Type) + { + case ACPI_PMTT_TYPE_SOCKET: + + Status = AcpiDmDumpTable (Length, Offset, Subtable, +- Subtable->Length, AcpiDmTableInfoPmtt0); ++ SubtableLength, AcpiDmTableInfoPmtt0); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1720,7 +1722,7 @@ AcpiDmDumpPmtt ( + + case ACPI_PMTT_TYPE_CONTROLLER: + Status = AcpiDmDumpTable (Length, Offset, Subtable, +- Subtable->Length, AcpiDmTableInfoPmtt1); ++ SubtableLength, AcpiDmTableInfoPmtt1); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1729,7 +1731,7 @@ AcpiDmDumpPmtt ( + + case ACPI_PMTT_TYPE_DIMM: + Status = AcpiDmDumpTable (Length, Offset, Subtable, +- Subtable->Length, AcpiDmTableInfoPmtt2); ++ SubtableLength, AcpiDmTableInfoPmtt2); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1738,7 +1740,7 @@ AcpiDmDumpPmtt ( + + case ACPI_PMTT_TYPE_VENDOR: + Status = AcpiDmDumpTable (Length, Offset, Subtable, +- Subtable->Length, AcpiDmTableInfoPmttVendor); ++ SubtableLength, AcpiDmTableInfoPmttVendor); + if (ACPI_FAILURE (Status)) + { + return; +@@ -1754,9 +1756,9 @@ AcpiDmDumpPmtt ( + + /* Point to next subtable */ + +- Offset += Subtable->Length; ++ Offset += SubtableLength; + Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, +- Subtable, Subtable->Length); ++ Subtable, SubtableLength); + } + } + diff --git a/SOURCES/0039-Support-TPM2-in-a-big-endian-world.patch b/SOURCES/0039-Support-TPM2-in-a-big-endian-world.patch new file mode 100644 index 0000000..08e3522 --- /dev/null +++ b/SOURCES/0039-Support-TPM2-in-a-big-endian-world.patch @@ -0,0 +1,119 @@ +From c240ab3af6a4ad4405def7188e3d64da06a69f37 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 30 Sep 2020 18:42:38 -0600 +Subject: [PATCH 39/45] Support TPM2 in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump3.c | 18 ++++++++++-------- + source/compiler/dttable2.c | 8 +++++--- + 2 files changed, 15 insertions(+), 11 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump3.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump3.c ++++ acpica-unix2-20210604/source/common/dmtbdump3.c +@@ -470,11 +470,12 @@ AcpiDmDumpTpm2Rev3 ( + ACPI_TABLE_TPM23 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM23, Table); + ACPI_TPM23_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM23_TRAILER, Table, Offset); + ACPI_STATUS Status; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm23); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoTpm23); + if (ACPI_FAILURE (Status)) + { + return; +@@ -486,8 +487,8 @@ AcpiDmDumpTpm2Rev3 ( + { + case ACPI_TPM23_ACPI_START_METHOD: + +- (void) AcpiDmDumpTable (Table->Length, Offset, Subtable, +- Table->Length - Offset, AcpiDmTableInfoTpm23a); ++ (void) AcpiDmDumpTable (TableLength, Offset, Subtable, ++ TableLength - Offset, AcpiDmTableInfoTpm23a); + break; + + default: +@@ -517,6 +518,7 @@ AcpiDmDumpTpm2 ( + ACPI_TPM2_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM2_TRAILER, Table, Offset); + ACPI_TPM2_ARM_SMC *ArmSubtable; + ACPI_STATUS Status; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + if (Table->Revision == 3) +@@ -527,7 +529,7 @@ AcpiDmDumpTpm2 ( + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoTpm2); + + if (ACPI_FAILURE (Status)) + { +@@ -535,8 +537,8 @@ AcpiDmDumpTpm2 ( + } + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, +- Table->Length - Offset, AcpiDmTableInfoTpm2a); ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, ++ TableLength - Offset, AcpiDmTableInfoTpm2a); + if (ACPI_FAILURE (Status)) + { + return; +@@ -551,8 +553,8 @@ AcpiDmDumpTpm2 ( + Offset += sizeof (ACPI_TPM2_TRAILER); + + AcpiOsPrintf ("\n"); +- (void) AcpiDmDumpTable (Table->Length, Offset, ArmSubtable, +- Table->Length - Offset, AcpiDmTableInfoTpm211); ++ (void) AcpiDmDumpTable (TableLength, Offset, ArmSubtable, ++ TableLength - Offset, AcpiDmTableInfoTpm211); + break; + + default: +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -2267,6 +2267,7 @@ DtCompileTpm2 ( + DT_SUBTABLE *ParentTable; + ACPI_STATUS Status = AE_OK; + ACPI_TABLE_HEADER *Header; ++ UINT8 StartMethod; + + + ParentTable = DtPeekSubtable (); +@@ -2310,7 +2311,8 @@ DtCompileTpm2 ( + + /* Subtable type depends on the StartMethod */ + +- switch (Tpm2Header->StartMethod) ++ StartMethod = *(UINT8 *) &Tpm2Header->StartMethod; ++ switch (StartMethod) + { + case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC: + +@@ -2341,7 +2343,7 @@ DtCompileTpm2 ( + case ACPI_TPM2_RESERVED10: + + AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n", +- Tpm2Header->StartMethod); ++ StartMethod); + Status = AE_ERROR; + break; + +@@ -2349,7 +2351,7 @@ DtCompileTpm2 ( + default: + + AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n", +- Tpm2Header->StartMethod); ++ StartMethod); + Status = AE_ERROR; + break; + } diff --git a/SOURCES/0040-Support-S3PT-in-a-big-endian-world.patch b/SOURCES/0040-Support-S3PT-in-a-big-endian-world.patch new file mode 100644 index 0000000..07e0a24 --- /dev/null +++ b/SOURCES/0040-Support-S3PT-in-a-big-endian-world.patch @@ -0,0 +1,96 @@ +From 9fc0e46189feb926b13713422ea2722e273a31b5 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Mon, 19 Oct 2020 17:30:30 -0400 +Subject: [PATCH 40/45] Support S3PT in a big-endian world + +--- + source/common/dmtbdump2.c | 15 +++++++++------ + source/compiler/dttable2.c | 4 +++- + 2 files changed, 12 insertions(+), 7 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -2039,6 +2039,8 @@ AcpiDmDumpS3pt ( + ACPI_FPDT_HEADER *Subtable; + ACPI_DMTABLE_INFO *InfoTable; + ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); ++ UINT32 S3ptTableLength = AcpiUtReadUint32 (&S3ptTable->Length); ++ UINT16 SubtableType; + + + /* Main table */ +@@ -2050,19 +2052,20 @@ AcpiDmDumpS3pt ( + } + + Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset); +- while (Offset < S3ptTable->Length) ++ while (Offset < S3ptTableLength) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (S3ptTableLength, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoS3ptHdr); + if (ACPI_FAILURE (Status)) + { + return 0; + } + +- switch (Subtable->Type) ++ SubtableType = AcpiUtReadUint16 (&Subtable->Type); ++ switch (SubtableType) + { + case ACPI_S3PT_TYPE_RESUME: + +@@ -2077,7 +2080,7 @@ AcpiDmDumpS3pt ( + default: + + AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", +- Subtable->Type); ++ SubtableType); + + /* Attempt to continue */ + +@@ -2090,7 +2093,7 @@ AcpiDmDumpS3pt ( + } + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable, ++ Status = AcpiDmDumpTable (S3ptTableLength, Offset, Subtable, + Subtable->Length, InfoTable); + if (ACPI_FAILURE (Status)) + { +@@ -2104,7 +2107,7 @@ NextSubtable: + Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length); + } + +- return (S3ptTable->Length); ++ return (S3ptTableLength); + } + + +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -1406,6 +1406,7 @@ DtCompileS3pt ( + DT_SUBTABLE *ParentTable; + ACPI_DMTABLE_INFO *InfoTable; + DT_FIELD *SubtableStart; ++ UINT16 S3ptHeaderType; + + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt, +@@ -1433,7 +1434,8 @@ DtCompileS3pt ( + + S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); + +- switch (S3ptHeader->Type) ++ S3ptHeaderType = AcpiUtReadUint16 (&S3ptHeader->Type); ++ switch (S3ptHeaderType) + { + case ACPI_S3PT_TYPE_RESUME: + diff --git a/SOURCES/0041-Support-IORT-in-a-big-endian-world.patch b/SOURCES/0041-Support-IORT-in-a-big-endian-world.patch new file mode 100644 index 0000000..ccc6e77 --- /dev/null +++ b/SOURCES/0041-Support-IORT-in-a-big-endian-world.patch @@ -0,0 +1,414 @@ +From 5bd43bca1708a56d32e63da0278e04caf2865927 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 29 Jun 2021 17:38:20 -0600 +Subject: [PATCH 41/45] Support IORT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 85 ++++++++++++++++++++++---------------- + source/compiler/dttable1.c | 40 ++++++++++-------- + 2 files changed, 72 insertions(+), 53 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -77,17 +77,20 @@ AcpiDmDumpIort ( + ACPI_IORT_RMR *IortRmr = NULL; + UINT32 Offset; + UINT32 NodeOffset; ++ UINT32 NodeLength; + UINT32 Length; + ACPI_DMTABLE_INFO *InfoTable; + char *String; + UINT32 i; + UINT32 MappingByteLength; + UINT8 Revision; ++ UINT32 MappingCount; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoIort); + if (ACPI_FAILURE (Status)) + { + return; +@@ -109,18 +112,19 @@ AcpiDmDumpIort ( + + /* Dump the OptionalPadding (optional) */ + +- if (Iort->NodeOffset > Offset) ++ NodeOffset = AcpiUtReadUint32 (&Iort->NodeOffset); ++ if (NodeOffset > Offset) + { +- Status = AcpiDmDumpTable (Table->Length, Offset, Table, +- Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad); ++ Status = AcpiDmDumpTable (TableLength, Offset, Table, ++ NodeOffset - Offset, AcpiDmTableInfoIortPad); + if (ACPI_FAILURE (Status)) + { + return; + } + } + +- Offset = Iort->NodeOffset; +- while (Offset < Table->Length) ++ Offset = AcpiUtReadUint32 (&Iort->NodeOffset); ++ while (Offset < TableLength) + { + /* Common subtable header */ + +@@ -130,12 +134,12 @@ AcpiDmDumpIort ( + + if (Revision == 0) + { +- Status = AcpiDmDumpTable (Table->Length, Offset, ++ Status = AcpiDmDumpTable (TableLength, Offset, + IortNode, Length, AcpiDmTableInfoIortHdr); + } + else if (Revision >= 3) + { +- Status = AcpiDmDumpTable (Table->Length, Offset, ++ Status = AcpiDmDumpTable (TableLength, Offset, + IortNode, Length, AcpiDmTableInfoIortHdr3); + } + +@@ -166,7 +170,7 @@ AcpiDmDumpIort ( + case ACPI_IORT_NODE_PCI_ROOT_COMPLEX: + + InfoTable = AcpiDmTableInfoIort2; +- Length = IortNode->Length - NodeOffset; ++ Length = AcpiUtReadUint16 (&IortNode->Length) - NodeOffset; + break; + + case ACPI_IORT_NODE_SMMU: +@@ -179,19 +183,19 @@ AcpiDmDumpIort ( + case ACPI_IORT_NODE_SMMU_V3: + + InfoTable = AcpiDmTableInfoIort4; +- Length = IortNode->Length - NodeOffset; ++ Length = AcpiUtReadUint16 (&IortNode->Length) - NodeOffset; + break; + + case ACPI_IORT_NODE_PMCG: + + InfoTable = AcpiDmTableInfoIort5; +- Length = IortNode->Length - NodeOffset; ++ Length = AcpiUtReadUint16 (&IortNode->Length) - NodeOffset; + break; + + case ACPI_IORT_NODE_RMR: + + InfoTable = AcpiDmTableInfoIort6; +- Length = IortNode->Length - NodeOffset; ++ Length = AcpiUtReadUint16 (&IortNode->Length) - NodeOffset; + IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset); + break; + +@@ -202,7 +206,7 @@ AcpiDmDumpIort ( + + /* Attempt to continue */ + +- if (!IortNode->Length) ++ if (!AcpiUtReadUint16 (&IortNode->Length)) + { + AcpiOsPrintf ("Invalid zero length IORT node\n"); + return; +@@ -213,7 +217,7 @@ AcpiDmDumpIort ( + /* Dump the node subtable header */ + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, + ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), + Length, InfoTable); + if (ACPI_FAILURE (Status)) +@@ -233,9 +237,10 @@ AcpiDmDumpIort ( + + if (IortItsGroup) + { +- for (i = 0; i < IortItsGroup->ItsCount; i++) ++ UINT32 ItsCount = AcpiUtReadUint32 (&IortItsGroup->ItsCount); ++ for (i = 0; i < ItsCount; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, + ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), + 4, AcpiDmTableInfoIort0a); + if (ACPI_FAILURE (Status)) +@@ -252,12 +257,14 @@ AcpiDmDumpIort ( + + /* Dump the Padding (optional) */ + +- if (IortNode->Length > NodeOffset) ++ NodeLength = AcpiUtReadUint16 (&IortNode->Length); ++ if (NodeLength > NodeOffset) + { + MappingByteLength = +- IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING); +- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, +- Table, IortNode->Length - NodeOffset - MappingByteLength, ++ AcpiUtReadUint32 (&IortNode->MappingCount) * ++ sizeof (ACPI_IORT_ID_MAPPING); ++ Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, ++ Table, NodeLength - NodeOffset - MappingByteLength, + AcpiDmTableInfoIort1a); + if (ACPI_FAILURE (Status)) + { +@@ -274,9 +281,11 @@ AcpiDmDumpIort ( + + if (IortSmmu) + { ++ UINT32 InterruptCount; ++ + Length = 2 * sizeof (UINT64); +- NodeOffset = IortSmmu->GlobalInterruptOffset; +- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, ++ NodeOffset = AcpiUtReadUint32 (&IortSmmu->GlobalInterruptOffset); ++ Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, + ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), + Length, AcpiDmTableInfoIort3a); + if (ACPI_FAILURE (Status)) +@@ -284,10 +293,11 @@ AcpiDmDumpIort ( + return; + } + +- NodeOffset = IortSmmu->ContextInterruptOffset; +- for (i = 0; i < IortSmmu->ContextInterruptCount; i++) ++ NodeOffset = AcpiUtReadUint32 (&IortSmmu->ContextInterruptOffset); ++ InterruptCount = AcpiUtReadUint32 (&IortSmmu->ContextInterruptCount); ++ for (i = 0; i < InterruptCount; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, + ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), + 8, AcpiDmTableInfoIort3b); + if (ACPI_FAILURE (Status)) +@@ -298,10 +308,11 @@ AcpiDmDumpIort ( + NodeOffset += 8; + } + +- NodeOffset = IortSmmu->PmuInterruptOffset; +- for (i = 0; i < IortSmmu->PmuInterruptCount; i++) ++ NodeOffset = AcpiUtReadUint32 (&IortSmmu->PmuInterruptOffset); ++ InterruptCount = AcpiUtReadUint32 (&IortSmmu->PmuInterruptCount); ++ for (i = 0; i < InterruptCount; i++) + { +- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, + ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), + 8, AcpiDmTableInfoIort3c); + if (ACPI_FAILURE (Status)) +@@ -319,12 +330,15 @@ AcpiDmDumpIort ( + /* Validate IortRmr to avoid compiler warnings */ + if (IortRmr) + { +- NodeOffset = IortRmr->RmrOffset; ++ UINT32 RmrCount; ++ ++ NodeOffset = AcpiUtReadUint32 (&IortRmr->RmrOffset); ++ RmrCount = AcpiUtReadUint32 (&IortRmr->RmrCount); + Length = sizeof (ACPI_IORT_RMR_DESC); +- for (i = 0; i < IortRmr->RmrCount; i++) ++ for (i = 0; i < RmrCount; i++) + { + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, + ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), + Length, AcpiDmTableInfoIort6a); + if (ACPI_FAILURE (Status)) +@@ -344,12 +358,13 @@ AcpiDmDumpIort ( + + /* Dump the ID mappings */ + +- NodeOffset = IortNode->MappingOffset; +- for (i = 0; i < IortNode->MappingCount; i++) ++ NodeOffset = AcpiUtReadUint32 (&IortNode->MappingOffset); ++ MappingCount = AcpiUtReadUint32 (&IortNode->MappingCount); ++ for (i = 0; i < MappingCount; i++) + { + AcpiOsPrintf ("\n"); + Length = sizeof (ACPI_IORT_ID_MAPPING); +- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, ++ Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, + ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), + Length, AcpiDmTableInfoIortMap); + if (ACPI_FAILURE (Status)) +@@ -363,7 +378,7 @@ AcpiDmDumpIort ( + NextSubtable: + /* Point to next node subtable */ + +- Offset += IortNode->Length; ++ Offset += AcpiUtReadUint16 (&IortNode->Length); + } + } + +Index: acpica-unix2-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -1592,6 +1592,7 @@ DtCompileIort ( + ACPI_IORT_ITS_GROUP *IortItsGroup; + ACPI_IORT_SMMU *IortSmmu; + ACPI_IORT_RMR *IortRmr; ++ UINT32 IortNodeOffset; + UINT32 NodeNumber; + UINT32 NodeLength; + UINT32 IdMappingNumber; +@@ -1637,7 +1638,7 @@ DtCompileIort ( + * Optionally allows the generic data types to be used for filling + * this field. + */ +- Iort->NodeOffset = sizeof (ACPI_TABLE_IORT); ++ IortNodeOffset = sizeof (ACPI_TABLE_IORT); + Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad, + &Subtable); + if (ACPI_FAILURE (Status)) +@@ -1647,7 +1648,7 @@ DtCompileIort ( + if (Subtable) + { + DtInsertSubtable (ParentTable, Subtable); +- Iort->NodeOffset += Subtable->Length; ++ IortNodeOffset += Subtable->Length; + } + else + { +@@ -1657,7 +1658,7 @@ DtCompileIort ( + { + return (Status); + } +- Iort->NodeOffset += PaddingLength; ++ IortNodeOffset += PaddingLength; + } + + NodeNumber = 0; +@@ -1721,7 +1722,7 @@ DtCompileIort ( + ItsNumber++; + } + +- IortItsGroup->ItsCount = ItsNumber; ++ IortItsGroup->ItsCount = AcpiUtReadUint32 (&ItsNumber); + break; + + case ACPI_IORT_NODE_NAMED_COMPONENT: +@@ -1755,15 +1756,18 @@ DtCompileIort ( + } + else + { +- if (NodeLength > IortNode->MappingOffset) ++ UINT32 MappingOffset; ++ ++ MappingOffset = IortNode->MappingOffset; ++ if (NodeLength > MappingOffset) + { + return (AE_BAD_DATA); + } + +- if (NodeLength < IortNode->MappingOffset) ++ if (NodeLength < MappingOffset) + { + Status = DtCompilePadding ( +- IortNode->MappingOffset - NodeLength, ++ MappingOffset - NodeLength, + &Subtable); + if (ACPI_FAILURE (Status)) + { +@@ -1771,7 +1775,7 @@ DtCompileIort ( + } + + DtInsertSubtable (ParentTable, Subtable); +- NodeLength = IortNode->MappingOffset; ++ NodeLength = MappingOffset; + } + } + break; +@@ -1804,7 +1808,7 @@ DtCompileIort ( + + /* Compile global interrupt array */ + +- IortSmmu->GlobalInterruptOffset = NodeLength; ++ IortSmmu->GlobalInterruptOffset = AcpiUtReadUint32 (&NodeLength); + Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a, + &Subtable); + if (ACPI_FAILURE (Status)) +@@ -1818,7 +1822,7 @@ DtCompileIort ( + /* Compile context interrupt array */ + + ContextIrptNumber = 0; +- IortSmmu->ContextInterruptOffset = NodeLength; ++ IortSmmu->ContextInterruptOffset = AcpiUtReadUint32 (&NodeLength); + while (*PFieldList) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b, +@@ -1838,12 +1842,12 @@ DtCompileIort ( + ContextIrptNumber++; + } + +- IortSmmu->ContextInterruptCount = ContextIrptNumber; ++ IortSmmu->ContextInterruptCount = AcpiUtReadUint32 (&ContextIrptNumber); + + /* Compile PMU interrupt array */ + + PmuIrptNumber = 0; +- IortSmmu->PmuInterruptOffset = NodeLength; ++ IortSmmu->PmuInterruptOffset = AcpiUtReadUint32 (&NodeLength); + while (*PFieldList) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c, +@@ -1863,7 +1867,7 @@ DtCompileIort ( + PmuIrptNumber++; + } + +- IortSmmu->PmuInterruptCount = PmuIrptNumber; ++ IortSmmu->PmuInterruptCount = AcpiUtReadUint32 (&PmuIrptNumber); + break; + + case ACPI_IORT_NODE_SMMU_V3: +@@ -1908,7 +1912,7 @@ DtCompileIort ( + /* Compile RMR Descriptors */ + + RmrCount = 0; +- IortRmr->RmrOffset = NodeLength; ++ IortRmr->RmrOffset = AcpiUtReadUint32 (&NodeLength); + while (*PFieldList) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a, +@@ -1928,7 +1932,7 @@ DtCompileIort ( + RmrCount++; + } + +- IortRmr->RmrCount = RmrCount; ++ IortRmr->RmrCount = AcpiUtReadUint32 (&RmrCount); + break; + + default: +@@ -1939,7 +1943,7 @@ DtCompileIort ( + + /* Compile Array of ID mappings */ + +- IortNode->MappingOffset = NodeLength; ++ IortNode->MappingOffset = AcpiUtReadUint32 (&NodeLength); + IdMappingNumber = 0; + while (*PFieldList) + { +@@ -1960,7 +1964,7 @@ DtCompileIort ( + IdMappingNumber++; + } + +- IortNode->MappingCount = IdMappingNumber; ++ IortNode->MappingCount = AcpiUtReadUint32 (&IdMappingNumber); + if (!IdMappingNumber) + { + IortNode->MappingOffset = 0; +@@ -1975,7 +1979,7 @@ DtCompileIort ( + NodeNumber++; + } + +- Iort->NodeCount = NodeNumber; ++ Iort->NodeCount = AcpiUtReadUint32 (&NodeNumber); + return (AE_OK); + } + diff --git a/SOURCES/0042-Support-IVRS-in-a-big-endian-world.patch b/SOURCES/0042-Support-IVRS-in-a-big-endian-world.patch new file mode 100644 index 0000000..6d8bab7 --- /dev/null +++ b/SOURCES/0042-Support-IVRS-in-a-big-endian-world.patch @@ -0,0 +1,138 @@ +From b64cff82b2b33ed659826d777d2db039f64fd198 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 29 Jun 2021 17:45:24 -0600 +Subject: [PATCH 42/45] Support IVRS in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 34 +++++++++++++++++++--------------- + 1 file changed, 19 insertions(+), 15 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -419,11 +419,14 @@ AcpiDmDumpIvrs ( + ACPI_IVRS_DE_HEADER *DeviceEntry; + ACPI_IVRS_HEADER *Subtable; + ACPI_DMTABLE_INFO *InfoTable; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); ++ UINT16 SubtableLength; ++ + + + /* Main table */ + +- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoIvrs); + if (ACPI_FAILURE (Status)) + { + return; +@@ -433,8 +436,9 @@ AcpiDmDumpIvrs ( + + Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); + +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { ++ SubtableLength = AcpiUtReadUint16 (&Subtable->Length); + switch (Subtable->Type) + { + /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */ +@@ -471,7 +475,7 @@ AcpiDmDumpIvrs ( + + /* Attempt to continue */ + +- if (!Subtable->Length) ++ if (!SubtableLength) + { + AcpiOsPrintf ("Invalid zero length subtable\n"); + return; +@@ -481,8 +485,8 @@ AcpiDmDumpIvrs ( + + /* Dump the subtable */ + +- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, +- Subtable->Length, InfoTable); ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, ++ SubtableLength, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; +@@ -511,7 +515,7 @@ AcpiDmDumpIvrs ( + + /* Process all of the Device Entries */ + +- while (EntryOffset < (Offset + Subtable->Length)) ++ while (EntryOffset < (Offset + SubtableLength)) + { + AcpiOsPrintf ("\n"); + +@@ -581,7 +585,7 @@ AcpiDmDumpIvrs ( + + /* Dump the Device Entry */ + +- Status = AcpiDmDumpTable (Table->Length, EntryOffset, ++ Status = AcpiDmDumpTable (TableLength, EntryOffset, + DeviceEntry, EntryLength, InfoTable); + if (ACPI_FAILURE (Status)) + { +@@ -605,12 +609,12 @@ AcpiDmDumpIvrs ( + */ + if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiHid)) + { +- Status = AcpiDmDumpTable (Table->Length, EntryOffset, ++ Status = AcpiDmDumpTable (TableLength, EntryOffset, + &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidInteger); + } + else + { +- Status = AcpiDmDumpTable (Table->Length, EntryOffset, ++ Status = AcpiDmDumpTable (TableLength, EntryOffset, + &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidString); + } + if (ACPI_FAILURE (Status)) +@@ -628,12 +632,12 @@ AcpiDmDumpIvrs ( + */ + if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiCid)) + { +- Status = AcpiDmDumpTable (Table->Length, EntryOffset, ++ Status = AcpiDmDumpTable (TableLength, EntryOffset, + &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidInteger); + } + else + { +- Status = AcpiDmDumpTable (Table->Length, EntryOffset, ++ Status = AcpiDmDumpTable (TableLength, EntryOffset, + &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidString); + } + if (ACPI_FAILURE (Status)) +@@ -650,7 +654,7 @@ AcpiDmDumpIvrs ( + + if (HidSubtable->UidType == ACPI_IVRS_UID_IS_STRING) + { +- Status = AcpiDmDumpTable (Table->Length, EntryOffset, ++ Status = AcpiDmDumpTable (TableLength, EntryOffset, + &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidString); + if (ACPI_FAILURE (Status)) + { +@@ -659,7 +663,7 @@ AcpiDmDumpIvrs ( + } + else /* ACPI_IVRS_UID_IS_INTEGER */ + { +- Status = AcpiDmDumpTable (Table->Length, EntryOffset, ++ Status = AcpiDmDumpTable (TableLength, EntryOffset, + &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidInteger); + if (ACPI_FAILURE (Status)) + { +@@ -678,8 +682,8 @@ AcpiDmDumpIvrs ( + NextSubtable: + /* Point to next subtable */ + +- Offset += Subtable->Length; +- Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length); ++ Offset += SubtableLength; ++ Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, SubtableLength); + } + } + diff --git a/SOURCES/0043-Support-DSDT-SSDT-in-a-big-endian-world.patch b/SOURCES/0043-Support-DSDT-SSDT-in-a-big-endian-world.patch new file mode 100644 index 0000000..60a1e72 --- /dev/null +++ b/SOURCES/0043-Support-DSDT-SSDT-in-a-big-endian-world.patch @@ -0,0 +1,3169 @@ +From 14d220a34462e61fe69141c86f4c3cd2ae68c279 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Wed, 30 Sep 2020 18:59:57 -0600 +Subject: [PATCH 43/45] Support DSDT/SSDT in a big-endian world. + +NB: this is a very large diff. The problem is that ResourceTemplates +are treated differently during compilation and disassembly so each of +the resource types had code that needed to be touched directly. + +In general, however, just reading or writing individual AML opcodes +wasn't that much of a change, and most of it was on the codegen side. + +Signed-off-by: Al Stone +--- + source/common/adwalk.c | 3 +- + source/common/dmrestag.c | 2 +- + source/common/dmtables.c | 17 +- + source/common/dmtbdump.c | 3 +- + source/common/dmtbdump3.c | 8 +- + source/compiler/aslcodegen.c | 59 ++++-- + source/compiler/aslopcodes.c | 3 +- + source/compiler/aslrestype1.c | 60 ++++-- + source/compiler/aslrestype1i.c | 35 ++-- + source/compiler/aslrestype2.c | 20 +- + source/compiler/aslrestype2d.c | 99 ++++++---- + source/compiler/aslrestype2e.c | 90 ++++++--- + source/compiler/aslrestype2q.c | 81 +++++--- + source/compiler/aslrestype2s.c | 214 +++++++++++++++++---- + source/compiler/aslrestype2w.c | 94 +++++---- + source/compiler/dttable2.c | 3 +- + source/components/disassembler/dmbuffer.c | 37 +++- + source/components/disassembler/dmopcode.c | 21 +- + source/components/disassembler/dmresrc.c | 2 +- + source/components/disassembler/dmresrcl.c | 43 +++-- + source/components/disassembler/dmresrcl2.c | 128 +++++++----- + source/components/disassembler/dmresrcs.c | 18 +- + source/components/disassembler/dmwalk.c | 2 +- + source/components/namespace/nsaccess.c | 2 +- + source/components/namespace/nsnames.c | 4 +- + source/components/namespace/nsparse.c | 6 +- + source/components/namespace/nsutils.c | 7 +- + source/components/utilities/utresrc.c | 2 +- + 28 files changed, 721 insertions(+), 341 deletions(-) + +Index: acpica-unix2-20210604/source/common/adwalk.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/adwalk.c ++++ acpica-unix2-20210604/source/common/adwalk.c +@@ -679,7 +679,8 @@ AcpiDmLoadDescendingOp ( + + if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) + { +- *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name; ++ AcpiUtWriteUint (FieldPath, ACPI_NAMESEG_SIZE, ++ &Op->Named.Name, ACPI_NAMESEG_SIZE); + FieldPath[4] = 0; + Path = FieldPath; + } +Index: acpica-unix2-20210604/source/common/dmrestag.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmrestag.c ++++ acpica-unix2-20210604/source/common/dmrestag.c +@@ -1048,7 +1048,7 @@ AcpiDmAddResourcesToNamespace ( + * NextOp contains the Aml pointer and the Aml length + */ + AcpiUtWalkAmlResources (NULL, (UINT8 *) NextOp->Named.Data, +- (ACPI_SIZE) NextOp->Common.Value.Integer, ++ (ACPI_SIZE) NextOp->Common.Value.Size, + AcpiDmAddResourceToNamespace, (void **) BufferNode); + } + +Index: acpica-unix2-20210604/source/common/dmtables.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtables.c ++++ acpica-unix2-20210604/source/common/dmtables.c +@@ -142,6 +142,10 @@ AdCreateTableHeader ( + ACPI_TABLE_HEADER *Table) + { + UINT8 Checksum; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); ++ UINT32 OemRevision = AcpiUtReadUint32 (&Table->OemRevision); ++ UINT32 CompilerRevision = ++ AcpiUtReadUint32 (&Table->AslCompilerRevision); + + + /* Reset globals for External statements */ +@@ -156,7 +160,7 @@ AdCreateTableHeader ( + + AcpiOsPrintf (" * Original Table Header:\n"); + AcpiOsPrintf (" * Signature \"%4.4s\"\n", Table->Signature); +- AcpiOsPrintf (" * Length 0x%8.8X (%u)\n", Table->Length, Table->Length); ++ AcpiOsPrintf (" * Length 0x%8.8X (%u)\n", TableLength, TableLength); + + /* Print and validate the revision */ + +@@ -188,7 +192,7 @@ AdCreateTableHeader ( + + AcpiOsPrintf ("\n * Checksum 0x%2.2X", Table->Checksum); + +- Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length); ++ Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), TableLength); + if (Checksum) + { + AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X", +@@ -198,9 +202,9 @@ AdCreateTableHeader ( + AcpiOsPrintf ("\n"); + AcpiOsPrintf (" * OEM ID \"%.6s\"\n", Table->OemId); + AcpiOsPrintf (" * OEM Table ID \"%.8s\"\n", Table->OemTableId); +- AcpiOsPrintf (" * OEM Revision 0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision); ++ AcpiOsPrintf (" * OEM Revision 0x%8.8X (%u)\n", OemRevision, OemRevision); + AcpiOsPrintf (" * Compiler ID \"%.4s\"\n", Table->AslCompilerId); +- AcpiOsPrintf (" * Compiler Version 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision); ++ AcpiOsPrintf (" * Compiler Version 0x%8.8X (%u)\n", CompilerRevision, CompilerRevision); + AcpiOsPrintf (" */\n"); + + /* +@@ -221,7 +225,7 @@ AdCreateTableHeader ( + AcpiOsPrintf ( + "DefinitionBlock (\"\", \"%4.4s\", %u, \"%.6s\", \"%.8s\", 0x%8.8X)\n", + Table->Signature, Table->Revision, +- Table->OemId, Table->OemTableId, Table->OemRevision); ++ Table->OemId, Table->OemTableId, OemRevision); + } + + +@@ -396,7 +400,8 @@ AdParseTable ( + + fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature); + +- AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER); ++ AmlLength = AcpiUtReadUint32 (&Table->Length); ++ AmlLength -= sizeof (ACPI_TABLE_HEADER); + AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)); + + AcpiUtSetIntegerWidth (Table->Revision); +Index: acpica-unix2-20210604/source/common/dmtbdump.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump.c ++++ acpica-unix2-20210604/source/common/dmtbdump.c +@@ -338,8 +338,7 @@ AcpiDmDumpXsdt ( + for (i = 0; i < Entries; i++) + { + AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i); +- AcpiOsPrintf ("%8.8X%8.8X\n", +- ACPI_FORMAT_UINT64 (AcpiUtReadUint64 (&Array[i]))); ++ AcpiOsPrintf ("%16.16lX\n", AcpiUtReadUint64 (&Array[i])); + Offset += sizeof (UINT64); + } + } +Index: acpica-unix2-20210604/source/common/dmtbdump3.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump3.c ++++ acpica-unix2-20210604/source/common/dmtbdump3.c +@@ -736,13 +736,13 @@ AcpiDmDumpWpbt ( + { + ACPI_STATUS Status; + ACPI_TABLE_WPBT *Subtable; +- UINT32 Length = Table->Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT16 ArgumentsLength; + + + /* Dump the main table */ + +- Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt); ++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoWpbt); + if (ACPI_FAILURE (Status)) + { + return; +@@ -751,10 +751,10 @@ AcpiDmDumpWpbt ( + /* Extract the arguments buffer length from the main table */ + + Subtable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table); +- ArgumentsLength = Subtable->ArgumentsLength; ++ ArgumentsLength = AcpiUtReadUint16 (&Subtable->ArgumentsLength); + + /* Dump the arguments buffer */ + +- (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength, ++ (void) AcpiDmDumpTable (TableLength, 0, Table, ArgumentsLength, + AcpiDmTableInfoWpbt0); + } +Index: acpica-unix2-20210604/source/compiler/aslcodegen.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslcodegen.c ++++ acpica-unix2-20210604/source/compiler/aslcodegen.c +@@ -238,6 +238,10 @@ CgWriteAmlOpcode ( + { + UINT8 PkgLenFirstByte; + UINT32 i; ++ UINT8 Tmp8; ++ UINT16 Tmp16; ++ UINT32 Tmp32; ++ UINT64 Tmp64; + union { + UINT16 Opcode; + UINT8 OpcodeBytes[2]; +@@ -312,14 +316,15 @@ CgWriteAmlOpcode ( + + /* Check for two-byte opcode */ + ++ Tmp16 = AcpiUtReadUint16 (&Aml.Opcode); + if (Aml.Opcode > 0x00FF) + { + /* Write the high byte first */ + +- CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[1], 1); ++ CgLocalWriteAmlData (Op, ((UINT8 *) &Tmp16)+1, 1); + } + +- CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[0], 1); ++ CgLocalWriteAmlData (Op, (UINT8 *) &Tmp16, 1); + + /* Subtreelength doesn't include length of package length bytes */ + +@@ -335,7 +340,8 @@ CgWriteAmlOpcode ( + { + /* Simplest case -- no bytes to follow, just write the count */ + +- CgLocalWriteAmlData (Op, &PkgLen.LenBytes[0], 1); ++ Tmp8 = (UINT8) PkgLen.Len; ++ CgLocalWriteAmlData (Op, &Tmp8, 1); + } + else if (Op->Asl.AmlPkgLenBytes != 0) + { +@@ -343,9 +349,10 @@ CgWriteAmlOpcode ( + * Encode the "bytes to follow" in the first byte, top two bits. + * The low-order nybble of the length is in the bottom 4 bits + */ ++ Tmp8 = (UINT8) PkgLen.Len; + PkgLenFirstByte = (UINT8) + (((UINT32) (Op->Asl.AmlPkgLenBytes - 1) << 6) | +- (PkgLen.LenBytes[0] & 0x0F)); ++ (Tmp8 & 0x0F)); + + CgLocalWriteAmlData (Op, &PkgLenFirstByte, 1); + +@@ -359,6 +366,9 @@ CgWriteAmlOpcode ( + * Now we can write the remaining bytes - + * either 1, 2, or 3 bytes + */ ++ Tmp32 = PkgLen.Len; ++ AcpiUtWriteUint (&PkgLen.Len, Op->Asl.AmlPkgLenBytes, ++ &Tmp32, sizeof (UINT32)); + for (i = 0; i < (UINT32) (Op->Asl.AmlPkgLenBytes - 1); i++) + { + CgLocalWriteAmlData (Op, &PkgLen.LenBytes[i], 1); +@@ -370,22 +380,30 @@ CgWriteAmlOpcode ( + { + case AML_BYTE_OP: + +- CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 1); ++ Tmp64 = 0; ++ AcpiUtWriteUint (&Tmp64, 1, &Op->Asl.Value.Integer, 8); ++ CgLocalWriteAmlData (Op, &Tmp64, 1); + break; + + case AML_WORD_OP: + +- CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 2); +- break; ++ Tmp64 = 0; ++ AcpiUtWriteUint (&Tmp64, 2, &Op->Asl.Value.Integer, 8); ++ CgLocalWriteAmlData (Op, &Tmp64, 2); ++ break; + + case AML_DWORD_OP: + +- CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 4); ++ Tmp64 = 0; ++ AcpiUtWriteUint (&Tmp64, 4, &Op->Asl.Value.Integer, 8); ++ CgLocalWriteAmlData (Op, &Tmp64, 4); + break; + + case AML_QWORD_OP: + +- CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 8); ++ Tmp64 = 0; ++ AcpiUtWriteUint (&Tmp64, 8, &Op->Asl.Value.Integer, 8); ++ CgLocalWriteAmlData (Op, &Tmp64, 8); + break; + + case AML_STRING_OP: +@@ -423,6 +441,7 @@ CgWriteTableHeader ( + ACPI_PARSE_OBJECT *Child; + UINT32 CommentLength; + ACPI_COMMENT_NODE *Current; ++ UINT32 Tmp32; + + + memset (&AslGbl_TableHeader, 0, sizeof (ACPI_TABLE_HEADER)); +@@ -478,7 +497,9 @@ CgWriteTableHeader ( + /* OEM Revision */ + + Child = Child->Asl.Next; +- AslGbl_TableHeader.OemRevision = (UINT32) Child->Asl.Value.Integer; ++ AcpiUtWriteUint (&Tmp32, sizeof (UINT32), ++ &Child->Asl.Value.Integer, sizeof (Child->Asl.Value.Integer)); ++ AslGbl_TableHeader.OemRevision = Tmp32; + + /* Compiler ID */ + +@@ -486,7 +507,8 @@ CgWriteTableHeader ( + + /* Compiler version */ + +- AslGbl_TableHeader.AslCompilerRevision = ACPI_CA_VERSION; ++ Tmp32 = ACPI_CA_VERSION; ++ AslGbl_TableHeader.AslCompilerRevision = AcpiUtReadUint32 (&Tmp32); + + /* Table length. Checksum zero for now, will rewrite later */ + +@@ -541,6 +563,15 @@ CgWriteTableHeader ( + AslGbl_TableHeader.Checksum = 0; + Op->Asl.FinalAmlOffset = ftell (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle); + ++ /* ++ * Adjust the Table length; it will only change when big-endian ++ * but we have to wait until here in case there is arithmetic to ++ * be done on the length before this step in the function ++ */ ++ ++ Tmp32 = AslGbl_TableHeader.Length; ++ AslGbl_TableHeader.Length = AcpiUtReadUint32 (&Tmp32); ++ + /* Write entire header and clear the table header global */ + + CgLocalWriteAmlData (Op, &AslGbl_TableHeader, sizeof (ACPI_TABLE_HEADER)); +@@ -625,6 +656,7 @@ CgWriteNode ( + ACPI_PARSE_OBJECT *Op) + { + ASL_RESOURCE_NODE *Rnode; ++ UINT64 Tmp64; + + + /* Write all comments here. */ +@@ -653,7 +685,10 @@ CgWriteNode ( + case AML_RAW_DATA_DWORD: + case AML_RAW_DATA_QWORD: + +- CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, Op->Asl.AmlLength); ++ Tmp64 = 0; ++ AcpiUtWriteUint (&Tmp64, Op->Asl.AmlLength, ++ &Op->Asl.Value.Integer, sizeof (UINT64)); ++ CgLocalWriteAmlData (Op, &Tmp64, Op->Asl.AmlLength); + return; + + +Index: acpica-unix2-20210604/source/compiler/aslopcodes.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslopcodes.c ++++ acpica-unix2-20210604/source/compiler/aslopcodes.c +@@ -511,7 +511,8 @@ OpcDoUnicode ( + + for (i = 0; i < Count; i++) + { +- UnicodeString[i] = (UINT16) AsciiString[i]; ++ AcpiUtWriteUint (&UnicodeString[i], sizeof (UINT16), ++ &AsciiString[i], sizeof (UINT8)); + } + + /* +Index: acpica-unix2-20210604/source/compiler/aslrestype1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslrestype1.c ++++ acpica-unix2-20210604/source/compiler/aslrestype1.c +@@ -143,6 +143,7 @@ RsDoMemory24Descriptor ( + ASL_RESOURCE_NODE *Rnode; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -151,7 +152,8 @@ RsDoMemory24Descriptor ( + + Descriptor = Rnode->Buffer; + Descriptor->Memory24.DescriptorType = ACPI_RESOURCE_NAME_MEMORY24; +- Descriptor->Memory24.ResourceLength = 9; ++ Tmp16 = 9; ++ Descriptor->Memory24.ResourceLength = AcpiUtReadUint16 (&Tmp16); + + /* Process all child initialization nodes */ + +@@ -168,7 +170,8 @@ RsDoMemory24Descriptor ( + + case 1: /* Min Address */ + +- Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Memory24.Minimum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum)); + MinOp = InitializerOp; +@@ -176,7 +179,8 @@ RsDoMemory24Descriptor ( + + case 2: /* Max Address */ + +- Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Memory24.Maximum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum)); + MaxOp = InitializerOp; +@@ -184,14 +188,16 @@ RsDoMemory24Descriptor ( + + case 3: /* Alignment */ + +- Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Memory24.Alignment = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_ALIGNMENT, + CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment)); + break; + + case 4: /* Length */ + +- Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Memory24.AddressLength = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength)); + LengthOp = InitializerOp; +@@ -214,10 +220,10 @@ RsDoMemory24Descriptor ( + /* Validate the Min/Max/Len/Align values (Alignment==0 means 64K) */ + + RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY24, +- Descriptor->Memory24.Minimum, +- Descriptor->Memory24.Maximum, +- Descriptor->Memory24.AddressLength, +- Descriptor->Memory24.Alignment, ++ (UINT32) AcpiUtReadUint16 (&Descriptor->Memory24.Minimum), ++ (UINT32) AcpiUtReadUint16 (&Descriptor->Memory24.Maximum), ++ (UINT32) AcpiUtReadUint16 (&Descriptor->Memory24.AddressLength), ++ (UINT32) AcpiUtReadUint16 (&Descriptor->Memory24.Alignment), + MinOp, MaxOp, LengthOp, NULL, Info->DescriptorTypeOp); + + return (Rnode); +@@ -249,6 +255,8 @@ RsDoMemory32Descriptor ( + ASL_RESOURCE_NODE *Rnode; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -257,7 +265,8 @@ RsDoMemory32Descriptor ( + + Descriptor = Rnode->Buffer; + Descriptor->Memory32.DescriptorType = ACPI_RESOURCE_NAME_MEMORY32; +- Descriptor->Memory32.ResourceLength = 17; ++ Tmp16 = 17; ++ Descriptor->Memory32.ResourceLength = AcpiUtReadUint16 (&Tmp16); + + /* Process all child initialization nodes */ + +@@ -274,7 +283,8 @@ RsDoMemory32Descriptor ( + + case 1: /* Min Address */ + +- Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Memory32.Minimum = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum)); + MinOp = InitializerOp; +@@ -282,7 +292,8 @@ RsDoMemory32Descriptor ( + + case 2: /* Max Address */ + +- Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Memory32.Maximum = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum)); + MaxOp = InitializerOp; +@@ -290,7 +301,8 @@ RsDoMemory32Descriptor ( + + case 3: /* Alignment */ + +- Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Memory32.Alignment = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_ALIGNMENT, + CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment)); + AlignOp = InitializerOp; +@@ -298,7 +310,8 @@ RsDoMemory32Descriptor ( + + case 4: /* Length */ + +- Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Memory32.AddressLength = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength)); + LengthOp = InitializerOp; +@@ -321,10 +334,10 @@ RsDoMemory32Descriptor ( + /* Validate the Min/Max/Len/Align values */ + + RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY32, +- Descriptor->Memory32.Minimum, +- Descriptor->Memory32.Maximum, +- Descriptor->Memory32.AddressLength, +- Descriptor->Memory32.Alignment, ++ AcpiUtReadUint32 (&Descriptor->Memory32.Minimum), ++ AcpiUtReadUint32 (&Descriptor->Memory32.Maximum), ++ AcpiUtReadUint32 (&Descriptor->Memory32.AddressLength), ++ AcpiUtReadUint32 (&Descriptor->Memory32.Alignment), + MinOp, MaxOp, LengthOp, AlignOp, Info->DescriptorTypeOp); + + return (Rnode); +@@ -352,6 +365,8 @@ RsDoMemory32FixedDescriptor ( + ASL_RESOURCE_NODE *Rnode; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -360,7 +375,8 @@ RsDoMemory32FixedDescriptor ( + + Descriptor = Rnode->Buffer; + Descriptor->FixedMemory32.DescriptorType = ACPI_RESOURCE_NAME_FIXED_MEMORY32; +- Descriptor->FixedMemory32.ResourceLength = 9; ++ Tmp16 = 9; ++ Descriptor->FixedMemory32.ResourceLength = AcpiUtReadUint16 (&Tmp16); + + /* Process all child initialization nodes */ + +@@ -377,14 +393,16 @@ RsDoMemory32FixedDescriptor ( + + case 1: /* Address */ + +- Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->FixedMemory32.Address = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_BASEADDRESS, + CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address)); + break; + + case 2: /* Length */ + +- Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->FixedMemory32.AddressLength = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength)); + break; +Index: acpica-unix2-20210604/source/compiler/aslrestype1i.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslrestype1i.c ++++ acpica-unix2-20210604/source/compiler/aslrestype1i.c +@@ -199,6 +199,7 @@ RsDoFixedDmaDescriptor ( + ASL_RESOURCE_NODE *Rnode; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -217,14 +218,16 @@ RsDoFixedDmaDescriptor ( + { + case 0: /* DMA Request Lines [WORD] (_DMA) */ + +- Descriptor->FixedDma.RequestLines = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->FixedDma.RequestLines = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_DMA, + CurrentByteOffset + ASL_RESDESC_OFFSET (FixedDma.RequestLines)); + break; + + case 1: /* DMA Channel [WORD] (_TYP) */ + +- Descriptor->FixedDma.Channels = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->FixedDma.Channels = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_DMATYPE, + CurrentByteOffset + ASL_RESDESC_OFFSET (FixedDma.Channels)); + break; +@@ -275,6 +278,7 @@ RsDoFixedIoDescriptor ( + ASL_RESOURCE_NODE *Rnode; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -293,8 +297,8 @@ RsDoFixedIoDescriptor ( + { + case 0: /* Base Address */ + +- Descriptor->FixedIo.Address = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->FixedIo.Address = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_BASEADDRESS, + CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.Address)); + AddressOp = InitializerOp; +@@ -324,7 +328,7 @@ RsDoFixedIoDescriptor ( + + /* Error checks */ + +- if (Descriptor->FixedIo.Address > 0x03FF) ++ if (AcpiUtReadUint16 (&Descriptor->FixedIo.Address) > 0x03FF) + { + AslError (ASL_WARNING, ASL_MSG_ISA_ADDRESS, AddressOp, NULL); + } +@@ -358,6 +362,7 @@ RsDoIoDescriptor ( + ASL_RESOURCE_NODE *Rnode; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -383,8 +388,8 @@ RsDoIoDescriptor ( + + case 1: /* Min Address */ + +- Descriptor->Io.Minimum = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Io.Minimum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Minimum)); + MinOp = InitializerOp; +@@ -392,8 +397,8 @@ RsDoIoDescriptor ( + + case 2: /* Max Address */ + +- Descriptor->Io.Maximum = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Io.Maximum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Maximum)); + MaxOp = InitializerOp; +@@ -434,10 +439,10 @@ RsDoIoDescriptor ( + /* Validate the Min/Max/Len/Align values */ + + RsSmallAddressCheck (ACPI_RESOURCE_NAME_IO, +- Descriptor->Io.Minimum, +- Descriptor->Io.Maximum, +- Descriptor->Io.AddressLength, +- Descriptor->Io.Alignment, ++ (UINT32) (AcpiUtReadUint16 (&Descriptor->Io.Minimum)), ++ (UINT32) (AcpiUtReadUint16 (&Descriptor->Io.Maximum)), ++ (UINT32) Descriptor->Io.AddressLength, ++ (UINT32) Descriptor->Io.Alignment, + MinOp, MaxOp, LengthOp, AlignOp, Info->DescriptorTypeOp); + + return (Rnode); +@@ -561,7 +566,7 @@ RsDoIrqDescriptor ( + + /* Now we can set the channel mask */ + +- Descriptor->Irq.IrqMask = IrqMask; ++ Descriptor->Irq.IrqMask = AcpiUtReadUint16 (&IrqMask); + return (Rnode); + } + +@@ -660,6 +665,6 @@ RsDoIrqNoFlagsDescriptor ( + + /* Now we can set the interrupt mask */ + +- Descriptor->Irq.IrqMask = IrqMask; ++ Descriptor->Irq.IrqMask = AcpiUtReadUint16(&IrqMask); + return (Rnode); + } +Index: acpica-unix2-20210604/source/compiler/aslrestype2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslrestype2.c ++++ acpica-unix2-20210604/source/compiler/aslrestype2.c +@@ -77,6 +77,8 @@ RsDoGeneralRegisterDescriptor ( + ASL_RESOURCE_NODE *Rnode; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; ++ UINT64 Tmp64; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -85,7 +87,8 @@ RsDoGeneralRegisterDescriptor ( + + Descriptor = Rnode->Buffer; + Descriptor->GenericReg.DescriptorType = ACPI_RESOURCE_NAME_GENERIC_REGISTER; +- Descriptor->GenericReg.ResourceLength = 12; ++ Tmp16 = 12; ++ Descriptor->GenericReg.ResourceLength = AcpiUtReadUint16 (&Tmp16); + + /* Process all child initialization nodes */ + +@@ -116,7 +119,8 @@ RsDoGeneralRegisterDescriptor ( + + case 3: /* Register Address */ + +- Descriptor->GenericReg.Address = InitializerOp->Asl.Value.Integer; ++ Tmp64 = InitializerOp->Asl.Value.Integer; ++ Descriptor->GenericReg.Address = AcpiUtReadUint64 (&Tmp64); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_ADDRESS, + CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.Address)); + break; +@@ -184,6 +188,8 @@ RsDoInterruptDescriptor ( + BOOLEAN HasResSourceIndex = FALSE; + UINT8 ResSourceIndex = 0; + UINT8 *ResSourceString = NULL; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -225,7 +231,7 @@ RsDoInterruptDescriptor ( + * Initial descriptor length -- may be enlarged if there are + * optional fields present + */ +- Descriptor->ExtendedIrq.ResourceLength = 2; /* Flags and table length byte */ ++ Descriptor->ExtendedIrq.ResourceLength = 2; /* Flags and table length byte */ + Descriptor->ExtendedIrq.InterruptCount = 0; + + Rover = ACPI_CAST_PTR (AML_RESOURCE, +@@ -333,7 +339,8 @@ RsDoInterruptDescriptor ( + + /* Save the integer and move pointer to the next one */ + +- Rover->DwordItem = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Rover->DwordItem = AcpiUtReadUint32 (&Tmp32); + Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->DwordItem), 4); + Descriptor->ExtendedIrq.InterruptCount++; + Descriptor->ExtendedIrq.ResourceLength += 4; +@@ -384,6 +391,8 @@ RsDoInterruptDescriptor ( + Descriptor->ExtendedIrq.ResourceLength = (UINT16) + (Descriptor->ExtendedIrq.ResourceLength + StringLength); + } ++ Tmp16 = Descriptor->ExtendedIrq.ResourceLength; ++ Descriptor->ExtendedIrq.ResourceLength = AcpiUtReadUint16 (&Tmp16); + + Rnode->BufferLength = + (ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]) - +@@ -436,7 +445,8 @@ RsDoVendorLargeDescriptor ( + + Descriptor = Rnode->Buffer; + Descriptor->VendorLarge.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_LARGE; +- Descriptor->VendorLarge.ResourceLength = (UINT16) i; ++ AcpiUtWriteUint (&Descriptor->VendorLarge.ResourceLength, sizeof (UINT16), ++ &i, sizeof (UINT32)); + + /* Point to end-of-descriptor for vendor data */ + +Index: acpica-unix2-20210604/source/compiler/aslrestype2d.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslrestype2d.c ++++ acpica-unix2-20210604/source/compiler/aslrestype2d.c +@@ -84,6 +84,8 @@ RsDoDwordIoDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -147,8 +149,8 @@ RsDoDwordIoDescriptor ( + + case 5: /* Address Granularity */ + +- Descriptor->Address32.Granularity = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Granularity = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); + GranOp = InitializerOp; +@@ -156,8 +158,8 @@ RsDoDwordIoDescriptor ( + + case 6: /* Address Min */ + +- Descriptor->Address32.Minimum = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Minimum = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); + MinOp = InitializerOp; +@@ -165,8 +167,8 @@ RsDoDwordIoDescriptor ( + + case 7: /* Address Max */ + +- Descriptor->Address32.Maximum = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Maximum = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); + MaxOp = InitializerOp; +@@ -174,16 +176,16 @@ RsDoDwordIoDescriptor ( + + case 8: /* Translation Offset */ + +- Descriptor->Address32.TranslationOffset = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.TranslationOffset = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); + break; + + case 9: /* Address Length */ + +- Descriptor->Address32.AddressLength = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.AddressLength = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); + LengthOp = InitializerOp; +@@ -271,11 +273,14 @@ RsDoDwordIoDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->Address32.ResourceLength; ++ Descriptor->Address32.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- (UINT64) Descriptor->Address32.Minimum, +- (UINT64) Descriptor->Address32.Maximum, +- (UINT64) Descriptor->Address32.AddressLength, +- (UINT64) Descriptor->Address32.Granularity, ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Minimum), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Maximum), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.AddressLength), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Granularity), + Descriptor->Address32.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +@@ -314,6 +319,8 @@ RsDoDwordMemoryDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -385,8 +392,8 @@ RsDoDwordMemoryDescriptor ( + + case 6: /* Address Granularity */ + +- Descriptor->Address32.Granularity = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Granularity = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); + GranOp = InitializerOp; +@@ -394,8 +401,8 @@ RsDoDwordMemoryDescriptor ( + + case 7: /* Min Address */ + +- Descriptor->Address32.Minimum = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Minimum = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); + MinOp = InitializerOp; +@@ -403,8 +410,8 @@ RsDoDwordMemoryDescriptor ( + + case 8: /* Max Address */ + +- Descriptor->Address32.Maximum = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Maximum = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); + MaxOp = InitializerOp; +@@ -412,16 +419,16 @@ RsDoDwordMemoryDescriptor ( + + case 9: /* Translation Offset */ + +- Descriptor->Address32.TranslationOffset = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.TranslationOffset = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); + break; + + case 10: /* Address Length */ + +- Descriptor->Address32.AddressLength = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.AddressLength = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); + LengthOp = InitializerOp; +@@ -506,11 +513,14 @@ RsDoDwordMemoryDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->Address32.ResourceLength; ++ Descriptor->Address32.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- (UINT64) Descriptor->Address32.Minimum, +- (UINT64) Descriptor->Address32.Maximum, +- (UINT64) Descriptor->Address32.AddressLength, +- (UINT64) Descriptor->Address32.Granularity, ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Minimum), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Maximum), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.AddressLength), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Granularity), + Descriptor->Address32.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +@@ -549,6 +559,8 @@ RsDoDwordSpaceDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -616,8 +628,8 @@ RsDoDwordSpaceDescriptor ( + + case 6: /* Address Granularity */ + +- Descriptor->Address32.Granularity = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Granularity = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); + GranOp = InitializerOp; +@@ -625,8 +637,8 @@ RsDoDwordSpaceDescriptor ( + + case 7: /* Min Address */ + +- Descriptor->Address32.Minimum = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Minimum = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); + MinOp = InitializerOp; +@@ -634,8 +646,8 @@ RsDoDwordSpaceDescriptor ( + + case 8: /* Max Address */ + +- Descriptor->Address32.Maximum = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.Maximum = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); + MaxOp = InitializerOp; +@@ -643,16 +655,16 @@ RsDoDwordSpaceDescriptor ( + + case 9: /* Translation Offset */ + +- Descriptor->Address32.TranslationOffset = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.TranslationOffset = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); + break; + + case 10: /* Address Length */ + +- Descriptor->Address32.AddressLength = +- (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address32.AddressLength = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); + LengthOp = InitializerOp; +@@ -723,11 +735,14 @@ RsDoDwordSpaceDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->Address32.ResourceLength; ++ Descriptor->Address32.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- (UINT64) Descriptor->Address32.Minimum, +- (UINT64) Descriptor->Address32.Maximum, +- (UINT64) Descriptor->Address32.AddressLength, +- (UINT64) Descriptor->Address32.Granularity, ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Minimum), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Maximum), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.AddressLength), ++ (UINT64) AcpiUtReadUint32 (&Descriptor->Address32.Granularity), + Descriptor->Address32.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +Index: acpica-unix2-20210604/source/compiler/aslrestype2q.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslrestype2q.c ++++ acpica-unix2-20210604/source/compiler/aslrestype2q.c +@@ -84,6 +84,7 @@ RsDoQwordIoDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -147,7 +148,8 @@ RsDoQwordIoDescriptor ( + + case 5: /* Address Granularity */ + +- Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Granularity = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); + GranOp = InitializerOp; +@@ -155,7 +157,8 @@ RsDoQwordIoDescriptor ( + + case 6: /* Address Min */ + +- Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Minimum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); + MinOp = InitializerOp; +@@ -163,7 +166,8 @@ RsDoQwordIoDescriptor ( + + case 7: /* Address Max */ + +- Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Maximum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); + MaxOp = InitializerOp; +@@ -171,14 +175,16 @@ RsDoQwordIoDescriptor ( + + case 8: /* Translation Offset */ + +- Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.TranslationOffset = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); + break; + + case 9: /* Address Length */ + +- Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.AddressLength = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); + LengthOp = InitializerOp; +@@ -262,11 +268,14 @@ RsDoQwordIoDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->Address64.ResourceLength; ++ Descriptor->Address64.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- Descriptor->Address64.Minimum, +- Descriptor->Address64.Maximum, +- Descriptor->Address64.AddressLength, +- Descriptor->Address64.Granularity, ++ AcpiUtReadUint64 (&Descriptor->Address64.Minimum), ++ AcpiUtReadUint64 (&Descriptor->Address64.Maximum), ++ AcpiUtReadUint64 (&Descriptor->Address64.AddressLength), ++ AcpiUtReadUint64 (&Descriptor->Address64.Granularity), + Descriptor->Address64.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +@@ -305,6 +314,7 @@ RsDoQwordMemoryDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -375,7 +385,8 @@ RsDoQwordMemoryDescriptor ( + + case 6: /* Address Granularity */ + +- Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Granularity = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); + GranOp = InitializerOp; +@@ -383,7 +394,8 @@ RsDoQwordMemoryDescriptor ( + + case 7: /* Min Address */ + +- Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Minimum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); + MinOp = InitializerOp; +@@ -391,7 +403,8 @@ RsDoQwordMemoryDescriptor ( + + case 8: /* Max Address */ + +- Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Maximum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); + MaxOp = InitializerOp; +@@ -399,14 +412,16 @@ RsDoQwordMemoryDescriptor ( + + case 9: /* Translation Offset */ + +- Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.TranslationOffset = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); + break; + + case 10: /* Address Length */ + +- Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.AddressLength = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); + LengthOp = InitializerOp; +@@ -491,11 +506,14 @@ RsDoQwordMemoryDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->Address64.ResourceLength; ++ Descriptor->Address64.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- Descriptor->Address64.Minimum, +- Descriptor->Address64.Maximum, +- Descriptor->Address64.AddressLength, +- Descriptor->Address64.Granularity, ++ AcpiUtReadUint64 (&Descriptor->Address64.Minimum), ++ AcpiUtReadUint64 (&Descriptor->Address64.Maximum), ++ AcpiUtReadUint64 (&Descriptor->Address64.AddressLength), ++ AcpiUtReadUint64 (&Descriptor->Address64.Granularity), + Descriptor->Address64.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +@@ -534,6 +552,7 @@ RsDoQwordSpaceDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -601,7 +620,8 @@ RsDoQwordSpaceDescriptor ( + + case 6: /* Address Granularity */ + +- Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Granularity = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); + GranOp = InitializerOp; +@@ -609,7 +629,8 @@ RsDoQwordSpaceDescriptor ( + + case 7: /* Min Address */ + +- Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Minimum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); + MinOp = InitializerOp; +@@ -617,7 +638,8 @@ RsDoQwordSpaceDescriptor ( + + case 8: /* Max Address */ + +- Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.Maximum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); + MaxOp = InitializerOp; +@@ -625,14 +647,16 @@ RsDoQwordSpaceDescriptor ( + + case 9: /* Translation Offset */ + +- Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.TranslationOffset = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); + break; + + case 10: /* Address Length */ + +- Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; ++ Descriptor->Address64.AddressLength = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); + LengthOp = InitializerOp; +@@ -702,11 +726,14 @@ RsDoQwordSpaceDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->Address64.ResourceLength; ++ Descriptor->Address64.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- Descriptor->Address64.Minimum, +- Descriptor->Address64.Maximum, +- Descriptor->Address64.AddressLength, +- Descriptor->Address64.Granularity, ++ AcpiUtReadUint64 (&Descriptor->Address64.Minimum), ++ AcpiUtReadUint64 (&Descriptor->Address64.Maximum), ++ AcpiUtReadUint64 (&Descriptor->Address64.AddressLength), ++ AcpiUtReadUint64 (&Descriptor->Address64.Granularity), + Descriptor->Address64.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +Index: acpica-unix2-20210604/source/compiler/aslrestype2w.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslrestype2w.c ++++ acpica-unix2-20210604/source/compiler/aslrestype2w.c +@@ -84,6 +84,7 @@ RsDoWordIoDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -147,7 +148,8 @@ RsDoWordIoDescriptor ( + + case 5: /* Address Granularity */ + +- Descriptor->Address16.Granularity = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Granularity = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); + GranOp = InitializerOp; +@@ -155,7 +157,8 @@ RsDoWordIoDescriptor ( + + case 6: /* Address Min */ + +- Descriptor->Address16.Minimum = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Minimum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); + MinOp = InitializerOp; +@@ -163,7 +166,8 @@ RsDoWordIoDescriptor ( + + case 7: /* Address Max */ + +- Descriptor->Address16.Maximum = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Maximum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); + MaxOp = InitializerOp; +@@ -171,14 +175,16 @@ RsDoWordIoDescriptor ( + + case 8: /* Translation Offset */ + +- Descriptor->Address16.TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.TranslationOffset = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); + break; + + case 9: /* Address Length */ + +- Descriptor->Address16.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.AddressLength = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength)); + LengthOp = InitializerOp; +@@ -263,13 +269,17 @@ RsDoWordIoDescriptor ( + /* Validate the Min/Max/Len/Gran values */ + + RsLargeAddressCheck ( +- (UINT64) Descriptor->Address16.Minimum, +- (UINT64) Descriptor->Address16.Maximum, +- (UINT64) Descriptor->Address16.AddressLength, +- (UINT64) Descriptor->Address16.Granularity, ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Minimum), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Maximum), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.AddressLength), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Granularity), + Descriptor->Address16.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + ++ /* correct enddianness */ ++ Tmp16 = Descriptor->Address16.ResourceLength; ++ Descriptor->Address16.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + + OptionIndex + StringLength; + return (Rnode); +@@ -305,6 +315,7 @@ RsDoWordBusNumberDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -361,8 +372,8 @@ RsDoWordBusNumberDescriptor ( + + case 4: /* Address Granularity */ + +- Descriptor->Address16.Granularity = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Granularity = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); + GranOp = InitializerOp; +@@ -370,8 +381,8 @@ RsDoWordBusNumberDescriptor ( + + case 5: /* Min Address */ + +- Descriptor->Address16.Minimum = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Minimum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); + MinOp = InitializerOp; +@@ -379,8 +390,8 @@ RsDoWordBusNumberDescriptor ( + + case 6: /* Max Address */ + +- Descriptor->Address16.Maximum = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Maximum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); + MaxOp = InitializerOp; +@@ -388,16 +399,16 @@ RsDoWordBusNumberDescriptor ( + + case 7: /* Translation Offset */ + +- Descriptor->Address16.TranslationOffset = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.TranslationOffset = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); + break; + + case 8: /* Address Length */ + +- Descriptor->Address16.AddressLength = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.AddressLength = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength)); + LengthOp = InitializerOp; +@@ -468,13 +479,17 @@ RsDoWordBusNumberDescriptor ( + /* Validate the Min/Max/Len/Gran values */ + + RsLargeAddressCheck ( +- (UINT64) Descriptor->Address16.Minimum, +- (UINT64) Descriptor->Address16.Maximum, +- (UINT64) Descriptor->Address16.AddressLength, +- (UINT64) Descriptor->Address16.Granularity, ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Minimum), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Maximum), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.AddressLength), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Granularity), + Descriptor->Address16.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + ++ /* correct enddianness */ ++ Tmp16 = Descriptor->Address16.ResourceLength; ++ Descriptor->Address16.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + + OptionIndex + StringLength; + return (Rnode); +@@ -510,6 +525,7 @@ RsDoWordSpaceDescriptor ( + UINT32 CurrentByteOffset; + UINT32 i; + BOOLEAN ResSourceIndex = FALSE; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -577,8 +593,8 @@ RsDoWordSpaceDescriptor ( + + case 6: /* Address Granularity */ + +- Descriptor->Address16.Granularity = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Granularity = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); + GranOp = InitializerOp; +@@ -586,8 +602,8 @@ RsDoWordSpaceDescriptor ( + + case 7: /* Min Address */ + +- Descriptor->Address16.Minimum = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Minimum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); + MinOp = InitializerOp; +@@ -595,8 +611,8 @@ RsDoWordSpaceDescriptor ( + + case 8: /* Max Address */ + +- Descriptor->Address16.Maximum = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.Maximum = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); + MaxOp = InitializerOp; +@@ -604,16 +620,16 @@ RsDoWordSpaceDescriptor ( + + case 9: /* Translation Offset */ + +- Descriptor->Address16.TranslationOffset = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.TranslationOffset = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); + break; + + case 10: /* Address Length */ + +- Descriptor->Address16.AddressLength = +- (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->Address16.AddressLength = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength)); + LengthOp = InitializerOp; +@@ -684,13 +700,17 @@ RsDoWordSpaceDescriptor ( + /* Validate the Min/Max/Len/Gran values */ + + RsLargeAddressCheck ( +- (UINT64) Descriptor->Address16.Minimum, +- (UINT64) Descriptor->Address16.Maximum, +- (UINT64) Descriptor->Address16.AddressLength, +- (UINT64) Descriptor->Address16.Granularity, ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Minimum), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Maximum), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.AddressLength), ++ (UINT64) AcpiUtReadUint16 (&Descriptor->Address16.Granularity), + Descriptor->Address16.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + ++ /* correct enddianness */ ++ Tmp16 = Descriptor->Address16.ResourceLength; ++ Descriptor->Address16.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + + OptionIndex + StringLength; + return (Rnode); +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -2635,7 +2635,8 @@ DtCompileWpbt ( + + /* Extract the length of the Arguments buffer, insert into main table */ + +- Length = (UINT16) Subtable->TotalLength; ++ AcpiUtWriteUint (&Length, sizeof (UINT16), ++ &Subtable->TotalLength, sizeof (UINT32)); + Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer); + Table->ArgumentsLength = Length; + +Index: acpica-unix2-20210604/source/components/disassembler/dmbuffer.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/disassembler/dmbuffer.c ++++ acpica-unix2-20210604/source/components/disassembler/dmbuffer.c +@@ -204,7 +204,7 @@ AcpiDmByteList ( + + + ByteData = Op->Named.Data; +- ByteCount = (UINT32) Op->Common.Value.Integer; ++ ByteCount = (UINT32) Op->Common.Value.Size; + + /* + * The byte list belongs to a buffer, and can be produced by either +@@ -308,7 +308,7 @@ AcpiDmIsUuidBuffer ( + /* Extract the byte list info */ + + ByteData = NextOp->Named.Data; +- ByteCount = (UINT32) NextOp->Common.Value.Integer; ++ ByteCount = (UINT32) NextOp->Common.Value.Size; + + /* Byte count must be exactly 16 */ + +@@ -436,7 +436,7 @@ AcpiDmIsUnicodeBuffer ( + /* Extract the byte list info */ + + ByteData = NextOp->Named.Data; +- ByteCount = (UINT32) NextOp->Common.Value.Integer; ++ ByteCount = (UINT32) NextOp->Common.Value.Size; + WordCount = ACPI_DIV_2 (ByteCount); + + /* +@@ -878,14 +878,14 @@ AcpiDmUnicode ( + /* Extract the buffer info as a WORD buffer */ + + WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data); +- WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer)); ++ WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Size)); + + /* Write every other byte as an ASCII character */ + + AcpiOsPrintf ("\""); + for (i = 0; i < (WordCount - 1); i++) + { +- OutputValue = (int) WordData[i]; ++ OutputValue = (int) AcpiUtReadUint16 (&WordData[i]); + + /* Handle values that must be escaped */ + +@@ -947,7 +947,29 @@ AcpiDmGetHardwareIdType ( + + /* Swap from little-endian to big-endian to simplify conversion */ + +- BigEndianId = AcpiUtDwordByteSwap ((UINT32) Op->Common.Value.Integer); ++ BigEndianId = (UINT32) Op->Common.Value.Integer; ++ if (UtIsBigEndianMachine()) ++ { ++ /* ++ * We'll need to store the bytes in little-endian order ++ * so they can be re-used properly later since everything is ++ * assumed to be in little-endian form. ++ */ ++ ++ UINT32 *Ptr = (UINT32 *)(&Op->Common.Value.Integer); ++ *Ptr = AcpiUtDwordByteSwap (BigEndianId); ++ } ++ else ++ { ++ /* ++ * We'll need to just use the bytes in big-endian order; ++ * they're already in little-endian order. ++ */ ++ ++ UINT32 Tmp32 = BigEndianId; ++ ++ BigEndianId = AcpiUtDwordByteSwap ((UINT32) Tmp32); ++ } + + /* Create the 3 leading ASCII letters */ + +@@ -1073,11 +1095,12 @@ AcpiDmDecompressEisaId ( + { + char IdBuffer[ACPI_EISAID_STRING_SIZE]; + const AH_DEVICE_ID *Info; ++ UINT32 Tmp32 = EncodedId; + + + /* Convert EISAID to a string an emit the statement */ + +- AcpiExEisaIdToString (IdBuffer, EncodedId); ++ AcpiExEisaIdToString (IdBuffer, AcpiUtReadUint32 (&Tmp32)); + AcpiOsPrintf ("EisaId (\"%s\")", IdBuffer); + + /* If we know about the ID, emit the description */ +Index: acpica-unix2-20210604/source/components/disassembler/dmopcode.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/disassembler/dmopcode.c ++++ acpica-unix2-20210604/source/components/disassembler/dmopcode.c +@@ -778,7 +778,9 @@ AcpiDmDisassembleOneOp ( + } + else + { +- AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer); ++ UINT16 Tmp16 = (UINT16) Op->Common.Value.Integer; ++ ++ AcpiOsPrintf ("0x%4.4X", (UINT32) AcpiUtReadUint16 (&Tmp16)); + } + break; + +@@ -790,14 +792,19 @@ AcpiDmDisassembleOneOp ( + } + else + { +- AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer); ++ UINT32 Tmp32 = (UINT32) Op->Common.Value.Integer; ++ ++ AcpiOsPrintf ("0x%8.8X", (UINT32) AcpiUtReadUint32 (&Tmp32)); + } + break; + + case AML_QWORD_OP: + +- AcpiOsPrintf ("0x%8.8X%8.8X", +- ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); ++ { ++ UINT64 Tmp64 = AcpiUtReadUint64 (&Op->Common.Value.Integer); ++ ++ AcpiOsPrintf ("0x%8.8X%8.8X", ACPI_FORMAT_UINT64 (Tmp64)); ++ } + break; + + case AML_STRING_OP: +@@ -887,18 +894,18 @@ AcpiDmDisassembleOneOp ( + AcpiOsPrintf (","); + ASL_CV_PRINT_ONE_COMMENT (Op, AML_NAMECOMMENT, NULL, 0); + AcpiOsPrintf ("%*.s %u", (unsigned) (5 - Length), " ", +- (UINT32) Op->Common.Value.Integer); ++ (UINT32) Op->Common.Value.Size); + + AcpiDmCommaIfFieldMember (Op); + +- Info->BitOffset += (UINT32) Op->Common.Value.Integer; ++ Info->BitOffset += (UINT32) Op->Common.Value.Size; + break; + + case AML_INT_RESERVEDFIELD_OP: + + /* Offset() -- Must account for previous offsets */ + +- Offset = (UINT32) Op->Common.Value.Integer; ++ Offset = (UINT32) Op->Common.Value.Size; + Info->BitOffset += Offset; + + if (Info->BitOffset % 8 == 0) +Index: acpica-unix2-20210604/source/components/disassembler/dmresrc.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/disassembler/dmresrc.c ++++ acpica-unix2-20210604/source/components/disassembler/dmresrc.c +@@ -417,7 +417,7 @@ AcpiDmIsResourceTemplate ( + return (AE_TYPE); + } + +- DeclaredBufferLength = NextOp->Common.Value.Size; ++ DeclaredBufferLength = NextOp->Common.Value.Integer; + + /* Get the length of the raw initialization byte list */ + +Index: acpica-unix2-20210604/source/components/disassembler/dmresrcl.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/disassembler/dmresrcl.c ++++ acpica-unix2-20210604/source/components/disassembler/dmresrcl.c +@@ -141,6 +141,8 @@ AcpiDmMemoryFields ( + UINT32 Level) + { + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + for (i = 0; i < 4; i++) +@@ -151,14 +153,16 @@ AcpiDmMemoryFields ( + { + case 16: + +- AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i], +- AcpiDmMemoryNames[i]); ++ Tmp16 = ACPI_CAST_PTR (UINT16, Source)[i]; ++ AcpiDmDumpInteger16 (AcpiUtReadUint16 (&Tmp16), ++ AcpiDmMemoryNames[i]); + break; + + case 32: + +- AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i], +- AcpiDmMemoryNames[i]); ++ Tmp32 = ACPI_CAST_PTR (UINT32, Source)[i]; ++ AcpiDmDumpInteger32 (AcpiUtReadUint32 (&Tmp32), ++ AcpiDmMemoryNames[i]); + break; + + default: +@@ -190,6 +194,9 @@ AcpiDmAddressFields ( + UINT32 Level) + { + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; ++ UINT64 Tmp64; + + + AcpiOsPrintf ("\n"); +@@ -202,20 +209,23 @@ AcpiDmAddressFields ( + { + case 16: + +- AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i], +- AcpiDmAddressNames[i]); ++ Tmp16 = ACPI_CAST_PTR (UINT16, Source)[i]; ++ AcpiDmDumpInteger16 (AcpiUtReadUint16 (&Tmp16), ++ AcpiDmAddressNames[i]); + break; + + case 32: + +- AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i], +- AcpiDmAddressNames[i]); ++ Tmp32 = ACPI_CAST_PTR (UINT32, Source)[i]; ++ AcpiDmDumpInteger32 (AcpiUtReadUint32 (&Tmp32), ++ AcpiDmAddressNames[i]); + break; + + case 64: + +- AcpiDmDumpInteger64 (ACPI_CAST_PTR (UINT64, Source)[i], +- AcpiDmAddressNames[i]); ++ Tmp64 = ACPI_CAST_PTR (UINT64, Source)[i]; ++ AcpiDmDumpInteger64 (AcpiUtReadUint64 (&Tmp64), ++ AcpiDmAddressNames[i]); + break; + + default: +@@ -749,7 +759,7 @@ AcpiDmExtendedDescriptor ( + /* Extra field for this descriptor only */ + + AcpiDmIndent (Level + 1); +- AcpiDmDumpInteger64 (Resource->ExtAddress64.TypeSpecific, ++ AcpiDmDumpInteger64 (AcpiUtReadUint64 (&Resource->ExtAddress64.TypeSpecific), + "Type-Specific Attributes"); + + /* Insert a descriptor name */ +@@ -876,11 +886,11 @@ AcpiDmFixedMemory32Descriptor ( + AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (Resource->FixedMemory32.Flags)]); + + AcpiDmIndent (Level + 1); +- AcpiDmDumpInteger32 (Resource->FixedMemory32.Address, ++ AcpiDmDumpInteger32 (AcpiUtReadUint32 (&Resource->FixedMemory32.Address), + "Address Base"); + + AcpiDmIndent (Level + 1); +- AcpiDmDumpInteger32 (Resource->FixedMemory32.AddressLength, ++ AcpiDmDumpInteger32 (AcpiUtReadUint32 (&Resource->FixedMemory32.AddressLength), + "Address Length"); + + /* Insert a descriptor name */ +@@ -926,7 +936,8 @@ AcpiDmGenericRegisterDescriptor ( + AcpiDmDumpInteger8 (Resource->GenericReg.BitOffset, "Bit Offset"); + + AcpiDmIndent (Level + 1); +- AcpiDmDumpInteger64 (Resource->GenericReg.Address, "Address"); ++ AcpiDmDumpInteger64 (AcpiUtReadUint64 (&Resource->GenericReg.Address), ++ "Address"); + + /* Optional field for ACPI 3.0 */ + +@@ -989,7 +1000,7 @@ AcpiDmInterruptDescriptor ( + AcpiDmResourceSource (Resource, + sizeof (AML_RESOURCE_EXTENDED_IRQ) + + ((UINT32) Resource->ExtendedIrq.InterruptCount - 1) * sizeof (UINT32), +- Resource->ExtendedIrq.ResourceLength); ++ AcpiUtReadUint16 (&Resource->ExtendedIrq.ResourceLength)); + + /* Insert a descriptor name */ + +@@ -1004,7 +1015,7 @@ AcpiDmInterruptDescriptor ( + { + AcpiDmIndent (Level + 1); + AcpiOsPrintf ("0x%8.8X,\n", +- (UINT32) Resource->ExtendedIrq.Interrupts[i]); ++ AcpiUtReadUint32 (&Resource->ExtendedIrq.Interrupts[i])); + } + + AcpiDmIndent (Level); +Index: acpica-unix2-20210604/source/components/disassembler/dmresrcl2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/disassembler/dmresrcl2.c ++++ acpica-unix2-20210604/source/components/disassembler/dmresrcl2.c +@@ -199,22 +199,27 @@ AcpiDmGpioCommon ( + char *DeviceName = NULL; + UINT32 PinCount; + UINT32 i; ++ UINT16 ResSourceOffset; ++ UINT16 VendorOffset; ++ UINT16 VendorLength; ++ UINT16 Tmp16; + + + /* ResourceSource, ResourceSourceIndex, ResourceType */ + + AcpiDmIndent (Level + 1); +- if (Resource->Gpio.ResSourceOffset) ++ ResSourceOffset = AcpiUtReadUint16 (&Resource->Gpio.ResSourceOffset); ++ if (ResSourceOffset) + { + DeviceName = ACPI_ADD_PTR (char, +- Resource, Resource->Gpio.ResSourceOffset), ++ Resource, ResSourceOffset), + AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX); + } + + AcpiOsPrintf (", "); + AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.ResSourceIndex); +- AcpiOsPrintf ("%s, ", +- AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.Flags)]); ++ Tmp16 = AcpiUtReadUint16 (&Resource->Gpio.Flags); ++ AcpiOsPrintf ("%s, ", AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Tmp16)]); + + /* Insert a descriptor name */ + +@@ -223,15 +228,15 @@ AcpiDmGpioCommon ( + + /* Dump the vendor data */ + +- if (Resource->Gpio.VendorOffset) ++ VendorOffset = AcpiUtReadUint16 (&Resource->Gpio.VendorOffset); ++ VendorLength = AcpiUtReadUint16 (&Resource->Gpio.VendorLength); ++ if (VendorOffset) + { + AcpiOsPrintf ("\n"); + AcpiDmIndent (Level + 1); +- VendorData = ACPI_ADD_PTR (UINT8, Resource, +- Resource->Gpio.VendorOffset); ++ VendorData = ACPI_ADD_PTR (UINT8, Resource, VendorOffset); + +- AcpiDmDumpRawDataBuffer (VendorData, +- Resource->Gpio.VendorLength, Level); ++ AcpiDmDumpRawDataBuffer (VendorData, VendorLength, Level); + } + + AcpiOsPrintf (")\n"); +@@ -241,17 +246,17 @@ AcpiDmGpioCommon ( + AcpiDmIndent (Level + 1); + AcpiOsPrintf ("{ // Pin list\n"); + +- PinCount = ((UINT32) (Resource->Gpio.ResSourceOffset - +- Resource->Gpio.PinTableOffset)) / +- sizeof (UINT16); ++ PinCount = (UINT32) AcpiUtReadUint16 (&Resource->Gpio.ResSourceOffset); ++ PinCount -= (UINT32) AcpiUtReadUint16 (&Resource->Gpio.PinTableOffset); ++ PinCount /= sizeof (UINT16); + + PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource, +- Resource->Gpio.PinTableOffset); ++ AcpiUtReadUint16 (&Resource->Gpio.PinTableOffset)); + + for (i = 0; i < PinCount; i++) + { + AcpiDmIndent (Level + 2); +- AcpiOsPrintf ("0x%4.4X%s\n", PinList[i], ++ AcpiOsPrintf ("0x%4.4X%s\n", AcpiUtReadUint16 (&(PinList[i])), + ((i + 1) < PinCount) ? "," : ""); + } + +@@ -285,16 +290,18 @@ AcpiDmGpioIntDescriptor ( + UINT32 Length, + UINT32 Level) + { ++ UINT16 Tmp16; + + /* Dump the GpioInt-specific portion of the descriptor */ + + /* EdgeLevel, ActiveLevel, Shared */ + + AcpiDmIndent (Level); ++ Tmp16 = AcpiUtReadUint16 (&Resource->Gpio.IntFlags); + AcpiOsPrintf ("GpioInt (%s, %s, %s, ", +- AcpiGbl_HeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.IntFlags)], +- AcpiGbl_LlDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 1)], +- AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]); ++ AcpiGbl_HeDecode [ACPI_GET_1BIT_FLAG (Tmp16)], ++ AcpiGbl_LlDecode [ACPI_EXTRACT_2BIT_FLAG (Tmp16, 1)], ++ AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Tmp16, 3)]); + + /* PinConfig, DebounceTimeout */ + +@@ -307,7 +314,8 @@ AcpiDmGpioIntDescriptor ( + { + AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig); + } +- AcpiOsPrintf ("0x%4.4X,\n", Resource->Gpio.DebounceTimeout); ++ AcpiOsPrintf ("0x%4.4X,\n", ++ AcpiUtReadUint16 (&Resource->Gpio.DebounceTimeout)); + + /* Dump the GpioInt/GpioIo common portion of the descriptor */ + +@@ -337,14 +345,16 @@ AcpiDmGpioIoDescriptor ( + UINT32 Length, + UINT32 Level) + { ++ UINT16 Tmp16; + + /* Dump the GpioIo-specific portion of the descriptor */ + + /* Shared, PinConfig */ + + AcpiDmIndent (Level); ++ Tmp16 = AcpiUtReadUint16 (&Resource->Gpio.IntFlags); + AcpiOsPrintf ("GpioIo (%s, ", +- AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]); ++ AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Tmp16, 3)]); + + if (Resource->Gpio.PinConfig <= 3) + { +@@ -358,10 +368,10 @@ AcpiDmGpioIoDescriptor ( + + /* DebounceTimeout, DriveStrength, IoRestriction */ + +- AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DebounceTimeout); +- AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DriveStrength); +- AcpiOsPrintf ("%s,\n", +- AcpiGbl_IorDecode [ACPI_GET_2BIT_FLAG (Resource->Gpio.IntFlags)]); ++ AcpiOsPrintf ("0x%4.4X, ", AcpiUtReadUint16 (&Resource->Gpio.DebounceTimeout)); ++ AcpiOsPrintf ("0x%4.4X, ", AcpiUtReadUint16 (&Resource->Gpio.DriveStrength)); ++ Tmp16 = AcpiUtReadUint16 (&Resource->Gpio.IntFlags); ++ AcpiOsPrintf ("%s,\n", AcpiGbl_IorDecode [ACPI_GET_2BIT_FLAG (Tmp16)]); + + /* Dump the GpioInt/GpioIo common portion of the descriptor */ + +@@ -442,6 +452,9 @@ AcpiDmPinFunctionDescriptor ( + char *DeviceName = NULL; + UINT32 PinCount; + UINT32 i; ++ UINT16 ResSourceOffset; ++ UINT16 VendorOffset; ++ UINT16 VendorLength; + + AcpiDmIndent (Level); + AcpiOsPrintf ("PinFunction (%s, ", +@@ -459,12 +472,14 @@ AcpiDmPinFunctionDescriptor ( + + /* FunctionNumber */ + +- AcpiOsPrintf ("0x%4.4X, ", Resource->PinFunction.FunctionNumber); ++ AcpiOsPrintf ("0x%4.4X, ", ++ AcpiUtReadUint16 (&Resource->PinFunction.FunctionNumber)); + +- if (Resource->PinFunction.ResSourceOffset) ++ ResSourceOffset = AcpiUtReadUint16 (&Resource->PinFunction.ResSourceOffset); ++ if (ResSourceOffset) + { + DeviceName = ACPI_ADD_PTR (char, +- Resource, Resource->PinFunction.ResSourceOffset), ++ Resource, ResSourceOffset), + AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX); + } + +@@ -484,15 +499,15 @@ AcpiDmPinFunctionDescriptor ( + + /* Dump the vendor data */ + +- if (Resource->PinFunction.VendorLength) ++ VendorOffset = AcpiUtReadUint16 (&Resource->PinFunction.VendorOffset); ++ VendorLength = AcpiUtReadUint16 (&Resource->PinFunction.VendorLength); ++ if (VendorLength) + { + AcpiOsPrintf ("\n"); + AcpiDmIndent (Level + 1); +- VendorData = ACPI_ADD_PTR (UINT8, Resource, +- Resource->PinFunction.VendorOffset); ++ VendorData = ACPI_ADD_PTR (UINT8, Resource, VendorOffset); + +- AcpiDmDumpRawDataBuffer (VendorData, +- Resource->PinFunction.VendorLength, Level); ++ AcpiDmDumpRawDataBuffer (VendorData, VendorLength, Level); + } + + AcpiOsPrintf (")\n"); +@@ -503,17 +518,17 @@ AcpiDmPinFunctionDescriptor ( + + AcpiOsPrintf ("{ // Pin list\n"); + +- PinCount = ((UINT32) (Resource->PinFunction.ResSourceOffset - +- Resource->PinFunction.PinTableOffset)) / +- sizeof (UINT16); ++ PinCount = AcpiUtReadUint16 (&Resource->PinFunction.ResSourceOffset); ++ PinCount -= AcpiUtReadUint16 (&Resource->PinFunction.PinTableOffset); ++ PinCount /= sizeof (UINT16); + + PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource, +- Resource->PinFunction.PinTableOffset); ++ AcpiUtReadUint16 (&Resource->PinFunction.PinTableOffset)); + + for (i = 0; i < PinCount; i++) + { + AcpiDmIndent (Level + 2); +- AcpiOsPrintf ("0x%4.4X%s\n", PinList[i], ++ AcpiOsPrintf ("0x%4.4X%s\n", AcpiUtReadUint16 (&(PinList[i])), + ((i + 1) < PinCount) ? "," : ""); + } + +@@ -549,7 +564,8 @@ AcpiDmDumpSerialBusVendorData ( + { + case AML_RESOURCE_I2C_SERIALBUSTYPE: + +- VendorLength = Resource->CommonSerialBus.TypeDataLength - ++ VendorLength = ++ AcpiUtReadUint16 (&Resource->CommonSerialBus.TypeDataLength) - + AML_RESOURCE_I2C_MIN_DATA_LEN; + + VendorData = ACPI_ADD_PTR (UINT8, Resource, +@@ -558,7 +574,8 @@ AcpiDmDumpSerialBusVendorData ( + + case AML_RESOURCE_SPI_SERIALBUSTYPE: + +- VendorLength = Resource->CommonSerialBus.TypeDataLength - ++ VendorLength = ++ AcpiUtReadUint16 (&Resource->CommonSerialBus.TypeDataLength) - + AML_RESOURCE_SPI_MIN_DATA_LEN; + + VendorData = ACPI_ADD_PTR (UINT8, Resource, +@@ -567,7 +584,8 @@ AcpiDmDumpSerialBusVendorData ( + + case AML_RESOURCE_UART_SERIALBUSTYPE: + +- VendorLength = Resource->CommonSerialBus.TypeDataLength - ++ VendorLength = ++ AcpiUtReadUint16 (&Resource->CommonSerialBus.TypeDataLength) - + AML_RESOURCE_UART_MIN_DATA_LEN; + + VendorData = ACPI_ADD_PTR (UINT8, Resource, +@@ -693,9 +711,9 @@ AcpiDmI2cSerialBusDescriptor ( + + AcpiDmIndent (Level); + AcpiOsPrintf ("I2cSerialBusV2 (0x%4.4X, %s, 0x%8.8X,\n", +- Resource->I2cSerialBus.SlaveAddress, ++ AcpiUtReadUint16 (&Resource->I2cSerialBus.SlaveAddress), + AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.Flags)], +- Resource->I2cSerialBus.ConnectionSpeed); ++ AcpiUtReadUint32 (&Resource->I2cSerialBus.ConnectionSpeed)); + + AcpiDmIndent (Level + 1); + AcpiOsPrintf ("%s, ", +@@ -704,7 +722,7 @@ AcpiDmI2cSerialBusDescriptor ( + /* ResourceSource is a required field */ + + ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) + +- Resource->CommonSerialBus.TypeDataLength; ++ AcpiUtReadUint16 (&Resource->CommonSerialBus.TypeDataLength); + + DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset); + AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX); +@@ -761,15 +779,17 @@ AcpiDmSpiSerialBusDescriptor ( + { + UINT32 ResourceSourceOffset; + char *DeviceName; ++ UINT16 Tmp16; + + + /* DeviceSelection, DeviceSelectionPolarity, WireMode, DataBitLength */ + + AcpiDmIndent (Level); ++ Tmp16 = AcpiUtReadUint16 (&Resource->SpiSerialBus.TypeSpecificFlags); + AcpiOsPrintf ("SpiSerialBusV2 (0x%4.4X, %s, %s, 0x%2.2X,\n", +- Resource->SpiSerialBus.DeviceSelection, +- AcpiGbl_DpDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags, 1)], +- AcpiGbl_WmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags)], ++ AcpiUtReadUint16 (&Resource->SpiSerialBus.DeviceSelection), ++ AcpiGbl_DpDecode [ACPI_EXTRACT_1BIT_FLAG (Tmp16, 1)], ++ AcpiGbl_WmDecode [ACPI_GET_1BIT_FLAG (Tmp16)], + Resource->SpiSerialBus.DataBitLength); + + /* SlaveMode, ConnectionSpeed, ClockPolarity, ClockPhase */ +@@ -777,7 +797,7 @@ AcpiDmSpiSerialBusDescriptor ( + AcpiDmIndent (Level + 1); + AcpiOsPrintf ("%s, 0x%8.8X, %s,\n", + AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.Flags)], +- Resource->SpiSerialBus.ConnectionSpeed, ++ AcpiUtReadUint32 (&Resource->SpiSerialBus.ConnectionSpeed), + AcpiGbl_CpoDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPolarity)]); + + AcpiDmIndent (Level + 1); +@@ -787,7 +807,7 @@ AcpiDmSpiSerialBusDescriptor ( + /* ResourceSource is a required field */ + + ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) + +- Resource->CommonSerialBus.TypeDataLength; ++ AcpiUtReadUint16 (&Resource->CommonSerialBus.TypeDataLength); + + DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset); + AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX); +@@ -844,15 +864,17 @@ AcpiDmUartSerialBusDescriptor ( + { + UINT32 ResourceSourceOffset; + char *DeviceName; ++ UINT16 Tmp16; + + + /* ConnectionSpeed, BitsPerByte, StopBits */ + + AcpiDmIndent (Level); ++ Tmp16 = AcpiUtReadUint16 (&Resource->UartSerialBus.TypeSpecificFlags); + AcpiOsPrintf ("UartSerialBusV2 (0x%8.8X, %s, %s,\n", +- Resource->UartSerialBus.DefaultBaudRate, +- AcpiGbl_BpbDecode [ACPI_EXTRACT_3BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 4)], +- AcpiGbl_SbDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 2)]); ++ AcpiUtReadUint32 (&Resource->UartSerialBus.DefaultBaudRate), ++ AcpiGbl_BpbDecode [ACPI_EXTRACT_3BIT_FLAG (Tmp16, 4)], ++ AcpiGbl_SbDecode [ACPI_EXTRACT_2BIT_FLAG (Tmp16, 2)]); + + /* LinesInUse, IsBigEndian, Parity, FlowControl */ + +@@ -867,13 +889,13 @@ AcpiDmUartSerialBusDescriptor ( + + AcpiDmIndent (Level + 1); + AcpiOsPrintf ("0x%4.4X, 0x%4.4X, ", +- Resource->UartSerialBus.RxFifoSize, +- Resource->UartSerialBus.TxFifoSize); ++ AcpiUtReadUint16 (&Resource->UartSerialBus.RxFifoSize), ++ AcpiUtReadUint16 (&Resource->UartSerialBus.TxFifoSize)); + + /* ResourceSource is a required field */ + + ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) + +- Resource->CommonSerialBus.TypeDataLength; ++ AcpiUtReadUint16 (&Resource->CommonSerialBus.TypeDataLength); + + DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset); + AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX); +Index: acpica-unix2-20210604/source/components/disassembler/dmresrcs.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/disassembler/dmresrcs.c ++++ acpica-unix2-20210604/source/components/disassembler/dmresrcs.c +@@ -93,7 +93,7 @@ AcpiDmIrqDescriptor ( + AcpiOsPrintf (")\n"); + + AcpiDmIndent (Level + 1); +- AcpiDmBitList (Resource->Irq.IrqMask); ++ AcpiDmBitList (AcpiUtReadUint16 (&Resource->Irq.IrqMask)); + } + + +@@ -161,8 +161,8 @@ AcpiDmFixedDmaDescriptor ( + + AcpiDmIndent (Level); + AcpiOsPrintf ("FixedDMA (0x%4.4X, 0x%4.4X, ", +- Resource->FixedDma.RequestLines, +- Resource->FixedDma.Channels); ++ AcpiUtReadUint16 (&Resource->FixedDma.RequestLines), ++ AcpiUtReadUint16 (&Resource->FixedDma.Channels)); + + if (Resource->FixedDma.Width <= 5) + { +@@ -210,10 +210,12 @@ AcpiDmIoDescriptor ( + AcpiGbl_IoDecode [ACPI_GET_1BIT_FLAG (Resource->Io.Flags)]); + + AcpiDmIndent (Level + 1); +- AcpiDmDumpInteger16 (Resource->Io.Minimum, "Range Minimum"); ++ AcpiDmDumpInteger16 (AcpiUtReadUint16 (&Resource->Io.Minimum), ++ "Range Minimum"); + + AcpiDmIndent (Level + 1); +- AcpiDmDumpInteger16 (Resource->Io.Maximum, "Range Maximum"); ++ AcpiDmDumpInteger16 (AcpiUtReadUint16 (&Resource->Io.Maximum), ++ "Range Maximum"); + + AcpiDmIndent (Level + 1); + AcpiDmDumpInteger8 (Resource->Io.Alignment, "Alignment"); +@@ -256,10 +258,12 @@ AcpiDmFixedIoDescriptor ( + AcpiOsPrintf ("FixedIO (\n"); + + AcpiDmIndent (Level + 1); +- AcpiDmDumpInteger16 (Resource->FixedIo.Address, "Address"); ++ AcpiDmDumpInteger16 (AcpiUtReadUint16 (&Resource->FixedIo.Address), ++ "Address"); + + AcpiDmIndent (Level + 1); +- AcpiDmDumpInteger8 (Resource->FixedIo.AddressLength, "Length"); ++ AcpiDmDumpInteger8 (AcpiUtReadUint16 (&Resource->FixedIo.AddressLength), ++ "Length"); + + /* Insert a descriptor name */ + +Index: acpica-unix2-20210604/source/components/disassembler/dmwalk.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/disassembler/dmwalk.c ++++ acpica-unix2-20210604/source/components/disassembler/dmwalk.c +@@ -1155,7 +1155,7 @@ AcpiDmAscendingOp ( + { + ParentOp->Common.DisasmFlags |= ACPI_PARSEOP_EMPTY_TERMLIST; + ASL_CV_CLOSE_PAREN (Op, Level); +- AcpiOsPrintf ("{"); ++ AcpiOsPrintf (" {"); + } + } + +Index: acpica-unix2-20210604/source/components/namespace/nsaccess.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/namespace/nsaccess.c ++++ acpica-unix2-20210604/source/components/namespace/nsaccess.c +@@ -644,7 +644,7 @@ AcpiNsLookup ( + + /* Extract one ACPI name from the front of the pathname */ + +- ACPI_MOVE_32_TO_32 (&SimpleName, Path); ++ ACPI_COPY_NAMESEG (&SimpleName, Path); + + /* Try to find the single (4 character) ACPI name */ + +Index: acpica-unix2-20210604/source/components/namespace/nsnames.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/namespace/nsnames.c ++++ acpica-unix2-20210604/source/components/namespace/nsnames.c +@@ -297,10 +297,10 @@ AcpiNsBuildNormalizedPath ( + { + if (NextNode != Node) + { +- ACPI_PATH_PUT8(FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length); ++ ACPI_PATH_PUT8 (FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length); + } + +- ACPI_MOVE_32_TO_32 (Name, &NextNode->Name); ++ ACPI_COPY_NAMESEG (Name, &NextNode->Name); + DoNoTrailing = NoTrailing; + for (i = 0; i < 4; i++) + { +Index: acpica-unix2-20210604/source/components/namespace/nsparse.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/namespace/nsparse.c ++++ acpica-unix2-20210604/source/components/namespace/nsparse.c +@@ -203,6 +203,7 @@ AcpiNsOneCompleteParse ( + ACPI_WALK_STATE *WalkState; + ACPI_TABLE_HEADER *Table; + ACPI_OWNER_ID OwnerId; ++ UINT32 TableLength; + + + ACPI_FUNCTION_TRACE (NsOneCompleteParse); +@@ -216,13 +217,14 @@ AcpiNsOneCompleteParse ( + + /* Table must consist of at least a complete header */ + +- if (Table->Length < sizeof (ACPI_TABLE_HEADER)) ++ TableLength = AcpiUtReadUint32 (&Table->Length); ++ if (TableLength < sizeof (ACPI_TABLE_HEADER)) + { + return_ACPI_STATUS (AE_BAD_HEADER); + } + + AmlStart = (UINT8 *) Table + sizeof (ACPI_TABLE_HEADER); +- AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER); ++ AmlLength = TableLength - sizeof (ACPI_TABLE_HEADER); + + Status = AcpiTbGetOwnerId (TableIndex, &OwnerId); + if (ACPI_FAILURE (Status)) +Index: acpica-unix2-20210604/source/components/namespace/nsutils.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/namespace/nsutils.c ++++ acpica-unix2-20210604/source/components/namespace/nsutils.c +@@ -272,7 +272,6 @@ AcpiNsBuildInternalName ( + const char *ExternalName = Info->NextExternalChar; + char *Result = NULL; + UINT32 i; +- char TmpSeg[ACPI_NAMESEG_SIZE+1]; + + + ACPI_FUNCTION_TRACE (NsBuildInternalName); +@@ -336,7 +335,6 @@ AcpiNsBuildInternalName ( + + for (; NumSegments; NumSegments--) + { +- memset (TmpSeg, 0, ACPI_NAMESEG_SIZE+1); + for (i = 0; i < ACPI_NAMESEG_SIZE; i++) + { + if (ACPI_IS_PATH_SEPARATOR (*ExternalName) || +@@ -344,17 +342,16 @@ AcpiNsBuildInternalName ( + { + /* Pad the segment with underscore(s) if segment is short */ + +- TmpSeg[i] = '_'; ++ Result[i] = '_'; + } + else + { + /* Convert the character to uppercase and save it */ + +- TmpSeg[i] = (char) toupper ((int) *ExternalName); ++ Result[i] = (char) toupper ((int) *ExternalName); + ExternalName++; + } + } +- AcpiUtWriteUint (Result, ACPI_NAMESEG_SIZE, TmpSeg, ACPI_NAMESEG_SIZE); + + /* Now we must have a path separator, or the pathname is bad */ + +Index: acpica-unix2-20210604/source/components/utilities/utresrc.c +=================================================================== +--- acpica-unix2-20210604.orig/source/components/utilities/utresrc.c ++++ acpica-unix2-20210604/source/components/utilities/utresrc.c +@@ -541,7 +541,7 @@ AcpiUtGetResourceLength ( + { + /* Large Resource type -- bytes 1-2 contain the 16-bit length */ + +- ACPI_MOVE_16_TO_16 (&ResourceLength, ACPI_ADD_PTR (UINT8, Aml, 1)); ++ ResourceLength = AcpiUtReadUint16 (ACPI_ADD_PTR (UINT8, Aml, 1)); + + } + else +Index: acpica-unix2-20210604/source/compiler/aslrestype2e.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslrestype2e.c ++++ acpica-unix2-20210604/source/compiler/aslrestype2e.c +@@ -80,6 +80,7 @@ RsDoExtendedIoDescriptor ( + UINT16 StringLength = 0; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -139,7 +140,8 @@ RsDoExtendedIoDescriptor ( + + case 5: /* Address Granularity */ + +- Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Granularity = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); + GranOp = InitializerOp; +@@ -147,7 +149,8 @@ RsDoExtendedIoDescriptor ( + + case 6: /* Address Min */ + +- Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Minimum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); + MinOp = InitializerOp; +@@ -155,7 +158,8 @@ RsDoExtendedIoDescriptor ( + + case 7: /* Address Max */ + +- Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Maximum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); + MaxOp = InitializerOp; +@@ -163,14 +167,16 @@ RsDoExtendedIoDescriptor ( + + case 8: /* Translation Offset */ + +- Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.TranslationOffset = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); + break; + + case 9: /* Address Length */ + +- Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.AddressLength = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); + LengthOp = InitializerOp; +@@ -178,7 +184,8 @@ RsDoExtendedIoDescriptor ( + + case 10: /* Type-Specific Attributes */ + +- Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.TypeSpecific = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); + break; +@@ -213,11 +220,14 @@ RsDoExtendedIoDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->ExtAddress64.ResourceLength; ++ Descriptor->ExtAddress64.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- Descriptor->ExtAddress64.Minimum, +- Descriptor->ExtAddress64.Maximum, +- Descriptor->ExtAddress64.AddressLength, +- Descriptor->ExtAddress64.Granularity, ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Minimum), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Maximum), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.AddressLength), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Granularity), + Descriptor->ExtAddress64.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +@@ -253,6 +263,7 @@ RsDoExtendedMemoryDescriptor ( + UINT16 StringLength = 0; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -319,7 +330,8 @@ RsDoExtendedMemoryDescriptor ( + + case 6: /* Address Granularity */ + +- Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Granularity = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); + GranOp = InitializerOp; +@@ -327,7 +339,8 @@ RsDoExtendedMemoryDescriptor ( + + case 7: /* Min Address */ + +- Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Minimum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); + MinOp = InitializerOp; +@@ -335,7 +348,8 @@ RsDoExtendedMemoryDescriptor ( + + case 8: /* Max Address */ + +- Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Maximum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); + MaxOp = InitializerOp; +@@ -343,14 +357,16 @@ RsDoExtendedMemoryDescriptor ( + + case 9: /* Translation Offset */ + +- Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.TranslationOffset = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); + break; + + case 10: /* Address Length */ + +- Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.AddressLength = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); + LengthOp = InitializerOp; +@@ -358,7 +374,8 @@ RsDoExtendedMemoryDescriptor ( + + case 11: /* Type-Specific Attributes */ + +- Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.TypeSpecific = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); + break; +@@ -394,11 +411,14 @@ RsDoExtendedMemoryDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->ExtAddress64.ResourceLength; ++ Descriptor->ExtAddress64.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- Descriptor->ExtAddress64.Minimum, +- Descriptor->ExtAddress64.Maximum, +- Descriptor->ExtAddress64.AddressLength, +- Descriptor->ExtAddress64.Granularity, ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Minimum), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Maximum), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.AddressLength), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Granularity), + Descriptor->ExtAddress64.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +@@ -434,6 +454,7 @@ RsDoExtendedSpaceDescriptor ( + UINT16 StringLength = 0; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -497,7 +518,8 @@ RsDoExtendedSpaceDescriptor ( + + case 6: /* Address Granularity */ + +- Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Granularity = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); + GranOp = InitializerOp; +@@ -505,7 +527,8 @@ RsDoExtendedSpaceDescriptor ( + + case 7: /* Min Address */ + +- Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Minimum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); + MinOp = InitializerOp; +@@ -513,7 +536,8 @@ RsDoExtendedSpaceDescriptor ( + + case 8: /* Max Address */ + +- Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.Maximum = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); + MaxOp = InitializerOp; +@@ -521,14 +545,16 @@ RsDoExtendedSpaceDescriptor ( + + case 9: /* Translation Offset */ + +- Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.TranslationOffset = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); + break; + + case 10: /* Address Length */ + +- Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.AddressLength = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); + LengthOp = InitializerOp; +@@ -536,7 +562,8 @@ RsDoExtendedSpaceDescriptor ( + + case 11: /* Type-Specific Attributes */ + +- Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; ++ Descriptor->ExtAddress64.TypeSpecific = ++ AcpiUtReadUint64 (&InitializerOp->Asl.Value.Integer); + RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, + CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); + break; +@@ -557,11 +584,14 @@ RsDoExtendedSpaceDescriptor ( + + /* Validate the Min/Max/Len/Gran values */ + ++ Tmp16 = Descriptor->ExtAddress64.ResourceLength; ++ Descriptor->ExtAddress64.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ + RsLargeAddressCheck ( +- Descriptor->ExtAddress64.Minimum, +- Descriptor->ExtAddress64.Maximum, +- Descriptor->ExtAddress64.AddressLength, +- Descriptor->ExtAddress64.Granularity, ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Minimum), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Maximum), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.AddressLength), ++ AcpiUtReadUint64 (&Descriptor->ExtAddress64.Granularity), + Descriptor->ExtAddress64.Flags, + MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); + +Index: acpica-unix2-20210604/source/compiler/aslrestype2s.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/aslrestype2s.c ++++ acpica-unix2-20210604/source/compiler/aslrestype2s.c +@@ -343,6 +343,7 @@ RsDoGpioIntDescriptor ( + UINT32 CurrentByteOffset; + UINT32 PinCount = 0; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -485,7 +486,8 @@ RsDoGpioIntDescriptor ( + * (implies resource source must immediately follow the pin list.) + * Name: _PIN + */ +- *InterruptList = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ *InterruptList = AcpiUtReadUint16 (&Tmp16); + InterruptList++; + PinCount++; + +@@ -518,6 +520,27 @@ RsDoGpioIntDescriptor ( + + MpSaveGpioInfo (Info->MappingOp, Descriptor, + PinCount, PinList, ResourceSource); ++ ++ /* correct endian-ness issues */ ++ Tmp16 = Descriptor->Gpio.ResourceLength; ++ Descriptor->Gpio.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.Flags; ++ Descriptor->Gpio.Flags = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.IntFlags; ++ Descriptor->Gpio.IntFlags = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.DriveStrength; ++ Descriptor->Gpio.DriveStrength = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.DebounceTimeout; ++ Descriptor->Gpio.DebounceTimeout = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.PinTableOffset; ++ Descriptor->Gpio.PinTableOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.ResSourceOffset; ++ Descriptor->Gpio.ResSourceOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.VendorOffset; ++ Descriptor->Gpio.VendorOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.VendorLength; ++ Descriptor->Gpio.VendorLength = AcpiUtReadUint16 (&Tmp16); ++ + return (Rnode); + } + +@@ -552,6 +575,7 @@ RsDoGpioIoDescriptor ( + UINT32 CurrentByteOffset; + UINT32 PinCount = 0; + UINT32 i; ++ UINT16 Tmp16; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -691,7 +715,8 @@ RsDoGpioIoDescriptor ( + * (implies resource source must immediately follow the pin list.) + * Name: _PIN + */ +- *InterruptList = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ *InterruptList = AcpiUtReadUint16 (&Tmp16); + InterruptList++; + PinCount++; + +@@ -724,6 +749,27 @@ RsDoGpioIoDescriptor ( + + MpSaveGpioInfo (Info->MappingOp, Descriptor, + PinCount, PinList, ResourceSource); ++ ++ /* correct endian-ness issues */ ++ Tmp16 = Descriptor->Gpio.ResourceLength; ++ Descriptor->Gpio.ResourceLength = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.Flags; ++ Descriptor->Gpio.Flags = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.IntFlags; ++ Descriptor->Gpio.IntFlags = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.DriveStrength; ++ Descriptor->Gpio.DriveStrength = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.DebounceTimeout; ++ Descriptor->Gpio.DebounceTimeout = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.PinTableOffset; ++ Descriptor->Gpio.PinTableOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.ResSourceOffset; ++ Descriptor->Gpio.ResSourceOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.VendorOffset; ++ Descriptor->Gpio.VendorOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->Gpio.VendorLength; ++ Descriptor->Gpio.VendorLength = AcpiUtReadUint16 (&Tmp16); ++ + return (Rnode); + } + +@@ -754,6 +800,8 @@ RsDoI2cSerialBusDescriptor ( + UINT16 DescriptorSize; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -781,7 +829,8 @@ RsDoI2cSerialBusDescriptor ( + Descriptor->I2cSerialBus.RevisionId = AML_RESOURCE_I2C_REVISION; + Descriptor->I2cSerialBus.TypeRevisionId = AML_RESOURCE_I2C_TYPE_REVISION; + Descriptor->I2cSerialBus.Type = AML_RESOURCE_I2C_SERIALBUSTYPE; +- Descriptor->I2cSerialBus.TypeDataLength = AML_RESOURCE_I2C_MIN_DATA_LEN + VendorLength; ++ Tmp16 = AML_RESOURCE_I2C_MIN_DATA_LEN + VendorLength; ++ Descriptor->I2cSerialBus.TypeDataLength = AcpiUtReadUint16 (&Tmp16); + + if (Info->DescriptorTypeOp->Asl.ParseOpcode == PARSEOP_I2C_SERIALBUS_V2) + { +@@ -795,13 +844,15 @@ RsDoI2cSerialBusDescriptor ( + + /* Process all child initialization nodes */ + ++ Descriptor->I2cSerialBus.TypeSpecificFlags = 0; + for (i = 0; InitializerOp; i++) + { + switch (i) + { + case 0: /* Slave Address [WORD] (_ADR) */ + +- Descriptor->I2cSerialBus.SlaveAddress = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->I2cSerialBus.SlaveAddress = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS, + CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.SlaveAddress)); + break; +@@ -815,16 +866,19 @@ RsDoI2cSerialBusDescriptor ( + + case 2: /* Connection Speed [DWORD] (_SPE) */ + +- Descriptor->I2cSerialBus.ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->I2cSerialBus.ConnectionSpeed = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED, + CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.ConnectionSpeed)); + break; + + case 3: /* Addressing Mode [Flag] (_MOD) */ + +- RsSetFlagBits16 (&Descriptor->I2cSerialBus.TypeSpecificFlags, InitializerOp, 0, 0); ++ Tmp16 = AcpiUtReadUint16 (&Descriptor->I2cSerialBus.TypeSpecificFlags); ++ RsSetFlagBits16 (&Tmp16, InitializerOp, 0, 0); + RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE, + CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.TypeSpecificFlags), 0); ++ Descriptor->I2cSerialBus.TypeSpecificFlags = AcpiUtReadUint16 (&Tmp16); + break; + + case 4: /* ResSource [Optional Field - STRING] */ +@@ -882,6 +936,8 @@ RsDoI2cSerialBusDescriptor ( + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); + } + ++ Tmp16 = Descriptor->I2cSerialBus.ResourceLength; ++ Descriptor->I2cSerialBus.ResourceLength = AcpiUtReadUint16 (&Tmp16); + MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource); + return (Rnode); + } +@@ -913,6 +969,8 @@ RsDoSpiSerialBusDescriptor ( + UINT16 DescriptorSize; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -935,12 +993,13 @@ RsDoSpiSerialBusDescriptor ( + sizeof (AML_RESOURCE_LARGE_HEADER)); + + Descriptor = Rnode->Buffer; +- Descriptor->SpiSerialBus.ResourceLength = DescriptorSize; ++ Descriptor->SpiSerialBus.ResourceLength = AcpiUtReadUint16 (&DescriptorSize); + Descriptor->SpiSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS; + Descriptor->SpiSerialBus.RevisionId = AML_RESOURCE_SPI_REVISION; + Descriptor->SpiSerialBus.TypeRevisionId = AML_RESOURCE_SPI_TYPE_REVISION; + Descriptor->SpiSerialBus.Type = AML_RESOURCE_SPI_SERIALBUSTYPE; +- Descriptor->SpiSerialBus.TypeDataLength = AML_RESOURCE_SPI_MIN_DATA_LEN + VendorLength; ++ Tmp16 = AML_RESOURCE_SPI_MIN_DATA_LEN + VendorLength; ++ Descriptor->SpiSerialBus.TypeDataLength = AcpiUtReadUint16 (&Tmp16); + + if (Info->DescriptorTypeOp->Asl.ParseOpcode == PARSEOP_SPI_SERIALBUS_V2) + { +@@ -955,29 +1014,35 @@ RsDoSpiSerialBusDescriptor ( + + /* Process all child initialization nodes */ + ++ Descriptor->SpiSerialBus.TypeSpecificFlags = 0; + for (i = 0; InitializerOp; i++) + { + switch (i) + { + case 0: /* Device Selection [WORD] (_ADR) */ + +- Descriptor->SpiSerialBus.DeviceSelection = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->SpiSerialBus.DeviceSelection = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS, + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.DeviceSelection)); + break; + + case 1: /* Device Polarity [Flag] (_DPL) */ + +- RsSetFlagBits16 (&Descriptor->SpiSerialBus.TypeSpecificFlags, InitializerOp, 1, 0); ++ Tmp16 = AcpiUtReadUint16 (&Descriptor->SpiSerialBus.TypeSpecificFlags); ++ RsSetFlagBits16 (&Tmp16, InitializerOp, 1, 0); + RsCreateBitField (InitializerOp, ACPI_RESTAG_DEVICEPOLARITY, + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 1); ++ Descriptor->SpiSerialBus.TypeSpecificFlags = AcpiUtReadUint16 (&Tmp16); + break; + + case 2: /* Wire Mode [Flag] (_MOD) */ + +- RsSetFlagBits16 (&Descriptor->SpiSerialBus.TypeSpecificFlags, InitializerOp, 0, 0); ++ Tmp16 = AcpiUtReadUint16 (&Descriptor->SpiSerialBus.TypeSpecificFlags); ++ RsSetFlagBits16 (&Tmp16, InitializerOp, 0, 0); + RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE, + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 0); ++ Descriptor->SpiSerialBus.TypeSpecificFlags = AcpiUtReadUint16 (&Tmp16); + break; + + case 3: /* Device Bit Length [BYTE] (_LEN) */ +@@ -996,7 +1061,8 @@ RsDoSpiSerialBusDescriptor ( + + case 5: /* Connection Speed [DWORD] (_SPE) */ + +- Descriptor->SpiSerialBus.ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->SpiSerialBus.ConnectionSpeed = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED, + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ConnectionSpeed)); + break; +@@ -1101,6 +1167,8 @@ RsDoUartSerialBusDescriptor ( + UINT16 DescriptorSize; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; +@@ -1123,12 +1191,13 @@ RsDoUartSerialBusDescriptor ( + sizeof (AML_RESOURCE_LARGE_HEADER)); + + Descriptor = Rnode->Buffer; +- Descriptor->UartSerialBus.ResourceLength = DescriptorSize; ++ Descriptor->UartSerialBus.ResourceLength = AcpiUtReadUint16 (&DescriptorSize); + Descriptor->UartSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS; + Descriptor->UartSerialBus.RevisionId = AML_RESOURCE_UART_REVISION; + Descriptor->UartSerialBus.TypeRevisionId = AML_RESOURCE_UART_TYPE_REVISION; + Descriptor->UartSerialBus.Type = AML_RESOURCE_UART_SERIALBUSTYPE; +- Descriptor->UartSerialBus.TypeDataLength = AML_RESOURCE_UART_MIN_DATA_LEN + VendorLength; ++ Tmp16 = AML_RESOURCE_UART_MIN_DATA_LEN + VendorLength; ++ Descriptor->UartSerialBus.TypeDataLength = AcpiUtReadUint16 (&Tmp16); + + if (Info->DescriptorTypeOp->Asl.ParseOpcode == PARSEOP_UART_SERIALBUS_V2) + { +@@ -1142,29 +1211,35 @@ RsDoUartSerialBusDescriptor ( + + /* Process all child initialization nodes */ + ++ Descriptor->UartSerialBus.TypeSpecificFlags = 0; + for (i = 0; InitializerOp; i++) + { + switch (i) + { + case 0: /* Connection Speed (Baud Rate) [DWORD] (_SPE) */ + +- Descriptor->UartSerialBus.DefaultBaudRate = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->UartSerialBus.DefaultBaudRate = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED, + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.DefaultBaudRate)); + break; + + case 1: /* Bits Per Byte [Flags] (_LEN) */ + +- RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 4, 3); ++ Tmp16 = AcpiUtReadUint16 (&Descriptor->UartSerialBus.TypeSpecificFlags); ++ RsSetFlagBits16 (&Tmp16, InitializerOp, 4, 3); + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_LENGTH, + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 4, 3); ++ Descriptor->UartSerialBus.TypeSpecificFlags = AcpiUtReadUint16 (&Tmp16);; + break; + + case 2: /* Stop Bits [Flags] (_STB) */ + +- RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 2, 1); ++ Tmp16 = AcpiUtReadUint16 (&Descriptor->UartSerialBus.TypeSpecificFlags); ++ RsSetFlagBits16 (&Tmp16, InitializerOp, 2, 1); + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_STOPBITS, + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 2, 2); ++ Descriptor->UartSerialBus.TypeSpecificFlags = AcpiUtReadUint16 (&Tmp16);; + break; + + case 3: /* Lines In Use [BYTE] (_LIN) */ +@@ -1176,9 +1251,11 @@ RsDoUartSerialBusDescriptor ( + + case 4: /* Endianness [Flag] (_END) */ + +- RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 7, 0); ++ Tmp16 = AcpiUtReadUint16 (&Descriptor->UartSerialBus.TypeSpecificFlags); ++ RsSetFlagBits16 (&Tmp16, InitializerOp, 7, 0); + RsCreateBitField (InitializerOp, ACPI_RESTAG_ENDIANNESS, + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 7); ++ Descriptor->UartSerialBus.TypeSpecificFlags = AcpiUtReadUint16 (&Tmp16);; + break; + + case 5: /* Parity [BYTE] (_PAR) */ +@@ -1190,21 +1267,25 @@ RsDoUartSerialBusDescriptor ( + + case 6: /* Flow Control [Flags] (_FLC) */ + +- RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 0, 0); ++ Tmp16 = AcpiUtReadUint16 (&Descriptor->UartSerialBus.TypeSpecificFlags); ++ RsSetFlagBits16 (&Tmp16, InitializerOp, 0, 0); + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_FLOWCONTROL, + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 0, 2); ++ Descriptor->UartSerialBus.TypeSpecificFlags = AcpiUtReadUint16 (&Tmp16);; + break; + + case 7: /* Rx Buffer Size [WORD] (_RXL) */ + +- Descriptor->UartSerialBus.RxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->UartSerialBus.RxFifoSize = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_RX, + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.RxFifoSize)); + break; + + case 8: /* Tx Buffer Size [WORD] (_TXL) */ + +- Descriptor->UartSerialBus.TxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->UartSerialBus.TxFifoSize = AcpiUtReadUint16 (&Tmp16); + RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_TX, + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TxFifoSize)); + break; +@@ -1444,6 +1525,7 @@ RsDoPinFunctionDescriptor ( + UINT32 CurrentByteOffset; + UINT32 PinCount = 0; + UINT32 i; ++ UINT16 Tmp16; + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; + CurrentByteOffset = Info->CurrentByteOffset; +@@ -1467,7 +1549,7 @@ RsDoPinFunctionDescriptor ( + sizeof (AML_RESOURCE_LARGE_HEADER)); + + Descriptor = Rnode->Buffer; +- Descriptor->PinFunction.ResourceLength = DescriptorSize; ++ Descriptor->PinFunction.ResourceLength = AcpiUtReadUint16 (&DescriptorSize); + Descriptor->PinFunction.DescriptorType = ACPI_RESOURCE_NAME_PIN_FUNCTION; + Descriptor->PinFunction.RevisionId = AML_RESOURCE_PIN_FUNCTION_REVISION; + +@@ -1507,7 +1589,8 @@ RsDoPinFunctionDescriptor ( + + case 2: /* Function Number [WORD] (_FUN) */ + +- Descriptor->PinFunction.FunctionNumber = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->PinFunction.FunctionNumber = AcpiUtReadUint16 (&Tmp16); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_FUNCTION, + CurrentByteOffset + ASL_RESDESC_OFFSET (PinFunction.FunctionNumber)); + break; +@@ -1555,6 +1638,12 @@ RsDoPinFunctionDescriptor ( + { + Descriptor->PinFunction.VendorLength = VendorLength; + } ++ Tmp16 = (UINT16) ACPI_PTR_DIFF (VendorData, Descriptor); ++ Descriptor->PinFunction.VendorOffset = AcpiUtReadUint16 (&Tmp16); ++ ++ Tmp16 = Descriptor->PinFunction.VendorLength; ++ Descriptor->PinFunction.VendorLength = AcpiUtReadUint16 (&Tmp16); ++ + break; + + default: +@@ -1566,7 +1655,8 @@ RsDoPinFunctionDescriptor ( + * (implies resource source must immediately follow the pin list.) + * Name: _PIN + */ +- *PinList = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ *PinList = AcpiUtReadUint16 (&Tmp16); + PinList++; + PinCount++; + +@@ -1597,6 +1687,13 @@ RsDoPinFunctionDescriptor ( + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); + } + ++ /* correct the endian-ness of the values */ ++ Tmp16 = Descriptor->PinFunction.PinTableOffset; ++ Descriptor->PinFunction.PinTableOffset = AcpiUtReadUint16 (&Tmp16); ++ ++ Tmp16 = Descriptor->PinFunction.ResSourceOffset; ++ Descriptor->PinFunction.ResSourceOffset = AcpiUtReadUint16 (&Tmp16); ++ + return (Rnode); + } + +@@ -1630,6 +1727,8 @@ RsDoPinConfigDescriptor ( + UINT32 CurrentByteOffset; + UINT32 PinCount = 0; + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; + CurrentByteOffset = Info->CurrentByteOffset; +@@ -1653,7 +1752,7 @@ RsDoPinConfigDescriptor ( + sizeof (AML_RESOURCE_LARGE_HEADER)); + + Descriptor = Rnode->Buffer; +- Descriptor->PinConfig.ResourceLength = DescriptorSize; ++ Descriptor->PinConfig.ResourceLength = AcpiUtReadUint16 (&DescriptorSize); + Descriptor->PinConfig.DescriptorType = ACPI_RESOURCE_NAME_PIN_CONFIG; + Descriptor->PinConfig.RevisionId = AML_RESOURCE_PIN_CONFIG_REVISION; + +@@ -1707,7 +1806,8 @@ RsDoPinConfigDescriptor ( + + case 2: /* Pin Config Value [DWORD] (_VAL) */ + +- Descriptor->PinConfig.PinConfigValue = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->PinConfig.PinConfigValue = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_PINCONFIG_VALUE, + CurrentByteOffset + ASL_RESDESC_OFFSET (PinConfig.PinConfigValue)); + break; +@@ -1766,7 +1866,8 @@ RsDoPinConfigDescriptor ( + * (implies resource source must immediately follow the pin list.) + * Name: _PIN + */ +- *PinList = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ *PinList = AcpiUtReadUint16 (&Tmp16); + PinList++; + PinCount++; + +@@ -1797,6 +1898,16 @@ RsDoPinConfigDescriptor ( + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); + } + ++ /* correct the endianness if needed */ ++ Tmp16 = Descriptor->PinConfig.PinTableOffset; ++ Descriptor->PinConfig.PinTableOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinConfig.ResSourceOffset; ++ Descriptor->PinConfig.ResSourceOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinConfig.VendorOffset; ++ Descriptor->PinConfig.VendorOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinConfig.VendorLength; ++ Descriptor->PinConfig.VendorLength = AcpiUtReadUint16 (&Tmp16); ++ + return (Rnode); + } + +@@ -1830,6 +1941,7 @@ RsDoPinGroupDescriptor ( + UINT32 CurrentByteOffset; + UINT32 PinCount = 0; + UINT32 i; ++ UINT16 Tmp16; + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; + CurrentByteOffset = Info->CurrentByteOffset; +@@ -1853,7 +1965,7 @@ RsDoPinGroupDescriptor ( + sizeof (AML_RESOURCE_LARGE_HEADER)); + + Descriptor = Rnode->Buffer; +- Descriptor->PinGroup.ResourceLength = DescriptorSize; ++ Descriptor->PinGroup.ResourceLength = AcpiUtReadUint16 (&DescriptorSize); + Descriptor->PinGroup.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP; + Descriptor->PinGroup.RevisionId = AML_RESOURCE_PIN_GROUP_REVISION; + +@@ -1920,7 +2032,8 @@ RsDoPinGroupDescriptor ( + * (implies resource source must immediately follow the pin list.) + * Name: _PIN + */ +- *PinList = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ *PinList = AcpiUtReadUint16 (&Tmp16); + PinList++; + PinCount++; + +@@ -1951,6 +2064,16 @@ RsDoPinGroupDescriptor ( + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); + } + ++ /* correct enddianness as needed */ ++ Tmp16 = Descriptor->PinGroup.PinTableOffset; ++ Descriptor->PinGroup.PinTableOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroup.LabelOffset; ++ Descriptor->PinGroup.LabelOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroup.VendorOffset; ++ Descriptor->PinGroup.VendorOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroup.VendorLength; ++ Descriptor->PinGroup.VendorLength = AcpiUtReadUint16 (&Tmp16); ++ + return (Rnode); + } + +@@ -1983,6 +2106,7 @@ RsDoPinGroupFunctionDescriptor ( + UINT16 DescriptorSize; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; + CurrentByteOffset = Info->CurrentByteOffset; +@@ -2006,7 +2130,7 @@ RsDoPinGroupFunctionDescriptor ( + sizeof (AML_RESOURCE_LARGE_HEADER)); + + Descriptor = Rnode->Buffer; +- Descriptor->PinGroupFunction.ResourceLength = DescriptorSize; ++ Descriptor->PinGroupFunction.ResourceLength = AcpiUtReadUint16 (&DescriptorSize); + Descriptor->PinGroupFunction.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION; + Descriptor->PinGroupFunction.RevisionId = AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION; + +@@ -2038,7 +2162,8 @@ RsDoPinGroupFunctionDescriptor ( + + case 1: /* Function Number [WORD] */ + +- Descriptor->PinGroupFunction.FunctionNumber = (UINT16) InitializerOp->Asl.Value.Integer; ++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer; ++ Descriptor->PinGroupFunction.FunctionNumber = AcpiUtReadUint16 (&Tmp16); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_FUNCTION, + CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupFunction.FunctionNumber)); + break; +@@ -2097,6 +2222,16 @@ RsDoPinGroupFunctionDescriptor ( + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); + } + ++ /* correct enddianness as needed */ ++ Tmp16 = Descriptor->PinGroupFunction.ResSourceOffset; ++ Descriptor->PinGroupFunction.ResSourceOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroupFunction.ResSourceLabelOffset; ++ Descriptor->PinGroupFunction.ResSourceLabelOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroupFunction.VendorOffset; ++ Descriptor->PinGroupFunction.VendorOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroupFunction.VendorLength; ++ Descriptor->PinGroupFunction.VendorLength = AcpiUtReadUint16 (&Tmp16); ++ + return (Rnode); + } + +@@ -2129,6 +2264,8 @@ RsDoPinGroupConfigDescriptor ( + UINT16 DescriptorSize; + UINT32 CurrentByteOffset; + UINT32 i; ++ UINT16 Tmp16; ++ UINT32 Tmp32; + + InitializerOp = Info->DescriptorTypeOp->Asl.Child; + CurrentByteOffset = Info->CurrentByteOffset; +@@ -2152,7 +2289,7 @@ RsDoPinGroupConfigDescriptor ( + sizeof (AML_RESOURCE_LARGE_HEADER)); + + Descriptor = Rnode->Buffer; +- Descriptor->PinGroupConfig.ResourceLength = DescriptorSize; ++ Descriptor->PinGroupConfig.ResourceLength = AcpiUtReadUint16 (&DescriptorSize); + Descriptor->PinGroupConfig.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG; + Descriptor->PinGroupConfig.RevisionId = AML_RESOURCE_PIN_GROUP_CONFIG_REVISION; + +@@ -2205,7 +2342,8 @@ RsDoPinGroupConfigDescriptor ( + + case 2: /* Pin Config Value [DWORD] (_VAL) */ + +- Descriptor->PinGroupConfig.PinConfigValue = (UINT32) InitializerOp->Asl.Value.Integer; ++ Tmp32 = (UINT32) InitializerOp->Asl.Value.Integer; ++ Descriptor->PinGroupConfig.PinConfigValue = AcpiUtReadUint32 (&Tmp32); + RsCreateDwordField (InitializerOp, ACPI_RESTAG_PINCONFIG_VALUE, + CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupConfig.PinConfigValue)); + break; +@@ -2266,5 +2404,15 @@ RsDoPinGroupConfigDescriptor ( + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); + } + ++ /* correct enddianness as needed */ ++ Tmp16 = Descriptor->PinGroupConfig.ResSourceOffset; ++ Descriptor->PinGroupConfig.ResSourceOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroupConfig.ResSourceLabelOffset; ++ Descriptor->PinGroupConfig.ResSourceLabelOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroupConfig.VendorOffset; ++ Descriptor->PinGroupConfig.VendorOffset = AcpiUtReadUint16 (&Tmp16); ++ Tmp16 = Descriptor->PinGroupConfig.VendorLength; ++ Descriptor->PinGroupConfig.VendorLength = AcpiUtReadUint16 (&Tmp16); ++ + return (Rnode); + } diff --git a/SOURCES/0044-Initial-support-for-WPBT-in-big-endian-needs-more.patch b/SOURCES/0044-Initial-support-for-WPBT-in-big-endian-needs-more.patch new file mode 100644 index 0000000..1a2b1a2 --- /dev/null +++ b/SOURCES/0044-Initial-support-for-WPBT-in-big-endian-needs-more.patch @@ -0,0 +1,23 @@ +From bd137d3712e6bc7e4d2d11350a208a36750e4063 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 6 Jul 2021 18:26:41 -0600 +Subject: [PATCH 44/45] Initial support for WPBT in big-endian, needs more + +Signed-off-by: Al Stone +--- + source/compiler/dttable2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -2638,7 +2638,7 @@ DtCompileWpbt ( + AcpiUtWriteUint (&Length, sizeof (UINT16), + &Subtable->TotalLength, sizeof (UINT32)); + Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer); +- Table->ArgumentsLength = Length; ++ Table->ArgumentsLength = AcpiUtReadUint16 (&Length); + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); diff --git a/SOURCES/0045-CSRT-fixed-use-of-optional-ResourceInfo.patch b/SOURCES/0045-CSRT-fixed-use-of-optional-ResourceInfo.patch new file mode 100644 index 0000000..45bfbb5 --- /dev/null +++ b/SOURCES/0045-CSRT-fixed-use-of-optional-ResourceInfo.patch @@ -0,0 +1,213 @@ +From 0d87ee42adda7837bec3cc0ff86e40c2f2e8dc4f Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Fri, 9 Jul 2021 14:52:55 -0600 +Subject: [PATCH 45/45] CSRT: fixed use of optional ResourceInfo + +In a resource sub-sub-table, there may be a ResourceInfo entry. Neither +the compiler nor disassembler accounted for that possibility properly. + +Signed-off-by: Al Stone +--- + source/common/dmtbdump1.c | 43 +++++++++++++++++++++----------------- + source/compiler/dttable1.c | 28 +++++++++++++------------ + 2 files changed, 39 insertions(+), 32 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump1.c ++++ acpica-unix2-20210604/source/common/dmtbdump1.c +@@ -374,11 +374,13 @@ AcpiDmDumpCsrt ( + ACPI_CSRT_GROUP *Subtable; + ACPI_CSRT_SHARED_INFO *SharedInfoTable; + ACPI_CSRT_DESCRIPTOR *SubSubtable; +- UINT32 Length = AcpiUtReadUint32 (&Table->Length); ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_CSRT); + UINT32 SubOffset; + UINT32 SubSubOffset; + UINT32 InfoLength; ++ UINT32 SubtableLength; ++ UINT32 SubSubtableLength; + + + /* The main table only contains the ACPI header, thus already handled */ +@@ -386,13 +388,14 @@ AcpiDmDumpCsrt ( + /* Subtables (Resource Groups) */ + + Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); +- while (Offset < Length) ++ while (Offset < TableLength) + { + /* Resource group subtable */ + ++ SubtableLength = AcpiUtReadUint32 (&Subtable->Length); + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Length, Offset, Subtable, +- Subtable->Length, AcpiDmTableInfoCsrt0); ++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable, ++ SubtableLength, AcpiDmTableInfoCsrt0); + if (ACPI_FAILURE (Status)) + { + return; +@@ -405,26 +408,28 @@ AcpiDmDumpCsrt ( + Offset + SubOffset); + + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable, +- sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1); ++ Status = AcpiDmDumpTable (TableLength, Offset + SubOffset, ++ SharedInfoTable, sizeof (ACPI_CSRT_SHARED_INFO), ++ AcpiDmTableInfoCsrt1); + if (ACPI_FAILURE (Status)) + { + return; + } + +- SubOffset += Subtable->SharedInfoLength; ++ SubOffset += AcpiUtReadUint32 (&Subtable->SharedInfoLength); + + /* Sub-Subtables (Resource Descriptors) */ + + SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table, + Offset + SubOffset); + +- while ((SubOffset < Subtable->Length) && +- ((Offset + SubOffset) < Length)) ++ while ((SubOffset < SubtableLength) && ++ ((Offset + SubOffset) < TableLength)) + { ++ SubSubtableLength = AcpiUtReadUint32 (&SubSubtable->Length); + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable, +- SubSubtable->Length, AcpiDmTableInfoCsrt2); ++ Status = AcpiDmDumpTable (TableLength, Offset + SubOffset, ++ SubSubtable, SubSubtableLength, AcpiDmTableInfoCsrt2); + if (ACPI_FAILURE (Status)) + { + return; +@@ -434,11 +439,12 @@ AcpiDmDumpCsrt ( + + /* Resource-specific info buffer */ + +- InfoLength = SubSubtable->Length - SubSubOffset; ++ InfoLength = SubSubtableLength - SubSubOffset; + if (InfoLength) + { +- Status = AcpiDmDumpTable (Length, +- Offset + SubOffset + SubSubOffset, Table, ++ Status = AcpiDmDumpTable (TableLength, ++ Offset + SubOffset + SubSubOffset, ++ (UINT8 *)SubSubtable + SubSubOffset, + InfoLength, AcpiDmTableInfoCsrt2a); + if (ACPI_FAILURE (Status)) + { +@@ -448,16 +454,15 @@ AcpiDmDumpCsrt ( + + /* Point to next sub-subtable */ + +- SubOffset += SubSubtable->Length; ++ SubOffset += SubSubtableLength; + SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable, +- SubSubtable->Length); ++ SubSubtableLength); + } + + /* Point to next subtable */ + +- Offset += Subtable->Length; +- Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable, +- Subtable->Length); ++ Offset += SubtableLength; ++ Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable, SubtableLength); + } + } + +Index: acpica-unix2-20210604/source/compiler/dttable1.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable1.c ++++ acpica-unix2-20210604/source/compiler/dttable1.c +@@ -353,14 +353,16 @@ DtCompileCsrt ( + DT_SUBTABLE *Subtable; + DT_SUBTABLE *ParentTable; + DT_FIELD **PFieldList = (DT_FIELD **) List; +- UINT32 DescriptorCount; ++ UINT32 DescriptorLength; + UINT32 GroupLength; + UINT32 Tmp; ++ UINT32 Offset; + + + /* Subtables (Resource Groups) */ + + ParentTable = DtPeekSubtable (); ++ + while (*PFieldList) + { + /* Resource group subtable */ +@@ -375,16 +377,13 @@ DtCompileCsrt ( + /* Compute the number of resource descriptors */ + + Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP, +- Subtable->Buffer))->Length); ++ Subtable->Buffer))->Length); + GroupLength = Tmp; + Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP, +- Subtable->Buffer))->SharedInfoLength); ++ Subtable->Buffer))->SharedInfoLength); + GroupLength -= Tmp; + GroupLength -= sizeof (ACPI_CSRT_GROUP); + +- DescriptorCount = (GroupLength / +- sizeof (ACPI_CSRT_DESCRIPTOR)); +- + DtInsertSubtable (ParentTable, Subtable); + DtPushSubtable (Subtable); + ParentTable = DtPeekSubtable (); +@@ -399,10 +398,13 @@ DtCompileCsrt ( + } + + DtInsertSubtable (ParentTable, Subtable); ++ DtPushSubtable (Subtable); ++ ParentTable = DtPeekSubtable (); + + /* Sub-Subtables (Resource Descriptors) */ + +- while (*PFieldList && DescriptorCount) ++ Offset = 0; ++ while (*PFieldList && (Offset < GroupLength)) + { + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2, +@@ -411,6 +413,10 @@ DtCompileCsrt ( + { + return (Status); + } ++ DescriptorLength = AcpiUtReadUint32 ( ++ &(ACPI_CAST_PTR (ACPI_CSRT_GROUP, ++ Subtable->Buffer))->Length); ++ + + DtInsertSubtable (ParentTable, Subtable); + +@@ -420,11 +426,7 @@ DtCompileCsrt ( + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a, + &Subtable); +- if (ACPI_FAILURE (Status)) +- { +- return (Status); +- } +- if (Subtable) ++ if (ACPI_SUCCESS (Status) && Subtable) + { + DtInsertSubtable (ParentTable, Subtable); + } +@@ -432,7 +434,7 @@ DtCompileCsrt ( + + DtPopSubtable (); + ParentTable = DtPeekSubtable (); +- DescriptorCount--; ++ Offset += DescriptorLength; + } + + DtPopSubtable (); diff --git a/SOURCES/0046-Support-PHAT-in-a-big-endian-world.patch b/SOURCES/0046-Support-PHAT-in-a-big-endian-world.patch new file mode 100644 index 0000000..011e519 --- /dev/null +++ b/SOURCES/0046-Support-PHAT-in-a-big-endian-world.patch @@ -0,0 +1,180 @@ +From 5fd729c8f6c4ce295edd142fc41e03e831ba4afb Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Mon, 12 Jul 2021 09:39:38 -0600 +Subject: [PATCH] Support PHAT in a big-endian world + +Signed-off-by: Al Stone +--- + source/common/dmtbdump2.c | 36 ++++++++++++++++++++---------------- + source/compiler/dttable2.c | 12 +++++++++--- + 2 files changed, 29 insertions(+), 19 deletions(-) + +Index: acpica-unix2-20210604/source/common/dmtbdump2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/common/dmtbdump2.c ++++ acpica-unix2-20210604/source/common/dmtbdump2.c +@@ -1573,39 +1573,41 @@ AcpiDmDumpPhat ( + ACPI_PHAT_HEADER *Subtable; + ACPI_PHAT_VERSION_DATA *VersionData; + UINT32 RecordCount; +- UINT32 Length = Table->Length; ++ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); + UINT32 Offset = sizeof (ACPI_TABLE_PHAT); +- UINT32 SubtableLength; ++ UINT16 SubtableLength; + UINT32 PathLength; + UINT32 VendorLength; ++ UINT16 SubtableType; + + + Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT)); + +- while (Offset < Table->Length) ++ while (Offset < TableLength) + { + /* Common subtable header */ + ++ SubtableType = AcpiUtReadUint16 (&Subtable->Type); ++ SubtableLength = AcpiUtReadUint16 (&Subtable->Length); ++ + AcpiOsPrintf ("\n"); +- Status = AcpiDmDumpTable (Length, 0, Subtable, ++ Status = AcpiDmDumpTable (TableLength, 0, Subtable, + sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr); + if (ACPI_FAILURE (Status)) + { + return; + } + +- switch (Subtable->Type) ++ switch (SubtableType) + { + case ACPI_PHAT_TYPE_FW_VERSION_DATA: + + InfoTable = AcpiDmTableInfoPhat0; +- SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA); + break; + + case ACPI_PHAT_TYPE_FW_HEALTH_DATA: + + InfoTable = AcpiDmTableInfoPhat1; +- SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA); + break; + + default: +@@ -1616,22 +1618,22 @@ AcpiDmDumpPhat ( + return; + } + +- Status = AcpiDmDumpTable (Length, 0, Subtable, ++ Status = AcpiDmDumpTable (TableLength, 0, Subtable, + SubtableLength, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; + } + +- switch (Subtable->Type) ++ switch (SubtableType) + { + case ACPI_PHAT_TYPE_FW_VERSION_DATA: + + VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable); +- RecordCount = VersionData->ElementCount; ++ RecordCount = AcpiUtReadUint32 (&VersionData->ElementCount); + while (RecordCount) + { +- Status = AcpiDmDumpTable (Length, Offset, ++ Status = AcpiDmDumpTable (TableLength, Offset, + ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)), + sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a); + if (ACPI_FAILURE (Status)) +@@ -1649,7 +1651,7 @@ AcpiDmDumpPhat ( + /* account for the null terminator */ + + PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1; +- Status = AcpiDmDumpTable (Length, Offset, ++ Status = AcpiDmDumpTable (TableLength, Offset, + ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)), + PathLength, AcpiDmTableInfoPhat1a); + if (ACPI_FAILURE (Status)) +@@ -1660,8 +1662,8 @@ AcpiDmDumpPhat ( + /* Get vendor data - data length is the remaining subtable length */ + + VendorLength = +- Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; +- Status = AcpiDmDumpTable (Length, 0, ++ SubtableLength - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; ++ Status = AcpiDmDumpTable (TableLength, 0, + ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength), + VendorLength, AcpiDmTableInfoPhat1b); + if (ACPI_FAILURE (Status)) +@@ -1673,15 +1675,15 @@ AcpiDmDumpPhat ( + default: + + AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n", +- Subtable->Type); ++ SubtableType); + return; + } + + /* Next subtable */ + +- Offset += Subtable->Length; ++ Offset += SubtableLength; + Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, +- Subtable->Length); ++ SubtableLength); + } + } + +Index: acpica-unix2-20210604/source/compiler/dttable2.c +=================================================================== +--- acpica-unix2-20210604.orig/source/compiler/dttable2.c ++++ acpica-unix2-20210604/source/compiler/dttable2.c +@@ -870,6 +870,8 @@ DtCompilePhat ( + ACPI_DMTABLE_INFO *Info; + ACPI_PHAT_VERSION_DATA *VersionData; + UINT32 RecordCount; ++ UINT16 SubtableType; ++ UINT16 Tmp16; + + + /* The table consist of subtables */ +@@ -887,8 +889,9 @@ DtCompilePhat ( + DtPushSubtable (Subtable); + + PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer); ++ SubtableType = AcpiUtReadUint16 (&PhatHeader->Type); + +- switch (PhatHeader->Type) ++ switch (SubtableType) + { + case ACPI_PHAT_TYPE_FW_VERSION_DATA: + +@@ -919,13 +922,13 @@ DtCompilePhat ( + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + +- switch (PhatHeader->Type) ++ switch (SubtableType) + { + case ACPI_PHAT_TYPE_FW_VERSION_DATA: + + VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, + (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER))); +- RecordCount = VersionData->ElementCount; ++ RecordCount = AcpiUtReadUint32 (&VersionData->ElementCount); + + while (RecordCount) + { +@@ -976,6 +979,9 @@ DtCompilePhat ( + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); + return (AE_ERROR); + } ++ ++ Tmp16 = AcpiUtReadUint16 (&PhatHeader->Length); ++ PhatHeader->Length = Tmp16; + } + + return (Status); diff --git a/SOURCES/COPYING b/SOURCES/COPYING new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/SOURCES/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/SOURCES/OPT_LDFLAGS.patch b/SOURCES/OPT_LDFLAGS.patch new file mode 100644 index 0000000..de12ce1 --- /dev/null +++ b/SOURCES/OPT_LDFLAGS.patch @@ -0,0 +1,26 @@ +Index: acpica-unix2-20200925/generate/unix/Makefile.config +=================================================================== +--- acpica-unix2-20200925.orig/generate/unix/Makefile.config ++++ acpica-unix2-20200925/generate/unix/Makefile.config +@@ -23,6 +23,9 @@ + # OPT_CFLAGS can be overridden on the make command line by + # adding OPT_CFLAGS="..." to the invocation. + # ++# OPT_LDFLAGS can be overridden on the make command line by ++# adding OPT_LDFLAGS="..." to the invocation. ++# + # Notes: + # gcc should be version 4 or greater, otherwise some of the options + # used will not be recognized. +@@ -164,6 +167,11 @@ LDFLAGS +=-m32 + endif + + # ++# Common linker flags ++# ++OPT_LDFLAGS ?= ++ ++# + # Optionally disable optimizations. Optimization causes problems on + # some compilers such as gcc 4.4 + # diff --git a/SOURCES/README.Fedora b/SOURCES/README.Fedora new file mode 100644 index 0000000..c1c7f25 --- /dev/null +++ b/SOURCES/README.Fedora @@ -0,0 +1,26 @@ +Packaging Notes for Fedora +========================== +The upstream source contains documentation that may or may not be licensed +in a freely redistributable manner. In an excess of caution, the manuals in +question have been removed from the source we start with. You can still get +your own copies of the documentation from here: + + https://www.acpica.org/documentation/ + +The two manuals affected are: + + (1) ACPICA Reference Manual, describing the ACPI Component Architecture + in some detail, and + + (2) ASL Compiler Reference Manual, describing how to use iasl + +While there are man pages for the commands, they are very brief. The +documents above are recommended reading. + + +Test Cases +========== +The aapits tests do not currently build properly. They will be added to +this package once they do. In the meantime, ASL, template and misc tests +will be run as part of %check. + diff --git a/SOURCES/acpibin.1 b/SOURCES/acpibin.1 new file mode 100644 index 0000000..b8448a5 --- /dev/null +++ b/SOURCES/acpibin.1 @@ -0,0 +1,64 @@ +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH ACPIBIN 1 "January 23, 2013" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +acpibin \- ACPI binary AML file utility +.SH SYNOPSIS +.B acpibin +.RI [