[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 01/47] acpi: introduce AML composer aml_append()
From: |
Igor Mammedov |
Subject: |
[Qemu-devel] [RFC 01/47] acpi: introduce AML composer aml_append() |
Date: |
Fri, 19 Dec 2014 02:01:56 +0000 |
Adds for dynamic AML creation, which will be used
for piecing ASL/AML primitives together and hiding
from user/caller details about how nested context
should be closed/packed leaving less space for
mistakes and necessity to know how AML should be
encoded, allowing user to concentrate on ASL
representation instead.
For example it will allow to create AML like this:
AcpiAml scope = acpi_scope("PCI0")
AcpiAml dev = acpi_device("PM")
aml_append(&dev, acpi_name_decl("_ADR", acpi_int(addr)))
aml_append(&scope, dev);
Signed-off-by: Igor Mammedov <address@hidden>
---
hw/acpi/acpi_gen_utils.c | 39 +++++++++++++++++++++++++++++++++++++++
include/hw/acpi/acpi_gen_utils.h | 16 ++++++++++++++++
2 files changed, 55 insertions(+)
diff --git a/hw/acpi/acpi_gen_utils.c b/hw/acpi/acpi_gen_utils.c
index 291b938..c9050ef 100644
--- a/hw/acpi/acpi_gen_utils.c
+++ b/hw/acpi/acpi_gen_utils.c
@@ -242,3 +242,42 @@ void build_append_int(GArray *table, uint32_t value)
build_append_value(table, value, 4);
}
}
+
+static void build_prepend_int(GArray *array, uint32_t value)
+{
+ GArray *data = build_alloc_array();
+
+ build_append_int(data, value);
+ g_array_prepend_vals(array, data->data, data->len);
+ build_free_array(data);
+}
+
+void aml_append(AcpiAml *parent_ctx, AcpiAml child)
+{
+ switch (child.block_flags) {
+ case EXT_PACKAGE:
+ build_extop_package(child.buf, child.op);
+ break;
+
+ case PACKAGE:
+ build_package(child.buf, child.op);
+ break;
+
+ case RES_TEMPLATE:
+ build_append_byte(child.buf, 0x79); /* EndTag */
+ /*
+ * checksum operations is treated as succeeded if checksum
+ * field is zero. [ACPI Spec 5.0, 6.4.2.9 End Tag]
+ */
+ build_append_byte(child.buf, 0);
+ /* fall through, to pack resources in buffer */
+ case BUFFER:
+ build_prepend_int(child.buf, child.buf->len);
+ build_package(child.buf, child.op);
+ break;
+ default:
+ break;
+ }
+ build_append_array(parent_ctx->buf, child.buf);
+ build_free_array(child.buf);
+}
diff --git a/include/hw/acpi/acpi_gen_utils.h b/include/hw/acpi/acpi_gen_utils.h
index 199f003..64e7ec3 100644
--- a/include/hw/acpi/acpi_gen_utils.h
+++ b/include/hw/acpi/acpi_gen_utils.h
@@ -5,6 +5,22 @@
#include <glib.h>
#include "qemu/compiler.h"
+typedef enum {
+ NON_BLOCK,
+ PACKAGE,
+ EXT_PACKAGE,
+ BUFFER,
+ RES_TEMPLATE,
+} AcpiBlockFlags;
+
+typedef struct AcpiAml {
+ GArray *buf;
+ uint8_t op;
+ AcpiBlockFlags block_flags;
+} AcpiAml;
+
+void aml_append(AcpiAml *parent_ctx, AcpiAml child);
+
GArray *build_alloc_array(void);
void build_free_array(GArray *array);
void build_prepend_byte(GArray *array, uint8_t val);
--
1.8.3.1
- [Qemu-devel] [RFC 00/47] ACPI refactoring: replace template patching with C ASL API, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 01/47] acpi: introduce AML composer aml_append(),
Igor Mammedov <=
- [Qemu-devel] [RFC 02/47] acpi: add acpi_scope() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 07/47] acpi: factor out ACPI const int packing out build_append_value(), Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 04/47] acpi: add acpi_method() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 06/47] acpi: add acpi_name() & acpi_name_decl() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 05/47] acpi: add acpi_if() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 03/47] acpi: add acpi_device() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 10/47] acpi: add acpi_return() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 11/47] acpi: add acpi_arg0(), acpi_arg1(), acpi_arg2(), acpi_arg3() terms, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 12/47] acpi: add acpi_store() term, Igor Mammedov, 2014/12/18
- [Qemu-devel] [RFC 14/47] acpi: add acpi_notify() term, Igor Mammedov, 2014/12/18