]> git.pld-linux.org Git - packages/acpica.git/blob - 0026-Support-NFIT-in-a-big-endian-world.patch
- updated to 20220331 + current Fedora patch set; acpinames is gone
[packages/acpica.git] / 0026-Support-NFIT-in-a-big-endian-world.patch
1 From 5aec8511fc433a71cb8b6d26be464355d0c3f5cc Mon Sep 17 00:00:00 2001
2 From: Al Stone <ahs3@redhat.com>
3 Date: Thu, 24 Sep 2020 15:25:53 -0600
4 Subject: [PATCH 26/45] Support NFIT in a big-endian world
5
6 NB: this required correcting the starting pointer for the NFIT
7 SMBIOS subtable; otherwise, disassembly did not work properly.
8
9 Signed-off-by: Al Stone <ahs3@redhat.com>
10 ---
11  source/common/dmtable.c    |  4 ++--
12  source/common/dmtbdump2.c  | 49 ++++++++++++++++++++++----------------
13  source/compiler/dttable2.c | 11 ++++++---
14  3 files changed, 39 insertions(+), 25 deletions(-)
15
16 Index: acpica-unix2-20220331/source/common/dmtable.c
17 ===================================================================
18 --- acpica-unix2-20220331.orig/source/common/dmtable.c
19 +++ acpica-unix2-20220331/source/common/dmtable.c
20 @@ -1766,13 +1766,13 @@ AcpiDmDumpTable (
21  
22              /* NFIT subtable types */
23  
24 -            Temp16 = ACPI_GET16 (Target);
25 +            Temp16 = AcpiUtReadUint16 (Target);
26              if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
27              {
28                  Temp16 = ACPI_NFIT_TYPE_RESERVED;
29              }
30  
31 -            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
32 +            AcpiOsPrintf (UINT16_FORMAT, Temp16,
33                  AcpiDmNfitSubnames[Temp16]);
34              break;
35  
36 Index: acpica-unix2-20220331/source/common/dmtbdump2.c
37 ===================================================================
38 --- acpica-unix2-20220331.orig/source/common/dmtbdump2.c
39 +++ acpica-unix2-20220331/source/common/dmtbdump2.c
40 @@ -1244,18 +1244,23 @@ AcpiDmDumpNfit (
41      ACPI_STATUS             Status;
42      UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
43      UINT32                  FieldOffset = 0;
44 -    UINT32                  Length;
45 +    UINT32                  TableLength = AcpiUtReadUint32 (&Table->Length);
46      ACPI_NFIT_HEADER        *Subtable;
47      ACPI_DMTABLE_INFO       *InfoTable;
48      ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
49      ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
50      ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
51      UINT32                  i;
52 +    UINT32                  Length;
53 +    UINT32                  LineCount;
54 +    UINT16                  SubtableLength;
55 +    UINT16                  SubtableType;
56 +    UINT16                  HintCount;
57  
58  
59      /* Main table */
60  
61 -    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
62 +    Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNfit);
63      if (ACPI_FAILURE (Status))
64      {
65          return;
66 @@ -1264,19 +1269,21 @@ AcpiDmDumpNfit (
67      /* Subtables */
68  
69      Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
70 -    while (Offset < Table->Length)
71 +    while (Offset < TableLength)
72      {
73          /* NFIT subtable header */
74  
75          AcpiOsPrintf ("\n");
76 -        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
77 -            Subtable->Length, AcpiDmTableInfoNfitHdr);
78 +        SubtableType = AcpiUtReadUint16 (&Subtable->Type);
79 +        SubtableLength = AcpiUtReadUint16 (&Subtable->Length);
80 +        Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
81 +            SubtableLength, AcpiDmTableInfoNfitHdr);
82          if (ACPI_FAILURE (Status))
83          {
84              return;
85          }
86  
87 -        switch (Subtable->Type)
88 +        switch (SubtableType)
89          {
90          case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
91  
92 @@ -1327,11 +1334,11 @@ AcpiDmDumpNfit (
93  
94          default:
95              AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
96 -                Subtable->Type);
97 +                SubtableType);
98  
99              /* Attempt to continue */
100  
101 -            if (!Subtable->Length)
102 +            if (!SubtableLength)
103              {
104                  AcpiOsPrintf ("Invalid zero length subtable\n");
105                  return;
106 @@ -1340,8 +1347,8 @@ AcpiDmDumpNfit (
107          }
108  
109          AcpiOsPrintf ("\n");
110 -        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
111 -            Subtable->Length, InfoTable);
112 +        Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
113 +            SubtableLength, InfoTable);
114          if (ACPI_FAILURE (Status))
115          {
116              return;
117 @@ -1349,14 +1356,15 @@ AcpiDmDumpNfit (
118  
119          /* Per-subtable variable-length fields */
120  
121 -        switch (Subtable->Type)
122 +        switch (SubtableType)
123          {
124          case ACPI_NFIT_TYPE_INTERLEAVE:
125  
126              Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
127 -            for (i = 0; i < Interleave->LineCount; i++)
128 +            LineCount = AcpiUtReadUint32 (&Interleave->LineCount);
129 +            for (i = 0; i < LineCount; i++)
130              {
131 -                Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
132 +                Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset,
133                      &Interleave->LineOffset[i],
134                      sizeof (UINT32), AcpiDmTableInfoNfit2a);
135                  if (ACPI_FAILURE (Status))
136 @@ -1370,14 +1378,14 @@ AcpiDmDumpNfit (
137  
138          case ACPI_NFIT_TYPE_SMBIOS:
139  
140 -            Length = Subtable->Length -
141 +            Length = SubtableLength -
142                  sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
143  
144              if (Length)
145              {
146 -                Status = AcpiDmDumpTable (Table->Length,
147 +                Status = AcpiDmDumpTable (TableLength,
148                      sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
149 -                    SmbiosInfo,
150 +                    SmbiosInfo + Offset,
151                      Length, AcpiDmTableInfoNfit3a);
152                  if (ACPI_FAILURE (Status))
153                  {
154 @@ -1390,9 +1398,10 @@ AcpiDmDumpNfit (
155          case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
156  
157              Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
158 -            for (i = 0; i < Hint->HintCount; i++)
159 +            HintCount = AcpiUtReadUint16 (&Hint->HintCount);
160 +            for (i = 0; i < HintCount; i++)
161              {
162 -                Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
163 +                Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset,
164                      &Hint->HintAddress[i],
165                      sizeof (UINT64), AcpiDmTableInfoNfit6a);
166                  if (ACPI_FAILURE (Status))
167 @@ -1411,8 +1420,8 @@ AcpiDmDumpNfit (
168  NextSubtable:
169          /* Point to next subtable */
170  
171 -        Offset += Subtable->Length;
172 -        Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
173 +        Offset += SubtableLength;
174 +        Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, SubtableLength);
175      }
176  }
177  
178 Index: acpica-unix2-20220331/source/compiler/dttable2.c
179 ===================================================================
180 --- acpica-unix2-20220331.orig/source/compiler/dttable2.c
181 +++ acpica-unix2-20220331/source/compiler/dttable2.c
182 @@ -506,6 +506,7 @@ DtCompileNfit (
183      UINT32                  Count;
184      ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
185      ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
186 +    UINT16                  NfitHeaderType;
187  
188  
189      /* Main table */
190 @@ -539,7 +540,8 @@ DtCompileNfit (
191  
192          NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
193  
194 -        switch (NfitHeader->Type)
195 +        NfitHeaderType = AcpiUtReadUint16 (&NfitHeader->Type);
196 +        switch (NfitHeaderType)
197          {
198          case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
199  
200 @@ -599,7 +601,7 @@ DtCompileNfit (
201          DtInsertSubtable (ParentTable, Subtable);
202          DtPopSubtable ();
203  
204 -        switch (NfitHeader->Type)
205 +        switch (NfitHeaderType)
206          {
207          case ACPI_NFIT_TYPE_INTERLEAVE:
208  
209 @@ -625,7 +627,8 @@ DtCompileNfit (
210                  Count++;
211              }
212  
213 -            Interleave->LineCount = Count;
214 +            AcpiUtWriteUint (&Interleave->LineCount, sizeof (UINT32),
215 +                &Count, sizeof (UINT32));
216              break;
217  
218          case ACPI_NFIT_TYPE_SMBIOS:
219 @@ -671,6 +674,8 @@ DtCompileNfit (
220              }
221  
222              Hint->HintCount = (UINT16) Count;
223 +            AcpiUtWriteUint (&Hint->HintCount, sizeof (UINT16),
224 +                &Count, sizeof (UINT32));
225              break;
226  
227          default:
This page took 0.081743 seconds and 3 git commands to generate.