Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/acpica/compiler/aslerror.c
48373 views
1
/******************************************************************************
2
*
3
* Module Name: aslerror - Error handling and statistics
4
*
5
*****************************************************************************/
6
7
/******************************************************************************
8
*
9
* 1. Copyright Notice
10
*
11
* Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
12
* All rights reserved.
13
*
14
* 2. License
15
*
16
* 2.1. This is your license from Intel Corp. under its intellectual property
17
* rights. You may have additional license terms from the party that provided
18
* you this software, covering your right to use that party's intellectual
19
* property rights.
20
*
21
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22
* copy of the source code appearing in this file ("Covered Code") an
23
* irrevocable, perpetual, worldwide license under Intel's copyrights in the
24
* base code distributed originally by Intel ("Original Intel Code") to copy,
25
* make derivatives, distribute, use and display any portion of the Covered
26
* Code in any form, with the right to sublicense such rights; and
27
*
28
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29
* license (with the right to sublicense), under only those claims of Intel
30
* patents that are infringed by the Original Intel Code, to make, use, sell,
31
* offer to sell, and import the Covered Code and derivative works thereof
32
* solely to the minimum extent necessary to exercise the above copyright
33
* license, and in no event shall the patent license extend to any additions
34
* to or modifications of the Original Intel Code. No other license or right
35
* is granted directly or by implication, estoppel or otherwise;
36
*
37
* The above copyright and patent license is granted only if the following
38
* conditions are met:
39
*
40
* 3. Conditions
41
*
42
* 3.1. Redistribution of Source with Rights to Further Distribute Source.
43
* Redistribution of source code of any substantial portion of the Covered
44
* Code or modification with rights to further distribute source must include
45
* the above Copyright Notice, the above License, this list of Conditions,
46
* and the following Disclaimer and Export Compliance provision. In addition,
47
* Licensee must cause all Covered Code to which Licensee contributes to
48
* contain a file documenting the changes Licensee made to create that Covered
49
* Code and the date of any change. Licensee must include in that file the
50
* documentation of any changes made by any predecessor Licensee. Licensee
51
* must include a prominent statement that the modification is derived,
52
* directly or indirectly, from Original Intel Code.
53
*
54
* 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55
* Redistribution of source code of any substantial portion of the Covered
56
* Code or modification without rights to further distribute source must
57
* include the following Disclaimer and Export Compliance provision in the
58
* documentation and/or other materials provided with distribution. In
59
* addition, Licensee may not authorize further sublicense of source of any
60
* portion of the Covered Code, and must include terms to the effect that the
61
* license from Licensee to its licensee is limited to the intellectual
62
* property embodied in the software Licensee provides to its licensee, and
63
* not to intellectual property embodied in modifications its licensee may
64
* make.
65
*
66
* 3.3. Redistribution of Executable. Redistribution in executable form of any
67
* substantial portion of the Covered Code or modification must reproduce the
68
* above Copyright Notice, and the following Disclaimer and Export Compliance
69
* provision in the documentation and/or other materials provided with the
70
* distribution.
71
*
72
* 3.4. Intel retains all right, title, and interest in and to the Original
73
* Intel Code.
74
*
75
* 3.5. Neither the name Intel nor any other trademark owned or controlled by
76
* Intel shall be used in advertising or otherwise to promote the sale, use or
77
* other dealings in products derived from or relating to the Covered Code
78
* without prior written authorization from Intel.
79
*
80
* 4. Disclaimer and Export Compliance
81
*
82
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88
* PARTICULAR PURPOSE.
89
*
90
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97
* LIMITED REMEDY.
98
*
99
* 4.3. Licensee shall not export, either directly or indirectly, any of this
100
* software or system incorporating such software without first obtaining any
101
* required license or other approval from the U. S. Department of Commerce or
102
* any other agency or department of the United States Government. In the
103
* event Licensee exports any such software from the United States or
104
* re-exports any such software from a foreign destination, Licensee shall
105
* ensure that the distribution and export/re-export of the software is in
106
* compliance with all laws, regulations, orders, or other restrictions of the
107
* U.S. Export Administration Regulations. Licensee agrees that neither it nor
108
* any of its subsidiaries will export/re-export any technical data, process,
109
* software, or service, directly or indirectly, to any country for which the
110
* United States government or any agency thereof requires an export license,
111
* other governmental approval, or letter of assurance, without first obtaining
112
* such license, approval or letter.
113
*
114
*****************************************************************************
115
*
116
* Alternatively, you may choose to be licensed under the terms of the
117
* following license:
118
*
119
* Redistribution and use in source and binary forms, with or without
120
* modification, are permitted provided that the following conditions
121
* are met:
122
* 1. Redistributions of source code must retain the above copyright
123
* notice, this list of conditions, and the following disclaimer,
124
* without modification.
125
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
126
* substantially similar to the "NO WARRANTY" disclaimer below
127
* ("Disclaimer") and any redistribution must be conditioned upon
128
* including a substantially similar Disclaimer requirement for further
129
* binary redistribution.
130
* 3. Neither the names of the above-listed copyright holders nor the names
131
* of any contributors may be used to endorse or promote products derived
132
* from this software without specific prior written permission.
133
*
134
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145
*
146
* Alternatively, you may choose to be licensed under the terms of the
147
* GNU General Public License ("GPL") version 2 as published by the Free
148
* Software Foundation.
149
*
150
*****************************************************************************/
151
152
#include <contrib/dev/acpica/compiler/aslcompiler.h>
153
154
#define _COMPONENT ACPI_COMPILER
155
ACPI_MODULE_NAME ("aslerror")
156
157
/* Local prototypes */
158
159
static void
160
AeAddToErrorLog (
161
ASL_ERROR_MSG *Enode);
162
163
static BOOLEAN
164
AslIsExceptionExpected (
165
char *Filename,
166
UINT32 LineNumber,
167
UINT8 Level,
168
UINT16 MessageId);
169
170
static BOOLEAN
171
AslIsExceptionDisabled (
172
UINT8 Level,
173
UINT16 MessageId);
174
175
static void
176
AslInitEnode (
177
ASL_ERROR_MSG **Enode,
178
UINT8 Level,
179
UINT16 MessageId,
180
UINT32 LineNumber,
181
UINT32 LogicalLineNumber,
182
UINT32 LogicalByteOffset,
183
UINT32 Column,
184
char *Filename,
185
char *Message,
186
char *SourceLine,
187
ASL_ERROR_MSG *SubError);
188
189
static void
190
AslLogNewError (
191
UINT8 Level,
192
UINT16 MessageId,
193
UINT32 LineNumber,
194
UINT32 LogicalLineNumber,
195
UINT32 LogicalByteOffset,
196
UINT32 Column,
197
char *Filename,
198
char *Message,
199
char *SourceLine,
200
ASL_ERROR_MSG *SubError);
201
202
static void
203
AePrintSubError (
204
FILE *OutputFile,
205
ASL_ERROR_MSG *Enode);
206
207
static UINT8
208
GetModifiedLevel (
209
UINT8 Level,
210
UINT16 MessageId);
211
212
213
/*******************************************************************************
214
*
215
* FUNCTION: AslAbort
216
*
217
* PARAMETERS: None
218
*
219
* RETURN: None
220
*
221
* DESCRIPTION: Dump the error log and abort the compiler. Used for serious
222
* I/O errors.
223
*
224
******************************************************************************/
225
226
void
227
AslAbort (
228
void)
229
{
230
231
AePrintErrorLog (ASL_FILE_STDERR);
232
if (AslGbl_DebugFlag)
233
{
234
/* Print error summary to stdout also */
235
236
AePrintErrorLog (ASL_FILE_STDOUT);
237
}
238
239
exit (1);
240
}
241
242
243
/*******************************************************************************
244
*
245
* FUNCTION: AeClearErrorLog
246
*
247
* PARAMETERS: None
248
*
249
* RETURN: None
250
*
251
* DESCRIPTION: Empty the error list
252
*
253
******************************************************************************/
254
255
void
256
AeClearErrorLog (
257
void)
258
{
259
ASL_ERROR_MSG *Enode = AslGbl_ErrorLog;
260
ASL_ERROR_MSG *Next;
261
262
263
/* Walk the error node list */
264
265
while (Enode)
266
{
267
Next = Enode->Next;
268
ACPI_FREE (Enode);
269
Enode = Next;
270
}
271
272
AslGbl_ErrorLog = NULL;
273
}
274
275
276
/*******************************************************************************
277
*
278
* FUNCTION: AeAddToErrorLog
279
*
280
* PARAMETERS: Enode - An error node to add to the log
281
*
282
* RETURN: None
283
*
284
* DESCRIPTION: Add a new error node to the error log. The error log is
285
* ordered by the "logical" line number (cumulative line number
286
* including all include files.)
287
*
288
******************************************************************************/
289
290
static void
291
AeAddToErrorLog (
292
ASL_ERROR_MSG *Enode)
293
{
294
ASL_ERROR_MSG *Next;
295
ASL_ERROR_MSG *Prev;
296
297
298
/* If Gbl_ErrorLog is null, this is the first error node */
299
300
if (!AslGbl_ErrorLog)
301
{
302
AslGbl_ErrorLog = Enode;
303
return;
304
}
305
306
/*
307
* Walk error list until we find a line number greater than ours.
308
* List is sorted according to line number.
309
*/
310
Prev = NULL;
311
Next = AslGbl_ErrorLog;
312
313
while ((Next) && (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
314
{
315
Prev = Next;
316
Next = Next->Next;
317
}
318
319
/* Found our place in the list */
320
321
Enode->Next = Next;
322
323
if (Prev)
324
{
325
Prev->Next = Enode;
326
}
327
else
328
{
329
AslGbl_ErrorLog = Enode;
330
}
331
}
332
333
334
/*******************************************************************************
335
*
336
* FUNCTION: AeDecodeErrorMessageId
337
*
338
* PARAMETERS: OutputFile - Output file
339
* Enode - Error node to print
340
* PrematureEOF - True = PrematureEOF has been reached
341
* Total - Total length of line
342
*
343
* RETURN: None
344
*
345
* DESCRIPTION: Print the source line of an error.
346
*
347
******************************************************************************/
348
349
static void
350
AeDecodeErrorMessageId (
351
FILE *OutputFile,
352
ASL_ERROR_MSG *Enode,
353
BOOLEAN PrematureEOF,
354
UINT32 Total)
355
{
356
UINT32 MsgLength;
357
const char *MainMessage;
358
char *ExtraMessage;
359
UINT32 SourceColumn;
360
UINT32 ErrorColumn;
361
362
363
fprintf (OutputFile, "%s %4.4d -",
364
AeDecodeExceptionLevel (Enode->Level),
365
AeBuildFullExceptionCode (Enode->Level, Enode->MessageId));
366
367
MainMessage = AeDecodeMessageId (Enode->MessageId);
368
ExtraMessage = Enode->Message;
369
370
/* If a NULL line number, just print the decoded message */
371
372
if (!Enode->LineNumber)
373
{
374
fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
375
return;
376
}
377
378
MsgLength = strlen (MainMessage);
379
if (MsgLength == 0)
380
{
381
/* Use the secondary/extra message as main message */
382
383
MainMessage = Enode->Message;
384
if (!MainMessage)
385
{
386
MainMessage = "";
387
}
388
389
MsgLength = strlen (MainMessage);
390
ExtraMessage = NULL;
391
}
392
393
if (AslGbl_VerboseErrors && !PrematureEOF)
394
{
395
if (Total >= 256)
396
{
397
fprintf (OutputFile, " %s",
398
MainMessage);
399
}
400
else
401
{
402
SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
403
ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
404
405
if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
406
{
407
fprintf (OutputFile, "%*s%s",
408
(int) ((SourceColumn - 1) - ErrorColumn),
409
MainMessage, " ^ ");
410
}
411
else
412
{
413
fprintf (OutputFile, "%*s %s",
414
(int) ((SourceColumn - ErrorColumn) + 1), "^",
415
MainMessage);
416
}
417
}
418
}
419
else
420
{
421
fprintf (OutputFile, " %s", MainMessage);
422
}
423
424
/* Print the extra info message if present */
425
426
if (ExtraMessage)
427
{
428
fprintf (OutputFile, " (%s)", ExtraMessage);
429
}
430
431
if (PrematureEOF)
432
{
433
fprintf (OutputFile, " and premature End-Of-File");
434
}
435
436
fprintf (OutputFile, "\n");
437
if (AslGbl_VerboseErrors && !Enode->SubError)
438
{
439
fprintf (OutputFile, "\n");
440
}
441
}
442
443
444
/*******************************************************************************
445
*
446
* FUNCTION: AePrintErrorSourceLine
447
*
448
* PARAMETERS: OutputFile - Output file
449
* Enode - Error node to print
450
* PrematureEOF - True = PrematureEOF has been reached
451
* Total - Number of characters printed so far
452
*
453
*
454
* RETURN: Status
455
*
456
* DESCRIPTION: Print the source line of an error.
457
*
458
******************************************************************************/
459
460
static ACPI_STATUS
461
AePrintErrorSourceLine (
462
FILE *OutputFile,
463
ASL_ERROR_MSG *Enode,
464
BOOLEAN *PrematureEOF,
465
UINT32 *Total)
466
{
467
UINT8 SourceByte;
468
int Actual;
469
size_t RActual;
470
FILE *SourceFile = NULL;
471
long FileSize;
472
473
474
if (!Enode->SourceLine)
475
{
476
/*
477
* Use the merged header/source file if present, otherwise
478
* use input file
479
*/
480
SourceFile = FlGetFileHandle (ASL_FILE_SOURCE_OUTPUT,
481
ASL_FILE_SOURCE_OUTPUT, Enode->SourceFilename);
482
if (!SourceFile)
483
{
484
SourceFile = FlGetFileHandle (ASL_FILE_INPUT,
485
ASL_FILE_INPUT, Enode->Filename);
486
}
487
488
if (SourceFile)
489
{
490
/* Determine if the error occurred at source file EOF */
491
492
fseek (SourceFile, 0, SEEK_END);
493
FileSize = ftell (SourceFile);
494
495
if ((long) Enode->LogicalByteOffset >= FileSize)
496
{
497
*PrematureEOF = TRUE;
498
}
499
}
500
else
501
{
502
fprintf (OutputFile,
503
"[*** iASL: Source File Does not exist ***]\n");
504
return AE_IO_ERROR;
505
}
506
}
507
508
/* Print filename and line number if present and valid */
509
510
if (AslGbl_VerboseErrors)
511
{
512
fprintf (OutputFile, "%-8s", Enode->Filename);
513
514
if (Enode->SourceLine && Enode->LineNumber)
515
{
516
fprintf (OutputFile, " %6u: %s",
517
Enode->LineNumber, Enode->SourceLine);
518
}
519
else if (Enode->LineNumber)
520
{
521
fprintf (OutputFile, " %6u: ", Enode->LineNumber);
522
523
/*
524
* If not at EOF, get the corresponding source code line
525
* and display it. Don't attempt this if we have a
526
* premature EOF condition.
527
*/
528
if (*PrematureEOF)
529
{
530
fprintf (OutputFile, "\n");
531
return AE_OK;
532
}
533
534
/*
535
* Seek to the offset in the combined source file,
536
* read the source line, and write it to the output.
537
*/
538
Actual = fseek (SourceFile,
539
(long) Enode->LogicalByteOffset, (int) SEEK_SET);
540
if (Actual)
541
{
542
fprintf (OutputFile,
543
"[*** iASL: Seek error on source code temp file %s ***]",
544
AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
545
546
fprintf (OutputFile, "\n");
547
return AE_OK;
548
}
549
RActual = fread (&SourceByte, 1, 1, SourceFile);
550
if (RActual != 1)
551
{
552
fprintf (OutputFile,
553
"[*** iASL: Read error on source code temp file %s ***]",
554
AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
555
return AE_IO_ERROR;
556
}
557
558
/* Read/write the source line, up to the maximum line length */
559
560
while (RActual && SourceByte && (SourceByte != '\n'))
561
{
562
if (*Total < 256)
563
{
564
/* After the max line length, we will just read the line, no write */
565
566
if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
567
{
568
printf ("[*** iASL: Write error on output file ***]\n");
569
return AE_IO_ERROR;
570
}
571
}
572
else if (*Total == 256)
573
{
574
fprintf (OutputFile,
575
"\n[*** iASL: Very long input line, message below refers to column %u ***]",
576
Enode->Column);
577
}
578
579
RActual = fread (&SourceByte, 1, 1, SourceFile);
580
if (RActual != 1)
581
{
582
fprintf (OutputFile,
583
"[*** iASL: Read error on source code temp file %s ***]",
584
AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
585
586
return AE_IO_ERROR;
587
}
588
*Total += 1;
589
}
590
591
fprintf (OutputFile, "\n");
592
}
593
}
594
else
595
{
596
/*
597
* Less verbose version of the error message, enabled via the
598
* -vi switch. The format is compatible with MS Visual Studio.
599
*/
600
fprintf (OutputFile, "%s", Enode->Filename);
601
602
if (Enode->LineNumber)
603
{
604
fprintf (OutputFile, "(%u) : ",
605
Enode->LineNumber);
606
}
607
}
608
609
return AE_OK;
610
}
611
612
/*******************************************************************************
613
*
614
* FUNCTION: AePrintException
615
*
616
* PARAMETERS: FileId - ID of output file
617
* Enode - Error node to print
618
* Header - Additional text before each message
619
*
620
* RETURN: None
621
*
622
* DESCRIPTION: Print the contents of an error node.
623
*
624
* NOTE: We don't use the FlxxxFile I/O functions here because on error
625
* they abort the compiler and call this function! Since we
626
* are reporting errors here, we ignore most output errors and
627
* just try to get out as much as we can.
628
*
629
******************************************************************************/
630
631
void
632
AePrintException (
633
UINT32 FileId,
634
ASL_ERROR_MSG *Enode,
635
char *Header)
636
{
637
FILE *OutputFile;
638
BOOLEAN PrematureEOF = FALSE;
639
UINT32 Total = 0;
640
ACPI_STATUS Status;
641
ASL_ERROR_MSG *Child = Enode->SubError;
642
643
644
if (AslGbl_NoErrors)
645
{
646
return;
647
}
648
649
/*
650
* Only listing files have a header, and remarks/optimizations
651
* are always output
652
*/
653
if (!Header)
654
{
655
/* Ignore remarks if requested */
656
657
switch (Enode->Level)
658
{
659
case ASL_WARNING:
660
case ASL_WARNING2:
661
case ASL_WARNING3:
662
663
if (!AslGbl_DisplayWarnings)
664
{
665
return;
666
}
667
break;
668
669
case ASL_REMARK:
670
671
if (!AslGbl_DisplayRemarks)
672
{
673
return;
674
}
675
break;
676
677
case ASL_OPTIMIZATION:
678
679
if (!AslGbl_DisplayOptimizations)
680
{
681
return;
682
}
683
break;
684
685
default:
686
687
break;
688
}
689
}
690
691
/* Get the various required file handles */
692
693
OutputFile = AslGbl_Files[FileId].Handle;
694
695
if (Header)
696
{
697
fprintf (OutputFile, "%s", Header);
698
}
699
700
if (!Enode->Filename)
701
{
702
AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
703
return;
704
}
705
706
Status = AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
707
if (ACPI_FAILURE (Status))
708
{
709
return;
710
}
711
712
/* If a NULL message ID, just print the raw message */
713
714
if (Enode->MessageId == 0)
715
{
716
fprintf (OutputFile, "%s\n", Enode->Message);
717
return;
718
}
719
720
AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
721
722
while (Child)
723
{
724
fprintf (OutputFile, "\n");
725
AePrintSubError (OutputFile, Child);
726
Child = Child->SubError;
727
}
728
}
729
730
731
/*******************************************************************************
732
*
733
* FUNCTION: AePrintSubError
734
*
735
* PARAMETERS: OutputFile - Output file
736
* Enode - Error node to print
737
*
738
* RETURN: None
739
*
740
* DESCRIPTION: Print the contents of an error node. This function is tailored
741
* to print error nodes that are SubErrors within ASL_ERROR_MSG
742
*
743
******************************************************************************/
744
745
static void
746
AePrintSubError (
747
FILE *OutputFile,
748
ASL_ERROR_MSG *Enode)
749
{
750
UINT32 Total = 0;
751
BOOLEAN PrematureEOF = FALSE;
752
const char *MainMessage;
753
754
755
MainMessage = AeDecodeMessageId (Enode->MessageId);
756
757
fprintf (OutputFile, " %s", MainMessage);
758
759
if (Enode->Message)
760
{
761
fprintf (OutputFile, "(%s)", Enode->Message);
762
}
763
764
fprintf (OutputFile, "\n ");
765
(void) AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
766
fprintf (OutputFile, "\n");
767
}
768
769
770
/*******************************************************************************
771
*
772
* FUNCTION: AePrintErrorLog
773
*
774
* PARAMETERS: FileId - Where to output the error log
775
*
776
* RETURN: None
777
*
778
* DESCRIPTION: Print the entire contents of the error log
779
*
780
******************************************************************************/
781
782
void
783
AePrintErrorLog (
784
UINT32 FileId)
785
{
786
ASL_ERROR_MSG *Enode = AslGbl_ErrorLog;
787
788
789
/* Walk the error node list */
790
791
while (Enode)
792
{
793
AePrintException (FileId, Enode, NULL);
794
Enode = Enode->Next;
795
}
796
}
797
798
799
/*******************************************************************************
800
*
801
* FUNCTION: AslInitEnode
802
*
803
* PARAMETERS: InputEnode - Input Error node to initialize
804
* Level - Seriousness (Warning/error, etc.)
805
* MessageId - Index into global message buffer
806
* CurrentLineNumber - Actual file line number
807
* LogicalLineNumber - Cumulative line number
808
* LogicalByteOffset - Byte offset in source file
809
* Column - Column in current line
810
* Filename - Source filename
811
* ExtraMessage - Additional error message
812
* SourceLine - Line of error source code
813
* SubError - SubError of this InputEnode
814
*
815
* RETURN: None
816
*
817
* DESCRIPTION: Initialize an Error node
818
*
819
******************************************************************************/
820
821
static void AslInitEnode (
822
ASL_ERROR_MSG **InputEnode,
823
UINT8 Level,
824
UINT16 MessageId,
825
UINT32 LineNumber,
826
UINT32 LogicalLineNumber,
827
UINT32 LogicalByteOffset,
828
UINT32 Column,
829
char *Filename,
830
char *ExtraMessage,
831
char *SourceLine,
832
ASL_ERROR_MSG *SubError)
833
{
834
ASL_ERROR_MSG *Enode;
835
ASL_GLOBAL_FILE_NODE *FileNode;
836
837
838
*InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
839
Enode = *InputEnode;
840
Enode->Level = Level;
841
Enode->MessageId = MessageId;
842
Enode->LineNumber = LineNumber;
843
Enode->LogicalLineNumber = LogicalLineNumber;
844
Enode->LogicalByteOffset = LogicalByteOffset;
845
Enode->Column = Column;
846
Enode->SubError = SubError;
847
Enode->Message = NULL;
848
Enode->SourceLine = NULL;
849
Enode->Filename = NULL;
850
851
if (ExtraMessage)
852
{
853
/* Allocate a buffer for the message and a new error node */
854
855
Enode->Message = UtLocalCacheCalloc (strlen (ExtraMessage) + 1);
856
857
/* Keep a copy of the extra message */
858
859
strcpy (Enode->Message, ExtraMessage);
860
}
861
862
if (SourceLine)
863
{
864
Enode->SourceLine = UtLocalCalloc (strlen (SourceLine) + 1);
865
strcpy (Enode->SourceLine, SourceLine);
866
}
867
868
869
if (Filename)
870
{
871
Enode->Filename = Filename;
872
Enode->FilenameLength = strlen (Filename);
873
if (Enode->FilenameLength < 6)
874
{
875
Enode->FilenameLength = 6;
876
}
877
878
/*
879
* Attempt to get the file node of the filename listed in the parse
880
* node. If the name doesn't exist in the global file node, it is
881
* because the file is included by #include or ASL include. In this
882
* case, get the current file node. The source output of the current
883
* file will contain the contents of the file listed in the parse node.
884
*/
885
FileNode = FlGetFileNode (ASL_FILE_INPUT, Filename);
886
if (!FileNode)
887
{
888
FileNode = FlGetCurrentFileNode ();
889
}
890
891
Enode->SourceFilename =
892
FileNode->Files[ASL_FILE_SOURCE_OUTPUT].Filename;
893
}
894
}
895
896
897
/*******************************************************************************
898
*
899
* FUNCTION: AslCommonError2
900
*
901
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
902
* MessageId - Index into global message buffer
903
* LineNumber - Actual file line number
904
* Column - Column in current line
905
* SourceLine - Actual source code line
906
* Filename - Source filename
907
* ExtraMessage - Additional error message
908
*
909
* RETURN: None
910
*
911
* DESCRIPTION: Create a new error node and add it to the error log
912
*
913
******************************************************************************/
914
915
void
916
AslCommonError2 (
917
UINT8 Level,
918
UINT16 MessageId,
919
UINT32 LineNumber,
920
UINT32 Column,
921
char *SourceLine,
922
char *Filename,
923
char *ExtraMessage)
924
{
925
AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column,
926
Filename, ExtraMessage, SourceLine, NULL);
927
}
928
929
930
/*******************************************************************************
931
*
932
* FUNCTION: AslCommonError
933
*
934
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
935
* MessageId - Index into global message buffer
936
* CurrentLineNumber - Actual file line number
937
* LogicalLineNumber - Cumulative line number
938
* LogicalByteOffset - Byte offset in source file
939
* Column - Column in current line
940
* Filename - Source filename
941
* ExtraMessage - Additional error message
942
*
943
* RETURN: None
944
*
945
* DESCRIPTION: Create a new error node and add it to the error log
946
*
947
******************************************************************************/
948
949
void
950
AslCommonError (
951
UINT8 Level,
952
UINT16 MessageId,
953
UINT32 CurrentLineNumber,
954
UINT32 LogicalLineNumber,
955
UINT32 LogicalByteOffset,
956
UINT32 Column,
957
char *Filename,
958
char *ExtraMessage)
959
{
960
/* Check if user wants to ignore this exception */
961
962
if (AslIsExceptionIgnored (Filename, LogicalLineNumber, Level, MessageId))
963
{
964
return;
965
}
966
967
AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber,
968
LogicalByteOffset, Column, Filename, ExtraMessage,
969
NULL, NULL);
970
}
971
972
973
/*******************************************************************************
974
*
975
* FUNCTION: AslLogNewError
976
*
977
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
978
* MessageId - Index into global message buffer
979
* CurrentLineNumber - Actual file line number
980
* LogicalLineNumber - Cumulative line number
981
* LogicalByteOffset - Byte offset in source file
982
* Column - Column in current line
983
* Filename - Source filename
984
* Message - Additional error message
985
* SourceLine - Actual line of source code
986
* SubError - Sub-error associated with this error
987
*
988
* RETURN: None
989
*
990
* DESCRIPTION: Create a new error node and add it to the error log
991
*
992
******************************************************************************/
993
static void
994
AslLogNewError (
995
UINT8 Level,
996
UINT16 MessageId,
997
UINT32 LineNumber,
998
UINT32 LogicalLineNumber,
999
UINT32 LogicalByteOffset,
1000
UINT32 Column,
1001
char *Filename,
1002
char *Message,
1003
char *SourceLine,
1004
ASL_ERROR_MSG *SubError)
1005
{
1006
ASL_ERROR_MSG *Enode = NULL;
1007
UINT8 ModifiedLevel = GetModifiedLevel (Level, MessageId);
1008
1009
1010
AslInitEnode (&Enode, ModifiedLevel, MessageId, LineNumber,
1011
LogicalLineNumber, LogicalByteOffset, Column, Filename, Message,
1012
SourceLine, SubError);
1013
1014
/* Add the new node to the error node list */
1015
1016
AeAddToErrorLog (Enode);
1017
1018
if (AslGbl_DebugFlag)
1019
{
1020
/* stderr is a file, send error to it immediately */
1021
1022
AePrintException (ASL_FILE_STDERR, Enode, NULL);
1023
}
1024
1025
AslGbl_ExceptionCount[ModifiedLevel]++;
1026
if (!AslGbl_IgnoreErrors && AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
1027
{
1028
printf ("\nMaximum error count (%u) exceeded (aslerror.c)\n", ASL_MAX_ERROR_COUNT);
1029
1030
AslGbl_SourceLine = 0;
1031
AslGbl_NextError = AslGbl_ErrorLog;
1032
CmCleanupAndExit ();
1033
exit(1);
1034
}
1035
1036
return;
1037
}
1038
1039
1040
/*******************************************************************************
1041
*
1042
* FUNCTION: GetModifiedLevel
1043
*
1044
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
1045
* MessageId - Index into global message buffer
1046
*
1047
* RETURN: UINT8 - Modified level
1048
*
1049
* DESCRIPTION: Get the modified level of exception codes that are reported as
1050
* errors from the -ww option.
1051
*
1052
******************************************************************************/
1053
1054
static UINT8
1055
GetModifiedLevel (
1056
UINT8 Level,
1057
UINT16 MessageId)
1058
{
1059
UINT32 i;
1060
UINT16 ExceptionCode;
1061
1062
1063
ExceptionCode = AeBuildFullExceptionCode (Level, MessageId);
1064
1065
for (i = 0; i < AslGbl_ElevatedMessagesIndex; i++)
1066
{
1067
if (ExceptionCode == AslGbl_ElevatedMessages[i])
1068
{
1069
return (ASL_ERROR);
1070
}
1071
}
1072
1073
return (Level);
1074
}
1075
1076
1077
/*******************************************************************************
1078
*
1079
* FUNCTION: AslIsExceptionIgnored
1080
*
1081
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
1082
* MessageId - Index into global message buffer
1083
*
1084
* RETURN: BOOLEAN
1085
*
1086
* DESCRIPTION: Check if a particular exception is ignored. In this case it
1087
* means that the exception is (expected or disabled.
1088
*
1089
******************************************************************************/
1090
1091
BOOLEAN
1092
AslIsExceptionIgnored (
1093
char *Filename,
1094
UINT32 LineNumber,
1095
UINT8 Level,
1096
UINT16 MessageId)
1097
{
1098
BOOLEAN ExceptionIgnored;
1099
1100
1101
/* Note: this allows exception to be disabled and expected */
1102
1103
ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
1104
ExceptionIgnored |=
1105
AslIsExceptionExpected (Filename, LineNumber, Level, MessageId);
1106
1107
return (AslGbl_AllExceptionsDisabled || ExceptionIgnored);
1108
}
1109
1110
1111
/*******************************************************************************
1112
*
1113
* FUNCTION: AslCheckExpectedException
1114
*
1115
* PARAMETERS: none
1116
*
1117
* RETURN: none
1118
*
1119
* DESCRIPTION: Check the global expected messages table and raise an error
1120
* for each message that has not been received.
1121
*
1122
******************************************************************************/
1123
1124
void
1125
AslCheckExpectedExceptions (
1126
void)
1127
{
1128
UINT32 i;
1129
ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList;
1130
ASL_LOCATION_NODE *LocationNode;
1131
1132
1133
for (i = 0; i < AslGbl_ExpectedMessagesIndex; ++i)
1134
{
1135
if (!AslGbl_ExpectedMessages[i].MessageReceived)
1136
{
1137
AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
1138
AslGbl_ExpectedMessages[i].MessageIdStr);
1139
}
1140
}
1141
1142
while (Current)
1143
{
1144
LocationNode = Current->LocationList;
1145
1146
while (LocationNode)
1147
{
1148
if (!LocationNode->MessageReceived)
1149
{
1150
AslCommonError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED,
1151
LocationNode->LineNumber, LocationNode->LineNumber,
1152
LocationNode->LogicalByteOffset, LocationNode->Column,
1153
LocationNode->Filename, Current->MessageIdStr);
1154
}
1155
1156
LocationNode = LocationNode->Next;
1157
}
1158
1159
Current = Current->Next;
1160
}
1161
}
1162
1163
1164
/*******************************************************************************
1165
*
1166
* FUNCTION: AslLogExpectedException
1167
*
1168
* PARAMETERS: MessageIdString - ID of excepted exception during compile
1169
*
1170
* RETURN: Status
1171
*
1172
* DESCRIPTION: Enter a message ID into the global expected messages table
1173
* If these messages are not raised during the compilation, throw
1174
* an error.
1175
*
1176
******************************************************************************/
1177
1178
ACPI_STATUS
1179
AslLogExpectedException (
1180
char *MessageIdString)
1181
{
1182
UINT32 MessageId;
1183
1184
1185
/* Convert argument to an integer and validate it */
1186
1187
MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1188
1189
if (MessageId > 6999)
1190
{
1191
printf ("\"%s\" is not a valid warning/remark/error ID\n",
1192
MessageIdString);
1193
return (AE_BAD_PARAMETER);
1194
}
1195
1196
/* Insert value into the global expected message array */
1197
1198
if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
1199
{
1200
printf ("Too many messages have been registered as expected (max %d)\n",
1201
ASL_MAX_DISABLED_MESSAGES);
1202
return (AE_LIMIT);
1203
}
1204
1205
AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageId = MessageId;
1206
AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
1207
AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageReceived = FALSE;
1208
AslGbl_ExpectedMessagesIndex++;
1209
return (AE_OK);
1210
}
1211
1212
1213
/*******************************************************************************
1214
*
1215
* FUNCTION: AslLogExpectedExceptionByLine
1216
*
1217
* PARAMETERS: MessageIdString - ID of excepted exception during compile
1218
*
1219
* RETURN: Status
1220
*
1221
* DESCRIPTION: Enter a message ID into the global expected messages table
1222
* based on file and line number. If these messages are not raised
1223
* during the compilation, throw an error.
1224
*
1225
******************************************************************************/
1226
1227
void
1228
AslLogExpectedExceptionByLine (
1229
char *MessageIdString)
1230
{
1231
ASL_LOCATION_NODE *NewErrorLocationNode;
1232
ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList;
1233
UINT32 MessageId;
1234
1235
1236
NewErrorLocationNode = UtLocalCalloc (sizeof (ASL_LOCATION_NODE));
1237
1238
NewErrorLocationNode->LineNumber = AslGbl_CurrentLineNumber;
1239
NewErrorLocationNode->Filename = AslGbl_Files[ASL_FILE_INPUT].Filename;
1240
NewErrorLocationNode->LogicalByteOffset = AslGbl_CurrentLineOffset;
1241
NewErrorLocationNode->Column = AslGbl_CurrentColumn;
1242
1243
MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1244
1245
/* search the existing list for a matching message ID */
1246
1247
while (Current && Current->MessageId != MessageId )
1248
{
1249
Current = Current->Next;
1250
}
1251
if (!Current)
1252
{
1253
/* ID was not found, create a new node for this message ID */
1254
1255
Current = UtLocalCalloc (sizeof (ASL_EXPECTED_MSG_NODE));
1256
1257
Current->Next = AslGbl_ExpectedErrorCodeList;
1258
Current->MessageIdStr = MessageIdString;
1259
Current->MessageId = MessageId;
1260
AslGbl_ExpectedErrorCodeList = Current;
1261
}
1262
1263
NewErrorLocationNode->Next = Current->LocationList;
1264
Current->LocationList = NewErrorLocationNode;
1265
}
1266
1267
1268
/*******************************************************************************
1269
*
1270
* FUNCTION: AslDisableException
1271
*
1272
* PARAMETERS: MessageIdString - ID to be disabled
1273
*
1274
* RETURN: Status
1275
*
1276
* DESCRIPTION: Enter a message ID into the global disabled messages table
1277
*
1278
******************************************************************************/
1279
1280
ACPI_STATUS
1281
AslDisableException (
1282
char *MessageIdString)
1283
{
1284
UINT32 MessageId;
1285
1286
1287
/* Convert argument to an integer and validate it */
1288
1289
MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1290
1291
if ((MessageId < 2000) || (MessageId > 6999))
1292
{
1293
printf ("\"%s\" is not a valid warning/remark/error ID\n",
1294
MessageIdString);
1295
return (AE_BAD_PARAMETER);
1296
}
1297
1298
/* Insert value into the global disabled message array */
1299
1300
if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
1301
{
1302
printf ("Too many messages have been disabled (max %d)\n",
1303
ASL_MAX_DISABLED_MESSAGES);
1304
return (AE_LIMIT);
1305
}
1306
1307
AslGbl_DisabledMessages[AslGbl_DisabledMessagesIndex] = MessageId;
1308
AslGbl_DisabledMessagesIndex++;
1309
return (AE_OK);
1310
}
1311
1312
1313
/*******************************************************************************
1314
*
1315
* FUNCTION: AslElevateException
1316
*
1317
* PARAMETERS: MessageIdString - ID of excepted exception during compile
1318
*
1319
* RETURN: Status
1320
*
1321
* DESCRIPTION: Enter a message ID into the global elevated exceptions table.
1322
* These messages will be considered as compilation errors.
1323
*
1324
******************************************************************************/
1325
1326
ACPI_STATUS
1327
AslElevateException (
1328
char *MessageIdString)
1329
{
1330
UINT32 MessageId;
1331
1332
1333
/* Convert argument to an integer and validate it */
1334
1335
MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1336
1337
if (MessageId > 6999)
1338
{
1339
printf ("\"%s\" is not a valid warning/remark/error ID\n",
1340
MessageIdString);
1341
return (AE_BAD_PARAMETER);
1342
}
1343
1344
/* Insert value into the global expected message array */
1345
1346
if (AslGbl_ElevatedMessagesIndex >= ASL_MAX_ELEVATED_MESSAGES)
1347
{
1348
printf ("Too many messages have been registered as elevated (max %d)\n",
1349
ASL_MAX_DISABLED_MESSAGES);
1350
return (AE_LIMIT);
1351
}
1352
1353
AslGbl_ElevatedMessages[AslGbl_ElevatedMessagesIndex] = MessageId;
1354
AslGbl_ElevatedMessagesIndex++;
1355
return (AE_OK);
1356
}
1357
1358
1359
/*******************************************************************************
1360
*
1361
* FUNCTION: AslIsExceptionDisabled
1362
*
1363
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
1364
* MessageId - Index into global message buffer
1365
*
1366
* RETURN: TRUE if exception/message should be ignored
1367
*
1368
* DESCRIPTION: Check if the user has specified options such that this
1369
* exception should be ignored
1370
*
1371
******************************************************************************/
1372
1373
static BOOLEAN
1374
AslIsExceptionExpected (
1375
char *Filename,
1376
UINT32 LineNumber,
1377
UINT8 Level,
1378
UINT16 MessageId)
1379
{
1380
ASL_EXPECTED_MSG_NODE *Current = AslGbl_ExpectedErrorCodeList;
1381
ASL_LOCATION_NODE *CurrentErrorLocation;
1382
UINT32 EncodedMessageId;
1383
UINT32 i;
1384
1385
1386
/* Mark this exception as received */
1387
1388
EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1389
for (i = 0; i < AslGbl_ExpectedMessagesIndex; i++)
1390
{
1391
/* Simple implementation via fixed array */
1392
1393
if (EncodedMessageId == AslGbl_ExpectedMessages[i].MessageId)
1394
{
1395
return (AslGbl_ExpectedMessages[i].MessageReceived = TRUE);
1396
}
1397
}
1398
1399
while (Current && Current->MessageId != EncodedMessageId)
1400
{
1401
Current = Current->Next;
1402
}
1403
if (!Current)
1404
{
1405
return (FALSE);
1406
}
1407
1408
CurrentErrorLocation = Current->LocationList;
1409
1410
while (CurrentErrorLocation)
1411
{
1412
if (!strcmp (CurrentErrorLocation->Filename, Filename) &&
1413
CurrentErrorLocation->LineNumber == LineNumber)
1414
{
1415
return (CurrentErrorLocation->MessageReceived = TRUE);
1416
}
1417
1418
CurrentErrorLocation = CurrentErrorLocation->Next;
1419
}
1420
1421
return (FALSE);
1422
}
1423
1424
1425
/*******************************************************************************
1426
*
1427
* FUNCTION: AslIsExceptionDisabled
1428
*
1429
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
1430
* MessageId - Index into global message buffer
1431
*
1432
* RETURN: TRUE if exception/message should be ignored
1433
*
1434
* DESCRIPTION: Check if the user has specified options such that this
1435
* exception should be ignored
1436
*
1437
******************************************************************************/
1438
1439
static BOOLEAN
1440
AslIsExceptionDisabled (
1441
UINT8 Level,
1442
UINT16 MessageId)
1443
{
1444
UINT32 EncodedMessageId;
1445
UINT32 i;
1446
1447
1448
switch (Level)
1449
{
1450
case ASL_WARNING2:
1451
case ASL_WARNING3:
1452
1453
/* Check for global disable via -w1/-w2/-w3 options */
1454
1455
if (Level > AslGbl_WarningLevel)
1456
{
1457
return (TRUE);
1458
}
1459
ACPI_FALLTHROUGH;
1460
1461
case ASL_WARNING:
1462
case ASL_REMARK:
1463
case ASL_ERROR:
1464
/*
1465
* Ignore this error/warning/remark if it has been disabled by
1466
* the user (-vw option)
1467
*/
1468
EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1469
for (i = 0; i < AslGbl_DisabledMessagesIndex; i++)
1470
{
1471
/* Simple implementation via fixed array */
1472
1473
if (EncodedMessageId == AslGbl_DisabledMessages[i])
1474
{
1475
return (TRUE);
1476
}
1477
}
1478
break;
1479
1480
default:
1481
break;
1482
}
1483
1484
return (FALSE);
1485
}
1486
1487
1488
/*******************************************************************************
1489
*
1490
* FUNCTION: AslDualParseOpError
1491
*
1492
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
1493
* MainMsgId - Index into global message buffer
1494
* MainOp - Parse node where error happened
1495
* MainMsg - Message pertaining to the MainOp
1496
* SubMsgId - Index into global message buffer
1497
* SubOp - Additional parse node for better message
1498
* SubMsg - Message pertaining to SubOp
1499
*
1500
*
1501
* RETURN: None
1502
*
1503
* DESCRIPTION: Main error reporting routine for the ASL compiler for error
1504
* messages that point to multiple parse objects.
1505
*
1506
******************************************************************************/
1507
1508
void
1509
AslDualParseOpError (
1510
UINT8 Level,
1511
UINT16 MainMsgId,
1512
ACPI_PARSE_OBJECT *MainOp,
1513
char *MainMsg,
1514
UINT16 SubMsgId,
1515
ACPI_PARSE_OBJECT *SubOp,
1516
char *SubMsg)
1517
{
1518
ASL_ERROR_MSG *SubEnode = NULL;
1519
1520
1521
/* Check if user wants to ignore this exception */
1522
1523
if (!MainOp || AslIsExceptionIgnored (MainOp->Asl.Filename,
1524
MainOp->Asl.LogicalLineNumber, Level, MainMsgId))
1525
{
1526
return;
1527
}
1528
1529
if (SubOp)
1530
{
1531
AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
1532
SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
1533
SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
1534
NULL, NULL);
1535
}
1536
1537
AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
1538
MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
1539
MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
1540
NULL, SubEnode);
1541
}
1542
1543
1544
/*******************************************************************************
1545
*
1546
* FUNCTION: AslError
1547
*
1548
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
1549
* MessageId - Index into global message buffer
1550
* Op - Parse node where error happened
1551
* ExtraMessage - Additional error message
1552
*
1553
* RETURN: None
1554
*
1555
* DESCRIPTION: Main error reporting routine for the ASL compiler (all code
1556
* except the parser.)
1557
*
1558
******************************************************************************/
1559
1560
void
1561
AslError (
1562
UINT8 Level,
1563
UINT16 MessageId,
1564
ACPI_PARSE_OBJECT *Op,
1565
char *ExtraMessage)
1566
{
1567
if (Op)
1568
{
1569
AslCommonError (Level, MessageId, Op->Asl.LineNumber,
1570
Op->Asl.LogicalLineNumber,
1571
Op->Asl.LogicalByteOffset,
1572
Op->Asl.Column,
1573
Op->Asl.Filename, ExtraMessage);
1574
}
1575
else
1576
{
1577
AslCommonError (Level, MessageId, 0,
1578
0, 0, 0, NULL, ExtraMessage);
1579
}
1580
}
1581
1582
1583
/*******************************************************************************
1584
*
1585
* FUNCTION: AslCoreSubsystemError
1586
*
1587
* PARAMETERS: Op - Parse node where error happened
1588
* Status - The ACPICA Exception
1589
* ExtraMessage - Additional error message
1590
* Abort - TRUE -> Abort compilation
1591
*
1592
* RETURN: None
1593
*
1594
* DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
1595
* core subsystem.
1596
*
1597
******************************************************************************/
1598
1599
void
1600
AslCoreSubsystemError (
1601
ACPI_PARSE_OBJECT *Op,
1602
ACPI_STATUS Status,
1603
char *ExtraMessage,
1604
BOOLEAN Abort)
1605
{
1606
1607
sprintf (AslGbl_MsgBuffer, "%s %s", AcpiFormatException (Status), ExtraMessage);
1608
1609
if (Op)
1610
{
1611
AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1612
Op->Asl.LineNumber,
1613
Op->Asl.LogicalLineNumber,
1614
Op->Asl.LogicalByteOffset,
1615
Op->Asl.Column,
1616
Op->Asl.Filename, AslGbl_MsgBuffer);
1617
}
1618
else
1619
{
1620
AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1621
0, 0, 0, 0, NULL, AslGbl_MsgBuffer);
1622
}
1623
1624
if (Abort)
1625
{
1626
AslAbort ();
1627
}
1628
}
1629
1630
1631
/*******************************************************************************
1632
*
1633
* FUNCTION: AslCompilererror
1634
*
1635
* PARAMETERS: CompilerMessage - Error message from the parser
1636
*
1637
* RETURN: Status (0 for now)
1638
*
1639
* DESCRIPTION: Report an error situation discovered in a production
1640
* NOTE: don't change the name of this function, it is called
1641
* from the auto-generated parser.
1642
*
1643
******************************************************************************/
1644
1645
int
1646
AslCompilererror (
1647
const char *CompilerMessage)
1648
{
1649
1650
AslGbl_SyntaxError++;
1651
1652
AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
1653
AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
1654
AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename,
1655
ACPI_CAST_PTR (char, CompilerMessage));
1656
1657
return (0);
1658
}
1659
1660