1118611Snjl/******************************************************************************
2118611Snjl *
3118611Snjl * Module Name: asllisting - Listing file generation
4118611Snjl *
5118611Snjl *****************************************************************************/
6118611Snjl
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9118611Snjl * All rights reserved.
10118611Snjl *
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.
25118611Snjl *
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.
29118611Snjl *
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 */
43118611Snjl
44151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45118611Snjl#include "aslcompiler.y.h"
46193529Sjkim#include <contrib/dev/acpica/include/amlcode.h>
47193529Sjkim#include <contrib/dev/acpica/include/acparser.h>
48193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
49118611Snjl
50249112Sjkim
51118611Snjl#define _COMPONENT          ACPI_COMPILER
52249112Sjkim        ACPI_MODULE_NAME    ("asllisting")
53118611Snjl
54249112Sjkim
55151937Sjkim/* Local prototypes */
56118611Snjl
57151937Sjkimstatic void
58249112SjkimLsGenerateListing (
59249112Sjkim    UINT32                  FileId);
60151937Sjkim
61151937Sjkimstatic ACPI_STATUS
62151937SjkimLsAmlListingWalk (
63151937Sjkim    ACPI_PARSE_OBJECT       *Op,
64151937Sjkim    UINT32                  Level,
65151937Sjkim    void                    *Context);
66151937Sjkim
67249112Sjkimstatic ACPI_STATUS
68249112SjkimLsTreeWriteWalk (
69249112Sjkim    ACPI_PARSE_OBJECT       *Op,
70249112Sjkim    UINT32                  Level,
71249112Sjkim    void                    *Context);
72151937Sjkim
73151937Sjkimstatic void
74249112SjkimLsWriteNodeToListing (
75249112Sjkim    ACPI_PARSE_OBJECT       *Op,
76151937Sjkim    UINT32                  FileId);
77151937Sjkim
78151937Sjkimstatic void
79151937SjkimLsFinishSourceListing (
80151937Sjkim    UINT32                  FileId);
81151937Sjkim
82151937Sjkim
83118611Snjl/*******************************************************************************
84118611Snjl *
85245582Sjkim * FUNCTION:    LsDoListings
86245582Sjkim *
87249112Sjkim * PARAMETERS:  None. Examines the various output file global flags.
88245582Sjkim *
89245582Sjkim * RETURN:      None
90245582Sjkim *
91245582Sjkim * DESCRIPTION: Generate all requested listing files.
92245582Sjkim *
93245582Sjkim ******************************************************************************/
94245582Sjkim
95245582Sjkimvoid
96245582SjkimLsDoListings (
97245582Sjkim    void)
98245582Sjkim{
99245582Sjkim
100245582Sjkim    if (Gbl_C_OutputFlag)
101245582Sjkim    {
102245582Sjkim        LsGenerateListing (ASL_FILE_C_SOURCE_OUTPUT);
103245582Sjkim    }
104245582Sjkim
105245582Sjkim    if (Gbl_ListingFlag)
106245582Sjkim    {
107245582Sjkim        LsGenerateListing (ASL_FILE_LISTING_OUTPUT);
108245582Sjkim    }
109245582Sjkim
110245582Sjkim    if (Gbl_AsmOutputFlag)
111245582Sjkim    {
112245582Sjkim        LsGenerateListing (ASL_FILE_ASM_SOURCE_OUTPUT);
113245582Sjkim    }
114245582Sjkim
115245582Sjkim    if (Gbl_C_IncludeOutputFlag)
116245582Sjkim    {
117245582Sjkim        LsGenerateListing (ASL_FILE_C_INCLUDE_OUTPUT);
118245582Sjkim    }
119245582Sjkim
120245582Sjkim    if (Gbl_AsmIncludeOutputFlag)
121245582Sjkim    {
122245582Sjkim        LsGenerateListing (ASL_FILE_ASM_INCLUDE_OUTPUT);
123245582Sjkim    }
124245582Sjkim
125249112Sjkim    if (Gbl_C_OffsetTableFlag)
126167802Sjkim    {
127249112Sjkim        LsGenerateListing (ASL_FILE_C_OFFSET_OUTPUT);
128167802Sjkim    }
129167802Sjkim}
130167802Sjkim
131167802Sjkim
132167802Sjkim/*******************************************************************************
133167802Sjkim *
134249112Sjkim * FUNCTION:    LsGenerateListing
135118611Snjl *
136249112Sjkim * PARAMETERS:  FileId      - ID of listing file
137118611Snjl *
138245582Sjkim * RETURN:      None
139118611Snjl *
140249112Sjkim * DESCRIPTION: Generate a listing file. This can be one of the several types
141249112Sjkim *              of "listings" supported.
142118611Snjl *
143118611Snjl ******************************************************************************/
144118611Snjl
145151937Sjkimstatic void
146249112SjkimLsGenerateListing (
147249112Sjkim    UINT32                  FileId)
148118611Snjl{
149118611Snjl
150249112Sjkim    /* Start at the beginning of both the source and AML files */
151118611Snjl
152249112Sjkim    FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0);
153249112Sjkim    FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
154249112Sjkim    Gbl_SourceLine = 0;
155249112Sjkim    Gbl_CurrentHexColumn = 0;
156249112Sjkim    LsPushNode (Gbl_Files[ASL_FILE_INPUT].Filename);
157249112Sjkim
158249112Sjkim    if (FileId == ASL_FILE_C_OFFSET_OUTPUT)
159118611Snjl    {
160250838Sjkim        Gbl_CurrentAmlOffset = 0;
161250838Sjkim
162249112Sjkim        /* Offset table file has a special header and footer */
163118611Snjl
164249112Sjkim        LsDoOffsetTableHeader (FileId);
165249112Sjkim
166306536Sjkim        TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
167306536Sjkim            LsAmlOffsetWalk, NULL, (void *) ACPI_TO_POINTER (FileId));
168249112Sjkim        LsDoOffsetTableFooter (FileId);
169249112Sjkim        return;
170118611Snjl    }
171118611Snjl
172249112Sjkim    /* Process all parse nodes */
173118611Snjl
174306536Sjkim    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
175306536Sjkim        LsAmlListingWalk, NULL, (void *) ACPI_TO_POINTER (FileId));
176118611Snjl
177249112Sjkim    /* Final processing */
178118611Snjl
179249112Sjkim    LsFinishSourceListing (FileId);
180118611Snjl}
181118611Snjl
182118611Snjl
183118611Snjl/*******************************************************************************
184118611Snjl *
185118611Snjl * FUNCTION:    LsAmlListingWalk
186118611Snjl *
187118611Snjl * PARAMETERS:  ASL_WALK_CALLBACK
188118611Snjl *
189118611Snjl * RETURN:      Status
190118611Snjl *
191118611Snjl * DESCRIPTION: Process one node during a listing file generation.
192118611Snjl *
193118611Snjl ******************************************************************************/
194118611Snjl
195151937Sjkimstatic ACPI_STATUS
196118611SnjlLsAmlListingWalk (
197118611Snjl    ACPI_PARSE_OBJECT       *Op,
198118611Snjl    UINT32                  Level,
199118611Snjl    void                    *Context)
200118611Snjl{
201118611Snjl    UINT8                   FileByte;
202118611Snjl    UINT32                  i;
203167802Sjkim    UINT32                  FileId = (UINT32) ACPI_TO_INTEGER (Context);
204118611Snjl
205118611Snjl
206118611Snjl    LsWriteNodeToListing (Op, FileId);
207118611Snjl
208167802Sjkim    if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DATA)
209167802Sjkim    {
210167802Sjkim        /* Buffer is a resource template, don't dump the data all at once */
211167802Sjkim
212167802Sjkim        return (AE_OK);
213167802Sjkim    }
214167802Sjkim
215306536Sjkim    if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
216306536Sjkim        (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
217306536Sjkim    {
218306536Sjkim        return (AE_OK);
219306536Sjkim    }
220306536Sjkim
221118611Snjl    /* Write the hex bytes to the listing file(s) (if requested) */
222118611Snjl
223118611Snjl    for (i = 0; i < Op->Asl.FinalAmlLength; i++)
224118611Snjl    {
225118611Snjl        if (ACPI_FAILURE (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1)))
226118611Snjl        {
227118611Snjl            FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ);
228118611Snjl            AslAbort ();
229118611Snjl        }
230306536Sjkim
231118611Snjl        LsWriteListingHexBytes (&FileByte, 1, FileId);
232118611Snjl    }
233118611Snjl
234118611Snjl    return (AE_OK);
235118611Snjl}
236118611Snjl
237118611Snjl
238118611Snjl/*******************************************************************************
239118611Snjl *
240249112Sjkim * FUNCTION:    LsDumpParseTree, LsTreeWriteWalk
241118611Snjl *
242249112Sjkim * PARAMETERS:  None
243118611Snjl *
244118611Snjl * RETURN:      None
245118611Snjl *
246249112Sjkim * DESCRIPTION: Dump entire parse tree, for compiler debug only
247118611Snjl *
248118611Snjl ******************************************************************************/
249118611Snjl
250249112Sjkimvoid
251249112SjkimLsDumpParseTree (
252151937Sjkim    void)
253118611Snjl{
254118611Snjl
255249112Sjkim    if (!Gbl_DebugFlag)
256118611Snjl    {
257118611Snjl        return;
258118611Snjl    }
259118611Snjl
260249112Sjkim    DbgPrint (ASL_TREE_OUTPUT, "\nOriginal parse tree from parser:\n\n");
261306536Sjkim    DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER1);
262306536Sjkim
263306536Sjkim    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
264249112Sjkim        LsTreeWriteWalk, NULL, NULL);
265306536Sjkim
266306536Sjkim    DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER1);
267118611Snjl}
268118611Snjl
269118611Snjl
270249112Sjkimstatic ACPI_STATUS
271249112SjkimLsTreeWriteWalk (
272249112Sjkim    ACPI_PARSE_OBJECT       *Op,
273249112Sjkim    UINT32                  Level,
274249112Sjkim    void                    *Context)
275118611Snjl{
276118611Snjl
277306536Sjkim    /* Dump ParseOp name and possible value */
278118611Snjl
279306536Sjkim    switch (Op->Asl.ParseOpcode)
280306536Sjkim    {
281306536Sjkim        case PARSEOP_NAMESEG:
282306536Sjkim        case PARSEOP_NAMESTRING:
283306536Sjkim        case PARSEOP_METHODCALL:
284306536Sjkim        case PARSEOP_STRING_LITERAL:
285250838Sjkim
286306536Sjkim        UtDumpStringOp (Op, Level);
287306536Sjkim        break;
288118611Snjl
289306536Sjkim    case PARSEOP_BYTECONST:
290306536Sjkim
291306536Sjkim        UtDumpIntegerOp (Op, Level, 2);
292306536Sjkim        break;
293306536Sjkim
294306536Sjkim    case PARSEOP_WORDCONST:
295306536Sjkim    case PARSEOP_PACKAGE_LENGTH:
296306536Sjkim
297306536Sjkim        UtDumpIntegerOp (Op, Level, 4);
298306536Sjkim        break;
299306536Sjkim
300306536Sjkim    case PARSEOP_DWORDCONST:
301306536Sjkim    case PARSEOP_EISAID:
302306536Sjkim
303306536Sjkim        UtDumpIntegerOp (Op, Level, 8);
304306536Sjkim        break;
305306536Sjkim
306306536Sjkim    case PARSEOP_QWORDCONST:
307306536Sjkim    case PARSEOP_INTEGER:
308306536Sjkim    case PARSEOP_ONE:
309306536Sjkim    case PARSEOP_ZERO:
310306536Sjkim    case PARSEOP_ONES:
311306536Sjkim
312306536Sjkim        UtDumpIntegerOp (Op, Level, 16);
313306536Sjkim        break;
314306536Sjkim
315306536Sjkim    case PARSEOP_INCLUDE:
316306536Sjkim
317306536Sjkim        DbgPrint (ASL_TREE_OUTPUT,
318306536Sjkim            "Open: %s\n", Op->Asl.Value.String);
319306536Sjkim        return (AE_OK);
320306536Sjkim
321306536Sjkim    case PARSEOP_INCLUDE_END:
322306536Sjkim
323306536Sjkim        DbgPrint (ASL_TREE_OUTPUT,
324306536Sjkim            "Close: %s\n", Op->Asl.Filename);
325306536Sjkim        return (AE_OK);
326306536Sjkim
327306536Sjkim    default:
328306536Sjkim
329306536Sjkim        UtDumpBasicOp (Op, Level);
330306536Sjkim        break;
331306536Sjkim    }
332306536Sjkim
333306536Sjkim    /* Dump the remaining data */
334306536Sjkim
335306536Sjkim    DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_DEBUG1,
336306536Sjkim        Op->Asl.ParseOpcode, Op->Asl.CompileFlags,
337306536Sjkim        Op->Asl.LineNumber, Op->Asl.EndLine,
338306536Sjkim        Op->Asl.LogicalLineNumber, Op->Asl.EndLogicalLine);
339306536Sjkim
340281687Sjkim    TrPrintNodeCompileFlags (Op->Asl.CompileFlags);
341281687Sjkim    DbgPrint (ASL_TREE_OUTPUT, "\n");
342249112Sjkim    return (AE_OK);
343118611Snjl}
344118611Snjl
345118611Snjl
346118611Snjl/*******************************************************************************
347118611Snjl *
348118611Snjl * FUNCTION:    LsWriteNodeToListing
349118611Snjl *
350249112Sjkim * PARAMETERS:  Op              - Parse node to write to the listing file.
351118611Snjl *              FileId          - ID of current listing file
352118611Snjl *
353118611Snjl * RETURN:      None.
354118611Snjl *
355241973Sjkim * DESCRIPTION: Write "a node" to the listing file. This means to
356118611Snjl *              1) Write out all of the source text associated with the node
357118611Snjl *              2) Write out all of the AML bytes associated with the node
358118611Snjl *              3) Write any compiler exceptions associated with the node
359118611Snjl *
360118611Snjl ******************************************************************************/
361118611Snjl
362151937Sjkimstatic void
363118611SnjlLsWriteNodeToListing (
364118611Snjl    ACPI_PARSE_OBJECT       *Op,
365118611Snjl    UINT32                  FileId)
366118611Snjl{
367118611Snjl    const ACPI_OPCODE_INFO  *OpInfo;
368118611Snjl    UINT32                  OpClass;
369118611Snjl    char                    *Pathname;
370118611Snjl    UINT32                  Length;
371118611Snjl    UINT32                  i;
372118611Snjl
373118611Snjl
374118611Snjl    OpInfo  = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
375118611Snjl    OpClass = OpInfo->Class;
376118611Snjl
377151937Sjkim    /* TBD: clean this up with a single flag that says:
378151937Sjkim     * I start a named output block
379151937Sjkim     */
380118611Snjl    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
381118611Snjl    {
382118611Snjl        switch (Op->Asl.ParseOpcode)
383118611Snjl        {
384306536Sjkim        case PARSEOP_DEFINITION_BLOCK:
385118611Snjl        case PARSEOP_METHODCALL:
386118611Snjl        case PARSEOP_INCLUDE:
387118611Snjl        case PARSEOP_INCLUDE_END:
388118611Snjl        case PARSEOP_DEFAULT_ARG:
389118611Snjl
390118611Snjl            break;
391118611Snjl
392118611Snjl        default:
393250838Sjkim
394118611Snjl            switch (OpClass)
395118611Snjl            {
396118611Snjl            case AML_CLASS_NAMED_OBJECT:
397250838Sjkim
398118611Snjl                switch (Op->Asl.AmlOpcode)
399118611Snjl                {
400118611Snjl                case AML_SCOPE_OP:
401118611Snjl                case AML_ALIAS_OP:
402250838Sjkim
403118611Snjl                    break;
404118611Snjl
405118611Snjl                default:
406250838Sjkim
407118611Snjl                    if (Op->Asl.ExternalName)
408118611Snjl                    {
409118611Snjl                        LsFlushListingBuffer (FileId);
410118611Snjl                        FlPrintFile (FileId, "    };\n");
411118611Snjl                    }
412118611Snjl                    break;
413118611Snjl                }
414118611Snjl                break;
415118611Snjl
416118611Snjl            default:
417250838Sjkim
418118611Snjl                /* Don't care about other objects */
419250838Sjkim
420118611Snjl                break;
421118611Snjl            }
422118611Snjl            break;
423118611Snjl        }
424118611Snjl    }
425118611Snjl
426118611Snjl    /* These cases do not have a corresponding AML opcode */
427118611Snjl
428118611Snjl    switch (Op->Asl.ParseOpcode)
429118611Snjl    {
430306536Sjkim    case PARSEOP_DEFINITION_BLOCK:
431118611Snjl
432306536Sjkim        /* Always start a definition block at AML offset zero */
433306536Sjkim
434306536Sjkim        Gbl_CurrentAmlOffset = 0;
435118611Snjl        LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId);
436118611Snjl
437118611Snjl        /* Use the table Signature and TableId to build a unique name */
438118611Snjl
439306536Sjkim        switch (FileId)
440118611Snjl        {
441306536Sjkim        case ASL_FILE_ASM_SOURCE_OUTPUT:
442306536Sjkim
443151937Sjkim            FlPrintFile (FileId,
444151937Sjkim                "%s_%s_Header \\\n",
445118611Snjl                Gbl_TableSignature, Gbl_TableId);
446306536Sjkim            break;
447306536Sjkim
448306536Sjkim        case ASL_FILE_C_SOURCE_OUTPUT:
449306536Sjkim
450151937Sjkim            FlPrintFile (FileId,
451151937Sjkim                "    unsigned char    %s_%s_Header [] =\n    {\n",
452118611Snjl                Gbl_TableSignature, Gbl_TableId);
453306536Sjkim            break;
454306536Sjkim
455306536Sjkim        case ASL_FILE_ASM_INCLUDE_OUTPUT:
456306536Sjkim
457151937Sjkim            FlPrintFile (FileId,
458151937Sjkim                "extrn %s_%s_Header : byte\n",
459118611Snjl                Gbl_TableSignature, Gbl_TableId);
460306536Sjkim            break;
461306536Sjkim
462306536Sjkim        case ASL_FILE_C_INCLUDE_OUTPUT:
463306536Sjkim
464151937Sjkim            FlPrintFile (FileId,
465151937Sjkim                "extern unsigned char    %s_%s_Header [];\n",
466118611Snjl                Gbl_TableSignature, Gbl_TableId);
467306536Sjkim            break;
468306536Sjkim
469306536Sjkim        default:
470306536Sjkim            break;
471118611Snjl        }
472306536Sjkim
473118611Snjl        return;
474118611Snjl
475118611Snjl
476118611Snjl    case PARSEOP_METHODCALL:
477118611Snjl
478151937Sjkim        LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
479151937Sjkim            FileId);
480118611Snjl        return;
481118611Snjl
482118611Snjl
483118611Snjl    case PARSEOP_INCLUDE:
484118611Snjl
485151937Sjkim        /* Flush everything up to and including the include source line */
486118611Snjl
487151937Sjkim        LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
488151937Sjkim            FileId);
489151937Sjkim
490151937Sjkim        /* Create a new listing node and push it */
491151937Sjkim
492306536Sjkim        LsPushNode (Op->Asl.Value.String);
493118611Snjl        return;
494118611Snjl
495118611Snjl
496118611Snjl    case PARSEOP_INCLUDE_END:
497118611Snjl
498151937Sjkim        /* Flush out the rest of the include file */
499118611Snjl
500151937Sjkim        LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
501151937Sjkim            FileId);
502151937Sjkim
503151937Sjkim        /* Pop off this listing node and go back to the parent file */
504151937Sjkim
505151937Sjkim        (void) LsPopNode ();
506118611Snjl        return;
507118611Snjl
508118611Snjl
509118611Snjl    case PARSEOP_DEFAULT_ARG:
510167802Sjkim
511167802Sjkim        if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
512167802Sjkim        {
513167802Sjkim            LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.EndLogicalLine,
514167802Sjkim                FileId);
515167802Sjkim        }
516118611Snjl        return;
517118611Snjl
518118611Snjl
519118611Snjl    default:
520250838Sjkim
521118611Snjl        /* All other opcodes have an AML opcode */
522250838Sjkim
523118611Snjl        break;
524118611Snjl    }
525118611Snjl
526118611Snjl    /*
527118611Snjl     * Otherwise, we look at the AML opcode because we can
528118611Snjl     * switch on the opcode type, getting an entire class
529118611Snjl     * at once
530118611Snjl     */
531118611Snjl    switch (OpClass)
532118611Snjl    {
533118611Snjl    case AML_CLASS_ARGUMENT:       /* argument type only */
534118611Snjl    case AML_CLASS_INTERNAL:
535118611Snjl
536118611Snjl        break;
537118611Snjl
538118611Snjl    case AML_CLASS_NAMED_OBJECT:
539118611Snjl
540118611Snjl        switch (Op->Asl.AmlOpcode)
541118611Snjl        {
542118611Snjl        case AML_FIELD_OP:
543118611Snjl        case AML_INDEX_FIELD_OP:
544118611Snjl        case AML_BANK_FIELD_OP:
545151937Sjkim            /*
546151937Sjkim             * For fields, we want to dump all the AML after the
547151937Sjkim             * entire definition
548151937Sjkim             */
549151937Sjkim            LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine,
550151937Sjkim                FileId);
551118611Snjl            break;
552118611Snjl
553167802Sjkim        case AML_NAME_OP:
554167802Sjkim
555167802Sjkim            if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
556167802Sjkim            {
557167802Sjkim                LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
558167802Sjkim                    FileId);
559167802Sjkim            }
560167802Sjkim            else
561167802Sjkim            {
562167802Sjkim                /*
563167802Sjkim                 * For fields, we want to dump all the AML after the
564167802Sjkim                 * entire definition
565167802Sjkim                 */
566167802Sjkim                LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine,
567167802Sjkim                    FileId);
568167802Sjkim            }
569167802Sjkim            break;
570167802Sjkim
571118611Snjl        default:
572250838Sjkim
573151937Sjkim            LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
574151937Sjkim                FileId);
575118611Snjl            break;
576118611Snjl        }
577118611Snjl
578118611Snjl        switch (Op->Asl.AmlOpcode)
579118611Snjl        {
580118611Snjl        case AML_SCOPE_OP:
581118611Snjl        case AML_ALIAS_OP:
582118611Snjl
583118611Snjl            /* These opcodes do not declare a new object, ignore them */
584118611Snjl
585118611Snjl            break;
586118611Snjl
587118611Snjl        default:
588118611Snjl
589118611Snjl            /* All other named object opcodes come here */
590118611Snjl
591118611Snjl            switch (FileId)
592118611Snjl            {
593118611Snjl            case ASL_FILE_ASM_SOURCE_OUTPUT:
594118611Snjl            case ASL_FILE_C_SOURCE_OUTPUT:
595118611Snjl            case ASL_FILE_ASM_INCLUDE_OUTPUT:
596118611Snjl            case ASL_FILE_C_INCLUDE_OUTPUT:
597118611Snjl                /*
598118611Snjl                 * For named objects, we will create a valid symbol so that the
599118611Snjl                 * AML code can be referenced from C or ASM
600118611Snjl                 */
601118611Snjl                if (Op->Asl.ExternalName)
602118611Snjl                {
603118611Snjl                    /* Get the full pathname associated with this node */
604118611Snjl
605118611Snjl                    Pathname = AcpiNsGetExternalPathname (Op->Asl.Node);
606118611Snjl                    Length = strlen (Pathname);
607118611Snjl                    if (Length >= 4)
608118611Snjl                    {
609118611Snjl                        /* Convert all dots in the path to underscores */
610118611Snjl
611118611Snjl                        for (i = 0; i < Length; i++)
612118611Snjl                        {
613118611Snjl                            if (Pathname[i] == '.')
614118611Snjl                            {
615118611Snjl                                Pathname[i] = '_';
616118611Snjl                            }
617118611Snjl                        }
618118611Snjl
619118611Snjl                        /* Create the appropriate symbol in the output file */
620118611Snjl
621306536Sjkim                        switch (FileId)
622118611Snjl                        {
623306536Sjkim                        case ASL_FILE_ASM_SOURCE_OUTPUT:
624306536Sjkim
625151937Sjkim                            FlPrintFile (FileId,
626151937Sjkim                                "%s_%s_%s  \\\n",
627118611Snjl                                Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
628306536Sjkim                            break;
629306536Sjkim
630306536Sjkim                        case ASL_FILE_C_SOURCE_OUTPUT:
631306536Sjkim
632151937Sjkim                            FlPrintFile (FileId,
633151937Sjkim                                "    unsigned char    %s_%s_%s [] =\n    {\n",
634118611Snjl                                Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
635306536Sjkim                            break;
636306536Sjkim
637306536Sjkim                        case ASL_FILE_ASM_INCLUDE_OUTPUT:
638306536Sjkim
639151937Sjkim                            FlPrintFile (FileId,
640151937Sjkim                                "extrn %s_%s_%s : byte\n",
641118611Snjl                                Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
642306536Sjkim                            break;
643306536Sjkim
644306536Sjkim                        case ASL_FILE_C_INCLUDE_OUTPUT:
645306536Sjkim
646151937Sjkim                            FlPrintFile (FileId,
647151937Sjkim                                "extern unsigned char    %s_%s_%s [];\n",
648118611Snjl                                Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
649306536Sjkim                            break;
650306536Sjkim
651306536Sjkim                        default:
652306536Sjkim                            break;
653118611Snjl                        }
654118611Snjl                    }
655306536Sjkim
656167802Sjkim                    ACPI_FREE (Pathname);
657118611Snjl                }
658118611Snjl                break;
659118611Snjl
660118611Snjl            default:
661250838Sjkim
662118611Snjl                /* Nothing to do for listing file */
663250838Sjkim
664118611Snjl                break;
665118611Snjl            }
666118611Snjl        }
667118611Snjl        break;
668118611Snjl
669118611Snjl    case AML_CLASS_EXECUTE:
670118611Snjl    case AML_CLASS_CREATE:
671118611Snjl    default:
672118611Snjl
673167802Sjkim        if ((Op->Asl.ParseOpcode == PARSEOP_BUFFER) &&
674167802Sjkim            (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC))
675167802Sjkim        {
676167802Sjkim            return;
677167802Sjkim        }
678167802Sjkim
679151937Sjkim        LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
680151937Sjkim            FileId);
681118611Snjl        break;
682118611Snjl
683118611Snjl    case AML_CLASS_UNKNOWN:
684250838Sjkim
685118611Snjl        break;
686118611Snjl    }
687118611Snjl}
688249112Sjkim
689249112Sjkim
690249112Sjkim/*******************************************************************************
691249112Sjkim *
692249112Sjkim * FUNCTION:    LsFinishSourceListing
693249112Sjkim *
694249112Sjkim * PARAMETERS:  FileId          - ID of current listing file.
695249112Sjkim *
696249112Sjkim * RETURN:      None
697249112Sjkim *
698249112Sjkim * DESCRIPTION: Cleanup routine for the listing file. Flush the hex AML
699249112Sjkim *              listing buffer, and flush out any remaining lines in the
700249112Sjkim *              source input file.
701249112Sjkim *
702249112Sjkim ******************************************************************************/
703249112Sjkim
704249112Sjkimstatic void
705249112SjkimLsFinishSourceListing (
706249112Sjkim    UINT32                  FileId)
707249112Sjkim{
708249112Sjkim
709249112Sjkim    if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
710249112Sjkim        (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
711249112Sjkim    {
712249112Sjkim        return;
713249112Sjkim    }
714249112Sjkim
715249112Sjkim    LsFlushListingBuffer (FileId);
716249112Sjkim    Gbl_CurrentAmlOffset = 0;
717249112Sjkim
718249112Sjkim    /* Flush any remaining text in the source file */
719249112Sjkim
720249112Sjkim    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
721249112Sjkim    {
722249112Sjkim        FlPrintFile (FileId, "    /*\n");
723249112Sjkim    }
724249112Sjkim
725249112Sjkim    while (LsWriteOneSourceLine (FileId))
726249112Sjkim    { ; }
727249112Sjkim
728249112Sjkim    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
729249112Sjkim    {
730249112Sjkim        FlPrintFile (FileId, "\n     */\n    };\n");
731249112Sjkim    }
732249112Sjkim
733249112Sjkim    FlPrintFile (FileId, "\n");
734249112Sjkim
735249112Sjkim    if (FileId == ASL_FILE_LISTING_OUTPUT)
736249112Sjkim    {
737249112Sjkim        /* Print a summary of the compile exceptions */
738249112Sjkim
739249112Sjkim        FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n");
740249112Sjkim        AePrintErrorLog (FileId);
741249112Sjkim        FlPrintFile (FileId, "\n");
742249112Sjkim        UtDisplaySummary (FileId);
743249112Sjkim        FlPrintFile (FileId, "\n");
744249112Sjkim    }
745249112Sjkim}
746