From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44771) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gMb6V-0001pF-Np for qemu-devel@nongnu.org; Tue, 13 Nov 2018 10:59:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gMb6S-0002BN-UM for qemu-devel@nongnu.org; Tue, 13 Nov 2018 10:59:51 -0500 Date: Tue, 13 Nov 2018 16:59:18 +0100 From: Igor Mammedov Message-ID: <20181113165918.5cc2b2b5@redhat.com> In-Reply-To: <20181105014047.26447-11-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> <20181105014047.26447-11-sameo@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v5 10/24] hw: acpi: Export the PCI host and holes getters 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:33 +0100 Samuel Ortiz wrote: > This is going to be needed by the hardware reduced implementation, so > let's export it. > Once the ACPI builder methods and getters will be implemented, the > acpi_get_pci_host() implementation will become hardware agnostic. > > Signed-off-by: Samuel Ortiz > --- > include/hw/acpi/aml-build.h | 2 ++ > hw/acpi/aml-build.c | 43 +++++++++++++++++++++++++++++++++ > hw/i386/acpi-build.c | 47 ++----------------------------------- > 3 files changed, 47 insertions(+), 45 deletions(-) > > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h > index c27c0935ae..fde2785b9a 100644 > --- a/include/hw/acpi/aml-build.h > +++ b/include/hw/acpi/aml-build.h > @@ -400,6 +400,8 @@ build_header(BIOSLinker *linker, GArray *table_data, > const char *oem_id, const char *oem_table_id); > void *acpi_data_push(GArray *table_data, unsigned size); > unsigned acpi_data_len(GArray *table); > +Object *acpi_get_pci_host(void); > +void acpi_get_pci_holes(Range *hole, Range *hole64); > /* Align AML blob size to a multiple of 'align' */ > void acpi_align_size(GArray *blob, unsigned align); > void acpi_add_table(GArray *table_offsets, GArray *table_data); > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c > index 2b9a636e75..b8e32f15f7 100644 > --- a/hw/acpi/aml-build.c > +++ b/hw/acpi/aml-build.c > @@ -1601,6 +1601,49 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre) > g_array_free(tables->vmgenid, mfre); > } > +/* > + * Because of the PXB hosts we cannot simply query TYPE_PCI_HOST_BRIDGE. > + */ > +Object *acpi_get_pci_host(void) > +{ > + PCIHostState *host; > + > + host = OBJECT_CHECK(PCIHostState, > + object_resolve_path("/machine/i440fx", NULL), > + TYPE_PCI_HOST_BRIDGE); > + if (!host) { > + host = OBJECT_CHECK(PCIHostState, > + object_resolve_path("/machine/q35", NULL), > + TYPE_PCI_HOST_BRIDGE); > + } > + > + return OBJECT(host); > +} in general aml-build.c is a place to put ACPI spec primitives, so I'd suggest to move it somewhere else. Considering it's x86 code (so far), maybe move it to something like hw/i386/acpi-pci.c Also it might be good to get rid of acpi_get_pci_host() and pass a pointer to pci_host as acpi_setup() an argument, since it's static for life of boar we can keep it in AcpiBuildState, and reuse for mfg/pci_hole/pci bus accesses. That way we can simplify code a bit and avoid lookup cost of object_resolve_path() that's called several times unnecessarily. > +void acpi_get_pci_holes(Range *hole, Range *hole64) > +{ > + Object *pci_host; > + > + pci_host = acpi_get_pci_host(); > + g_assert(pci_host); > + > + range_set_bounds1(hole, > + object_property_get_uint(pci_host, > + PCI_HOST_PROP_PCI_HOLE_START, > + NULL), > + object_property_get_uint(pci_host, > + PCI_HOST_PROP_PCI_HOLE_END, > + NULL)); > + range_set_bounds1(hole64, > + object_property_get_uint(pci_host, > + PCI_HOST_PROP_PCI_HOLE64_START, > + NULL), > + object_property_get_uint(pci_host, > + PCI_HOST_PROP_PCI_HOLE64_END, > + NULL)); > +} > + > static void crs_range_insert(GPtrArray *ranges, uint64_t base, uint64_t limit) > { > CrsRangeEntry *entry; > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index bd147a6bd2..a5f5f83500 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -232,49 +232,6 @@ static void acpi_get_misc_info(AcpiMiscInfo *info) > info->applesmc_io_base = applesmc_port(); > } > > -/* > - * Because of the PXB hosts we cannot simply query TYPE_PCI_HOST_BRIDGE. > - * On i386 arch we only have two pci hosts, so we can look only for them. > - */ > -static Object *acpi_get_i386_pci_host(void) > -{ > - PCIHostState *host; > - > - host = OBJECT_CHECK(PCIHostState, > - object_resolve_path("/machine/i440fx", NULL), > - TYPE_PCI_HOST_BRIDGE); > - if (!host) { > - host = OBJECT_CHECK(PCIHostState, > - object_resolve_path("/machine/q35", NULL), > - TYPE_PCI_HOST_BRIDGE); > - } > - > - return OBJECT(host); > -} > - > -static void acpi_get_pci_holes(Range *hole, Range *hole64) > -{ > - Object *pci_host; > - > - pci_host = acpi_get_i386_pci_host(); > - g_assert(pci_host); > - > - range_set_bounds1(hole, > - object_property_get_uint(pci_host, > - PCI_HOST_PROP_PCI_HOLE_START, > - NULL), > - object_property_get_uint(pci_host, > - PCI_HOST_PROP_PCI_HOLE_END, > - NULL)); > - range_set_bounds1(hole64, > - object_property_get_uint(pci_host, > - PCI_HOST_PROP_PCI_HOLE64_START, > - NULL), > - object_property_get_uint(pci_host, > - PCI_HOST_PROP_PCI_HOLE64_END, > - NULL)); > -} > - > /* FACS */ > static void > build_facs(GArray *table_data, BIOSLinker *linker) > @@ -1634,7 +1591,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, > Object *pci_host; > PCIBus *bus = NULL; > > - pci_host = acpi_get_i386_pci_host(); > + pci_host = acpi_get_pci_host(); > if (pci_host) { > bus = PCI_HOST_BRIDGE(pci_host)->bus; > } > @@ -2008,7 +1965,7 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg) > Object *pci_host; > QObject *o; > > - pci_host = acpi_get_i386_pci_host(); > + pci_host = acpi_get_pci_host(); > g_assert(pci_host); > > o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_BASE, NULL); From mboxrd@z Thu Jan 1 00:00:00 1970 From: Igor Mammedov Subject: Re: [Qemu-devel] [PATCH v5 10/24] hw: acpi: Export the PCI host and holes getters Date: Tue, 13 Nov 2018 16:59:18 +0100 Message-ID: <20181113165918.5cc2b2b5@redhat.com> References: <20181105014047.26447-1-sameo@linux.intel.com> <20181105014047.26447-11-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 1gMb6A-0001X7-7s for xen-devel@lists.xenproject.org; Tue, 13 Nov 2018 15:59:30 +0000 In-Reply-To: <20181105014047.26447-11-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 T24gTW9uLCAgNSBOb3YgMjAxOCAwMjo0MDozMyArMDEwMApTYW11ZWwgT3J0aXogPHNhbWVvQGxp bnV4LmludGVsLmNvbT4gd3JvdGU6Cgo+IFRoaXMgaXMgZ29pbmcgdG8gYmUgbmVlZGVkIGJ5IHRo ZSBoYXJkd2FyZSByZWR1Y2VkIGltcGxlbWVudGF0aW9uLCBzbwo+IGxldCdzIGV4cG9ydCBpdC4K PiBPbmNlIHRoZSBBQ1BJIGJ1aWxkZXIgbWV0aG9kcyBhbmQgZ2V0dGVycyB3aWxsIGJlIGltcGxl bWVudGVkLCB0aGUKPiBhY3BpX2dldF9wY2lfaG9zdCgpIGltcGxlbWVudGF0aW9uIHdpbGwgYmVj b21lIGhhcmR3YXJlIGFnbm9zdGljLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFNhbXVlbCBPcnRpeiA8 c2FtZW9AbGludXguaW50ZWwuY29tPgo+IC0tLQo+ICBpbmNsdWRlL2h3L2FjcGkvYW1sLWJ1aWxk LmggfCAgMiArKwo+ICBody9hY3BpL2FtbC1idWlsZC5jICAgICAgICAgfCA0MyArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKPiAgaHcvaTM4Ni9hY3BpLWJ1aWxkLmMgICAgICAgIHwg NDcgKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICAzIGZpbGVzIGNoYW5n ZWQsIDQ3IGluc2VydGlvbnMoKyksIDQ1IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9p bmNsdWRlL2h3L2FjcGkvYW1sLWJ1aWxkLmggYi9pbmNsdWRlL2h3L2FjcGkvYW1sLWJ1aWxkLmgK PiBpbmRleCBjMjdjMDkzNWFlLi5mZGUyNzg1YjlhIDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvaHcv YWNwaS9hbWwtYnVpbGQuaAo+ICsrKyBiL2luY2x1ZGUvaHcvYWNwaS9hbWwtYnVpbGQuaAo+IEBA IC00MDAsNiArNDAwLDggQEAgYnVpbGRfaGVhZGVyKEJJT1NMaW5rZXIgKmxpbmtlciwgR0FycmF5 ICp0YWJsZV9kYXRhLAo+ICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb2VtX2lkLCBjb25zdCBj aGFyICpvZW1fdGFibGVfaWQpOwo+ICB2b2lkICphY3BpX2RhdGFfcHVzaChHQXJyYXkgKnRhYmxl X2RhdGEsIHVuc2lnbmVkIHNpemUpOwo+ICB1bnNpZ25lZCBhY3BpX2RhdGFfbGVuKEdBcnJheSAq dGFibGUpOwo+ICtPYmplY3QgKmFjcGlfZ2V0X3BjaV9ob3N0KHZvaWQpOwo+ICt2b2lkIGFjcGlf Z2V0X3BjaV9ob2xlcyhSYW5nZSAqaG9sZSwgUmFuZ2UgKmhvbGU2NCk7Cj4gIC8qIEFsaWduIEFN TCBibG9iIHNpemUgdG8gYSBtdWx0aXBsZSBvZiAnYWxpZ24nICovCj4gIHZvaWQgYWNwaV9hbGln bl9zaXplKEdBcnJheSAqYmxvYiwgdW5zaWduZWQgYWxpZ24pOwo+ICB2b2lkIGFjcGlfYWRkX3Rh YmxlKEdBcnJheSAqdGFibGVfb2Zmc2V0cywgR0FycmF5ICp0YWJsZV9kYXRhKTsKPiBkaWZmIC0t Z2l0IGEvaHcvYWNwaS9hbWwtYnVpbGQuYyBiL2h3L2FjcGkvYW1sLWJ1aWxkLmMKPiBpbmRleCAy YjlhNjM2ZTc1Li5iOGUzMmYxNWY3IDEwMDY0NAo+IC0tLSBhL2h3L2FjcGkvYW1sLWJ1aWxkLmMK PiArKysgYi9ody9hY3BpL2FtbC1idWlsZC5jCj4gQEAgLTE2MDEsNiArMTYwMSw0OSBAQCB2b2lk IGFjcGlfYnVpbGRfdGFibGVzX2NsZWFudXAoQWNwaUJ1aWxkVGFibGVzICp0YWJsZXMsIGJvb2wg bWZyZSkKPiAgICAgIGdfYXJyYXlfZnJlZSh0YWJsZXMtPnZtZ2VuaWQsIG1mcmUpOwo+ICB9Cgo+ ICsvKgo+ICsgKiBCZWNhdXNlIG9mIHRoZSBQWEIgaG9zdHMgd2UgY2Fubm90IHNpbXBseSBxdWVy eSBUWVBFX1BDSV9IT1NUX0JSSURHRS4KPiArICovCj4gK09iamVjdCAqYWNwaV9nZXRfcGNpX2hv c3Qodm9pZCkKPiArewo+ICsgICAgUENJSG9zdFN0YXRlICpob3N0Owo+ICsKPiArICAgIGhvc3Qg PSBPQkpFQ1RfQ0hFQ0soUENJSG9zdFN0YXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICBv YmplY3RfcmVzb2x2ZV9wYXRoKCIvbWFjaGluZS9pNDQwZngiLCBOVUxMKSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgVFlQRV9QQ0lfSE9TVF9CUklER0UpOwo+ICsgICAgaWYgKCFob3N0KSB7 Cj4gKyAgICAgICAgaG9zdCA9IE9CSkVDVF9DSEVDSyhQQ0lIb3N0U3RhdGUsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBvYmplY3RfcmVzb2x2ZV9wYXRoKCIvbWFjaGluZS9xMzUiLCBO VUxMKSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfUENJX0hPU1RfQlJJREdF KTsKPiArICAgIH0KPiArCj4gKyAgICByZXR1cm4gT0JKRUNUKGhvc3QpOwo+ICt9CmluIGdlbmVy YWwgYW1sLWJ1aWxkLmMgaXMgYSBwbGFjZSB0byBwdXQgQUNQSSBzcGVjIHByaW1pdGl2ZXMsCnNv IEknZCBzdWdnZXN0IHRvIG1vdmUgaXQgc29tZXdoZXJlIGVsc2UuCgpDb25zaWRlcmluZyBpdCdz IHg4NiBjb2RlIChzbyBmYXIpLCBtYXliZSBtb3ZlIGl0IHRvIHNvbWV0aGluZyBsaWtlCmh3L2kz ODYvYWNwaS1wY2kuYwoKQWxzbyBpdCBtaWdodCBiZSBnb29kIHRvIGdldCByaWQgb2YgYWNwaV9n ZXRfcGNpX2hvc3QoKSBhbmQgcGFzcwphIHBvaW50ZXIgdG8gcGNpX2hvc3QgYXMgYWNwaV9zZXR1 cCgpIGFuIGFyZ3VtZW50LCBzaW5jZSBpdCdzIHN0YXRpYwpmb3IgbGlmZSBvZiBib2FyIHdlIGNh biBrZWVwIGl0IGluIEFjcGlCdWlsZFN0YXRlLCBhbmQgcmV1c2UgZm9yCm1mZy9wY2lfaG9sZS9w Y2kgYnVzIGFjY2Vzc2VzLgpUaGF0IHdheSB3ZSBjYW4gc2ltcGxpZnkgY29kZSBhIGJpdCBhbmQg YXZvaWQgbG9va3VwIGNvc3Qgb2YKb2JqZWN0X3Jlc29sdmVfcGF0aCgpIHRoYXQncyBjYWxsZWQg c2V2ZXJhbCB0aW1lcyB1bm5lY2Vzc2FyaWx5LgoKPiArdm9pZCBhY3BpX2dldF9wY2lfaG9sZXMo UmFuZ2UgKmhvbGUsIFJhbmdlICpob2xlNjQpCj4gK3sKPiArICAgIE9iamVjdCAqcGNpX2hvc3Q7 Cj4gKwo+ICsgICAgcGNpX2hvc3QgPSBhY3BpX2dldF9wY2lfaG9zdCgpOwo+ICsgICAgZ19hc3Nl cnQocGNpX2hvc3QpOwo+ICsKPiArICAgIHJhbmdlX3NldF9ib3VuZHMxKGhvbGUsCj4gKyAgICAg ICAgICAgICAgICAgICAgICBvYmplY3RfcHJvcGVydHlfZ2V0X3VpbnQocGNpX2hvc3QsCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0hPU1RfUFJP UF9QQ0lfSE9MRV9TVEFSVCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBOVUxMKSwKPiArICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9wcm9wZXJ0 eV9nZXRfdWludChwY2lfaG9zdCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBQQ0lfSE9TVF9QUk9QX1BDSV9IT0xFX0VORCwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Cj4gKyAgICByYW5nZV9z ZXRfYm91bmRzMShob2xlNjQsCj4gKyAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfcHJvcGVy dHlfZ2V0X3VpbnQocGNpX2hvc3QsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUENJX0hPU1RfUFJPUF9QQ0lfSE9MRTY0X1NUQVJULAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgb2JqZWN0X3Byb3BlcnR5X2dldF91aW50KHBjaV9ob3N0LAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9IT1NUX1BST1Bf UENJX0hPTEU2NF9FTkQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgTlVMTCkpOwo+ICt9Cj4gKwo+ICBzdGF0aWMgdm9pZCBjcnNfcmFuZ2VfaW5zZXJ0 KEdQdHJBcnJheSAqcmFuZ2VzLCB1aW50NjRfdCBiYXNlLCB1aW50NjRfdCBsaW1pdCkKPiAgewo+ ICAgICAgQ3JzUmFuZ2VFbnRyeSAqZW50cnk7Cj4gZGlmZiAtLWdpdCBhL2h3L2kzODYvYWNwaS1i dWlsZC5jIGIvaHcvaTM4Ni9hY3BpLWJ1aWxkLmMKPiBpbmRleCBiZDE0N2E2YmQyLi5hNWY1Zjgz NTAwIDEwMDY0NAo+IC0tLSBhL2h3L2kzODYvYWNwaS1idWlsZC5jCj4gKysrIGIvaHcvaTM4Ni9h Y3BpLWJ1aWxkLmMKPiBAQCAtMjMyLDQ5ICsyMzIsNiBAQCBzdGF0aWMgdm9pZCBhY3BpX2dldF9t aXNjX2luZm8oQWNwaU1pc2NJbmZvICppbmZvKQo+ICAgICAgaW5mby0+YXBwbGVzbWNfaW9fYmFz ZSA9IGFwcGxlc21jX3BvcnQoKTsKPiAgfQo+ICAKPiAtLyoKPiAtICogQmVjYXVzZSBvZiB0aGUg UFhCIGhvc3RzIHdlIGNhbm5vdCBzaW1wbHkgcXVlcnkgVFlQRV9QQ0lfSE9TVF9CUklER0UuCj4g LSAqIE9uIGkzODYgYXJjaCB3ZSBvbmx5IGhhdmUgdHdvIHBjaSBob3N0cywgc28gd2UgY2FuIGxv b2sgb25seSBmb3IgdGhlbS4KPiAtICovCj4gLXN0YXRpYyBPYmplY3QgKmFjcGlfZ2V0X2kzODZf cGNpX2hvc3Qodm9pZCkKPiAtewo+IC0gICAgUENJSG9zdFN0YXRlICpob3N0Owo+IC0KPiAtICAg IGhvc3QgPSBPQkpFQ1RfQ0hFQ0soUENJSG9zdFN0YXRlLAo+IC0gICAgICAgICAgICAgICAgICAg ICAgICBvYmplY3RfcmVzb2x2ZV9wYXRoKCIvbWFjaGluZS9pNDQwZngiLCBOVUxMKSwKPiAtICAg ICAgICAgICAgICAgICAgICAgICAgVFlQRV9QQ0lfSE9TVF9CUklER0UpOwo+IC0gICAgaWYgKCFo b3N0KSB7Cj4gLSAgICAgICAgaG9zdCA9IE9CSkVDVF9DSEVDSyhQQ0lIb3N0U3RhdGUsCj4gLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfcmVzb2x2ZV9wYXRoKCIvbWFjaGluZS9x MzUiLCBOVUxMKSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfUENJX0hPU1Rf QlJJREdFKTsKPiAtICAgIH0KPiAtCj4gLSAgICByZXR1cm4gT0JKRUNUKGhvc3QpOwo+IC19Cj4g LQo+IC1zdGF0aWMgdm9pZCBhY3BpX2dldF9wY2lfaG9sZXMoUmFuZ2UgKmhvbGUsIFJhbmdlICpo b2xlNjQpCj4gLXsKPiAtICAgIE9iamVjdCAqcGNpX2hvc3Q7Cj4gLQo+IC0gICAgcGNpX2hvc3Qg PSBhY3BpX2dldF9pMzg2X3BjaV9ob3N0KCk7Cj4gLSAgICBnX2Fzc2VydChwY2lfaG9zdCk7Cj4g LQo+IC0gICAgcmFuZ2Vfc2V0X2JvdW5kczEoaG9sZSwKPiAtICAgICAgICAgICAgICAgICAgICAg IG9iamVjdF9wcm9wZXJ0eV9nZXRfdWludChwY2lfaG9zdCwKPiAtICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfSE9TVF9QUk9QX1BDSV9IT0xFX1NUQVJU LAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwp LAo+IC0gICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3Byb3BlcnR5X2dldF91aW50KHBjaV9o b3N0LAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBD SV9IT1NUX1BST1BfUENJX0hPTEVfRU5ELAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKPiAtICAgIHJhbmdlX3NldF9ib3VuZHMxKGhvbGU2 NCwKPiAtICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9wcm9wZXJ0eV9nZXRfdWludChwY2lf aG9zdCwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQ Q0lfSE9TVF9QUk9QX1BDSV9IT0xFNjRfU1RBUlQsCj4gLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCksCj4gLSAgICAgICAgICAgICAgICAgICAgICBv YmplY3RfcHJvcGVydHlfZ2V0X3VpbnQocGNpX2hvc3QsCj4gLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0hPU1RfUFJPUF9QQ0lfSE9MRTY0X0VORCwK PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7 Cj4gLX0KPiAtCj4gIC8qIEZBQ1MgKi8KPiAgc3RhdGljIHZvaWQKPiAgYnVpbGRfZmFjcyhHQXJy YXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlcikKPiBAQCAtMTYzNCw3ICsxNTkxLDcg QEAgYnVpbGRfZHNkdChHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwKPiAg ICAgICAgICBPYmplY3QgKnBjaV9ob3N0Owo+ICAgICAgICAgIFBDSUJ1cyAqYnVzID0gTlVMTDsK PiAgCj4gLSAgICAgICAgcGNpX2hvc3QgPSBhY3BpX2dldF9pMzg2X3BjaV9ob3N0KCk7Cj4gKyAg ICAgICAgcGNpX2hvc3QgPSBhY3BpX2dldF9wY2lfaG9zdCgpOwo+ICAgICAgICAgIGlmIChwY2lf aG9zdCkgewo+ICAgICAgICAgICAgICBidXMgPSBQQ0lfSE9TVF9CUklER0UocGNpX2hvc3QpLT5i dXM7Cj4gICAgICAgICAgfQo+IEBAIC0yMDA4LDcgKzE5NjUsNyBAQCBzdGF0aWMgYm9vbCBhY3Bp X2dldF9tY2ZnKEFjcGlNY2ZnSW5mbyAqbWNmZykKPiAgICAgIE9iamVjdCAqcGNpX2hvc3Q7Cj4g ICAgICBRT2JqZWN0ICpvOwo+ICAKPiAtICAgIHBjaV9ob3N0ID0gYWNwaV9nZXRfaTM4Nl9wY2lf aG9zdCgpOwo+ICsgICAgcGNpX2hvc3QgPSBhY3BpX2dldF9wY2lfaG9zdCgpOwo+ICAgICAgZ19h c3NlcnQocGNpX2hvc3QpOwo+ICAKPiAgICAgIG8gPSBvYmplY3RfcHJvcGVydHlfZ2V0X3FvYmpl Y3QocGNpX2hvc3QsIFBDSUVfSE9TVF9NQ0ZHX0JBU0UsIE5VTEwpOwoKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QK WGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5v cmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw=