1209734Sjkim/******************************************************************************
2209734Sjkim *
3209734Sjkim * Module Name: dttemplate - ACPI table template generation
4209734Sjkim *
5209734Sjkim *****************************************************************************/
6209734Sjkim
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9209734Sjkim * All rights reserved.
10209734Sjkim *
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.
25209734Sjkim *
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.
29209734Sjkim *
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 */
43209734Sjkim
44209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45209746Sjkim#include <contrib/dev/acpica/include/acapps.h>
46209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h>
47209746Sjkim#include <contrib/dev/acpica/compiler/dttemplate.h> /* Contains the hex ACPI table templates */
48209734Sjkim
49209734Sjkim#define _COMPONENT          DT_COMPILER
50209734Sjkim        ACPI_MODULE_NAME    ("dttemplate")
51209734Sjkim
52209734Sjkim
53209734Sjkim/* Local prototypes */
54209734Sjkim
55209734Sjkimstatic BOOLEAN
56209734SjkimAcpiUtIsSpecialTable (
57209734Sjkim    char                    *Signature);
58209734Sjkim
59209734Sjkimstatic ACPI_STATUS
60306536SjkimDtCreateOneTemplateFile (
61306536Sjkim    char                    *Signature,
62306536Sjkim    UINT32                  TableCount);
63306536Sjkim
64306536Sjkimstatic ACPI_STATUS
65209734SjkimDtCreateOneTemplate (
66209734Sjkim    char                    *Signature,
67306536Sjkim    UINT32                  TableCount,
68284460Sjkim    const ACPI_DMTABLE_DATA *TableData);
69209734Sjkim
70209734Sjkimstatic ACPI_STATUS
71209734SjkimDtCreateAllTemplates (
72209734Sjkim    void);
73209734Sjkim
74306536Sjkimstatic int
75306536SjkimDtEmitDefinitionBlock (
76306536Sjkim    FILE                    *File,
77306536Sjkim    char                    *Filename,
78306536Sjkim    char                    *Signature,
79306536Sjkim    UINT32                  Instance);
80209734Sjkim
81306536Sjkim
82209734Sjkim/*******************************************************************************
83209734Sjkim *
84209734Sjkim * FUNCTION:    AcpiUtIsSpecialTable
85209734Sjkim *
86209734Sjkim * PARAMETERS:  Signature           - ACPI table signature
87209734Sjkim *
88209734Sjkim * RETURN:      TRUE if signature is a special ACPI table
89209734Sjkim *
90209734Sjkim * DESCRIPTION: Check for valid ACPI tables that are not in the main ACPI
91209734Sjkim *              table data structure (AcpiDmTableData).
92209734Sjkim *
93209734Sjkim ******************************************************************************/
94209734Sjkim
95209734Sjkimstatic BOOLEAN
96209734SjkimAcpiUtIsSpecialTable (
97209734Sjkim    char                    *Signature)
98209734Sjkim{
99209734Sjkim
100209734Sjkim    if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT) ||
101306536Sjkim        ACPI_COMPARE_NAME (Signature, ACPI_SIG_OSDT) ||
102209734Sjkim        ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT) ||
103209734Sjkim        ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS) ||
104209734Sjkim        ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME))
105209734Sjkim    {
106209734Sjkim        return (TRUE);
107209734Sjkim    }
108209734Sjkim
109209734Sjkim    return (FALSE);
110209734Sjkim}
111209734Sjkim
112209734Sjkim
113209734Sjkim/*******************************************************************************
114209734Sjkim *
115209734Sjkim * FUNCTION:    DtCreateTemplates
116209734Sjkim *
117306536Sjkim * PARAMETERS:  argv                - Standard command line arguments
118209734Sjkim *
119209734Sjkim * RETURN:      Status
120209734Sjkim *
121209734Sjkim * DESCRIPTION: Create one or more template files.
122209734Sjkim *
123209734Sjkim ******************************************************************************/
124209734Sjkim
125209734SjkimACPI_STATUS
126209734SjkimDtCreateTemplates (
127306536Sjkim    char                    **argv)
128209734Sjkim{
129306536Sjkim    char                    *Signature;
130306536Sjkim    char                    *End;
131306536Sjkim    unsigned long           TableCount;
132306536Sjkim    ACPI_STATUS             Status = AE_OK;
133209734Sjkim
134209734Sjkim
135209734Sjkim    AslInitializeGlobals ();
136209734Sjkim
137306536Sjkim    Status = AdInitialize ();
138306536Sjkim    if (ACPI_FAILURE (Status))
139306536Sjkim    {
140306536Sjkim        return (Status);
141306536Sjkim    }
142209734Sjkim
143306536Sjkim    /*
144306536Sjkim     * Special cases for DSDT, ALL, and '*'
145306536Sjkim     */
146306536Sjkim
147306536Sjkim    /* Default (no signature option) is DSDT */
148306536Sjkim
149306536Sjkim    if (AcpiGbl_Optind < 3)
150253690Sjkim    {
151306536Sjkim        Status = DtCreateOneTemplateFile (ACPI_SIG_DSDT, 0);
152306536Sjkim        goto Exit;
153253690Sjkim    }
154253690Sjkim
155306536Sjkim    AcpiGbl_Optind--;
156306536Sjkim    Signature = argv[AcpiGbl_Optind];
157253690Sjkim    AcpiUtStrupr (Signature);
158306536Sjkim
159306536Sjkim    /*
160306536Sjkim     * Multiple SSDT support (-T <ssdt count>)
161306536Sjkim     */
162306536Sjkim    TableCount = strtoul (Signature, &End, 0);
163306536Sjkim    if (Signature != End)
164209734Sjkim    {
165306536Sjkim        /* The count is used for table ID and method name - max is 254(+1) */
166306536Sjkim
167306536Sjkim        if (TableCount > 254)
168306536Sjkim        {
169306536Sjkim            fprintf (stderr, "%u SSDTs requested, maximum is 254\n",
170306536Sjkim                (unsigned int) TableCount);
171306536Sjkim
172306536Sjkim            Status = AE_LIMIT;
173306536Sjkim            goto Exit;
174306536Sjkim        }
175306536Sjkim
176306536Sjkim        Status = DtCreateOneTemplateFile (ACPI_SIG_DSDT, TableCount);
177306536Sjkim        goto Exit;
178306536Sjkim    }
179306536Sjkim
180306536Sjkim    if (!strcmp (Signature, "ALL"))
181306536Sjkim    {
182253690Sjkim        /* Create all available/known templates */
183253690Sjkim
184209734Sjkim        Status = DtCreateAllTemplates ();
185306536Sjkim        goto Exit;
186209734Sjkim    }
187209734Sjkim
188209734Sjkim    /*
189306536Sjkim     * Normal case: Create template for each signature
190306536Sjkim     */
191306536Sjkim    while (argv[AcpiGbl_Optind])
192306536Sjkim    {
193306536Sjkim        Signature = argv[AcpiGbl_Optind];
194306536Sjkim        AcpiUtStrupr (Signature);
195306536Sjkim
196306536Sjkim        Status = DtCreateOneTemplateFile (Signature, 0);
197306536Sjkim        if (ACPI_FAILURE (Status))
198306536Sjkim        {
199306536Sjkim            goto Exit;
200306536Sjkim        }
201306536Sjkim
202306536Sjkim        AcpiGbl_Optind++;
203306536Sjkim    }
204306536Sjkim
205306536Sjkim
206306536SjkimExit:
207306536Sjkim    /* Shutdown ACPICA subsystem */
208306536Sjkim
209306536Sjkim    (void) AcpiTerminate ();
210306536Sjkim    CmDeleteCaches ();
211306536Sjkim    return (Status);
212306536Sjkim}
213306536Sjkim
214306536Sjkim
215306536Sjkim/*******************************************************************************
216306536Sjkim *
217306536Sjkim * FUNCTION:    DtCreateOneTemplateFile
218306536Sjkim *
219306536Sjkim * PARAMETERS:  Signature           - ACPI table signature
220306536Sjkim *
221306536Sjkim * RETURN:      Status
222306536Sjkim *
223306536Sjkim * DESCRIPTION: Create one template file of the requested signature.
224306536Sjkim *
225306536Sjkim ******************************************************************************/
226306536Sjkim
227306536Sjkimstatic ACPI_STATUS
228306536SjkimDtCreateOneTemplateFile (
229306536Sjkim    char                    *Signature,
230306536Sjkim    UINT32                  TableCount)
231306536Sjkim{
232306536Sjkim    const ACPI_DMTABLE_DATA *TableData;
233306536Sjkim    ACPI_STATUS             Status;
234306536Sjkim
235306536Sjkim
236306536Sjkim    /*
237209734Sjkim     * Validate signature and get the template data:
238209734Sjkim     *  1) Signature must be 4 characters
239209734Sjkim     *  2) Signature must be a recognized ACPI table
240209734Sjkim     *  3) There must be a template associated with the signature
241209734Sjkim     */
242209734Sjkim    if (strlen (Signature) != ACPI_NAME_SIZE)
243209734Sjkim    {
244253690Sjkim        fprintf (stderr,
245306536Sjkim            "%s: Invalid ACPI table signature "
246306536Sjkim            "(length must be 4 characters)\n", Signature);
247209734Sjkim        return (AE_ERROR);
248209734Sjkim    }
249209734Sjkim
250209734Sjkim    /*
251209734Sjkim     * Some slack for the two strange tables whose name is different than
252209734Sjkim     * their signatures: MADT->APIC and FADT->FACP.
253209734Sjkim     */
254209734Sjkim    if (!strcmp (Signature, "MADT"))
255209734Sjkim    {
256209734Sjkim        Signature = "APIC";
257209734Sjkim    }
258209734Sjkim    else if (!strcmp (Signature, "FADT"))
259209734Sjkim    {
260209734Sjkim        Signature = "FACP";
261209734Sjkim    }
262209734Sjkim
263306536Sjkim    /* TableData will point to the template */
264306536Sjkim
265209734Sjkim    TableData = AcpiDmGetTableData (Signature);
266209734Sjkim    if (TableData)
267209734Sjkim    {
268209734Sjkim        if (!TableData->Template)
269209734Sjkim        {
270253690Sjkim            fprintf (stderr, "%4.4s: No template available\n", Signature);
271209734Sjkim            return (AE_ERROR);
272209734Sjkim        }
273209734Sjkim    }
274209734Sjkim    else if (!AcpiUtIsSpecialTable (Signature))
275209734Sjkim    {
276209734Sjkim        fprintf (stderr,
277253690Sjkim            "%4.4s: Unrecognized ACPI table signature\n", Signature);
278209734Sjkim        return (AE_ERROR);
279209734Sjkim    }
280209734Sjkim
281306536Sjkim    Status = DtCreateOneTemplate (Signature, TableCount, TableData);
282209734Sjkim    return (Status);
283209734Sjkim}
284209734Sjkim
285209734Sjkim
286209734Sjkim/*******************************************************************************
287209734Sjkim *
288209734Sjkim * FUNCTION:    DtCreateAllTemplates
289209734Sjkim *
290209734Sjkim * PARAMETERS:  None
291209734Sjkim *
292209734Sjkim * RETURN:      Status
293209734Sjkim *
294209734Sjkim * DESCRIPTION: Create all currently defined template files
295209734Sjkim *
296209734Sjkim ******************************************************************************/
297209734Sjkim
298209734Sjkimstatic ACPI_STATUS
299209734SjkimDtCreateAllTemplates (
300209734Sjkim    void)
301209734Sjkim{
302284460Sjkim    const ACPI_DMTABLE_DATA *TableData;
303209734Sjkim    ACPI_STATUS             Status;
304209734Sjkim
305209734Sjkim
306209734Sjkim    fprintf (stderr, "Creating all supported Template files\n");
307209734Sjkim
308209734Sjkim    /* Walk entire ACPI table data structure */
309209734Sjkim
310209734Sjkim    for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
311209734Sjkim    {
312209734Sjkim        /* If table has a template, create the template file */
313209734Sjkim
314209734Sjkim        if (TableData->Template)
315209734Sjkim        {
316209734Sjkim            Status = DtCreateOneTemplate (TableData->Signature,
317306536Sjkim                0, TableData);
318209734Sjkim            if (ACPI_FAILURE (Status))
319209734Sjkim            {
320209734Sjkim                return (Status);
321209734Sjkim            }
322209734Sjkim        }
323209734Sjkim    }
324209734Sjkim
325209734Sjkim    /*
326237412Sjkim     * Create the special ACPI tables:
327209734Sjkim     * 1) DSDT/SSDT are AML tables, not data tables
328209734Sjkim     * 2) FACS and RSDP have non-standard headers
329209734Sjkim     */
330306536Sjkim    Status = DtCreateOneTemplate (ACPI_SIG_DSDT, 0, NULL);
331209734Sjkim    if (ACPI_FAILURE (Status))
332209734Sjkim    {
333209734Sjkim        return (Status);
334209734Sjkim    }
335209734Sjkim
336306536Sjkim    Status = DtCreateOneTemplate (ACPI_SIG_SSDT, 0, NULL);
337209734Sjkim    if (ACPI_FAILURE (Status))
338209734Sjkim    {
339209734Sjkim        return (Status);
340209734Sjkim    }
341209734Sjkim
342306536Sjkim    Status = DtCreateOneTemplate (ACPI_SIG_OSDT, 0, NULL);
343209734Sjkim    if (ACPI_FAILURE (Status))
344209734Sjkim    {
345209734Sjkim        return (Status);
346209734Sjkim    }
347209734Sjkim
348306536Sjkim    Status = DtCreateOneTemplate (ACPI_SIG_FACS, 0, NULL);
349209734Sjkim    if (ACPI_FAILURE (Status))
350209734Sjkim    {
351209734Sjkim        return (Status);
352209734Sjkim    }
353209734Sjkim
354306536Sjkim    Status = DtCreateOneTemplate (ACPI_RSDP_NAME, 0, NULL);
355306536Sjkim    if (ACPI_FAILURE (Status))
356306536Sjkim    {
357306536Sjkim        return (Status);
358306536Sjkim    }
359306536Sjkim
360209734Sjkim    return (AE_OK);
361209734Sjkim}
362209734Sjkim
363209734Sjkim
364209734Sjkim/*******************************************************************************
365209734Sjkim *
366209734Sjkim * FUNCTION:    DtCreateOneTemplate
367209734Sjkim *
368209734Sjkim * PARAMETERS:  Signature           - ACPI signature, NULL terminated.
369306536Sjkim *              TableCount          - Used for SSDTs in same file as DSDT
370209734Sjkim *              TableData           - Entry in ACPI table data structure.
371209734Sjkim *                                    NULL if a special ACPI table.
372209734Sjkim *
373209734Sjkim * RETURN:      Status
374209734Sjkim *
375209734Sjkim * DESCRIPTION: Create one template source file for the requested ACPI table.
376209734Sjkim *
377209734Sjkim ******************************************************************************/
378209734Sjkim
379209734Sjkimstatic ACPI_STATUS
380209734SjkimDtCreateOneTemplate (
381209734Sjkim    char                    *Signature,
382306536Sjkim    UINT32                  TableCount,
383284460Sjkim    const ACPI_DMTABLE_DATA  *TableData)
384209734Sjkim{
385209734Sjkim    char                    *DisasmFilename;
386209734Sjkim    FILE                    *File;
387209734Sjkim    ACPI_STATUS             Status = AE_OK;
388306536Sjkim    int                     Actual;
389306536Sjkim    UINT32                  i;
390209734Sjkim
391209734Sjkim
392209734Sjkim    /* New file will have a .asl suffix */
393209734Sjkim
394209734Sjkim    DisasmFilename = FlGenerateFilename (
395209734Sjkim        Signature, FILE_SUFFIX_ASL_CODE);
396209734Sjkim    if (!DisasmFilename)
397209734Sjkim    {
398209734Sjkim        fprintf (stderr, "Could not generate output filename\n");
399209734Sjkim        return (AE_ERROR);
400209734Sjkim    }
401209734Sjkim
402306536Sjkim    AcpiUtStrlwr (DisasmFilename);
403306536Sjkim    if (!UtQueryForOverwrite (DisasmFilename))
404306536Sjkim    {
405306536Sjkim        return (AE_ERROR);
406306536Sjkim    }
407209734Sjkim
408209734Sjkim    File = fopen (DisasmFilename, "w+");
409209734Sjkim    if (!File)
410209734Sjkim    {
411306536Sjkim        fprintf (stderr, "Could not open output file %s\n",
412306536Sjkim            DisasmFilename);
413209734Sjkim        return (AE_ERROR);
414209734Sjkim    }
415209734Sjkim
416209734Sjkim    /* Emit the common file header */
417209734Sjkim
418209734Sjkim    AcpiOsRedirectOutput (File);
419209734Sjkim
420213806Sjkim    AcpiOsPrintf ("/*\n");
421213806Sjkim    AcpiOsPrintf (ACPI_COMMON_HEADER ("iASL Compiler/Disassembler", " * "));
422213806Sjkim
423306536Sjkim    if (TableCount == 0)
424306536Sjkim    {
425306536Sjkim        AcpiOsPrintf (" * Template for [%4.4s] ACPI Table",
426306536Sjkim            Signature);
427306536Sjkim    }
428306536Sjkim    else
429306536Sjkim    {
430306536Sjkim        AcpiOsPrintf (" * Template for [%4.4s] and %u [SSDT] ACPI Tables",
431306536Sjkim            Signature, TableCount);
432306536Sjkim    }
433209734Sjkim
434209734Sjkim    /* Dump the actual ACPI table */
435209734Sjkim
436209734Sjkim    if (TableData)
437209734Sjkim    {
438209734Sjkim        /* Normal case, tables that appear in AcpiDmTableData */
439209734Sjkim
440306536Sjkim        AcpiOsPrintf (" (static data table)\n");
441306536Sjkim
442209734Sjkim        if (Gbl_VerboseTemplates)
443209734Sjkim        {
444209734Sjkim            AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength]"
445209734Sjkim                "  FieldName : HexFieldValue\n */\n\n");
446209734Sjkim        }
447209734Sjkim        else
448209734Sjkim        {
449209734Sjkim            AcpiOsPrintf (" * Format: [ByteLength]"
450306536Sjkim                "  FieldName : HexFieldValue\n */\n");
451209734Sjkim        }
452209734Sjkim
453209734Sjkim        AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER,
454209734Sjkim            TableData->Template));
455209734Sjkim    }
456209734Sjkim    else
457209734Sjkim    {
458306536Sjkim        /* Special ACPI tables - DSDT, SSDT, OSDT, FACS, RSDP */
459209734Sjkim
460306536Sjkim        AcpiOsPrintf (" (AML byte code table)\n");
461306536Sjkim        AcpiOsPrintf (" */\n");
462306536Sjkim
463209734Sjkim        if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT))
464209734Sjkim        {
465306536Sjkim            Actual = DtEmitDefinitionBlock (
466306536Sjkim                File, DisasmFilename, ACPI_SIG_DSDT, 1);
467306536Sjkim            if (Actual < 0)
468243347Sjkim            {
469243347Sjkim                Status = AE_ERROR;
470243347Sjkim                goto Cleanup;
471243347Sjkim            }
472306536Sjkim
473306536Sjkim            /* Emit any requested SSDTs into the same file */
474306536Sjkim
475306536Sjkim            for (i = 1; i <= TableCount; i++)
476306536Sjkim            {
477306536Sjkim                Actual = DtEmitDefinitionBlock (
478306536Sjkim                    File, DisasmFilename, ACPI_SIG_SSDT, i + 1);
479306536Sjkim                if (Actual < 0)
480306536Sjkim                {
481306536Sjkim                    Status = AE_ERROR;
482306536Sjkim                    goto Cleanup;
483306536Sjkim                }
484306536Sjkim            }
485209734Sjkim        }
486209734Sjkim        else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT))
487209734Sjkim        {
488306536Sjkim            Actual = DtEmitDefinitionBlock (
489306536Sjkim                File, DisasmFilename, ACPI_SIG_SSDT, 1);
490306536Sjkim            if (Actual < 0)
491243347Sjkim            {
492243347Sjkim                Status = AE_ERROR;
493243347Sjkim                goto Cleanup;
494243347Sjkim            }
495209734Sjkim        }
496306536Sjkim        else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_OSDT))
497209734Sjkim        {
498306536Sjkim            Actual = DtEmitDefinitionBlock (
499306536Sjkim                File, DisasmFilename, ACPI_SIG_OSDT, 1);
500306536Sjkim            if (Actual < 0)
501306536Sjkim            {
502306536Sjkim                Status = AE_ERROR;
503306536Sjkim                goto Cleanup;
504306536Sjkim            }
505306536Sjkim        }
506306536Sjkim        else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS))
507306536Sjkim        {
508209734Sjkim            AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER,
509209734Sjkim                TemplateFacs));
510209734Sjkim        }
511209734Sjkim        else if (ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME))
512209734Sjkim        {
513209734Sjkim            AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER,
514209734Sjkim                TemplateRsdp));
515209734Sjkim        }
516209734Sjkim        else
517209734Sjkim        {
518209734Sjkim            fprintf (stderr,
519209734Sjkim                "%4.4s, Unrecognized ACPI table signature\n", Signature);
520243347Sjkim            Status = AE_ERROR;
521243347Sjkim            goto Cleanup;
522209734Sjkim        }
523209734Sjkim    }
524209734Sjkim
525306536Sjkim    if (TableCount == 0)
526306536Sjkim    {
527306536Sjkim        fprintf (stderr,
528306536Sjkim            "Created ACPI table template for [%4.4s], "
529306536Sjkim            "written to \"%s\"\n",
530306536Sjkim            Signature, DisasmFilename);
531306536Sjkim    }
532306536Sjkim    else
533306536Sjkim    {
534306536Sjkim        fprintf (stderr,
535306536Sjkim            "Created ACPI table templates for [%4.4s] "
536306536Sjkim            "and %u [SSDT], written to \"%s\"\n",
537306536Sjkim            Signature, TableCount, DisasmFilename);
538306536Sjkim    }
539209734Sjkim
540243347SjkimCleanup:
541209734Sjkim    fclose (File);
542209734Sjkim    AcpiOsRedirectOutput (stdout);
543209734Sjkim    return (Status);
544209734Sjkim}
545306536Sjkim
546306536Sjkim
547306536Sjkim/*******************************************************************************
548306536Sjkim *
549306536Sjkim * FUNCTION:    DtEmitDefinitionBlock
550306536Sjkim *
551306536Sjkim * PARAMETERS:  File                - An open file for the block
552306536Sjkim *              Filename            - Filename for same, for error msg(s)
553306536Sjkim *              Signature           - ACPI signature for the block
554306536Sjkim *              Instance            - Used for multiple SSDTs in the same file
555306536Sjkim *
556306536Sjkim * RETURN:      Status from fprintf
557306536Sjkim *
558306536Sjkim * DESCRIPTION: Emit the raw ASL for a complete Definition Block (DSDT or SSDT)
559306536Sjkim *
560306536Sjkim * Note: The AMLFileName parameter for DefinitionBlock is left as a NULL
561306536Sjkim * string. This allows the compiler to create the output AML filename from
562306536Sjkim * the input filename.
563306536Sjkim *
564306536Sjkim ******************************************************************************/
565306536Sjkim
566306536Sjkimstatic int
567306536SjkimDtEmitDefinitionBlock (
568306536Sjkim    FILE                    *File,
569306536Sjkim    char                    *Filename,
570306536Sjkim    char                    *Signature,
571306536Sjkim    UINT32                  Instance)
572306536Sjkim{
573306536Sjkim    int                     Status;
574306536Sjkim
575306536Sjkim
576306536Sjkim    Status = fprintf (File,
577306536Sjkim        "DefinitionBlock (\"\", \"%4.4s\", 2, \"Intel\", \"_%4.4s_%.2X\", 0x00000001)\n"
578306536Sjkim        "{\n"
579306536Sjkim        "    Method (%2.2s%.2X)\n"
580306536Sjkim        "    {\n"
581306536Sjkim        "    }\n"
582306536Sjkim        "}\n\n",
583306536Sjkim        Signature, Signature, Instance, Signature, Instance);
584306536Sjkim
585306536Sjkim    if (Status < 0)
586306536Sjkim    {
587306536Sjkim        fprintf (stderr,
588306536Sjkim            "Could not write %4.4s to output file %s\n",
589306536Sjkim            Signature, Filename);
590306536Sjkim    }
591306536Sjkim
592306536Sjkim    return (Status);
593306536Sjkim}
594