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} |
|