1193267Sjkim/******************************************************************************
2193267Sjkim *
3193267Sjkim * Module Name: aslstartup - Compiler startup routines, called from main
4193267Sjkim *
5193267Sjkim *****************************************************************************/
6193267Sjkim
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9193267Sjkim * All rights reserved.
10193267Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25193267Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29193267Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43193267Sjkim
44193341Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45193341Sjkim#include <contrib/dev/acpica/include/actables.h>
46246849Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
47193341Sjkim#include <contrib/dev/acpica/include/acapps.h>
48193267Sjkim
49193267Sjkim#define _COMPONENT          ACPI_COMPILER
50193267Sjkim        ACPI_MODULE_NAME    ("aslstartup")
51193267Sjkim
52193267Sjkim
53193267Sjkim/* Local prototypes */
54193267Sjkim
55212761Sjkimstatic UINT8
56209746SjkimAslDetectSourceFileType (
57209746Sjkim    ASL_FILE_INFO           *Info);
58193267Sjkim
59246849Sjkimstatic ACPI_STATUS
60246849SjkimAslDoDisassembly (
61246849Sjkim    void);
62209746Sjkim
63246849Sjkim
64281075Sdim/* Globals */
65281075Sdim
66281075Sdimstatic BOOLEAN          AslToFile = TRUE;
67281075Sdim
68281075Sdim
69193267Sjkim/*******************************************************************************
70193267Sjkim *
71193267Sjkim * FUNCTION:    AslInitializeGlobals
72193267Sjkim *
73193267Sjkim * PARAMETERS:  None
74193267Sjkim *
75193267Sjkim * RETURN:      None
76193267Sjkim *
77193267Sjkim * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
78193267Sjkim *              allows multiple files to be disassembled and/or compiled.
79193267Sjkim *
80193267Sjkim ******************************************************************************/
81193267Sjkim
82209746Sjkimvoid
83193267SjkimAslInitializeGlobals (
84193267Sjkim    void)
85193267Sjkim{
86193267Sjkim    UINT32                  i;
87193267Sjkim
88193267Sjkim
89193267Sjkim    /* Init compiler globals */
90193267Sjkim
91281075Sdim    Gbl_SyntaxError = 0;
92193267Sjkim    Gbl_CurrentColumn = 0;
93193267Sjkim    Gbl_CurrentLineNumber = 1;
94193267Sjkim    Gbl_LogicalLineNumber = 1;
95193267Sjkim    Gbl_CurrentLineOffset = 0;
96209746Sjkim    Gbl_InputFieldCount = 0;
97233250Sjkim    Gbl_InputByteCount = 0;
98233250Sjkim    Gbl_NsLookupCount = 0;
99193267Sjkim    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
100193267Sjkim
101193267Sjkim    Gbl_ErrorLog = NULL;
102193267Sjkim    Gbl_NextError = NULL;
103209746Sjkim    Gbl_Signature = NULL;
104209746Sjkim    Gbl_FileType = 0;
105193267Sjkim
106233250Sjkim    TotalExecutableOpcodes = 0;
107233250Sjkim    TotalNamedObjects = 0;
108233250Sjkim    TotalKeywords = 0;
109233250Sjkim    TotalParseNodes = 0;
110233250Sjkim    TotalMethods = 0;
111233250Sjkim    TotalAllocations = 0;
112233250Sjkim    TotalAllocated = 0;
113233250Sjkim    TotalFolds = 0;
114233250Sjkim
115193267Sjkim    AslGbl_NextEvent = 0;
116193267Sjkim    for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
117193267Sjkim    {
118193267Sjkim        Gbl_ExceptionCount[i] = 0;
119193267Sjkim    }
120193267Sjkim
121233250Sjkim    for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++)
122233250Sjkim    {
123233250Sjkim        Gbl_Files[i].Handle = NULL;
124233250Sjkim        Gbl_Files[i].Filename = NULL;
125233250Sjkim    }
126193267Sjkim}
127193267Sjkim
128193267Sjkim
129193267Sjkim/*******************************************************************************
130193267Sjkim *
131209746Sjkim * FUNCTION:    AslDetectSourceFileType
132209746Sjkim *
133209746Sjkim * PARAMETERS:  Info            - Name/Handle for the file (must be open)
134209746Sjkim *
135209746Sjkim * RETURN:      File Type
136209746Sjkim *
137209746Sjkim * DESCRIPTION: Determine the type of the input file. Either binary (contains
138209746Sjkim *              non-ASCII characters), ASL file, or an ACPI Data Table file.
139209746Sjkim *
140209746Sjkim ******************************************************************************/
141209746Sjkim
142212761Sjkimstatic UINT8
143209746SjkimAslDetectSourceFileType (
144209746Sjkim    ASL_FILE_INFO           *Info)
145209746Sjkim{
146209746Sjkim    char                    *FileChar;
147306536Sjkim    UINT8                   Type = ASL_INPUT_TYPE_ASCII_DATA; /* default */
148209746Sjkim    ACPI_STATUS             Status;
149209746Sjkim
150209746Sjkim
151306536Sjkim    /* Check for 100% ASCII source file (comments are ignored) */
152246849Sjkim
153306536Sjkim    Status = FlIsFileAsciiSource (Info->Filename, FALSE);
154246849Sjkim    if (ACPI_SUCCESS (Status))
155246849Sjkim    {
156306536Sjkim        /*
157306536Sjkim         * File contains ASCII source code. Determine if this is an ASL
158306536Sjkim         * file or an ACPI data table file.
159306536Sjkim         */
160306536Sjkim        while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
161306536Sjkim        {
162306536Sjkim            /* Uppercase the buffer for caseless compare */
163246849Sjkim
164306536Sjkim            FileChar = Gbl_CurrentLineBuffer;
165306536Sjkim            while (*FileChar)
166306536Sjkim            {
167306536Sjkim                *FileChar = (char) toupper ((int) *FileChar);
168306536Sjkim                FileChar++;
169306536Sjkim            }
170209746Sjkim
171306536Sjkim            /* Presence of "DefinitionBlock" indicates actual ASL code */
172241973Sjkim
173306536Sjkim            if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
174306536Sjkim            {
175306536Sjkim                /* Appears to be an ASL file */
176306536Sjkim
177306536Sjkim                Type = ASL_INPUT_TYPE_ASCII_ASL;
178306536Sjkim                goto Cleanup;
179306536Sjkim            }
180241973Sjkim        }
181306536Sjkim
182306536Sjkim        /* Appears to be an ASCII data table source file */
183306536Sjkim
184306536Sjkim        Type = ASL_INPUT_TYPE_ASCII_DATA;
185306536Sjkim        goto Cleanup;
186209746Sjkim    }
187209746Sjkim
188306536Sjkim    /* We have some sort of binary table, check for valid ACPI table */
189209746Sjkim
190306536Sjkim    fseek (Info->Handle, 0, SEEK_SET);
191209746Sjkim
192306536Sjkim    Status = AcValidateTableHeader (Info->Handle, 0);
193306536Sjkim    if (ACPI_SUCCESS (Status))
194306536Sjkim    {
195306536Sjkim        fprintf (stderr,
196306536Sjkim            "Binary file appears to be a valid ACPI table, disassembling\n");
197209746Sjkim
198306536Sjkim        Type = ASL_INPUT_TYPE_BINARY_ACPI_TABLE;
199306536Sjkim        goto Cleanup;
200209746Sjkim    }
201209746Sjkim
202306536Sjkim    Type = ASL_INPUT_TYPE_BINARY;
203209746Sjkim
204209746Sjkim
205209746SjkimCleanup:
206209746Sjkim
207209746Sjkim    /* Must seek back to the start of the file */
208209746Sjkim
209209746Sjkim    fseek (Info->Handle, 0, SEEK_SET);
210209746Sjkim    return (Type);
211209746Sjkim}
212209746Sjkim
213209746Sjkim
214209746Sjkim/*******************************************************************************
215209746Sjkim *
216246849Sjkim * FUNCTION:    AslDoDisassembly
217246849Sjkim *
218246849Sjkim * PARAMETERS:  None
219246849Sjkim *
220246849Sjkim * RETURN:      Status
221246849Sjkim *
222246849Sjkim * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build
223246849Sjkim *              namespace.
224246849Sjkim *
225246849Sjkim ******************************************************************************/
226246849Sjkim
227246849Sjkimstatic ACPI_STATUS
228246849SjkimAslDoDisassembly (
229246849Sjkim    void)
230246849Sjkim{
231246849Sjkim    ACPI_STATUS             Status;
232246849Sjkim
233246849Sjkim
234246849Sjkim    /* ACPICA subsystem initialization */
235246849Sjkim
236246849Sjkim    Status = AdInitialize ();
237246849Sjkim    if (ACPI_FAILURE (Status))
238246849Sjkim    {
239246849Sjkim        return (Status);
240246849Sjkim    }
241246849Sjkim
242246849Sjkim    Status = AcpiAllocateRootTable (4);
243246849Sjkim    if (ACPI_FAILURE (Status))
244246849Sjkim    {
245246849Sjkim        AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
246246849Sjkim            AcpiFormatException (Status));
247246849Sjkim        return (Status);
248246849Sjkim    }
249246849Sjkim
250306536Sjkim    /* Handle additional output files for disassembler */
251306536Sjkim
252306536Sjkim    Gbl_FileType = ASL_INPUT_TYPE_BINARY_ACPI_TABLE;
253306536Sjkim    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
254306536Sjkim
255246849Sjkim    /* This is where the disassembly happens */
256246849Sjkim
257306536Sjkim    AcpiGbl_DmOpt_Disasm = TRUE;
258246849Sjkim    Status = AdAmlDisassemble (AslToFile,
259246849Sjkim        Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_OutputFilenamePrefix,
260281075Sdim        &Gbl_Files[ASL_FILE_INPUT].Filename);
261246849Sjkim    if (ACPI_FAILURE (Status))
262246849Sjkim    {
263246849Sjkim        return (Status);
264246849Sjkim    }
265246849Sjkim
266246849Sjkim    /* Check if any control methods were unresolved */
267246849Sjkim
268246849Sjkim    AcpiDmUnresolvedWarning (0);
269246849Sjkim
270246849Sjkim    /* Shutdown compiler and ACPICA subsystem */
271246849Sjkim
272246849Sjkim    AeClearErrorLog ();
273246849Sjkim    (void) AcpiTerminate ();
274246849Sjkim
275246849Sjkim    /*
276246849Sjkim     * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
277246849Sjkim     * .DSL disassembly file, which can now be compiled if requested
278246849Sjkim     */
279246849Sjkim    if (Gbl_DoCompile)
280246849Sjkim    {
281246849Sjkim        AcpiOsPrintf ("\nCompiling \"%s\"\n",
282246849Sjkim            Gbl_Files[ASL_FILE_INPUT].Filename);
283246849Sjkim        return (AE_CTRL_CONTINUE);
284246849Sjkim    }
285246849Sjkim
286281075Sdim    /* No need to free the filename string */
287281075Sdim
288246849Sjkim    Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
289281075Sdim
290281075Sdim    CmDeleteCaches ();
291246849Sjkim    return (AE_OK);
292246849Sjkim}
293246849Sjkim
294246849Sjkim
295246849Sjkim/*******************************************************************************
296246849Sjkim *
297193267Sjkim * FUNCTION:    AslDoOneFile
298193267Sjkim *
299193267Sjkim * PARAMETERS:  Filename        - Name of the file
300193267Sjkim *
301193267Sjkim * RETURN:      Status
302193267Sjkim *
303193267Sjkim * DESCRIPTION: Process a single file - either disassemble, compile, or both
304193267Sjkim *
305193267Sjkim ******************************************************************************/
306193267Sjkim
307193267SjkimACPI_STATUS
308193267SjkimAslDoOneFile (
309193267Sjkim    char                    *Filename)
310193267Sjkim{
311193267Sjkim    ACPI_STATUS             Status;
312193267Sjkim
313193267Sjkim
314233250Sjkim    /* Re-initialize "some" compiler/preprocessor globals */
315193267Sjkim
316193267Sjkim    AslInitializeGlobals ();
317233250Sjkim    PrInitializeGlobals ();
318193267Sjkim
319281075Sdim    /*
320281075Sdim     * Extract the directory path. This path is used for possible include
321281075Sdim     * files and the optional AML filename embedded in the input file
322281075Sdim     * DefinitionBlock declaration.
323281075Sdim     */
324281075Sdim    Status = FlSplitInputPathname (Filename, &Gbl_DirectoryPath, NULL);
325281075Sdim    if (ACPI_FAILURE (Status))
326281075Sdim    {
327281075Sdim        return (Status);
328281075Sdim    }
329233250Sjkim
330281075Sdim    /* Take a copy of the input filename, convert any backslashes */
331281075Sdim
332281075Sdim    Gbl_Files[ASL_FILE_INPUT].Filename =
333281075Sdim        UtStringCacheCalloc (strlen (Filename) + 1);
334281075Sdim
335281075Sdim    strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
336281075Sdim    UtConvertBackslashes (Gbl_Files[ASL_FILE_INPUT].Filename);
337281075Sdim
338193267Sjkim    /*
339193267Sjkim     * AML Disassembly (Optional)
340193267Sjkim     */
341281075Sdim    if (Gbl_DisasmFlag)
342193267Sjkim    {
343246849Sjkim        Status = AslDoDisassembly ();
344246849Sjkim        if (Status != AE_CTRL_CONTINUE)
345193267Sjkim        {
346193267Sjkim            return (Status);
347193267Sjkim        }
348193267Sjkim    }
349193267Sjkim
350193267Sjkim    /*
351209746Sjkim     * Open the input file. Here, this should be an ASCII source file,
352209746Sjkim     * either an ASL file or a Data Table file
353193267Sjkim     */
354209746Sjkim    Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
355209746Sjkim    if (ACPI_FAILURE (Status))
356193267Sjkim    {
357209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
358209746Sjkim        return (AE_ERROR);
359209746Sjkim    }
360209746Sjkim
361306536Sjkim    Gbl_OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT);
362306536Sjkim
363209746Sjkim    /* Determine input file type */
364209746Sjkim
365209746Sjkim    Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
366209746Sjkim    if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
367209746Sjkim    {
368209746Sjkim        return (AE_ERROR);
369209746Sjkim    }
370209746Sjkim
371209746Sjkim    /*
372209746Sjkim     * If -p not specified, we will use the input filename as the
373209746Sjkim     * output filename prefix
374209746Sjkim     */
375209746Sjkim    if (Gbl_UseDefaultAmlFilename)
376209746Sjkim    {
377209746Sjkim        Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
378209746Sjkim    }
379209746Sjkim
380209746Sjkim    /* Open the optional output files (listings, etc.) */
381209746Sjkim
382209746Sjkim    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
383209746Sjkim    if (ACPI_FAILURE (Status))
384209746Sjkim    {
385209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
386209746Sjkim        return (AE_ERROR);
387209746Sjkim    }
388209746Sjkim
389209746Sjkim    /*
390209746Sjkim     * Compilation of ASL source versus DataTable source uses different
391209746Sjkim     * compiler subsystems
392209746Sjkim     */
393209746Sjkim    switch (Gbl_FileType)
394209746Sjkim    {
395209746Sjkim    /*
396209746Sjkim     * Data Table Compilation
397209746Sjkim     */
398209746Sjkim    case ASL_INPUT_TYPE_ASCII_DATA:
399209746Sjkim
400209746Sjkim        Status = DtDoCompile ();
401234623Sjkim        if (ACPI_FAILURE (Status))
402234623Sjkim        {
403234623Sjkim            return (Status);
404234623Sjkim        }
405209746Sjkim
406209746Sjkim        if (Gbl_Signature)
407193267Sjkim        {
408209746Sjkim            Gbl_Signature = NULL;
409193267Sjkim        }
410234623Sjkim
411234623Sjkim        /* Check if any errors occurred during compile */
412234623Sjkim
413234623Sjkim        Status = AslCheckForErrorExit ();
414234623Sjkim        if (ACPI_FAILURE (Status))
415234623Sjkim        {
416234623Sjkim            return (Status);
417234623Sjkim        }
418234623Sjkim
419234623Sjkim        /* Cleanup (for next source file) and exit */
420234623Sjkim
421209746Sjkim        AeClearErrorLog ();
422233250Sjkim        PrTerminatePreprocessor ();
423209746Sjkim        return (Status);
424193267Sjkim
425209746Sjkim    /*
426234623Sjkim     * ASL Compilation
427209746Sjkim     */
428209746Sjkim    case ASL_INPUT_TYPE_ASCII_ASL:
429193267Sjkim
430209746Sjkim        /* ACPICA subsystem initialization */
431209746Sjkim
432193267Sjkim        Status = AdInitialize ();
433193267Sjkim        if (ACPI_FAILURE (Status))
434193267Sjkim        {
435193267Sjkim            return (Status);
436193267Sjkim        }
437193267Sjkim
438234623Sjkim        (void) CmDoCompile ();
439212761Sjkim        (void) AcpiTerminate ();
440193267Sjkim
441234623Sjkim        /* Check if any errors occurred during compile */
442234623Sjkim
443234623Sjkim        Status = AslCheckForErrorExit ();
444234623Sjkim        if (ACPI_FAILURE (Status))
445193267Sjkim        {
446234623Sjkim            return (Status);
447193267Sjkim        }
448193267Sjkim
449234623Sjkim        /* Cleanup (for next source file) and exit */
450234623Sjkim
451193267Sjkim        AeClearErrorLog ();
452233250Sjkim        PrTerminatePreprocessor ();
453209746Sjkim        return (AE_OK);
454209746Sjkim
455246849Sjkim    /*
456246849Sjkim     * Binary ACPI table was auto-detected, disassemble it
457246849Sjkim     */
458306536Sjkim    case ASL_INPUT_TYPE_BINARY_ACPI_TABLE:
459246849Sjkim
460246849Sjkim        /* We have what appears to be an ACPI table, disassemble it */
461246849Sjkim
462246849Sjkim        FlCloseFile (ASL_FILE_INPUT);
463246849Sjkim        Gbl_DoCompile = FALSE;
464246849Sjkim        Gbl_DisasmFlag = TRUE;
465246849Sjkim        Status = AslDoDisassembly ();
466246849Sjkim        return (Status);
467246849Sjkim
468246849Sjkim    /* Unknown binary table */
469246849Sjkim
470209746Sjkim    case ASL_INPUT_TYPE_BINARY:
471209746Sjkim
472209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
473209746Sjkim        return (AE_ERROR);
474209746Sjkim
475209746Sjkim    default:
476250838Sjkim
477209746Sjkim        printf ("Unknown file type %X\n", Gbl_FileType);
478209746Sjkim        return (AE_ERROR);
479193267Sjkim    }
480193267Sjkim}
481193267Sjkim
482193267Sjkim
483193267Sjkim/*******************************************************************************
484193267Sjkim *
485234623Sjkim * FUNCTION:    AslCheckForErrorExit
486234623Sjkim *
487234623Sjkim * PARAMETERS:  None. Examines global exception count array
488234623Sjkim *
489234623Sjkim * RETURN:      Status
490234623Sjkim *
491234623Sjkim * DESCRIPTION: Determine if compiler should abort with error status
492234623Sjkim *
493234623Sjkim ******************************************************************************/
494234623Sjkim
495234623SjkimACPI_STATUS
496234623SjkimAslCheckForErrorExit (
497234623Sjkim    void)
498234623Sjkim{
499234623Sjkim
500234623Sjkim    /*
501234623Sjkim     * Return non-zero exit code if there have been errors, unless the
502234623Sjkim     * global ignore error flag has been set
503234623Sjkim     */
504234623Sjkim    if (!Gbl_IgnoreErrors)
505234623Sjkim    {
506234623Sjkim        if (Gbl_ExceptionCount[ASL_ERROR] > 0)
507234623Sjkim        {
508234623Sjkim            return (AE_ERROR);
509234623Sjkim        }
510234623Sjkim
511234623Sjkim        /* Optionally treat warnings as errors */
512234623Sjkim
513234623Sjkim        if (Gbl_WarningsAsErrors)
514234623Sjkim        {
515234623Sjkim            if ((Gbl_ExceptionCount[ASL_WARNING] > 0)  ||
516234623Sjkim                (Gbl_ExceptionCount[ASL_WARNING2] > 0) ||
517234623Sjkim                (Gbl_ExceptionCount[ASL_WARNING3] > 0))
518234623Sjkim            {
519234623Sjkim                return (AE_ERROR);
520234623Sjkim            }
521234623Sjkim        }
522234623Sjkim    }
523234623Sjkim
524234623Sjkim    return (AE_OK);
525234623Sjkim}
526