asllisting.c revision 207344
1
2/******************************************************************************
3 *
4 * Module Name: asllisting - Listing file generation
5 *
6 *****************************************************************************/
7
8/******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
13 * All rights reserved.
14 *
15 * 2. License
16 *
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights.  You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
20 * property rights.
21 *
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26 * make derivatives, distribute, use and display any portion of the Covered
27 * Code in any form, with the right to sublicense such rights; and
28 *
29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 * license (with the right to sublicense), under only those claims of Intel
31 * patents that are infringed by the Original Intel Code, to make, use, sell,
32 * offer to sell, and import the Covered Code and derivative works thereof
33 * solely to the minimum extent necessary to exercise the above copyright
34 * license, and in no event shall the patent license extend to any additions
35 * to or modifications of the Original Intel Code.  No other license or right
36 * is granted directly or by implication, estoppel or otherwise;
37 *
38 * The above copyright and patent license is granted only if the following
39 * conditions are met:
40 *
41 * 3. Conditions
42 *
43 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 * Redistribution of source code of any substantial portion of the Covered
45 * Code or modification with rights to further distribute source must include
46 * the above Copyright Notice, the above License, this list of Conditions,
47 * and the following Disclaimer and Export Compliance provision.  In addition,
48 * Licensee must cause all Covered Code to which Licensee contributes to
49 * contain a file documenting the changes Licensee made to create that Covered
50 * Code and the date of any change.  Licensee must include in that file the
51 * documentation of any changes made by any predecessor Licensee.  Licensee
52 * must include a prominent statement that the modification is derived,
53 * directly or indirectly, from Original Intel Code.
54 *
55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 * Redistribution of source code of any substantial portion of the Covered
57 * Code or modification without rights to further distribute source must
58 * include the following Disclaimer and Export Compliance provision in the
59 * documentation and/or other materials provided with distribution.  In
60 * addition, Licensee may not authorize further sublicense of source of any
61 * portion of the Covered Code, and must include terms to the effect that the
62 * license from Licensee to its licensee is limited to the intellectual
63 * property embodied in the software Licensee provides to its licensee, and
64 * not to intellectual property embodied in modifications its licensee may
65 * make.
66 *
67 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 * substantial portion of the Covered Code or modification must reproduce the
69 * above Copyright Notice, and the following Disclaimer and Export Compliance
70 * provision in the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3.4. Intel retains all right, title, and interest in and to the Original
74 * Intel Code.
75 *
76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 * Intel shall be used in advertising or otherwise to promote the sale, use or
78 * other dealings in products derived from or relating to the Covered Code
79 * without prior written authorization from Intel.
80 *
81 * 4. Disclaimer and Export Compliance
82 *
83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 * PARTICULAR PURPOSE.
90 *
91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 * LIMITED REMEDY.
99 *
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government.  In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117
118#include <contrib/dev/acpica/compiler/aslcompiler.h>
119#include "aslcompiler.y.h"
120#include <contrib/dev/acpica/include/amlcode.h>
121#include <contrib/dev/acpica/include/acparser.h>
122#include <contrib/dev/acpica/include/acnamesp.h>
123
124#define _COMPONENT          ACPI_COMPILER
125        ACPI_MODULE_NAME    ("aslisting")
126
127/* Local prototypes */
128
129static void
130LsDumpAscii (
131    UINT32                  FileId,
132    UINT32                  Count,
133    UINT8                   *Buffer);
134
135static void
136LsDumpAsciiInComment (
137    UINT32                  FileId,
138    UINT32                  Count,
139    UINT8                   *Buffer);
140
141static ACPI_STATUS
142LsAmlListingWalk (
143    ACPI_PARSE_OBJECT       *Op,
144    UINT32                  Level,
145    void                    *Context);
146
147static void
148LsGenerateListing (
149    UINT32                  FileId);
150
151static void
152LsPushNode (
153    char                    *Filename);
154
155static ASL_LISTING_NODE *
156LsPopNode (
157    void);
158
159static void
160LsCheckException (
161    UINT32                  LineNumber,
162    UINT32                  FileId);
163
164static void
165LsFlushListingBuffer (
166    UINT32                  FileId);
167
168static void
169LsWriteListingHexBytes (
170    UINT8                   *Buffer,
171    UINT32                  Length,
172    UINT32                  FileId);
173
174static UINT32
175LsWriteOneSourceLine (
176    UINT32                  FileId);
177
178static void
179LsFinishSourceListing (
180    UINT32                  FileId);
181
182static void
183LsWriteSourceLines (
184    UINT32                  ToLineNumber,
185    UINT32                  ToLogicalLineNumber,
186    UINT32                  FileId);
187
188static void
189LsWriteNodeToListing (
190    ACPI_PARSE_OBJECT       *Op,
191    UINT32                  FileId);
192
193static void
194LsDoHexOutputC (
195    void);
196
197static void
198LsDoHexOutputAsm (
199    void);
200
201static void
202LsDoHexOutputAsl (
203    void);
204
205ACPI_STATUS
206LsTreeWriteWalk (
207    ACPI_PARSE_OBJECT       *Op,
208    UINT32                  Level,
209    void                    *Context);
210
211
212/*******************************************************************************
213 *
214 * FUNCTION:    LsTreeWriteWalk
215 *
216 * PARAMETERS:  ASL_WALK_CALLBACK
217 *
218 *
219 * RETURN:      None.
220 *
221 * DESCRIPTION: Dump entire parse tree, for compiler debug only
222 *
223 ******************************************************************************/
224
225ACPI_STATUS
226LsTreeWriteWalk (
227    ACPI_PARSE_OBJECT       *Op,
228    UINT32                  Level,
229    void                    *Context)
230{
231
232    /* Debug output */
233
234    DbgPrint (ASL_TREE_OUTPUT,
235        "%5.5d [%2d]", Op->Asl.LogicalLineNumber, Level);
236    UtPrintFormattedName (Op->Asl.ParseOpcode, Level);
237
238
239    DbgPrint (ASL_TREE_OUTPUT, "\n");
240    return (AE_OK);
241}
242
243
244void
245LsDumpParseTree (
246    void)
247{
248
249    if (!Gbl_DebugFlag)
250    {
251        return;
252    }
253
254    DbgPrint (ASL_TREE_OUTPUT, "\nOriginal parse tree from parser:\n\n");
255    TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
256        LsTreeWriteWalk, NULL, NULL);
257}
258
259
260/*******************************************************************************
261 *
262 * FUNCTION:    LsDumpAscii
263 *
264 * PARAMETERS:  FileId          - ID of current listing file
265 *              Count           - Number of bytes to convert
266 *              Buffer          - Buffer of bytes to convert
267 *
268 * RETURN:      None.
269 *
270 * DESCRIPTION: Convert hex bytes to ascii
271 *
272 ******************************************************************************/
273
274static void
275LsDumpAscii (
276    UINT32                  FileId,
277    UINT32                  Count,
278    UINT8                   *Buffer)
279{
280    UINT8                   BufChar;
281    UINT32                  i;
282
283
284    FlPrintFile (FileId, "    \"");
285    for (i = 0; i < Count; i++)
286    {
287        BufChar = Buffer[i];
288        if (isprint (BufChar))
289        {
290            FlPrintFile (FileId, "%c", BufChar);
291        }
292        else
293        {
294            /* Not a printable character, just put out a dot */
295
296            FlPrintFile (FileId, ".");
297        }
298    }
299    FlPrintFile (FileId, "\"");
300}
301
302
303/*******************************************************************************
304 *
305 * FUNCTION:    LsDumpAsciiInComment
306 *
307 * PARAMETERS:  FileId          - ID of current listing file
308 *              Count           - Number of bytes to convert
309 *              Buffer          - Buffer of bytes to convert
310 *
311 * RETURN:      None.
312 *
313 * DESCRIPTION: Convert hex bytes to ascii
314 *
315 ******************************************************************************/
316
317static void
318LsDumpAsciiInComment (
319    UINT32                  FileId,
320    UINT32                  Count,
321    UINT8                   *Buffer)
322{
323    UINT8                   BufChar = 0;
324    UINT8                   LastChar;
325    UINT32                  i;
326
327
328    FlPrintFile (FileId, "    \"");
329    for (i = 0; i < Count; i++)
330    {
331        LastChar = BufChar;
332        BufChar = Buffer[i];
333
334        if (isprint (BufChar))
335        {
336            /* Handle embedded C comment sequences */
337
338            if (((LastChar == '*') && (BufChar == '/')) ||
339                ((LastChar == '/') && (BufChar == '*')))
340            {
341                /* Insert a space to break the sequence */
342
343                FlPrintFile (FileId, ".", BufChar);
344            }
345
346            FlPrintFile (FileId, "%c", BufChar);
347        }
348        else
349        {
350            /* Not a printable character, just put out a dot */
351
352            FlPrintFile (FileId, ".");
353        }
354    }
355    FlPrintFile (FileId, "\"");
356}
357
358
359/*******************************************************************************
360 *
361 * FUNCTION:    LsAmlListingWalk
362 *
363 * PARAMETERS:  ASL_WALK_CALLBACK
364 *
365 * RETURN:      Status
366 *
367 * DESCRIPTION: Process one node during a listing file generation.
368 *
369 ******************************************************************************/
370
371static ACPI_STATUS
372LsAmlListingWalk (
373    ACPI_PARSE_OBJECT       *Op,
374    UINT32                  Level,
375    void                    *Context)
376{
377    UINT8                   FileByte;
378    UINT32                  i;
379    UINT32                  FileId = (UINT32) ACPI_TO_INTEGER (Context);
380
381
382    LsWriteNodeToListing (Op, FileId);
383
384    if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DATA)
385    {
386        /* Buffer is a resource template, don't dump the data all at once */
387
388        return (AE_OK);
389    }
390
391    /* Write the hex bytes to the listing file(s) (if requested) */
392
393    for (i = 0; i < Op->Asl.FinalAmlLength; i++)
394    {
395        if (ACPI_FAILURE (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1)))
396        {
397            FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ);
398            AslAbort ();
399        }
400        LsWriteListingHexBytes (&FileByte, 1, FileId);
401    }
402
403    return (AE_OK);
404}
405
406
407/*******************************************************************************
408 *
409 * FUNCTION:    LsGenerateListing
410 *
411 * PARAMETERS:  FileId      - ID of listing file
412 *
413 * RETURN:      None
414 *
415 * DESCRIPTION: Generate a listing file.  This can be one of the several types
416 *              of "listings" supported.
417 *
418 ******************************************************************************/
419
420static void
421LsGenerateListing (
422    UINT32                  FileId)
423{
424
425    /* Start at the beginning of both the source and AML files */
426
427    FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0);
428    FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
429    Gbl_SourceLine = 0;
430    Gbl_CurrentHexColumn = 0;
431    LsPushNode (Gbl_Files[ASL_FILE_INPUT].Filename);
432
433    /* Process all parse nodes */
434
435    TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD, LsAmlListingWalk,
436                        NULL, (void *) ACPI_TO_POINTER (FileId));
437
438    /* Final processing */
439
440    LsFinishSourceListing (FileId);
441}
442
443
444/*******************************************************************************
445 *
446 * FUNCTION:    LsDoListings
447 *
448 * PARAMETERS:  None.
449 *
450 * RETURN:      None
451 *
452 * DESCRIPTION: Generate all requested listing files.
453 *
454 ******************************************************************************/
455
456void
457LsDoListings (
458    void)
459{
460
461    if (Gbl_C_OutputFlag)
462    {
463        LsGenerateListing (ASL_FILE_C_SOURCE_OUTPUT);
464    }
465
466    if (Gbl_ListingFlag)
467    {
468        LsGenerateListing (ASL_FILE_LISTING_OUTPUT);
469    }
470
471    if (Gbl_AsmOutputFlag)
472    {
473        LsGenerateListing (ASL_FILE_ASM_SOURCE_OUTPUT);
474    }
475
476    if (Gbl_C_IncludeOutputFlag)
477    {
478        LsGenerateListing (ASL_FILE_C_INCLUDE_OUTPUT);
479    }
480
481    if (Gbl_AsmIncludeOutputFlag)
482    {
483        LsGenerateListing (ASL_FILE_ASM_INCLUDE_OUTPUT);
484    }
485}
486
487
488/*******************************************************************************
489 *
490 * FUNCTION:    LsPushNode
491 *
492 * PARAMETERS:  Filename        - Pointer to the include filename
493 *
494 * RETURN:      None
495 *
496 * DESCRIPTION: Push a listing node on the listing/include file stack.  This
497 *              stack enables tracking of include files (infinitely nested)
498 *              and resumption of the listing of the parent file when the
499 *              include file is finished.
500 *
501 ******************************************************************************/
502
503static void
504LsPushNode (
505    char                    *Filename)
506{
507    ASL_LISTING_NODE        *Lnode;
508
509
510    /* Create a new node */
511
512    Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE));
513
514    /* Initialize */
515
516    Lnode->Filename = Filename;
517    Lnode->LineNumber = 0;
518
519    /* Link (push) */
520
521    Lnode->Next = Gbl_ListingNode;
522    Gbl_ListingNode = Lnode;
523}
524
525
526/*******************************************************************************
527 *
528 * FUNCTION:    LsPopNode
529 *
530 * PARAMETERS:  None
531 *
532 * RETURN:      List head after current head is popped off
533 *
534 * DESCRIPTION: Pop the current head of the list, free it, and return the
535 *              next node on the stack (the new current node).
536 *
537 ******************************************************************************/
538
539static ASL_LISTING_NODE *
540LsPopNode (
541    void)
542{
543    ASL_LISTING_NODE        *Lnode;
544
545
546    /* Just grab the node at the head of the list */
547
548    Lnode = Gbl_ListingNode;
549    if ((!Lnode) ||
550        (!Lnode->Next))
551    {
552        AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL,
553            "Could not pop empty listing stack");
554        return Gbl_ListingNode;
555    }
556
557    Gbl_ListingNode = Lnode->Next;
558    ACPI_FREE (Lnode);
559
560    /* New "Current" node is the new head */
561
562    return (Gbl_ListingNode);
563}
564
565
566/*******************************************************************************
567 *
568 * FUNCTION:    LsCheckException
569 *
570 * PARAMETERS:  LineNumber          - Current logical (cumulative) line #
571 *              FileId              - ID of output listing file
572 *
573 * RETURN:      None
574 *
575 * DESCRIPTION: Check if there is an exception for this line, and if there is,
576 *              put it in the listing immediately.  Handles multiple errors
577 *              per line.  Gbl_NextError points to the next error in the
578 *              sorted (by line #) list of compile errors/warnings.
579 *
580 ******************************************************************************/
581
582static void
583LsCheckException (
584    UINT32                  LineNumber,
585    UINT32                  FileId)
586{
587
588    if ((!Gbl_NextError) ||
589        (LineNumber < Gbl_NextError->LogicalLineNumber ))
590    {
591        return;
592    }
593
594    /* Handle multiple errors per line */
595
596    if (FileId == ASL_FILE_LISTING_OUTPUT)
597    {
598        while (Gbl_NextError &&
599              (LineNumber >= Gbl_NextError->LogicalLineNumber))
600        {
601            AePrintException (FileId, Gbl_NextError, "\n[****iasl****]\n");
602
603            Gbl_NextError = Gbl_NextError->Next;
604        }
605
606        FlPrintFile (FileId, "\n");
607    }
608}
609
610
611/*******************************************************************************
612 *
613 * FUNCTION:    LsFlushListingBuffer
614 *
615 * PARAMETERS:  FileId          - ID of the listing file
616 *
617 * RETURN:      None
618 *
619 * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code
620 *              buffer.  Usually called at the termination of a single line
621 *              of source code or when the buffer is full.
622 *
623 ******************************************************************************/
624
625static void
626LsFlushListingBuffer (
627    UINT32                  FileId)
628{
629    UINT32                  i;
630
631
632    if (Gbl_CurrentHexColumn == 0)
633    {
634        return;
635    }
636
637    /* Write the hex bytes */
638
639    switch (FileId)
640    {
641    case ASL_FILE_LISTING_OUTPUT:
642
643        for (i = 0; i < Gbl_CurrentHexColumn; i++)
644        {
645            FlPrintFile (FileId, "%2.2X ", Gbl_AmlBuffer[i]);
646        }
647
648        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 3); i++)
649        {
650            FlWriteFile (FileId, ".", 1);
651        }
652
653        /* Write the ASCII character associated with each of the bytes */
654
655        LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
656        break;
657
658
659    case ASL_FILE_ASM_SOURCE_OUTPUT:
660
661        for (i = 0; i < Gbl_CurrentHexColumn; i++)
662        {
663            if (i > 0)
664            {
665                FlPrintFile (FileId, ",");
666            }
667            FlPrintFile (FileId, "0%2.2Xh", Gbl_AmlBuffer[i]);
668        }
669
670        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)
671        {
672            FlWriteFile (FileId, " ", 1);
673        }
674
675        FlPrintFile (FileId, "  ;%8.8X",
676            Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);
677
678        /* Write the ASCII character associated with each of the bytes */
679
680        LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
681        break;
682
683
684    case ASL_FILE_C_SOURCE_OUTPUT:
685
686        for (i = 0; i < Gbl_CurrentHexColumn; i++)
687        {
688            FlPrintFile (FileId, "0x%2.2X,", Gbl_AmlBuffer[i]);
689        }
690
691        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)
692        {
693            FlWriteFile (FileId, " ", 1);
694        }
695
696        FlPrintFile (FileId, "    /* %8.8X",
697            Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);
698
699        /* Write the ASCII character associated with each of the bytes */
700
701        LsDumpAsciiInComment (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
702        FlPrintFile (FileId, " */");
703        break;
704
705    default:
706        /* No other types supported */
707        return;
708    }
709
710    FlPrintFile (FileId, "\n");
711
712    Gbl_CurrentHexColumn = 0;
713    Gbl_HexBytesWereWritten = TRUE;
714}
715
716
717/*******************************************************************************
718 *
719 * FUNCTION:    LsWriteListingHexBytes
720 *
721 * PARAMETERS:  Buffer          - AML code buffer
722 *              Length          - Number of AML bytes to write
723 *              FileId          - ID of current listing file.
724 *
725 * RETURN:      None
726 *
727 * DESCRIPTION: Write the contents of the AML buffer to the listing file via
728 *              the listing buffer.  The listing buffer is flushed every 16
729 *              AML bytes.
730 *
731 ******************************************************************************/
732
733static void
734LsWriteListingHexBytes (
735    UINT8                   *Buffer,
736    UINT32                  Length,
737    UINT32                  FileId)
738{
739    UINT32                  i;
740
741
742    /* Transfer all requested bytes */
743
744    for (i = 0; i < Length; i++)
745    {
746        /* Print line header when buffer is empty */
747
748        if (Gbl_CurrentHexColumn == 0)
749        {
750            if (Gbl_HasIncludeFiles)
751            {
752                FlPrintFile (FileId, "%*s", 10, " ");
753            }
754
755            switch (FileId)
756            {
757            case ASL_FILE_LISTING_OUTPUT:
758
759                FlPrintFile (FileId, "%8.8X....", Gbl_CurrentAmlOffset);
760                break;
761
762            case ASL_FILE_ASM_SOURCE_OUTPUT:
763
764                FlPrintFile (FileId, "    db ");
765                break;
766
767            case ASL_FILE_C_SOURCE_OUTPUT:
768
769                FlPrintFile (FileId, "        ");
770                break;
771
772            default:
773                /* No other types supported */
774                return;
775            }
776        }
777
778        /* Transfer AML byte and update counts */
779
780        Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i];
781
782        Gbl_CurrentHexColumn++;
783        Gbl_CurrentAmlOffset++;
784
785        /* Flush buffer when it is full */
786
787        if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE)
788        {
789            LsFlushListingBuffer (FileId);
790        }
791    }
792}
793
794
795/*******************************************************************************
796 *
797 * FUNCTION:    LsWriteOneSourceLine
798 *
799 * PARAMETERS:  FileID          - ID of current listing file
800 *
801 * RETURN:      FALSE on EOF (input source file), TRUE otherwise
802 *
803 * DESCRIPTION: Read one line from the input source file and echo it to the
804 *              listing file, prefixed with the line number, and if the source
805 *              file contains include files, prefixed with the current filename
806 *
807 ******************************************************************************/
808
809static UINT32
810LsWriteOneSourceLine (
811    UINT32                  FileId)
812{
813    UINT8                   FileByte;
814
815
816    Gbl_SourceLine++;
817    Gbl_ListingNode->LineNumber++;
818
819    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
820    {
821        FlPrintFile (FileId, "     *");
822    }
823    if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
824    {
825        FlPrintFile (FileId, "; ");
826    }
827
828    if (Gbl_HasIncludeFiles)
829    {
830        /*
831         * This file contains "include" statements, print the current
832         * filename and line number within the current file
833         */
834        FlPrintFile (FileId, "%12s %5d....",
835                    Gbl_ListingNode->Filename, Gbl_ListingNode->LineNumber);
836    }
837    else
838    {
839        /* No include files, just print the line number */
840
841        FlPrintFile (FileId, "%8d....", Gbl_SourceLine);
842    }
843
844    /* Read one line (up to a newline or EOF) */
845
846    while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK)
847    {
848        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
849        {
850            if (FileByte == '/')
851            {
852                FileByte = '*';
853            }
854        }
855
856        FlWriteFile (FileId, &FileByte, 1);
857        if (FileByte == '\n')
858        {
859            /*
860             * Check if an error occurred on this source line during the compile.
861             * If so, we print the error message after the source line.
862             */
863            LsCheckException (Gbl_SourceLine, FileId);
864            return (1);
865        }
866    }
867
868    /* EOF on the input file was reached */
869
870    return (0);
871}
872
873
874/*******************************************************************************
875 *
876 * FUNCTION:    LsFinishSourceListing
877 *
878 * PARAMETERS:  FileId          - ID of current listing file.
879 *
880 * RETURN:      None
881 *
882 * DESCRIPTION: Cleanup routine for the listing file.  Flush the hex AML
883 *              listing buffer, and flush out any remaining lines in the
884 *              source input file.
885 *
886 ******************************************************************************/
887
888static void
889LsFinishSourceListing (
890    UINT32                  FileId)
891{
892
893    if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
894        (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
895    {
896        return;
897    }
898
899    LsFlushListingBuffer (FileId);
900    Gbl_CurrentAmlOffset = 0;
901
902    /* Flush any remaining text in the source file */
903
904    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
905    {
906        FlPrintFile (FileId, "    /*\n");
907    }
908
909    while (LsWriteOneSourceLine (FileId))
910    { ; }
911
912    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
913    {
914        FlPrintFile (FileId, "\n     */\n    };\n");
915    }
916
917    FlPrintFile (FileId, "\n");
918
919    if (FileId == ASL_FILE_LISTING_OUTPUT)
920    {
921        /* Print a summary of the compile exceptions */
922
923        FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n");
924        AePrintErrorLog (FileId);
925        FlPrintFile (FileId, "\n\n");
926        UtDisplaySummary (FileId);
927        FlPrintFile (FileId, "\n\n");
928    }
929}
930
931
932/*******************************************************************************
933 *
934 * FUNCTION:    LsWriteSourceLines
935 *
936 * PARAMETERS:  ToLineNumber            -
937 *              ToLogicalLineNumber     - Write up to this source line number
938 *              FileId                  - ID of current listing file
939 *
940 * RETURN:      None
941 *
942 * DESCRIPTION: Read then write source lines to the listing file until we have
943 *              reached the specified logical (cumulative) line number.  This
944 *              automatically echos out comment blocks and other non-AML
945 *              generating text until we get to the actual AML-generating line
946 *              of ASL code specified by the logical line number.
947 *
948 ******************************************************************************/
949
950static void
951LsWriteSourceLines (
952    UINT32                  ToLineNumber,
953    UINT32                  ToLogicalLineNumber,
954    UINT32                  FileId)
955{
956
957    if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
958        (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
959    {
960        return;
961    }
962
963    Gbl_CurrentLine = ToLogicalLineNumber;
964
965    /* Flush any hex bytes remaining from the last opcode */
966
967    LsFlushListingBuffer (FileId);
968
969    /* Read lines and write them as long as we are not caught up */
970
971    if (Gbl_SourceLine < Gbl_CurrentLine)
972    {
973        /*
974         * If we just completed writing some AML hex bytes, output a linefeed
975         * to add some whitespace for readability.
976         */
977        if (Gbl_HexBytesWereWritten)
978        {
979            FlPrintFile (FileId, "\n");
980            Gbl_HexBytesWereWritten = FALSE;
981        }
982
983        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
984        {
985            FlPrintFile (FileId, "    /*\n");
986        }
987
988        /* Write one line at a time until we have reached the target line # */
989
990        while ((Gbl_SourceLine < Gbl_CurrentLine) &&
991                LsWriteOneSourceLine (FileId))
992        { ; }
993
994        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
995        {
996            FlPrintFile (FileId, "     */");
997        }
998        FlPrintFile (FileId, "\n");
999    }
1000}
1001
1002
1003/*******************************************************************************
1004 *
1005 * FUNCTION:    LsWriteNodeToListing
1006 *
1007 * PARAMETERS:  Op            - Parse node to write to the listing file.
1008 *              FileId          - ID of current listing file
1009 *
1010 * RETURN:      None.
1011 *
1012 * DESCRIPTION: Write "a node" to the listing file.  This means to
1013 *              1) Write out all of the source text associated with the node
1014 *              2) Write out all of the AML bytes associated with the node
1015 *              3) Write any compiler exceptions associated with the node
1016 *
1017 ******************************************************************************/
1018
1019static void
1020LsWriteNodeToListing (
1021    ACPI_PARSE_OBJECT       *Op,
1022    UINT32                  FileId)
1023{
1024    const ACPI_OPCODE_INFO  *OpInfo;
1025    UINT32                  OpClass;
1026    char                    *Pathname;
1027    UINT32                  Length;
1028    UINT32                  i;
1029
1030
1031    OpInfo  = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
1032    OpClass = OpInfo->Class;
1033
1034    /* TBD: clean this up with a single flag that says:
1035     * I start a named output block
1036     */
1037    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
1038    {
1039        switch (Op->Asl.ParseOpcode)
1040        {
1041        case PARSEOP_DEFINITIONBLOCK:
1042        case PARSEOP_METHODCALL:
1043        case PARSEOP_INCLUDE:
1044        case PARSEOP_INCLUDE_END:
1045        case PARSEOP_DEFAULT_ARG:
1046
1047            break;
1048
1049        default:
1050            switch (OpClass)
1051            {
1052            case AML_CLASS_NAMED_OBJECT:
1053                switch (Op->Asl.AmlOpcode)
1054                {
1055                case AML_SCOPE_OP:
1056                case AML_ALIAS_OP:
1057                    break;
1058
1059                default:
1060                    if (Op->Asl.ExternalName)
1061                    {
1062                        LsFlushListingBuffer (FileId);
1063                        FlPrintFile (FileId, "    };\n");
1064                    }
1065                    break;
1066                }
1067                break;
1068
1069            default:
1070                /* Don't care about other objects */
1071                break;
1072            }
1073            break;
1074        }
1075    }
1076
1077    /* These cases do not have a corresponding AML opcode */
1078
1079    switch (Op->Asl.ParseOpcode)
1080    {
1081    case PARSEOP_DEFINITIONBLOCK:
1082
1083        LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId);
1084
1085        /* Use the table Signature and TableId to build a unique name */
1086
1087        if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
1088        {
1089            FlPrintFile (FileId,
1090                "%s_%s_Header \\\n",
1091                Gbl_TableSignature, Gbl_TableId);
1092        }
1093        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
1094        {
1095            FlPrintFile (FileId,
1096                "    unsigned char    %s_%s_Header [] =\n    {\n",
1097                Gbl_TableSignature, Gbl_TableId);
1098        }
1099        if (FileId == ASL_FILE_ASM_INCLUDE_OUTPUT)
1100        {
1101            FlPrintFile (FileId,
1102                "extrn %s_%s_Header : byte\n",
1103                Gbl_TableSignature, Gbl_TableId);
1104        }
1105        if (FileId == ASL_FILE_C_INCLUDE_OUTPUT)
1106        {
1107            FlPrintFile (FileId,
1108                "extern unsigned char    %s_%s_Header [];\n",
1109                Gbl_TableSignature, Gbl_TableId);
1110        }
1111        return;
1112
1113
1114    case PARSEOP_METHODCALL:
1115
1116        LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
1117            FileId);
1118        return;
1119
1120
1121    case PARSEOP_INCLUDE:
1122
1123        /* Flush everything up to and including the include source line */
1124
1125        LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
1126            FileId);
1127
1128        /* Create a new listing node and push it */
1129
1130        LsPushNode (Op->Asl.Child->Asl.Value.String);
1131        return;
1132
1133
1134    case PARSEOP_INCLUDE_END:
1135
1136        /* Flush out the rest of the include file */
1137
1138        LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
1139            FileId);
1140
1141        /* Pop off this listing node and go back to the parent file */
1142
1143        (void) LsPopNode ();
1144        return;
1145
1146
1147    case PARSEOP_DEFAULT_ARG:
1148
1149        if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
1150        {
1151            LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.EndLogicalLine,
1152                FileId);
1153        }
1154        return;
1155
1156
1157    default:
1158        /* All other opcodes have an AML opcode */
1159        break;
1160    }
1161
1162    /*
1163     * Otherwise, we look at the AML opcode because we can
1164     * switch on the opcode type, getting an entire class
1165     * at once
1166     */
1167    switch (OpClass)
1168    {
1169    case AML_CLASS_ARGUMENT:       /* argument type only */
1170    case AML_CLASS_INTERNAL:
1171
1172        break;
1173
1174
1175    case AML_CLASS_NAMED_OBJECT:
1176
1177        switch (Op->Asl.AmlOpcode)
1178        {
1179        case AML_FIELD_OP:
1180        case AML_INDEX_FIELD_OP:
1181        case AML_BANK_FIELD_OP:
1182
1183            /*
1184             * For fields, we want to dump all the AML after the
1185             * entire definition
1186             */
1187            LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine,
1188                FileId);
1189            break;
1190
1191        case AML_NAME_OP:
1192
1193            if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
1194            {
1195                LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
1196                    FileId);
1197            }
1198            else
1199            {
1200                /*
1201                 * For fields, we want to dump all the AML after the
1202                 * entire definition
1203                 */
1204                LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine,
1205                    FileId);
1206            }
1207            break;
1208
1209        default:
1210            LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
1211                FileId);
1212            break;
1213        }
1214
1215        switch (Op->Asl.AmlOpcode)
1216        {
1217        case AML_SCOPE_OP:
1218        case AML_ALIAS_OP:
1219
1220            /* These opcodes do not declare a new object, ignore them */
1221
1222            break;
1223
1224        default:
1225
1226            /* All other named object opcodes come here */
1227
1228            switch (FileId)
1229            {
1230            case ASL_FILE_ASM_SOURCE_OUTPUT:
1231            case ASL_FILE_C_SOURCE_OUTPUT:
1232            case ASL_FILE_ASM_INCLUDE_OUTPUT:
1233            case ASL_FILE_C_INCLUDE_OUTPUT:
1234
1235                /*
1236                 * For named objects, we will create a valid symbol so that the
1237                 * AML code can be referenced from C or ASM
1238                 */
1239                if (Op->Asl.ExternalName)
1240                {
1241                    /* Get the full pathname associated with this node */
1242
1243                    Pathname = AcpiNsGetExternalPathname (Op->Asl.Node);
1244                    Length = strlen (Pathname);
1245                    if (Length >= 4)
1246                    {
1247                        /* Convert all dots in the path to underscores */
1248
1249                        for (i = 0; i < Length; i++)
1250                        {
1251                            if (Pathname[i] == '.')
1252                            {
1253                                Pathname[i] = '_';
1254                            }
1255                        }
1256
1257                        /* Create the appropriate symbol in the output file */
1258
1259                        if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
1260                        {
1261                            FlPrintFile (FileId,
1262                                "%s_%s_%s  \\\n",
1263                                Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
1264                        }
1265                        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
1266                        {
1267                            FlPrintFile (FileId,
1268                                "    unsigned char    %s_%s_%s [] =\n    {\n",
1269                                Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
1270                        }
1271                        if (FileId == ASL_FILE_ASM_INCLUDE_OUTPUT)
1272                        {
1273                            FlPrintFile (FileId,
1274                                "extrn %s_%s_%s : byte\n",
1275                                Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
1276                        }
1277                        if (FileId == ASL_FILE_C_INCLUDE_OUTPUT)
1278                        {
1279                            FlPrintFile (FileId,
1280                                "extern unsigned char    %s_%s_%s [];\n",
1281                                Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
1282                        }
1283                    }
1284                    ACPI_FREE (Pathname);
1285                }
1286                break;
1287
1288            default:
1289                /* Nothing to do for listing file */
1290                break;
1291            }
1292        }
1293        break;
1294
1295    case AML_CLASS_EXECUTE:
1296    case AML_CLASS_CREATE:
1297    default:
1298
1299        if ((Op->Asl.ParseOpcode == PARSEOP_BUFFER) &&
1300            (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC))
1301        {
1302            return;
1303        }
1304
1305        LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
1306            FileId);
1307        break;
1308
1309    case AML_CLASS_UNKNOWN:
1310        break;
1311    }
1312}
1313
1314
1315/*******************************************************************************
1316 *
1317 * FUNCTION:    LsDoHexOutput
1318 *
1319 * PARAMETERS:  None
1320 *
1321 * RETURN:      None.
1322 *
1323 * DESCRIPTION: Create the hex output file.
1324 *
1325 ******************************************************************************/
1326
1327void
1328LsDoHexOutput (
1329    void)
1330{
1331
1332    switch (Gbl_HexOutputFlag)
1333    {
1334    case HEX_OUTPUT_C:
1335
1336        LsDoHexOutputC ();
1337        break;
1338
1339    case HEX_OUTPUT_ASM:
1340
1341        LsDoHexOutputAsm ();
1342        break;
1343
1344    case HEX_OUTPUT_ASL:
1345
1346        LsDoHexOutputAsl ();
1347        break;
1348
1349    default:
1350        /* No other output types supported */
1351        break;
1352    }
1353}
1354
1355
1356/*******************************************************************************
1357 *
1358 * FUNCTION:    LsDoHexOutputC
1359 *
1360 * PARAMETERS:  None
1361 *
1362 * RETURN:      None.
1363 *
1364 * DESCRIPTION: Create the hex output file.  This is the same data as the AML
1365 *              output file, but formatted into hex/ascii bytes suitable for
1366 *              inclusion into a C source file.
1367 *
1368 ******************************************************************************/
1369
1370static void
1371LsDoHexOutputC (
1372    void)
1373{
1374    UINT8                   FileData[HEX_TABLE_LINE_SIZE];
1375    UINT32                  LineLength;
1376    UINT32                  Offset = 0;
1377    UINT32                  AmlFileSize;
1378    UINT32                  i;
1379
1380
1381    /* Get AML size, seek back to start */
1382
1383    AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
1384
1385    FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n");
1386    FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
1387        AmlFileSize);
1388    FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char AmlCode[] =\n{\n");
1389
1390    while (Offset < AmlFileSize)
1391    {
1392        /* Read enough bytes needed for one output line */
1393
1394        LineLength = fread (FileData, 1, HEX_TABLE_LINE_SIZE,
1395                        Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
1396        if (!LineLength)
1397        {
1398            break;
1399        }
1400
1401        FlPrintFile (ASL_FILE_HEX_OUTPUT, "    ");
1402
1403        for (i = 0; i < LineLength; i++)
1404        {
1405            /*
1406             * Print each hex byte.
1407             * Add a comma until the very last byte of the AML file
1408             * (Some C compilers complain about a trailing comma)
1409             */
1410            FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
1411            if ((Offset + i + 1) < AmlFileSize)
1412            {
1413                FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
1414            }
1415            else
1416            {
1417                FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
1418            }
1419        }
1420
1421        /* Add fill spaces if needed for last line */
1422
1423        if (LineLength < HEX_TABLE_LINE_SIZE)
1424        {
1425            FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
1426                5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
1427        }
1428
1429        /* Emit the offset and ascii dump for the entire line */
1430
1431        FlPrintFile (ASL_FILE_HEX_OUTPUT, "  /* %8.8X", Offset);
1432        LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
1433        FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
1434            HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
1435
1436        Offset += LineLength;
1437    }
1438
1439    FlPrintFile (ASL_FILE_HEX_OUTPUT, "};\n");
1440    FlCloseFile (ASL_FILE_HEX_OUTPUT);
1441}
1442
1443
1444/*******************************************************************************
1445 *
1446 * FUNCTION:    LsDoHexOutputAsl
1447 *
1448 * PARAMETERS:  None
1449 *
1450 * RETURN:      None.
1451 *
1452 * DESCRIPTION: Create the hex output file.  This is the same data as the AML
1453 *              output file, but formatted into hex/ascii bytes suitable for
1454 *              inclusion into a C source file.
1455 *
1456 ******************************************************************************/
1457
1458static void
1459LsDoHexOutputAsl (
1460    void)
1461{
1462    UINT8                   FileData[HEX_TABLE_LINE_SIZE];
1463    UINT32                  LineLength;
1464    UINT32                  Offset = 0;
1465    UINT32                  AmlFileSize;
1466    UINT32                  i;
1467
1468
1469    /* Get AML size, seek back to start */
1470
1471    AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
1472
1473    FlPrintFile (ASL_FILE_HEX_OUTPUT, " * ASL source code output\n");
1474    FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n",
1475        AmlFileSize);
1476    FlPrintFile (ASL_FILE_HEX_OUTPUT, "    Name (BUF1, Buffer()\n    {\n");
1477
1478    while (Offset < AmlFileSize)
1479    {
1480        /* Read enough bytes needed for one output line */
1481
1482        LineLength = fread (FileData, 1, HEX_TABLE_LINE_SIZE,
1483                        Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
1484        if (!LineLength)
1485        {
1486            break;
1487        }
1488
1489        FlPrintFile (ASL_FILE_HEX_OUTPUT, "        ");
1490
1491        for (i = 0; i < LineLength; i++)
1492        {
1493            /*
1494             * Print each hex byte.
1495             * Add a comma until the very last byte of the AML file
1496             * (Some C compilers complain about a trailing comma)
1497             */
1498            FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]);
1499            if ((Offset + i + 1) < AmlFileSize)
1500            {
1501                FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
1502            }
1503            else
1504            {
1505                FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
1506            }
1507        }
1508
1509        /* Add fill spaces if needed for last line */
1510
1511        if (LineLength < HEX_TABLE_LINE_SIZE)
1512        {
1513            FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
1514                5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
1515        }
1516
1517        /* Emit the offset and ascii dump for the entire line */
1518
1519        FlPrintFile (ASL_FILE_HEX_OUTPUT, "  /* %8.8X", Offset);
1520        LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
1521        FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n",
1522            HEX_TABLE_LINE_SIZE - LineLength + 1, " ");
1523
1524        Offset += LineLength;
1525    }
1526
1527    FlPrintFile (ASL_FILE_HEX_OUTPUT, "    })\n");
1528    FlCloseFile (ASL_FILE_HEX_OUTPUT);
1529}
1530
1531
1532/*******************************************************************************
1533 *
1534 * FUNCTION:    LsDoHexOutputAsm
1535 *
1536 * PARAMETERS:  None
1537 *
1538 * RETURN:      None.
1539 *
1540 * DESCRIPTION: Create the hex output file.  This is the same data as the AML
1541 *              output file, but formatted into hex/ascii bytes suitable for
1542 *              inclusion into a ASM source file.
1543 *
1544 ******************************************************************************/
1545
1546static void
1547LsDoHexOutputAsm (
1548    void)
1549{
1550    UINT8                   FileData[HEX_TABLE_LINE_SIZE];
1551    UINT32                  LineLength;
1552    UINT32                  Offset = 0;
1553    UINT32                  AmlFileSize;
1554    UINT32                  i;
1555
1556
1557    /* Get AML size, seek back to start */
1558
1559    AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT);
1560
1561    FlPrintFile (ASL_FILE_HEX_OUTPUT, "; Assembly code source output\n");
1562    FlPrintFile (ASL_FILE_HEX_OUTPUT, "; AML code block contains 0x%X bytes\n;\n",
1563        AmlFileSize);
1564
1565    while (Offset < AmlFileSize)
1566    {
1567        /* Read enough bytes needed for one output line */
1568
1569        LineLength = fread (FileData, 1, HEX_TABLE_LINE_SIZE,
1570                        Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
1571        if (!LineLength)
1572        {
1573            break;
1574        }
1575
1576        FlPrintFile (ASL_FILE_HEX_OUTPUT, "  db  ");
1577
1578        for (i = 0; i < LineLength; i++)
1579        {
1580            /*
1581             * Print each hex byte.
1582             * Add a comma until the last byte of the line
1583             */
1584            FlPrintFile (ASL_FILE_HEX_OUTPUT, "0%2.2Xh", FileData[i]);
1585            if ((i + 1) < LineLength)
1586            {
1587                FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
1588            }
1589        }
1590
1591        FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
1592
1593        /* Add fill spaces if needed for last line */
1594
1595        if (LineLength < HEX_TABLE_LINE_SIZE)
1596        {
1597            FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s",
1598                5 * (HEX_TABLE_LINE_SIZE - LineLength), " ");
1599        }
1600
1601        /* Emit the offset and ascii dump for the entire line */
1602
1603        FlPrintFile (ASL_FILE_HEX_OUTPUT, "  ; %8.8X", Offset);
1604        LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData);
1605        FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
1606
1607        Offset += LineLength;
1608    }
1609
1610    FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
1611    FlCloseFile (ASL_FILE_HEX_OUTPUT);
1612}
1613
1614
1615