From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754661AbdCFULn (ORCPT ); Mon, 6 Mar 2017 15:11:43 -0500 Received: from mail.kernel.org ([198.145.29.136]:51920 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754105AbdCFULS (ORCPT ); Mon, 6 Mar 2017 15:11:18 -0500 From: Stefano Stabellini To: xen-devel@lists.xenproject.org Cc: linux-kernel@vger.kernel.org, sstabellini@kernel.org, Stefano Stabellini , konrad.wilk@oracle.com, boris.ostrovsky@oracle.com, jgross@suse.com Subject: [PATCH 1/7] xen: import new ring macros in ring.h Date: Mon, 6 Mar 2017 12:01:22 -0800 Message-Id: <1488830488-18506-1-git-send-email-sstabellini@kernel.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sync the ring.h file with upstream Xen, to introduce the new ring macros. They will be used by the Xen transport for 9pfs. Signed-off-by: Stefano Stabellini CC: konrad.wilk@oracle.com CC: boris.ostrovsky@oracle.com CC: jgross@suse.com --- NB: The new macros have not been committed to Xen yet. Do not apply this patch until they do. --- --- include/xen/interface/io/ring.h | 131 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/include/xen/interface/io/ring.h b/include/xen/interface/io/ring.h index 21f4fbd..e16aa92 100644 --- a/include/xen/interface/io/ring.h +++ b/include/xen/interface/io/ring.h @@ -283,4 +283,135 @@ struct __name##_back_ring { \ (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r); \ } while (0) + +/* + * DEFINE_XEN_FLEX_RING_AND_INTF defines two monodirectional rings and + * functions to check if there is data on the ring, and to read and + * write to them. + * + * DEFINE_XEN_FLEX_RING is similar to DEFINE_XEN_FLEX_RING_AND_INTF, but + * does not define the indexes page. As different protocols can have + * extensions to the basic format, this macro allow them to define their + * own struct. + * + * XEN_FLEX_RING_SIZE + * Convenience macro to calculate the size of one of the two rings + * from the overall order. + * + * $NAME_mask + * Function to apply the size mask to an index, to reduce the index + * within the range [0-size]. + * + * $NAME_read_packet + * Function to read data from the ring. The amount of data to read is + * specified by the "size" argument. + * + * $NAME_write_packet + * Function to write data to the ring. The amount of data to write is + * specified by the "size" argument. + * + * $NAME_get_ring_ptr + * Convenience function that returns a pointer to read/write to the + * ring at the right location. + * + * $NAME_data_intf + * Indexes page, shared between frontend and backend. It also + * contains the array of grant refs. + * + * $NAME_queued + * Function to calculate how many bytes are currently on the ring, + * ready to be read. It can also be used to calculate how much free + * space is currently on the ring (ring_size - $NAME_queued()). + */ +#define XEN_FLEX_RING_SIZE(order) \ + (1UL << (order + PAGE_SHIFT - 1)) + +#define DEFINE_XEN_FLEX_RING_AND_INTF(name) \ +struct name##_data_intf { \ + RING_IDX in_cons, in_prod; \ + \ + uint8_t pad1[56]; \ + \ + RING_IDX out_cons, out_prod; \ + \ + uint8_t pad2[56]; \ + \ + RING_IDX ring_order; \ + grant_ref_t ref[]; \ +}; \ +DEFINE_XEN_FLEX_RING(name); + +#define DEFINE_XEN_FLEX_RING(name) \ +static inline RING_IDX name##_mask(RING_IDX idx, RING_IDX ring_size) \ +{ \ + return (idx & (ring_size - 1)); \ +} \ + \ +static inline RING_IDX name##_mask_order(RING_IDX idx, RING_IDX ring_order) \ +{ \ + return (idx & (XEN_FLEX_RING_SIZE(ring_order) - 1)); \ +} \ + \ +static inline unsigned char* name##_get_ring_ptr(unsigned char *buf, \ + RING_IDX idx, \ + RING_IDX ring_order) \ +{ \ + return buf + name##_mask_order(idx, ring_order); \ +} \ + \ +static inline void name##_read_packet(const unsigned char *buf, \ + RING_IDX masked_prod, RING_IDX *masked_cons, \ + RING_IDX ring_size, void *opaque, size_t size) { \ + if (*masked_cons < masked_prod || \ + size <= ring_size - *masked_cons) { \ + memcpy(opaque, buf + *masked_cons, size); \ + } else { \ + memcpy(opaque, buf + *masked_cons, ring_size - *masked_cons); \ + memcpy((unsigned char *)opaque + ring_size - *masked_cons, buf, \ + size - (ring_size - *masked_cons)); \ + } \ + *masked_cons = name##_mask(*masked_cons + size, ring_size); \ +} \ + \ +static inline void name##_write_packet(unsigned char *buf, \ + RING_IDX *masked_prod, RING_IDX masked_cons, \ + RING_IDX ring_size, const void *opaque, size_t size) { \ + if (*masked_prod < masked_cons || \ + size <= ring_size - *masked_prod) { \ + memcpy(buf + *masked_prod, opaque, size); \ + } else { \ + memcpy(buf + *masked_prod, opaque, ring_size - *masked_prod); \ + memcpy(buf, (unsigned char *)opaque + (ring_size - *masked_prod), \ + size - (ring_size - *masked_prod)); \ + } \ + *masked_prod = name##_mask(*masked_prod + size, ring_size); \ +} \ + \ +struct name##_data { \ + unsigned char *in; /* half of the allocation */ \ + unsigned char *out; /* half of the allocation */ \ +}; \ + \ + \ +static inline RING_IDX name##_queued(RING_IDX prod, \ + RING_IDX cons, RING_IDX ring_size) \ +{ \ + RING_IDX size; \ + \ + if (prod == cons) \ + return 0; \ + \ + prod = name##_mask(prod, ring_size); \ + cons = name##_mask(cons, ring_size); \ + \ + if (prod == cons) \ + return ring_size; \ + \ + if (prod > cons) \ + size = prod - cons; \ + else \ + size = ring_size - (cons - prod); \ + return size; \ +}; + #endif /* __XEN_PUBLIC_IO_RING_H__ */ -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Stabellini Subject: [PATCH 1/7] xen: import new ring macros in ring.h Date: Mon, 6 Mar 2017 12:01:22 -0800 Message-ID: <1488830488-18506-1-git-send-email-sstabellini@kernel.org> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ckyp5-0004DH-U8 for xen-devel@lists.xenproject.org; Mon, 06 Mar 2017 20:01:36 +0000 In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: jgross@suse.com, sstabellini@kernel.org, linux-kernel@vger.kernel.org, Stefano Stabellini , boris.ostrovsky@oracle.com List-Id: xen-devel@lists.xenproject.org U3luYyB0aGUgcmluZy5oIGZpbGUgd2l0aCB1cHN0cmVhbSBYZW4sIHRvIGludHJvZHVjZSB0aGUg bmV3IHJpbmcgbWFjcm9zLgpUaGV5IHdpbGwgYmUgdXNlZCBieSB0aGUgWGVuIHRyYW5zcG9ydCBm b3IgOXBmcy4KClNpZ25lZC1vZmYtYnk6IFN0ZWZhbm8gU3RhYmVsbGluaSA8c3RlZmFub0BhcG9y ZXRvLmNvbT4KQ0M6IGtvbnJhZC53aWxrQG9yYWNsZS5jb20KQ0M6IGJvcmlzLm9zdHJvdnNreUBv cmFjbGUuY29tCkNDOiBqZ3Jvc3NAc3VzZS5jb20KCi0tLQpOQjogVGhlIG5ldyBtYWNyb3MgaGF2 ZSBub3QgYmVlbiBjb21taXR0ZWQgdG8gWGVuIHlldC4gRG8gbm90IGFwcGx5IHRoaXMKcGF0Y2gg dW50aWwgdGhleSBkby4KLS0tCi0tLQogaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL3JpbmcuaCB8 IDEzMSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAxIGZpbGUgY2hh bmdlZCwgMTMxIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZh Y2UvaW8vcmluZy5oIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL3JpbmcuaAppbmRleCAyMWY0 ZmJkLi5lMTZhYTkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvaW8vcmluZy5o CisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9yaW5nLmgKQEAgLTI4Myw0ICsyODMsMTM1 IEBAIHN0cnVjdCBfX25hbWUjI19iYWNrX3JpbmcgewkJCQkJCVwKICAgICAoX3dvcmtfdG9fZG8p ID0gUklOR19IQVNfVU5DT05TVU1FRF9SRVNQT05TRVMoX3IpOwkJCVwKIH0gd2hpbGUgKDApCiAK KworLyoKKyAqIERFRklORV9YRU5fRkxFWF9SSU5HX0FORF9JTlRGIGRlZmluZXMgdHdvIG1vbm9k aXJlY3Rpb25hbCByaW5ncyBhbmQKKyAqIGZ1bmN0aW9ucyB0byBjaGVjayBpZiB0aGVyZSBpcyBk YXRhIG9uIHRoZSByaW5nLCBhbmQgdG8gcmVhZCBhbmQKKyAqIHdyaXRlIHRvIHRoZW0uCisgKgor ICogREVGSU5FX1hFTl9GTEVYX1JJTkcgaXMgc2ltaWxhciB0byBERUZJTkVfWEVOX0ZMRVhfUklO R19BTkRfSU5URiwgYnV0CisgKiBkb2VzIG5vdCBkZWZpbmUgdGhlIGluZGV4ZXMgcGFnZS4gQXMg ZGlmZmVyZW50IHByb3RvY29scyBjYW4gaGF2ZQorICogZXh0ZW5zaW9ucyB0byB0aGUgYmFzaWMg Zm9ybWF0LCB0aGlzIG1hY3JvIGFsbG93IHRoZW0gdG8gZGVmaW5lIHRoZWlyCisgKiBvd24gc3Ry dWN0LgorICoKKyAqIFhFTl9GTEVYX1JJTkdfU0laRQorICogICBDb252ZW5pZW5jZSBtYWNybyB0 byBjYWxjdWxhdGUgdGhlIHNpemUgb2Ygb25lIG9mIHRoZSB0d28gcmluZ3MKKyAqICAgZnJvbSB0 aGUgb3ZlcmFsbCBvcmRlci4KKyAqCisgKiAkTkFNRV9tYXNrCisgKiAgIEZ1bmN0aW9uIHRvIGFw cGx5IHRoZSBzaXplIG1hc2sgdG8gYW4gaW5kZXgsIHRvIHJlZHVjZSB0aGUgaW5kZXgKKyAqICAg d2l0aGluIHRoZSByYW5nZSBbMC1zaXplXS4KKyAqCisgKiAkTkFNRV9yZWFkX3BhY2tldAorICog ICBGdW5jdGlvbiB0byByZWFkIGRhdGEgZnJvbSB0aGUgcmluZy4gVGhlIGFtb3VudCBvZiBkYXRh IHRvIHJlYWQgaXMKKyAqICAgc3BlY2lmaWVkIGJ5IHRoZSAic2l6ZSIgYXJndW1lbnQuCisgKgor ICogJE5BTUVfd3JpdGVfcGFja2V0CisgKiAgIEZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEgdG8gdGhl IHJpbmcuIFRoZSBhbW91bnQgb2YgZGF0YSB0byB3cml0ZSBpcworICogICBzcGVjaWZpZWQgYnkg dGhlICJzaXplIiBhcmd1bWVudC4KKyAqCisgKiAkTkFNRV9nZXRfcmluZ19wdHIKKyAqICAgQ29u dmVuaWVuY2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcG9pbnRlciB0byByZWFkL3dyaXRlIHRv IHRoZQorICogICByaW5nIGF0IHRoZSByaWdodCBsb2NhdGlvbi4KKyAqCisgKiAkTkFNRV9kYXRh X2ludGYKKyAqICAgSW5kZXhlcyBwYWdlLCBzaGFyZWQgYmV0d2VlbiBmcm9udGVuZCBhbmQgYmFj a2VuZC4gSXQgYWxzbworICogICBjb250YWlucyB0aGUgYXJyYXkgb2YgZ3JhbnQgcmVmcy4KKyAq CisgKiAkTkFNRV9xdWV1ZWQKKyAqICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGhvdyBtYW55IGJ5 dGVzIGFyZSBjdXJyZW50bHkgb24gdGhlIHJpbmcsCisgKiAgIHJlYWR5IHRvIGJlIHJlYWQuIEl0 IGNhbiBhbHNvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIGhvdyBtdWNoIGZyZWUKKyAqICAgc3BhY2Ug aXMgY3VycmVudGx5IG9uIHRoZSByaW5nIChyaW5nX3NpemUgLSAkTkFNRV9xdWV1ZWQoKSkuCisg Ki8KKyNkZWZpbmUgWEVOX0ZMRVhfUklOR19TSVpFKG9yZGVyKSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoMVVMIDw8IChvcmRlciArIFBBR0VfU0hJ RlQgLSAxKSkKKworI2RlZmluZSBERUZJTkVfWEVOX0ZMRVhfUklOR19BTkRfSU5URihuYW1lKSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IG5hbWUjI19kYXRhX2lu dGYgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorICAgIFJJTkdfSURYIGluX2NvbnMsIGluX3Byb2Q7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVp bnQ4X3QgcGFkMVs1Nl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJJTkdfSURYIG91 dF9jb25zLCBvdXRfcHJvZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgcGFkMls1Nl07ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJJTkdfSURYIHJpbmdfb3JkZXI7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdyYW50 X3JlZl90IHJlZltdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVGSU5FX1hFTl9GTEVYX1JJ TkcobmFtZSk7CisKKyNkZWZpbmUgREVGSU5FX1hFTl9GTEVYX1JJTkcobmFtZSkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgUklOR19J RFggbmFtZSMjX21hc2soUklOR19JRFggaWR4LCBSSU5HX0lEWCByaW5nX3NpemUpICAgICAgICAg IFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKGlkeCAmIChyaW5nX3NpemUg LSAxKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUg UklOR19JRFggbmFtZSMjX21hc2tfb3JkZXIoUklOR19JRFggaWR4LCBSSU5HX0lEWCByaW5nX29y ZGVyKSAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKGlkeCAmIChYRU5f RkxFWF9SSU5HX1NJWkUocmluZ19vcmRlcikgLSAxKSk7ICAgICAgICAgICAgICAgICAgICAgIFwK K30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgY2hhciogbmFtZSMjX2dldF9yaW5nX3B0cih1bnNpZ25lZCBjaGFyICpi dWYsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBSSU5HX0lEWCBpZHgsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSU5HX0lEWCByaW5nX29yZGVyKSAgICAg ICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gYnVmICsgbmFtZSMjX21h c2tfb3JkZXIoaWR4LCByaW5nX29yZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxp bmUgdm9pZCBuYW1lIyNfcmVhZF9wYWNrZXQoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCAgICAg ICAgICAgICAgIFwKKyAgICAgICAgUklOR19JRFggbWFza2VkX3Byb2QsIFJJTkdfSURYICptYXNr ZWRfY29ucywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUklOR19JRFggcmlu Z19zaXplLCB2b2lkICpvcGFxdWUsIHNpemVfdCBzaXplKSB7ICAgICAgICAgICAgICAgICAgICAg IFwKKyAgICBpZiAoKm1hc2tlZF9jb25zIDwgbWFza2VkX3Byb2QgfHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemUgPD0gcmluZ19zaXpl IC0gKm1hc2tlZF9jb25zKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg ICAgbWVtY3B5KG9wYXF1ZSwgYnVmICsgKm1hc2tlZF9jb25zLCBzaXplKTsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWVtY3B5 KG9wYXF1ZSwgYnVmICsgKm1hc2tlZF9jb25zLCByaW5nX3NpemUgLSAqbWFza2VkX2NvbnMpOyAg ICAgICAgIFwKKyAgICAgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopb3BhcXVlICsgcmluZ19z aXplIC0gKm1hc2tlZF9jb25zLCBidWYsICAgICAgIFwKKyAgICAgICAgICAgICAgICBzaXplIC0g KHJpbmdfc2l6ZSAtICptYXNrZWRfY29ucykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqbWFza2VkX2NvbnMgPSBuYW1lIyNfbWFzaygq bWFza2VkX2NvbnMgKyBzaXplLCByaW5nX3NpemUpOyAgICAgICAgICAgICAgIFwKK30gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9p ZCBuYW1lIyNfd3JpdGVfcGFja2V0KHVuc2lnbmVkIGNoYXIgKmJ1ZiwgICAgICAgICAgICAgICAg ICAgIFwKKyAgICAgICAgUklOR19JRFggKm1hc2tlZF9wcm9kLCBSSU5HX0lEWCBtYXNrZWRfY29u cywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUklOR19JRFggcmluZ19zaXpl LCBjb25zdCB2b2lkICpvcGFxdWUsIHNpemVfdCBzaXplKSB7ICAgICAgICAgICAgICAgIFwKKyAg ICBpZiAoKm1hc2tlZF9wcm9kIDwgbWFza2VkX2NvbnMgfHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZSA8PSByaW5nX3NpemUgLSAqbWFza2Vk X3Byb2QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWVt Y3B5KGJ1ZiArICptYXNrZWRfcHJvZCwgb3BhcXVlLCBzaXplKTsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWVtY3B5KGJ1ZiAr ICptYXNrZWRfcHJvZCwgb3BhcXVlLCByaW5nX3NpemUgLSAqbWFza2VkX3Byb2QpOyAgICAgICAg IFwKKyAgICAgICAgbWVtY3B5KGJ1ZiwgKHVuc2lnbmVkIGNoYXIgKilvcGFxdWUgKyAocmluZ19z aXplIC0gKm1hc2tlZF9wcm9kKSwgICAgIFwKKyAgICAgICAgICAgICAgICBzaXplIC0gKHJpbmdf c2l6ZSAtICptYXNrZWRfcHJvZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAqbWFza2VkX3Byb2QgPSBuYW1lIyNfbWFzaygqbWFza2Vk X3Byb2QgKyBzaXplLCByaW5nX3NpemUpOyAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCBuYW1lIyNfZGF0YSB7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICB1bnNpZ25lZCBjaGFyICppbjsgLyogaGFsZiBvZiB0aGUgYWxsb2NhdGlvbiAqLyAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBjaGFyICpvdXQ7IC8qIGhhbGYg b2YgdGhlIGFsbG9jYXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKK3N0YXRpYyBpbmxpbmUgUklOR19JRFggbmFtZSMjX3F1ZXVlZChSSU5HX0lEWCBwcm9k LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUklOR19JRFggY29ucywgUklO R19JRFggcmluZ19zaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKKyAgICBSSU5HX0lEWCBzaXplOyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKKyAgICBpZiAocHJvZCA9PSBjb25zKSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIDA7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcm9kID0gbmFtZSMjX21hc2socHJvZCwg cmluZ19zaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBj b25zID0gbmFtZSMjX21hc2soY29ucywgcmluZ19zaXplKTsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocHJvZCA9 PSBjb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHJpbmdfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICBpZiAocHJvZCA+IGNvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZSA9IHByb2QgLSBjb25zOyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNl ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZSA9IHJpbmdfc2l6ZSAtIChjb25zIC0gcHJvZCk7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc2l6ZTsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKK307CisKICNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfSU9fUklOR19IX18gKi8KLS0gCjEu OS4xCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVu LWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3Rz Lnhlbi5vcmcveGVuLWRldmVsCg==