All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: pbonzini@redhat.com, drjones@redhat.com,
	claudio.fontana@huawei.com, qemu-devel@nongnu.org,
	marcel.a@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2 01/47] acpi: introduce AML composer aml_append()
Date: Fri, 23 Jan 2015 18:56:20 +0100	[thread overview]
Message-ID: <20150123185620.604b83ab@nial.brq.redhat.com> (raw)
In-Reply-To: <20150123135511.GF4579@redhat.com>

On Fri, 23 Jan 2015 15:55:11 +0200
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Fri, Jan 23, 2015 at 02:40:30PM +0100, Igor Mammedov wrote:
> > On Fri, 23 Jan 2015 15:24:24 +0200
> > "Michael S. Tsirkin" <mst@redhat.com> wrote:
> > 
> > > On Fri, Jan 23, 2015 at 11:35:29AM +0100, Igor Mammedov wrote:
> > > > On Fri, 23 Jan 2015 10:11:19 +0200
> > > > "Michael S. Tsirkin" <mst@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 <imammedo@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()
> > > 
> > > Sounds good, pls do.
> > > The point is to avoid generic prepend calls as an external API.
> > > 
> > > > but it won't change picture.
> > > 
> > > It's a better API - what is meant by picture?
> > build_prepend_int() is a static/non public function,
> > build_buffer() will also be static/non public function for use only by
> > API internals.
> > 
> > I pretty much hate long build_append_foo() names so I'm hiding all
> > lowlevel constructs and try to expose only high-level ASL ones.
> > Which makes me to think that we need to use asl_ prefix for API calls
> > instead of acpi_ or aml_.
> 
> This sounds wrong unless we either accept ASL input or
> produce ASL output.
> 
> Igor, I think you are aiming a bit too high. Don't try to
> write your own language, just use C. It does have
> overhead like need to declare functions and variables,
> and allocate/free memory, but they are well understood.
I refuse to give up on cleaner and simpler API yet :)

> 
> 
> Your patches are almost there, they are pretty clean, the only issue I
> think is this passing of AcpiAml by value, sometimes freeing buffer in
> the process, sometimes not.
Currently buffer is allocated by API and is always freed whenever
it's passed to another API function.
That's why it makes user not to care about memory mgmt.

The only limitation of it is if you store AcpiAml return value into some
variable you are responsible to use it only once for passing to another API
function. Reusing this variable's value (pass it to API function second time)
would cause cause use-after-free and freeing-freed bugs.
Like this:
AcpiAml table = acpi_definition_block("SSDT",...);
AcpiAml scope = acpi_scope("PCI0");
aml_append(&table, scope); // <- here scope becomes invalid
// a bug
aml_append(&table, scope); // use-after-free + freeing-freed bugs

There are several approaches to look for resolving above issues:
1. Adopt and use memory mgmt model used by GTK+
   in nutshell: http://www.cs.hunter.cuny.edu/~sweiss/course_materials/csci493.70/lecture_notes/GTK_memory_mngmt.pdf
   In particular adopt behavior of GInitiallyUnowned usage model

   that will allow to keep convenient chained call style and if necessary
   reuse objects returned by API by explicitly referencing/dereferencing
   them if needed.

2. It's possible to drop freeing inside API completely and
   record(store in list) every new object inside a table context.
   When table is constructed, list of created objects could be
   safely freed.
   With that it would be safe to reuse every AcpiAml object
   and avoid free-after-use issues with limitation that created
   AcpiAml objects shouldn't be used after table was closed.
   It should cover all practical use of API, i.e. no cross
   table AcpiAml objects.

3. talloc implementation Amit've mentioned,
   perhaps it might work since it allows to set destructors for
   managed pointers. With this we might get clear abort when
   dereferencing freed pointer see talloc_set()

> 
> Just pass AcpiAml* everywhere, add APIs to allocate and free it
> together with the internal buffer.
> This makes it trivial to see that value is not misused:
> just check it's between alloc and free - and that there are
> no leaks - just check we call free on each value.
> We can write a semantic patch to catch missing free calls,
> it's easy.
> 
> 
> > > 
> > > > 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
> 

  reply	other threads:[~2015-01-23 17:56 UTC|newest]

