From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by 2002:a5d:6844:0:0:0:0:0 with SMTP id o4-v6csp563407wrw; Fri, 16 Nov 2018 08:08:20 -0800 (PST) X-Google-Smtp-Source: AJdET5d3N28J5fKa+dvCZZLFAV6rBU2g0Bi2ZZloeh7KLLyGDLlOR3I7ccFV5jhyudbFZfsgM38i X-Received: by 2002:ac8:160b:: with SMTP id p11mr10671102qtj.113.1542384500572; Fri, 16 Nov 2018 08:08:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542384500; cv=none; d=google.com; s=arc-20160816; b=bA8JsMS9DWTRkqoI/2F8NCDReXJseosMMuKU4mX4oZhsmh80yZKx5e5HdqBMVksHy+ qPqfPY1rzPEuC2+04TfLTvV0ocjwGyuU4cMlTFRpeH4749QdRyIQ2ypksjW68WeMjL6b 46ALMQMjVLn2vTeUC56AbmgKqcDYWKLW3YLAlHl9BfmiKLnA5YGz0UCw+vxpDboMywTy 0i9ShMiH8HOXT4wlbZ7CLhTA2Qg3k6SgMOFhmIryb8uN718rmJhm6LiNX+p9fhRSqFqU KAv57GCaubheQFu5qnCMF3sn3abDzvcfaq2lHgpdtIIqyVejnSW0Dr7mBhTCjIuIfNmL Onyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:to:from:date; bh=SDdyHa4NLvOcUzhk/kWiu4bzX2R4Ogt8WjLS9bdNkVk=; b=UVAv/tJ0ZRwZFwItsOwJdxEIVQD6Buxi4Wd9IWsrJiKPrk7X1PP5RpkgotGo9YogEm 7+3s3PGWCxzAUfJuIusCWYBiaFDsrZODC5O3v2zaMKDVM52t7IUs8krVaDBR9M85Qec9 58POJLBcLZ3YYmtR02/QJdQgVvz/kSjmdT9Zp4tAOurgp/ZZfylzUNr/t+CWTJIpAUkU lwWkChW6svq2dsuBhjPrHlD09suysquc6iXFA9o5uT1PrzGFxekkURR+hGoWPK9daylg vrKkhQzSnBfKWz4D7J34m9NbwXv4ODD3YSkGTtCJ5ABN2/Oj8wm3l6F+hZZItgeG6yX6 C5BA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id h21si2077289qtn.354.2018.11.16.08.08.20 for (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 16 Nov 2018 08:08:20 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from localhost ([::1]:45514 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gNgfL-00061G-Ua for alex.bennee@linaro.org; Fri, 16 Nov 2018 11:08:19 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57648) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gNgZr-0001cr-9n for qemu-arm@nongnu.org; Fri, 16 Nov 2018 11:02:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gNgZp-0005AI-Hw for qemu-arm@nongnu.org; Fri, 16 Nov 2018 11:02:39 -0500 Received: from mx1.redhat.com ([209.132.183.28]:58836) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gNgZp-00055g-91; Fri, 16 Nov 2018 11:02:37 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5CA34882EA; Fri, 16 Nov 2018 16:02:33 +0000 (UTC) Received: from localhost (unknown [10.43.2.182]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6AAF5101962A; Fri, 16 Nov 2018 16:02:28 +0000 (UTC) Date: Fri, 16 Nov 2018 17:02:26 +0100 From: Igor Mammedov To: Samuel Ortiz Message-ID: <20181116170226.35385388@redhat.com> In-Reply-To: <20181105014047.26447-21-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> <20181105014047.26447-21-sameo@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Fri, 16 Nov 2018 16:02:33 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: Re: [Qemu-arm] [Qemu-devel] [PATCH v5 20/24] hw: acpi: Define ACPI tables builder interface X-BeenThere: qemu-arm@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , qemu-devel@nongnu.org, Shannon Zhao , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, Anthony Perard , Paolo Bonzini , Richard Henderson Errors-To: qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org Sender: "Qemu-arm" X-TUID: dRZYzw4KrBr6 On Mon, 5 Nov 2018 02:40:43 +0100 Samuel Ortiz wrote: > In order to decouple ACPI APIs from specific machine types, we are > creating an ACPI builder interface that each ACPI platform can choose to > implement. > This way, a new machine type can re-use the high level ACPI APIs and > define some custom table build methods, without having to duplicate most > of the existing implementation only to add small variations to it. I'm not sure about motivation behind so high APIs, what obvious here is an extra level of indirection for not clear gain. Yep using table callbacks, one can attempt to generalize acpi_setup() and help boards to decide which tables do not build (MCFG comes to the mind). But I'm not convinced that acpi_setup() could be cleanly generalized as a whole (probably some parts but not everything) so it's minor benefit for extra headache of figuring out what callback will be actually called when reading code. However if board needs a slightly different table, it will have to duplicate an exiting one and then modify to suit its needs. to me it pretty much looks the same as calling build_foo() we use now but with an extra indirection level and then duplicating the later for usage in another board in slightly different manner. I agree with Paolo's suggestion to use interfaces for generalization, however I'd suggest a fine grained approach for providing board/target specific items/actions for generic tables. For example take a look at AcpiDeviceIfClass interface that is implemented by GPE devices and its madt_cpu() method. That should simplify generalizing cpu hotplug for arm/virt and also help to generalize build_madt(). It's not cleanest impl. by far but headed in the right generic direction. I have it on my TODO list to do list to generalize acpi parts of build_fadt()/cpu hotplug some day as part of the project that adds cpu hotplug to arm/virt board. GPE/GED device might be not ideal place to implement that interface (worked for pc/q35) and may be we should move it to machine level as board has access to much more data for building ACPI tables. For i386/virt, I'd extend/modify AcpiDeviceIfClass when/where it's necessary instead of adding high level table hooks. That way generic build_foo() API's would share much more code. > Reviewed-by: Philippe Mathieu-Daud=C3=A9 > Tested-by: Philippe Mathieu-Daud=C3=A9 > Signed-off-by: Samuel Ortiz > --- > include/hw/acpi/builder.h | 100 ++++++++++++++++++++++++++++++++++++++ > hw/acpi/builder.c | 97 ++++++++++++++++++++++++++++++++++++ > hw/acpi/Makefile.objs | 1 + > 3 files changed, 198 insertions(+) > create mode 100644 include/hw/acpi/builder.h > create mode 100644 hw/acpi/builder.c >=20 > diff --git a/include/hw/acpi/builder.h b/include/hw/acpi/builder.h > new file mode 100644 > index 0000000000..a63b88ffe9 > --- /dev/null > +++ b/include/hw/acpi/builder.h > @@ -0,0 +1,100 @@ > +/* > + * > + * Copyright (c) 2018 Intel Corporation > + * > + * This program is free software; you can redistribute it and/or modify = it > + * under the terms and conditions of the GNU General Public License, > + * version 2 or later, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License= for > + * more details. > + * > + * You should have received a copy of the GNU General Public License alo= ng with > + * this program. If not, see . > + */ > + > +#ifndef ACPI_BUILDER_H > +#define ACPI_BUILDER_H > + > +#include "qemu/osdep.h" > +#include "hw/acpi/bios-linker-loader.h" > +#include "qom/object.h" > + > +#define TYPE_ACPI_BUILDER "acpi-builder" > + > +#define ACPI_BUILDER_METHODS(klass) \ > + OBJECT_CLASS_CHECK(AcpiBuilderMethods, (klass), TYPE_ACPI_BUILDER) > +#define ACPI_BUILDER_GET_METHODS(obj) \ > + OBJECT_GET_CLASS(AcpiBuilderMethods, (obj), TYPE_ACPI_BUILDER) > +#define ACPI_BUILDER(obj) \ > + INTERFACE_CHECK(AcpiBuilder, (obj), TYPE_ACPI_BUILDER) > + > +typedef struct AcpiConfiguration AcpiConfiguration; > +typedef struct AcpiBuildState AcpiBuildState; > +typedef struct AcpiMcfgInfo AcpiMcfgInfo; > + > +typedef struct AcpiBuilder { > + /* */ > + Object Parent; > +} AcpiBuilder; > + > +/** > + * AcpiBuildMethods: > + * > + * Interface to be implemented by a machine type that needs to provide > + * custom ACPI tables build method. > + * > + * @parent: Opaque parent interface. > + * @rsdp: ACPI RSDP (Root System Description Pointer) table build callba= ck. > + * @madt: ACPI MADT (Multiple APIC Description Table) table build callba= ck. > + * @mcfg: ACPI MCFG table build callback. > + * @srat: ACPI SRAT (System/Static Resource Affinity Table) > + * table build callback. > + * @slit: ACPI SLIT (System Locality System Information Table) > + * table build callback. > + * @configuration: ACPI configuration getter. > + * This is used to query the machine instance for its > + * AcpiConfiguration pointer. > + */ > +typedef struct AcpiBuilderMethods { > + /* */ > + InterfaceClass parent; > + > + /* */ > + void (*rsdp)(GArray *table_data, BIOSLinker *linker, > + unsigned rsdt_tbl_offset); > + void (*madt)(GArray *table_data, BIOSLinker *linker, > + MachineState *ms, AcpiConfiguration *conf); > + void (*mcfg)(GArray *table_data, BIOSLinker *linker, > + AcpiMcfgInfo *info); > + void (*srat)(GArray *table_data, BIOSLinker *linker, > + MachineState *machine, AcpiConfiguration *conf); > + void (*slit)(GArray *table_data, BIOSLinker *linker); > + > + AcpiConfiguration *(*configuration)(AcpiBuilder *builder); > +} AcpiBuilderMethods; > + > +void acpi_builder_rsdp(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + unsigned rsdt_tbl_offset); > + > +void acpi_builder_madt(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + MachineState *ms, AcpiConfiguration *conf); > + > +void acpi_builder_mcfg(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + AcpiMcfgInfo *info); > + > +void acpi_builder_srat(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + MachineState *machine, AcpiConfiguration *conf); > + > +void acpi_builder_slit(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker); > + > +AcpiConfiguration *acpi_builder_configuration(AcpiBuilder *builder); > + > +#endif > diff --git a/hw/acpi/builder.c b/hw/acpi/builder.c > new file mode 100644 > index 0000000000..c29a614793 > --- /dev/null > +++ b/hw/acpi/builder.c > @@ -0,0 +1,97 @@ > +/* > + * > + * Copyright (c) 2018 Intel Corporation > + * > + * This program is free software; you can redistribute it and/or modify = it > + * under the terms and conditions of the GNU General Public License, > + * version 2 or later, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License= for > + * more details. > + * > + * You should have received a copy of the GNU General Public License alo= ng with > + * this program. If not, see . > + */ > + > +#include "qemu/osdep.h" > +#include "qemu/module.h" > +#include "qom/object.h" > +#include "hw/acpi/builder.h" > + > +void acpi_builder_rsdp(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + unsigned rsdt_tbl_offset) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->rsdp) { > + abm->rsdp(table_data, linker, rsdt_tbl_offset); > + } > +} > + > +void acpi_builder_madt(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + MachineState *ms, AcpiConfiguration *conf) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->madt) { > + abm->madt(table_data, linker, ms, conf); > + } > +} > + > +void acpi_builder_mcfg(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + AcpiMcfgInfo *info) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->mcfg) { > + abm->mcfg(table_data, linker, info); > + } > +} > + > +void acpi_builder_srat(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + MachineState *machine, AcpiConfiguration *conf) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->srat) { > + abm->srat(table_data, linker, machine, conf); > + } > +} > + > +void acpi_builder_slit(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->slit) { > + abm->slit(table_data, linker); > + } > +} > + > +AcpiConfiguration *acpi_builder_configuration(AcpiBuilder *builder) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + if (abm && abm->configuration) { > + return abm->configuration(builder); > + } > + return NULL; > +} > + > +static const TypeInfo acpi_builder_info =3D { > + .name =3D TYPE_ACPI_BUILDER, > + .parent =3D TYPE_INTERFACE, > + .class_size =3D sizeof(AcpiBuilderMethods), > +}; > + > +static void acpi_builder_register_type(void) > +{ > + type_register_static(&acpi_builder_info); > +} > + > +type_init(acpi_builder_register_type) > diff --git a/hw/acpi/Makefile.objs b/hw/acpi/Makefile.objs > index 11c35bcb44..2f383adc6f 100644 > --- a/hw/acpi/Makefile.objs > +++ b/hw/acpi/Makefile.objs > @@ -11,6 +11,7 @@ common-obj-$(call lnot,$(CONFIG_ACPI_X86)) +=3D acpi-st= ub.o > common-obj-y +=3D acpi_interface.o > common-obj-y +=3D bios-linker-loader.o > common-obj-y +=3D aml-build.o > +common-obj-y +=3D builder.o > =20 > common-obj-$(CONFIG_IPMI) +=3D ipmi.o > common-obj-$(call lnot,$(CONFIG_IPMI)) +=3D ipmi-stub.o From mboxrd@z Thu Jan 1 00:00:00 1970 From: Igor Mammedov Subject: Re: [Qemu-devel] [PATCH v5 20/24] hw: acpi: Define ACPI tables builder interface Date: Fri, 16 Nov 2018 17:02:26 +0100 Message-ID: <20181116170226.35385388@redhat.com> References: <20181105014047.26447-1-sameo@linux.intel.com> <20181105014047.26447-21-sameo@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gNgZn-0004od-B3 for xen-devel@lists.xenproject.org; Fri, 16 Nov 2018 16:02:35 +0000 In-Reply-To: <20181105014047.26447-21-sameo@linux.intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Samuel Ortiz Cc: Peter Maydell , Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , qemu-devel@nongnu.org, Shannon Zhao , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, Anthony Perard , Paolo Bonzini , Richard Henderson List-Id: xen-devel@lists.xenproject.org T24gTW9uLCAgNSBOb3YgMjAxOCAwMjo0MDo0MyArMDEwMApTYW11ZWwgT3J0aXogPHNhbWVvQGxp bnV4LmludGVsLmNvbT4gd3JvdGU6Cgo+IEluIG9yZGVyIHRvIGRlY291cGxlIEFDUEkgQVBJcyBm cm9tIHNwZWNpZmljIG1hY2hpbmUgdHlwZXMsIHdlIGFyZQo+IGNyZWF0aW5nIGFuIEFDUEkgYnVp bGRlciBpbnRlcmZhY2UgdGhhdCBlYWNoIEFDUEkgcGxhdGZvcm0gY2FuIGNob29zZSB0bwo+IGlt cGxlbWVudC4KPiBUaGlzIHdheSwgYSBuZXcgbWFjaGluZSB0eXBlIGNhbiByZS11c2UgdGhlIGhp Z2ggbGV2ZWwgQUNQSSBBUElzIGFuZAo+IGRlZmluZSBzb21lIGN1c3RvbSB0YWJsZSBidWlsZCBt ZXRob2RzLCB3aXRob3V0IGhhdmluZyB0byBkdXBsaWNhdGUgbW9zdAo+IG9mIHRoZSBleGlzdGlu ZyBpbXBsZW1lbnRhdGlvbiBvbmx5IHRvIGFkZCBzbWFsbCB2YXJpYXRpb25zIHRvIGl0LgpJJ20g bm90IHN1cmUgYWJvdXQgbW90aXZhdGlvbiBiZWhpbmQgc28gaGlnaCBBUElzLAp3aGF0IG9idmlv dXMgaGVyZSBpcyBhbiBleHRyYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBmb3Igbm90IGNsZWFyIGdh aW4uCgpZZXAgdXNpbmcgdGFibGUgY2FsbGJhY2tzLCBvbmUgY2FuIGF0dGVtcHQgdG8gZ2VuZXJh bGl6ZQphY3BpX3NldHVwKCkgYW5kIGhlbHAgYm9hcmRzIHRvIGRlY2lkZSB3aGljaCB0YWJsZXMg ZG8gbm90IGJ1aWxkCihNQ0ZHIGNvbWVzIHRvIHRoZSBtaW5kKS4gQnV0IEknbSBub3QgY29udmlu Y2VkIHRoYXQgYWNwaV9zZXR1cCgpCmNvdWxkIGJlIGNsZWFubHkgZ2VuZXJhbGl6ZWQgYXMgYSB3 aG9sZSAocHJvYmFibHkgc29tZSBwYXJ0cyBidXQKbm90IGV2ZXJ5dGhpbmcpIHNvIGl0J3MgbWlu b3IgYmVuZWZpdCBmb3IgZXh0cmEgaGVhZGFjaGUgb2YKZmlndXJpbmcgb3V0IHdoYXQgY2FsbGJh Y2sgd2lsbCBiZSBhY3R1YWxseSBjYWxsZWQgd2hlbiByZWFkaW5nIGNvZGUuCgpIb3dldmVyIGlm IGJvYXJkIG5lZWRzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHRhYmxlLCBpdCB3aWxsIGhhdmUgdG8K ZHVwbGljYXRlIGFuIGV4aXRpbmcgb25lIGFuZCB0aGVuIG1vZGlmeSB0byBzdWl0IGl0cyBuZWVk cy4KCnRvIG1lIGl0IHByZXR0eSBtdWNoIGxvb2tzIHRoZSBzYW1lIGFzIGNhbGxpbmcgYnVpbGRf Zm9vKCkKd2UgdXNlIG5vdyBidXQgd2l0aCBhbiBleHRyYSBpbmRpcmVjdGlvbiBsZXZlbCBhbmQg dGhlbgpkdXBsaWNhdGluZyB0aGUgbGF0ZXIgZm9yIHVzYWdlIGluIGFub3RoZXIgYm9hcmQgaW4g c2xpZ2h0bHkKZGlmZmVyZW50IG1hbm5lci4KCkkgYWdyZWUgd2l0aCBQYW9sbydzIHN1Z2dlc3Rp b24gdG8gdXNlIGludGVyZmFjZXMgZm9yIGdlbmVyYWxpemF0aW9uLApob3dldmVyIEknZCBzdWdn ZXN0IGEgZmluZSBncmFpbmVkIGFwcHJvYWNoIGZvciBwcm92aWRpbmcgYm9hcmQvdGFyZ2V0CnNw ZWNpZmljIGl0ZW1zL2FjdGlvbnMgZm9yIGdlbmVyaWMgdGFibGVzLgoKRm9yIGV4YW1wbGUgdGFr ZSBhIGxvb2sgYXQgQWNwaURldmljZUlmQ2xhc3MgaW50ZXJmYWNlIHRoYXQgaXMKaW1wbGVtZW50 ZWQgYnkgR1BFIGRldmljZXMgYW5kIGl0cyBtYWR0X2NwdSgpIG1ldGhvZC4gVGhhdCBzaG91bGQK c2ltcGxpZnkgZ2VuZXJhbGl6aW5nIGNwdSBob3RwbHVnIGZvciBhcm0vdmlydCBhbmQgYWxzbyBo ZWxwCnRvIGdlbmVyYWxpemUgYnVpbGRfbWFkdCgpLiBJdCdzIG5vdCBjbGVhbmVzdCBpbXBsLiBi eSBmYXIgYnV0CmhlYWRlZCBpbiB0aGUgcmlnaHQgZ2VuZXJpYyBkaXJlY3Rpb24uIEkgaGF2ZSBp dCBvbiBteSBUT0RPIGxpc3QgdG8KZG8gbGlzdCB0byBnZW5lcmFsaXplIGFjcGkgcGFydHMgb2Yg YnVpbGRfZmFkdCgpL2NwdSBob3RwbHVnCnNvbWUgZGF5IGFzIHBhcnQgb2YgdGhlIHByb2plY3Qg dGhhdCBhZGRzIGNwdSBob3RwbHVnIHRvIGFybS92aXJ0IGJvYXJkLgoKR1BFL0dFRCBkZXZpY2Ug bWlnaHQgYmUgbm90IGlkZWFsIHBsYWNlIHRvIGltcGxlbWVudCB0aGF0IGludGVyZmFjZQood29y a2VkIGZvciBwYy9xMzUpIGFuZCBtYXkgYmUgd2Ugc2hvdWxkIG1vdmUgaXQgdG8gbWFjaGluZSBs ZXZlbAphcyBib2FyZCBoYXMgYWNjZXNzIHRvIG11Y2ggbW9yZSBkYXRhIGZvciBidWlsZGluZyBB Q1BJIHRhYmxlcy4KRm9yIGkzODYvdmlydCwgSSdkIGV4dGVuZC9tb2RpZnkgQWNwaURldmljZUlm Q2xhc3Mgd2hlbi93aGVyZSBpdCdzCm5lY2Vzc2FyeSBpbnN0ZWFkIG9mIGFkZGluZyBoaWdoIGxl dmVsIHRhYmxlIGhvb2tzLgpUaGF0IHdheSBnZW5lcmljIGJ1aWxkX2ZvbygpIEFQSSdzIHdvdWxk IHNoYXJlIG11Y2ggbW9yZSBjb2RlLgoKPiBSZXZpZXdlZC1ieTogUGhpbGlwcGUgTWF0aGlldS1E YXVkw6kgPHBoaWxtZEByZWRoYXQuY29tPgo+IFRlc3RlZC1ieTogUGhpbGlwcGUgTWF0aGlldS1E YXVkw6kgPHBoaWxtZEByZWRoYXQuY29tPgo+IFNpZ25lZC1vZmYtYnk6IFNhbXVlbCBPcnRpeiA8 c2FtZW9AbGludXguaW50ZWwuY29tPgo+IC0tLQo+ICBpbmNsdWRlL2h3L2FjcGkvYnVpbGRlci5o IHwgMTAwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIGh3L2FjcGkv YnVpbGRlci5jICAgICAgICAgfCAgOTcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gIGh3L2FjcGkvTWFrZWZpbGUub2JqcyAgICAgfCAgIDEgKwo+ICAzIGZpbGVzIGNoYW5n ZWQsIDE5OCBpbnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2h3L2Fj cGkvYnVpbGRlci5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBody9hY3BpL2J1aWxkZXIuYwo+IAo+ IGRpZmYgLS1naXQgYS9pbmNsdWRlL2h3L2FjcGkvYnVpbGRlci5oIGIvaW5jbHVkZS9ody9hY3Bp L2J1aWxkZXIuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMC4uYTYz Yjg4ZmZlOQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9pbmNsdWRlL2h3L2FjcGkvYnVpbGRlci5o Cj4gQEAgLTAsMCArMSwxMDAgQEAKPiArLyoKPiArICoKPiArICogQ29weXJpZ2h0IChjKSAyMDE4 IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cj4gKyAqIHVuZGVy IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UsCj4gKyAqIHZlcnNpb24gMiBvciBsYXRlciwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKPiArICogQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklM SVRZIG9yCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKPiArICogbW9yZSBkZXRhaWxzLgo+ICsgKgo+ ICsgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCj4gKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2Vl IDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KPiArICovCj4gKwo+ICsjaWZuZGVmIEFD UElfQlVJTERFUl9ICj4gKyNkZWZpbmUgQUNQSV9CVUlMREVSX0gKPiArCj4gKyNpbmNsdWRlICJx ZW11L29zZGVwLmgiCj4gKyNpbmNsdWRlICJody9hY3BpL2Jpb3MtbGlua2VyLWxvYWRlci5oIgo+ ICsjaW5jbHVkZSAicW9tL29iamVjdC5oIgo+ICsKPiArI2RlZmluZSBUWVBFX0FDUElfQlVJTERF UiAiYWNwaS1idWlsZGVyIgo+ICsKPiArI2RlZmluZSBBQ1BJX0JVSUxERVJfTUVUSE9EUyhrbGFz cykgXAo+ICsgICAgIE9CSkVDVF9DTEFTU19DSEVDSyhBY3BpQnVpbGRlck1ldGhvZHMsIChrbGFz cyksIFRZUEVfQUNQSV9CVUlMREVSKQo+ICsjZGVmaW5lIEFDUElfQlVJTERFUl9HRVRfTUVUSE9E UyhvYmopIFwKPiArICAgICBPQkpFQ1RfR0VUX0NMQVNTKEFjcGlCdWlsZGVyTWV0aG9kcywgKG9i aiksIFRZUEVfQUNQSV9CVUlMREVSKQo+ICsjZGVmaW5lIEFDUElfQlVJTERFUihvYmopICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ICsgICAgIElOVEVSRkFDRV9DSEVD SyhBY3BpQnVpbGRlciwgKG9iaiksIFRZUEVfQUNQSV9CVUlMREVSKQo+ICsKPiArdHlwZWRlZiBz dHJ1Y3QgQWNwaUNvbmZpZ3VyYXRpb24gQWNwaUNvbmZpZ3VyYXRpb247Cj4gK3R5cGVkZWYgc3Ry dWN0IEFjcGlCdWlsZFN0YXRlIEFjcGlCdWlsZFN0YXRlOwo+ICt0eXBlZGVmIHN0cnVjdCBBY3Bp TWNmZ0luZm8gQWNwaU1jZmdJbmZvOwo+ICsKPiArdHlwZWRlZiBzdHJ1Y3QgQWNwaUJ1aWxkZXIg ewo+ICsgICAgLyogPHByaXZhdGU+ICovCj4gKyAgICBPYmplY3QgUGFyZW50Owo+ICt9IEFjcGlC dWlsZGVyOwo+ICsKPiArLyoqCj4gKyAqIEFjcGlCdWlsZE1ldGhvZHM6Cj4gKyAqCj4gKyAqIElu dGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBhIG1hY2hpbmUgdHlwZSB0aGF0IG5lZWRzIHRv IHByb3ZpZGUKPiArICogY3VzdG9tIEFDUEkgdGFibGVzIGJ1aWxkIG1ldGhvZC4KPiArICoKPiAr ICogQHBhcmVudDogT3BhcXVlIHBhcmVudCBpbnRlcmZhY2UuCj4gKyAqIEByc2RwOiBBQ1BJIFJT RFAgKFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFBvaW50ZXIpIHRhYmxlIGJ1aWxkIGNhbGxiYWNr Lgo+ICsgKiBAbWFkdDogQUNQSSBNQURUIChNdWx0aXBsZSBBUElDIERlc2NyaXB0aW9uIFRhYmxl KSB0YWJsZSBidWlsZCBjYWxsYmFjay4KPiArICogQG1jZmc6IEFDUEkgTUNGRyB0YWJsZSBidWls ZCBjYWxsYmFjay4KPiArICogQHNyYXQ6IEFDUEkgU1JBVCAoU3lzdGVtL1N0YXRpYyBSZXNvdXJj ZSBBZmZpbml0eSBUYWJsZSkKPiArICogICAgICAgIHRhYmxlIGJ1aWxkIGNhbGxiYWNrLgo+ICsg KiBAc2xpdDogQUNQSSBTTElUIChTeXN0ZW0gTG9jYWxpdHkgU3lzdGVtIEluZm9ybWF0aW9uIFRh YmxlKQo+ICsgKiAgICAgICAgdGFibGUgYnVpbGQgY2FsbGJhY2suCj4gKyAqIEBjb25maWd1cmF0 aW9uOiBBQ1BJIGNvbmZpZ3VyYXRpb24gZ2V0dGVyLgo+ICsgKiAgICAgICAgICAgICAgICAgVGhp cyBpcyB1c2VkIHRvIHF1ZXJ5IHRoZSBtYWNoaW5lIGluc3RhbmNlIGZvciBpdHMKPiArICogICAg ICAgICAgICAgICAgIEFjcGlDb25maWd1cmF0aW9uIHBvaW50ZXIuCj4gKyAqLwo+ICt0eXBlZGVm IHN0cnVjdCBBY3BpQnVpbGRlck1ldGhvZHMgewo+ICsgICAgLyogPHByaXZhdGU+ICovCj4gKyAg ICBJbnRlcmZhY2VDbGFzcyBwYXJlbnQ7Cj4gKwo+ICsgICAgLyogPHB1YmxpYz4gKi8KPiArICAg IHZvaWQgKCpyc2RwKShHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwKPiAr ICAgICAgICAgICAgICAgICB1bnNpZ25lZCByc2R0X3RibF9vZmZzZXQpOwo+ICsgICAgdm9pZCAo Km1hZHQpKEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLAo+ICsgICAgICAg ICAgICAgICAgIE1hY2hpbmVTdGF0ZSAqbXMsIEFjcGlDb25maWd1cmF0aW9uICpjb25mKTsKPiAr ICAgIHZvaWQgKCptY2ZnKShHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwK PiArICAgICAgICAgICAgICAgICBBY3BpTWNmZ0luZm8gKmluZm8pOwo+ICsgICAgdm9pZCAoKnNy YXQpKEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLAo+ICsgICAgICAgICAg ICAgICAgIE1hY2hpbmVTdGF0ZSAqbWFjaGluZSwgQWNwaUNvbmZpZ3VyYXRpb24gKmNvbmYpOwo+ ICsgICAgdm9pZCAoKnNsaXQpKEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2Vy KTsKPiArCj4gKyAgICBBY3BpQ29uZmlndXJhdGlvbiAqKCpjb25maWd1cmF0aW9uKShBY3BpQnVp bGRlciAqYnVpbGRlcik7Cj4gK30gQWNwaUJ1aWxkZXJNZXRob2RzOwo+ICsKPiArdm9pZCBhY3Bp X2J1aWxkZXJfcnNkcChBY3BpQnVpbGRlciAqYnVpbGRlciwKPiArICAgICAgICAgICAgICAgICAg ICAgICBHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwKPiArICAgICAgICAg ICAgICAgICAgICAgICB1bnNpZ25lZCByc2R0X3RibF9vZmZzZXQpOwo+ICsKPiArdm9pZCBhY3Bp X2J1aWxkZXJfbWFkdChBY3BpQnVpbGRlciAqYnVpbGRlciwKPiArICAgICAgICAgICAgICAgICAg ICAgICBHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwKPiArICAgICAgICAg ICAgICAgICAgICAgICBNYWNoaW5lU3RhdGUgKm1zLCBBY3BpQ29uZmlndXJhdGlvbiAqY29uZik7 Cj4gKwo+ICt2b2lkIGFjcGlfYnVpbGRlcl9tY2ZnKEFjcGlCdWlsZGVyICpidWlsZGVyLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgIEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlu a2VyLAo+ICsgICAgICAgICAgICAgICAgICAgICAgIEFjcGlNY2ZnSW5mbyAqaW5mbyk7Cj4gKwo+ ICt2b2lkIGFjcGlfYnVpbGRlcl9zcmF0KEFjcGlCdWlsZGVyICpidWlsZGVyLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgIEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVTdGF0ZSAqbWFjaGluZSwgQWNwaUNvbmZp Z3VyYXRpb24gKmNvbmYpOwo+ICsKPiArdm9pZCBhY3BpX2J1aWxkZXJfc2xpdChBY3BpQnVpbGRl ciAqYnVpbGRlciwKPiArICAgICAgICAgICAgICAgICAgICAgICBHQXJyYXkgKnRhYmxlX2RhdGEs IEJJT1NMaW5rZXIgKmxpbmtlcik7Cj4gKwo+ICtBY3BpQ29uZmlndXJhdGlvbiAqYWNwaV9idWls ZGVyX2NvbmZpZ3VyYXRpb24oQWNwaUJ1aWxkZXIgKmJ1aWxkZXIpOwo+ICsKPiArI2VuZGlmCj4g ZGlmZiAtLWdpdCBhL2h3L2FjcGkvYnVpbGRlci5jIGIvaHcvYWNwaS9idWlsZGVyLmMKPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAuLmMyOWE2MTQ3OTMKPiAtLS0gL2Rl di9udWxsCj4gKysrIGIvaHcvYWNwaS9idWlsZGVyLmMKPiBAQCAtMCwwICsxLDk3IEBACj4gKy8q Cj4gKyAqCj4gKyAqIENvcHlyaWdodCAoYykgMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgo+ICsgKgo+ ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeSBpdAo+ICsgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAo+ICsgKiB2ZXJzaW9uIDIgb3IgbGF0 ZXIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+ICsgKgo+ ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1 c2VmdWwsIGJ1dCBXSVRIT1VUCj4gKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgo+ICsgKiBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yCj4gKyAqIG1vcmUgZGV0YWlscy4KPiArICoKPiArICogWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAo+ ICsgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKPiArI2luY2x1ZGUg InFlbXUvbW9kdWxlLmgiCj4gKyNpbmNsdWRlICJxb20vb2JqZWN0LmgiCj4gKyNpbmNsdWRlICJo dy9hY3BpL2J1aWxkZXIuaCIKPiArCj4gK3ZvaWQgYWNwaV9idWlsZGVyX3JzZHAoQWNwaUJ1aWxk ZXIgKmJ1aWxkZXIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgR0FycmF5ICp0YWJsZV9kYXRh LCBCSU9TTGlua2VyICpsaW5rZXIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg cnNkdF90Ymxfb2Zmc2V0KQo+ICt7Cj4gKyAgICBBY3BpQnVpbGRlck1ldGhvZHMgKmFibSA9IEFD UElfQlVJTERFUl9HRVRfTUVUSE9EUyhidWlsZGVyKTsKPiArCj4gKyAgICBpZiAoYWJtICYmIGFi bS0+cnNkcCkgewo+ICsgICAgICAgIGFibS0+cnNkcCh0YWJsZV9kYXRhLCBsaW5rZXIsIHJzZHRf dGJsX29mZnNldCk7Cj4gKyAgICB9Cj4gK30KPiArCj4gK3ZvaWQgYWNwaV9idWlsZGVyX21hZHQo QWNwaUJ1aWxkZXIgKmJ1aWxkZXIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgR0FycmF5ICp0 YWJsZV9kYXRhLCBCSU9TTGlua2VyICpsaW5rZXIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg TWFjaGluZVN0YXRlICptcywgQWNwaUNvbmZpZ3VyYXRpb24gKmNvbmYpCj4gK3sKPiArICAgIEFj cGlCdWlsZGVyTWV0aG9kcyAqYWJtID0gQUNQSV9CVUlMREVSX0dFVF9NRVRIT0RTKGJ1aWxkZXIp Owo+ICsKPiArICAgIGlmIChhYm0gJiYgYWJtLT5tYWR0KSB7Cj4gKyAgICAgICAgYWJtLT5tYWR0 KHRhYmxlX2RhdGEsIGxpbmtlciwgbXMsIGNvbmYpOwo+ICsgICAgfQo+ICt9Cj4gKwo+ICt2b2lk IGFjcGlfYnVpbGRlcl9tY2ZnKEFjcGlCdWlsZGVyICpidWlsZGVyLAo+ICsgICAgICAgICAgICAg ICAgICAgICAgIEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgIEFjcGlNY2ZnSW5mbyAqaW5mbykKPiArewo+ICsgICAgQWNwaUJ1 aWxkZXJNZXRob2RzICphYm0gPSBBQ1BJX0JVSUxERVJfR0VUX01FVEhPRFMoYnVpbGRlcik7Cj4g Kwo+ICsgICAgaWYgKGFibSAmJiBhYm0tPm1jZmcpIHsKPiArICAgICAgICBhYm0tPm1jZmcodGFi bGVfZGF0YSwgbGlua2VyLCBpbmZvKTsKPiArICAgIH0KPiArfQo+ICsKPiArdm9pZCBhY3BpX2J1 aWxkZXJfc3JhdChBY3BpQnVpbGRlciAqYnVpbGRlciwKPiArICAgICAgICAgICAgICAgICAgICAg ICBHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwKPiArICAgICAgICAgICAg ICAgICAgICAgICBNYWNoaW5lU3RhdGUgKm1hY2hpbmUsIEFjcGlDb25maWd1cmF0aW9uICpjb25m KQo+ICt7Cj4gKyAgICBBY3BpQnVpbGRlck1ldGhvZHMgKmFibSA9IEFDUElfQlVJTERFUl9HRVRf TUVUSE9EUyhidWlsZGVyKTsKPiArCj4gKyAgICBpZiAoYWJtICYmIGFibS0+c3JhdCkgewo+ICsg ICAgICAgIGFibS0+c3JhdCh0YWJsZV9kYXRhLCBsaW5rZXIsIG1hY2hpbmUsIGNvbmYpOwo+ICsg ICAgfQo+ICt9Cj4gKwo+ICt2b2lkIGFjcGlfYnVpbGRlcl9zbGl0KEFjcGlCdWlsZGVyICpidWls ZGVyLAo+ICsgICAgICAgICAgICAgICAgICAgICAgIEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xp bmtlciAqbGlua2VyKQo+ICt7Cj4gKyAgICBBY3BpQnVpbGRlck1ldGhvZHMgKmFibSA9IEFDUElf QlVJTERFUl9HRVRfTUVUSE9EUyhidWlsZGVyKTsKPiArCj4gKyAgICBpZiAoYWJtICYmIGFibS0+ c2xpdCkgewo+ICsgICAgICAgIGFibS0+c2xpdCh0YWJsZV9kYXRhLCBsaW5rZXIpOwo+ICsgICAg fQo+ICt9Cj4gKwo+ICtBY3BpQ29uZmlndXJhdGlvbiAqYWNwaV9idWlsZGVyX2NvbmZpZ3VyYXRp b24oQWNwaUJ1aWxkZXIgKmJ1aWxkZXIpCj4gK3sKPiArICAgIEFjcGlCdWlsZGVyTWV0aG9kcyAq YWJtID0gQUNQSV9CVUlMREVSX0dFVF9NRVRIT0RTKGJ1aWxkZXIpOwo+ICsgICAgaWYgKGFibSAm JiBhYm0tPmNvbmZpZ3VyYXRpb24pIHsKPiArICAgICAgICByZXR1cm4gYWJtLT5jb25maWd1cmF0 aW9uKGJ1aWxkZXIpOwo+ICsgICAgfQo+ICsgICAgcmV0dXJuIE5VTEw7Cj4gK30KPiArCj4gK3N0 YXRpYyBjb25zdCBUeXBlSW5mbyBhY3BpX2J1aWxkZXJfaW5mbyA9IHsKPiArICAgIC5uYW1lICAg ICAgICAgID0gVFlQRV9BQ1BJX0JVSUxERVIsCj4gKyAgICAucGFyZW50ICAgICAgICA9IFRZUEVf SU5URVJGQUNFLAo+ICsgICAgLmNsYXNzX3NpemUgICAgPSBzaXplb2YoQWNwaUJ1aWxkZXJNZXRo b2RzKSwKPiArfTsKPiArCj4gK3N0YXRpYyB2b2lkIGFjcGlfYnVpbGRlcl9yZWdpc3Rlcl90eXBl KHZvaWQpCj4gK3sKPiArICAgIHR5cGVfcmVnaXN0ZXJfc3RhdGljKCZhY3BpX2J1aWxkZXJfaW5m byk7Cj4gK30KPiArCj4gK3R5cGVfaW5pdChhY3BpX2J1aWxkZXJfcmVnaXN0ZXJfdHlwZSkKPiBk aWZmIC0tZ2l0IGEvaHcvYWNwaS9NYWtlZmlsZS5vYmpzIGIvaHcvYWNwaS9NYWtlZmlsZS5vYmpz Cj4gaW5kZXggMTFjMzViY2I0NC4uMmYzODNhZGM2ZiAxMDA2NDQKPiAtLS0gYS9ody9hY3BpL01h a2VmaWxlLm9ianMKPiArKysgYi9ody9hY3BpL01ha2VmaWxlLm9ianMKPiBAQCAtMTEsNiArMTEs NyBAQCBjb21tb24tb2JqLSQoY2FsbCBsbm90LCQoQ09ORklHX0FDUElfWDg2KSkgKz0gYWNwaS1z dHViLm8KPiAgY29tbW9uLW9iai15ICs9IGFjcGlfaW50ZXJmYWNlLm8KPiAgY29tbW9uLW9iai15 ICs9IGJpb3MtbGlua2VyLWxvYWRlci5vCj4gIGNvbW1vbi1vYmoteSArPSBhbWwtYnVpbGQubwo+ ICtjb21tb24tb2JqLXkgKz0gYnVpbGRlci5vCj4gIAo+ICBjb21tb24tb2JqLSQoQ09ORklHX0lQ TUkpICs9IGlwbWkubwo+ICBjb21tb24tb2JqLSQoY2FsbCBsbm90LCQoQ09ORklHX0lQTUkpKSAr PSBpcG1pLXN0dWIubwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qu b3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2 ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57698) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gNgZu-0001hY-SB for qemu-devel@nongnu.org; Fri, 16 Nov 2018 11:02:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gNgZt-0005DC-1v for qemu-devel@nongnu.org; Fri, 16 Nov 2018 11:02:42 -0500 Date: Fri, 16 Nov 2018 17:02:26 +0100 From: Igor Mammedov Message-ID: <20181116170226.35385388@redhat.com> In-Reply-To: <20181105014047.26447-21-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> <20181105014047.26447-21-sameo@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v5 20/24] hw: acpi: Define ACPI tables builder interface List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Samuel Ortiz Cc: qemu-devel@nongnu.org, Peter Maydell , Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , Shannon Zhao , qemu-arm@nongnu.org, Paolo Bonzini , Anthony Perard , xen-devel@lists.xenproject.org, Richard Henderson On Mon, 5 Nov 2018 02:40:43 +0100 Samuel Ortiz wrote: > In order to decouple ACPI APIs from specific machine types, we are > creating an ACPI builder interface that each ACPI platform can choose to > implement. > This way, a new machine type can re-use the high level ACPI APIs and > define some custom table build methods, without having to duplicate most > of the existing implementation only to add small variations to it. I'm not sure about motivation behind so high APIs, what obvious here is an extra level of indirection for not clear gain. Yep using table callbacks, one can attempt to generalize acpi_setup() and help boards to decide which tables do not build (MCFG comes to the mind). But I'm not convinced that acpi_setup() could be cleanly generalized as a whole (probably some parts but not everything) so it's minor benefit for extra headache of figuring out what callback will be actually called when reading code. However if board needs a slightly different table, it will have to duplicate an exiting one and then modify to suit its needs. to me it pretty much looks the same as calling build_foo() we use now but with an extra indirection level and then duplicating the later for usage in another board in slightly different manner. I agree with Paolo's suggestion to use interfaces for generalization, however I'd suggest a fine grained approach for providing board/target specific items/actions for generic tables. For example take a look at AcpiDeviceIfClass interface that is implemented by GPE devices and its madt_cpu() method. That should simplify generalizing cpu hotplug for arm/virt and also help to generalize build_madt(). It's not cleanest impl. by far but headed in the right generic direction. I have it on my TODO list to do list to generalize acpi parts of build_fadt()/cpu hotplug some day as part of the project that adds cpu hotplug to arm/virt board. GPE/GED device might be not ideal place to implement that interface (worked for pc/q35) and may be we should move it to machine level as board has access to much more data for building ACPI tables. For i386/virt, I'd extend/modify AcpiDeviceIfClass when/where it's necessary instead of adding high level table hooks. That way generic build_foo() API's would share much more code. > Reviewed-by: Philippe Mathieu-Daud=C3=A9 > Tested-by: Philippe Mathieu-Daud=C3=A9 > Signed-off-by: Samuel Ortiz > --- > include/hw/acpi/builder.h | 100 ++++++++++++++++++++++++++++++++++++++ > hw/acpi/builder.c | 97 ++++++++++++++++++++++++++++++++++++ > hw/acpi/Makefile.objs | 1 + > 3 files changed, 198 insertions(+) > create mode 100644 include/hw/acpi/builder.h > create mode 100644 hw/acpi/builder.c >=20 > diff --git a/include/hw/acpi/builder.h b/include/hw/acpi/builder.h > new file mode 100644 > index 0000000000..a63b88ffe9 > --- /dev/null > +++ b/include/hw/acpi/builder.h > @@ -0,0 +1,100 @@ > +/* > + * > + * Copyright (c) 2018 Intel Corporation > + * > + * This program is free software; you can redistribute it and/or modify = it > + * under the terms and conditions of the GNU General Public License, > + * version 2 or later, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License= for > + * more details. > + * > + * You should have received a copy of the GNU General Public License alo= ng with > + * this program. If not, see . > + */ > + > +#ifndef ACPI_BUILDER_H > +#define ACPI_BUILDER_H > + > +#include "qemu/osdep.h" > +#include "hw/acpi/bios-linker-loader.h" > +#include "qom/object.h" > + > +#define TYPE_ACPI_BUILDER "acpi-builder" > + > +#define ACPI_BUILDER_METHODS(klass) \ > + OBJECT_CLASS_CHECK(AcpiBuilderMethods, (klass), TYPE_ACPI_BUILDER) > +#define ACPI_BUILDER_GET_METHODS(obj) \ > + OBJECT_GET_CLASS(AcpiBuilderMethods, (obj), TYPE_ACPI_BUILDER) > +#define ACPI_BUILDER(obj) \ > + INTERFACE_CHECK(AcpiBuilder, (obj), TYPE_ACPI_BUILDER) > + > +typedef struct AcpiConfiguration AcpiConfiguration; > +typedef struct AcpiBuildState AcpiBuildState; > +typedef struct AcpiMcfgInfo AcpiMcfgInfo; > + > +typedef struct AcpiBuilder { > + /* */ > + Object Parent; > +} AcpiBuilder; > + > +/** > + * AcpiBuildMethods: > + * > + * Interface to be implemented by a machine type that needs to provide > + * custom ACPI tables build method. > + * > + * @parent: Opaque parent interface. > + * @rsdp: ACPI RSDP (Root System Description Pointer) table build callba= ck. > + * @madt: ACPI MADT (Multiple APIC Description Table) table build callba= ck. > + * @mcfg: ACPI MCFG table build callback. > + * @srat: ACPI SRAT (System/Static Resource Affinity Table) > + * table build callback. > + * @slit: ACPI SLIT (System Locality System Information Table) > + * table build callback. > + * @configuration: ACPI configuration getter. > + * This is used to query the machine instance for its > + * AcpiConfiguration pointer. > + */ > +typedef struct AcpiBuilderMethods { > + /* */ > + InterfaceClass parent; > + > + /* */ > + void (*rsdp)(GArray *table_data, BIOSLinker *linker, > + unsigned rsdt_tbl_offset); > + void (*madt)(GArray *table_data, BIOSLinker *linker, > + MachineState *ms, AcpiConfiguration *conf); > + void (*mcfg)(GArray *table_data, BIOSLinker *linker, > + AcpiMcfgInfo *info); > + void (*srat)(GArray *table_data, BIOSLinker *linker, > + MachineState *machine, AcpiConfiguration *conf); > + void (*slit)(GArray *table_data, BIOSLinker *linker); > + > + AcpiConfiguration *(*configuration)(AcpiBuilder *builder); > +} AcpiBuilderMethods; > + > +void acpi_builder_rsdp(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + unsigned rsdt_tbl_offset); > + > +void acpi_builder_madt(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + MachineState *ms, AcpiConfiguration *conf); > + > +void acpi_builder_mcfg(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + AcpiMcfgInfo *info); > + > +void acpi_builder_srat(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + MachineState *machine, AcpiConfiguration *conf); > + > +void acpi_builder_slit(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker); > + > +AcpiConfiguration *acpi_builder_configuration(AcpiBuilder *builder); > + > +#endif > diff --git a/hw/acpi/builder.c b/hw/acpi/builder.c > new file mode 100644 > index 0000000000..c29a614793 > --- /dev/null > +++ b/hw/acpi/builder.c > @@ -0,0 +1,97 @@ > +/* > + * > + * Copyright (c) 2018 Intel Corporation > + * > + * This program is free software; you can redistribute it and/or modify = it > + * under the terms and conditions of the GNU General Public License, > + * version 2 or later, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License= for > + * more details. > + * > + * You should have received a copy of the GNU General Public License alo= ng with > + * this program. If not, see . > + */ > + > +#include "qemu/osdep.h" > +#include "qemu/module.h" > +#include "qom/object.h" > +#include "hw/acpi/builder.h" > + > +void acpi_builder_rsdp(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + unsigned rsdt_tbl_offset) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->rsdp) { > + abm->rsdp(table_data, linker, rsdt_tbl_offset); > + } > +} > + > +void acpi_builder_madt(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + MachineState *ms, AcpiConfiguration *conf) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->madt) { > + abm->madt(table_data, linker, ms, conf); > + } > +} > + > +void acpi_builder_mcfg(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + AcpiMcfgInfo *info) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->mcfg) { > + abm->mcfg(table_data, linker, info); > + } > +} > + > +void acpi_builder_srat(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker, > + MachineState *machine, AcpiConfiguration *conf) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->srat) { > + abm->srat(table_data, linker, machine, conf); > + } > +} > + > +void acpi_builder_slit(AcpiBuilder *builder, > + GArray *table_data, BIOSLinker *linker) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + > + if (abm && abm->slit) { > + abm->slit(table_data, linker); > + } > +} > + > +AcpiConfiguration *acpi_builder_configuration(AcpiBuilder *builder) > +{ > + AcpiBuilderMethods *abm =3D ACPI_BUILDER_GET_METHODS(builder); > + if (abm && abm->configuration) { > + return abm->configuration(builder); > + } > + return NULL; > +} > + > +static const TypeInfo acpi_builder_info =3D { > + .name =3D TYPE_ACPI_BUILDER, > + .parent =3D TYPE_INTERFACE, > + .class_size =3D sizeof(AcpiBuilderMethods), > +}; > + > +static void acpi_builder_register_type(void) > +{ > + type_register_static(&acpi_builder_info); > +} > + > +type_init(acpi_builder_register_type) > diff --git a/hw/acpi/Makefile.objs b/hw/acpi/Makefile.objs > index 11c35bcb44..2f383adc6f 100644 > --- a/hw/acpi/Makefile.objs > +++ b/hw/acpi/Makefile.objs > @@ -11,6 +11,7 @@ common-obj-$(call lnot,$(CONFIG_ACPI_X86)) +=3D acpi-st= ub.o > common-obj-y +=3D acpi_interface.o > common-obj-y +=3D bios-linker-loader.o > common-obj-y +=3D aml-build.o > +common-obj-y +=3D builder.o > =20 > common-obj-$(CONFIG_IPMI) +=3D ipmi.o > common-obj-$(call lnot,$(CONFIG_IPMI)) +=3D ipmi-stub.o