From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50527) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjZXm-0007SN-7y for qemu-devel@nongnu.org; Thu, 02 Mar 2017 17:49:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjZXh-00070X-6T for qemu-devel@nongnu.org; Thu, 02 Mar 2017 17:49:54 -0500 Received: from mail.kernel.org ([198.145.29.136]:45248) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cjZXg-0006zx-Sd for qemu-devel@nongnu.org; Thu, 02 Mar 2017 17:49:49 -0500 Date: Thu, 2 Mar 2017 14:49:43 -0800 (PST) From: Stefano Stabellini In-Reply-To: <1488452986-24501-6-git-send-email-paul.durrant@citrix.com> Message-ID: References: <1488452986-24501-1-git-send-email-paul.durrant@citrix.com> <1488452986-24501-6-git-send-email-paul.durrant@citrix.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Subject: Re: [Qemu-devel] [PATCH v2 5/5] xen: use libxendevicemodel when available List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paul Durrant Cc: xen-devel@lists.xenproject.org, qemu-devel@nongnu.org, Stefano Stabellini , Anthony Perard On Thu, 2 Mar 2017, Paul Durrant wrote: > This patch modifies the wrapper functions in xen_common.h to use the > new xendevicemodel interface if it is available along with compatibility > code to use the old libxenctrl interface if it is not. > > Signed-off-by: Paul Durrant > --- > Cc: Stefano Stabellini > Cc: Anthony Perard > > v2: > - Add a compat define for xenforeignmemory_close() since this is now > used. > --- > include/hw/xen/xen_common.h | 115 +++++++++++++++++++++++++++++++------------- > xen-common.c | 8 +++ > 2 files changed, 90 insertions(+), 33 deletions(-) > > diff --git a/include/hw/xen/xen_common.h b/include/hw/xen/xen_common.h > index 31cf25f..48444e5 100644 > --- a/include/hw/xen/xen_common.h > +++ b/include/hw/xen/xen_common.h > @@ -9,6 +9,7 @@ > #undef XC_WANT_COMPAT_EVTCHN_API > #undef XC_WANT_COMPAT_GNTTAB_API > #undef XC_WANT_COMPAT_MAP_FOREIGN_API > +#undef XC_WANT_COMPAT_DEVICEMODEL_API > > #include > #include > @@ -26,48 +27,95 @@ extern xc_interface *xen_xc; > * We don't support Xen prior to 4.2.0. > */ > > +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 490 > + > +typedef xc_interface xendevicemodel_handle; > + > +#define xendevicemodel_open(l, f) xen_xc > + > +#define xendevicemodel_map_io_range_to_ioreq_server \ > + xc_hvm_map_io_range_to_ioreq_server > +#define xendevicemodel_unmap_io_range_from_ioreq_server \ > + xc_hvm_unmap_io_range_from_ioreq_server > +#define xendevicemodel_map_pcidev_to_ioreq_server \ > + xc_hvm_map_pcidev_to_ioreq_server > +#define xendevicemodel_unmap_pcidev_from_ioreq_server \ > + xc_hvm_unmap_pcidev_from_ioreq_server > +#define xendevicemodel_create_ioreq_server \ > + xc_hvm_create_ioreq_server > +#define xendevicemodel_destroy_ioreq_server \ > + xc_hvm_destroy_ioreq_server > +#define xendevicemodel_get_ioreq_server_info \ > + xc_hvm_get_ioreq_server_info > +#define xendevicemodel_set_ioreq_server_state \ > + xc_hvm_set_ioreq_server_state > +#define xendevicemodel_set_pci_intx_level \ > + xc_hvm_set_pci_intx_level > +#define xendevicemodel_set_pci_link_route \ > + xc_hvm_set_pci_link_route > +#define xendevicemodel_set_isa_irq_level \ > + xc_hvm_set_isa_irq_level > +#define xendevicemodel_inject_msi \ > + xc_hvm_inject_msi > +#define xendevicemodel_set_mem_type \ > + xc_hvm_set_mem_type > +#define xendevicemodel_track_dirty_vram \ > + xc_hvm_track_dirty_vram > +#define xendevicemodel_modified_memory \ > + xc_hvm_modified_memory It does build correctly now for Xen < 4.9, however it breaks against xen-unstable: ERROR: configure test passed without -Werror but failed with -Werror. This is probably a bug in the configure script. The failing command will be at the bottom of config.log. You can run configure with --disable-werror to bypass this check. and config.log says: config-temp/qemu-conf.c: In function 'main': config-temp/qemu-conf.c:32:3: error: implicit declaration of function 'xc_hvm_set_mem_type' [-Werror=implicit-function-declaration] config-temp/qemu-conf.c:32:3: error: nested extern declaration of 'xc_hvm_set_mem_type' [-Werror=nested-externs] config-temp/qemu-conf.c:34:3: error: implicit declaration of function 'xc_hvm_inject_msi' [-Werror=implicit-function-declaration] config-temp/qemu-conf.c:34:3: error: nested extern declaration of 'xc_hvm_inject_msi' [-Werror=nested-externs] config-temp/qemu-conf.c:35:3: error: implicit declaration of function 'xc_hvm_create_ioreq_server' [-Werror=implicit-function-declaration] config-temp/qemu-conf.c:35:3: error: nested extern declaration of 'xc_hvm_create_ioreq_server' [-Werror=nested-externs] With -DXC_WANT_COMPAT_DEVICEMODEL_API=1: In file included from /local/qemu-upstream/include/hw/xen/xen_backend.h:4:0, from hw/block/xen_disk.c:27: /local/qemu-upstream/include/hw/xen/xen_common.h: In function 'xen_set_mem_type': /local/qemu-upstream/include/hw/xen/xen_common.h:78:5: error: implicit declaration of function 'xc_hvm_set_mem_type' [-Werror=implicit-function-declaration] Only another comment (I guess you didn't see in my previous email): could you please use static inline functions for compatibility rather than macros? That way we are going to have some more compile time checks. Or at least macros with parameters. > +#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 490 */ > + > +#include > + > +#endif > + > +extern xendevicemodel_handle *xen_dmod; > + > static inline int xen_set_mem_type(domid_t domid, hvmmem_type_t type, > uint64_t first_pfn, uint32_t nr) > { > - return xc_hvm_set_mem_type(xen_xc, domid, type, first_pfn, nr); > + return xendevicemodel_set_mem_type(xen_dmod, domid, type, first_pfn, > + nr); > } > > static inline int xen_set_pci_intx_level(domid_t domid, uint16_t segment, > uint8_t bus, uint8_t device, > uint8_t intx, unsigned int level) > { > - return xc_hvm_set_pci_intx_level(xen_xc, domid, segment, bus, device, > - intx, level); > + return xendevicemodel_set_pci_intx_level(xen_dmod, domid, segment, bus, > + device, intx, level); > } > > static inline int xen_set_pci_link_route(domid_t domid, uint8_t link, > uint8_t irq) > { > - return xc_hvm_set_pci_link_route(xen_xc, domid, link, irq); > + return xendevicemodel_set_pci_link_route(xen_dmod, domid, link, irq); > } > > static inline int xen_inject_msi(domid_t domid, uint64_t msi_addr, > uint32_t msi_data) > { > - return xc_hvm_inject_msi(xen_xc, domid, msi_addr, msi_data); > + return xendevicemodel_inject_msi(xen_dmod, domid, msi_addr, msi_data); > } > > static inline int xen_set_isa_irq_level(domid_t domid, uint8_t irq, > unsigned int level) > { > - return xc_hvm_set_isa_irq_level(xen_xc, domid, irq, level); > + return xendevicemodel_set_isa_irq_level(xen_dmod, domid, irq, level); > } > > static inline int xen_track_dirty_vram(domid_t domid, uint64_t first_pfn, > uint32_t nr, unsigned long *bitmap) > { > - return xc_hvm_track_dirty_vram(xen_xc, domid, first_pfn, nr, bitmap); > + return xendevicemodel_track_dirty_vram(xen_dmod, domid, first_pfn, nr, > + bitmap); > } > > static inline int xen_modified_memory(domid_t domid, uint64_t first_pfn, > uint32_t nr) > { > - return xc_hvm_modified_memory(xen_xc, domid, first_pfn, nr); > + return xendevicemodel_modified_memory(xen_dmod, domid, first_pfn, nr); > } > > /* Xen 4.2 through 4.6 */ > @@ -97,6 +145,7 @@ typedef xc_gnttab xengnttab_handle; > xc_gnttab_map_domain_grant_refs(h, c, d, r, p) > > #define xenforeignmemory_open(l, f) xen_xc > +#define xenforeignmemory_close(h) > > static inline void *xenforeignmemory_map(xc_interface *h, uint32_t dom, > int prot, size_t pages, > @@ -285,8 +334,8 @@ static inline void xen_map_memory_section(domid_t dom, > } > > trace_xen_map_mmio_range(ioservid, start_addr, end_addr); > - xc_hvm_map_io_range_to_ioreq_server(xen_xc, dom, ioservid, 1, > - start_addr, end_addr); > + xendevicemodel_map_io_range_to_ioreq_server(xen_dmod, dom, ioservid, 1, > + start_addr, end_addr); > } > > static inline void xen_unmap_memory_section(domid_t dom, > @@ -302,8 +351,8 @@ static inline void xen_unmap_memory_section(domid_t dom, > } > > trace_xen_unmap_mmio_range(ioservid, start_addr, end_addr); > - xc_hvm_unmap_io_range_from_ioreq_server(xen_xc, dom, ioservid, > - 1, start_addr, end_addr); > + xendevicemodel_unmap_io_range_from_ioreq_server(xen_dmod, dom, ioservid, > + 1, start_addr, end_addr); > } > > static inline void xen_map_io_section(domid_t dom, > @@ -319,8 +368,8 @@ static inline void xen_map_io_section(domid_t dom, > } > > trace_xen_map_portio_range(ioservid, start_addr, end_addr); > - xc_hvm_map_io_range_to_ioreq_server(xen_xc, dom, ioservid, 0, > - start_addr, end_addr); > + xendevicemodel_map_io_range_to_ioreq_server(xen_dmod, dom, ioservid, 0, > + start_addr, end_addr); > } > > static inline void xen_unmap_io_section(domid_t dom, > @@ -336,8 +385,8 @@ static inline void xen_unmap_io_section(domid_t dom, > } > > trace_xen_unmap_portio_range(ioservid, start_addr, end_addr); > - xc_hvm_unmap_io_range_from_ioreq_server(xen_xc, dom, ioservid, > - 0, start_addr, end_addr); > + xendevicemodel_unmap_io_range_from_ioreq_server(xen_dmod, dom, ioservid, > + 0, start_addr, end_addr); > } > > static inline void xen_map_pcidev(domid_t dom, > @@ -350,10 +399,10 @@ static inline void xen_map_pcidev(domid_t dom, > > trace_xen_map_pcidev(ioservid, pci_bus_num(pci_dev->bus), > PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); > - xc_hvm_map_pcidev_to_ioreq_server(xen_xc, dom, ioservid, 0, > - pci_bus_num(pci_dev->bus), > - PCI_SLOT(pci_dev->devfn), > - PCI_FUNC(pci_dev->devfn)); > + xendevicemodel_map_pcidev_to_ioreq_server(xen_dmod, dom, ioservid, 0, > + pci_bus_num(pci_dev->bus), > + PCI_SLOT(pci_dev->devfn), > + PCI_FUNC(pci_dev->devfn)); > } > > static inline void xen_unmap_pcidev(domid_t dom, > @@ -366,18 +415,18 @@ static inline void xen_unmap_pcidev(domid_t dom, > > trace_xen_unmap_pcidev(ioservid, pci_bus_num(pci_dev->bus), > PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); > - xc_hvm_unmap_pcidev_from_ioreq_server(xen_xc, dom, ioservid, 0, > - pci_bus_num(pci_dev->bus), > - PCI_SLOT(pci_dev->devfn), > - PCI_FUNC(pci_dev->devfn)); > + xendevicemodel_unmap_pcidev_from_ioreq_server(xen_dmod, dom, ioservid, 0, > + pci_bus_num(pci_dev->bus), > + PCI_SLOT(pci_dev->devfn), > + PCI_FUNC(pci_dev->devfn)); > } > > static inline void xen_create_ioreq_server(domid_t dom, > ioservid_t *ioservid) > { > - int rc = xc_hvm_create_ioreq_server(xen_xc, dom, > - HVM_IOREQSRV_BUFIOREQ_ATOMIC, > - ioservid); > + int rc = xendevicemodel_create_ioreq_server(xen_dmod, dom, > + HVM_IOREQSRV_BUFIOREQ_ATOMIC, > + ioservid); > > if (rc == 0) { > trace_xen_ioreq_server_create(*ioservid); > @@ -397,7 +446,7 @@ static inline void xen_destroy_ioreq_server(domid_t dom, > } > > trace_xen_ioreq_server_destroy(ioservid); > - xc_hvm_destroy_ioreq_server(xen_xc, dom, ioservid); > + xendevicemodel_destroy_ioreq_server(xen_dmod, dom, ioservid); > } > > static inline int xen_get_ioreq_server_info(domid_t dom, > @@ -412,9 +461,9 @@ static inline int xen_get_ioreq_server_info(domid_t dom, > bufioreq_evtchn); > } > > - return xc_hvm_get_ioreq_server_info(xen_xc, dom, ioservid, > - ioreq_pfn, bufioreq_pfn, > - bufioreq_evtchn); > + return xendevicemodel_get_ioreq_server_info(xen_dmod, dom, ioservid, > + ioreq_pfn, bufioreq_pfn, > + bufioreq_evtchn); > } > > static inline int xen_set_ioreq_server_state(domid_t dom, > @@ -426,8 +475,8 @@ static inline int xen_set_ioreq_server_state(domid_t dom, > } > > trace_xen_ioreq_server_state(ioservid, enable); > - return xc_hvm_set_ioreq_server_state(xen_xc, dom, ioservid, > - enable); > + return xendevicemodel_set_ioreq_server_state(xen_dmod, dom, ioservid, > + enable); > } > > #endif > diff --git a/xen-common.c b/xen-common.c > index 703e7a5..ae76150 100644 > --- a/xen-common.c > +++ b/xen-common.c > @@ -27,6 +27,7 @@ > > xc_interface *xen_xc; > xenforeignmemory_handle *xen_fmem; > +xendevicemodel_handle *xen_dmod; > > static int store_dev_info(int domid, Chardev *cs, const char *string) > { > @@ -128,6 +129,13 @@ static int xen_init(MachineState *ms) > xc_interface_close(xen_xc); > return -1; > } > + xen_dmod = xendevicemodel_open(0, 0); > + if (xen_dmod == NULL) { > + xen_pv_printf(NULL, 0, "can't open xen devicemodel interface\n"); > + xenforeignmemory_close(xen_fmem); > + xc_interface_close(xen_xc); > + return -1; > + } > qemu_add_vm_change_state_handler(xen_change_state_handler, NULL); > > global_state_set_optional(); > -- > 2.1.4 > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Stabellini Subject: Re: [PATCH v2 5/5] xen: use libxendevicemodel when available Date: Thu, 2 Mar 2017 14:49:43 -0800 (PST) Message-ID: References: <1488452986-24501-1-git-send-email-paul.durrant@citrix.com> <1488452986-24501-6-git-send-email-paul.durrant@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cjZXi-0004ke-P9 for xen-devel@lists.xenproject.org; Thu, 02 Mar 2017 22:49:50 +0000 In-Reply-To: <1488452986-24501-6-git-send-email-paul.durrant@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Paul Durrant Cc: Anthony Perard , xen-devel@lists.xenproject.org, Stefano Stabellini , qemu-devel@nongnu.org List-Id: xen-devel@lists.xenproject.org T24gVGh1LCAyIE1hciAyMDE3LCBQYXVsIER1cnJhbnQgd3JvdGU6Cj4gVGhpcyBwYXRjaCBtb2Rp ZmllcyB0aGUgd3JhcHBlciBmdW5jdGlvbnMgaW4geGVuX2NvbW1vbi5oIHRvIHVzZSB0aGUKPiBu ZXcgeGVuZGV2aWNlbW9kZWwgaW50ZXJmYWNlIGlmIGl0IGlzIGF2YWlsYWJsZSBhbG9uZyB3aXRo IGNvbXBhdGliaWxpdHkKPiBjb2RlIHRvIHVzZSB0aGUgb2xkIGxpYnhlbmN0cmwgaW50ZXJmYWNl IGlmIGl0IGlzIG5vdC4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBQYXVsIER1cnJhbnQgPHBhdWwuZHVy cmFudEBjaXRyaXguY29tPgo+IC0tLQo+IENjOiBTdGVmYW5vIFN0YWJlbGxpbmkgPHNzdGFiZWxs aW5pQGtlcm5lbC5vcmc+Cj4gQ2M6IEFudGhvbnkgUGVyYXJkIDxhbnRob255LnBlcmFyZEBjaXRy aXguY29tPgo+IAo+IHYyOgo+IC0gQWRkIGEgY29tcGF0IGRlZmluZSBmb3IgeGVuZm9yZWlnbm1l bW9yeV9jbG9zZSgpIHNpbmNlIHRoaXMgaXMgbm93Cj4gICB1c2VkLgo+IC0tLQo+ICBpbmNsdWRl L2h3L3hlbi94ZW5fY29tbW9uLmggfCAxMTUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Ky0tLS0tLS0tLS0tLS0KPiAgeGVuLWNvbW1vbi5jICAgICAgICAgICAgICAgIHwgICA4ICsrKwo+ ICAyIGZpbGVzIGNoYW5nZWQsIDkwIGluc2VydGlvbnMoKyksIDMzIGRlbGV0aW9ucygtKQo+IAo+ IGRpZmYgLS1naXQgYS9pbmNsdWRlL2h3L3hlbi94ZW5fY29tbW9uLmggYi9pbmNsdWRlL2h3L3hl bi94ZW5fY29tbW9uLmgKPiBpbmRleCAzMWNmMjVmLi40ODQ0NGU1IDEwMDY0NAo+IC0tLSBhL2lu Y2x1ZGUvaHcveGVuL3hlbl9jb21tb24uaAo+ICsrKyBiL2luY2x1ZGUvaHcveGVuL3hlbl9jb21t b24uaAo+IEBAIC05LDYgKzksNyBAQAo+ICAjdW5kZWYgWENfV0FOVF9DT01QQVRfRVZUQ0hOX0FQ SQo+ICAjdW5kZWYgWENfV0FOVF9DT01QQVRfR05UVEFCX0FQSQo+ICAjdW5kZWYgWENfV0FOVF9D T01QQVRfTUFQX0ZPUkVJR05fQVBJCj4gKyN1bmRlZiBYQ19XQU5UX0NPTVBBVF9ERVZJQ0VNT0RF TF9BUEkKPiAgCj4gICNpbmNsdWRlIDx4ZW5jdHJsLmg+Cj4gICNpbmNsdWRlIDx4ZW5zdG9yZS5o Pgo+IEBAIC0yNiw0OCArMjcsOTUgQEAgZXh0ZXJuIHhjX2ludGVyZmFjZSAqeGVuX3hjOwo+ICAg KiBXZSBkb24ndCBzdXBwb3J0IFhlbiBwcmlvciB0byA0LjIuMC4KPiAgICovCj4gIAo+ICsjaWYg Q09ORklHX1hFTl9DVFJMX0lOVEVSRkFDRV9WRVJTSU9OIDwgNDkwCj4gKwo+ICt0eXBlZGVmIHhj X2ludGVyZmFjZSB4ZW5kZXZpY2Vtb2RlbF9oYW5kbGU7Cj4gKwo+ICsjZGVmaW5lIHhlbmRldmlj ZW1vZGVsX29wZW4obCwgZikgeGVuX3hjCj4gKwo+ICsjZGVmaW5lIHhlbmRldmljZW1vZGVsX21h cF9pb19yYW5nZV90b19pb3JlcV9zZXJ2ZXIgXAo+ICsgICAgeGNfaHZtX21hcF9pb19yYW5nZV90 b19pb3JlcV9zZXJ2ZXIKPiArI2RlZmluZSB4ZW5kZXZpY2Vtb2RlbF91bm1hcF9pb19yYW5nZV9m cm9tX2lvcmVxX3NlcnZlciBcCj4gKyAgICB4Y19odm1fdW5tYXBfaW9fcmFuZ2VfZnJvbV9pb3Jl cV9zZXJ2ZXIKPiArI2RlZmluZSB4ZW5kZXZpY2Vtb2RlbF9tYXBfcGNpZGV2X3RvX2lvcmVxX3Nl cnZlciBcCj4gKyAgICB4Y19odm1fbWFwX3BjaWRldl90b19pb3JlcV9zZXJ2ZXIKPiArI2RlZmlu ZSB4ZW5kZXZpY2Vtb2RlbF91bm1hcF9wY2lkZXZfZnJvbV9pb3JlcV9zZXJ2ZXIgXAo+ICsgICAg eGNfaHZtX3VubWFwX3BjaWRldl9mcm9tX2lvcmVxX3NlcnZlcgo+ICsjZGVmaW5lIHhlbmRldmlj ZW1vZGVsX2NyZWF0ZV9pb3JlcV9zZXJ2ZXIgXAo+ICsgICAgeGNfaHZtX2NyZWF0ZV9pb3JlcV9z ZXJ2ZXIKPiArI2RlZmluZSB4ZW5kZXZpY2Vtb2RlbF9kZXN0cm95X2lvcmVxX3NlcnZlciBcCj4g KyAgICB4Y19odm1fZGVzdHJveV9pb3JlcV9zZXJ2ZXIKPiArI2RlZmluZSB4ZW5kZXZpY2Vtb2Rl bF9nZXRfaW9yZXFfc2VydmVyX2luZm8gXAo+ICsgICAgeGNfaHZtX2dldF9pb3JlcV9zZXJ2ZXJf aW5mbwo+ICsjZGVmaW5lIHhlbmRldmljZW1vZGVsX3NldF9pb3JlcV9zZXJ2ZXJfc3RhdGUgXAo+ ICsgICAgeGNfaHZtX3NldF9pb3JlcV9zZXJ2ZXJfc3RhdGUKPiArI2RlZmluZSB4ZW5kZXZpY2Vt b2RlbF9zZXRfcGNpX2ludHhfbGV2ZWwgXAo+ICsgICAgeGNfaHZtX3NldF9wY2lfaW50eF9sZXZl bAo+ICsjZGVmaW5lIHhlbmRldmljZW1vZGVsX3NldF9wY2lfbGlua19yb3V0ZSBcCj4gKyAgICB4 Y19odm1fc2V0X3BjaV9saW5rX3JvdXRlCj4gKyNkZWZpbmUgeGVuZGV2aWNlbW9kZWxfc2V0X2lz YV9pcnFfbGV2ZWwgXAo+ICsgICAgeGNfaHZtX3NldF9pc2FfaXJxX2xldmVsCj4gKyNkZWZpbmUg eGVuZGV2aWNlbW9kZWxfaW5qZWN0X21zaSBcCj4gKyAgICB4Y19odm1faW5qZWN0X21zaQo+ICsj ZGVmaW5lIHhlbmRldmljZW1vZGVsX3NldF9tZW1fdHlwZSBcCj4gKyAgICB4Y19odm1fc2V0X21l bV90eXBlCj4gKyNkZWZpbmUgeGVuZGV2aWNlbW9kZWxfdHJhY2tfZGlydHlfdnJhbSBcCj4gKyAg ICB4Y19odm1fdHJhY2tfZGlydHlfdnJhbQo+ICsjZGVmaW5lIHhlbmRldmljZW1vZGVsX21vZGlm aWVkX21lbW9yeSBcCj4gKyAgICB4Y19odm1fbW9kaWZpZWRfbWVtb3J5CgpJdCBkb2VzIGJ1aWxk IGNvcnJlY3RseSBub3cgZm9yIFhlbiA8IDQuOSwgaG93ZXZlciBpdCBicmVha3MgYWdhaW5zdAp4 ZW4tdW5zdGFibGU6CgogIEVSUk9SOiBjb25maWd1cmUgdGVzdCBwYXNzZWQgd2l0aG91dCAtV2Vy cm9yIGJ1dCBmYWlsZWQgd2l0aCAtV2Vycm9yLgogICAgICAgICBUaGlzIGlzIHByb2JhYmx5IGEg YnVnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LiBUaGUgZmFpbGluZyBjb21tYW5kCiAgICAgICAg IHdpbGwgYmUgYXQgdGhlIGJvdHRvbSBvZiBjb25maWcubG9nLgogICAgICAgICBZb3UgY2FuIHJ1 biBjb25maWd1cmUgd2l0aCAtLWRpc2FibGUtd2Vycm9yIHRvIGJ5cGFzcyB0aGlzIGNoZWNrLgoK YW5kIGNvbmZpZy5sb2cgc2F5czoKCiAgY29uZmlnLXRlbXAvcWVtdS1jb25mLmM6IEluIGZ1bmN0 aW9uICdtYWluJzoKICBjb25maWctdGVtcC9xZW11LWNvbmYuYzozMjozOiBlcnJvcjogaW1wbGlj aXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gJ3hjX2h2bV9zZXRfbWVtX3R5cGUnIFstV2Vycm9y PWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uXQogIGNvbmZpZy10ZW1wL3FlbXUtY29uZi5j OjMyOjM6IGVycm9yOiBuZXN0ZWQgZXh0ZXJuIGRlY2xhcmF0aW9uIG9mICd4Y19odm1fc2V0X21l bV90eXBlJyBbLVdlcnJvcj1uZXN0ZWQtZXh0ZXJuc10KICBjb25maWctdGVtcC9xZW11LWNvbmYu YzozNDozOiBlcnJvcjogaW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gJ3hjX2h2bV9p bmplY3RfbXNpJyBbLVdlcnJvcj1pbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbl0KICBjb25m aWctdGVtcC9xZW11LWNvbmYuYzozNDozOiBlcnJvcjogbmVzdGVkIGV4dGVybiBkZWNsYXJhdGlv biBvZiAneGNfaHZtX2luamVjdF9tc2knIFstV2Vycm9yPW5lc3RlZC1leHRlcm5zXQogIGNvbmZp Zy10ZW1wL3FlbXUtY29uZi5jOjM1OjM6IGVycm9yOiBpbXBsaWNpdCBkZWNsYXJhdGlvbiBvZiBm dW5jdGlvbiAneGNfaHZtX2NyZWF0ZV9pb3JlcV9zZXJ2ZXInIFstV2Vycm9yPWltcGxpY2l0LWZ1 bmN0aW9uLWRlY2xhcmF0aW9uXQogIGNvbmZpZy10ZW1wL3FlbXUtY29uZi5jOjM1OjM6IGVycm9y OiBuZXN0ZWQgZXh0ZXJuIGRlY2xhcmF0aW9uIG9mICd4Y19odm1fY3JlYXRlX2lvcmVxX3NlcnZl cicgWy1XZXJyb3I9bmVzdGVkLWV4dGVybnNdCgoKV2l0aCAtRFhDX1dBTlRfQ09NUEFUX0RFVklD RU1PREVMX0FQST0xOgoKICBJbiBmaWxlIGluY2x1ZGVkIGZyb20gL2xvY2FsL3FlbXUtdXBzdHJl YW0vaW5jbHVkZS9ody94ZW4veGVuX2JhY2tlbmQuaDo0OjAsCiAgICAgICAgICAgICAgICAgICBm cm9tIGh3L2Jsb2NrL3hlbl9kaXNrLmM6Mjc6CiAgL2xvY2FsL3FlbXUtdXBzdHJlYW0vaW5jbHVk ZS9ody94ZW4veGVuX2NvbW1vbi5oOiBJbiBmdW5jdGlvbiAneGVuX3NldF9tZW1fdHlwZSc6CiAg L2xvY2FsL3FlbXUtdXBzdHJlYW0vaW5jbHVkZS9ody94ZW4veGVuX2NvbW1vbi5oOjc4OjU6IGVy cm9yOiBpbXBsaWNpdCBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbiAneGNfaHZtX3NldF9tZW1fdHlw ZScgWy1XZXJyb3I9aW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb25dCgoKT25seSBhbm90aGVy IGNvbW1lbnQgKEkgZ3Vlc3MgeW91IGRpZG4ndCBzZWUgaW4gbXkgcHJldmlvdXMgZW1haWwpOgpj b3VsZCB5b3UgcGxlYXNlIHVzZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9ucyBmb3IgY29tcGF0aWJp bGl0eSByYXRoZXIKdGhhbiBtYWNyb3M/IFRoYXQgd2F5IHdlIGFyZSBnb2luZyB0byBoYXZlIHNv bWUgbW9yZSBjb21waWxlIHRpbWUKY2hlY2tzLiBPciBhdCBsZWFzdCBtYWNyb3Mgd2l0aCBwYXJh bWV0ZXJzLgoKCj4gKyNlbHNlIC8qIENPTkZJR19YRU5fQ1RSTF9JTlRFUkZBQ0VfVkVSU0lPTiA+ PSA0OTAgKi8KPiArCj4gKyNpbmNsdWRlIDx4ZW5kZXZpY2Vtb2RlbC5oPgo+ICsKPiArI2VuZGlm Cj4gKwo+ICtleHRlcm4geGVuZGV2aWNlbW9kZWxfaGFuZGxlICp4ZW5fZG1vZDsKPiArCj4gIHN0 YXRpYyBpbmxpbmUgaW50IHhlbl9zZXRfbWVtX3R5cGUoZG9taWRfdCBkb21pZCwgaHZtbWVtX3R5 cGVfdCB0eXBlLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90 IGZpcnN0X3BmbiwgdWludDMyX3QgbnIpCj4gIHsKPiAtICAgIHJldHVybiB4Y19odm1fc2V0X21l bV90eXBlKHhlbl94YywgZG9taWQsIHR5cGUsIGZpcnN0X3BmbiwgbnIpOwo+ICsgICAgcmV0dXJu IHhlbmRldmljZW1vZGVsX3NldF9tZW1fdHlwZSh4ZW5fZG1vZCwgZG9taWQsIHR5cGUsIGZpcnN0 X3BmbiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnIpOwo+ICB9 Cj4gIAo+ICBzdGF0aWMgaW5saW5lIGludCB4ZW5fc2V0X3BjaV9pbnR4X2xldmVsKGRvbWlkX3Qg ZG9taWQsIHVpbnQxNl90IHNlZ21lbnQsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdWludDhfdCBidXMsIHVpbnQ4X3QgZGV2aWNlLAo+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW50eCwgdW5zaWduZWQgaW50IGxl dmVsKQo+ICB7Cj4gLSAgICByZXR1cm4geGNfaHZtX3NldF9wY2lfaW50eF9sZXZlbCh4ZW5feGMs IGRvbWlkLCBzZWdtZW50LCBidXMsIGRldmljZSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGludHgsIGxldmVsKTsKPiArICAgIHJldHVybiB4ZW5kZXZpY2Vtb2RlbF9z ZXRfcGNpX2ludHhfbGV2ZWwoeGVuX2Rtb2QsIGRvbWlkLCBzZWdtZW50LCBidXMsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgaW50eCwgbGV2 ZWwpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgaW5saW5lIGludCB4ZW5fc2V0X3BjaV9saW5rX3JvdXRl KGRvbWlkX3QgZG9taWQsIHVpbnQ4X3QgbGluaywKPiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB1aW50OF90IGlycSkKPiAgewo+IC0gICAgcmV0dXJuIHhjX2h2bV9z ZXRfcGNpX2xpbmtfcm91dGUoeGVuX3hjLCBkb21pZCwgbGluaywgaXJxKTsKPiArICAgIHJldHVy biB4ZW5kZXZpY2Vtb2RlbF9zZXRfcGNpX2xpbmtfcm91dGUoeGVuX2Rtb2QsIGRvbWlkLCBsaW5r LCBpcnEpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgaW5saW5lIGludCB4ZW5faW5qZWN0X21zaShkb21p ZF90IGRvbWlkLCB1aW50NjRfdCBtc2lfYWRkciwKPiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdWludDMyX3QgbXNpX2RhdGEpCj4gIHsKPiAtICAgIHJldHVybiB4Y19odm1faW5q ZWN0X21zaSh4ZW5feGMsIGRvbWlkLCBtc2lfYWRkciwgbXNpX2RhdGEpOwo+ICsgICAgcmV0dXJu IHhlbmRldmljZW1vZGVsX2luamVjdF9tc2koeGVuX2Rtb2QsIGRvbWlkLCBtc2lfYWRkciwgbXNp X2RhdGEpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgaW5saW5lIGludCB4ZW5fc2V0X2lzYV9pcnFfbGV2 ZWwoZG9taWRfdCBkb21pZCwgdWludDhfdCBpcnEsCj4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGV2ZWwpCj4gIHsKPiAtICAgIHJldHVybiB4 Y19odm1fc2V0X2lzYV9pcnFfbGV2ZWwoeGVuX3hjLCBkb21pZCwgaXJxLCBsZXZlbCk7Cj4gKyAg ICByZXR1cm4geGVuZGV2aWNlbW9kZWxfc2V0X2lzYV9pcnFfbGV2ZWwoeGVuX2Rtb2QsIGRvbWlk LCBpcnEsIGxldmVsKTsKPiAgfQo+ICAKPiAgc3RhdGljIGlubGluZSBpbnQgeGVuX3RyYWNrX2Rp cnR5X3ZyYW0oZG9taWRfdCBkb21pZCwgdWludDY0X3QgZmlyc3RfcGZuLAo+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuciwgdW5zaWduZWQgbG9uZyAq Yml0bWFwKQo+ICB7Cj4gLSAgICByZXR1cm4geGNfaHZtX3RyYWNrX2RpcnR5X3ZyYW0oeGVuX3hj LCBkb21pZCwgZmlyc3RfcGZuLCBuciwgYml0bWFwKTsKPiArICAgIHJldHVybiB4ZW5kZXZpY2Vt b2RlbF90cmFja19kaXJ0eV92cmFtKHhlbl9kbW9kLCBkb21pZCwgZmlyc3RfcGZuLCBuciwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCk7Cj4gIH0K PiAgCj4gIHN0YXRpYyBpbmxpbmUgaW50IHhlbl9tb2RpZmllZF9tZW1vcnkoZG9taWRfdCBkb21p ZCwgdWludDY0X3QgZmlyc3RfcGZuLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHVpbnQzMl90IG5yKQo+ICB7Cj4gLSAgICByZXR1cm4geGNfaHZtX21vZGlmaWVkX21l bW9yeSh4ZW5feGMsIGRvbWlkLCBmaXJzdF9wZm4sIG5yKTsKPiArICAgIHJldHVybiB4ZW5kZXZp Y2Vtb2RlbF9tb2RpZmllZF9tZW1vcnkoeGVuX2Rtb2QsIGRvbWlkLCBmaXJzdF9wZm4sIG5yKTsK PiAgfQo+ICAKPiAgLyogWGVuIDQuMiB0aHJvdWdoIDQuNiAqLwo+IEBAIC05Nyw2ICsxNDUsNyBA QCB0eXBlZGVmIHhjX2dudHRhYiB4ZW5nbnR0YWJfaGFuZGxlOwo+ICAgICAgeGNfZ250dGFiX21h cF9kb21haW5fZ3JhbnRfcmVmcyhoLCBjLCBkLCByLCBwKQo+ICAKPiAgI2RlZmluZSB4ZW5mb3Jl aWdubWVtb3J5X29wZW4obCwgZikgeGVuX3hjCj4gKyNkZWZpbmUgeGVuZm9yZWlnbm1lbW9yeV9j bG9zZShoKQo+ICAKPiAgc3RhdGljIGlubGluZSB2b2lkICp4ZW5mb3JlaWdubWVtb3J5X21hcCh4 Y19pbnRlcmZhY2UgKmgsIHVpbnQzMl90IGRvbSwKPiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpbnQgcHJvdCwgc2l6ZV90IHBhZ2VzLAo+IEBAIC0yODUsOCArMzM0 LDggQEAgc3RhdGljIGlubGluZSB2b2lkIHhlbl9tYXBfbWVtb3J5X3NlY3Rpb24oZG9taWRfdCBk b20sCj4gICAgICB9Cj4gIAo+ICAgICAgdHJhY2VfeGVuX21hcF9tbWlvX3JhbmdlKGlvc2Vydmlk LCBzdGFydF9hZGRyLCBlbmRfYWRkcik7Cj4gLSAgICB4Y19odm1fbWFwX2lvX3JhbmdlX3RvX2lv cmVxX3NlcnZlcih4ZW5feGMsIGRvbSwgaW9zZXJ2aWQsIDEsCj4gLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZGRyLCBlbmRfYWRkcik7Cj4gKyAgICB4ZW5k ZXZpY2Vtb2RlbF9tYXBfaW9fcmFuZ2VfdG9faW9yZXFfc2VydmVyKHhlbl9kbW9kLCBkb20sIGlv c2VydmlkLCAxLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzdGFydF9hZGRyLCBlbmRfYWRkcik7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbmxpbmUgdm9p ZCB4ZW5fdW5tYXBfbWVtb3J5X3NlY3Rpb24oZG9taWRfdCBkb20sCj4gQEAgLTMwMiw4ICszNTEs OCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3VubWFwX21lbW9yeV9zZWN0aW9uKGRvbWlkX3Qg ZG9tLAo+ICAgICAgfQo+ICAKPiAgICAgIHRyYWNlX3hlbl91bm1hcF9tbWlvX3JhbmdlKGlvc2Vy dmlkLCBzdGFydF9hZGRyLCBlbmRfYWRkcik7Cj4gLSAgICB4Y19odm1fdW5tYXBfaW9fcmFuZ2Vf ZnJvbV9pb3JlcV9zZXJ2ZXIoeGVuX3hjLCBkb20sIGlvc2VydmlkLAo+IC0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHN0YXJ0X2FkZHIsIGVuZF9hZGRyKTsK PiArICAgIHhlbmRldmljZW1vZGVsX3VubWFwX2lvX3JhbmdlX2Zyb21faW9yZXFfc2VydmVyKHhl bl9kbW9kLCBkb20sIGlvc2VydmlkLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgMSwgc3RhcnRfYWRkciwgZW5kX2FkZHIpOwo+ICB9Cj4gIAo+ ICBzdGF0aWMgaW5saW5lIHZvaWQgeGVuX21hcF9pb19zZWN0aW9uKGRvbWlkX3QgZG9tLAo+IEBA IC0zMTksOCArMzY4LDggQEAgc3RhdGljIGlubGluZSB2b2lkIHhlbl9tYXBfaW9fc2VjdGlvbihk b21pZF90IGRvbSwKPiAgICAgIH0KPiAgCj4gICAgICB0cmFjZV94ZW5fbWFwX3BvcnRpb19yYW5n ZShpb3NlcnZpZCwgc3RhcnRfYWRkciwgZW5kX2FkZHIpOwo+IC0gICAgeGNfaHZtX21hcF9pb19y YW5nZV90b19pb3JlcV9zZXJ2ZXIoeGVuX3hjLCBkb20sIGlvc2VydmlkLCAwLAo+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWRkciwgZW5kX2FkZHIpOwo+ ICsgICAgeGVuZGV2aWNlbW9kZWxfbWFwX2lvX3JhbmdlX3RvX2lvcmVxX3NlcnZlcih4ZW5fZG1v ZCwgZG9tLCBpb3NlcnZpZCwgMCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RhcnRfYWRkciwgZW5kX2FkZHIpOwo+ICB9Cj4gIAo+ICBzdGF0aWMg aW5saW5lIHZvaWQgeGVuX3VubWFwX2lvX3NlY3Rpb24oZG9taWRfdCBkb20sCj4gQEAgLTMzNiw4 ICszODUsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3VubWFwX2lvX3NlY3Rpb24oZG9taWRf dCBkb20sCj4gICAgICB9Cj4gIAo+ICAgICAgdHJhY2VfeGVuX3VubWFwX3BvcnRpb19yYW5nZShp b3NlcnZpZCwgc3RhcnRfYWRkciwgZW5kX2FkZHIpOwo+IC0gICAgeGNfaHZtX3VubWFwX2lvX3Jh bmdlX2Zyb21faW9yZXFfc2VydmVyKHhlbl94YywgZG9tLCBpb3NlcnZpZCwKPiAtICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzdGFydF9hZGRyLCBlbmRfYWRk cik7Cj4gKyAgICB4ZW5kZXZpY2Vtb2RlbF91bm1hcF9pb19yYW5nZV9mcm9tX2lvcmVxX3NlcnZl cih4ZW5fZG1vZCwgZG9tLCBpb3NlcnZpZCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHN0YXJ0X2FkZHIsIGVuZF9hZGRyKTsKPiAgfQo+ ICAKPiAgc3RhdGljIGlubGluZSB2b2lkIHhlbl9tYXBfcGNpZGV2KGRvbWlkX3QgZG9tLAo+IEBA IC0zNTAsMTAgKzM5OSwxMCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgeGVuX21hcF9wY2lkZXYoZG9t aWRfdCBkb20sCj4gIAo+ICAgICAgdHJhY2VfeGVuX21hcF9wY2lkZXYoaW9zZXJ2aWQsIHBjaV9i dXNfbnVtKHBjaV9kZXYtPmJ1cyksCj4gICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfU0xP VChwY2lfZGV2LT5kZXZmbiksIFBDSV9GVU5DKHBjaV9kZXYtPmRldmZuKSk7Cj4gLSAgICB4Y19o dm1fbWFwX3BjaWRldl90b19pb3JlcV9zZXJ2ZXIoeGVuX3hjLCBkb20sIGlvc2VydmlkLCAwLAo+ IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9idXNfbnVtKHBjaV9k ZXYtPmJ1cyksCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX1NM T1QocGNpX2Rldi0+ZGV2Zm4pLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFBDSV9GVU5DKHBjaV9kZXYtPmRldmZuKSk7Cj4gKyAgICB4ZW5kZXZpY2Vtb2RlbF9tYXBf cGNpZGV2X3RvX2lvcmVxX3NlcnZlcih4ZW5fZG1vZCwgZG9tLCBpb3NlcnZpZCwgMCwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9idXNfbnVtKHBj aV9kZXYtPmJ1cyksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBQQ0lfU0xPVChwY2lfZGV2LT5kZXZmbiksCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRlVOQyhwY2lfZGV2LT5kZXZmbikpOwo+ICB9Cj4g IAo+ICBzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3VubWFwX3BjaWRldihkb21pZF90IGRvbSwKPiBA QCAtMzY2LDE4ICs0MTUsMTggQEAgc3RhdGljIGlubGluZSB2b2lkIHhlbl91bm1hcF9wY2lkZXYo ZG9taWRfdCBkb20sCj4gIAo+ICAgICAgdHJhY2VfeGVuX3VubWFwX3BjaWRldihpb3NlcnZpZCwg cGNpX2J1c19udW0ocGNpX2Rldi0+YnVzKSwKPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UENJX1NMT1QocGNpX2Rldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhwY2lfZGV2LT5kZXZmbikpOwo+IC0g ICAgeGNfaHZtX3VubWFwX3BjaWRldl9mcm9tX2lvcmVxX3NlcnZlcih4ZW5feGMsIGRvbSwgaW9z ZXJ2aWQsIDAsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBj aV9idXNfbnVtKHBjaV9kZXYtPmJ1cyksCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFBDSV9TTE9UKHBjaV9kZXYtPmRldmZuKSwKPiAtICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkMocGNpX2Rldi0+ZGV2Zm4pKTsKPiAr ICAgIHhlbmRldmljZW1vZGVsX3VubWFwX3BjaWRldl9mcm9tX2lvcmVxX3NlcnZlcih4ZW5fZG1v ZCwgZG9tLCBpb3NlcnZpZCwgMCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwY2lfYnVzX251bShwY2lfZGV2LT5idXMpLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKHBjaV9kZXYt PmRldmZuKSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBQQ0lfRlVOQyhwY2lfZGV2LT5kZXZmbikpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgaW5saW5l IHZvaWQgeGVuX2NyZWF0ZV9pb3JlcV9zZXJ2ZXIoZG9taWRfdCBkb20sCj4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NlcnZpZF90ICppb3NlcnZpZCkKPiAg ewo+IC0gICAgaW50IHJjID0geGNfaHZtX2NyZWF0ZV9pb3JlcV9zZXJ2ZXIoeGVuX3hjLCBkb20s Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVk1fSU9SRVFTUlZf QlVGSU9SRVFfQVRPTUlDLAo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaW9zZXJ2aWQpOwo+ICsgICAgaW50IHJjID0geGVuZGV2aWNlbW9kZWxfY3JlYXRlX2lvcmVx X3NlcnZlcih4ZW5fZG1vZCwgZG9tLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBIVk1fSU9SRVFTUlZfQlVGSU9SRVFfQVRPTUlDLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NlcnZpZCk7Cj4gIAo+ ICAgICAgaWYgKHJjID09IDApIHsKPiAgICAgICAgICB0cmFjZV94ZW5faW9yZXFfc2VydmVyX2Ny ZWF0ZSgqaW9zZXJ2aWQpOwo+IEBAIC0zOTcsNyArNDQ2LDcgQEAgc3RhdGljIGlubGluZSB2b2lk IHhlbl9kZXN0cm95X2lvcmVxX3NlcnZlcihkb21pZF90IGRvbSwKPiAgICAgIH0KPiAgCj4gICAg ICB0cmFjZV94ZW5faW9yZXFfc2VydmVyX2Rlc3Ryb3koaW9zZXJ2aWQpOwo+IC0gICAgeGNfaHZt X2Rlc3Ryb3lfaW9yZXFfc2VydmVyKHhlbl94YywgZG9tLCBpb3NlcnZpZCk7Cj4gKyAgICB4ZW5k ZXZpY2Vtb2RlbF9kZXN0cm95X2lvcmVxX3NlcnZlcih4ZW5fZG1vZCwgZG9tLCBpb3NlcnZpZCk7 Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbmxpbmUgaW50IHhlbl9nZXRfaW9yZXFfc2VydmVyX2luZm8o ZG9taWRfdCBkb20sCj4gQEAgLTQxMiw5ICs0NjEsOSBAQCBzdGF0aWMgaW5saW5lIGludCB4ZW5f Z2V0X2lvcmVxX3NlcnZlcl9pbmZvKGRvbWlkX3QgZG9tLAo+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmaW9yZXFfZXZ0Y2huKTsKPiAgICAgIH0K PiAgCj4gLSAgICByZXR1cm4geGNfaHZtX2dldF9pb3JlcV9zZXJ2ZXJfaW5mbyh4ZW5feGMsIGRv bSwgaW9zZXJ2aWQsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp b3JlcV9wZm4sIGJ1ZmlvcmVxX3BmbiwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGJ1ZmlvcmVxX2V2dGNobik7Cj4gKyAgICByZXR1cm4geGVuZGV2aWNlbW9kZWxf Z2V0X2lvcmVxX3NlcnZlcl9pbmZvKHhlbl9kbW9kLCBkb20sIGlvc2VydmlkLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3JlcV9wZm4sIGJ1Zmlv cmVxX3BmbiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYnVmaW9yZXFfZXZ0Y2huKTsKPiAgfQo+ICAKPiAgc3RhdGljIGlubGluZSBpbnQgeGVuX3Nl dF9pb3JlcV9zZXJ2ZXJfc3RhdGUoZG9taWRfdCBkb20sCj4gQEAgLTQyNiw4ICs0NzUsOCBAQCBz dGF0aWMgaW5saW5lIGludCB4ZW5fc2V0X2lvcmVxX3NlcnZlcl9zdGF0ZShkb21pZF90IGRvbSwK PiAgICAgIH0KPiAgCj4gICAgICB0cmFjZV94ZW5faW9yZXFfc2VydmVyX3N0YXRlKGlvc2Vydmlk LCBlbmFibGUpOwo+IC0gICAgcmV0dXJuIHhjX2h2bV9zZXRfaW9yZXFfc2VydmVyX3N0YXRlKHhl bl94YywgZG9tLCBpb3NlcnZpZCwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBlbmFibGUpOwo+ICsgICAgcmV0dXJuIHhlbmRldmljZW1vZGVsX3NldF9pb3JlcV9z ZXJ2ZXJfc3RhdGUoeGVuX2Rtb2QsIGRvbSwgaW9zZXJ2aWQsCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOwo+ICB9Cj4gIAo+ICAjZW5k aWYKPiBkaWZmIC0tZ2l0IGEveGVuLWNvbW1vbi5jIGIveGVuLWNvbW1vbi5jCj4gaW5kZXggNzAz ZTdhNS4uYWU3NjE1MCAxMDA2NDQKPiAtLS0gYS94ZW4tY29tbW9uLmMKPiArKysgYi94ZW4tY29t bW9uLmMKPiBAQCAtMjcsNiArMjcsNyBAQAo+ICAKPiAgeGNfaW50ZXJmYWNlICp4ZW5feGM7Cj4g IHhlbmZvcmVpZ25tZW1vcnlfaGFuZGxlICp4ZW5fZm1lbTsKPiAreGVuZGV2aWNlbW9kZWxfaGFu ZGxlICp4ZW5fZG1vZDsKPiAgCj4gIHN0YXRpYyBpbnQgc3RvcmVfZGV2X2luZm8oaW50IGRvbWlk LCBDaGFyZGV2ICpjcywgY29uc3QgY2hhciAqc3RyaW5nKQo+ICB7Cj4gQEAgLTEyOCw2ICsxMjks MTMgQEAgc3RhdGljIGludCB4ZW5faW5pdChNYWNoaW5lU3RhdGUgKm1zKQo+ICAgICAgICAgIHhj X2ludGVyZmFjZV9jbG9zZSh4ZW5feGMpOwo+ICAgICAgICAgIHJldHVybiAtMTsKPiAgICAgIH0K PiArICAgIHhlbl9kbW9kID0geGVuZGV2aWNlbW9kZWxfb3BlbigwLCAwKTsKPiArICAgIGlmICh4 ZW5fZG1vZCA9PSBOVUxMKSB7Cj4gKyAgICAgICAgeGVuX3B2X3ByaW50ZihOVUxMLCAwLCAiY2Fu J3Qgb3BlbiB4ZW4gZGV2aWNlbW9kZWwgaW50ZXJmYWNlXG4iKTsKPiArICAgICAgICB4ZW5mb3Jl aWdubWVtb3J5X2Nsb3NlKHhlbl9mbWVtKTsKPiArICAgICAgICB4Y19pbnRlcmZhY2VfY2xvc2Uo eGVuX3hjKTsKPiArICAgICAgICByZXR1cm4gLTE7Cj4gKyAgICB9Cj4gICAgICBxZW11X2FkZF92 bV9jaGFuZ2Vfc3RhdGVfaGFuZGxlcih4ZW5fY2hhbmdlX3N0YXRlX2hhbmRsZXIsIE5VTEwpOwo+ ICAKPiAgICAgIGdsb2JhbF9zdGF0ZV9zZXRfb3B0aW9uYWwoKTsKPiAtLSAKPiAyLjEuNAo+IAoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5v cmcveGVuLWRldmVsCg==