aml-build.c (661875e948ece4723ebe4e7628060c27cad06df1) aml-build.c (0f2707e4e733614f2cd566e7210c1cff6f3b5b42)
1/* Support for generating ACPI tables and passing them to Guests
2 *
3 * Copyright (C) 2015 Red Hat Inc
4 *
5 * Author: Michael S. Tsirkin <mst@redhat.com>
6 * Author: Igor Mammedov <imammedo@redhat.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 11 unchanged lines hidden (view full) ---

20 */
21
22#include <stdio.h>
23#include <stdarg.h>
24#include <assert.h>
25#include <stdbool.h>
26#include <string.h>
27#include "hw/acpi/aml-build.h"
1/* Support for generating ACPI tables and passing them to Guests
2 *
3 * Copyright (C) 2015 Red Hat Inc
4 *
5 * Author: Michael S. Tsirkin <mst@redhat.com>
6 * Author: Igor Mammedov <imammedo@redhat.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 11 unchanged lines hidden (view full) ---

20 */
21
22#include <stdio.h>
23#include <stdarg.h>
24#include <assert.h>
25#include <stdbool.h>
26#include <string.h>
27#include "hw/acpi/aml-build.h"
28#include "qemu/bswap.h"
28
29GArray *build_alloc_array(void)
30{
31 return g_array_new(false, true /* clear */, 1);
32}
33
34void build_free_array(GArray *array)
35{

--- 216 unchanged lines hidden (view full) ---

252 } else if (value <= 0xFF) {
253 build_append_value(table, value, 1);
254 } else if (value <= 0xFFFF) {
255 build_append_value(table, value, 2);
256 } else {
257 build_append_value(table, value, 4);
258 }
259}
29
30GArray *build_alloc_array(void)
31{
32 return g_array_new(false, true /* clear */, 1);
33}
34
35void build_free_array(GArray *array)
36{

--- 216 unchanged lines hidden (view full) ---

253 } else if (value <= 0xFF) {
254 build_append_value(table, value, 1);
255 } else if (value <= 0xFFFF) {
256 build_append_value(table, value, 2);
257 } else {
258 build_append_value(table, value, 4);
259 }
260}
261
262static GPtrArray *alloc_list;
263
264static Aml *aml_alloc(void)
265{
266 Aml *var = g_new0(typeof(*var), 1);
267
268 g_ptr_array_add(alloc_list, var);
269 var->block_flags = AML_NO_OPCODE;
270 var->buf = build_alloc_array();
271 return var;
272}
273
274static void aml_free(gpointer data)
275{
276 Aml *var = data;
277 build_free_array(var->buf);
278}
279
280Aml *init_aml_allocator(void)
281{
282 Aml *var;
283
284 assert(!alloc_list);
285 alloc_list = g_ptr_array_new_with_free_func(aml_free);
286 var = aml_alloc();
287 return var;
288}
289
290void free_aml_allocator(void)
291{
292 g_ptr_array_free(alloc_list, true);
293 alloc_list = 0;
294}
295
296/* pack data with DefBuffer encoding */
297static void build_buffer(GArray *array, uint8_t op)
298{
299 GArray *data = build_alloc_array();
300
301 build_append_int(data, array->len);
302 g_array_prepend_vals(array, data->data, data->len);
303 build_free_array(data);
304 build_package(array, op);
305}
306
307void aml_append(Aml *parent_ctx, Aml *child)
308{
309 switch (child->block_flags) {
310 case AML_OPCODE:
311 build_append_byte(parent_ctx->buf, child->op);
312 break;
313 case AML_EXT_PACKAGE:
314 build_extop_package(child->buf, child->op);
315 break;
316 case AML_PACKAGE:
317 build_package(child->buf, child->op);
318 break;
319 case AML_RES_TEMPLATE:
320 build_append_byte(child->buf, 0x79); /* EndTag */
321 /*
322 * checksum operations are treated as succeeded if checksum
323 * field is zero. [ACPI Spec 1.0b, 6.4.2.8 End Tag]
324 */
325 build_append_byte(child->buf, 0);
326 /* fall through, to pack resources in buffer */
327 case AML_BUFFER:
328 build_buffer(child->buf, child->op);
329 break;
330 case AML_NO_OPCODE:
331 break;
332 default:
333 assert(0);
334 break;
335 }
336 build_append_array(parent_ctx->buf, child->buf);
337}