aslcodegen.c revision 1.1.1.2.8.2 1 1.1.1.2.8.2 jruoho
2 1.1.1.2.8.2 jruoho /******************************************************************************
3 1.1.1.2.8.2 jruoho *
4 1.1.1.2.8.2 jruoho * Module Name: aslcodegen - AML code generation
5 1.1.1.2.8.2 jruoho *
6 1.1.1.2.8.2 jruoho *****************************************************************************/
7 1.1.1.2.8.2 jruoho
8 1.1.1.2.8.2 jruoho /*
9 1.1.1.2.8.2 jruoho * Copyright (C) 2000 - 2011, Intel Corp.
10 1.1.1.2.8.2 jruoho * All rights reserved.
11 1.1.1.2.8.2 jruoho *
12 1.1.1.2.8.2 jruoho * Redistribution and use in source and binary forms, with or without
13 1.1.1.2.8.2 jruoho * modification, are permitted provided that the following conditions
14 1.1.1.2.8.2 jruoho * are met:
15 1.1.1.2.8.2 jruoho * 1. Redistributions of source code must retain the above copyright
16 1.1.1.2.8.2 jruoho * notice, this list of conditions, and the following disclaimer,
17 1.1.1.2.8.2 jruoho * without modification.
18 1.1.1.2.8.2 jruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 1.1.1.2.8.2 jruoho * substantially similar to the "NO WARRANTY" disclaimer below
20 1.1.1.2.8.2 jruoho * ("Disclaimer") and any redistribution must be conditioned upon
21 1.1.1.2.8.2 jruoho * including a substantially similar Disclaimer requirement for further
22 1.1.1.2.8.2 jruoho * binary redistribution.
23 1.1.1.2.8.2 jruoho * 3. Neither the names of the above-listed copyright holders nor the names
24 1.1.1.2.8.2 jruoho * of any contributors may be used to endorse or promote products derived
25 1.1.1.2.8.2 jruoho * from this software without specific prior written permission.
26 1.1.1.2.8.2 jruoho *
27 1.1.1.2.8.2 jruoho * Alternatively, this software may be distributed under the terms of the
28 1.1.1.2.8.2 jruoho * GNU General Public License ("GPL") version 2 as published by the Free
29 1.1.1.2.8.2 jruoho * Software Foundation.
30 1.1.1.2.8.2 jruoho *
31 1.1.1.2.8.2 jruoho * NO WARRANTY
32 1.1.1.2.8.2 jruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 1.1.1.2.8.2 jruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 1.1.1.2.8.2 jruoho * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35 1.1.1.2.8.2 jruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 1.1.1.2.8.2 jruoho * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 1.1.1.2.8.2 jruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38 1.1.1.2.8.2 jruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 1.1.1.2.8.2 jruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 1.1.1.2.8.2 jruoho * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41 1.1.1.2.8.2 jruoho * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 1.1.1.2.8.2 jruoho * POSSIBILITY OF SUCH DAMAGES.
43 1.1.1.2.8.2 jruoho */
44 1.1.1.2.8.2 jruoho
45 1.1.1.2.8.2 jruoho
46 1.1.1.2.8.2 jruoho #include "aslcompiler.h"
47 1.1.1.2.8.2 jruoho #include "aslcompiler.y.h"
48 1.1.1.2.8.2 jruoho #include "amlcode.h"
49 1.1.1.2.8.2 jruoho
50 1.1.1.2.8.2 jruoho #define _COMPONENT ACPI_COMPILER
51 1.1.1.2.8.2 jruoho ACPI_MODULE_NAME ("aslcodegen")
52 1.1.1.2.8.2 jruoho
53 1.1.1.2.8.2 jruoho /* Local prototypes */
54 1.1.1.2.8.2 jruoho
55 1.1.1.2.8.2 jruoho static ACPI_STATUS
56 1.1.1.2.8.2 jruoho CgAmlWriteWalk (
57 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op,
58 1.1.1.2.8.2 jruoho UINT32 Level,
59 1.1.1.2.8.2 jruoho void *Context);
60 1.1.1.2.8.2 jruoho
61 1.1.1.2.8.2 jruoho static void
62 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (
63 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op,
64 1.1.1.2.8.2 jruoho void *Buffer,
65 1.1.1.2.8.2 jruoho UINT32 Length);
66 1.1.1.2.8.2 jruoho
67 1.1.1.2.8.2 jruoho static void
68 1.1.1.2.8.2 jruoho CgWriteAmlOpcode (
69 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op);
70 1.1.1.2.8.2 jruoho
71 1.1.1.2.8.2 jruoho static void
72 1.1.1.2.8.2 jruoho CgWriteTableHeader (
73 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op);
74 1.1.1.2.8.2 jruoho
75 1.1.1.2.8.2 jruoho static void
76 1.1.1.2.8.2 jruoho CgCloseTable (
77 1.1.1.2.8.2 jruoho void);
78 1.1.1.2.8.2 jruoho
79 1.1.1.2.8.2 jruoho static void
80 1.1.1.2.8.2 jruoho CgWriteNode (
81 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op);
82 1.1.1.2.8.2 jruoho
83 1.1.1.2.8.2 jruoho
84 1.1.1.2.8.2 jruoho /*******************************************************************************
85 1.1.1.2.8.2 jruoho *
86 1.1.1.2.8.2 jruoho * FUNCTION: CgGenerateAmlOutput
87 1.1.1.2.8.2 jruoho *
88 1.1.1.2.8.2 jruoho * PARAMETERS: None.
89 1.1.1.2.8.2 jruoho *
90 1.1.1.2.8.2 jruoho * RETURN: None
91 1.1.1.2.8.2 jruoho *
92 1.1.1.2.8.2 jruoho * DESCRIPTION: Generate AML code. Currently generates the listing file
93 1.1.1.2.8.2 jruoho * simultaneously.
94 1.1.1.2.8.2 jruoho *
95 1.1.1.2.8.2 jruoho ******************************************************************************/
96 1.1.1.2.8.2 jruoho
97 1.1.1.2.8.2 jruoho void
98 1.1.1.2.8.2 jruoho CgGenerateAmlOutput (
99 1.1.1.2.8.2 jruoho void)
100 1.1.1.2.8.2 jruoho {
101 1.1.1.2.8.2 jruoho
102 1.1.1.2.8.2 jruoho DbgPrint (ASL_DEBUG_OUTPUT, "\nWriting AML\n\n");
103 1.1.1.2.8.2 jruoho
104 1.1.1.2.8.2 jruoho /* Generate the AML output file */
105 1.1.1.2.8.2 jruoho
106 1.1.1.2.8.2 jruoho FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0);
107 1.1.1.2.8.2 jruoho Gbl_SourceLine = 0;
108 1.1.1.2.8.2 jruoho Gbl_NextError = Gbl_ErrorLog;
109 1.1.1.2.8.2 jruoho
110 1.1.1.2.8.2 jruoho TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
111 1.1.1.2.8.2 jruoho CgAmlWriteWalk, NULL, NULL);
112 1.1.1.2.8.2 jruoho CgCloseTable ();
113 1.1.1.2.8.2 jruoho }
114 1.1.1.2.8.2 jruoho
115 1.1.1.2.8.2 jruoho
116 1.1.1.2.8.2 jruoho /*******************************************************************************
117 1.1.1.2.8.2 jruoho *
118 1.1.1.2.8.2 jruoho * FUNCTION: CgAmlWriteWalk
119 1.1.1.2.8.2 jruoho *
120 1.1.1.2.8.2 jruoho * PARAMETERS: ASL_WALK_CALLBACK
121 1.1.1.2.8.2 jruoho *
122 1.1.1.2.8.2 jruoho * RETURN: Status
123 1.1.1.2.8.2 jruoho *
124 1.1.1.2.8.2 jruoho * DESCRIPTION: Parse tree walk to generate the AML code.
125 1.1.1.2.8.2 jruoho *
126 1.1.1.2.8.2 jruoho ******************************************************************************/
127 1.1.1.2.8.2 jruoho
128 1.1.1.2.8.2 jruoho static ACPI_STATUS
129 1.1.1.2.8.2 jruoho CgAmlWriteWalk (
130 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op,
131 1.1.1.2.8.2 jruoho UINT32 Level,
132 1.1.1.2.8.2 jruoho void *Context)
133 1.1.1.2.8.2 jruoho {
134 1.1.1.2.8.2 jruoho
135 1.1.1.2.8.2 jruoho /*
136 1.1.1.2.8.2 jruoho * Print header at level 0. Alignment assumes 32-bit pointers
137 1.1.1.2.8.2 jruoho */
138 1.1.1.2.8.2 jruoho if (!Level)
139 1.1.1.2.8.2 jruoho {
140 1.1.1.2.8.2 jruoho DbgPrint (ASL_TREE_OUTPUT,
141 1.1.1.2.8.2 jruoho "Final parse tree used for AML output:\n");
142 1.1.1.2.8.2 jruoho DbgPrint (ASL_TREE_OUTPUT,
143 1.1.1.2.8.2 jruoho "%*s Value P_Op A_Op OpLen PByts Len SubLen PSubLen OpPtr Child Parent Flags AcTyp Final Col L\n",
144 1.1.1.2.8.2 jruoho 76, " ");
145 1.1.1.2.8.2 jruoho }
146 1.1.1.2.8.2 jruoho
147 1.1.1.2.8.2 jruoho /* Debug output */
148 1.1.1.2.8.2 jruoho
149 1.1.1.2.8.2 jruoho DbgPrint (ASL_TREE_OUTPUT,
150 1.1.1.2.8.2 jruoho "%5.5d [%2d]", Op->Asl.LogicalLineNumber, Level);
151 1.1.1.2.8.2 jruoho UtPrintFormattedName (Op->Asl.ParseOpcode, Level);
152 1.1.1.2.8.2 jruoho
153 1.1.1.2.8.2 jruoho if (Op->Asl.ParseOpcode == PARSEOP_NAMESEG ||
154 1.1.1.2.8.2 jruoho Op->Asl.ParseOpcode == PARSEOP_NAMESTRING ||
155 1.1.1.2.8.2 jruoho Op->Asl.ParseOpcode == PARSEOP_METHODCALL)
156 1.1.1.2.8.2 jruoho {
157 1.1.1.2.8.2 jruoho DbgPrint (ASL_TREE_OUTPUT,
158 1.1.1.2.8.2 jruoho "%10.32s ", Op->Asl.ExternalName);
159 1.1.1.2.8.2 jruoho }
160 1.1.1.2.8.2 jruoho else
161 1.1.1.2.8.2 jruoho {
162 1.1.1.2.8.2 jruoho DbgPrint (ASL_TREE_OUTPUT, " ");
163 1.1.1.2.8.2 jruoho }
164 1.1.1.2.8.2 jruoho
165 1.1.1.2.8.2 jruoho DbgPrint (ASL_TREE_OUTPUT,
166 1.1.1.2.8.2 jruoho "%08X %04X %04X %01X %04X %04X %04X %04X %08X %08X %08X %08X %08X %04X %02d %02d\n",
167 1.1.1.2.8.2 jruoho /* 1 */ (UINT32) Op->Asl.Value.Integer,
168 1.1.1.2.8.2 jruoho /* 2 */ Op->Asl.ParseOpcode,
169 1.1.1.2.8.2 jruoho /* 3 */ Op->Asl.AmlOpcode,
170 1.1.1.2.8.2 jruoho /* 4 */ Op->Asl.AmlOpcodeLength,
171 1.1.1.2.8.2 jruoho /* 5 */ Op->Asl.AmlPkgLenBytes,
172 1.1.1.2.8.2 jruoho /* 6 */ Op->Asl.AmlLength,
173 1.1.1.2.8.2 jruoho /* 7 */ Op->Asl.AmlSubtreeLength,
174 1.1.1.2.8.2 jruoho /* 8 */ Op->Asl.Parent ? Op->Asl.Parent->Asl.AmlSubtreeLength : 0,
175 1.1.1.2.8.2 jruoho /* 9 */ Op,
176 1.1.1.2.8.2 jruoho /* 10 */ Op->Asl.Child,
177 1.1.1.2.8.2 jruoho /* 11 */ Op->Asl.Parent,
178 1.1.1.2.8.2 jruoho /* 12 */ Op->Asl.CompileFlags,
179 1.1.1.2.8.2 jruoho /* 13 */ Op->Asl.AcpiBtype,
180 1.1.1.2.8.2 jruoho /* 14 */ Op->Asl.FinalAmlLength,
181 1.1.1.2.8.2 jruoho /* 15 */ Op->Asl.Column,
182 1.1.1.2.8.2 jruoho /* 16 */ Op->Asl.LineNumber);
183 1.1.1.2.8.2 jruoho
184 1.1.1.2.8.2 jruoho /* Generate the AML for this node */
185 1.1.1.2.8.2 jruoho
186 1.1.1.2.8.2 jruoho CgWriteNode (Op);
187 1.1.1.2.8.2 jruoho return (AE_OK);
188 1.1.1.2.8.2 jruoho }
189 1.1.1.2.8.2 jruoho
190 1.1.1.2.8.2 jruoho
191 1.1.1.2.8.2 jruoho /*******************************************************************************
192 1.1.1.2.8.2 jruoho *
193 1.1.1.2.8.2 jruoho * FUNCTION: CgLocalWriteAmlData
194 1.1.1.2.8.2 jruoho *
195 1.1.1.2.8.2 jruoho * PARAMETERS: Op - Current parse op
196 1.1.1.2.8.2 jruoho * Buffer - Buffer to write
197 1.1.1.2.8.2 jruoho * Length - Size of data in buffer
198 1.1.1.2.8.2 jruoho *
199 1.1.1.2.8.2 jruoho * RETURN: None
200 1.1.1.2.8.2 jruoho *
201 1.1.1.2.8.2 jruoho * DESCRIPTION: Write a buffer of AML data to the AML output file.
202 1.1.1.2.8.2 jruoho *
203 1.1.1.2.8.2 jruoho ******************************************************************************/
204 1.1.1.2.8.2 jruoho
205 1.1.1.2.8.2 jruoho static void
206 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (
207 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op,
208 1.1.1.2.8.2 jruoho void *Buffer,
209 1.1.1.2.8.2 jruoho UINT32 Length)
210 1.1.1.2.8.2 jruoho {
211 1.1.1.2.8.2 jruoho
212 1.1.1.2.8.2 jruoho /* Write the raw data to the AML file */
213 1.1.1.2.8.2 jruoho
214 1.1.1.2.8.2 jruoho FlWriteFile (ASL_FILE_AML_OUTPUT, Buffer, Length);
215 1.1.1.2.8.2 jruoho
216 1.1.1.2.8.2 jruoho /* Update the final AML length for this node (used for listings) */
217 1.1.1.2.8.2 jruoho
218 1.1.1.2.8.2 jruoho if (Op)
219 1.1.1.2.8.2 jruoho {
220 1.1.1.2.8.2 jruoho Op->Asl.FinalAmlLength += Length;
221 1.1.1.2.8.2 jruoho }
222 1.1.1.2.8.2 jruoho }
223 1.1.1.2.8.2 jruoho
224 1.1.1.2.8.2 jruoho
225 1.1.1.2.8.2 jruoho /*******************************************************************************
226 1.1.1.2.8.2 jruoho *
227 1.1.1.2.8.2 jruoho * FUNCTION: CgWriteAmlOpcode
228 1.1.1.2.8.2 jruoho *
229 1.1.1.2.8.2 jruoho * PARAMETERS: Op - Parse node with an AML opcode
230 1.1.1.2.8.2 jruoho *
231 1.1.1.2.8.2 jruoho * RETURN: None.
232 1.1.1.2.8.2 jruoho *
233 1.1.1.2.8.2 jruoho * DESCRIPTION: Write the AML opcode corresponding to a parse node.
234 1.1.1.2.8.2 jruoho *
235 1.1.1.2.8.2 jruoho ******************************************************************************/
236 1.1.1.2.8.2 jruoho
237 1.1.1.2.8.2 jruoho static void
238 1.1.1.2.8.2 jruoho CgWriteAmlOpcode (
239 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op)
240 1.1.1.2.8.2 jruoho {
241 1.1.1.2.8.2 jruoho UINT8 PkgLenFirstByte;
242 1.1.1.2.8.2 jruoho UINT32 i;
243 1.1.1.2.8.2 jruoho union {
244 1.1.1.2.8.2 jruoho UINT16 Opcode;
245 1.1.1.2.8.2 jruoho UINT8 OpcodeBytes[2];
246 1.1.1.2.8.2 jruoho } Aml;
247 1.1.1.2.8.2 jruoho union {
248 1.1.1.2.8.2 jruoho UINT32 Len;
249 1.1.1.2.8.2 jruoho UINT8 LenBytes[4];
250 1.1.1.2.8.2 jruoho } PkgLen;
251 1.1.1.2.8.2 jruoho
252 1.1.1.2.8.2 jruoho
253 1.1.1.2.8.2 jruoho /* We expect some DEFAULT_ARGs, just ignore them */
254 1.1.1.2.8.2 jruoho
255 1.1.1.2.8.2 jruoho if (Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
256 1.1.1.2.8.2 jruoho {
257 1.1.1.2.8.2 jruoho return;
258 1.1.1.2.8.2 jruoho }
259 1.1.1.2.8.2 jruoho
260 1.1.1.2.8.2 jruoho switch (Op->Asl.AmlOpcode)
261 1.1.1.2.8.2 jruoho {
262 1.1.1.2.8.2 jruoho case AML_UNASSIGNED_OPCODE:
263 1.1.1.2.8.2 jruoho
264 1.1.1.2.8.2 jruoho /* These opcodes should not get here */
265 1.1.1.2.8.2 jruoho
266 1.1.1.2.8.2 jruoho printf ("Found a node with an unassigned AML opcode\n");
267 1.1.1.2.8.2 jruoho fprintf (stderr, "Found a node with an unassigned AML opcode\n");
268 1.1.1.2.8.2 jruoho return;
269 1.1.1.2.8.2 jruoho
270 1.1.1.2.8.2 jruoho case AML_INT_RESERVEDFIELD_OP:
271 1.1.1.2.8.2 jruoho
272 1.1.1.2.8.2 jruoho /* Special opcodes for within a field definition */
273 1.1.1.2.8.2 jruoho
274 1.1.1.2.8.2 jruoho Aml.Opcode = 0x00;
275 1.1.1.2.8.2 jruoho break;
276 1.1.1.2.8.2 jruoho
277 1.1.1.2.8.2 jruoho case AML_INT_ACCESSFIELD_OP:
278 1.1.1.2.8.2 jruoho
279 1.1.1.2.8.2 jruoho Aml.Opcode = 0x01;
280 1.1.1.2.8.2 jruoho break;
281 1.1.1.2.8.2 jruoho
282 1.1.1.2.8.2 jruoho default:
283 1.1.1.2.8.2 jruoho Aml.Opcode = Op->Asl.AmlOpcode;
284 1.1.1.2.8.2 jruoho break;
285 1.1.1.2.8.2 jruoho }
286 1.1.1.2.8.2 jruoho
287 1.1.1.2.8.2 jruoho
288 1.1.1.2.8.2 jruoho switch (Aml.Opcode)
289 1.1.1.2.8.2 jruoho {
290 1.1.1.2.8.2 jruoho case AML_PACKAGE_LENGTH:
291 1.1.1.2.8.2 jruoho
292 1.1.1.2.8.2 jruoho /* Value is the length to be encoded (Used in field definitions) */
293 1.1.1.2.8.2 jruoho
294 1.1.1.2.8.2 jruoho PkgLen.Len = (UINT32) Op->Asl.Value.Integer;
295 1.1.1.2.8.2 jruoho break;
296 1.1.1.2.8.2 jruoho
297 1.1.1.2.8.2 jruoho default:
298 1.1.1.2.8.2 jruoho
299 1.1.1.2.8.2 jruoho /* Check for two-byte opcode */
300 1.1.1.2.8.2 jruoho
301 1.1.1.2.8.2 jruoho if (Aml.Opcode > 0x00FF)
302 1.1.1.2.8.2 jruoho {
303 1.1.1.2.8.2 jruoho /* Write the high byte first */
304 1.1.1.2.8.2 jruoho
305 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[1], 1);
306 1.1.1.2.8.2 jruoho }
307 1.1.1.2.8.2 jruoho
308 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[0], 1);
309 1.1.1.2.8.2 jruoho
310 1.1.1.2.8.2 jruoho /* Subtreelength doesn't include length of package length bytes */
311 1.1.1.2.8.2 jruoho
312 1.1.1.2.8.2 jruoho PkgLen.Len = Op->Asl.AmlSubtreeLength + Op->Asl.AmlPkgLenBytes;
313 1.1.1.2.8.2 jruoho break;
314 1.1.1.2.8.2 jruoho }
315 1.1.1.2.8.2 jruoho
316 1.1.1.2.8.2 jruoho /* Does this opcode have an associated "PackageLength" field? */
317 1.1.1.2.8.2 jruoho
318 1.1.1.2.8.2 jruoho if (Op->Asl.CompileFlags & NODE_AML_PACKAGE)
319 1.1.1.2.8.2 jruoho {
320 1.1.1.2.8.2 jruoho if (Op->Asl.AmlPkgLenBytes == 1)
321 1.1.1.2.8.2 jruoho {
322 1.1.1.2.8.2 jruoho /* Simplest case -- no bytes to follow, just write the count */
323 1.1.1.2.8.2 jruoho
324 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &PkgLen.LenBytes[0], 1);
325 1.1.1.2.8.2 jruoho }
326 1.1.1.2.8.2 jruoho else if (Op->Asl.AmlPkgLenBytes != 0)
327 1.1.1.2.8.2 jruoho {
328 1.1.1.2.8.2 jruoho /*
329 1.1.1.2.8.2 jruoho * Encode the "bytes to follow" in the first byte, top two bits.
330 1.1.1.2.8.2 jruoho * The low-order nybble of the length is in the bottom 4 bits
331 1.1.1.2.8.2 jruoho */
332 1.1.1.2.8.2 jruoho PkgLenFirstByte = (UINT8)
333 1.1.1.2.8.2 jruoho (((UINT32) (Op->Asl.AmlPkgLenBytes - 1) << 6) |
334 1.1.1.2.8.2 jruoho (PkgLen.LenBytes[0] & 0x0F));
335 1.1.1.2.8.2 jruoho
336 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &PkgLenFirstByte, 1);
337 1.1.1.2.8.2 jruoho
338 1.1.1.2.8.2 jruoho /*
339 1.1.1.2.8.2 jruoho * Shift the length over by the 4 bits we just stuffed
340 1.1.1.2.8.2 jruoho * in the first byte
341 1.1.1.2.8.2 jruoho */
342 1.1.1.2.8.2 jruoho PkgLen.Len >>= 4;
343 1.1.1.2.8.2 jruoho
344 1.1.1.2.8.2 jruoho /* Now we can write the remaining bytes - either 1, 2, or 3 bytes */
345 1.1.1.2.8.2 jruoho
346 1.1.1.2.8.2 jruoho for (i = 0; i < (UINT32) (Op->Asl.AmlPkgLenBytes - 1); i++)
347 1.1.1.2.8.2 jruoho {
348 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &PkgLen.LenBytes[i], 1);
349 1.1.1.2.8.2 jruoho }
350 1.1.1.2.8.2 jruoho }
351 1.1.1.2.8.2 jruoho }
352 1.1.1.2.8.2 jruoho
353 1.1.1.2.8.2 jruoho switch (Aml.Opcode)
354 1.1.1.2.8.2 jruoho {
355 1.1.1.2.8.2 jruoho case AML_BYTE_OP:
356 1.1.1.2.8.2 jruoho
357 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 1);
358 1.1.1.2.8.2 jruoho break;
359 1.1.1.2.8.2 jruoho
360 1.1.1.2.8.2 jruoho case AML_WORD_OP:
361 1.1.1.2.8.2 jruoho
362 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 2);
363 1.1.1.2.8.2 jruoho break;
364 1.1.1.2.8.2 jruoho
365 1.1.1.2.8.2 jruoho case AML_DWORD_OP:
366 1.1.1.2.8.2 jruoho
367 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 4);
368 1.1.1.2.8.2 jruoho break;
369 1.1.1.2.8.2 jruoho
370 1.1.1.2.8.2 jruoho case AML_QWORD_OP:
371 1.1.1.2.8.2 jruoho
372 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 8);
373 1.1.1.2.8.2 jruoho break;
374 1.1.1.2.8.2 jruoho
375 1.1.1.2.8.2 jruoho case AML_STRING_OP:
376 1.1.1.2.8.2 jruoho
377 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, Op->Asl.Value.String, Op->Asl.AmlLength);
378 1.1.1.2.8.2 jruoho break;
379 1.1.1.2.8.2 jruoho
380 1.1.1.2.8.2 jruoho default:
381 1.1.1.2.8.2 jruoho /* All data opcodes must appear above */
382 1.1.1.2.8.2 jruoho break;
383 1.1.1.2.8.2 jruoho }
384 1.1.1.2.8.2 jruoho }
385 1.1.1.2.8.2 jruoho
386 1.1.1.2.8.2 jruoho
387 1.1.1.2.8.2 jruoho /*******************************************************************************
388 1.1.1.2.8.2 jruoho *
389 1.1.1.2.8.2 jruoho * FUNCTION: CgWriteTableHeader
390 1.1.1.2.8.2 jruoho *
391 1.1.1.2.8.2 jruoho * PARAMETERS: Op - The DEFINITIONBLOCK node
392 1.1.1.2.8.2 jruoho *
393 1.1.1.2.8.2 jruoho * RETURN: None
394 1.1.1.2.8.2 jruoho *
395 1.1.1.2.8.2 jruoho * DESCRIPTION: Write a table header corresponding to the DEFINITIONBLOCK
396 1.1.1.2.8.2 jruoho *
397 1.1.1.2.8.2 jruoho ******************************************************************************/
398 1.1.1.2.8.2 jruoho
399 1.1.1.2.8.2 jruoho static void
400 1.1.1.2.8.2 jruoho CgWriteTableHeader (
401 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op)
402 1.1.1.2.8.2 jruoho {
403 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Child;
404 1.1.1.2.8.2 jruoho
405 1.1.1.2.8.2 jruoho
406 1.1.1.2.8.2 jruoho /* AML filename */
407 1.1.1.2.8.2 jruoho
408 1.1.1.2.8.2 jruoho Child = Op->Asl.Child;
409 1.1.1.2.8.2 jruoho
410 1.1.1.2.8.2 jruoho /* Signature */
411 1.1.1.2.8.2 jruoho
412 1.1.1.2.8.2 jruoho Child = Child->Asl.Next;
413 1.1.1.2.8.2 jruoho strncpy (TableHeader.Signature, Child->Asl.Value.String, 4);
414 1.1.1.2.8.2 jruoho
415 1.1.1.2.8.2 jruoho /* Revision */
416 1.1.1.2.8.2 jruoho
417 1.1.1.2.8.2 jruoho Child = Child->Asl.Next;
418 1.1.1.2.8.2 jruoho TableHeader.Revision = (UINT8) Child->Asl.Value.Integer;
419 1.1.1.2.8.2 jruoho
420 1.1.1.2.8.2 jruoho /* Command-line Revision override */
421 1.1.1.2.8.2 jruoho
422 1.1.1.2.8.2 jruoho if (Gbl_RevisionOverride)
423 1.1.1.2.8.2 jruoho {
424 1.1.1.2.8.2 jruoho TableHeader.Revision = Gbl_RevisionOverride;
425 1.1.1.2.8.2 jruoho }
426 1.1.1.2.8.2 jruoho
427 1.1.1.2.8.2 jruoho /* OEMID */
428 1.1.1.2.8.2 jruoho
429 1.1.1.2.8.2 jruoho Child = Child->Asl.Next;
430 1.1.1.2.8.2 jruoho strncpy (TableHeader.OemId, Child->Asl.Value.String, 6);
431 1.1.1.2.8.2 jruoho
432 1.1.1.2.8.2 jruoho /* OEM TableID */
433 1.1.1.2.8.2 jruoho
434 1.1.1.2.8.2 jruoho Child = Child->Asl.Next;
435 1.1.1.2.8.2 jruoho strncpy (TableHeader.OemTableId, Child->Asl.Value.String, 8);
436 1.1.1.2.8.2 jruoho
437 1.1.1.2.8.2 jruoho /* OEM Revision */
438 1.1.1.2.8.2 jruoho
439 1.1.1.2.8.2 jruoho Child = Child->Asl.Next;
440 1.1.1.2.8.2 jruoho TableHeader.OemRevision = (UINT32) Child->Asl.Value.Integer;
441 1.1.1.2.8.2 jruoho
442 1.1.1.2.8.2 jruoho /* Compiler ID */
443 1.1.1.2.8.2 jruoho
444 1.1.1.2.8.2 jruoho strncpy (TableHeader.AslCompilerId, ASL_CREATOR_ID, 4);
445 1.1.1.2.8.2 jruoho
446 1.1.1.2.8.2 jruoho /* Compiler version */
447 1.1.1.2.8.2 jruoho
448 1.1.1.2.8.2 jruoho TableHeader.AslCompilerRevision = ASL_REVISION;
449 1.1.1.2.8.2 jruoho
450 1.1.1.2.8.2 jruoho /* Table length. Checksum zero for now, will rewrite later */
451 1.1.1.2.8.2 jruoho
452 1.1.1.2.8.2 jruoho TableHeader.Length = Gbl_TableLength;
453 1.1.1.2.8.2 jruoho TableHeader.Checksum = 0;
454 1.1.1.2.8.2 jruoho
455 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &TableHeader, sizeof (ACPI_TABLE_HEADER));
456 1.1.1.2.8.2 jruoho }
457 1.1.1.2.8.2 jruoho
458 1.1.1.2.8.2 jruoho
459 1.1.1.2.8.2 jruoho /*******************************************************************************
460 1.1.1.2.8.2 jruoho *
461 1.1.1.2.8.2 jruoho * FUNCTION: CgCloseTable
462 1.1.1.2.8.2 jruoho *
463 1.1.1.2.8.2 jruoho * PARAMETERS: None.
464 1.1.1.2.8.2 jruoho *
465 1.1.1.2.8.2 jruoho * RETURN: None.
466 1.1.1.2.8.2 jruoho *
467 1.1.1.2.8.2 jruoho * DESCRIPTION: Complete the ACPI table by calculating the checksum and
468 1.1.1.2.8.2 jruoho * re-writing the header.
469 1.1.1.2.8.2 jruoho *
470 1.1.1.2.8.2 jruoho ******************************************************************************/
471 1.1.1.2.8.2 jruoho
472 1.1.1.2.8.2 jruoho static void
473 1.1.1.2.8.2 jruoho CgCloseTable (
474 1.1.1.2.8.2 jruoho void)
475 1.1.1.2.8.2 jruoho {
476 1.1.1.2.8.2 jruoho signed char Sum;
477 1.1.1.2.8.2 jruoho UINT8 FileByte;
478 1.1.1.2.8.2 jruoho
479 1.1.1.2.8.2 jruoho
480 1.1.1.2.8.2 jruoho FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
481 1.1.1.2.8.2 jruoho Sum = 0;
482 1.1.1.2.8.2 jruoho
483 1.1.1.2.8.2 jruoho /* Calculate the checksum over the entire file */
484 1.1.1.2.8.2 jruoho
485 1.1.1.2.8.2 jruoho while (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1) == AE_OK)
486 1.1.1.2.8.2 jruoho {
487 1.1.1.2.8.2 jruoho Sum = (signed char) (Sum + FileByte);
488 1.1.1.2.8.2 jruoho }
489 1.1.1.2.8.2 jruoho
490 1.1.1.2.8.2 jruoho /* Re-write the table header with the checksum */
491 1.1.1.2.8.2 jruoho
492 1.1.1.2.8.2 jruoho TableHeader.Checksum = (UINT8) (0 - Sum);
493 1.1.1.2.8.2 jruoho
494 1.1.1.2.8.2 jruoho FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
495 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (NULL, &TableHeader, sizeof (ACPI_TABLE_HEADER));
496 1.1.1.2.8.2 jruoho }
497 1.1.1.2.8.2 jruoho
498 1.1.1.2.8.2 jruoho
499 1.1.1.2.8.2 jruoho /*******************************************************************************
500 1.1.1.2.8.2 jruoho *
501 1.1.1.2.8.2 jruoho * FUNCTION: CgWriteNode
502 1.1.1.2.8.2 jruoho *
503 1.1.1.2.8.2 jruoho * PARAMETERS: Op - Parse node to write.
504 1.1.1.2.8.2 jruoho *
505 1.1.1.2.8.2 jruoho * RETURN: None.
506 1.1.1.2.8.2 jruoho *
507 1.1.1.2.8.2 jruoho * DESCRIPTION: Write the AML that corresponds to a parse node.
508 1.1.1.2.8.2 jruoho *
509 1.1.1.2.8.2 jruoho ******************************************************************************/
510 1.1.1.2.8.2 jruoho
511 1.1.1.2.8.2 jruoho static void
512 1.1.1.2.8.2 jruoho CgWriteNode (
513 1.1.1.2.8.2 jruoho ACPI_PARSE_OBJECT *Op)
514 1.1.1.2.8.2 jruoho {
515 1.1.1.2.8.2 jruoho ASL_RESOURCE_NODE *Rnode;
516 1.1.1.2.8.2 jruoho
517 1.1.1.2.8.2 jruoho
518 1.1.1.2.8.2 jruoho /* Always check for DEFAULT_ARG and other "Noop" nodes */
519 1.1.1.2.8.2 jruoho /* TBD: this may not be the best place for this check */
520 1.1.1.2.8.2 jruoho
521 1.1.1.2.8.2 jruoho if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) ||
522 1.1.1.2.8.2 jruoho (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) ||
523 1.1.1.2.8.2 jruoho (Op->Asl.ParseOpcode == PARSEOP_INCLUDE) ||
524 1.1.1.2.8.2 jruoho (Op->Asl.ParseOpcode == PARSEOP_INCLUDE_END))
525 1.1.1.2.8.2 jruoho {
526 1.1.1.2.8.2 jruoho return;
527 1.1.1.2.8.2 jruoho }
528 1.1.1.2.8.2 jruoho
529 1.1.1.2.8.2 jruoho Op->Asl.FinalAmlLength = 0;
530 1.1.1.2.8.2 jruoho
531 1.1.1.2.8.2 jruoho switch (Op->Asl.AmlOpcode)
532 1.1.1.2.8.2 jruoho {
533 1.1.1.2.8.2 jruoho case AML_RAW_DATA_BYTE:
534 1.1.1.2.8.2 jruoho case AML_RAW_DATA_WORD:
535 1.1.1.2.8.2 jruoho case AML_RAW_DATA_DWORD:
536 1.1.1.2.8.2 jruoho case AML_RAW_DATA_QWORD:
537 1.1.1.2.8.2 jruoho
538 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, Op->Asl.AmlLength);
539 1.1.1.2.8.2 jruoho return;
540 1.1.1.2.8.2 jruoho
541 1.1.1.2.8.2 jruoho
542 1.1.1.2.8.2 jruoho case AML_RAW_DATA_BUFFER:
543 1.1.1.2.8.2 jruoho
544 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, Op->Asl.Value.Buffer, Op->Asl.AmlLength);
545 1.1.1.2.8.2 jruoho return;
546 1.1.1.2.8.2 jruoho
547 1.1.1.2.8.2 jruoho
548 1.1.1.2.8.2 jruoho case AML_RAW_DATA_CHAIN:
549 1.1.1.2.8.2 jruoho
550 1.1.1.2.8.2 jruoho Rnode = ACPI_CAST_PTR (ASL_RESOURCE_NODE, Op->Asl.Value.Buffer);
551 1.1.1.2.8.2 jruoho while (Rnode)
552 1.1.1.2.8.2 jruoho {
553 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, Rnode->Buffer, Rnode->BufferLength);
554 1.1.1.2.8.2 jruoho Rnode = Rnode->Next;
555 1.1.1.2.8.2 jruoho }
556 1.1.1.2.8.2 jruoho return;
557 1.1.1.2.8.2 jruoho
558 1.1.1.2.8.2 jruoho default:
559 1.1.1.2.8.2 jruoho /* Internal data opcodes must all appear above */
560 1.1.1.2.8.2 jruoho break;
561 1.1.1.2.8.2 jruoho }
562 1.1.1.2.8.2 jruoho
563 1.1.1.2.8.2 jruoho switch (Op->Asl.ParseOpcode)
564 1.1.1.2.8.2 jruoho {
565 1.1.1.2.8.2 jruoho case PARSEOP_DEFAULT_ARG:
566 1.1.1.2.8.2 jruoho
567 1.1.1.2.8.2 jruoho break;
568 1.1.1.2.8.2 jruoho
569 1.1.1.2.8.2 jruoho case PARSEOP_DEFINITIONBLOCK:
570 1.1.1.2.8.2 jruoho
571 1.1.1.2.8.2 jruoho CgWriteTableHeader (Op);
572 1.1.1.2.8.2 jruoho break;
573 1.1.1.2.8.2 jruoho
574 1.1.1.2.8.2 jruoho case PARSEOP_NAMESEG:
575 1.1.1.2.8.2 jruoho case PARSEOP_NAMESTRING:
576 1.1.1.2.8.2 jruoho case PARSEOP_METHODCALL:
577 1.1.1.2.8.2 jruoho
578 1.1.1.2.8.2 jruoho CgLocalWriteAmlData (Op, Op->Asl.Value.String, Op->Asl.AmlLength);
579 1.1.1.2.8.2 jruoho break;
580 1.1.1.2.8.2 jruoho
581 1.1.1.2.8.2 jruoho default:
582 1.1.1.2.8.2 jruoho
583 1.1.1.2.8.2 jruoho CgWriteAmlOpcode (Op);
584 1.1.1.2.8.2 jruoho break;
585 1.1.1.2.8.2 jruoho }
586 1.1.1.2.8.2 jruoho }
587 1.1.1.2.8.2 jruoho
588 1.1.1.2.8.2 jruoho
589