1118613Snjl/******************************************************************************
2118613Snjl *
3118613Snjl * Module Name: adisasm - Application-level disassembler routines
4118613Snjl *
5118613Snjl *****************************************************************************/
6118613Snjl
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9118613Snjl * All rights reserved.
10118613Snjl *
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.
25118613Snjl *
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.
29118613Snjl *
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 */
43118613Snjl
44281075Sdim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45193529Sjkim#include <contrib/dev/acpica/include/amlcode.h>
46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
47193529Sjkim#include <contrib/dev/acpica/include/acdispat.h>
48193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
49306536Sjkim#include <contrib/dev/acpica/include/acparser.h>
50193529Sjkim#include <contrib/dev/acpica/include/acapps.h>
51118613Snjl
52118613Snjl#include <stdio.h>
53118613Snjl
54118613Snjl
55118613Snjl#define _COMPONENT          ACPI_TOOLS
56118613Snjl        ACPI_MODULE_NAME    ("adisasm")
57118613Snjl
58167802Sjkim/* Local prototypes */
59167802Sjkim
60306536Sjkimstatic ACPI_STATUS
61306536SjkimAdDoExternalFileList (
62306536Sjkim    char                    *Filename);
63306536Sjkim
64306536Sjkimstatic ACPI_STATUS
65306536SjkimAdDisassembleOneTable (
66306536Sjkim    ACPI_TABLE_HEADER       *Table,
67306536Sjkim    FILE                    *File,
68167802Sjkim    char                    *Filename,
69306536Sjkim    char                    *DisasmFilename);
70167802Sjkim
71281687Sjkimstatic ACPI_STATUS
72306536SjkimAdReparseOneTable (
73281687Sjkim    ACPI_TABLE_HEADER       *Table,
74306536Sjkim    FILE                    *File,
75306536Sjkim    ACPI_OWNER_ID           OwnerId);
76281687Sjkim
77167802Sjkim
78306536SjkimACPI_TABLE_DESC             LocalTables[1];
79306536SjkimACPI_PARSE_OBJECT           *AcpiGbl_ParseOpRoot;
80306536Sjkim
81306536Sjkim
82306536Sjkim/* Stubs for everything except ASL compiler */
83306536Sjkim
84151937Sjkim#ifndef ACPI_ASL_COMPILER
85118613SnjlBOOLEAN
86118613SnjlAcpiDsIsResultUsed (
87118613Snjl    ACPI_PARSE_OBJECT       *Op,
88118613Snjl    ACPI_WALK_STATE         *WalkState)
89118613Snjl{
90306536Sjkim    return (TRUE);
91118613Snjl}
92167802Sjkim
93167802SjkimACPI_STATUS
94167802SjkimAcpiDsMethodError (
95167802Sjkim    ACPI_STATUS             Status,
96167802Sjkim    ACPI_WALK_STATE         *WalkState)
97167802Sjkim{
98167802Sjkim    return (Status);
99167802Sjkim}
100118613Snjl#endif
101118613Snjl
102167802Sjkim
103118613Snjl/*******************************************************************************
104118613Snjl *
105118613Snjl * FUNCTION:    AdInitialize
106118613Snjl *
107198237Sjkim * PARAMETERS:  None
108118613Snjl *
109118613Snjl * RETURN:      Status
110118613Snjl *
111198237Sjkim * DESCRIPTION: ACPICA and local initialization
112118613Snjl *
113118613Snjl ******************************************************************************/
114118613Snjl
115118613SnjlACPI_STATUS
116118613SnjlAdInitialize (
117118613Snjl    void)
118118613Snjl{
119118613Snjl    ACPI_STATUS             Status;
120118613Snjl
121118613Snjl
122281075Sdim    /* ACPICA subsystem initialization */
123118613Snjl
124167802Sjkim    Status = AcpiOsInitialize ();
125193529Sjkim    if (ACPI_FAILURE (Status))
126193529Sjkim    {
127193529Sjkim        return (Status);
128193529Sjkim    }
129167802Sjkim
130193529Sjkim    Status = AcpiUtInitGlobals ();
131193529Sjkim    if (ACPI_FAILURE (Status))
132193529Sjkim    {
133193529Sjkim        return (Status);
134193529Sjkim    }
135193529Sjkim
136118613Snjl    Status = AcpiUtMutexInitialize ();
137118613Snjl    if (ACPI_FAILURE (Status))
138118613Snjl    {
139193529Sjkim        return (Status);
140118613Snjl    }
141118613Snjl
142118613Snjl    Status = AcpiNsRootInitialize ();
143167802Sjkim    if (ACPI_FAILURE (Status))
144167802Sjkim    {
145193529Sjkim        return (Status);
146167802Sjkim    }
147167802Sjkim
148167802Sjkim    /* Setup the Table Manager (cheat - there is no RSDT) */
149167802Sjkim
150207344Sjkim    AcpiGbl_RootTableList.MaxTableCount = 1;
151207344Sjkim    AcpiGbl_RootTableList.CurrentTableCount = 0;
152167802Sjkim    AcpiGbl_RootTableList.Tables = LocalTables;
153167802Sjkim
154193529Sjkim    return (Status);
155118613Snjl}
156118613Snjl
157118613Snjl
158118613Snjl/******************************************************************************
159118613Snjl *
160118613Snjl * FUNCTION:    AdAmlDisassemble
161118613Snjl *
162198237Sjkim * PARAMETERS:  Filename            - AML input filename
163198237Sjkim *              OutToFile           - TRUE if output should go to a file
164198237Sjkim *              Prefix              - Path prefix for output
165198237Sjkim *              OutFilename         - where the filename is returned
166118613Snjl *
167118613Snjl * RETURN:      Status
168118613Snjl *
169306536Sjkim * DESCRIPTION: Disassembler entry point. Disassemble an entire ACPI table.
170118613Snjl *
171118613Snjl *****************************************************************************/
172118613Snjl
173118613SnjlACPI_STATUS
174118613SnjlAdAmlDisassemble (
175118613Snjl    BOOLEAN                 OutToFile,
176118613Snjl    char                    *Filename,
177118613Snjl    char                    *Prefix,
178281075Sdim    char                    **OutFilename)
179118613Snjl{
180118613Snjl    ACPI_STATUS             Status;
181118613Snjl    char                    *DisasmFilename = NULL;
182118613Snjl    FILE                    *File = NULL;
183193529Sjkim    ACPI_TABLE_HEADER       *Table = NULL;
184306536Sjkim    ACPI_NEW_TABLE_DESC     *ListHead = NULL;
185118613Snjl
186118613Snjl
187118613Snjl    /*
188198237Sjkim     * Input: AML code from either a file or via GetTables (memory or
189198237Sjkim     * registry)
190118613Snjl     */
191118613Snjl    if (Filename)
192118613Snjl    {
193306536Sjkim        /* Get the list of all AML tables in the file */
194306536Sjkim
195306536Sjkim        Status = AcGetAllTablesFromFile (Filename,
196306536Sjkim            ACPI_GET_ALL_TABLES, &ListHead);
197118613Snjl        if (ACPI_FAILURE (Status))
198118613Snjl        {
199306536Sjkim            AcpiOsPrintf ("Could not get ACPI tables from %s, %s\n",
200306536Sjkim                Filename, AcpiFormatException (Status));
201241973Sjkim            return (Status);
202118613Snjl        }
203167802Sjkim
204306536Sjkim        /* Process any user-specified files for external objects */
205193529Sjkim
206306536Sjkim        Status = AdDoExternalFileList (Filename);
207306536Sjkim        if (ACPI_FAILURE (Status))
208284460Sjkim        {
209306536Sjkim            return (Status);
210284460Sjkim        }
211118613Snjl    }
212118613Snjl    else
213118613Snjl    {
214281075Sdim        Status = AdGetLocalTables ();
215118613Snjl        if (ACPI_FAILURE (Status))
216118613Snjl        {
217118613Snjl            AcpiOsPrintf ("Could not get ACPI tables, %s\n",
218118613Snjl                AcpiFormatException (Status));
219241973Sjkim            return (Status);
220118613Snjl        }
221118613Snjl
222306536Sjkim        if (!AcpiGbl_DmOpt_Disasm)
223118613Snjl        {
224241973Sjkim            return (AE_OK);
225118613Snjl        }
226118613Snjl
227167802Sjkim        /* Obtained the local tables, just disassemble the DSDT */
228118613Snjl
229167802Sjkim        Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table);
230167802Sjkim        if (ACPI_FAILURE (Status))
231167802Sjkim        {
232167802Sjkim            AcpiOsPrintf ("Could not get DSDT, %s\n",
233167802Sjkim                AcpiFormatException (Status));
234241973Sjkim            return (Status);
235167802Sjkim        }
236167802Sjkim
237118613Snjl        AcpiOsPrintf ("\nDisassembly of DSDT\n");
238167802Sjkim        Prefix = AdGenerateFilename ("dsdt", Table->OemTableId);
239118613Snjl    }
240118613Snjl
241118613Snjl    /*
242246849Sjkim     * Output: ASL code. Redirect to a file if requested
243118613Snjl     */
244118613Snjl    if (OutToFile)
245118613Snjl    {
246118613Snjl        /* Create/Open a disassembly output file */
247118613Snjl
248118613Snjl        DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY);
249281075Sdim        if (!DisasmFilename)
250118613Snjl        {
251118613Snjl            fprintf (stderr, "Could not generate output filename\n");
252123315Snjl            Status = AE_ERROR;
253123315Snjl            goto Cleanup;
254118613Snjl        }
255118613Snjl
256118613Snjl        File = fopen (DisasmFilename, "w+");
257118613Snjl        if (!File)
258118613Snjl        {
259306536Sjkim            fprintf (stderr, "Could not open output file %s\n",
260306536Sjkim                DisasmFilename);
261123315Snjl            Status = AE_ERROR;
262123315Snjl            goto Cleanup;
263118613Snjl        }
264118613Snjl
265118613Snjl        AcpiOsRedirectOutput (File);
266118613Snjl    }
267118613Snjl
268118613Snjl    *OutFilename = DisasmFilename;
269118613Snjl
270306536Sjkim    /* Disassemble all AML tables within the file */
271281687Sjkim
272306536Sjkim    while (ListHead)
273167802Sjkim    {
274306536Sjkim        Status = AdDisassembleOneTable (ListHead->Table,
275306536Sjkim            File, Filename, DisasmFilename);
276167802Sjkim        if (ACPI_FAILURE (Status))
277167802Sjkim        {
278306536Sjkim            break;
279167802Sjkim        }
280128212Snjl
281306536Sjkim        ListHead = ListHead->Next;
282118613Snjl    }
283118613Snjl
284118613SnjlCleanup:
285193529Sjkim
286306536Sjkim    if (Table &&
287306536Sjkim        !AcpiGbl_ForceAmlDisassembly &&
288306536Sjkim        !AcpiUtIsAmlTable (Table))
289193529Sjkim    {
290193529Sjkim        ACPI_FREE (Table);
291193529Sjkim    }
292193529Sjkim
293281075Sdim    if (File)
294118613Snjl    {
295118613Snjl        fclose (File);
296118613Snjl        AcpiOsRedirectOutput (stdout);
297118613Snjl    }
298118613Snjl
299167802Sjkim    AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
300193529Sjkim    AcpiGbl_ParseOpRoot = NULL;
301193529Sjkim    return (Status);
302118613Snjl}
303118613Snjl
304118613Snjl
305118613Snjl/******************************************************************************
306118613Snjl *
307306536Sjkim * FUNCTION:    AdDisassembleOneTable
308167802Sjkim *
309306536Sjkim * PARAMETERS:  Table               - Raw AML table
310306536Sjkim *              File                - Pointer for the input file
311306536Sjkim *              Filename            - AML input filename
312306536Sjkim *              DisasmFilename      - Output filename
313167802Sjkim *
314306536Sjkim * RETURN:      Status
315167802Sjkim *
316306536Sjkim * DESCRIPTION: Disassemble a single ACPI table. AML or data table.
317167802Sjkim *
318167802Sjkim *****************************************************************************/
319167802Sjkim
320306536Sjkimstatic ACPI_STATUS
321306536SjkimAdDisassembleOneTable (
322306536Sjkim    ACPI_TABLE_HEADER       *Table,
323306536Sjkim    FILE                    *File,
324281687Sjkim    char                    *Filename,
325306536Sjkim    char                    *DisasmFilename)
326167802Sjkim{
327306536Sjkim    ACPI_STATUS             Status;
328306536Sjkim    ACPI_OWNER_ID           OwnerId;
329167802Sjkim
330281075Sdim
331306536Sjkim    /* ForceAmlDisassembly means to assume the table contains valid AML */
332167802Sjkim
333306536Sjkim    if (!AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table))
334306536Sjkim    {
335306536Sjkim        AdDisassemblerHeader (Filename, ACPI_IS_DATA_TABLE);
336167802Sjkim
337306536Sjkim        /* This is a "Data Table" (non-AML table) */
338167802Sjkim
339306536Sjkim        AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n",
340306536Sjkim            Table->Signature);
341306536Sjkim        AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength]  "
342306536Sjkim            "FieldName : FieldValue\n */\n\n");
343306536Sjkim
344306536Sjkim        AcpiDmDumpDataTable (Table);
345306536Sjkim        fprintf (stderr, "Acpi Data Table [%4.4s] decoded\n",
346306536Sjkim            Table->Signature);
347306536Sjkim
348306536Sjkim        if (File)
349281687Sjkim        {
350306536Sjkim            fprintf (stderr, "Formatted output:  %s - %u bytes\n",
351306536Sjkim                DisasmFilename, CmGetFileSize (File));
352281687Sjkim        }
353306536Sjkim
354306536Sjkim        return (AE_OK);
355281075Sdim    }
356281075Sdim
357306536Sjkim    /*
358306536Sjkim     * This is an AML table (DSDT or SSDT).
359306536Sjkim     * Always parse the tables, only option is what to display
360306536Sjkim     */
361306536Sjkim    Status = AdParseTable (Table, &OwnerId, TRUE, FALSE);
362306536Sjkim    if (ACPI_FAILURE (Status))
363306536Sjkim    {
364306536Sjkim        AcpiOsPrintf ("Could not parse ACPI tables, %s\n",
365306536Sjkim            AcpiFormatException (Status));
366306536Sjkim        return (Status);
367306536Sjkim    }
368167802Sjkim
369306536Sjkim    /* Debug output, namespace and parse tree */
370167802Sjkim
371306536Sjkim    if (AslCompilerdebug && File)
372306536Sjkim    {
373306536Sjkim        AcpiOsPrintf ("/**** Before second load\n");
374118613Snjl
375306536Sjkim        NsSetupNamespaceListing (File);
376306536Sjkim        NsDisplayNamespace ();
377118613Snjl
378306536Sjkim        AcpiOsPrintf ("*****/\n");
379306536Sjkim    }
380118613Snjl
381306536Sjkim    /* Load namespace from names created within control methods */
382306536Sjkim
383306536Sjkim    AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot,
384306536Sjkim        AcpiGbl_RootNode, OwnerId);
385306536Sjkim
386193529Sjkim    /*
387306536Sjkim     * Cross reference the namespace here, in order to
388306536Sjkim     * generate External() statements
389193529Sjkim     */
390306536Sjkim    AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot,
391306536Sjkim        AcpiGbl_RootNode, OwnerId);
392118613Snjl
393306536Sjkim    if (AslCompilerdebug)
394306536Sjkim    {
395306536Sjkim        AcpiDmDumpTree (AcpiGbl_ParseOpRoot);
396306536Sjkim    }
397193529Sjkim
398306536Sjkim    /* Find possible calls to external control methods */
399193529Sjkim
400306536Sjkim    AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot);
401193529Sjkim
402306536Sjkim    /*
403306536Sjkim     * If we found any external control methods, we must reparse
404306536Sjkim     * the entire tree with the new information (namely, the
405306536Sjkim     * number of arguments per method)
406306536Sjkim     */
407306536Sjkim    if (AcpiDmGetExternalMethodCount ())
408193529Sjkim    {
409306536Sjkim        Status = AdReparseOneTable (Table, File, OwnerId);
410306536Sjkim        if (ACPI_FAILURE (Status))
411193529Sjkim        {
412306536Sjkim            return (Status);
413193529Sjkim        }
414193529Sjkim    }
415193529Sjkim
416306536Sjkim    /*
417306536Sjkim     * Now that the namespace is finalized, we can perform namespace
418306536Sjkim     * transforms.
419306536Sjkim     *
420306536Sjkim     * 1) Convert fixed-offset references to resource descriptors
421306536Sjkim     *    to symbolic references (Note: modifies namespace)
422306536Sjkim     */
423306536Sjkim    AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
424193529Sjkim
425306536Sjkim    /* Optional displays */
426193529Sjkim
427306536Sjkim    if (AcpiGbl_DmOpt_Disasm)
428193529Sjkim    {
429306536Sjkim        /* This is the real disassembly */
430193529Sjkim
431306536Sjkim        AdDisplayTables (Filename, Table);
432118613Snjl
433306536Sjkim        /* Dump hex table if requested (-vt) */
434167802Sjkim
435306536Sjkim        AcpiDmDumpDataTable (Table);
436306536Sjkim
437306536Sjkim        fprintf (stderr, "Disassembly completed\n");
438306536Sjkim        if (File)
439281075Sdim        {
440306536Sjkim            fprintf (stderr, "ASL Output:    %s - %u bytes\n",
441306536Sjkim                DisasmFilename, CmGetFileSize (File));
442281075Sdim        }
443167802Sjkim
444306536Sjkim        if (Gbl_MapfileFlag)
445306536Sjkim        {
446306536Sjkim            fprintf (stderr, "%14s %s - %u bytes\n",
447306536Sjkim                Gbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription,
448306536Sjkim                Gbl_Files[ASL_FILE_MAP_OUTPUT].Filename,
449306536Sjkim                FlGetFileSize (ASL_FILE_MAP_OUTPUT));
450306536Sjkim        }
451281075Sdim    }
452281075Sdim
453306536Sjkim    return (AE_OK);
454118613Snjl}
455118613Snjl
456118613Snjl
457118613Snjl/******************************************************************************
458118613Snjl *
459306536Sjkim * FUNCTION:    AdReparseOneTable
460118613Snjl *
461306536Sjkim * PARAMETERS:  Table               - Raw AML table
462306536Sjkim *              File                - Pointer for the input file
463306536Sjkim *              OwnerId             - ID for this table
464118613Snjl *
465118613Snjl * RETURN:      Status
466118613Snjl *
467306536Sjkim * DESCRIPTION: Reparse a table that has already been loaded. Used to
468306536Sjkim *              integrate information about external control methods.
469306536Sjkim *              These methods may have been previously parsed incorrectly.
470118613Snjl *
471118613Snjl *****************************************************************************/
472118613Snjl
473306536Sjkimstatic ACPI_STATUS
474306536SjkimAdReparseOneTable (
475306536Sjkim    ACPI_TABLE_HEADER       *Table,
476306536Sjkim    FILE                    *File,
477306536Sjkim    ACPI_OWNER_ID           OwnerId)
478118613Snjl{
479306536Sjkim    ACPI_STATUS             Status;
480118613Snjl
481118613Snjl
482306536Sjkim    fprintf (stderr,
483306536Sjkim        "\nFound %u external control methods, "
484306536Sjkim        "reparsing with new information\n",
485306536Sjkim        AcpiDmGetExternalMethodCount ());
486118613Snjl
487306536Sjkim    /* Reparse, rebuild namespace */
488118613Snjl
489306536Sjkim    AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
490306536Sjkim    AcpiGbl_ParseOpRoot = NULL;
491306536Sjkim    AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode);
492118613Snjl
493306536Sjkim    AcpiGbl_RootNode                    = NULL;
494306536Sjkim    AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
495306536Sjkim    AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
496306536Sjkim    AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
497306536Sjkim    AcpiGbl_RootNodeStruct.Parent       = NULL;
498306536Sjkim    AcpiGbl_RootNodeStruct.Child        = NULL;
499306536Sjkim    AcpiGbl_RootNodeStruct.Peer         = NULL;
500306536Sjkim    AcpiGbl_RootNodeStruct.Object       = NULL;
501306536Sjkim    AcpiGbl_RootNodeStruct.Flags        = 0;
502306536Sjkim
503306536Sjkim    Status = AcpiNsRootInitialize ();
504306536Sjkim    if (ACPI_FAILURE (Status))
505118613Snjl    {
506306536Sjkim        return (Status);
507118613Snjl    }
508118613Snjl
509306536Sjkim    /* New namespace, add the external definitions first */
510118613Snjl
511306536Sjkim    AcpiDmAddExternalsToNamespace ();
512118613Snjl
513306536Sjkim    /* Parse the table again. No need to reload it, however */
514281687Sjkim
515306536Sjkim    Status = AdParseTable (Table, NULL, FALSE, FALSE);
516281687Sjkim    if (ACPI_FAILURE (Status))
517281687Sjkim    {
518306536Sjkim        AcpiOsPrintf ("Could not parse ACPI tables, %s\n",
519306536Sjkim            AcpiFormatException (Status));
520281687Sjkim        return (Status);
521281687Sjkim    }
522281687Sjkim
523306536Sjkim    /* Cross reference the namespace again */
524281687Sjkim
525306536Sjkim    AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot,
526306536Sjkim        AcpiGbl_RootNode, OwnerId);
527281687Sjkim
528306536Sjkim    AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot,
529306536Sjkim        AcpiGbl_RootNode, OwnerId);
530281687Sjkim
531306536Sjkim    /* Debug output - namespace and parse tree */
532118613Snjl
533306536Sjkim    if (AslCompilerdebug)
534118613Snjl    {
535306536Sjkim        AcpiOsPrintf ("/**** After second load and resource conversion\n");
536306536Sjkim        if (File)
537306536Sjkim        {
538306536Sjkim            NsSetupNamespaceListing (File);
539306536Sjkim            NsDisplayNamespace ();
540306536Sjkim        }
541118613Snjl
542306536Sjkim        AcpiOsPrintf ("*****/\n");
543306536Sjkim        AcpiDmDumpTree (AcpiGbl_ParseOpRoot);
544281075Sdim    }
545118613Snjl
546241973Sjkim    return (AE_OK);
547118613Snjl}
548118613Snjl
549167802Sjkim
550118613Snjl/******************************************************************************
551118613Snjl *
552306536Sjkim * FUNCTION:    AdDoExternalFileList
553118613Snjl *
554306536Sjkim * PARAMETERS:  Filename            - Input file for the table
555118613Snjl *
556118613Snjl * RETURN:      Status
557118613Snjl *
558306536Sjkim * DESCRIPTION: Process all tables found in the -e external files list
559118613Snjl *
560118613Snjl *****************************************************************************/
561118613Snjl
562306536Sjkimstatic ACPI_STATUS
563306536SjkimAdDoExternalFileList (
564306536Sjkim    char                    *Filename)
565118613Snjl{
566306536Sjkim    ACPI_EXTERNAL_FILE      *ExternalFileList;
567306536Sjkim    char                    *ExternalFilename;
568306536Sjkim    ACPI_NEW_TABLE_DESC     *ExternalListHead = NULL;
569306536Sjkim    ACPI_STATUS             Status;
570306536Sjkim    ACPI_STATUS             GlobalStatus = AE_OK;
571306536Sjkim    ACPI_OWNER_ID           OwnerId;
572118613Snjl
573118613Snjl
574306536Sjkim    /*
575306536Sjkim     * External filenames are specified on the command line like this:
576306536Sjkim     * Example: iasl -e file1,file2,file3 -d xxx.aml
577306536Sjkim     */
578306536Sjkim    ExternalFileList = AcpiGbl_ExternalFileList;
579118613Snjl
580306536Sjkim    /* Process each external file */
581118613Snjl
582306536Sjkim    while (ExternalFileList)
583118613Snjl    {
584306536Sjkim        ExternalFilename = ExternalFileList->Path;
585306536Sjkim        if (!strcmp (ExternalFilename, Filename))
586306536Sjkim        {
587306536Sjkim            /* Next external file */
588118613Snjl
589306536Sjkim            ExternalFileList = ExternalFileList->Next;
590306536Sjkim            continue;
591306536Sjkim        }
592118613Snjl
593306536Sjkim        AcpiOsPrintf ("External object resolution file %16s\n",
594306536Sjkim            ExternalFilename);
595118613Snjl
596306536Sjkim        Status = AcGetAllTablesFromFile (
597306536Sjkim            ExternalFilename, ACPI_GET_ONLY_AML_TABLES, &ExternalListHead);
598193529Sjkim        if (ACPI_FAILURE (Status))
599193529Sjkim        {
600306536Sjkim            if (Status == AE_TYPE)
601306536Sjkim            {
602306536Sjkim                ExternalFileList = ExternalFileList->Next;
603306536Sjkim                GlobalStatus = AE_TYPE;
604306536Sjkim                Status = AE_OK;
605306536Sjkim                continue;
606306536Sjkim            }
607306536Sjkim
608241973Sjkim            return (Status);
609193529Sjkim        }
610306536Sjkim
611306536Sjkim        /* Load external tables for symbol resolution */
612306536Sjkim
613306536Sjkim        while (ExternalListHead)
614193529Sjkim        {
615306536Sjkim            Status = AdParseTable (
616306536Sjkim                ExternalListHead->Table, &OwnerId, TRUE, TRUE);
617193529Sjkim            if (ACPI_FAILURE (Status))
618193529Sjkim            {
619306536Sjkim                AcpiOsPrintf ("Could not parse external ACPI tables, %s\n",
620306536Sjkim                    AcpiFormatException (Status));
621241973Sjkim                return (Status);
622193529Sjkim            }
623306536Sjkim
624306536Sjkim            /*
625306536Sjkim             * Load namespace from names created within control methods
626306536Sjkim             * Set owner id of nodes in external table
627306536Sjkim             */
628306536Sjkim            AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot,
629306536Sjkim                AcpiGbl_RootNode, OwnerId);
630306536Sjkim            AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
631306536Sjkim
632306536Sjkim            ExternalListHead = ExternalListHead->Next;
633193529Sjkim        }
634306536Sjkim
635306536Sjkim        /* Next external file */
636306536Sjkim
637306536Sjkim        ExternalFileList = ExternalFileList->Next;
638167802Sjkim    }
639167802Sjkim
640306536Sjkim    if (ACPI_FAILURE (GlobalStatus))
641118613Snjl    {
642306536Sjkim        return (GlobalStatus);
643118613Snjl    }
644118613Snjl
645306536Sjkim    /* Clear external list generated by Scope in external tables */
646193529Sjkim
647306536Sjkim    if (AcpiGbl_ExternalFileList)
648193529Sjkim    {
649306536Sjkim        AcpiDmClearExternalList ();
650193529Sjkim    }
651193529Sjkim
652306536Sjkim    /* Load any externals defined in the optional external ref file */
653118613Snjl
654306536Sjkim    AcpiDmGetExternalsFromFile ();
655241973Sjkim    return (AE_OK);
656118613Snjl}
657