Thread overview: 128+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-22 14:49 [Qemu-devel] [PATCH v2 00/47] ACPI refactoring: replace template patching with C ASL API Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 01/47] acpi: introduce AML composer aml_append() Igor Mammedov
2015-01-23  8:03   ` Michael S. Tsirkin
2015-01-23 10:03     ` Igor Mammedov
2015-01-23 13:26       ` Michael S. Tsirkin
2015-01-23  8:11   ` Michael S. Tsirkin
2015-01-23 10:35     ` Igor Mammedov
2015-01-23 13:24       ` Michael S. Tsirkin
2015-01-23 13:40         ` Igor Mammedov
2015-01-23 13:55           ` Michael S. Tsirkin
2015-01-23 17:56             ` Igor Mammedov [this message]
2015-01-24 16:33               ` Michael S. Tsirkin
2015-01-26  9:57                 ` Igor Mammedov
2015-01-26 10:37                   ` Michael S. Tsirkin
2015-01-26 15:09                   ` Igor Mammedov
2015-01-26 15:34                     ` Andrew Jones
2015-01-26 16:17                       ` Michael S. Tsirkin
2015-01-27 22:29                         ` Igor Mammedov
2015-01-28  7:27                           ` Michael S. Tsirkin
2015-01-28 10:03                             ` [Qemu-devel] [PATCH 00/13] convert AML API to QOM Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 01/13] convert to passing AcpiAml by pointers Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 02/13] make toplevel ACPI tables blob a pointer Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 03/13] qom: add support for weak referenced object: aka UnownedObject Igor Mammedov
2015-01-28 10:09                                 ` Paolo Bonzini
2015-01-28 12:55                                   ` Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 04/13] acpi: make AcpiAml an OQM object Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 05/13] acpi: use TYPE_AML_OBJECT inside of AML API Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 06/13] acpi: use TYPE_AML_OBJECT for toplevel ACPI tables blob Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 07/13] acpi: make toplevel ACPI tables blob a dedicated object Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 08/13] i386: acpi: hack not yet converted tables calls to deal with table_data being a pointer Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 09/13] acpi: add aml_blob() helper Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 10/13] i386: acpi: add DSDT table using AML API Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 11/13] acpi: acpi_add_table() to common cross target file Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 12/13] acpi: prepare for API internal collection of RSDT entries Igor Mammedov
2015-01-28 10:03                               ` [Qemu-devel] [PATCH 13/13] i386: acpi: mark SSDT as RSDT entry so API would add entry to RSDT automatically Igor Mammedov
2015-01-28 12:44                               ` [Qemu-devel] [PATCH 00/13] convert AML API to QOM Andrew Jones
2015-02-05 14:28                                 ` Marcel Apfelbaum
2015-02-05 17:36                                   ` Igor Mammedov
2015-01-28  7:56                           ` [Qemu-devel] [PATCH v2 01/47] acpi: introduce AML composer aml_append() Michael S. Tsirkin
2015-01-28 10:00                             ` Igor Mammedov
2015-01-28 10:24                               ` Michael S. Tsirkin
2015-01-28 10:50                                 ` Igor Mammedov
2015-01-28 13:12                                   ` Michael S. Tsirkin
2015-01-28 10:32                               ` Claudio Fontana
2015-01-29  7:46                               ` Shannon Zhao
2015-01-29  8:42                                 ` Igor Mammedov
2015-02-05 14:35                               ` Marcel Apfelbaum
2015-01-28 10:45                             ` Andrew Jones
2015-02-05 14:30                             ` Marcel Apfelbaum
2015-02-05 14:09                           ` Marcel Apfelbaum
2015-01-23  9:14   ` Michael S. Tsirkin
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 02/47] acpi: add acpi_scope() term Igor Mammedov
2015-01-23  8:02   ` Michael S. Tsirkin
2015-01-23 10:36     ` Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 03/47] acpi: add acpi_device() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 04/47] acpi: add acpi_method() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 05/47] acpi: add acpi_if() term Igor Mammedov
2015-02-05 15:01   ` Marcel Apfelbaum
2015-02-05 17:54     ` Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 06/47] acpi: add acpi_name() & acpi_name_decl() term Igor Mammedov
2015-01-23  8:59   ` Michael S. Tsirkin
2015-01-23 13:32     ` Igor Mammedov
2015-01-23 13:42       ` Michael S. Tsirkin
2015-02-02 16:04         ` Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 07/47] acpi: factor out ACPI const int packing out build_append_value() Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 08/47] acpi: extend build_append_{value|int}() to support 64-bit values Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 09/47] acpi: add acpi_int() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 10/47] acpi: add acpi_return() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 11/47] acpi: add acpi_arg0(), acpi_arg1(), acpi_arg2(), acpi_arg3() terms Igor Mammedov
2015-01-23  8:32   ` Marcel Apfelbaum
2015-01-23  9:35     ` Michael S. Tsirkin
2015-01-23 13:34     ` Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 12/47] acpi: add acpi_store() term Igor Mammedov
2015-02-05 15:06   ` Marcel Apfelbaum
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 13/47] acpi: add acpi_and() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 14/47] acpi: add acpi_notify() term Igor Mammedov
2015-01-22 14:49 ` [Qemu-devel] [PATCH v2 15/47] acpi: add acpi_call1(), acpi_call2(), acpi_call3(), acpi_call4() helpers Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 16/47] pc: acpi-build: drop template patching and create PCI bus tree dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 17/47] acpi: add acpi_package() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 18/47] pc: acpi-build: drop unsupported PM1b_CNT.SLP_TYP Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 19/47] pc: acpi-build: generate _S[345] packages dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 20/47] acpi: add acpi_buffer() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 21/47] acpi: add acpi_resource_template() helper Igor Mammedov
2015-01-27 13:26   ` Claudio Fontana
2015-01-27 13:41     ` Michael S. Tsirkin
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 22/47] acpi: add acpi_io() helper Igor Mammedov
2015-02-05 15:19   ` Marcel Apfelbaum
2015-02-05 17:56     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 23/47] acpi: include PkgLength size only when requested Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 24/47] acpi: add acpi_operation_region() term Igor Mammedov
2015-02-05 15:28   ` Marcel Apfelbaum
2015-02-05 17:57     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 25/47] acpi: add acpi_field() & acpi_named_field() terms Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 26/47] acpi: add acpi_local0() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 27/47] acpi: add acpi_string() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 28/47] pc: acpi-build: generate pvpanic device description dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 29/47] acpi: add acpi_varpackage() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 30/47] acpi: add acpi_equal() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 31/47] acpi: add acpi_processor() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 32/47] acpi: add acpi_eisaid() term Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 33/47] pc: acpi-build: drop template patching and CPU hotplug objects dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 34/47] pc: acpi-build: create CPU hotplug IO region dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 35/47] acpi: add acpi_reserved_field() term Igor Mammedov
2015-02-05 15:36   ` Marcel Apfelbaum
2015-02-05 17:57     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 36/47] pc: acpi-build: drop template patching and memory hotplug objects dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 37/47] pc: acpi-build: create memory hotplug IO region dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 38/47] acpi: add acpi_word_bus_number(), acpi_word_io(), acpi_dword_memory(), acpi_qword_memory() terms Igor Mammedov
2015-02-05 15:38   ` Marcel Apfelbaum
2015-02-05 17:58     ` Igor Mammedov
2015-02-05 17:59     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 39/47] pc: pcihp: expose MMIO base and len as properties Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 40/47] pc: acpi-build: reserve PCIHP MMIO resources Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 41/47] pc: acpi-build: create PCI0._CRS dynamically Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 42/47] acpi: add acpi_def_block() term Igor Mammedov
2015-01-29  8:02   ` Shannon Zhao
2015-01-29  8:45     ` Igor Mammedov
2015-01-29  9:01       ` Shannon Zhao
2015-01-29  9:21         ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 43/47] pc: acpi-build: prepare to make ACPI tables blob opaque for table building functions Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 44/47] pc: acpi-build: drop remaining ssdt_misc template and use acpi_def_block() Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 45/47] acpi: add acpi_iqr_no_flags() term Igor Mammedov
2015-01-27 15:37   ` Claudio Fontana
2015-01-28 12:15     ` Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 46/47] pc: export applesmc IO port/len Igor Mammedov
2015-01-22 14:50 ` [Qemu-devel] [PATCH v2 47/47] pc: acpi-build: drop template patching and create Device(SMC) dynamically Igor Mammedov
2015-01-28  7:38 ` [Qemu-devel] [PATCH v2 00/47] ACPI refactoring: replace template patching with C ASL API Michael S. Tsirkin
2015-01-28 10:07   ` Igor Mammedov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150123185620.604b83ab@nial.brq.redhat.com \
    --to=imammedo@redhat.com \
    --cc=claudio.fontana@huawei.com \
    --cc=drjones@redhat.com \
    --cc=marcel.a@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.