Root/
Source at commit 2381 created 10 years 21 days ago. By ifabio, Apply patch: (Credits to Thomas Jansen aka tja) - Reading options from all devices during boot. The options for the boot menu are only read from the devices rd(0,0) or bt(0,0). Consequently, boot menu options (e.g. "Quiet Boot", "Timeout", etc.) in plists on other devices (like most users have) are ignored. This patch extends the list of paths to search for the options plist on all devices that can be found. | |
---|---|
1 | /*␊ |
2 | * aml_generator.c␊ |
3 | * Chameleon␊ |
4 | *␊ |
5 | * Created by Mozodojo on 20/07/10.␊ |
6 | * Copyright 2010 mozo. All rights reserved.␊ |
7 | *␊ |
8 | */␊ |
9 | ␊ |
10 | #include "aml_generator.h"␊ |
11 | ␊ |
12 | bool aml_add_to_parent(struct aml_chunk* parent, struct aml_chunk* node)␊ |
13 | {␊ |
14 | ␉if (parent && node)␊ |
15 | ␉{␊ |
16 | ␉␉switch (parent->Type) ␊ |
17 | ␉␉{␊ |
18 | ␉␉␉case AML_CHUNK_NONE:␊ |
19 | ␉␉␉case AML_CHUNK_BYTE:␊ |
20 | ␉␉␉case AML_CHUNK_WORD:␊ |
21 | ␉␉␉case AML_CHUNK_DWORD:␊ |
22 | ␉␉␉case AML_CHUNK_QWORD:␊ |
23 | ␉␉␉case AML_CHUNK_ALIAS:␊ |
24 | ␉␉␉␉verbose("aml_add_to_parent: node doesn't support child nodes!\n");␊ |
25 | ␉␉␉␉return false;␊ |
26 | ␉␉␉case AML_CHUNK_NAME:␊ |
27 | ␉␉␉␉if (parent->First) ␊ |
28 | ␉␉␉␉{␊ |
29 | ␉␉␉␉␉verbose("aml_add_to_parent: name node supports only one child node!\n");␊ |
30 | ␉␉␉␉␉return false;␊ |
31 | ␉␉␉␉}␊ |
32 | ␉␉␉␉break;␊ |
33 | ␊ |
34 | ␉␉␉default:␊ |
35 | ␉␉␉␉break;␊ |
36 | ␉␉}␊ |
37 | ␉␉␊ |
38 | ␉␉if (!parent->First)␊ |
39 | ␉␉␉parent->First = node;␊ |
40 | ␉␉␊ |
41 | ␉␉if (parent->Last)␊ |
42 | ␉␉␉parent->Last->Next = node;␊ |
43 | ␉␉␊ |
44 | ␉␉parent->Last = node;␊ |
45 | ␉␉␊ |
46 | ␉␉return true;␊ |
47 | ␉}␊ |
48 | ␉␊ |
49 | ␉return false;␊ |
50 | }␊ |
51 | ␊ |
52 | struct aml_chunk* aml_create_node(struct aml_chunk* parent)␊ |
53 | {␊ |
54 | ␉struct aml_chunk* node = (struct aml_chunk*)malloc(sizeof(struct aml_chunk));␊ |
55 | ␉␊ |
56 | ␉aml_add_to_parent(parent, node);␊ |
57 | ␉␊ |
58 | ␉return node;␊ |
59 | }␊ |
60 | ␊ |
61 | void aml_destroy_node(struct aml_chunk* node)␊ |
62 | {␊ |
63 | ␉// Delete child nodes␊ |
64 | ␉struct aml_chunk* child = node->First;␊ |
65 | ␉␊ |
66 | ␉while (child) ␊ |
67 | ␉{␊ |
68 | ␉␉struct aml_chunk* next = child->Next;␊ |
69 | ␉␉␊ |
70 | ␉␉if (child->Buffer)␊ |
71 | ␉␉␉free(child->Buffer);␊ |
72 | ␉␉␊ |
73 | ␉␉free(child);␊ |
74 | ␉␉␊ |
75 | ␉␉child = next;␊ |
76 | ␉}␊ |
77 | ␉␊ |
78 | ␉// Free node␊ |
79 | ␉if (node->Buffer)␊ |
80 | ␉␉free(node->Buffer);␊ |
81 | ␉␊ |
82 | ␉free(node);␊ |
83 | }␊ |
84 | ␊ |
85 | struct aml_chunk* aml_add_buffer(struct aml_chunk* parent, const char* buffer, unsigned int size)␊ |
86 | {␊ |
87 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
88 | ␉␊ |
89 | ␉if (node) ␊ |
90 | ␉{␊ |
91 | ␉␉node->Type = AML_CHUNK_NONE;␊ |
92 | ␉␉node->Length = size;␊ |
93 | ␉␉node->Buffer = malloc(node->Length);␊ |
94 | ␉␉memcpy(node->Buffer, buffer, node->Length);␊ |
95 | ␉}␊ |
96 | ␉␊ |
97 | ␉return node;␊ |
98 | }␊ |
99 | ␊ |
100 | struct aml_chunk* aml_add_byte(struct aml_chunk* parent, unsigned char value)␊ |
101 | {␊ |
102 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
103 | ␉␊ |
104 | ␉if (node) ␊ |
105 | ␉{␊ |
106 | ␉␉node->Type = AML_CHUNK_BYTE;␊ |
107 | ␉␉␊ |
108 | ␉␉node->Length = 1;␊ |
109 | ␉␉node->Buffer = malloc(node->Length);␊ |
110 | ␉␉node->Buffer[0] = value;␊ |
111 | ␉}␊ |
112 | ␉␊ |
113 | ␉return node;␊ |
114 | }␊ |
115 | ␊ |
116 | struct aml_chunk* aml_add_word(struct aml_chunk* parent, unsigned int value)␊ |
117 | {␊ |
118 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
119 | ␉␊ |
120 | ␉if (node) ␊ |
121 | ␉{␊ |
122 | ␉␉node->Type = AML_CHUNK_WORD;␊ |
123 | ␉␉node->Length = 2;␊ |
124 | ␉␉node->Buffer = malloc(node->Length);␊ |
125 | ␉␉node->Buffer[0] = value & 0xff;␊ |
126 | ␉␉node->Buffer[1] = value >> 8;␊ |
127 | ␉}␊ |
128 | ␉␊ |
129 | ␉return node;␊ |
130 | }␊ |
131 | ␊ |
132 | struct aml_chunk* aml_add_dword(struct aml_chunk* parent, unsigned long value)␊ |
133 | {␊ |
134 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
135 | ␉␊ |
136 | ␉if (node) ␊ |
137 | ␉{␊ |
138 | ␉␉node->Type = AML_CHUNK_DWORD;␊ |
139 | ␉␉node->Length = 4;␊ |
140 | ␉␉node->Buffer = malloc(node->Length);␊ |
141 | ␉␉node->Buffer[0] = value & 0xff;␊ |
142 | ␉␉node->Buffer[1] = (value >> 8) & 0xff;␊ |
143 | ␉␉node->Buffer[2] = (value >> 16) & 0xff;␊ |
144 | ␉␉node->Buffer[3] = (value >> 24) & 0xff;␊ |
145 | ␉}␊ |
146 | ␉␊ |
147 | ␉return node;␊ |
148 | }␊ |
149 | ␊ |
150 | struct aml_chunk* aml_add_qword(struct aml_chunk* parent, unsigned long long value)␊ |
151 | {␊ |
152 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
153 | ␉␊ |
154 | ␉if (node) ␊ |
155 | ␉{␊ |
156 | ␉␉node->Type = AML_CHUNK_QWORD;␊ |
157 | ␉␉node->Length = 8;␊ |
158 | ␉␉node->Buffer = malloc(node->Length);␊ |
159 | ␉␉node->Buffer[0] = value & 0xff;␊ |
160 | ␉␉node->Buffer[1] = (value >> 8) & 0xff;␊ |
161 | ␉␉node->Buffer[2] = (value >> 16) & 0xff;␊ |
162 | ␉␉node->Buffer[3] = (value >> 24) & 0xff;␊ |
163 | ␉␉node->Buffer[4] = (value >> 32) & 0xff;␊ |
164 | ␉␉node->Buffer[5] = (value >> 40) & 0xff;␊ |
165 | ␉␉node->Buffer[6] = (value >> 48) & 0xff;␊ |
166 | ␉␉node->Buffer[7] = (value >> 56) & 0xff;␊ |
167 | ␉}␊ |
168 | ␉␊ |
169 | ␉return node;␊ |
170 | }␊ |
171 | ␊ |
172 | unsigned int aml_fill_simple_name(char* buffer, const char* name)␊ |
173 | {␊ |
174 | ␉if (strlen(name) < 4) ␊ |
175 | ␉{␊ |
176 | ␉␉verbose("aml_fill_simple_name: simple name %s has incorrect lengh! Must be 4.\n", name);␊ |
177 | ␉␉return 0;␊ |
178 | ␉}␊ |
179 | ␉␊ |
180 | ␉memcpy(buffer, name, 4);␊ |
181 | ␉return 4;␊ |
182 | }␊ |
183 | ␊ |
184 | unsigned int aml_fill_name(struct aml_chunk* node, const char* name)␊ |
185 | {␊ |
186 | ␉if (!node) ␊ |
187 | ␉␉return 0;␊ |
188 | ␉␊ |
189 | ␉int len = strlen(name), offset = 0, count = len / 4;␊ |
190 | ␉␊ |
191 | ␉if ((len % 4) > 1 || count == 0) ␊ |
192 | ␉{␊ |
193 | ␉␉verbose("aml_fill_name: pathname %s has incorrect length! Must be 4, 8, 12, 16, etc...\n", name);␊ |
194 | ␉␉return 0;␊ |
195 | ␉}␊ |
196 | ␉␊ |
197 | ␉unsigned int root = 0;␊ |
198 | ␉␊ |
199 | ␉if ((len % 4) == 1 && name[0] == '\\')␊ |
200 | ␉␉root++;␊ |
201 | ␉␉␉␊ |
202 | ␉if (count == 1) ␊ |
203 | ␉{␊ |
204 | ␉␉node->Length = 4 + root;␊ |
205 | ␉␉node->Buffer = malloc(node->Length);␊ |
206 | ␉␉memcpy(node->Buffer, name, 4 + root);␊ |
207 | ␉␉return node->Length;␊ |
208 | ␉}␊ |
209 | ␉␊ |
210 | ␉if (count == 2) ␊ |
211 | ␉{␊ |
212 | ␉␉node->Length = 2 + 8;␊ |
213 | ␉␉node->Buffer = malloc(node->Length);␊ |
214 | ␉␉node->Buffer[offset++] = 0x5c; // Root Char␊ |
215 | ␉␉node->Buffer[offset++] = 0x2e; // Double name␊ |
216 | ␉␉memcpy(node->Buffer+offset, name + root, 8);␊ |
217 | ␉␉return node->Length;␊ |
218 | ␉}␊ |
219 | ␉␊ |
220 | ␉node->Length = 3 + count*4;␊ |
221 | ␉node->Buffer = malloc(node->Length);␊ |
222 | ␉node->Buffer[offset++] = 0x5c; // Root Char␊ |
223 | ␉node->Buffer[offset++] = 0x2f; // Multi name␊ |
224 | ␉node->Buffer[offset++] = count; // Names count␊ |
225 | ␉memcpy(node->Buffer+offset, name + root, count*4);␊ |
226 | ␉␊ |
227 | ␉return node->Length;␊ |
228 | }␊ |
229 | ␊ |
230 | struct aml_chunk* aml_add_scope(struct aml_chunk* parent, const char* name)␊ |
231 | {␊ |
232 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
233 | ␉␊ |
234 | ␉if (node)␊ |
235 | ␉{␊ |
236 | ␉␉node->Type = AML_CHUNK_SCOPE;␊ |
237 | ␉␉␊ |
238 | ␉␉aml_fill_name(node, name);␊ |
239 | ␉}␊ |
240 | ␉␊ |
241 | ␉return node;␊ |
242 | }␊ |
243 | ␊ |
244 | struct aml_chunk* aml_add_name(struct aml_chunk* parent, const char* name)␊ |
245 | {␊ |
246 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
247 | ␉␊ |
248 | ␉if (node)␊ |
249 | ␉{␊ |
250 | ␉␉node->Type = AML_CHUNK_NAME;␊ |
251 | ␉␉␊ |
252 | ␉␉aml_fill_name(node, name);␊ |
253 | ␉}␊ |
254 | ␉␊ |
255 | ␉return node;␊ |
256 | }␊ |
257 | ␊ |
258 | struct aml_chunk* aml_add_package(struct aml_chunk* parent)␊ |
259 | {␊ |
260 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
261 | ␉␊ |
262 | ␉if (node)␊ |
263 | ␉{␊ |
264 | ␉␉node->Type = AML_CHUNK_PACKAGE;␊ |
265 | ␉␉␊ |
266 | ␉␉node->Length = 1;␊ |
267 | ␉␉node->Buffer = malloc(node->Length);␊ |
268 | ␉}␊ |
269 | ␉␊ |
270 | ␉return node;␊ |
271 | }␊ |
272 | ␊ |
273 | struct aml_chunk* aml_add_alias(struct aml_chunk* parent, const char* name1, const char* name2)␊ |
274 | {␊ |
275 | ␉struct aml_chunk* node = aml_create_node(parent);␊ |
276 | ␉␊ |
277 | ␉if (node)␊ |
278 | ␉{␊ |
279 | ␉␉node->Type = AML_CHUNK_ALIAS;␊ |
280 | ␉␉␊ |
281 | ␉␉node->Length = 8;␊ |
282 | ␉␉node->Buffer = malloc(node->Length);␊ |
283 | ␉␉aml_fill_simple_name(node->Buffer, name1);␊ |
284 | ␉␉aml_fill_simple_name(node->Buffer+4, name2);␊ |
285 | ␉}␊ |
286 | ␉␊ |
287 | ␉return node;␊ |
288 | }␊ |
289 | ␊ |
290 | unsigned char aml_get_size_length(unsigned int size)␊ |
291 | {␊ |
292 | ␉if (size + 1 <= 0x3f)␊ |
293 | ␉␉return 1;␊ |
294 | ␉else if (size + 2 <= 0x3fff)␊ |
295 | ␉␉return 2;␊ |
296 | ␉else if (size + 3 <= 0x3fffff)␊ |
297 | ␉␉return 3;␊ |
298 | ␉␊ |
299 | ␉return 4;␊ |
300 | }␊ |
301 | ␊ |
302 | unsigned int aml_calculate_size(struct aml_chunk* node)␊ |
303 | {␊ |
304 | ␉if (node)␊ |
305 | ␉{␊ |
306 | ␉␉node->Size = 0;␊ |
307 | ␉␉␊ |
308 | ␉␉// Calculate child nodes size␊ |
309 | ␉␉struct aml_chunk* child = node->First;␊ |
310 | ␉␉unsigned char child_count = 0;␊ |
311 | ␉␉␊ |
312 | ␉␉while (child) ␊ |
313 | ␉␉{␊ |
314 | ␉␉␉child_count++;␊ |
315 | ␉␉␉␊ |
316 | ␉␉␉node->Size += aml_calculate_size(child);␊ |
317 | ␉␉␉␊ |
318 | ␉␉␉child = child->Next;␊ |
319 | ␉␉}␊ |
320 | ␉␉␊ |
321 | ␉␉switch (node->Type) ␊ |
322 | ␉␉{␊ |
323 | ␉␉␉case AML_CHUNK_NONE:␊ |
324 | ␉␉␉␉node->Size += node->Length;␊ |
325 | ␉␉␉␉break;␊ |
326 | ␉␉␉case AML_CHUNK_SCOPE:␊ |
327 | ␉␉␉␉node->Size += 1 + node->Length;␊ |
328 | ␉␉␉␉node->Size += aml_get_size_length(node->Size);␊ |
329 | ␉␉␉␉break;␊ |
330 | ␉␉␉case AML_CHUNK_PACKAGE:␊ |
331 | ␉␉␉␉node->Buffer[0] = child_count;␊ |
332 | ␉␉␉␉node->Size += 1 + node->Length;␊ |
333 | ␉␉␉␉node->Size += aml_get_size_length(node->Size);␊ |
334 | ␉␉␉␉break;␊ |
335 | ␉␉␉␉␊ |
336 | ␉␉␉case AML_CHUNK_BYTE:␊ |
337 | ␉␉␉␉if (node->Buffer[0] == 0x0 || node->Buffer[0] == 0x1) ␊ |
338 | ␉␉␉␉{␊ |
339 | ␉␉␉␉␉node->Size += node->Length;␊ |
340 | ␉␉␉␉}␊ |
341 | ␉␉␉␉else ␊ |
342 | ␉␉␉␉{␊ |
343 | ␉␉␉␉␉node->Size += 1 + node->Length;␊ |
344 | ␉␉␉␉}␊ |
345 | ␉␉␉␉␊ |
346 | ␉␉␉␉break;␊ |
347 | ␉␉␉␉␊ |
348 | ␉␉␉case AML_CHUNK_WORD:␊ |
349 | ␉␉␉case AML_CHUNK_DWORD:␊ |
350 | ␉␉␉case AML_CHUNK_QWORD:␊ |
351 | ␉␉␉case AML_CHUNK_ALIAS:␊ |
352 | ␉␉␉case AML_CHUNK_NAME:␊ |
353 | ␉␉␉␉node->Size += 1 + node->Length;␊ |
354 | ␉␉␉␉break;␊ |
355 | ␉␉}␊ |
356 | ␉␉␊ |
357 | ␉␉return node->Size;␊ |
358 | ␉}␊ |
359 | ␉␊ |
360 | ␉return 0;␊ |
361 | }␊ |
362 | ␊ |
363 | unsigned int aml_write_byte(unsigned char value, char* buffer, unsigned int offset)␊ |
364 | {␊ |
365 | ␉buffer[offset++] = value;␊ |
366 | ␉␊ |
367 | ␉return offset;␊ |
368 | }␊ |
369 | ␊ |
370 | unsigned int aml_write_word(unsigned int value, char* buffer, unsigned int offset)␊ |
371 | {␊ |
372 | ␉buffer[offset++] = value & 0xff;␊ |
373 | ␉buffer[offset++] = value >> 8;␊ |
374 | ␉␊ |
375 | ␉return offset;␊ |
376 | }␊ |
377 | ␊ |
378 | unsigned int aml_write_dword(unsigned long value, char* buffer, unsigned int offset)␊ |
379 | {␊ |
380 | ␉buffer[offset++] = value & 0xff;␊ |
381 | ␉buffer[offset++] = (value >> 8) & 0xff;␊ |
382 | ␉buffer[offset++] = (value >> 16) & 0xff;␊ |
383 | ␉buffer[offset++] = (value >> 24) & 0xff;␊ |
384 | ␉␊ |
385 | ␉return offset;␊ |
386 | }␊ |
387 | ␊ |
388 | unsigned int aml_write_qword(unsigned long long value, char* buffer, unsigned int offset)␊ |
389 | {␊ |
390 | ␉buffer[offset++] = value & 0xff;␊ |
391 | ␉buffer[offset++] = (value >> 8) & 0xff;␊ |
392 | ␉buffer[offset++] = (value >> 16) & 0xff;␊ |
393 | ␉buffer[offset++] = (value >> 24) & 0xff;␊ |
394 | ␉buffer[offset++] = (value >> 32) & 0xff;␊ |
395 | ␉buffer[offset++] = (value >> 40) & 0xff;␊ |
396 | ␉buffer[offset++] = (value >> 48) & 0xff;␊ |
397 | ␉buffer[offset++] = (value >> 56) & 0xff;␊ |
398 | ␉␊ |
399 | ␉return offset;␊ |
400 | }␊ |
401 | ␊ |
402 | unsigned int aml_write_buffer(const char* value, unsigned int size, char* buffer, unsigned int offset)␊ |
403 | {␊ |
404 | ␉if (size > 0)␊ |
405 | ␉{␊ |
406 | ␉␉memcpy(buffer + offset, value, size);␊ |
407 | ␉}␊ |
408 | ␉␊ |
409 | ␉return offset + size;␊ |
410 | }␊ |
411 | ␊ |
412 | unsigned int aml_write_size(unsigned int size, char* buffer, unsigned int offset)␊ |
413 | {␊ |
414 | ␉if (size <= 0x3f)␊ |
415 | ␉{␊ |
416 | ␉␉buffer[offset++] = size;␊ |
417 | ␉}␊ |
418 | ␉else if (size <= 0x3fff) ␊ |
419 | ␉{␊ |
420 | ␉␉buffer[offset++] = 0x40 | (size & 0xf);␊ |
421 | ␉␉buffer[offset++] = (size >> 4) & 0xff;␊ |
422 | ␉}␊ |
423 | ␉else if (size <= 0x3fffff) ␊ |
424 | ␉{␊ |
425 | ␉␉buffer[offset++] = 0x80 | (size & 0xf);␊ |
426 | ␉␉buffer[offset++] = (size >> 4) & 0xff;␊ |
427 | ␉␉buffer[offset++] = (size >> 12) & 0xff;␊ |
428 | ␉}␊ |
429 | else ␊ |
430 | ␉{␊ |
431 | ␉␉buffer[offset++] = 0xc0 | (size & 0xf);␊ |
432 | ␉␉buffer[offset++] = (size >> 4) & 0xff;␊ |
433 | ␉␉buffer[offset++] = (size >> 12) & 0xff;␊ |
434 | ␉␉buffer[offset++] = (size >> 20) & 0xff;␊ |
435 | ␉}␊ |
436 | ␉␊ |
437 | ␉return offset;␊ |
438 | }␊ |
439 | ␊ |
440 | unsigned int aml_write_node(struct aml_chunk* node, char* buffer, unsigned int offset)␊ |
441 | {␊ |
442 | ␉if (node && buffer) ␊ |
443 | ␉{␊ |
444 | ␉␉unsigned int old = offset;␊ |
445 | ␉␉␊ |
446 | ␉␉switch (node->Type) ␊ |
447 | ␉␉{␊ |
448 | ␉␉␉case AML_CHUNK_NONE:␊ |
449 | ␉␉␉␉offset = aml_write_buffer(node->Buffer, node->Length, buffer, offset);␊ |
450 | ␉␉␉␉break;␊ |
451 | ␊ |
452 | ␉␉␉case AML_CHUNK_SCOPE:␊ |
453 | ␉␉␉case AML_CHUNK_PACKAGE:␊ |
454 | ␉␉␉␉offset = aml_write_byte(node->Type, buffer, offset);␊ |
455 | ␉␉␉␉offset = aml_write_size(node->Size-1, buffer, offset);␊ |
456 | ␉␉␉␉offset = aml_write_buffer(node->Buffer, node->Length, buffer, offset);␊ |
457 | ␉␉␉␉break;␊ |
458 | ␉␉␉␉␊ |
459 | ␉␉␉case AML_CHUNK_BYTE:␊ |
460 | ␉␉␉␉if (node->Buffer[0] == 0x0 || node->Buffer[0] == 0x1) ␊ |
461 | ␉␉␉␉{␊ |
462 | ␉␉␉␉␉offset = aml_write_buffer(node->Buffer, node->Length, buffer, offset);␊ |
463 | ␉␉␉␉}␊ |
464 | ␉␉␉␉else ␊ |
465 | ␉␉␉␉{␊ |
466 | ␉␉␉␉␉offset = aml_write_byte(node->Type, buffer, offset);␊ |
467 | ␉␉␉␉␉offset = aml_write_buffer(node->Buffer, node->Length, buffer, offset);␊ |
468 | ␉␉␉␉}␊ |
469 | ␉␉␉␉break;␊ |
470 | ␉␉␉␉␊ |
471 | ␉␉␉case AML_CHUNK_WORD:␊ |
472 | ␉␉␉case AML_CHUNK_DWORD:␊ |
473 | ␉␉␉case AML_CHUNK_QWORD:␊ |
474 | ␉␉␉case AML_CHUNK_ALIAS:␊ |
475 | ␉␉␉case AML_CHUNK_NAME:␊ |
476 | ␉␉␉␉offset = aml_write_byte(node->Type, buffer, offset);␊ |
477 | ␉␉␉␉offset = aml_write_buffer(node->Buffer, node->Length, buffer, offset);␊ |
478 | ␉␉␉␉break;␊ |
479 | ␉␉␉␉␊ |
480 | ␉␉␉default:␊ |
481 | ␉␉␉␉break;␊ |
482 | ␉␉}␊ |
483 | ␊ |
484 | ␉␉struct aml_chunk* child = node->First;␊ |
485 | ␉␉␊ |
486 | ␉␉while (child) ␊ |
487 | ␉␉{␊ |
488 | ␉␉␉offset = aml_write_node(child, buffer, offset);␊ |
489 | ␉␉␉␊ |
490 | ␉␉␉child = child->Next;␊ |
491 | ␉␉}␊ |
492 | ␉␉␊ |
493 | ␉␉if (offset - old != node->Size) ␊ |
494 | ␉␉␉verbose("Node size incorrect: 0x%x\n", node->Type);␊ |
495 | ␉}␊ |
496 | ␉␊ |
497 | ␉return offset;␊ |
498 | }␊ |
499 |