On Fri, 23 Jan 2015 10:11:19 +0200 "Michael S. Tsirkin" <m...@redhat.com> wrote:
> On Thu, Jan 22, 2015 at 02:49:45PM +0000, Igor Mammedov wrote: > > 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 <imamm...@redhat.com> > > --- > > hw/acpi/acpi-build-utils.c | 39 > > ++++++++++++++++++++++++++++++++++++++ > > include/hw/acpi/acpi-build-utils.h | 16 ++++++++++++++++ > > 2 files changed, 55 insertions(+) > > > > diff --git a/hw/acpi/acpi-build-utils.c b/hw/acpi/acpi-build-utils.c > > index 602e68c..547ecaa 100644 > > --- a/hw/acpi/acpi-build-utils.c > > +++ b/hw/acpi/acpi-build-utils.c > > @@ -267,3 +267,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); > > +} > > I don't think prepend is generally justified: > it makes code hard to follow and debug. > > Adding length is different: of course you need > to first have the package before you can add length. > > We currently have build_prepend_package_length - just move it > to utils, and use everywhere. [...] > > + case BUFFER: > > + build_prepend_int(child.buf, child.buf->len); > > + build_package(child.buf, child.op); Buffer uses the same concept as package, but adds its own additional length. Therefore I've added build_prepend_int(), I can create build_buffer() and mimic build_package() but it won't change picture. As for moving to to another file, during all this series lowlevel build_(some_aml_related_costruct_helper)s are moved into this file and should be make static to hide from user lowlevel helpers (including build_package). That will leave only high level API available. TODO for me: make sure that moved lowlevel helpers are static > > + break; > > + default: > > + break; > > + } > > + build_append_array(parent_ctx->buf, child.buf); > > + build_free_array(child.buf); > > +} > > diff --git a/include/hw/acpi/acpi-build-utils.h > > b/include/hw/acpi/acpi-build-utils.h > > index 199f003..64e7ec3 100644 > > --- a/include/hw/acpi/acpi-build-utils.h > > +++ b/include/hw/acpi/acpi-build-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