dtutils.c revision 1.7.2.1 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: dtutils.c - Utility routines for the data table compiler
4 1.1 jruoho *
5 1.1 jruoho *****************************************************************************/
6 1.1 jruoho
7 1.2 christos /*
8 1.7.2.1 bouyer * Copyright (C) 2000 - 2017, Intel Corp.
9 1.1 jruoho * All rights reserved.
10 1.1 jruoho *
11 1.2 christos * Redistribution and use in source and binary forms, with or without
12 1.2 christos * modification, are permitted provided that the following conditions
13 1.2 christos * are met:
14 1.2 christos * 1. Redistributions of source code must retain the above copyright
15 1.2 christos * notice, this list of conditions, and the following disclaimer,
16 1.2 christos * without modification.
17 1.2 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 1.2 christos * substantially similar to the "NO WARRANTY" disclaimer below
19 1.2 christos * ("Disclaimer") and any redistribution must be conditioned upon
20 1.2 christos * including a substantially similar Disclaimer requirement for further
21 1.2 christos * binary redistribution.
22 1.2 christos * 3. Neither the names of the above-listed copyright holders nor the names
23 1.2 christos * of any contributors may be used to endorse or promote products derived
24 1.2 christos * from this software without specific prior written permission.
25 1.2 christos *
26 1.2 christos * Alternatively, this software may be distributed under the terms of the
27 1.2 christos * GNU General Public License ("GPL") version 2 as published by the Free
28 1.2 christos * Software Foundation.
29 1.2 christos *
30 1.2 christos * NO WARRANTY
31 1.2 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 1.2 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 1.2 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 1.2 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 1.2 christos * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 1.2 christos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 1.2 christos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 1.2 christos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 1.2 christos * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 1.2 christos * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 1.2 christos * POSSIBILITY OF SUCH DAMAGES.
42 1.2 christos */
43 1.1 jruoho
44 1.1 jruoho #include "aslcompiler.h"
45 1.1 jruoho #include "dtcompiler.h"
46 1.1 jruoho #include "actables.h"
47 1.1 jruoho
48 1.1 jruoho #define _COMPONENT DT_COMPILER
49 1.1 jruoho ACPI_MODULE_NAME ("dtutils")
50 1.1 jruoho
51 1.1 jruoho /* Local prototypes */
52 1.1 jruoho
53 1.1 jruoho static void
54 1.1 jruoho DtSum (
55 1.1 jruoho DT_SUBTABLE *Subtable,
56 1.1 jruoho void *Context,
57 1.1 jruoho void *ReturnValue);
58 1.1 jruoho
59 1.1 jruoho
60 1.1 jruoho /******************************************************************************
61 1.1 jruoho *
62 1.1 jruoho * FUNCTION: DtError
63 1.1 jruoho *
64 1.1 jruoho * PARAMETERS: Level - Seriousness (Warning/error, etc.)
65 1.1 jruoho * MessageId - Index into global message buffer
66 1.1 jruoho * Op - Parse node where error happened
67 1.1 jruoho * ExtraMessage - additional error message
68 1.1 jruoho *
69 1.1 jruoho * RETURN: None
70 1.1 jruoho *
71 1.1 jruoho * DESCRIPTION: Common error interface for data table compiler
72 1.1 jruoho *
73 1.1 jruoho *****************************************************************************/
74 1.1 jruoho
75 1.1 jruoho void
76 1.1 jruoho DtError (
77 1.1 jruoho UINT8 Level,
78 1.3 christos UINT16 MessageId,
79 1.1 jruoho DT_FIELD *FieldObject,
80 1.1 jruoho char *ExtraMessage)
81 1.1 jruoho {
82 1.1 jruoho
83 1.2 christos /* Check if user wants to ignore this exception */
84 1.2 christos
85 1.2 christos if (AslIsExceptionDisabled (Level, MessageId))
86 1.1 jruoho {
87 1.2 christos return;
88 1.1 jruoho }
89 1.1 jruoho
90 1.1 jruoho if (FieldObject)
91 1.1 jruoho {
92 1.1 jruoho AslCommonError (Level, MessageId,
93 1.1 jruoho FieldObject->Line,
94 1.1 jruoho FieldObject->Line,
95 1.1 jruoho FieldObject->ByteOffset,
96 1.1 jruoho FieldObject->Column,
97 1.1 jruoho Gbl_Files[ASL_FILE_INPUT].Filename, ExtraMessage);
98 1.1 jruoho }
99 1.1 jruoho else
100 1.1 jruoho {
101 1.1 jruoho AslCommonError (Level, MessageId, 0,
102 1.1 jruoho 0, 0, 0, 0, ExtraMessage);
103 1.1 jruoho }
104 1.1 jruoho }
105 1.1 jruoho
106 1.1 jruoho
107 1.1 jruoho /******************************************************************************
108 1.1 jruoho *
109 1.1 jruoho * FUNCTION: DtNameError
110 1.1 jruoho *
111 1.1 jruoho * PARAMETERS: Level - Seriousness (Warning/error, etc.)
112 1.1 jruoho * MessageId - Index into global message buffer
113 1.1 jruoho * Op - Parse node where error happened
114 1.1 jruoho * ExtraMessage - additional error message
115 1.1 jruoho *
116 1.1 jruoho * RETURN: None
117 1.1 jruoho *
118 1.1 jruoho * DESCRIPTION: Error interface for named objects
119 1.1 jruoho *
120 1.1 jruoho *****************************************************************************/
121 1.1 jruoho
122 1.1 jruoho void
123 1.1 jruoho DtNameError (
124 1.1 jruoho UINT8 Level,
125 1.3 christos UINT16 MessageId,
126 1.1 jruoho DT_FIELD *FieldObject,
127 1.1 jruoho char *ExtraMessage)
128 1.1 jruoho {
129 1.1 jruoho
130 1.1 jruoho switch (Level)
131 1.1 jruoho {
132 1.1 jruoho case ASL_WARNING2:
133 1.1 jruoho case ASL_WARNING3:
134 1.2 christos
135 1.1 jruoho if (Gbl_WarningLevel < Level)
136 1.1 jruoho {
137 1.1 jruoho return;
138 1.1 jruoho }
139 1.1 jruoho break;
140 1.1 jruoho
141 1.1 jruoho default:
142 1.2 christos
143 1.1 jruoho break;
144 1.1 jruoho }
145 1.1 jruoho
146 1.1 jruoho if (FieldObject)
147 1.1 jruoho {
148 1.1 jruoho AslCommonError (Level, MessageId,
149 1.1 jruoho FieldObject->Line,
150 1.1 jruoho FieldObject->Line,
151 1.1 jruoho FieldObject->ByteOffset,
152 1.1 jruoho FieldObject->NameColumn,
153 1.1 jruoho Gbl_Files[ASL_FILE_INPUT].Filename, ExtraMessage);
154 1.1 jruoho }
155 1.1 jruoho else
156 1.1 jruoho {
157 1.1 jruoho AslCommonError (Level, MessageId, 0,
158 1.1 jruoho 0, 0, 0, 0, ExtraMessage);
159 1.1 jruoho }
160 1.1 jruoho }
161 1.1 jruoho
162 1.1 jruoho
163 1.1 jruoho /*******************************************************************************
164 1.1 jruoho *
165 1.1 jruoho * FUNCTION: DtFatal
166 1.1 jruoho *
167 1.1 jruoho * PARAMETERS: None
168 1.1 jruoho *
169 1.1 jruoho * RETURN: None
170 1.1 jruoho *
171 1.1 jruoho * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
172 1.1 jruoho * compile or I/O errors
173 1.1 jruoho *
174 1.1 jruoho ******************************************************************************/
175 1.1 jruoho
176 1.1 jruoho void
177 1.1 jruoho DtFatal (
178 1.3 christos UINT16 MessageId,
179 1.1 jruoho DT_FIELD *FieldObject,
180 1.1 jruoho char *ExtraMessage)
181 1.1 jruoho {
182 1.1 jruoho
183 1.1 jruoho DtError (ASL_ERROR, MessageId, FieldObject, ExtraMessage);
184 1.1 jruoho
185 1.2 christos /*
186 1.2 christos * TBD: remove this entire function, DtFatal
187 1.2 christos *
188 1.2 christos * We cannot abort the compiler on error, because we may be compiling a
189 1.2 christos * list of files. We must move on to the next file.
190 1.2 christos */
191 1.2 christos #ifdef __OBSOLETE
192 1.1 jruoho CmCleanupAndExit ();
193 1.1 jruoho exit (1);
194 1.2 christos #endif
195 1.1 jruoho }
196 1.1 jruoho
197 1.1 jruoho
198 1.1 jruoho /******************************************************************************
199 1.1 jruoho *
200 1.1 jruoho * FUNCTION: DtGetFieldValue
201 1.1 jruoho *
202 1.1 jruoho * PARAMETERS: Field - Current field list pointer
203 1.1 jruoho *
204 1.1 jruoho * RETURN: Field value
205 1.1 jruoho *
206 1.1 jruoho * DESCRIPTION: Get field value
207 1.1 jruoho *
208 1.1 jruoho *****************************************************************************/
209 1.1 jruoho
210 1.1 jruoho char *
211 1.1 jruoho DtGetFieldValue (
212 1.2 christos DT_FIELD *Field)
213 1.1 jruoho {
214 1.2 christos if (!Field)
215 1.1 jruoho {
216 1.2 christos return (NULL);
217 1.1 jruoho }
218 1.1 jruoho
219 1.2 christos return (Field->Value);
220 1.1 jruoho }
221 1.1 jruoho
222 1.1 jruoho
223 1.1 jruoho /******************************************************************************
224 1.1 jruoho *
225 1.1 jruoho * FUNCTION: DtGetFieldType
226 1.1 jruoho *
227 1.1 jruoho * PARAMETERS: Info - Data table info
228 1.1 jruoho *
229 1.1 jruoho * RETURN: Field type
230 1.1 jruoho *
231 1.1 jruoho * DESCRIPTION: Get field type
232 1.1 jruoho *
233 1.1 jruoho *****************************************************************************/
234 1.1 jruoho
235 1.1 jruoho UINT8
236 1.1 jruoho DtGetFieldType (
237 1.1 jruoho ACPI_DMTABLE_INFO *Info)
238 1.1 jruoho {
239 1.1 jruoho UINT8 Type;
240 1.1 jruoho
241 1.1 jruoho
242 1.1 jruoho /* DT_FLAG means that this is the start of a block of flag bits */
243 1.1 jruoho /* TBD - we can make these a separate opcode later */
244 1.1 jruoho
245 1.1 jruoho if (Info->Flags & DT_FLAG)
246 1.1 jruoho {
247 1.1 jruoho return (DT_FIELD_TYPE_FLAGS_INTEGER);
248 1.1 jruoho }
249 1.1 jruoho
250 1.1 jruoho /* Type is based upon the opcode for this field in the info table */
251 1.1 jruoho
252 1.1 jruoho switch (Info->Opcode)
253 1.1 jruoho {
254 1.1 jruoho case ACPI_DMT_FLAG0:
255 1.1 jruoho case ACPI_DMT_FLAG1:
256 1.1 jruoho case ACPI_DMT_FLAG2:
257 1.1 jruoho case ACPI_DMT_FLAG3:
258 1.1 jruoho case ACPI_DMT_FLAG4:
259 1.1 jruoho case ACPI_DMT_FLAG5:
260 1.1 jruoho case ACPI_DMT_FLAG6:
261 1.1 jruoho case ACPI_DMT_FLAG7:
262 1.1 jruoho case ACPI_DMT_FLAGS0:
263 1.2 christos case ACPI_DMT_FLAGS1:
264 1.1 jruoho case ACPI_DMT_FLAGS2:
265 1.2 christos case ACPI_DMT_FLAGS4:
266 1.2 christos
267 1.1 jruoho Type = DT_FIELD_TYPE_FLAG;
268 1.1 jruoho break;
269 1.1 jruoho
270 1.1 jruoho case ACPI_DMT_NAME4:
271 1.1 jruoho case ACPI_DMT_SIG:
272 1.1 jruoho case ACPI_DMT_NAME6:
273 1.1 jruoho case ACPI_DMT_NAME8:
274 1.1 jruoho case ACPI_DMT_STRING:
275 1.2 christos
276 1.1 jruoho Type = DT_FIELD_TYPE_STRING;
277 1.1 jruoho break;
278 1.1 jruoho
279 1.1 jruoho case ACPI_DMT_BUFFER:
280 1.4 christos case ACPI_DMT_RAW_BUFFER:
281 1.2 christos case ACPI_DMT_BUF7:
282 1.2 christos case ACPI_DMT_BUF10:
283 1.7 christos case ACPI_DMT_BUF12:
284 1.1 jruoho case ACPI_DMT_BUF16:
285 1.2 christos case ACPI_DMT_BUF128:
286 1.2 christos case ACPI_DMT_PCI_PATH:
287 1.2 christos
288 1.1 jruoho Type = DT_FIELD_TYPE_BUFFER;
289 1.1 jruoho break;
290 1.1 jruoho
291 1.1 jruoho case ACPI_DMT_GAS:
292 1.1 jruoho case ACPI_DMT_HESTNTFY:
293 1.5 christos case ACPI_DMT_IORTMEM:
294 1.2 christos
295 1.1 jruoho Type = DT_FIELD_TYPE_INLINE_SUBTABLE;
296 1.1 jruoho break;
297 1.1 jruoho
298 1.2 christos case ACPI_DMT_UNICODE:
299 1.2 christos
300 1.2 christos Type = DT_FIELD_TYPE_UNICODE;
301 1.2 christos break;
302 1.2 christos
303 1.2 christos case ACPI_DMT_UUID:
304 1.2 christos
305 1.2 christos Type = DT_FIELD_TYPE_UUID;
306 1.2 christos break;
307 1.2 christos
308 1.2 christos case ACPI_DMT_DEVICE_PATH:
309 1.2 christos
310 1.2 christos Type = DT_FIELD_TYPE_DEVICE_PATH;
311 1.2 christos break;
312 1.2 christos
313 1.2 christos case ACPI_DMT_LABEL:
314 1.2 christos
315 1.2 christos Type = DT_FIELD_TYPE_LABEL;
316 1.2 christos break;
317 1.2 christos
318 1.1 jruoho default:
319 1.2 christos
320 1.1 jruoho Type = DT_FIELD_TYPE_INTEGER;
321 1.1 jruoho break;
322 1.1 jruoho }
323 1.1 jruoho
324 1.1 jruoho return (Type);
325 1.1 jruoho }
326 1.1 jruoho
327 1.1 jruoho
328 1.1 jruoho /******************************************************************************
329 1.1 jruoho *
330 1.1 jruoho * FUNCTION: DtGetBufferLength
331 1.1 jruoho *
332 1.1 jruoho * PARAMETERS: Buffer - List of integers,
333 1.1 jruoho * for example "10 3A 4F 2E"
334 1.1 jruoho *
335 1.1 jruoho * RETURN: Count of integer
336 1.1 jruoho *
337 1.1 jruoho * DESCRIPTION: Get length of bytes needed to store the integers
338 1.1 jruoho *
339 1.1 jruoho *****************************************************************************/
340 1.1 jruoho
341 1.1 jruoho UINT32
342 1.1 jruoho DtGetBufferLength (
343 1.1 jruoho char *Buffer)
344 1.1 jruoho {
345 1.1 jruoho UINT32 ByteLength = 0;
346 1.1 jruoho
347 1.1 jruoho
348 1.1 jruoho while (*Buffer)
349 1.1 jruoho {
350 1.1 jruoho if (*Buffer == ' ')
351 1.1 jruoho {
352 1.1 jruoho ByteLength++;
353 1.1 jruoho
354 1.1 jruoho while (*Buffer == ' ')
355 1.1 jruoho {
356 1.1 jruoho Buffer++;
357 1.1 jruoho }
358 1.1 jruoho }
359 1.1 jruoho
360 1.1 jruoho Buffer++;
361 1.1 jruoho }
362 1.1 jruoho
363 1.1 jruoho return (++ByteLength);
364 1.1 jruoho }
365 1.1 jruoho
366 1.1 jruoho
367 1.1 jruoho /******************************************************************************
368 1.1 jruoho *
369 1.1 jruoho * FUNCTION: DtGetFieldLength
370 1.1 jruoho *
371 1.2 christos * PARAMETERS: Field - Current field
372 1.1 jruoho * Info - Data table info
373 1.1 jruoho *
374 1.1 jruoho * RETURN: Field length
375 1.1 jruoho *
376 1.1 jruoho * DESCRIPTION: Get length of bytes needed to compile the field
377 1.1 jruoho *
378 1.2 christos * Note: This function must remain in sync with AcpiDmDumpTable.
379 1.2 christos *
380 1.1 jruoho *****************************************************************************/
381 1.1 jruoho
382 1.1 jruoho UINT32
383 1.1 jruoho DtGetFieldLength (
384 1.1 jruoho DT_FIELD *Field,
385 1.1 jruoho ACPI_DMTABLE_INFO *Info)
386 1.1 jruoho {
387 1.1 jruoho UINT32 ByteLength = 0;
388 1.1 jruoho char *Value;
389 1.1 jruoho
390 1.1 jruoho
391 1.1 jruoho /* Length is based upon the opcode for this field in the info table */
392 1.1 jruoho
393 1.1 jruoho switch (Info->Opcode)
394 1.1 jruoho {
395 1.1 jruoho case ACPI_DMT_FLAG0:
396 1.1 jruoho case ACPI_DMT_FLAG1:
397 1.1 jruoho case ACPI_DMT_FLAG2:
398 1.1 jruoho case ACPI_DMT_FLAG3:
399 1.1 jruoho case ACPI_DMT_FLAG4:
400 1.1 jruoho case ACPI_DMT_FLAG5:
401 1.1 jruoho case ACPI_DMT_FLAG6:
402 1.1 jruoho case ACPI_DMT_FLAG7:
403 1.1 jruoho case ACPI_DMT_FLAGS0:
404 1.2 christos case ACPI_DMT_FLAGS1:
405 1.1 jruoho case ACPI_DMT_FLAGS2:
406 1.2 christos case ACPI_DMT_FLAGS4:
407 1.2 christos case ACPI_DMT_LABEL:
408 1.2 christos case ACPI_DMT_EXTRA_TEXT:
409 1.2 christos
410 1.1 jruoho ByteLength = 0;
411 1.1 jruoho break;
412 1.1 jruoho
413 1.1 jruoho case ACPI_DMT_UINT8:
414 1.1 jruoho case ACPI_DMT_CHKSUM:
415 1.1 jruoho case ACPI_DMT_SPACEID:
416 1.2 christos case ACPI_DMT_ACCWIDTH:
417 1.2 christos case ACPI_DMT_IVRS:
418 1.3 christos case ACPI_DMT_GTDT:
419 1.1 jruoho case ACPI_DMT_MADT:
420 1.2 christos case ACPI_DMT_PCCT:
421 1.2 christos case ACPI_DMT_PMTT:
422 1.1 jruoho case ACPI_DMT_SRAT:
423 1.1 jruoho case ACPI_DMT_ASF:
424 1.1 jruoho case ACPI_DMT_HESTNTYP:
425 1.1 jruoho case ACPI_DMT_FADTPM:
426 1.2 christos case ACPI_DMT_EINJACT:
427 1.2 christos case ACPI_DMT_EINJINST:
428 1.2 christos case ACPI_DMT_ERSTACT:
429 1.2 christos case ACPI_DMT_ERSTINST:
430 1.3 christos case ACPI_DMT_DMAR_SCOPE:
431 1.2 christos
432 1.1 jruoho ByteLength = 1;
433 1.1 jruoho break;
434 1.1 jruoho
435 1.1 jruoho case ACPI_DMT_UINT16:
436 1.1 jruoho case ACPI_DMT_DMAR:
437 1.1 jruoho case ACPI_DMT_HEST:
438 1.5 christos case ACPI_DMT_NFIT:
439 1.1 jruoho case ACPI_DMT_PCI_PATH:
440 1.2 christos
441 1.1 jruoho ByteLength = 2;
442 1.1 jruoho break;
443 1.1 jruoho
444 1.1 jruoho case ACPI_DMT_UINT24:
445 1.2 christos
446 1.1 jruoho ByteLength = 3;
447 1.1 jruoho break;
448 1.1 jruoho
449 1.1 jruoho case ACPI_DMT_UINT32:
450 1.1 jruoho case ACPI_DMT_NAME4:
451 1.1 jruoho case ACPI_DMT_SIG:
452 1.3 christos case ACPI_DMT_LPIT:
453 1.2 christos
454 1.1 jruoho ByteLength = 4;
455 1.1 jruoho break;
456 1.1 jruoho
457 1.2 christos case ACPI_DMT_UINT40:
458 1.2 christos
459 1.2 christos ByteLength = 5;
460 1.2 christos break;
461 1.2 christos
462 1.2 christos case ACPI_DMT_UINT48:
463 1.1 jruoho case ACPI_DMT_NAME6:
464 1.2 christos
465 1.1 jruoho ByteLength = 6;
466 1.1 jruoho break;
467 1.1 jruoho
468 1.1 jruoho case ACPI_DMT_UINT56:
469 1.2 christos case ACPI_DMT_BUF7:
470 1.2 christos
471 1.1 jruoho ByteLength = 7;
472 1.1 jruoho break;
473 1.1 jruoho
474 1.1 jruoho case ACPI_DMT_UINT64:
475 1.1 jruoho case ACPI_DMT_NAME8:
476 1.2 christos
477 1.1 jruoho ByteLength = 8;
478 1.1 jruoho break;
479 1.1 jruoho
480 1.1 jruoho case ACPI_DMT_STRING:
481 1.1 jruoho
482 1.2 christos Value = DtGetFieldValue (Field);
483 1.2 christos if (Value)
484 1.2 christos {
485 1.5 christos ByteLength = strlen (Value) + 1;
486 1.2 christos }
487 1.2 christos else
488 1.2 christos { /* At this point, this is a fatal error */
489 1.1 jruoho
490 1.2 christos snprintf (MsgBuffer, sizeof(MsgBuffer), "Expected \"%s\"", Info->Name);
491 1.2 christos DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, MsgBuffer);
492 1.2 christos return (0);
493 1.2 christos }
494 1.1 jruoho break;
495 1.1 jruoho
496 1.1 jruoho case ACPI_DMT_GAS:
497 1.2 christos
498 1.1 jruoho ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
499 1.1 jruoho break;
500 1.1 jruoho
501 1.1 jruoho case ACPI_DMT_HESTNTFY:
502 1.2 christos
503 1.1 jruoho ByteLength = sizeof (ACPI_HEST_NOTIFY);
504 1.1 jruoho break;
505 1.1 jruoho
506 1.5 christos case ACPI_DMT_IORTMEM:
507 1.5 christos
508 1.5 christos ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
509 1.5 christos break;
510 1.5 christos
511 1.1 jruoho case ACPI_DMT_BUFFER:
512 1.4 christos case ACPI_DMT_RAW_BUFFER:
513 1.2 christos
514 1.2 christos Value = DtGetFieldValue (Field);
515 1.1 jruoho if (Value)
516 1.1 jruoho {
517 1.1 jruoho ByteLength = DtGetBufferLength (Value);
518 1.1 jruoho }
519 1.1 jruoho else
520 1.1 jruoho { /* At this point, this is a fatal error */
521 1.1 jruoho
522 1.2 christos snprintf (MsgBuffer, sizeof(MsgBuffer), "Expected \"%s\"", Info->Name);
523 1.1 jruoho DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, MsgBuffer);
524 1.2 christos return (0);
525 1.1 jruoho }
526 1.1 jruoho break;
527 1.1 jruoho
528 1.2 christos case ACPI_DMT_BUF10:
529 1.2 christos
530 1.2 christos ByteLength = 10;
531 1.2 christos break;
532 1.2 christos
533 1.7 christos case ACPI_DMT_BUF12:
534 1.7 christos
535 1.7 christos ByteLength = 12;
536 1.7 christos break;
537 1.7 christos
538 1.1 jruoho case ACPI_DMT_BUF16:
539 1.2 christos case ACPI_DMT_UUID:
540 1.2 christos
541 1.1 jruoho ByteLength = 16;
542 1.1 jruoho break;
543 1.1 jruoho
544 1.2 christos case ACPI_DMT_BUF128:
545 1.2 christos
546 1.2 christos ByteLength = 128;
547 1.2 christos break;
548 1.2 christos
549 1.2 christos case ACPI_DMT_UNICODE:
550 1.2 christos
551 1.2 christos Value = DtGetFieldValue (Field);
552 1.2 christos
553 1.2 christos /* TBD: error if Value is NULL? (as below?) */
554 1.2 christos
555 1.5 christos ByteLength = (strlen (Value) + 1) * sizeof(UINT16);
556 1.2 christos break;
557 1.2 christos
558 1.1 jruoho default:
559 1.2 christos
560 1.1 jruoho DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid table opcode");
561 1.2 christos return (0);
562 1.1 jruoho }
563 1.1 jruoho
564 1.1 jruoho return (ByteLength);
565 1.1 jruoho }
566 1.1 jruoho
567 1.1 jruoho
568 1.1 jruoho /******************************************************************************
569 1.1 jruoho *
570 1.1 jruoho * FUNCTION: DtSum
571 1.1 jruoho *
572 1.1 jruoho * PARAMETERS: DT_WALK_CALLBACK:
573 1.1 jruoho * Subtable - Subtable
574 1.1 jruoho * Context - Unused
575 1.1 jruoho * ReturnValue - Store the checksum of subtable
576 1.1 jruoho *
577 1.1 jruoho * RETURN: Status
578 1.1 jruoho *
579 1.1 jruoho * DESCRIPTION: Get the checksum of subtable
580 1.1 jruoho *
581 1.1 jruoho *****************************************************************************/
582 1.1 jruoho
583 1.1 jruoho static void
584 1.1 jruoho DtSum (
585 1.1 jruoho DT_SUBTABLE *Subtable,
586 1.1 jruoho void *Context,
587 1.1 jruoho void *ReturnValue)
588 1.1 jruoho {
589 1.1 jruoho UINT8 Checksum;
590 1.1 jruoho UINT8 *Sum = ReturnValue;
591 1.1 jruoho
592 1.1 jruoho
593 1.1 jruoho Checksum = AcpiTbChecksum (Subtable->Buffer, Subtable->Length);
594 1.1 jruoho *Sum = (UINT8) (*Sum + Checksum);
595 1.1 jruoho }
596 1.1 jruoho
597 1.1 jruoho
598 1.1 jruoho /******************************************************************************
599 1.1 jruoho *
600 1.1 jruoho * FUNCTION: DtSetTableChecksum
601 1.1 jruoho *
602 1.1 jruoho * PARAMETERS: ChecksumPointer - Where to return the checksum
603 1.1 jruoho *
604 1.1 jruoho * RETURN: None
605 1.1 jruoho *
606 1.1 jruoho * DESCRIPTION: Set checksum of the whole data table into the checksum field
607 1.1 jruoho *
608 1.1 jruoho *****************************************************************************/
609 1.1 jruoho
610 1.1 jruoho void
611 1.1 jruoho DtSetTableChecksum (
612 1.1 jruoho UINT8 *ChecksumPointer)
613 1.1 jruoho {
614 1.1 jruoho UINT8 Checksum = 0;
615 1.1 jruoho UINT8 OldSum;
616 1.1 jruoho
617 1.1 jruoho
618 1.1 jruoho DtWalkTableTree (Gbl_RootTable, DtSum, NULL, &Checksum);
619 1.1 jruoho
620 1.1 jruoho OldSum = *ChecksumPointer;
621 1.1 jruoho Checksum = (UINT8) (Checksum - OldSum);
622 1.1 jruoho
623 1.1 jruoho /* Compute the final checksum */
624 1.1 jruoho
625 1.1 jruoho Checksum = (UINT8) (0 - Checksum);
626 1.1 jruoho *ChecksumPointer = Checksum;
627 1.1 jruoho }
628 1.1 jruoho
629 1.1 jruoho
630 1.1 jruoho /******************************************************************************
631 1.1 jruoho *
632 1.1 jruoho * FUNCTION: DtSetTableLength
633 1.1 jruoho *
634 1.1 jruoho * PARAMETERS: None
635 1.1 jruoho *
636 1.1 jruoho * RETURN: None
637 1.1 jruoho *
638 1.1 jruoho * DESCRIPTION: Walk the subtables and set all the length fields
639 1.1 jruoho *
640 1.1 jruoho *****************************************************************************/
641 1.1 jruoho
642 1.1 jruoho void
643 1.1 jruoho DtSetTableLength (
644 1.1 jruoho void)
645 1.1 jruoho {
646 1.1 jruoho DT_SUBTABLE *ParentTable;
647 1.1 jruoho DT_SUBTABLE *ChildTable;
648 1.1 jruoho
649 1.1 jruoho
650 1.1 jruoho ParentTable = Gbl_RootTable;
651 1.1 jruoho ChildTable = NULL;
652 1.1 jruoho
653 1.1 jruoho if (!ParentTable)
654 1.1 jruoho {
655 1.1 jruoho return;
656 1.1 jruoho }
657 1.1 jruoho
658 1.1 jruoho DtSetSubtableLength (ParentTable);
659 1.1 jruoho
660 1.1 jruoho while (1)
661 1.1 jruoho {
662 1.1 jruoho ChildTable = DtGetNextSubtable (ParentTable, ChildTable);
663 1.1 jruoho if (ChildTable)
664 1.1 jruoho {
665 1.2 christos if (ChildTable->LengthField)
666 1.2 christos {
667 1.2 christos DtSetSubtableLength (ChildTable);
668 1.2 christos }
669 1.2 christos
670 1.1 jruoho if (ChildTable->Child)
671 1.1 jruoho {
672 1.1 jruoho ParentTable = ChildTable;
673 1.1 jruoho ChildTable = NULL;
674 1.1 jruoho }
675 1.1 jruoho else
676 1.1 jruoho {
677 1.1 jruoho ParentTable->TotalLength += ChildTable->TotalLength;
678 1.1 jruoho if (ParentTable->LengthField)
679 1.1 jruoho {
680 1.1 jruoho DtSetSubtableLength (ParentTable);
681 1.1 jruoho }
682 1.1 jruoho }
683 1.1 jruoho }
684 1.1 jruoho else
685 1.1 jruoho {
686 1.1 jruoho ChildTable = ParentTable;
687 1.1 jruoho
688 1.1 jruoho if (ChildTable == Gbl_RootTable)
689 1.1 jruoho {
690 1.1 jruoho break;
691 1.1 jruoho }
692 1.1 jruoho
693 1.1 jruoho ParentTable = DtGetParentSubtable (ParentTable);
694 1.1 jruoho
695 1.1 jruoho ParentTable->TotalLength += ChildTable->TotalLength;
696 1.1 jruoho if (ParentTable->LengthField)
697 1.1 jruoho {
698 1.1 jruoho DtSetSubtableLength (ParentTable);
699 1.1 jruoho }
700 1.1 jruoho }
701 1.1 jruoho }
702 1.1 jruoho }
703 1.1 jruoho
704 1.1 jruoho
705 1.1 jruoho /******************************************************************************
706 1.1 jruoho *
707 1.1 jruoho * FUNCTION: DtWalkTableTree
708 1.1 jruoho *
709 1.1 jruoho * PARAMETERS: StartTable - Subtable in the tree where walking begins
710 1.1 jruoho * UserFunction - Called during the walk
711 1.1 jruoho * Context - Passed to user function
712 1.1 jruoho * ReturnValue - The return value of UserFunction
713 1.1 jruoho *
714 1.1 jruoho * RETURN: None
715 1.1 jruoho *
716 1.1 jruoho * DESCRIPTION: Performs a depth-first walk of the subtable tree
717 1.1 jruoho *
718 1.1 jruoho *****************************************************************************/
719 1.1 jruoho
720 1.1 jruoho void
721 1.1 jruoho DtWalkTableTree (
722 1.1 jruoho DT_SUBTABLE *StartTable,
723 1.1 jruoho DT_WALK_CALLBACK UserFunction,
724 1.1 jruoho void *Context,
725 1.1 jruoho void *ReturnValue)
726 1.1 jruoho {
727 1.1 jruoho DT_SUBTABLE *ParentTable;
728 1.1 jruoho DT_SUBTABLE *ChildTable;
729 1.1 jruoho
730 1.1 jruoho
731 1.1 jruoho ParentTable = StartTable;
732 1.1 jruoho ChildTable = NULL;
733 1.1 jruoho
734 1.1 jruoho if (!ParentTable)
735 1.1 jruoho {
736 1.1 jruoho return;
737 1.1 jruoho }
738 1.1 jruoho
739 1.1 jruoho UserFunction (ParentTable, Context, ReturnValue);
740 1.1 jruoho
741 1.1 jruoho while (1)
742 1.1 jruoho {
743 1.1 jruoho ChildTable = DtGetNextSubtable (ParentTable, ChildTable);
744 1.1 jruoho if (ChildTable)
745 1.1 jruoho {
746 1.1 jruoho UserFunction (ChildTable, Context, ReturnValue);
747 1.1 jruoho
748 1.1 jruoho if (ChildTable->Child)
749 1.1 jruoho {
750 1.1 jruoho ParentTable = ChildTable;
751 1.1 jruoho ChildTable = NULL;
752 1.1 jruoho }
753 1.1 jruoho }
754 1.1 jruoho else
755 1.1 jruoho {
756 1.1 jruoho ChildTable = ParentTable;
757 1.1 jruoho if (ChildTable == Gbl_RootTable)
758 1.1 jruoho {
759 1.1 jruoho break;
760 1.1 jruoho }
761 1.1 jruoho
762 1.1 jruoho ParentTable = DtGetParentSubtable (ParentTable);
763 1.1 jruoho
764 1.1 jruoho if (ChildTable->Peer == StartTable)
765 1.1 jruoho {
766 1.1 jruoho break;
767 1.1 jruoho }
768 1.1 jruoho }
769 1.1 jruoho }
770 1.1 jruoho }
771 1.1 jruoho
772 1.1 jruoho
773 1.3 christos /*******************************************************************************
774 1.3 christos *
775 1.3 christos * FUNCTION: UtSubtableCacheCalloc
776 1.3 christos *
777 1.3 christos * PARAMETERS: None
778 1.3 christos *
779 1.3 christos * RETURN: Pointer to the buffer. Aborts on allocation failure
780 1.3 christos *
781 1.3 christos * DESCRIPTION: Allocate a subtable object buffer. Bypass the local
782 1.3 christos * dynamic memory manager for performance reasons (This has a
783 1.3 christos * major impact on the speed of the compiler.)
784 1.3 christos *
785 1.3 christos ******************************************************************************/
786 1.3 christos
787 1.3 christos DT_SUBTABLE *
788 1.3 christos UtSubtableCacheCalloc (
789 1.3 christos void)
790 1.3 christos {
791 1.3 christos ASL_CACHE_INFO *Cache;
792 1.3 christos
793 1.3 christos
794 1.3 christos if (Gbl_SubtableCacheNext >= Gbl_SubtableCacheLast)
795 1.3 christos {
796 1.3 christos /* Allocate a new buffer */
797 1.3 christos
798 1.3 christos Cache = UtLocalCalloc (sizeof (Cache->Next) +
799 1.3 christos (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE));
800 1.3 christos
801 1.3 christos /* Link new cache buffer to head of list */
802 1.3 christos
803 1.3 christos Cache->Next = Gbl_SubtableCacheList;
804 1.3 christos Gbl_SubtableCacheList = Cache;
805 1.3 christos
806 1.3 christos /* Setup cache management pointers */
807 1.3 christos
808 1.3 christos Gbl_SubtableCacheNext = ACPI_CAST_PTR (DT_SUBTABLE, Cache->Buffer);
809 1.3 christos Gbl_SubtableCacheLast = Gbl_SubtableCacheNext + ASL_SUBTABLE_CACHE_SIZE;
810 1.3 christos }
811 1.3 christos
812 1.3 christos Gbl_SubtableCount++;
813 1.3 christos return (Gbl_SubtableCacheNext++);
814 1.3 christos }
815 1.3 christos
816 1.3 christos
817 1.3 christos /*******************************************************************************
818 1.3 christos *
819 1.3 christos * FUNCTION: UtFieldCacheCalloc
820 1.3 christos *
821 1.3 christos * PARAMETERS: None
822 1.3 christos *
823 1.3 christos * RETURN: Pointer to the buffer. Aborts on allocation failure
824 1.3 christos *
825 1.3 christos * DESCRIPTION: Allocate a field object buffer. Bypass the local
826 1.3 christos * dynamic memory manager for performance reasons (This has a
827 1.3 christos * major impact on the speed of the compiler.)
828 1.3 christos *
829 1.3 christos ******************************************************************************/
830 1.3 christos
831 1.3 christos DT_FIELD *
832 1.3 christos UtFieldCacheCalloc (
833 1.3 christos void)
834 1.3 christos {
835 1.3 christos ASL_CACHE_INFO *Cache;
836 1.3 christos
837 1.3 christos
838 1.3 christos if (Gbl_FieldCacheNext >= Gbl_FieldCacheLast)
839 1.3 christos {
840 1.3 christos /* Allocate a new buffer */
841 1.3 christos
842 1.3 christos Cache = UtLocalCalloc (sizeof (Cache->Next) +
843 1.3 christos (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE));
844 1.3 christos
845 1.3 christos /* Link new cache buffer to head of list */
846 1.3 christos
847 1.3 christos Cache->Next = Gbl_FieldCacheList;
848 1.3 christos Gbl_FieldCacheList = Cache;
849 1.3 christos
850 1.3 christos /* Setup cache management pointers */
851 1.3 christos
852 1.3 christos Gbl_FieldCacheNext = ACPI_CAST_PTR (DT_FIELD, Cache->Buffer);
853 1.3 christos Gbl_FieldCacheLast = Gbl_FieldCacheNext + ASL_FIELD_CACHE_SIZE;
854 1.3 christos }
855 1.3 christos
856 1.3 christos Gbl_FieldCount++;
857 1.3 christos return (Gbl_FieldCacheNext++);
858 1.3 christos }
859 1.3 christos
860 1.3 christos
861 1.3 christos /*******************************************************************************
862 1.1 jruoho *
863 1.3 christos * FUNCTION: DtDeleteCaches
864 1.1 jruoho *
865 1.1 jruoho * PARAMETERS: None
866 1.1 jruoho *
867 1.1 jruoho * RETURN: None
868 1.1 jruoho *
869 1.3 christos * DESCRIPTION: Delete all local cache buffer blocks
870 1.1 jruoho *
871 1.3 christos ******************************************************************************/
872 1.1 jruoho
873 1.1 jruoho void
874 1.3 christos DtDeleteCaches (
875 1.1 jruoho void)
876 1.1 jruoho {
877 1.3 christos UINT32 BufferCount;
878 1.3 christos ASL_CACHE_INFO *Next;
879 1.1 jruoho
880 1.1 jruoho
881 1.3 christos /* Field cache */
882 1.1 jruoho
883 1.3 christos BufferCount = 0;
884 1.3 christos while (Gbl_FieldCacheList)
885 1.1 jruoho {
886 1.3 christos Next = Gbl_FieldCacheList->Next;
887 1.3 christos ACPI_FREE (Gbl_FieldCacheList);
888 1.3 christos Gbl_FieldCacheList = Next;
889 1.3 christos BufferCount++;
890 1.3 christos }
891 1.3 christos
892 1.3 christos DbgPrint (ASL_DEBUG_OUTPUT,
893 1.3 christos "%u Fields, Buffer size: %u fields (%u bytes), %u Buffers\n",
894 1.3 christos Gbl_FieldCount, ASL_FIELD_CACHE_SIZE,
895 1.3 christos (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE), BufferCount);
896 1.1 jruoho
897 1.3 christos Gbl_FieldCount = 0;
898 1.3 christos Gbl_FieldCacheNext = NULL;
899 1.3 christos Gbl_FieldCacheLast = NULL;
900 1.3 christos
901 1.3 christos /* Subtable cache */
902 1.1 jruoho
903 1.3 christos BufferCount = 0;
904 1.3 christos while (Gbl_SubtableCacheList)
905 1.3 christos {
906 1.3 christos Next = Gbl_SubtableCacheList->Next;
907 1.3 christos ACPI_FREE (Gbl_SubtableCacheList);
908 1.3 christos Gbl_SubtableCacheList = Next;
909 1.3 christos BufferCount++;
910 1.1 jruoho }
911 1.3 christos
912 1.3 christos DbgPrint (ASL_DEBUG_OUTPUT,
913 1.3 christos "%u Subtables, Buffer size: %u subtables (%u bytes), %u Buffers\n",
914 1.3 christos Gbl_SubtableCount, ASL_SUBTABLE_CACHE_SIZE,
915 1.3 christos (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE), BufferCount);
916 1.3 christos
917 1.3 christos Gbl_SubtableCount = 0;
918 1.3 christos Gbl_SubtableCacheNext = NULL;
919 1.3 christos Gbl_SubtableCacheLast = NULL;
920 1.1 jruoho }
921