Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37510525
en ru br
Репозитории ALT

Группа :: Система/Ядро и оборудование
Пакет: acpica

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: 0002-Modify-utility-functions-to-be-endian-agnostic.patch
Скачать


From d0c879747147c24c47bae363359127d62cd0cae1 Mon Sep 17 00:00:00 2001
From: Al Stone <ahs3@redhat.com>
Date: Fri, 18 Sep 2020 15:14:30 -0600
Subject: [PATCH 02/40] 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 <ahs3@redhat.com>
---
 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-20200925/source/common/acfileio.c
===================================================================
--- acpica-unix2-20200925.orig/source/common/acfileio.c
+++ acpica-unix2-20200925/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);
@@ -464,11 +467,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-20200925/source/common/dmtable.c
===================================================================
--- acpica-unix2-20200925.orig/source/common/dmtable.c
+++ acpica-unix2-20200925/source/common/dmtable.c
@@ -534,7 +534,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);
@@ -551,7 +551,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))
         {
@@ -571,7 +571,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))
         {
@@ -1179,7 +1179,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-20200925/source/compiler/dtfield.c
===================================================================
--- acpica-unix2-20200925.orig/source/compiler/dtfield.c
+++ acpica-unix2-20200925/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-20200925/source/compiler/dtsubtable.c
===================================================================
--- acpica-unix2-20200925.orig/source/compiler/dtsubtable.c
+++ acpica-unix2-20200925/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-20200925/source/components/tables/tbprint.c
===================================================================
--- acpica-unix2-20200925.orig/source/components/tables/tbprint.c
+++ acpica-unix2-20200925/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)));
     }
 }
 
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin