From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202410 header.b=KM8F7sTZ; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 4DEAE5A004C for ; Mon, 04 Nov 2024 09:40:17 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202410; t=1730709607; bh=/KXrF9u9WHwhKiLUW2SUppaSUDoOBAVeuD1z70KSIB8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KM8F7sTZwEg0ocSsxOsZCpMDV5Ivr9N+YapjpRSyJnfpgi2p6sYVw+IgSZS6td1EV mByAvQ01xHNmBGiKQ+1uzpQ2Ns/WxpoNSr/yGp5sQJ/W0rmLx2nuYmJdk/TtMX8hmL SPfuQUBE5On1P6XgV6PMDRxbI456ur6Q4Iq4NG+lC4iBITqvKpRgb4w8ZvG7HnYlyq lUn1e47BnqQX4aI7EGd6kLZl8N7PC4kqMQe3r/gmCvKxYZzPVKSGkA0NjOkVdD3Bs/ MMVlXN2KvQMMTkXP7f7I/jSTm0g5sxEF1b+11TTPHIrG+WphiRZx27G7xeV1Q0UMY+ Y//dcLIVA68Uw== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4XhlK33Pqnz4x8Z; Mon, 4 Nov 2024 19:40:07 +1100 (AEDT) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH v9 02/20] vhost-user: introduce virtio API Date: Mon, 4 Nov 2024 19:39:45 +1100 Message-ID: <20241104084004.3544294-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241104084004.3544294-1-david@gibson.dropbear.id.au> References: <20241104084004.3544294-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Message-ID-Hash: Y42V7JCMRHVX4P72V7YMHVEKTZNTCI2H X-Message-ID-Hash: Y42V7JCMRHVX4P72V7YMHVEKTZNTCI2H X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Laurent Vivier , David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: RnJvbTogTGF1cmVudCBWaXZpZXIgPGx2aXZpZXJAcmVkaGF0LmNvbT4NCg0KQWRkIHZpcnRpby5j IGFuZCB2aXJ0aW8uaCB0aGF0IGRlZmluZSB0aGUgZnVuY3Rpb25zIG5lZWRlZA0KdG8gbWFuYWdl IHZpcnRxdWV1ZXMuDQoNClNpZ25lZC1vZmYtYnk6IExhdXJlbnQgVml2aWVyIDxsdml2aWVyQHJl ZGhhdC5jb20+DQpNZXNzYWdlLUlEOiA8MjAyNDEwMTAxMjI5MDMuMTE4ODk5Mi0zLWx2aXZpZXJA cmVkaGF0LmNvbT4NClNpZ25lZC1vZmYtYnk6IERhdmlkIEdpYnNvbiA8ZGF2aWRAZ2lic29uLmRy b3BiZWFyLmlkLmF1Pg0KLS0tDQogTWFrZWZpbGUgfCAgIDQgKy0NCiB1dGlsLmggICB8ICAgOCAr DQogdmlydGlvLmMgfCA2NjUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKw0KIHZpcnRpby5oIHwgMTgzICsrKysrKysrKysrKysrKw0KIDQgZmls ZXMgY2hhbmdlZCwgODU4IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pDQogY3JlYXRlIG1v ZGUgMTAwNjQ0IHZpcnRpby5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IHZpcnRpby5oDQoNCmRpZmYg LS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlDQppbmRleCBjMWM2ZTMwLi44OGVmZTU3IDEwMDY0 NA0KLS0tIGEvTWFrZWZpbGUNCisrKyBiL01ha2VmaWxlDQpAQCAtNTQsNyArNTQsNyBAQCBGTEFH UyArPSAtRERVQUxfU1RBQ0tfU09DS0VUUz0kKERVQUxfU1RBQ0tfU09DS0VUUykNCiBQQVNTVF9T UkNTID0gYXJjaC5jIGFycC5jIGNoZWNrc3VtLmMgY29uZi5jIGRoY3AuYyBkaGNwdjYuYyBmbG93 LmMgZndkLmMgXA0KIAlpY21wLmMgaWdtcC5jIGluYW55LmMgaW92LmMgaXAuYyBpc29sYXRpb24u YyBsaW5lcmVhZC5jIGxvZy5jIG1sZC5jIFwNCiAJbmRwLmMgbmV0bGluay5jIHBhY2tldC5jIHBh c3N0LmMgcGFzdGEuYyBwY2FwLmMgcGlmLmMgdGFwLmMgdGNwLmMgXA0KLQl0Y3BfYnVmLmMgdGNw X3NwbGljZS5jIHVkcC5jIHVkcF9mbG93LmMgdXRpbC5jDQorCXRjcF9idWYuYyB0Y3Bfc3BsaWNl LmMgdWRwLmMgdWRwX2Zsb3cuYyB1dGlsLmMgdmlydGlvLmMNCiBRUkFQX1NSQ1MgPSBxcmFwLmMN CiBTUkNTID0gJChQQVNTVF9TUkNTKSAkKFFSQVBfU1JDUykNCiANCkBAIC02NCw3ICs2NCw3IEBA IFBBU1NUX0hFQURFUlMgPSBhcmNoLmggYXJwLmggY2hlY2tzdW0uaCBjb25mLmggZGhjcC5oIGRo Y3B2Ni5oIGZsb3cuaCBmd2QuaCBcDQogCWZsb3dfdGFibGUuaCBpY21wLmggaWNtcF9mbG93Lmgg aW5hbnkuaCBpb3YuaCBpcC5oIGlzb2xhdGlvbi5oIFwNCiAJbGluZXJlYWQuaCBsb2cuaCBuZHAu aCBuZXRsaW5rLmggcGFja2V0LmggcGFzc3QuaCBwYXN0YS5oIHBjYXAuaCBwaWYuaCBcDQogCXNp cGhhc2guaCB0YXAuaCB0Y3AuaCB0Y3BfYnVmLmggdGNwX2Nvbm4uaCB0Y3BfaW50ZXJuYWwuaCB0 Y3Bfc3BsaWNlLmggXA0KLQl1ZHAuaCB1ZHBfZmxvdy5oIHV0aWwuaA0KKwl1ZHAuaCB1ZHBfZmxv dy5oIHV0aWwuaCB2aXJ0aW8uaA0KIEhFQURFUlMgPSAkKFBBU1NUX0hFQURFUlMpIHNlY2NvbXAu aA0KIA0KIEMgOj0gXCNpbmNsdWRlIDxzeXMvcmFuZG9tLmg+XG5pbnQgbWFpbigpe2ludCBhPWdl dHJhbmRvbSgwLCAwLCAwKTt9DQpkaWZmIC0tZ2l0IGEvdXRpbC5oIGIvdXRpbC5oDQppbmRleCAz ZmM2NGNmLi42NDhkMWUzIDEwMDY0NA0KLS0tIGEvdXRpbC5oDQorKysgYi91dGlsLmgNCkBAIC0x MzIsNiArMTMyLDE0IEBAIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgbnRvaGxfdW5hbGlnbmVkKGNv bnN0IHZvaWQgKnApDQogCXJldHVybiBudG9obCh2YWwpOw0KIH0NCiANCitzdGF0aWMgaW5saW5l IHZvaWQgYmFycmllcih2b2lkKSB7IF9fYXNtX18gX192b2xhdGlsZV9fKCIiIDo6OiAibWVtb3J5 Iik7IH0NCisjZGVmaW5lIHNtcF9tYigpCQlkbyB7IGJhcnJpZXIoKTsgX19hdG9taWNfdGhyZWFk X2ZlbmNlKF9fQVRPTUlDX1NFUV9DU1QpOyB9IHdoaWxlICgwKQ0KKyNkZWZpbmUgc21wX21iX3Jl bGVhc2UoKQlkbyB7IGJhcnJpZXIoKTsgX19hdG9taWNfdGhyZWFkX2ZlbmNlKF9fQVRPTUlDX1JF TEVBU0UpOyB9IHdoaWxlICgwKQ0KKyNkZWZpbmUgc21wX21iX2FjcXVpcmUoKQlkbyB7IGJhcnJp ZXIoKTsgX19hdG9taWNfdGhyZWFkX2ZlbmNlKF9fQVRPTUlDX0FDUVVJUkUpOyB9IHdoaWxlICgw KQ0KKw0KKyNkZWZpbmUgc21wX3dtYigpCXNtcF9tYl9yZWxlYXNlKCkNCisjZGVmaW5lIHNtcF9y bWIoKQlzbXBfbWJfYWNxdWlyZSgpDQorDQogI2RlZmluZSBOU19GTl9TVEFDS19TSVpFCShSTElN SVRfU1RBQ0tfVkFMICogMTAyNCAvIDgpDQogaW50IGRvX2Nsb25lKGludCAoKmZuKSh2b2lkICop LCBjaGFyICpzdGFja19hcmVhLCBzaXplX3Qgc3RhY2tfc2l6ZSwgaW50IGZsYWdzLA0KIAkgICAg IHZvaWQgKmFyZyk7DQpkaWZmIC0tZ2l0IGEvdmlydGlvLmMgYi92aXJ0aW8uYw0KbmV3IGZpbGUg bW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjM4MDU5MGENCi0tLSAvZGV2L251bGwNCisrKyBi L3ZpcnRpby5jDQpAQCAtMCwwICsxLDY2NSBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wLW9yLWxhdGVyIEFORCBCU0QtMy1DbGF1c2UNCisvKg0KKyAqIHZpcnRpbyBBUEks IHZyaW5nIGFuZCB2aXJ0cXVldWUgZnVuY3Rpb25zIGRlZmluaXRpb24NCisgKg0KKyAqIENvcHly aWdodCBSZWQgSGF0DQorICogQXV0aG9yOiBMYXVyZW50IFZpdmllciA8bHZpdmllckByZWRoYXQu Y29tPg0KKyAqLw0KKw0KKy8qIFNvbWUgcGFydHMgY29waWVkIGZyb20gUUVNVSBzdWJwcm9qZWN0 cy9saWJ2aG9zdC11c2VyL2xpYnZob3N0LXVzZXIuYw0KKyAqIG9yaWdpbmFsbHkgbGljZW5zZWQg dW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoNCisgKg0KKyAqIC0tDQorICoNCisgKiBDb3B5cmln aHQgSUJNLCBDb3JwLiAyMDA3DQorICogQ29weXJpZ2h0IChjKSAyMDE2IFJlZCBIYXQsIEluYy4N CisgKg0KKyAqIEF1dGhvcnM6DQorICogIEFudGhvbnkgTGlndW9yaSA8YWxpZ3VvcmlAdXMuaWJt LmNvbT4NCisgKiAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QHJlZGhhdC5jb20+DQorICog IFZpY3RvciBLYXBsYW5za3kgPHZpY3RvcmtAcmVkaGF0LmNvbT4NCisgKg0KKyAqIFRoaXMgd29y ayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMiBv cg0KKyAqIGxhdGVyLiAgU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJl Y3RvcnkuDQorICoNCisgKiBTb21lIHBhcnRzIGNvcGllZCBmcm9tIFFFTVUgaHcvdmlydGlvL3Zp cnRpby5jDQorICogbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoNCisgKg0KKyAq IENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDcNCisgKg0KKyAqIEF1dGhvcnM6DQorICogIEFudGhv bnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPg0KKyAqDQorICogVGhpcyB3b3JrIGlz IGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2Vl DQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4NCisgKg0K KyAqIC0tDQorICoNCisgKiB2aXJ0cV91c2VkX2V2ZW50KCkgYW5kIHZpcnRxX2F2YWlsX2V2ZW50 KCkgZnJvbQ0KKyAqIGh0dHBzOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy92aXJ0aW8vdmlydGlvL3Yx LjIvY3NkMDEvdmlydGlvLXYxLjItY3NkMDEuaHRtbCN4MS03MTIwMDBBDQorICogbGljZW5zZWQg dW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoNCisgKg0KKyAqIC0tDQorICoNCisgKiBUaGlzIGhl YWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zDQor ICogdG8gaW1wbGVtZW50IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLg0KKyAqDQorICogQ29w eXJpZ2h0IDIwMDcsIDIwMDksIElCTSBDb3Jwb3JhdGlvbg0KKyAqIENvcHlyaWdodCAyMDExLCBS ZWQgSGF0LCBJbmMNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICogUmVkaXN0cmli dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0 DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv d2luZyBjb25kaXRpb25zDQorICogYXJlIG1ldDoNCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGlj ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4N CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl IGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUNCisgKiAgICBkb2N1bWVudGF0aW9u IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0K KyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRy aWJ1dG9ycw0KKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0 cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQ0KKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJp b3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMg4oCY4oCYQVMgSVPigJnigJkg QU5EDQorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV VCBOT1QgTElNSVRFRCBUTywgVEhFDQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCisgKiBBUkUgRElT Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF DQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN UExBUlksIE9SIENPTlNFUVVFTlRJQUwNCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUw0KKyAqIE9SIFNFUlZJ Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU SU9OKQ0KKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUDQorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNM VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQ0KKyAqIE9V VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T U0lCSUxJVFkgT0YNCisgKiBTVUNIIERBTUFHRS4NCisgKi8NCisNCisjaW5jbHVkZSA8c3RkZGVm Lmg+DQorI2luY2x1ZGUgPGVuZGlhbi5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjaW5jbHVk ZSA8ZXJybm8uaD4NCisjaW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4NCisjaW5jbHVkZSA8c3lzL3Nv Y2tldC5oPg0KKw0KKyNpbmNsdWRlICJ1dGlsLmgiDQorI2luY2x1ZGUgInZpcnRpby5oIg0KKw0K KyNkZWZpbmUgVklSVFFVRVVFX01BWF9TSVpFIDEwMjQNCisNCisvKioNCisgKiB2dV9ncGFfdG9f dmEoKSAtIFRyYW5zbGF0ZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIHRvIG91ciB2aXJ0dWFsIGFk ZHJlc3MuDQorICogQGRldjoJVmhvc3QtdXNlciBkZXZpY2UNCisgKiBAcGxlbjoJUGh5c2ljYWwg bGVuZ3RoIHRvIG1hcCAoaW5wdXQpLCBjYXBwZWQgdG8gcmVnaW9uIChvdXRwdXQpDQorICogQGd1 ZXN0X2FkZHI6CUd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MNCisgKg0KKyAqIFJldHVybjogdmlydHVh bCBhZGRyZXNzIGluIG91ciBhZGRyZXNzIHNwYWNlIG9mIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRy ZXNzDQorICovDQorc3RhdGljIHZvaWQgKnZ1X2dwYV90b192YShzdHJ1Y3QgdnVfZGV2ICpkZXYs IHVpbnQ2NF90ICpwbGVuLCB1aW50NjRfdCBndWVzdF9hZGRyKQ0KK3sNCisJdW5zaWduZWQgaW50 IGk7DQorDQorCWlmICgqcGxlbiA9PSAwKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCS8qIEZpbmQg bWF0Y2hpbmcgbWVtb3J5IHJlZ2lvbi4gKi8NCisJZm9yIChpID0gMDsgaSA8IGRldi0+bnJlZ2lv bnM7IGkrKykgew0KKwkJY29uc3Qgc3RydWN0IHZ1X2Rldl9yZWdpb24gKnIgPSAmZGV2LT5yZWdp b25zW2ldOw0KKw0KKwkJaWYgKChndWVzdF9hZGRyID49IHItPmdwYSkgJiYNCisJCSAgICAoZ3Vl c3RfYWRkciA8IChyLT5ncGEgKyByLT5zaXplKSkpIHsNCisJCQlpZiAoKGd1ZXN0X2FkZHIgKyAq cGxlbikgPiAoci0+Z3BhICsgci0+c2l6ZSkpDQorCQkJCSpwbGVuID0gci0+Z3BhICsgci0+c2l6 ZSAtIGd1ZXN0X2FkZHI7DQorCQkJLyogTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2Utbm8taW50 LXRvLXB0cikgKi8NCisJCQlyZXR1cm4gKHZvaWQgKikoZ3Vlc3RfYWRkciAtIHItPmdwYSArIHIt Pm1tYXBfYWRkciArDQorCQkJCQkJICAgICByLT5tbWFwX29mZnNldCk7DQorCQl9DQorCX0NCisN CisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qKg0KKyAqIHZyaW5nX2F2YWlsX2ZsYWdzKCkgLSBS ZWFkIHRoZSBhdmFpbGFibGUgcmluZyBmbGFncw0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqDQor ICogUmV0dXJuOiB0aGUgYXZhaWxhYmxlIHJpbmcgZGVzY3JpcHRvciBmbGFncyBvZiB0aGUgZ2l2 ZW4gdmlydHF1ZXVlDQorICovDQorc3RhdGljIGlubGluZSB1aW50MTZfdCB2cmluZ19hdmFpbF9m bGFncyhjb25zdCBzdHJ1Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisJcmV0dXJuIGxlMTZ0b2godnEt PnZyaW5nLmF2YWlsLT5mbGFncyk7DQorfQ0KKw0KKy8qKg0KKyAqIHZyaW5nX2F2YWlsX2lkeCgp IC0gUmVhZCB0aGUgYXZhaWxhYmxlIHJpbmcgaW5kZXgNCisgKiBAdnE6CQlWaXJ0cXVldWUNCisg Kg0KKyAqIFJldHVybjogdGhlIGF2YWlsYWJsZSByaW5nIGluZGV4IG9mIHRoZSBnaXZlbiB2aXJ0 cXVldWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IHZyaW5nX2F2YWlsX2lkeChzdHJ1 Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisJdnEtPnNoYWRvd19hdmFpbF9pZHggPSBsZTE2dG9oKHZx LT52cmluZy5hdmFpbC0+aWR4KTsNCisNCisJcmV0dXJuIHZxLT5zaGFkb3dfYXZhaWxfaWR4Ow0K K30NCisNCisvKioNCisgKiB2cmluZ19hdmFpbF9yaW5nKCkgLSBSZWFkIGFuIGF2YWlsYWJsZSBy aW5nIGVudHJ5DQorICogQHZxOgkJVmlydHF1ZXVlDQorICogQGk6CQlJbmRleCBvZiB0aGUgZW50 cnkgdG8gcmVhZA0KKyAqDQorICogUmV0dXJuOiB0aGUgcmluZyBlbnRyeSBjb250ZW50IChoZWFk IG9mIHRoZSBkZXNjcmlwdG9yIGNoYWluKQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdWludDE2X3Qg dnJpbmdfYXZhaWxfcmluZyhjb25zdCBzdHJ1Y3QgdnVfdmlydHEgKnZxLCBpbnQgaSkNCit7DQor CXJldHVybiBsZTE2dG9oKHZxLT52cmluZy5hdmFpbC0+cmluZ1tpXSk7DQorfQ0KKw0KKy8qKg0K KyAqIHZpcnRxX3VzZWRfZXZlbnQgLSBHZXQgbG9jYXRpb24gb2YgdXNlZCBldmVudCBpbmRpY2Vz DQorICoJCSAgICAgIChvbmx5IHdpdGggVklSVElPX0ZfRVZFTlRfSURYKQ0KKyAqIEB2cQkJVmly dHF1ZXVlDQorICoNCisgKiBSZXR1cm46IHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIHVzZWQg ZXZlbnQgaW5kZXgNCisgKi8NCitzdGF0aWMgaW5saW5lIHVpbnQxNl90ICp2aXJ0cV91c2VkX2V2 ZW50KGNvbnN0IHN0cnVjdCB2dV92aXJ0cSAqdnEpDQorew0KKyAgICAgICAgLyogRm9yIGJhY2t3 YXJkcyBjb21wYXQsIHVzZWQgZXZlbnQgaW5kZXggaXMgYXQgKmVuZCogb2YgYXZhaWwgcmluZy4g Ki8NCisgICAgICAgIHJldHVybiAmdnEtPnZyaW5nLmF2YWlsLT5yaW5nW3ZxLT52cmluZy5udW1d Ow0KK30NCisNCisvKioNCisgKiB2cmluZ19nZXRfdXNlZF9ldmVudCgpIC0gR2V0IHRoZSB1c2Vk IGV2ZW50IGZyb20gdGhlIGF2YWlsYWJsZSByaW5nDQorICogQHZxCQlWaXJ0cXVldWUNCisgKg0K KyAqIFJldHVybjogdGhlIHVzZWQgZXZlbnQgKGF2YWlsYWJsZSBvbmx5IGlmIFZJUlRJT19SSU5H X0ZfRVZFTlRfSURYIGlzIHNldCkNCisgKiAgICAgICAgIHVzZWRfZXZlbnQgaXMgYSBwZXJmb3Jt YW50IGFsdGVybmF0aXZlIHdoZXJlIHRoZSBkcml2ZXINCisgKiAgICAgICAgIHNwZWNpZmllcyBo b3cgZmFyIHRoZSBkZXZpY2UgY2FuIHByb2dyZXNzIGJlZm9yZSBhIG5vdGlmaWNhdGlvbg0KKyAq ICAgICAgICAgaXMgcmVxdWlyZWQuDQorICovDQorc3RhdGljIGlubGluZSB1aW50MTZfdCB2cmlu Z19nZXRfdXNlZF9ldmVudChjb25zdCBzdHJ1Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisJcmV0dXJu IGxlMTZ0b2goKnZpcnRxX3VzZWRfZXZlbnQodnEpKTsNCit9DQorDQorLyoqDQorICogdmlydHF1 ZXVlX2dldF9oZWFkKCkgLSBHZXQgdGhlIGhlYWQgb2YgdGhlIGRlc2NyaXB0b3IgY2hhaW4gZm9y IGEgZ2l2ZW4NCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4DQorICogQHZxOgkJVmly dHF1ZXVlDQorICogQGlkeDoJQXZhaWxhYmxlIHJpbmcgZW50cnkgaW5kZXgNCisgKiBAaGVhZDoJ SGVhZCBvZiB0aGUgZGVzY3JpcHRvciBjaGFpbg0KKyAqLw0KK3N0YXRpYyB2b2lkIHZpcnRxdWV1 ZV9nZXRfaGVhZChjb25zdCBzdHJ1Y3QgdnVfdmlydHEgKnZxLA0KKwkJCSAgICAgICB1bnNpZ25l ZCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgKmhlYWQpDQorew0KKwkvKiBHcmFiIHRoZSBuZXh0IGRl c2NyaXB0b3IgbnVtYmVyIHRoZXkncmUgYWR2ZXJ0aXNpbmcsIGFuZCBpbmNyZW1lbnQNCisJICog dGhlIGluZGV4IHdlJ3ZlIHNlZW4uDQorCSAqLw0KKwkqaGVhZCA9IHZyaW5nX2F2YWlsX3Jpbmco dnEsIGlkeCAlIHZxLT52cmluZy5udW0pOw0KKw0KKwkvKiBJZiB0aGVpciBudW1iZXIgaXMgc2ls bHksIHRoYXQncyBhIGZhdGFsIG1pc3Rha2UuICovDQorCWlmICgqaGVhZCA+PSB2cS0+dnJpbmcu bnVtKQ0KKwkJZGllKCJ2aG9zdC11c2VyOiBHdWVzdCBzYXlzIGluZGV4ICV1IGlzIGF2YWlsYWJs ZSIsICpoZWFkKTsNCit9DQorDQorLyoqDQorICogdmlydHF1ZXVlX3JlYWRfaW5kaXJlY3RfZGVz YygpIC0gQ29weSB2aXJ0aW8gcmluZyBkZXNjcmlwdG9ycyBmcm9tIGd1ZXN0DQorICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5DQorICogQGRldjoJVmhvc3QtdXNlciBk ZXZpY2UNCisgKiBAZGVzYzoJRGVzdGluYXRpb24gYWRkcmVzcyB0byBjb3B5IHRoZSBkZXNjcmlw dG9ycyB0bw0KKyAqIEBhZGRyOglHdWVzdCBtZW1vcnkgYWRkcmVzcyB0byBjb3B5IGZyb20NCisg KiBAbGVuOglMZW5ndGggb2YgbWVtb3J5IHRvIGNvcHkNCisgKg0KKyAqIFJldHVybjogLTEgaWYg dGhlcmUgaXMgYW4gZXJyb3IsIDAgb3RoZXJ3aXNlDQorICovDQorc3RhdGljIGludCB2aXJ0cXVl dWVfcmVhZF9pbmRpcmVjdF9kZXNjKHN0cnVjdCB2dV9kZXYgKmRldiwgc3RydWN0IHZyaW5nX2Rl c2MgKmRlc2MsDQorCQkJCQl1aW50NjRfdCBhZGRyLCBzaXplX3QgbGVuKQ0KK3sNCisJdWludDY0 X3QgcmVhZF9sZW47DQorDQorCWlmIChsZW4gPiAoVklSVFFVRVVFX01BWF9TSVpFICogc2l6ZW9m KHN0cnVjdCB2cmluZ19kZXNjKSkpDQorCQlyZXR1cm4gLTE7DQorDQorCWlmIChsZW4gPT0gMCkN CisJCXJldHVybiAtMTsNCisNCisJd2hpbGUgKGxlbikgew0KKwkJY29uc3Qgc3RydWN0IHZyaW5n X2Rlc2MgKm9yaWdfZGVzYzsNCisNCisJCXJlYWRfbGVuID0gbGVuOw0KKwkJb3JpZ19kZXNjID0g dnVfZ3BhX3RvX3ZhKGRldiwgJnJlYWRfbGVuLCBhZGRyKTsNCisJCWlmICghb3JpZ19kZXNjKQ0K KwkJCXJldHVybiAtMTsNCisNCisJCW1lbWNweShkZXNjLCBvcmlnX2Rlc2MsIHJlYWRfbGVuKTsN CisJCWxlbiAtPSByZWFkX2xlbjsNCisJCWFkZHIgKz0gcmVhZF9sZW47DQorCQlkZXNjICs9IHJl YWRfbGVuIC8gc2l6ZW9mKHN0cnVjdCB2cmluZ19kZXNjKTsNCisJfQ0KKw0KKwlyZXR1cm4gMDsN Cit9DQorDQorLyoqDQorICogZW51bSB2aXJ0cXVldWVfcmVhZF9kZXNjX3N0YXRlIC0gU3RhdGUg aW4gdGhlIGRlc2NyaXB0b3IgY2hhaW4NCisgKiBAVklSVFFVRVVFX1JFQURfREVTQ19FUlJPUglG b3VuZCBhbiBpbnZhbGlkIGRlc2NyaXB0b3INCisgKiBAVklSVFFVRVVFX1JFQURfREVTQ19ET05F CU5vIG1vcmUgZGVzY3JpcHRvcnMgaW4gdGhlIGNoYWluDQorICogQFZJUlRRVUVVRV9SRUFEX0RF U0NfTU9SRQl0aGVyZSBhcmUgbW9yZSBkZXNjcmlwdG9ycyBpbiB0aGUgY2hhaW4NCisgKi8NCitl bnVtIHZpcnRxdWV1ZV9yZWFkX2Rlc2Nfc3RhdGUgew0KKwlWSVJUUVVFVUVfUkVBRF9ERVNDX0VS Uk9SID0gLTEsDQorCVZJUlRRVUVVRV9SRUFEX0RFU0NfRE9ORSA9IDAsICAgLyogZW5kIG9mIGNo YWluICovDQorCVZJUlRRVUVVRV9SRUFEX0RFU0NfTU9SRSA9IDEsICAgLyogbW9yZSBidWZmZXJz IGluIGNoYWluICovDQorfTsNCisNCisvKioNCisgKiB2aXJ0cXVldWVfcmVhZF9uZXh0X2Rlc2Mo KSAtIFJlYWQgdGhlIHRoZSBuZXh0IGRlc2NyaXB0b3IgaW4gdGhlIGNoYWluDQorICogQGRlc2M6 CVZpcnRpbyByaW5nIGRlc2NyaXB0b3JzDQorICogQGk6CQlJbmRleCBvZiB0aGUgY3VycmVudCBk ZXNjcmlwdG9yDQorICogQG1heDoJTWF4aW11bSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRvciBpbmRl eA0KKyAqIEBuZXh0OglJbmRleCBvZiB0aGUgbmV4dCBkZXNjcmlwdG9yIGluIHRoZSBjaGFpbiAo b3V0cHV0IHZhbHVlKQ0KKyAqDQorICogUmV0dXJuOiBjdXJyZW50IGNoYWluIGRlc2NyaXB0b3Ig c3RhdGUgKGVycm9yLCBuZXh0LCBkb25lKQ0KKyAqLw0KK3N0YXRpYyBpbnQgdmlydHF1ZXVlX3Jl YWRfbmV4dF9kZXNjKGNvbnN0IHN0cnVjdCB2cmluZ19kZXNjICpkZXNjLA0KKwkJCQkgICAgaW50 IGksIHVuc2lnbmVkIGludCBtYXgsIHVuc2lnbmVkIGludCAqbmV4dCkNCit7DQorCS8qIElmIHRo aXMgZGVzY3JpcHRvciBzYXlzIGl0IGRvZXNuJ3QgY2hhaW4sIHdlJ3JlIGRvbmUuICovDQorCWlm ICghKGxlMTZ0b2goZGVzY1tpXS5mbGFncykgJiBWUklOR19ERVNDX0ZfTkVYVCkpDQorCQlyZXR1 cm4gVklSVFFVRVVFX1JFQURfREVTQ19ET05FOw0KKw0KKwkvKiBDaGVjayB0aGV5J3JlIG5vdCBs ZWFkaW5nIHVzIG9mZiBlbmQgb2YgZGVzY3JpcHRvcnMuICovDQorCSpuZXh0ID0gbGUxNnRvaChk ZXNjW2ldLm5leHQpOw0KKwkvKiBNYWtlIHN1cmUgY29tcGlsZXIga25vd3MgdG8gZ3JhYiB0aGF0 OiB3ZSBkb24ndCB3YW50IGl0IGNoYW5naW5nISAqLw0KKwlzbXBfd21iKCk7DQorDQorCWlmICgq bmV4dCA+PSBtYXgpDQorCQlyZXR1cm4gVklSVFFVRVVFX1JFQURfREVTQ19FUlJPUjsNCisNCisJ cmV0dXJuIFZJUlRRVUVVRV9SRUFEX0RFU0NfTU9SRTsNCit9DQorDQorLyoqDQorICogdnVfcXVl dWVfZW1wdHkoKSAtIENoZWNrIGlmIHZpcnRxdWV1ZSBpcyBlbXB0eQ0KKyAqIEB2cToJCVZpcnRx dWV1ZQ0KKyAqDQorICogUmV0dXJuOiB0cnVlIGlmIHRoZSB2aXJ0cXVldWUgaXMgZW1wdHksIGZh bHNlIG90aGVyd2lzZQ0KKyAqLw0KK2Jvb2wgdnVfcXVldWVfZW1wdHkoc3RydWN0IHZ1X3ZpcnRx ICp2cSkNCit7DQorCWlmICghdnEtPnZyaW5nLmF2YWlsKQ0KKwkJcmV0dXJuIHRydWU7DQorDQor CWlmICh2cS0+c2hhZG93X2F2YWlsX2lkeCAhPSB2cS0+bGFzdF9hdmFpbF9pZHgpDQorCQlyZXR1 cm4gZmFsc2U7DQorDQorCXJldHVybiB2cmluZ19hdmFpbF9pZHgodnEpID09IHZxLT5sYXN0X2F2 YWlsX2lkeDsNCit9DQorDQorLyoqDQorICogdnJpbmdfY2FuX25vdGlmeSgpIC0gQ2hlY2sgaWYg YSBub3RpZmljYXRpb24gY2FuIGJlIHNlbnQNCisgKiBAZGV2OglWaG9zdC11c2VyIGRldmljZQ0K KyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqDQorICogUmV0dXJuOiB0cnVlIGlmIG5vdGlmaWNhdGlv biBjYW4gYmUgc2VudA0KKyAqLw0KK3N0YXRpYyBib29sIHZyaW5nX2Nhbl9ub3RpZnkoY29uc3Qg c3RydWN0IHZ1X2RldiAqZGV2LCBzdHJ1Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisJdWludDE2X3Qg b2xkLCBuZXc7DQorCWJvb2wgdjsNCisNCisJLyogV2UgbmVlZCB0byBleHBvc2UgdXNlZCBhcnJh eSBlbnRyaWVzIGJlZm9yZSBjaGVja2luZyB1c2VkIGV2ZW50LiAqLw0KKwlzbXBfbWIoKTsNCisN CisJLyogQWx3YXlzIG5vdGlmeSB3aGVuIHF1ZXVlIGlzIGVtcHR5ICh3aGVuIGZlYXR1cmUgYWNr bm93bGVkZ2UpICovDQorCWlmICh2dV9oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19GX05PVElGWV9P Tl9FTVBUWSkgJiYNCisJICAgICF2cS0+aW51c2UgJiYgdnVfcXVldWVfZW1wdHkodnEpKQ0KKwkJ cmV0dXJuIHRydWU7DQorDQorCWlmICghdnVfaGFzX2ZlYXR1cmUoZGV2LCBWSVJUSU9fUklOR19G X0VWRU5UX0lEWCkpDQorCQlyZXR1cm4gISh2cmluZ19hdmFpbF9mbGFncyh2cSkgJiBWUklOR19B VkFJTF9GX05PX0lOVEVSUlVQVCk7DQorDQorCXYgPSB2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQ7 DQorCXZxLT5zaWduYWxsZWRfdXNlZF92YWxpZCA9IHRydWU7DQorCW9sZCA9IHZxLT5zaWduYWxs ZWRfdXNlZDsNCisJbmV3ID0gdnEtPnNpZ25hbGxlZF91c2VkID0gdnEtPnVzZWRfaWR4Ow0KKwly ZXR1cm4gIXYgfHwgdnJpbmdfbmVlZF9ldmVudCh2cmluZ19nZXRfdXNlZF9ldmVudCh2cSksIG5l dywgb2xkKTsNCit9DQorDQorLyoqDQorICogdnVfcXVldWVfbm90aWZ5KCkgLSBTZW5kIGEgbm90 aWZpY2F0aW9uIHRvIHRoZSBnaXZlbiB2aXJ0cXVldWUNCisgKiBAZGV2OglWaG9zdC11c2VyIGRl dmljZQ0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqLw0KKy8qIGNwcGNoZWNrLXN1cHByZXNzIHVu dXNlZEZ1bmN0aW9uICovDQordm9pZCB2dV9xdWV1ZV9ub3RpZnkoY29uc3Qgc3RydWN0IHZ1X2Rl diAqZGV2LCBzdHJ1Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisJaWYgKCF2cS0+dnJpbmcuYXZhaWwp DQorCQlyZXR1cm47DQorDQorCWlmICghdnJpbmdfY2FuX25vdGlmeShkZXYsIHZxKSkgew0KKwkJ ZGVidWcoInZob3N0LXVzZXI6IHZpcnRxdWV1ZSBjYW4gc2tpcCBub3RpZnkuLi4iKTsNCisJCXJl dHVybjsNCisJfQ0KKw0KKwlpZiAoZXZlbnRmZF93cml0ZSh2cS0+Y2FsbF9mZCwgMSkgPCAwKQ0K KwkJZGllX3BlcnJvcigiRXJyb3Igd3JpdGluZyB2aG9zdC11c2VyIHF1ZXVlIGV2ZW50ZmQiKTsN Cit9DQorDQorLyogdmlydHFfYXZhaWxfZXZlbnQoKSAtICBHZXQgbG9jYXRpb24gb2YgYXZhaWxh YmxlIGV2ZW50IGluZGljZXMNCisgKgkJCSAgICAgIChvbmx5IHdpdGggVklSVElPX0ZfRVZFTlRf SURYKQ0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqDQorICogUmV0dXJuOiByZXR1cm4gdGhlIGxv Y2F0aW9uIG9mIHRoZSBhdmFpbGFibGUgZXZlbnQgaW5kZXgNCisgKi8NCitzdGF0aWMgaW5saW5l IHVpbnQxNl90ICp2aXJ0cV9hdmFpbF9ldmVudChjb25zdCBzdHJ1Y3QgdnVfdmlydHEgKnZxKQ0K K3sNCisgICAgICAgIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0LCBhdmFpbCBldmVudCBpbmRleCBp cyBhdCAqZW5kKiBvZiB1c2VkIHJpbmcuICovDQorICAgICAgICByZXR1cm4gKHVpbnQxNl90ICop JnZxLT52cmluZy51c2VkLT5yaW5nW3ZxLT52cmluZy5udW1dOw0KK30NCisNCisvKioNCisgKiB2 cmluZ19zZXRfYXZhaWxfZXZlbnQoKSAtIFNldCBhdmFpbF9ldmVudA0KKyAqIEB2cToJCVZpcnRx dWV1ZQ0KKyAqIEB2YWw6CVZhbHVlIHRvIHNldCB0byBhdmFpbF9ldmVudA0KKyAqCQlhdmFpbF9l dmVudCBpcyB1c2VkIGluIHRoZSBzYW1lIHdheSB0aGUgdXNlZF9ldmVudCBpcyBpbiB0aGUNCisg KgkJYXZhaWxfcmluZy4NCisgKgkJYXZhaWxfZXZlbnQgaXMgdXNlZCB0byBhZHZpc2UgdGhlIGRy aXZlciB0aGF0IG5vdGlmaWNhdGlvbnMNCisgKgkJYXJlIHVubmVjZXNzYXJ5IHVudGlsIHRoZSBk cml2ZXIgd3JpdGVzIGVudHJ5IHdpdGggYW4gaW5kZXgNCisgKgkJc3BlY2lmaWVkIGJ5IGF2YWls X2V2ZW50IGludG8gdGhlIGF2YWlsYWJsZSByaW5nLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCB2cmluZ19zZXRfYXZhaWxfZXZlbnQoY29uc3Qgc3RydWN0IHZ1X3ZpcnRxICp2cSwNCisJCQkJ CSB1aW50MTZfdCB2YWwpDQorew0KKwl1aW50MTZfdCB2YWxfbGUgPSBodG9sZTE2KHZhbCk7DQor DQorCWlmICghdnEtPm5vdGlmaWNhdGlvbikNCisJCXJldHVybjsNCisNCisJbWVtY3B5KHZpcnRx X2F2YWlsX2V2ZW50KHZxKSwgJnZhbF9sZSwgc2l6ZW9mKHZhbF9sZSkpOw0KK30NCisNCisvKioN CisgKiB2aXJ0cXVldWVfbWFwX2Rlc2MoKSAtIFRyYW5zbGF0ZSBkZXNjcmlwdG9yIHJpbmcgcGh5 c2ljYWwgYWRkcmVzcyBpbnRvIG91cg0KKyAqIAkJCSAgdmlydHVhbCBhZGRyZXNzIHNwYWNlDQor ICogQGRldjoJVmhvc3QtdXNlciBkZXZpY2UNCisgKiBAcF9udW1fc2c6CUZpcnN0IGlvdiBlbnRy eSB0byB1c2UgKGlucHV0KSwNCisgKgkJZmlyc3QgaW92IGVudHJ5IG5vdCB1c2VkIChvdXRwdXQp DQorICogQGlvdjoJSW92IGFycmF5IHRvIHVzZSB0byBzdG9yZSBidWZmZXIgdmlydHVhbCBhZGRy ZXNzZXMNCisgKiBAbWF4X251bV9zZzoJTWF4aW11bSBudW1iZXIgb2YgaW92IGVudHJpZXMNCisg KiBAcGE6CQlHdWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gbWFwIGludG8g b3VyIHZpcnR1YWwNCisgKiAJCWFkZHJlc3MNCisgKiBAc3o6CQlTaXplIG9mIHRoZSBidWZmZXIN CisgKg0KKyAqIFJldHVybjogZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlDQorICovDQor c3RhdGljIGJvb2wgdmlydHF1ZXVlX21hcF9kZXNjKHN0cnVjdCB2dV9kZXYgKmRldiwNCisJCQkg ICAgICAgdW5zaWduZWQgaW50ICpwX251bV9zZywgc3RydWN0IGlvdmVjICppb3YsDQorCQkJICAg ICAgIHVuc2lnbmVkIGludCBtYXhfbnVtX3NnLA0KKwkJCSAgICAgICB1aW50NjRfdCBwYSwgc2l6 ZV90IHN6KQ0KK3sNCisJdW5zaWduZWQgaW50IG51bV9zZyA9ICpwX251bV9zZzsNCisNCisJQVNT RVJUKG51bV9zZyA8IG1heF9udW1fc2cpOw0KKwlBU1NFUlQoc3opOw0KKw0KKwl3aGlsZSAoc3op IHsNCisJCXVpbnQ2NF90IGxlbiA9IHN6Ow0KKw0KKwkJaW92W251bV9zZ10uaW92X2Jhc2UgPSB2 dV9ncGFfdG9fdmEoZGV2LCAmbGVuLCBwYSk7DQorCQlpZiAoaW92W251bV9zZ10uaW92X2Jhc2Ug PT0gTlVMTCkNCisJCQlkaWUoInZob3N0LXVzZXI6IGludmFsaWQgYWRkcmVzcyBmb3IgYnVmZmVy cyIpOw0KKwkJaW92W251bV9zZ10uaW92X2xlbiA9IGxlbjsNCisJCW51bV9zZysrOw0KKwkJc3og LT0gbGVuOw0KKwkJcGEgKz0gbGVuOw0KKwl9DQorDQorCSpwX251bV9zZyA9IG51bV9zZzsNCisJ cmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qKg0KKyAqIHZ1X3F1ZXVlX21hcF9kZXNjIC0gTWFwIHRo ZSB2aXJ0cXVldWUgZGVzY3JpcHRvciByaW5nIGludG8gb3VyIHZpcnR1YWwNCisgKiAJCSAgICAg ICBhZGRyZXNzIHNwYWNlDQorICogQGRldjoJVmhvc3QtdXNlciBkZXZpY2UNCisgKiBAdnE6CQlW aXJ0cXVldWUNCisgKiBAaWR4OglGaXJzdCBkZXNjcmlwdG9yIHJpbmcgZW50cnkgdG8gbWFwDQor ICogQGVsZW06CVZpcnRxdWV1ZSBlbGVtZW50IHRvIHN0b3JlIGRlc2NyaXB0b3IgcmluZyBpb3YN CisgKg0KKyAqIFJldHVybjogLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIDAgb3RoZXJ3aXNlDQor ICovDQorc3RhdGljIGludCB2dV9xdWV1ZV9tYXBfZGVzYyhzdHJ1Y3QgdnVfZGV2ICpkZXYsIHN0 cnVjdCB2dV92aXJ0cSAqdnEsIHVuc2lnbmVkIGludCBpZHgsDQorCQkJICAgICBzdHJ1Y3QgdnVf dmlydHFfZWxlbWVudCAqZWxlbSkNCit7DQorCWNvbnN0IHN0cnVjdCB2cmluZ19kZXNjICpkZXNj ID0gdnEtPnZyaW5nLmRlc2M7DQorCXN0cnVjdCB2cmluZ19kZXNjIGRlc2NfYnVmW1ZJUlRRVUVV RV9NQVhfU0laRV07DQorCXVuc2lnbmVkIGludCBvdXRfbnVtID0gMCwgaW5fbnVtID0gMDsNCisJ dW5zaWduZWQgaW50IG1heCA9IHZxLT52cmluZy5udW07DQorCXVuc2lnbmVkIGludCBpID0gaWR4 Ow0KKwl1aW50NjRfdCByZWFkX2xlbjsNCisJaW50IHJjOw0KKw0KKwlpZiAobGUxNnRvaChkZXNj W2ldLmZsYWdzKSAmIFZSSU5HX0RFU0NfRl9JTkRJUkVDVCkgew0KKwkJdW5zaWduZWQgaW50IGRl c2NfbGVuOw0KKwkJdWludDY0X3QgZGVzY19hZGRyOw0KKw0KKwkJaWYgKGxlMzJ0b2goZGVzY1tp XS5sZW4pICUgc2l6ZW9mKHN0cnVjdCB2cmluZ19kZXNjKSkNCisJCQlkaWUoInZob3N0LXVzZXI6 IEludmFsaWQgc2l6ZSBmb3IgaW5kaXJlY3QgYnVmZmVyIHRhYmxlIik7DQorDQorCQkvKiBsb29w IG92ZXIgdGhlIGluZGlyZWN0IGRlc2NyaXB0b3IgdGFibGUgKi8NCisJCWRlc2NfYWRkciA9IGxl NjR0b2goZGVzY1tpXS5hZGRyKTsNCisJCWRlc2NfbGVuID0gbGUzMnRvaChkZXNjW2ldLmxlbik7 DQorCQltYXggPSBkZXNjX2xlbiAvIHNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYyk7DQorCQlyZWFk X2xlbiA9IGRlc2NfbGVuOw0KKwkJZGVzYyA9IHZ1X2dwYV90b192YShkZXYsICZyZWFkX2xlbiwg ZGVzY19hZGRyKTsNCisJCWlmIChkZXNjICYmIHJlYWRfbGVuICE9IGRlc2NfbGVuKSB7DQorCQkJ LyogRmFpbGVkIHRvIHVzZSB6ZXJvIGNvcHkgKi8NCisJCQlkZXNjID0gTlVMTDsNCisJCQlpZiAo IXZpcnRxdWV1ZV9yZWFkX2luZGlyZWN0X2Rlc2MoZGV2LCBkZXNjX2J1ZiwgZGVzY19hZGRyLCBk ZXNjX2xlbikpDQorCQkJCWRlc2MgPSBkZXNjX2J1ZjsNCisJCX0NCisJCWlmICghZGVzYykNCisJ CQlkaWUoInZob3N0LXVzZXI6IEludmFsaWQgaW5kaXJlY3QgYnVmZmVyIHRhYmxlIik7DQorCQlp ID0gMDsNCisJfQ0KKw0KKwkvKiBDb2xsZWN0IGFsbCB0aGUgZGVzY3JpcHRvcnMgKi8NCisJZG8g ew0KKwkJaWYgKGxlMTZ0b2goZGVzY1tpXS5mbGFncykgJiBWUklOR19ERVNDX0ZfV1JJVEUpIHsN CisJCQlpZiAoIXZpcnRxdWV1ZV9tYXBfZGVzYyhkZXYsICZpbl9udW0sIGVsZW0tPmluX3NnLA0K KwkJCQkJCWVsZW0tPmluX251bSwNCisJCQkJCQlsZTY0dG9oKGRlc2NbaV0uYWRkciksDQorCQkJ CQkJbGUzMnRvaChkZXNjW2ldLmxlbikpKQ0KKwkJCQlyZXR1cm4gLTE7DQorCQl9IGVsc2Ugew0K KwkJCWlmIChpbl9udW0pDQorCQkJCWRpZSgiSW5jb3JyZWN0IG9yZGVyIGZvciBkZXNjcmlwdG9y cyIpOw0KKwkJCWlmICghdmlydHF1ZXVlX21hcF9kZXNjKGRldiwgJm91dF9udW0sIGVsZW0tPm91 dF9zZywNCisJCQkJCQllbGVtLT5vdXRfbnVtLA0KKwkJCQkJCWxlNjR0b2goZGVzY1tpXS5hZGRy KSwNCisJCQkJCQlsZTMydG9oKGRlc2NbaV0ubGVuKSkpIHsNCisJCQkJcmV0dXJuIC0xOw0KKwkJ CX0NCisJCX0NCisNCisJCS8qIElmIHdlJ3ZlIGdvdCB0b28gbWFueSwgdGhhdCBpbXBsaWVzIGEg ZGVzY3JpcHRvciBsb29wLiAqLw0KKwkJaWYgKChpbl9udW0gKyBvdXRfbnVtKSA+IG1heCkNCisJ CQlkaWUoInZob3N0LXVzZXI6IExvb3AgaW4gcXVldWUgZGVzY3JpcHRvciBsaXN0Iik7DQorCQly YyA9IHZpcnRxdWV1ZV9yZWFkX25leHRfZGVzYyhkZXNjLCBpLCBtYXgsICZpKTsNCisJfSB3aGls ZSAocmMgPT0gVklSVFFVRVVFX1JFQURfREVTQ19NT1JFKTsNCisNCisJaWYgKHJjID09IFZJUlRR VUVVRV9SRUFEX0RFU0NfRVJST1IpDQorCQlkaWUoInZob3N0LXVzZXI6IEZhaWxlZCB0byByZWFk IGRlc2NyaXB0b3IgbGlzdCIpOw0KKw0KKwllbGVtLT5pbmRleCA9IGlkeDsNCisJZWxlbS0+aW5f bnVtID0gaW5fbnVtOw0KKwllbGVtLT5vdXRfbnVtID0gb3V0X251bTsNCisNCisJcmV0dXJuIDA7 DQorfQ0KKw0KKy8qKg0KKyAqIHZ1X3F1ZXVlX3BvcCgpIC0gUG9wIGFuIGVudHJ5IGZyb20gdGhl IHZpcnRxdWV1ZQ0KKyAqIEBkZXY6CVZob3N0LXVzZXIgZGV2aWNlDQorICogQHZxOgkJVmlydHF1 ZXVlDQorICogQGVsZW06CVZpcnRxdWV1ZSBlbGVtZW50IHRvIGZpbGUgd2l0aCB0aGUgZW50cnkg aW5mb3JtYXRpb24NCisgKg0KKyAqIFJldHVybjogLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIDAg b3RoZXJ3aXNlDQorICovDQorLyogY3BwY2hlY2stc3VwcHJlc3MgdW51c2VkRnVuY3Rpb24gKi8N CitpbnQgdnVfcXVldWVfcG9wKHN0cnVjdCB2dV9kZXYgKmRldiwgc3RydWN0IHZ1X3ZpcnRxICp2 cSwgc3RydWN0IHZ1X3ZpcnRxX2VsZW1lbnQgKmVsZW0pDQorew0KKwl1bnNpZ25lZCBpbnQgaGVh ZDsNCisJaW50IHJldDsNCisNCisJaWYgKCF2cS0+dnJpbmcuYXZhaWwpDQorCQlyZXR1cm4gLTE7 DQorDQorCWlmICh2dV9xdWV1ZV9lbXB0eSh2cSkpDQorCQlyZXR1cm4gLTE7DQorDQorCS8qIE5l ZWRlZCBhZnRlciB2dV9xdWV1ZV9lbXB0eSgpLCBzZWUgY29tbWVudCBpbg0KKwkgKiB2aXJ0cXVl dWVfbnVtX2hlYWRzKCkuDQorCSAqLw0KKwlzbXBfcm1iKCk7DQorDQorCWlmICh2cS0+aW51c2Ug Pj0gdnEtPnZyaW5nLm51bSkNCisJCWRpZSgidmhvc3QtdXNlciBxdWV1ZSBzaXplIGV4Y2VlZGVk Iik7DQorDQorCXZpcnRxdWV1ZV9nZXRfaGVhZCh2cSwgdnEtPmxhc3RfYXZhaWxfaWR4KyssICZo ZWFkKTsNCisNCisJaWYgKHZ1X2hhc19mZWF0dXJlKGRldiwgVklSVElPX1JJTkdfRl9FVkVOVF9J RFgpKQ0KKwkJdnJpbmdfc2V0X2F2YWlsX2V2ZW50KHZxLCB2cS0+bGFzdF9hdmFpbF9pZHgpOw0K Kw0KKwlyZXQgPSB2dV9xdWV1ZV9tYXBfZGVzYyhkZXYsIHZxLCBoZWFkLCBlbGVtKTsNCisNCisJ aWYgKHJldCA8IDApDQorCQlyZXR1cm4gcmV0Ow0KKw0KKwl2cS0+aW51c2UrKzsNCisNCisJcmV0 dXJuIDA7DQorfQ0KKw0KKy8qKg0KKyAqIHZ1X3F1ZXVlX2RldGFjaF9lbGVtZW50KCkgLSBEZXRh Y2ggYW4gZWxlbWVudCBmcm9tIHRoZSB2aXJxdWV1ZQ0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAq Lw0KK3ZvaWQgdnVfcXVldWVfZGV0YWNoX2VsZW1lbnQoc3RydWN0IHZ1X3ZpcnRxICp2cSkNCit7 DQorCXZxLT5pbnVzZS0tOw0KKwkvKiB1bm1hcCwgd2hlbiBETUEgc3VwcG9ydCBpcyBhZGRlZCAq Lw0KK30NCisNCisvKioNCisgKiB2dV9xdWV1ZV91bnBvcCgpIC0gUHVzaCBiYWNrIHRoZSBwcmV2 aW91c2x5IHBvcHBlZCBlbGVtZW50IGZyb20gdGhlIHZpcnF1ZXVlDQorICogQHZxOgkJVmlydHF1 ZXVlDQorICovDQorLyogY3BwY2hlY2stc3VwcHJlc3MgdW51c2VkRnVuY3Rpb24gKi8NCit2b2lk IHZ1X3F1ZXVlX3VucG9wKHN0cnVjdCB2dV92aXJ0cSAqdnEpDQorew0KKwl2cS0+bGFzdF9hdmFp bF9pZHgtLTsNCisJdnVfcXVldWVfZGV0YWNoX2VsZW1lbnQodnEpOw0KK30NCisNCisvKioNCisg KiB2dV9xdWV1ZV9yZXdpbmQoKSAtIFB1c2ggYmFjayBhIGdpdmVuIG51bWJlciBvZiBwb3BwZWQg ZWxlbWVudHMNCisgKiBAdnE6CQlWaXJ0cXVldWUNCisgKiBAbnVtOglOdW1iZXIgb2YgZWxlbWVu dCB0byB1bnBvcA0KKyAqLw0KKy8qIGNwcGNoZWNrLXN1cHByZXNzIHVudXNlZEZ1bmN0aW9uICov DQorYm9vbCB2dV9xdWV1ZV9yZXdpbmQoc3RydWN0IHZ1X3ZpcnRxICp2cSwgdW5zaWduZWQgaW50 IG51bSkNCit7DQorCWlmIChudW0gPiB2cS0+aW51c2UpDQorCQlyZXR1cm4gZmFsc2U7DQorDQor CXZxLT5sYXN0X2F2YWlsX2lkeCAtPSBudW07DQorCXZxLT5pbnVzZSAtPSBudW07DQorCXJldHVy biB0cnVlOw0KK30NCisNCisvKioNCisgKiB2cmluZ191c2VkX3dyaXRlKCkgLSBXcml0ZSBhbiBl bnRyeSBpbiB0aGUgdXNlZCByaW5nDQorICogQHZxOgkJVmlydHF1ZXVlDQorICogQHVlbGVtOglF bnRyeSB0byB3cml0ZQ0KKyAqIEBpOgkJSW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSB1c2VkIHJp bmcNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgdnJpbmdfdXNlZF93cml0ZShzdHJ1Y3QgdnVf dmlydHEgKnZxLA0KKwkJCQkgICAgY29uc3Qgc3RydWN0IHZyaW5nX3VzZWRfZWxlbSAqdWVsZW0s IGludCBpKQ0KK3sNCisJc3RydWN0IHZyaW5nX3VzZWQgKnVzZWQgPSB2cS0+dnJpbmcudXNlZDsN CisNCisJdXNlZC0+cmluZ1tpXSA9ICp1ZWxlbTsNCit9DQorDQorLyoqDQorICogdnVfcXVldWVf ZmlsbF9ieV9pbmRleCgpIC0gVXBkYXRlIGluZm9ybWF0aW9uIG9mIGEgZGVzY3JpcHRvciByaW5n IGVudHJ5DQorICoJCQkgICAgICBpbiB0aGUgdXNlZCByaW5nDQorICogQHZxOgkJVmlydHF1ZXVl DQorICogQGluZGV4OglEZXNjcmlwdG9yIHJpbmcgaW5kZXgNCisgKiBAbGVuOglTaXplIG9mIHRo ZSBlbGVtZW50DQorICogQGlkeDoJVXNlZCByaW5nIGVudHJ5IGluZGV4DQorICovDQordm9pZCB2 dV9xdWV1ZV9maWxsX2J5X2luZGV4KHN0cnVjdCB2dV92aXJ0cSAqdnEsIHVuc2lnbmVkIGludCBp bmRleCwNCisJCQkgICAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGlkeCkNCit7DQor CXN0cnVjdCB2cmluZ191c2VkX2VsZW0gdWVsZW07DQorDQorCWlmICghdnEtPnZyaW5nLmF2YWls KQ0KKwkJcmV0dXJuOw0KKw0KKwlpZHggPSAoaWR4ICsgdnEtPnVzZWRfaWR4KSAlIHZxLT52cmlu Zy5udW07DQorDQorCXVlbGVtLmlkID0gaHRvbGUzMihpbmRleCk7DQorCXVlbGVtLmxlbiA9IGh0 b2xlMzIobGVuKTsNCisJdnJpbmdfdXNlZF93cml0ZSh2cSwgJnVlbGVtLCBpZHgpOw0KK30NCisN CisvKioNCisgKiB2dV9xdWV1ZV9maWxsKCkgLSBVcGRhdGUgaW5mb3JtYXRpb24gb2YgYSBnaXZl biBlbGVtZW50IGluIHRoZSB1c2VkIHJpbmcNCisgKiBAZGV2OglWaG9zdC11c2VyIGRldmljZQ0K KyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqIEBlbGVtOglFbGVtZW50IGluZm9ybWF0aW9uIHRvIGZp bGwNCisgKiBAbGVuOglTaXplIG9mIHRoZSBlbGVtZW50DQorICogQGlkeDoJVXNlZCByaW5nIGVu dHJ5IGluZGV4DQorICovDQorLyogY3BwY2hlY2stc3VwcHJlc3MgdW51c2VkRnVuY3Rpb24gKi8N Cit2b2lkIHZ1X3F1ZXVlX2ZpbGwoc3RydWN0IHZ1X3ZpcnRxICp2cSwgY29uc3Qgc3RydWN0IHZ1 X3ZpcnRxX2VsZW1lbnQgKmVsZW0sDQorCQkgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBp bnQgaWR4KQ0KK3sNCisJdnVfcXVldWVfZmlsbF9ieV9pbmRleCh2cSwgZWxlbS0+aW5kZXgsIGxl biwgaWR4KTsNCit9DQorDQorLyoqDQorICogdnJpbmdfdXNlZF9pZHhfc2V0KCkgLSBTZXQgdGhl IGRlc2NyaXB0b3IgcmluZyBjdXJyZW50IGluZGV4DQorICogQHZxOgkJVmlydHF1ZXVlDQorICog QHZhbDoJVmFsdWUgdG8gc2V0IGluIHRoZSBpbmRleA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCB2cmluZ191c2VkX2lkeF9zZXQoc3RydWN0IHZ1X3ZpcnRxICp2cSwgdWludDE2X3QgdmFsKQ0K K3sNCisJdnEtPnZyaW5nLnVzZWQtPmlkeCA9IGh0b2xlMTYodmFsKTsNCisNCisJdnEtPnVzZWRf aWR4ID0gdmFsOw0KK30NCisNCisvKioNCisgKiB2dV9xdWV1ZV9mbHVzaCgpIC0gRmx1c2ggdGhl IHZpcnRxdWV1ZQ0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqIEBjb3VudDoJTnVtYmVyIG9mIGVu dHJ5IHRvIGZsdXNoDQorICovDQorLyogY3BwY2hlY2stc3VwcHJlc3MgdW51c2VkRnVuY3Rpb24g Ki8NCit2b2lkIHZ1X3F1ZXVlX2ZsdXNoKHN0cnVjdCB2dV92aXJ0cSAqdnEsIHVuc2lnbmVkIGlu dCBjb3VudCkNCit7DQorCXVpbnQxNl90IG9sZCwgbmV3Ow0KKw0KKwlpZiAoIXZxLT52cmluZy5h dmFpbCkNCisJCXJldHVybjsNCisNCisJLyogTWFrZSBzdXJlIGJ1ZmZlciBpcyB3cml0dGVuIGJl Zm9yZSB3ZSB1cGRhdGUgaW5kZXguICovDQorCXNtcF93bWIoKTsNCisNCisJb2xkID0gdnEtPnVz ZWRfaWR4Ow0KKwluZXcgPSBvbGQgKyBjb3VudDsNCisJdnJpbmdfdXNlZF9pZHhfc2V0KHZxLCBu ZXcpOw0KKwl2cS0+aW51c2UgLT0gY291bnQ7DQorCWlmICgodWludDE2X3QpKG5ldyAtIHZxLT5z aWduYWxsZWRfdXNlZCkgPCAodWludDE2X3QpKG5ldyAtIG9sZCkpDQorCQl2cS0+c2lnbmFsbGVk X3VzZWRfdmFsaWQgPSBmYWxzZTsNCit9DQpkaWZmIC0tZ2l0IGEvdmlydGlvLmggYi92aXJ0aW8u aA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjk0ZWZlYjANCi0tLSAvZGV2 L251bGwNCisrKyBiL3ZpcnRpby5oDQpAQCAtMCwwICsxLDE4MyBAQA0KKy8vIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyDQorLyoNCisgKiB2aXJ0aW8gQVBJLCB2cmlu ZyBhbmQgdmlydHF1ZXVlIGZ1bmN0aW9ucyBkZWZpbml0aW9uDQorICoNCisgKiBDb3B5cmlnaHQg UmVkIEhhdA0KKyAqIEF1dGhvcjogTGF1cmVudCBWaXZpZXIgPGx2aXZpZXJAcmVkaGF0LmNvbT4N CisgKi8NCisNCisjaWZuZGVmIFZJUlRJT19IDQorI2RlZmluZSBWSVJUSU9fSA0KKw0KKyNpbmNs dWRlIDxzdGRib29sLmg+DQorI2luY2x1ZGUgPGxpbnV4L3Zob3N0X3R5cGVzLmg+DQorDQorLyog TWF4aW11bSBzaXplIG9mIGEgdmlydHF1ZXVlICovDQorI2RlZmluZSBWSVJUUVVFVUVfTUFYX1NJ WkUgMTAyNA0KKw0KKy8qKg0KKyAqIHN0cnVjdCB2dV9yaW5nIC0gVmlydHF1ZXVlIHJpbmdzDQor ICogQG51bToJCVNpemUgb2YgdGhlIHF1ZXVlDQorICogQGRlc2M6CQlEZXNjcmlwdG9yIHJpbmcN CisgKiBAYXZhaWw6CQlBdmFpbGFibGUgcmluZw0KKyAqIEB1c2VkOgkJVXNlZCByaW5nDQorICog QGxvZ19ndWVzdF9hZGRyOglHdWVzdCBhZGRyZXNzIGZvciBsb2dnaW5nDQorICogQGZsYWdzOgkJ VnJpbmcgZmxhZ3MNCisgKiAJCQlWSE9TVF9WUklOR19GX0xPRyBpcyBzZXQgaWYgbG9nIGFkZHJl c3MgaXMgdmFsaWQNCisgKi8NCitzdHJ1Y3QgdnVfcmluZyB7DQorCXVuc2lnbmVkIGludCBudW07 DQorCXN0cnVjdCB2cmluZ19kZXNjICpkZXNjOw0KKwlzdHJ1Y3QgdnJpbmdfYXZhaWwgKmF2YWls Ow0KKwlzdHJ1Y3QgdnJpbmdfdXNlZCAqdXNlZDsNCisJdWludDY0X3QgbG9nX2d1ZXN0X2FkZHI7 DQorCXVpbnQzMl90IGZsYWdzOw0KK307DQorDQorLyoqDQorICogc3RydWN0IHZ1X3ZpcnRxIC0g VmlydHF1ZXVlIGRlZmluaXRpb24NCisgKiBAdnJpbmc6CQkJVmlydHF1ZXVlIHJpbmdzDQorICog QGxhc3RfYXZhaWxfaWR4OgkJTmV4dCBoZWFkIHRvIHBvcA0KKyAqIEBzaGFkb3dfYXZhaWxfaWR4 OgkJTGFzdCBhdmFpbF9pZHggcmVhZCBmcm9tIFZRLg0KKyAqIEB1c2VkX2lkeDoJCQlEZXNjcmlw dG9yIHJpbmcgY3VycmVudCBpbmRleA0KKyAqIEBzaWduYWxsZWRfdXNlZDoJCUxhc3QgdXNlZCBp bmRleCB2YWx1ZSB3ZSBoYXZlIHNpZ25hbGxlZCBvbg0KKyAqIEBzaWduYWxsZWRfdXNlZF92YWxp ZDoJVHJ1ZSBpZiBzaWduYWxsZWRfdXNlZCBpZiB2YWxpZA0KKyAqIEBub3RpZmljYXRpb246CQlU cnVlIGlmIHRoZSBxdWV1ZXMgbm90aWZ5ICh2aWEgZXZlbnQNCisgKiAJCQkJaW5kZXggb3IgaW50 ZXJydXB0KQ0KKyAqIEBpbnVzZToJCQlOdW1iZXIgb2YgZW50cmllcyBpbiB1c2UNCisgKiBAY2Fs bF9mZDoJCQlUaGUgZXZlbnQgZmlsZSBkZXNjcmlwdG9yIHRvIHNpZ25hbCB3aGVuDQorICogCQkJ CWJ1ZmZlcnMgYXJlIHVzZWQuDQorICogQGtpY2tfZmQ6CQkJVGhlIGV2ZW50IGZpbGUgZGVzY3Jp cHRvciBmb3IgYWRkaW5nDQorICogCQkJCWJ1ZmZlcnMgdG8gdGhlIHZyaW5nDQorICogQGVycl9m ZDoJCQlUaGUgZXZlbnQgZmlsZSBkZXNjcmlwdG9yIHRvIHNpZ25hbCB3aGVuDQorICogCQkJCWVy cm9yIG9jY3Vycw0KKyAqIEBlbmFibGU6CQkJVHJ1ZSBpZiB0aGUgdmlydHF1ZXVlIGlzIGVuYWJs ZWQNCisgKiBAc3RhcnRlZDoJCQlUcnVlIGlmIHRoZSB2aXJ0cXVldWUgaXMgc3RhcnRlZA0KKyAq IEB2cmE6CQkJUUVNVSBhZGRyZXNzIG9mIG91ciByaW5ncw0KKyAqLw0KK3N0cnVjdCB2dV92aXJ0 cSB7DQorCXN0cnVjdCB2dV9yaW5nIHZyaW5nOw0KKwl1aW50MTZfdCBsYXN0X2F2YWlsX2lkeDsN CisJdWludDE2X3Qgc2hhZG93X2F2YWlsX2lkeDsNCisJdWludDE2X3QgdXNlZF9pZHg7DQorCXVp bnQxNl90IHNpZ25hbGxlZF91c2VkOw0KKwlib29sIHNpZ25hbGxlZF91c2VkX3ZhbGlkOw0KKwli b29sIG5vdGlmaWNhdGlvbjsNCisJdW5zaWduZWQgaW50IGludXNlOw0KKwlpbnQgY2FsbF9mZDsN CisJaW50IGtpY2tfZmQ7DQorCWludCBlcnJfZmQ7DQorCXVuc2lnbmVkIGludCBlbmFibGU7DQor CWJvb2wgc3RhcnRlZDsNCisJc3RydWN0IHZob3N0X3ZyaW5nX2FkZHIgdnJhOw0KK307DQorDQor LyoqDQorICogc3RydWN0IHZ1X2Rldl9yZWdpb24gLSBndWVzdCBzaGFyZWQgbWVtb3J5IHJlZ2lv bg0KKyAqIEBncGE6CQlHdWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSByZWdpb24NCisgKiBA c2l6ZToJCU1lbW9yeSBzaXplIGluIGJ5dGVzDQorICogQHF2YToJCVFFTVUgdmlydHVhbCBhZGRy ZXNzDQorICogQG1tYXBfb2Zmc2V0OglPZmZzZXQgd2hlcmUgdGhlIHJlZ2lvbiBzdGFydHMgaW4g dGhlIG1hcHBlZCBtZW1vcnkNCisgKiBAbW1hcF9hZGRyOgkJQWRkcmVzcyBvZiB0aGUgbWFwcGVk IG1lbW9yeQ0KKyAqLw0KK3N0cnVjdCB2dV9kZXZfcmVnaW9uIHsNCisJdWludDY0X3QgZ3BhOw0K Kwl1aW50NjRfdCBzaXplOw0KKwl1aW50NjRfdCBxdmE7DQorCXVpbnQ2NF90IG1tYXBfb2Zmc2V0 Ow0KKwl1aW50NjRfdCBtbWFwX2FkZHI7DQorfTsNCisNCisjZGVmaW5lIFZIT1NUX1VTRVJfTUFY X1FVRVVFUyAyDQorDQorLyoNCisgKiBTZXQgYSByZWFzb25hYmxlIG1heGltdW0gbnVtYmVyIG9m IHJhbSBzbG90cywgd2hpY2ggd2lsbCBiZSBzdXBwb3J0ZWQgYnkNCisgKiBhbnkgYXJjaGl0ZWN0 dXJlLg0KKyAqLw0KKyNkZWZpbmUgVkhPU1RfVVNFUl9NQVhfUkFNX1NMT1RTIDMyDQorDQorLyoq DQorICogc3RydWN0IHZ1X2RldiAtIHZob3N0LXVzZXIgZGV2aWNlIGluZm9ybWF0aW9uDQorICog QGNvbnRleHQ6CQlFeGVjdXRpb24gY29udGV4dA0KKyAqIEBucmVnaW9uczoJCU51bWJlciBvZiBz aGFyZWQgbWVtb3J5IHJlZ2lvbnMNCisgKiBAcmVnaW9uczoJCUd1ZXN0IHNoYXJlZCBtZW1vcnkg cmVnaW9ucw0KKyAqIEBmZWF0dXJlczoJCVZob3N0LXVzZXIgZmVhdHVyZXMNCisgKiBAcHJvdG9j b2xfZmVhdHVyZXM6CVZob3N0LXVzZXIgcHJvdG9jb2wgZmVhdHVyZXMNCisgKi8NCitzdHJ1Y3Qg dnVfZGV2IHsNCisJdWludDMyX3QgbnJlZ2lvbnM7DQorCXN0cnVjdCB2dV9kZXZfcmVnaW9uIHJl Z2lvbnNbVkhPU1RfVVNFUl9NQVhfUkFNX1NMT1RTXTsNCisJc3RydWN0IHZ1X3ZpcnRxIHZxW1ZI T1NUX1VTRVJfTUFYX1FVRVVFU107DQorCXVpbnQ2NF90IGZlYXR1cmVzOw0KKwl1aW50NjRfdCBw cm90b2NvbF9mZWF0dXJlczsNCit9Ow0KKw0KKy8qKg0KKyAqIHN0cnVjdCB2dV92aXJ0cV9lbGVt ZW50IC0gdmlydHF1ZXVlIGVsZW1lbnQNCisgKiBAaW5kZXg6CURlc2NyaXB0b3IgcmluZyBpbmRl eA0KKyAqIEBvdXRfbnVtOglOdW1iZXIgb2Ygb3V0Z29pbmcgaW92ZWMgYnVmZmVycw0KKyAqIEBp bl9udW06CU51bWJlciBvZiBpbmNvbWluZyBpb3ZlYyBidWZmZXJzDQorICogQGluX3NnOglJbmNv bWluZyBpb3ZlYyBidWZmZXJzDQorICogQG91dF9zZzoJT3V0Z29pbmcgaW92ZWMgYnVmZmVycw0K KyAqLw0KK3N0cnVjdCB2dV92aXJ0cV9lbGVtZW50IHsNCisJdW5zaWduZWQgaW50IGluZGV4Ow0K Kwl1bnNpZ25lZCBpbnQgb3V0X251bTsNCisJdW5zaWduZWQgaW50IGluX251bTsNCisJc3RydWN0 IGlvdmVjICppbl9zZzsNCisJc3RydWN0IGlvdmVjICpvdXRfc2c7DQorfTsNCisNCisvKioNCisg KiBoYXNfZmVhdHVyZSgpIC0gQ2hlY2sgYSBmZWF0dXJlIGJpdCBpbiBhIGZlYXR1cmVzIHNldA0K KyAqIEBmZWF0dXJlczoJRmVhdHVyZXMgc2V0DQorICogQGZiOgkJRmVhdHVyZSBiaXQgdG8gY2hl Y2sNCisgKg0KKyAqIFJldHVybjoJVHJ1ZSBpZiB0aGUgZmVhdHVyZSBiaXQgaXMgc2V0DQorICov DQorc3RhdGljIGlubGluZSBib29sIGhhc19mZWF0dXJlKHVpbnQ2NF90IGZlYXR1cmVzLCB1bnNp Z25lZCBpbnQgZmJpdCkNCit7DQorCXJldHVybiAhIShmZWF0dXJlcyAmICgxVUxMIDw8IGZiaXQp KTsNCit9DQorDQorLyoqDQorICogdnVfaGFzX2ZlYXR1cmUoKSAtIENoZWNrIGlmIGEgdmlydGlv LW5ldCBmZWF0dXJlIGlzIGF2YWlsYWJsZQ0KKyAqIEB2ZGV2OglWaG9zdC11c2VyIGRldmljZQ0K KyAqIEBiaXQ6CUZlYXR1cmUgdG8gY2hlY2sNCisgKg0KKyAqIFJldHVybjoJVHJ1ZSBpZiB0aGUg ZmVhdHVyZSBpcyBhdmFpbGFibGUNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgdnVfaGFzX2Zl YXR1cmUoY29uc3Qgc3RydWN0IHZ1X2RldiAqdmRldiwNCisJCQkJICB1bnNpZ25lZCBpbnQgZmJp dCkNCit7DQorCXJldHVybiBoYXNfZmVhdHVyZSh2ZGV2LT5mZWF0dXJlcywgZmJpdCk7DQorfQ0K Kw0KKy8qKg0KKyAqIHZ1X2hhc19wcm90b2NvbF9mZWF0dXJlKCkgLSBDaGVjayBpZiBhIHZob3N0 LXVzZXIgZmVhdHVyZSBpcyBhdmFpbGFibGUNCisgKiBAdmRldjoJVmhvc3QtdXNlciBkZXZpY2UN CisgKiBAYml0OglGZWF0dXJlIHRvIGNoZWNrDQorICoNCisgKiBSZXR1cm46CVRydWUgaWYgdGhl IGZlYXR1cmUgaXMgYXZhaWxhYmxlDQorICovDQorLyogY3BwY2hlY2stc3VwcHJlc3MgdW51c2Vk RnVuY3Rpb24gKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgdnVfaGFzX3Byb3RvY29sX2ZlYXR1cmUo Y29uc3Qgc3RydWN0IHZ1X2RldiAqdmRldiwNCisJCQkJCSAgIHVuc2lnbmVkIGludCBmYml0KQ0K K3sNCisJcmV0dXJuIGhhc19mZWF0dXJlKHZkZXYtPnByb3RvY29sX2ZlYXR1cmVzLCBmYml0KTsN Cit9DQorDQorYm9vbCB2dV9xdWV1ZV9lbXB0eShzdHJ1Y3QgdnVfdmlydHEgKnZxKTsNCit2b2lk IHZ1X3F1ZXVlX25vdGlmeShjb25zdCBzdHJ1Y3QgdnVfZGV2ICpkZXYsIHN0cnVjdCB2dV92aXJ0 cSAqdnEpOw0KK2ludCB2dV9xdWV1ZV9wb3Aoc3RydWN0IHZ1X2RldiAqZGV2LCBzdHJ1Y3QgdnVf dmlydHEgKnZxLA0KKwkJIHN0cnVjdCB2dV92aXJ0cV9lbGVtZW50ICplbGVtKTsNCit2b2lkIHZ1 X3F1ZXVlX2RldGFjaF9lbGVtZW50KHN0cnVjdCB2dV92aXJ0cSAqdnEpOw0KK3ZvaWQgdnVfcXVl dWVfdW5wb3Aoc3RydWN0IHZ1X3ZpcnRxICp2cSk7DQorYm9vbCB2dV9xdWV1ZV9yZXdpbmQoc3Ry dWN0IHZ1X3ZpcnRxICp2cSwgdW5zaWduZWQgaW50IG51bSk7DQordm9pZCB2dV9xdWV1ZV9maWxs X2J5X2luZGV4KHN0cnVjdCB2dV92aXJ0cSAqdnEsIHVuc2lnbmVkIGludCBpbmRleCwNCisJCQkg ICAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGlkeCk7DQordm9pZCB2dV9xdWV1ZV9m aWxsKHN0cnVjdCB2dV92aXJ0cSAqdnEsDQorCQkgICBjb25zdCBzdHJ1Y3QgdnVfdmlydHFfZWxl bWVudCAqZWxlbSwgdW5zaWduZWQgaW50IGxlbiwNCisJCSAgIHVuc2lnbmVkIGludCBpZHgpOw0K K3ZvaWQgdnVfcXVldWVfZmx1c2goc3RydWN0IHZ1X3ZpcnRxICp2cSwgdW5zaWduZWQgaW50IGNv dW50KTsNCisjZW5kaWYgLyogVklSVElPX0ggKi8NCi0tIA0KMi40Ny4wDQoNCg==