1193267Sjkim/******************************************************************************
2193267Sjkim *
3193267Sjkim * Module Name: aslstartup - Compiler startup routines, called from main
4193267Sjkim *
5193267Sjkim *****************************************************************************/
6193267Sjkim
7217365Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, 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
44193267Sjkim
45193341Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
46193341Sjkim#include <contrib/dev/acpica/include/actables.h>
47246849Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
48193341Sjkim#include <contrib/dev/acpica/include/acapps.h>
49193267Sjkim
50193267Sjkim#define _COMPONENT          ACPI_COMPILER
51193267Sjkim        ACPI_MODULE_NAME    ("aslstartup")
52193267Sjkim
53193267Sjkim
54193267Sjkim#define ASL_MAX_FILES   256
55212761Sjkimstatic char             *FileList[ASL_MAX_FILES];
56212761Sjkimstatic BOOLEAN          AslToFile = TRUE;
57193267Sjkim
58193267Sjkim
59193267Sjkim/* Local prototypes */
60193267Sjkim
61193267Sjkimstatic char **
62193267SjkimAsDoWildcard (
63193267Sjkim    char                    *DirectoryPathname,
64193267Sjkim    char                    *FileSpecifier);
65193267Sjkim
66212761Sjkimstatic UINT8
67209746SjkimAslDetectSourceFileType (
68209746Sjkim    ASL_FILE_INFO           *Info);
69193267Sjkim
70246849Sjkimstatic ACPI_STATUS
71246849SjkimAslDoDisassembly (
72246849Sjkim    void);
73209746Sjkim
74246849Sjkim
75193267Sjkim/*******************************************************************************
76193267Sjkim *
77193267Sjkim * FUNCTION:    AslInitializeGlobals
78193267Sjkim *
79193267Sjkim * PARAMETERS:  None
80193267Sjkim *
81193267Sjkim * RETURN:      None
82193267Sjkim *
83193267Sjkim * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
84193267Sjkim *              allows multiple files to be disassembled and/or compiled.
85193267Sjkim *
86193267Sjkim ******************************************************************************/
87193267Sjkim
88209746Sjkimvoid
89193267SjkimAslInitializeGlobals (
90193267Sjkim    void)
91193267Sjkim{
92193267Sjkim    UINT32                  i;
93193267Sjkim
94193267Sjkim
95193267Sjkim    /* Init compiler globals */
96193267Sjkim
97193267Sjkim    Gbl_CurrentColumn = 0;
98193267Sjkim    Gbl_CurrentLineNumber = 1;
99193267Sjkim    Gbl_LogicalLineNumber = 1;
100193267Sjkim    Gbl_CurrentLineOffset = 0;
101209746Sjkim    Gbl_InputFieldCount = 0;
102233250Sjkim    Gbl_InputByteCount = 0;
103233250Sjkim    Gbl_NsLookupCount = 0;
104193267Sjkim    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
105193267Sjkim
106193267Sjkim    Gbl_ErrorLog = NULL;
107193267Sjkim    Gbl_NextError = NULL;
108209746Sjkim    Gbl_Signature = NULL;
109209746Sjkim    Gbl_FileType = 0;
110193267Sjkim
111233250Sjkim    TotalExecutableOpcodes = 0;
112233250Sjkim    TotalNamedObjects = 0;
113233250Sjkim    TotalKeywords = 0;
114233250Sjkim    TotalParseNodes = 0;
115233250Sjkim    TotalMethods = 0;
116233250Sjkim    TotalAllocations = 0;
117233250Sjkim    TotalAllocated = 0;
118233250Sjkim    TotalFolds = 0;
119233250Sjkim
120193267Sjkim    AslGbl_NextEvent = 0;
121193267Sjkim    for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
122193267Sjkim    {
123193267Sjkim        Gbl_ExceptionCount[i] = 0;
124193267Sjkim    }
125193267Sjkim
126233250Sjkim    for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++)
127233250Sjkim    {
128233250Sjkim        Gbl_Files[i].Handle = NULL;
129233250Sjkim        Gbl_Files[i].Filename = NULL;
130233250Sjkim    }
131193267Sjkim}
132193267Sjkim
133193267Sjkim
134193267Sjkim/******************************************************************************
135193267Sjkim *
136193267Sjkim * FUNCTION:    AsDoWildcard
137193267Sjkim *
138193267Sjkim * PARAMETERS:  None
139193267Sjkim *
140193267Sjkim * RETURN:      None
141193267Sjkim *
142193267Sjkim * DESCRIPTION: Process files via wildcards. This function is for the Windows
143193267Sjkim *              case only.
144193267Sjkim *
145193267Sjkim ******************************************************************************/
146193267Sjkim
147193267Sjkimstatic char **
148193267SjkimAsDoWildcard (
149193267Sjkim    char                    *DirectoryPathname,
150193267Sjkim    char                    *FileSpecifier)
151193267Sjkim{
152193267Sjkim#ifdef WIN32
153193267Sjkim    void                    *DirInfo;
154193267Sjkim    char                    *Filename;
155212761Sjkim    int                     FileCount;
156193267Sjkim
157193267Sjkim
158193267Sjkim    FileCount = 0;
159193267Sjkim
160193267Sjkim    /* Open parent directory */
161193267Sjkim
162193267Sjkim    DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
163193267Sjkim    if (!DirInfo)
164193267Sjkim    {
165193267Sjkim        /* Either the directory of file does not exist */
166193267Sjkim
167193267Sjkim        Gbl_Files[ASL_FILE_INPUT].Filename = FileSpecifier;
168193267Sjkim        FlFileError (ASL_FILE_INPUT, ASL_MSG_OPEN);
169193267Sjkim        AslAbort ();
170193267Sjkim    }
171193267Sjkim
172193267Sjkim    /* Process each file that matches the wildcard specification */
173193267Sjkim
174193267Sjkim    while ((Filename = AcpiOsGetNextFilename (DirInfo)))
175193267Sjkim    {
176193267Sjkim        /* Add the filename to the file list */
177193267Sjkim
178193267Sjkim        FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
179193267Sjkim        strcpy (FileList[FileCount], Filename);
180193267Sjkim        FileCount++;
181193267Sjkim
182193267Sjkim        if (FileCount >= ASL_MAX_FILES)
183193267Sjkim        {
184193267Sjkim            printf ("Max files reached\n");
185193267Sjkim            FileList[0] = NULL;
186193267Sjkim            return (FileList);
187193267Sjkim        }
188193267Sjkim    }
189193267Sjkim
190193267Sjkim    /* Cleanup */
191193267Sjkim
192193267Sjkim    AcpiOsCloseDirectory (DirInfo);
193193267Sjkim    FileList[FileCount] = NULL;
194193267Sjkim    return (FileList);
195193267Sjkim
196193267Sjkim#else
197193267Sjkim    /*
198193267Sjkim     * Linux/Unix cases - Wildcards are expanded by the shell automatically.
199193267Sjkim     * Just return the filename in a null terminated list
200193267Sjkim     */
201193267Sjkim    FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
202193267Sjkim    strcpy (FileList[0], FileSpecifier);
203193267Sjkim    FileList[1] = NULL;
204193267Sjkim
205193267Sjkim    return (FileList);
206193267Sjkim#endif
207193267Sjkim}
208193267Sjkim
209193267Sjkim
210193267Sjkim/*******************************************************************************
211193267Sjkim *
212209746Sjkim * FUNCTION:    AslDetectSourceFileType
213209746Sjkim *
214209746Sjkim * PARAMETERS:  Info            - Name/Handle for the file (must be open)
215209746Sjkim *
216209746Sjkim * RETURN:      File Type
217209746Sjkim *
218209746Sjkim * DESCRIPTION: Determine the type of the input file. Either binary (contains
219209746Sjkim *              non-ASCII characters), ASL file, or an ACPI Data Table file.
220209746Sjkim *
221209746Sjkim ******************************************************************************/
222209746Sjkim
223212761Sjkimstatic UINT8
224209746SjkimAslDetectSourceFileType (
225209746Sjkim    ASL_FILE_INFO           *Info)
226209746Sjkim{
227209746Sjkim    char                    *FileChar;
228209746Sjkim    UINT8                   Type;
229209746Sjkim    ACPI_STATUS             Status;
230209746Sjkim
231209746Sjkim
232246849Sjkim    /* Check for a valid binary ACPI table */
233246849Sjkim
234246849Sjkim    Status = FlCheckForAcpiTable (Info->Handle);
235246849Sjkim    if (ACPI_SUCCESS (Status))
236246849Sjkim    {
237246849Sjkim        Type = ASL_INPUT_TYPE_ACPI_TABLE;
238246849Sjkim        goto Cleanup;
239246849Sjkim    }
240246849Sjkim
241209746Sjkim    /* Check for 100% ASCII source file (comments are ignored) */
242209746Sjkim
243235945Sjkim    Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE);
244209746Sjkim    if (ACPI_FAILURE (Status))
245209746Sjkim    {
246209746Sjkim        printf ("Non-ascii input file - %s\n", Info->Filename);
247241973Sjkim
248241973Sjkim        if (!Gbl_IgnoreErrors)
249241973Sjkim        {
250241973Sjkim            Type = ASL_INPUT_TYPE_BINARY;
251241973Sjkim            goto Cleanup;
252241973Sjkim        }
253209746Sjkim    }
254209746Sjkim
255209746Sjkim    /*
256209746Sjkim     * File is ASCII. Determine if this is an ASL file or an ACPI data
257209746Sjkim     * table file.
258209746Sjkim     */
259240716Sjkim    while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
260209746Sjkim    {
261209746Sjkim        /* Uppercase the buffer for caseless compare */
262209746Sjkim
263209746Sjkim        FileChar = Gbl_CurrentLineBuffer;
264209746Sjkim        while (*FileChar)
265209746Sjkim        {
266209746Sjkim            *FileChar = (char) toupper ((int) *FileChar);
267209746Sjkim            FileChar++;
268209746Sjkim        }
269209746Sjkim
270209746Sjkim        /* Presence of "DefinitionBlock" indicates actual ASL code */
271209746Sjkim
272209746Sjkim        if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
273209746Sjkim        {
274209746Sjkim            /* Appears to be an ASL file */
275209746Sjkim
276209746Sjkim            Type = ASL_INPUT_TYPE_ASCII_ASL;
277209746Sjkim            goto Cleanup;
278209746Sjkim        }
279209746Sjkim    }
280209746Sjkim
281209746Sjkim    /* Not an ASL source file, default to a data table source file */
282209746Sjkim
283209746Sjkim    Type = ASL_INPUT_TYPE_ASCII_DATA;
284209746Sjkim
285209746SjkimCleanup:
286209746Sjkim
287209746Sjkim    /* Must seek back to the start of the file */
288209746Sjkim
289209746Sjkim    fseek (Info->Handle, 0, SEEK_SET);
290209746Sjkim    return (Type);
291209746Sjkim}
292209746Sjkim
293209746Sjkim
294209746Sjkim/*******************************************************************************
295209746Sjkim *
296246849Sjkim * FUNCTION:    AslDoDisassembly
297246849Sjkim *
298246849Sjkim * PARAMETERS:  None
299246849Sjkim *
300246849Sjkim * RETURN:      Status
301246849Sjkim *
302246849Sjkim * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build
303246849Sjkim *              namespace.
304246849Sjkim *
305246849Sjkim ******************************************************************************/
306246849Sjkim
307246849Sjkimstatic ACPI_STATUS
308246849SjkimAslDoDisassembly (
309246849Sjkim    void)
310246849Sjkim{
311246849Sjkim    ACPI_STATUS             Status;
312246849Sjkim
313246849Sjkim
314246849Sjkim    /* ACPICA subsystem initialization */
315246849Sjkim
316246849Sjkim    Status = AdInitialize ();
317246849Sjkim    if (ACPI_FAILURE (Status))
318246849Sjkim    {
319246849Sjkim        return (Status);
320246849Sjkim    }
321246849Sjkim
322246849Sjkim    Status = AcpiAllocateRootTable (4);
323246849Sjkim    if (ACPI_FAILURE (Status))
324246849Sjkim    {
325246849Sjkim        AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
326246849Sjkim            AcpiFormatException (Status));
327246849Sjkim        return (Status);
328246849Sjkim    }
329246849Sjkim
330246849Sjkim    /* This is where the disassembly happens */
331246849Sjkim
332246849Sjkim    AcpiGbl_DbOpt_disasm = TRUE;
333246849Sjkim    Status = AdAmlDisassemble (AslToFile,
334246849Sjkim        Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_OutputFilenamePrefix,
335246849Sjkim        &Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_GetAllTables);
336246849Sjkim    if (ACPI_FAILURE (Status))
337246849Sjkim    {
338246849Sjkim        return (Status);
339246849Sjkim    }
340246849Sjkim
341246849Sjkim    /* Check if any control methods were unresolved */
342246849Sjkim
343246849Sjkim    AcpiDmUnresolvedWarning (0);
344246849Sjkim
345246849Sjkim#if 0
346246849Sjkim    /* TBD: Handle additional output files for disassembler */
347246849Sjkim
348246849Sjkim    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
349246849Sjkim    NsDisplayNamespace ();
350246849Sjkim#endif
351246849Sjkim
352246849Sjkim    /* Shutdown compiler and ACPICA subsystem */
353246849Sjkim
354246849Sjkim    AeClearErrorLog ();
355246849Sjkim    (void) AcpiTerminate ();
356246849Sjkim
357246849Sjkim    /*
358246849Sjkim     * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
359246849Sjkim     * .DSL disassembly file, which can now be compiled if requested
360246849Sjkim     */
361246849Sjkim    if (Gbl_DoCompile)
362246849Sjkim    {
363246849Sjkim        AcpiOsPrintf ("\nCompiling \"%s\"\n",
364246849Sjkim            Gbl_Files[ASL_FILE_INPUT].Filename);
365246849Sjkim        return (AE_CTRL_CONTINUE);
366246849Sjkim    }
367246849Sjkim
368246849Sjkim    ACPI_FREE (Gbl_Files[ASL_FILE_INPUT].Filename);
369246849Sjkim    Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
370246849Sjkim    return (AE_OK);
371246849Sjkim}
372246849Sjkim
373246849Sjkim
374246849Sjkim/*******************************************************************************
375246849Sjkim *
376193267Sjkim * FUNCTION:    AslDoOneFile
377193267Sjkim *
378193267Sjkim * PARAMETERS:  Filename        - Name of the file
379193267Sjkim *
380193267Sjkim * RETURN:      Status
381193267Sjkim *
382193267Sjkim * DESCRIPTION: Process a single file - either disassemble, compile, or both
383193267Sjkim *
384193267Sjkim ******************************************************************************/
385193267Sjkim
386193267SjkimACPI_STATUS
387193267SjkimAslDoOneFile (
388193267Sjkim    char                    *Filename)
389193267Sjkim{
390193267Sjkim    ACPI_STATUS             Status;
391193267Sjkim
392193267Sjkim
393233250Sjkim    /* Re-initialize "some" compiler/preprocessor globals */
394193267Sjkim
395193267Sjkim    AslInitializeGlobals ();
396233250Sjkim    PrInitializeGlobals ();
397193267Sjkim
398233250Sjkim    Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
399233250Sjkim
400193267Sjkim    /*
401193267Sjkim     * AML Disassembly (Optional)
402193267Sjkim     */
403193267Sjkim    if (Gbl_DisasmFlag || Gbl_GetAllTables)
404193267Sjkim    {
405246849Sjkim        Status = AslDoDisassembly ();
406246849Sjkim        if (Status != AE_CTRL_CONTINUE)
407193267Sjkim        {
408193267Sjkim            return (Status);
409193267Sjkim        }
410193267Sjkim    }
411193267Sjkim
412193267Sjkim    /*
413209746Sjkim     * Open the input file. Here, this should be an ASCII source file,
414209746Sjkim     * either an ASL file or a Data Table file
415193267Sjkim     */
416209746Sjkim    Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
417209746Sjkim    if (ACPI_FAILURE (Status))
418193267Sjkim    {
419209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
420209746Sjkim        return (AE_ERROR);
421209746Sjkim    }
422209746Sjkim
423209746Sjkim    /* Determine input file type */
424209746Sjkim
425209746Sjkim    Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
426209746Sjkim    if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
427209746Sjkim    {
428209746Sjkim        return (AE_ERROR);
429209746Sjkim    }
430209746Sjkim
431209746Sjkim    /*
432209746Sjkim     * If -p not specified, we will use the input filename as the
433209746Sjkim     * output filename prefix
434209746Sjkim     */
435209746Sjkim    if (Gbl_UseDefaultAmlFilename)
436209746Sjkim    {
437209746Sjkim        Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
438209746Sjkim    }
439209746Sjkim
440209746Sjkim    /* Open the optional output files (listings, etc.) */
441209746Sjkim
442209746Sjkim    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
443209746Sjkim    if (ACPI_FAILURE (Status))
444209746Sjkim    {
445209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
446209746Sjkim        return (AE_ERROR);
447209746Sjkim    }
448209746Sjkim
449209746Sjkim    /*
450209746Sjkim     * Compilation of ASL source versus DataTable source uses different
451209746Sjkim     * compiler subsystems
452209746Sjkim     */
453209746Sjkim    switch (Gbl_FileType)
454209746Sjkim    {
455209746Sjkim    /*
456209746Sjkim     * Data Table Compilation
457209746Sjkim     */
458209746Sjkim    case ASL_INPUT_TYPE_ASCII_DATA:
459209746Sjkim
460209746Sjkim        Status = DtDoCompile ();
461234623Sjkim        if (ACPI_FAILURE (Status))
462234623Sjkim        {
463234623Sjkim            return (Status);
464234623Sjkim        }
465209746Sjkim
466209746Sjkim        if (Gbl_Signature)
467193267Sjkim        {
468209746Sjkim            ACPI_FREE (Gbl_Signature);
469209746Sjkim            Gbl_Signature = NULL;
470193267Sjkim        }
471234623Sjkim
472234623Sjkim        /* Check if any errors occurred during compile */
473234623Sjkim
474234623Sjkim        Status = AslCheckForErrorExit ();
475234623Sjkim        if (ACPI_FAILURE (Status))
476234623Sjkim        {
477234623Sjkim            return (Status);
478234623Sjkim        }
479234623Sjkim
480234623Sjkim        /* Cleanup (for next source file) and exit */
481234623Sjkim
482209746Sjkim        AeClearErrorLog ();
483233250Sjkim        PrTerminatePreprocessor ();
484209746Sjkim        return (Status);
485193267Sjkim
486209746Sjkim    /*
487234623Sjkim     * ASL Compilation
488209746Sjkim     */
489209746Sjkim    case ASL_INPUT_TYPE_ASCII_ASL:
490193267Sjkim
491209746Sjkim        /* ACPICA subsystem initialization */
492209746Sjkim
493193267Sjkim        Status = AdInitialize ();
494193267Sjkim        if (ACPI_FAILURE (Status))
495193267Sjkim        {
496193267Sjkim            return (Status);
497193267Sjkim        }
498193267Sjkim
499234623Sjkim        (void) CmDoCompile ();
500212761Sjkim        (void) AcpiTerminate ();
501193267Sjkim
502234623Sjkim        /* Check if any errors occurred during compile */
503234623Sjkim
504234623Sjkim        Status = AslCheckForErrorExit ();
505234623Sjkim        if (ACPI_FAILURE (Status))
506193267Sjkim        {
507234623Sjkim            return (Status);
508193267Sjkim        }
509193267Sjkim
510234623Sjkim        /* Cleanup (for next source file) and exit */
511234623Sjkim
512193267Sjkim        AeClearErrorLog ();
513233250Sjkim        PrTerminatePreprocessor ();
514209746Sjkim        return (AE_OK);
515209746Sjkim
516246849Sjkim    /*
517246849Sjkim     * Binary ACPI table was auto-detected, disassemble it
518246849Sjkim     */
519246849Sjkim    case ASL_INPUT_TYPE_ACPI_TABLE:
520246849Sjkim
521246849Sjkim        /* We have what appears to be an ACPI table, disassemble it */
522246849Sjkim
523246849Sjkim        FlCloseFile (ASL_FILE_INPUT);
524246849Sjkim        Gbl_DoCompile = FALSE;
525246849Sjkim        Gbl_DisasmFlag = TRUE;
526246849Sjkim        Status = AslDoDisassembly ();
527246849Sjkim        return (Status);
528246849Sjkim
529246849Sjkim    /* Unknown binary table */
530246849Sjkim
531209746Sjkim    case ASL_INPUT_TYPE_BINARY:
532209746Sjkim
533209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
534209746Sjkim        return (AE_ERROR);
535209746Sjkim
536209746Sjkim    default:
537250838Sjkim
538209746Sjkim        printf ("Unknown file type %X\n", Gbl_FileType);
539209746Sjkim        return (AE_ERROR);
540193267Sjkim    }
541193267Sjkim}
542193267Sjkim
543193267Sjkim
544193267Sjkim/*******************************************************************************
545193267Sjkim *
546193267Sjkim * FUNCTION:    AslDoOnePathname
547193267Sjkim *
548193267Sjkim * PARAMETERS:  Pathname            - Full pathname, possibly with wildcards
549193267Sjkim *
550193267Sjkim * RETURN:      Status
551193267Sjkim *
552193267Sjkim * DESCRIPTION: Process one pathname, possible terminated with a wildcard
553193267Sjkim *              specification. If a wildcard, it is expanded and the multiple
554193267Sjkim *              files are processed.
555193267Sjkim *
556193267Sjkim ******************************************************************************/
557193267Sjkim
558193267SjkimACPI_STATUS
559193267SjkimAslDoOnePathname (
560210976Sjkim    char                    *Pathname,
561210976Sjkim    ASL_PATHNAME_CALLBACK   PathCallback)
562193267Sjkim{
563209746Sjkim    ACPI_STATUS             Status = AE_OK;
564212761Sjkim    char                    **WildcardList;
565193267Sjkim    char                    *Filename;
566193267Sjkim    char                    *FullPathname;
567193267Sjkim
568193267Sjkim
569193267Sjkim    /* Split incoming path into a directory/filename combo */
570193267Sjkim
571193267Sjkim    Status = FlSplitInputPathname (Pathname, &Gbl_DirectoryPath, &Filename);
572193267Sjkim    if (ACPI_FAILURE (Status))
573193267Sjkim    {
574193267Sjkim        return (Status);
575193267Sjkim    }
576193267Sjkim
577193267Sjkim    /* Expand possible wildcard into a file list (Windows/DOS only) */
578193267Sjkim
579212761Sjkim    WildcardList = AsDoWildcard (Gbl_DirectoryPath, Filename);
580212761Sjkim    while (*WildcardList)
581193267Sjkim    {
582193267Sjkim        FullPathname = ACPI_ALLOCATE (
583212761Sjkim            strlen (Gbl_DirectoryPath) + strlen (*WildcardList) + 1);
584193267Sjkim
585193267Sjkim        /* Construct a full path to the file */
586193267Sjkim
587193267Sjkim        strcpy (FullPathname, Gbl_DirectoryPath);
588212761Sjkim        strcat (FullPathname, *WildcardList);
589193267Sjkim
590193267Sjkim        /*
591193267Sjkim         * If -p not specified, we will use the input filename as the
592193267Sjkim         * output filename prefix
593193267Sjkim         */
594193267Sjkim        if (Gbl_UseDefaultAmlFilename)
595193267Sjkim        {
596193267Sjkim            Gbl_OutputFilenamePrefix = FullPathname;
597193267Sjkim        }
598193267Sjkim
599209746Sjkim        /* Save status from all compiles */
600193267Sjkim
601210976Sjkim        Status |= (*PathCallback) (FullPathname);
602209746Sjkim
603193267Sjkim        ACPI_FREE (FullPathname);
604212761Sjkim        ACPI_FREE (*WildcardList);
605212761Sjkim        *WildcardList = NULL;
606212761Sjkim        WildcardList++;
607193267Sjkim    }
608193267Sjkim
609193267Sjkim    ACPI_FREE (Gbl_DirectoryPath);
610193267Sjkim    ACPI_FREE (Filename);
611209746Sjkim    return (Status);
612193267Sjkim}
613193267Sjkim
614234623Sjkim
615234623Sjkim/*******************************************************************************
616234623Sjkim *
617234623Sjkim * FUNCTION:    AslCheckForErrorExit
618234623Sjkim *
619234623Sjkim * PARAMETERS:  None. Examines global exception count array
620234623Sjkim *
621234623Sjkim * RETURN:      Status
622234623Sjkim *
623234623Sjkim * DESCRIPTION: Determine if compiler should abort with error status
624234623Sjkim *
625234623Sjkim ******************************************************************************/
626234623Sjkim
627234623SjkimACPI_STATUS
628234623SjkimAslCheckForErrorExit (
629234623Sjkim    void)
630234623Sjkim{
631234623Sjkim
632234623Sjkim    /*
633234623Sjkim     * Return non-zero exit code if there have been errors, unless the
634234623Sjkim     * global ignore error flag has been set
635234623Sjkim     */
636234623Sjkim    if (!Gbl_IgnoreErrors)
637234623Sjkim    {
638234623Sjkim        if (Gbl_ExceptionCount[ASL_ERROR] > 0)
639234623Sjkim        {
640234623Sjkim            return (AE_ERROR);
641234623Sjkim        }
642234623Sjkim
643234623Sjkim        /* Optionally treat warnings as errors */
644234623Sjkim
645234623Sjkim        if (Gbl_WarningsAsErrors)
646234623Sjkim        {
647234623Sjkim            if ((Gbl_ExceptionCount[ASL_WARNING] > 0)  ||
648234623Sjkim                (Gbl_ExceptionCount[ASL_WARNING2] > 0) ||
649234623Sjkim                (Gbl_ExceptionCount[ASL_WARNING3] > 0))
650234623Sjkim            {
651234623Sjkim                return (AE_ERROR);
652234623Sjkim            }
653234623Sjkim        }
654234623Sjkim    }
655234623Sjkim
656234623Sjkim    return (AE_OK);
657234623Sjkim}
658