From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: passt.top; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=ZDlA20x0; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by passt.top (Postfix) with ESMTP id ED2535A0262 for ; Wed, 09 Oct 2024 11:07:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1728464845; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GlHnbppIHzBdiR1wxoo3yUIYkyCLMJ1q1bCZ8JlQFkc=; b=ZDlA20x0fJv7WrvWgRRXtyFUhJFZsuYp+0Pq0uZXoLQEbY2xJYZtOPqGe+aWtBvKFpLEJ2 UtrVsBxeNndcz2euNRp+5SZZYQVpDEdCBnpdH/+7xKfNyDbJJh6FXB708NQhMnZlhmr4jf xujV6NgSTa7B3yaXotzwEn2Mvm1HHk4= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-208-4TO1_rR1OpqWQbDMEaNCIQ-1; Wed, 09 Oct 2024 05:07:23 -0400 X-MC-Unique: 4TO1_rR1OpqWQbDMEaNCIQ-1 Received: from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.15]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E15351955F34 for ; Wed, 9 Oct 2024 09:07:22 +0000 (UTC) Received: from lenovo-t14s.redhat.com (unknown [10.39.192.184]) by mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id B9AE61956086; Wed, 9 Oct 2024 09:07:21 +0000 (UTC) From: Laurent Vivier To: passt-dev@passt.top Subject: [PATCH v7 2/8] vhost-user: introduce virtio API Date: Wed, 9 Oct 2024 11:07:09 +0200 Message-ID: <20241009090716.691361-3-lvivier@redhat.com> In-Reply-To: <20241009090716.691361-1-lvivier@redhat.com> References: <20241009090716.691361-1-lvivier@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Message-ID-Hash: 4SURPWWOB5DFXXYXOWN63GUAPGKA7OUF X-Message-ID-Hash: 4SURPWWOB5DFXXYXOWN63GUAPGKA7OUF X-MailFrom: lvivier@redhat.com 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 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: QWRkIHZpcnRpby5jIGFuZCB2aXJ0aW8uaCB0aGF0IGRlZmluZSB0aGUgZnVuY3Rpb25zIG5lZWRl ZA0KdG8gbWFuYWdlIHZpcnRxdWV1ZXMuDQoNClNpZ25lZC1vZmYtYnk6IExhdXJlbnQgVml2aWVy IDxsdml2aWVyQHJlZGhhdC5jb20+DQotLS0NCiBNYWtlZmlsZSB8ICAgNCArLQ0KIHV0aWwuaCAg IHwgICA4ICsNCiB2aXJ0aW8uYyB8IDY2NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrDQogdmlydGlvLmggfCAxODMgKysrKysrKysrKysrKysr DQogNCBmaWxlcyBjaGFuZ2VkLCA4NTggaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkNCiBj cmVhdGUgbW9kZSAxMDA2NDQgdmlydGlvLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgdmlydGlvLmgN Cg0KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUNCmluZGV4IDc0YTk1MTMwZDA4Mi4u YTIyNTg4OTFmMTA0IDEwMDY0NA0KLS0tIGEvTWFrZWZpbGUNCisrKyBiL01ha2VmaWxlDQpAQCAt NTQsNyArNTQsNyBAQCBGTEFHUyArPSAtRERVQUxfU1RBQ0tfU09DS0VUUz0kKERVQUxfU1RBQ0tf U09DS0VUUykNCiBQQVNTVF9TUkNTID0gYXJjaC5jIGFycC5jIGNoZWNrc3VtLmMgY29uZi5jIGRo Y3AuYyBkaGNwdjYuYyBmbG93LmMgZndkLmMgXA0KIAlpY21wLmMgaWdtcC5jIGluYW55LmMgaW92 LmMgaXAuYyBpc29sYXRpb24uYyBsaW5lcmVhZC5jIGxvZy5jIG1sZC5jIFwNCiAJbmRwLmMgbmV0 bGluay5jIHBhY2tldC5jIHBhc3N0LmMgcGFzdGEuYyBwY2FwLmMgcGlmLmMgdGFwLmMgdGNwLmMg XA0KLQl0Y3BfYnVmLmMgdGNwX3NwbGljZS5jIHVkcC5jIHVkcF9mbG93LmMgdXRpbC5jDQorCXRj cF9idWYuYyB0Y3Bfc3BsaWNlLmMgdWRwLmMgdWRwX2Zsb3cuYyB1dGlsLmMgdmlydGlvLmMNCiBR UkFQX1NSQ1MgPSBxcmFwLmMNCiBTUkNTID0gJChQQVNTVF9TUkNTKSAkKFFSQVBfU1JDUykNCiAN CkBAIC02NCw3ICs2NCw3IEBAIFBBU1NUX0hFQURFUlMgPSBhcmNoLmggYXJwLmggY2hlY2tzdW0u aCBjb25mLmggZGhjcC5oIGRoY3B2Ni5oIGZsb3cuaCBmd2QuaCBcDQogCWZsb3dfdGFibGUuaCBp Y21wLmggaWNtcF9mbG93LmggaW5hbnkuaCBpb3YuaCBpcC5oIGlzb2xhdGlvbi5oIFwNCiAJbGlu ZXJlYWQuaCBsb2cuaCBuZHAuaCBuZXRsaW5rLmggcGFja2V0LmggcGFzc3QuaCBwYXN0YS5oIHBj YXAuaCBwaWYuaCBcDQogCXNpcGhhc2guaCB0YXAuaCB0Y3AuaCB0Y3BfYnVmLmggdGNwX2Nvbm4u aCB0Y3BfaW50ZXJuYWwuaCB0Y3Bfc3BsaWNlLmggXA0KLQl1ZHAuaCB1ZHBfZmxvdy5oIHV0aWwu aA0KKwl1ZHAuaCB1ZHBfZmxvdy5oIHV0aWwuaCB2aXJ0aW8uaA0KIEhFQURFUlMgPSAkKFBBU1NU X0hFQURFUlMpIHNlY2NvbXAuaA0KIA0KIEMgOj0gXCNpbmNsdWRlIDxsaW51eC90Y3AuaD5cbnN0 cnVjdCB0Y3BfaW5mbyB4ID0geyAudGNwaV9zbmRfd25kID0gMCB9Ow0KZGlmZiAtLWdpdCBhL3V0 aWwuaCBiL3V0aWwuaA0KaW5kZXggMmMxZTA4ZTBjNDg4Li5kZWYxNDVjOTk3YjcgMTAwNjQ0DQot LS0gYS91dGlsLmgNCisrKyBiL3V0aWwuaA0KQEAgLTEzMSw2ICsxMzEsMTQgQEAgc3RhdGljIGlu bGluZSB1aW50MzJfdCBudG9obF91bmFsaWduZWQoY29uc3Qgdm9pZCAqcCkNCiAJcmV0dXJuIG50 b2hsKHZhbCk7DQogfQ0KIA0KK3N0YXRpYyBpbmxpbmUgdm9pZCBiYXJyaWVyKHZvaWQpIHsgX19h c21fXyBfX3ZvbGF0aWxlX18oIiIgOjo6ICJtZW1vcnkiKTsgfQ0KKyNkZWZpbmUgc21wX21iKCkJ CWRvIHsgYmFycmllcigpOyBfX2F0b21pY190aHJlYWRfZmVuY2UoX19BVE9NSUNfU0VRX0NTVCk7 IH0gd2hpbGUgKDApDQorI2RlZmluZSBzbXBfbWJfcmVsZWFzZSgpCWRvIHsgYmFycmllcigpOyBf X2F0b21pY190aHJlYWRfZmVuY2UoX19BVE9NSUNfUkVMRUFTRSk7IH0gd2hpbGUgKDApDQorI2Rl ZmluZSBzbXBfbWJfYWNxdWlyZSgpCWRvIHsgYmFycmllcigpOyBfX2F0b21pY190aHJlYWRfZmVu Y2UoX19BVE9NSUNfQUNRVUlSRSk7IH0gd2hpbGUgKDApDQorDQorI2RlZmluZSBzbXBfd21iKCkJ c21wX21iX3JlbGVhc2UoKQ0KKyNkZWZpbmUgc21wX3JtYigpCXNtcF9tYl9hY3F1aXJlKCkNCisN CiAjZGVmaW5lIE5TX0ZOX1NUQUNLX1NJWkUJKFJMSU1JVF9TVEFDS19WQUwgKiAxMDI0IC8gOCkN CiBpbnQgZG9fY2xvbmUoaW50ICgqZm4pKHZvaWQgKiksIGNoYXIgKnN0YWNrX2FyZWEsIHNpemVf dCBzdGFja19zaXplLCBpbnQgZmxhZ3MsDQogCSAgICAgdm9pZCAqYXJnKTsNCmRpZmYgLS1naXQg YS92aXJ0aW8uYyBiL3ZpcnRpby5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAw MDAwMDAwLi4zODA1OTBhZmJjYTMNCi0tLSAvZGV2L251bGwNCisrKyBiL3ZpcnRpby5jDQpAQCAt MCwwICsxLDY2NSBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxh dGVyIEFORCBCU0QtMy1DbGF1c2UNCisvKg0KKyAqIHZpcnRpbyBBUEksIHZyaW5nIGFuZCB2aXJ0 cXVldWUgZnVuY3Rpb25zIGRlZmluaXRpb24NCisgKg0KKyAqIENvcHlyaWdodCBSZWQgSGF0DQor ICogQXV0aG9yOiBMYXVyZW50IFZpdmllciA8bHZpdmllckByZWRoYXQuY29tPg0KKyAqLw0KKw0K Ky8qIFNvbWUgcGFydHMgY29waWVkIGZyb20gUUVNVSBzdWJwcm9qZWN0cy9saWJ2aG9zdC11c2Vy L2xpYnZob3N0LXVzZXIuYw0KKyAqIG9yaWdpbmFsbHkgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxv d2luZyB0ZXJtczoNCisgKg0KKyAqIC0tDQorICoNCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAy MDA3DQorICogQ29weXJpZ2h0IChjKSAyMDE2IFJlZCBIYXQsIEluYy4NCisgKg0KKyAqIEF1dGhv cnM6DQorICogIEFudGhvbnkgTGlndW9yaSA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4NCisgKiAgTWFy Yy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QHJlZGhhdC5jb20+DQorICogIFZpY3RvciBLYXBsYW5z a3kgPHZpY3RvcmtAcmVkaGF0LmNvbT4NCisgKg0KKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMiBvcg0KKyAqIGxhdGVyLiAg U2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuDQorICoNCisg KiBTb21lIHBhcnRzIGNvcGllZCBmcm9tIFFFTVUgaHcvdmlydGlvL3ZpcnRpby5jDQorICogbGlj ZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoNCisgKg0KKyAqIENvcHlyaWdodCBJQk0s IENvcnAuIDIwMDcNCisgKg0KKyAqIEF1dGhvcnM6DQorICogIEFudGhvbnkgTGlndW9yaSAgIDxh bGlndW9yaUB1cy5pYm0uY29tPg0KKyAqDQorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlDQorICogdGhlIENPUFlJ TkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4NCisgKg0KKyAqIC0tDQorICoNCisg KiB2aXJ0cV91c2VkX2V2ZW50KCkgYW5kIHZpcnRxX2F2YWlsX2V2ZW50KCkgZnJvbQ0KKyAqIGh0 dHBzOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy92aXJ0aW8vdmlydGlvL3YxLjIvY3NkMDEvdmlydGlv LXYxLjItY3NkMDEuaHRtbCN4MS03MTIwMDBBDQorICogbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxv d2luZyB0ZXJtczoNCisgKg0KKyAqIC0tDQorICoNCisgKiBUaGlzIGhlYWRlciBpcyBCU0QgbGlj ZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zDQorICogdG8gaW1wbGVtZW50 IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLg0KKyAqDQorICogQ29weXJpZ2h0IDIwMDcsIDIw MDksIElCTSBDb3Jwb3JhdGlvbg0KKyAqIENvcHlyaWdodCAyMDExLCBSZWQgSGF0LCBJbmMNCisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0 aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z DQorICogYXJlIG1ldDoNCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAyLiBSZWRpc3Ry aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo dA0KKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp bmcgZGlzY2xhaW1lciBpbiB0aGUNCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KKyAqIDMuIE5laXRoZXIg dGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KKyAqICAg IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20g dGhpcyBzb2Z0d2FyZQ0KKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt aXNzaW9uLg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI T0xERVJTIEFORCBDT05UUklCVVRPUlMg4oCY4oCYQVMgSVPigJnigJkgQU5EDQorICogQU5ZIEVY UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU TywgVEhFDQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5P IEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFDQorICogRk9SIEFOWSBE SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF UVVFTlRJQUwNCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUw0KKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQ0KKyAqIEhPV0VW RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U UkFDVCwgU1RSSUNUDQorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQ0KKyAqIE9VVCBPRiBUSEUgVVNFIE9G IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YNCisg KiBTVUNIIERBTUFHRS4NCisgKi8NCisNCisjaW5jbHVkZSA8c3RkZGVmLmg+DQorI2luY2x1ZGUg PGVuZGlhbi5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjaW5jbHVkZSA8ZXJybm8uaD4NCisj aW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4NCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KKw0KKyNp bmNsdWRlICJ1dGlsLmgiDQorI2luY2x1ZGUgInZpcnRpby5oIg0KKw0KKyNkZWZpbmUgVklSVFFV RVVFX01BWF9TSVpFIDEwMjQNCisNCisvKioNCisgKiB2dV9ncGFfdG9fdmEoKSAtIFRyYW5zbGF0 ZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIHRvIG91ciB2aXJ0dWFsIGFkZHJlc3MuDQorICogQGRl djoJVmhvc3QtdXNlciBkZXZpY2UNCisgKiBAcGxlbjoJUGh5c2ljYWwgbGVuZ3RoIHRvIG1hcCAo aW5wdXQpLCBjYXBwZWQgdG8gcmVnaW9uIChvdXRwdXQpDQorICogQGd1ZXN0X2FkZHI6CUd1ZXN0 IHBoeXNpY2FsIGFkZHJlc3MNCisgKg0KKyAqIFJldHVybjogdmlydHVhbCBhZGRyZXNzIGluIG91 ciBhZGRyZXNzIHNwYWNlIG9mIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzDQorICovDQorc3Rh dGljIHZvaWQgKnZ1X2dwYV90b192YShzdHJ1Y3QgdnVfZGV2ICpkZXYsIHVpbnQ2NF90ICpwbGVu LCB1aW50NjRfdCBndWVzdF9hZGRyKQ0KK3sNCisJdW5zaWduZWQgaW50IGk7DQorDQorCWlmICgq cGxlbiA9PSAwKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCS8qIEZpbmQgbWF0Y2hpbmcgbWVtb3J5 IHJlZ2lvbi4gKi8NCisJZm9yIChpID0gMDsgaSA8IGRldi0+bnJlZ2lvbnM7IGkrKykgew0KKwkJ Y29uc3Qgc3RydWN0IHZ1X2Rldl9yZWdpb24gKnIgPSAmZGV2LT5yZWdpb25zW2ldOw0KKw0KKwkJ aWYgKChndWVzdF9hZGRyID49IHItPmdwYSkgJiYNCisJCSAgICAoZ3Vlc3RfYWRkciA8IChyLT5n cGEgKyByLT5zaXplKSkpIHsNCisJCQlpZiAoKGd1ZXN0X2FkZHIgKyAqcGxlbikgPiAoci0+Z3Bh ICsgci0+c2l6ZSkpDQorCQkJCSpwbGVuID0gci0+Z3BhICsgci0+c2l6ZSAtIGd1ZXN0X2FkZHI7 DQorCQkJLyogTk9MSU5UTkVYVExJTkUocGVyZm9ybWFuY2Utbm8taW50LXRvLXB0cikgKi8NCisJ CQlyZXR1cm4gKHZvaWQgKikoZ3Vlc3RfYWRkciAtIHItPmdwYSArIHItPm1tYXBfYWRkciArDQor CQkJCQkJICAgICByLT5tbWFwX29mZnNldCk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuIE5VTEw7 DQorfQ0KKw0KKy8qKg0KKyAqIHZyaW5nX2F2YWlsX2ZsYWdzKCkgLSBSZWFkIHRoZSBhdmFpbGFi bGUgcmluZyBmbGFncw0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqDQorICogUmV0dXJuOiB0aGUg YXZhaWxhYmxlIHJpbmcgZGVzY3JpcHRvciBmbGFncyBvZiB0aGUgZ2l2ZW4gdmlydHF1ZXVlDQor ICovDQorc3RhdGljIGlubGluZSB1aW50MTZfdCB2cmluZ19hdmFpbF9mbGFncyhjb25zdCBzdHJ1 Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisJcmV0dXJuIGxlMTZ0b2godnEtPnZyaW5nLmF2YWlsLT5m bGFncyk7DQorfQ0KKw0KKy8qKg0KKyAqIHZyaW5nX2F2YWlsX2lkeCgpIC0gUmVhZCB0aGUgYXZh aWxhYmxlIHJpbmcgaW5kZXgNCisgKiBAdnE6CQlWaXJ0cXVldWUNCisgKg0KKyAqIFJldHVybjog dGhlIGF2YWlsYWJsZSByaW5nIGluZGV4IG9mIHRoZSBnaXZlbiB2aXJ0cXVldWUNCisgKi8NCitz dGF0aWMgaW5saW5lIHVpbnQxNl90IHZyaW5nX2F2YWlsX2lkeChzdHJ1Y3QgdnVfdmlydHEgKnZx KQ0KK3sNCisJdnEtPnNoYWRvd19hdmFpbF9pZHggPSBsZTE2dG9oKHZxLT52cmluZy5hdmFpbC0+ aWR4KTsNCisNCisJcmV0dXJuIHZxLT5zaGFkb3dfYXZhaWxfaWR4Ow0KK30NCisNCisvKioNCisg KiB2cmluZ19hdmFpbF9yaW5nKCkgLSBSZWFkIGFuIGF2YWlsYWJsZSByaW5nIGVudHJ5DQorICog QHZxOgkJVmlydHF1ZXVlDQorICogQGk6CQlJbmRleCBvZiB0aGUgZW50cnkgdG8gcmVhZA0KKyAq DQorICogUmV0dXJuOiB0aGUgcmluZyBlbnRyeSBjb250ZW50IChoZWFkIG9mIHRoZSBkZXNjcmlw dG9yIGNoYWluKQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgdnJpbmdfYXZhaWxfcmlu Zyhjb25zdCBzdHJ1Y3QgdnVfdmlydHEgKnZxLCBpbnQgaSkNCit7DQorCXJldHVybiBsZTE2dG9o KHZxLT52cmluZy5hdmFpbC0+cmluZ1tpXSk7DQorfQ0KKw0KKy8qKg0KKyAqIHZpcnRxX3VzZWRf ZXZlbnQgLSBHZXQgbG9jYXRpb24gb2YgdXNlZCBldmVudCBpbmRpY2VzDQorICoJCSAgICAgIChv bmx5IHdpdGggVklSVElPX0ZfRVZFTlRfSURYKQ0KKyAqIEB2cQkJVmlydHF1ZXVlDQorICoNCisg KiBSZXR1cm46IHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIHVzZWQgZXZlbnQgaW5kZXgNCisg Ki8NCitzdGF0aWMgaW5saW5lIHVpbnQxNl90ICp2aXJ0cV91c2VkX2V2ZW50KGNvbnN0IHN0cnVj dCB2dV92aXJ0cSAqdnEpDQorew0KKyAgICAgICAgLyogRm9yIGJhY2t3YXJkcyBjb21wYXQsIHVz ZWQgZXZlbnQgaW5kZXggaXMgYXQgKmVuZCogb2YgYXZhaWwgcmluZy4gKi8NCisgICAgICAgIHJl dHVybiAmdnEtPnZyaW5nLmF2YWlsLT5yaW5nW3ZxLT52cmluZy5udW1dOw0KK30NCisNCisvKioN CisgKiB2cmluZ19nZXRfdXNlZF9ldmVudCgpIC0gR2V0IHRoZSB1c2VkIGV2ZW50IGZyb20gdGhl IGF2YWlsYWJsZSByaW5nDQorICogQHZxCQlWaXJ0cXVldWUNCisgKg0KKyAqIFJldHVybjogdGhl IHVzZWQgZXZlbnQgKGF2YWlsYWJsZSBvbmx5IGlmIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYIGlz IHNldCkNCisgKiAgICAgICAgIHVzZWRfZXZlbnQgaXMgYSBwZXJmb3JtYW50IGFsdGVybmF0aXZl IHdoZXJlIHRoZSBkcml2ZXINCisgKiAgICAgICAgIHNwZWNpZmllcyBob3cgZmFyIHRoZSBkZXZp Y2UgY2FuIHByb2dyZXNzIGJlZm9yZSBhIG5vdGlmaWNhdGlvbg0KKyAqICAgICAgICAgaXMgcmVx dWlyZWQuDQorICovDQorc3RhdGljIGlubGluZSB1aW50MTZfdCB2cmluZ19nZXRfdXNlZF9ldmVu dChjb25zdCBzdHJ1Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisJcmV0dXJuIGxlMTZ0b2goKnZpcnRx X3VzZWRfZXZlbnQodnEpKTsNCit9DQorDQorLyoqDQorICogdmlydHF1ZXVlX2dldF9oZWFkKCkg LSBHZXQgdGhlIGhlYWQgb2YgdGhlIGRlc2NyaXB0b3IgY2hhaW4gZm9yIGEgZ2l2ZW4NCisgKiAg ICAgICAgICAgICAgICAgICAgICAgIGluZGV4DQorICogQHZxOgkJVmlydHF1ZXVlDQorICogQGlk eDoJQXZhaWxhYmxlIHJpbmcgZW50cnkgaW5kZXgNCisgKiBAaGVhZDoJSGVhZCBvZiB0aGUgZGVz Y3JpcHRvciBjaGFpbg0KKyAqLw0KK3N0YXRpYyB2b2lkIHZpcnRxdWV1ZV9nZXRfaGVhZChjb25z dCBzdHJ1Y3QgdnVfdmlydHEgKnZxLA0KKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaWR4LCB1bnNp Z25lZCBpbnQgKmhlYWQpDQorew0KKwkvKiBHcmFiIHRoZSBuZXh0IGRlc2NyaXB0b3IgbnVtYmVy IHRoZXkncmUgYWR2ZXJ0aXNpbmcsIGFuZCBpbmNyZW1lbnQNCisJICogdGhlIGluZGV4IHdlJ3Zl IHNlZW4uDQorCSAqLw0KKwkqaGVhZCA9IHZyaW5nX2F2YWlsX3JpbmcodnEsIGlkeCAlIHZxLT52 cmluZy5udW0pOw0KKw0KKwkvKiBJZiB0aGVpciBudW1iZXIgaXMgc2lsbHksIHRoYXQncyBhIGZh dGFsIG1pc3Rha2UuICovDQorCWlmICgqaGVhZCA+PSB2cS0+dnJpbmcubnVtKQ0KKwkJZGllKCJ2 aG9zdC11c2VyOiBHdWVzdCBzYXlzIGluZGV4ICV1IGlzIGF2YWlsYWJsZSIsICpoZWFkKTsNCit9 DQorDQorLyoqDQorICogdmlydHF1ZXVlX3JlYWRfaW5kaXJlY3RfZGVzYygpIC0gQ29weSB2aXJ0 aW8gcmluZyBkZXNjcmlwdG9ycyBmcm9tIGd1ZXN0DQorICogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbWVtb3J5DQorICogQGRldjoJVmhvc3QtdXNlciBkZXZpY2UNCisgKiBAZGVz YzoJRGVzdGluYXRpb24gYWRkcmVzcyB0byBjb3B5IHRoZSBkZXNjcmlwdG9ycyB0bw0KKyAqIEBh ZGRyOglHdWVzdCBtZW1vcnkgYWRkcmVzcyB0byBjb3B5IGZyb20NCisgKiBAbGVuOglMZW5ndGgg b2YgbWVtb3J5IHRvIGNvcHkNCisgKg0KKyAqIFJldHVybjogLTEgaWYgdGhlcmUgaXMgYW4gZXJy b3IsIDAgb3RoZXJ3aXNlDQorICovDQorc3RhdGljIGludCB2aXJ0cXVldWVfcmVhZF9pbmRpcmVj dF9kZXNjKHN0cnVjdCB2dV9kZXYgKmRldiwgc3RydWN0IHZyaW5nX2Rlc2MgKmRlc2MsDQorCQkJ CQl1aW50NjRfdCBhZGRyLCBzaXplX3QgbGVuKQ0KK3sNCisJdWludDY0X3QgcmVhZF9sZW47DQor DQorCWlmIChsZW4gPiAoVklSVFFVRVVFX01BWF9TSVpFICogc2l6ZW9mKHN0cnVjdCB2cmluZ19k ZXNjKSkpDQorCQlyZXR1cm4gLTE7DQorDQorCWlmIChsZW4gPT0gMCkNCisJCXJldHVybiAtMTsN CisNCisJd2hpbGUgKGxlbikgew0KKwkJY29uc3Qgc3RydWN0IHZyaW5nX2Rlc2MgKm9yaWdfZGVz YzsNCisNCisJCXJlYWRfbGVuID0gbGVuOw0KKwkJb3JpZ19kZXNjID0gdnVfZ3BhX3RvX3ZhKGRl diwgJnJlYWRfbGVuLCBhZGRyKTsNCisJCWlmICghb3JpZ19kZXNjKQ0KKwkJCXJldHVybiAtMTsN CisNCisJCW1lbWNweShkZXNjLCBvcmlnX2Rlc2MsIHJlYWRfbGVuKTsNCisJCWxlbiAtPSByZWFk X2xlbjsNCisJCWFkZHIgKz0gcmVhZF9sZW47DQorCQlkZXNjICs9IHJlYWRfbGVuIC8gc2l6ZW9m KHN0cnVjdCB2cmluZ19kZXNjKTsNCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoqDQor ICogZW51bSB2aXJ0cXVldWVfcmVhZF9kZXNjX3N0YXRlIC0gU3RhdGUgaW4gdGhlIGRlc2NyaXB0 b3IgY2hhaW4NCisgKiBAVklSVFFVRVVFX1JFQURfREVTQ19FUlJPUglGb3VuZCBhbiBpbnZhbGlk IGRlc2NyaXB0b3INCisgKiBAVklSVFFVRVVFX1JFQURfREVTQ19ET05FCU5vIG1vcmUgZGVzY3Jp cHRvcnMgaW4gdGhlIGNoYWluDQorICogQFZJUlRRVUVVRV9SRUFEX0RFU0NfTU9SRQl0aGVyZSBh cmUgbW9yZSBkZXNjcmlwdG9ycyBpbiB0aGUgY2hhaW4NCisgKi8NCitlbnVtIHZpcnRxdWV1ZV9y ZWFkX2Rlc2Nfc3RhdGUgew0KKwlWSVJUUVVFVUVfUkVBRF9ERVNDX0VSUk9SID0gLTEsDQorCVZJ UlRRVUVVRV9SRUFEX0RFU0NfRE9ORSA9IDAsICAgLyogZW5kIG9mIGNoYWluICovDQorCVZJUlRR VUVVRV9SRUFEX0RFU0NfTU9SRSA9IDEsICAgLyogbW9yZSBidWZmZXJzIGluIGNoYWluICovDQor fTsNCisNCisvKioNCisgKiB2aXJ0cXVldWVfcmVhZF9uZXh0X2Rlc2MoKSAtIFJlYWQgdGhlIHRo ZSBuZXh0IGRlc2NyaXB0b3IgaW4gdGhlIGNoYWluDQorICogQGRlc2M6CVZpcnRpbyByaW5nIGRl c2NyaXB0b3JzDQorICogQGk6CQlJbmRleCBvZiB0aGUgY3VycmVudCBkZXNjcmlwdG9yDQorICog QG1heDoJTWF4aW11bSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRvciBpbmRleA0KKyAqIEBuZXh0OglJ bmRleCBvZiB0aGUgbmV4dCBkZXNjcmlwdG9yIGluIHRoZSBjaGFpbiAob3V0cHV0IHZhbHVlKQ0K KyAqDQorICogUmV0dXJuOiBjdXJyZW50IGNoYWluIGRlc2NyaXB0b3Igc3RhdGUgKGVycm9yLCBu ZXh0LCBkb25lKQ0KKyAqLw0KK3N0YXRpYyBpbnQgdmlydHF1ZXVlX3JlYWRfbmV4dF9kZXNjKGNv bnN0IHN0cnVjdCB2cmluZ19kZXNjICpkZXNjLA0KKwkJCQkgICAgaW50IGksIHVuc2lnbmVkIGlu dCBtYXgsIHVuc2lnbmVkIGludCAqbmV4dCkNCit7DQorCS8qIElmIHRoaXMgZGVzY3JpcHRvciBz YXlzIGl0IGRvZXNuJ3QgY2hhaW4sIHdlJ3JlIGRvbmUuICovDQorCWlmICghKGxlMTZ0b2goZGVz Y1tpXS5mbGFncykgJiBWUklOR19ERVNDX0ZfTkVYVCkpDQorCQlyZXR1cm4gVklSVFFVRVVFX1JF QURfREVTQ19ET05FOw0KKw0KKwkvKiBDaGVjayB0aGV5J3JlIG5vdCBsZWFkaW5nIHVzIG9mZiBl bmQgb2YgZGVzY3JpcHRvcnMuICovDQorCSpuZXh0ID0gbGUxNnRvaChkZXNjW2ldLm5leHQpOw0K KwkvKiBNYWtlIHN1cmUgY29tcGlsZXIga25vd3MgdG8gZ3JhYiB0aGF0OiB3ZSBkb24ndCB3YW50 IGl0IGNoYW5naW5nISAqLw0KKwlzbXBfd21iKCk7DQorDQorCWlmICgqbmV4dCA+PSBtYXgpDQor CQlyZXR1cm4gVklSVFFVRVVFX1JFQURfREVTQ19FUlJPUjsNCisNCisJcmV0dXJuIFZJUlRRVUVV RV9SRUFEX0RFU0NfTU9SRTsNCit9DQorDQorLyoqDQorICogdnVfcXVldWVfZW1wdHkoKSAtIENo ZWNrIGlmIHZpcnRxdWV1ZSBpcyBlbXB0eQ0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqDQorICog UmV0dXJuOiB0cnVlIGlmIHRoZSB2aXJ0cXVldWUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZQ0K KyAqLw0KK2Jvb2wgdnVfcXVldWVfZW1wdHkoc3RydWN0IHZ1X3ZpcnRxICp2cSkNCit7DQorCWlm ICghdnEtPnZyaW5nLmF2YWlsKQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCWlmICh2cS0+c2hhZG93 X2F2YWlsX2lkeCAhPSB2cS0+bGFzdF9hdmFpbF9pZHgpDQorCQlyZXR1cm4gZmFsc2U7DQorDQor CXJldHVybiB2cmluZ19hdmFpbF9pZHgodnEpID09IHZxLT5sYXN0X2F2YWlsX2lkeDsNCit9DQor DQorLyoqDQorICogdnJpbmdfY2FuX25vdGlmeSgpIC0gQ2hlY2sgaWYgYSBub3RpZmljYXRpb24g Y2FuIGJlIHNlbnQNCisgKiBAZGV2OglWaG9zdC11c2VyIGRldmljZQ0KKyAqIEB2cToJCVZpcnRx dWV1ZQ0KKyAqDQorICogUmV0dXJuOiB0cnVlIGlmIG5vdGlmaWNhdGlvbiBjYW4gYmUgc2VudA0K KyAqLw0KK3N0YXRpYyBib29sIHZyaW5nX2Nhbl9ub3RpZnkoY29uc3Qgc3RydWN0IHZ1X2RldiAq ZGV2LCBzdHJ1Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisJdWludDE2X3Qgb2xkLCBuZXc7DQorCWJv b2wgdjsNCisNCisJLyogV2UgbmVlZCB0byBleHBvc2UgdXNlZCBhcnJheSBlbnRyaWVzIGJlZm9y ZSBjaGVja2luZyB1c2VkIGV2ZW50LiAqLw0KKwlzbXBfbWIoKTsNCisNCisJLyogQWx3YXlzIG5v dGlmeSB3aGVuIHF1ZXVlIGlzIGVtcHR5ICh3aGVuIGZlYXR1cmUgYWNrbm93bGVkZ2UpICovDQor CWlmICh2dV9oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19GX05PVElGWV9PTl9FTVBUWSkgJiYNCisJ ICAgICF2cS0+aW51c2UgJiYgdnVfcXVldWVfZW1wdHkodnEpKQ0KKwkJcmV0dXJuIHRydWU7DQor DQorCWlmICghdnVfaGFzX2ZlYXR1cmUoZGV2LCBWSVJUSU9fUklOR19GX0VWRU5UX0lEWCkpDQor CQlyZXR1cm4gISh2cmluZ19hdmFpbF9mbGFncyh2cSkgJiBWUklOR19BVkFJTF9GX05PX0lOVEVS UlVQVCk7DQorDQorCXYgPSB2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQ7DQorCXZxLT5zaWduYWxs ZWRfdXNlZF92YWxpZCA9IHRydWU7DQorCW9sZCA9IHZxLT5zaWduYWxsZWRfdXNlZDsNCisJbmV3 ID0gdnEtPnNpZ25hbGxlZF91c2VkID0gdnEtPnVzZWRfaWR4Ow0KKwlyZXR1cm4gIXYgfHwgdnJp bmdfbmVlZF9ldmVudCh2cmluZ19nZXRfdXNlZF9ldmVudCh2cSksIG5ldywgb2xkKTsNCit9DQor DQorLyoqDQorICogdnVfcXVldWVfbm90aWZ5KCkgLSBTZW5kIGEgbm90aWZpY2F0aW9uIHRvIHRo ZSBnaXZlbiB2aXJ0cXVldWUNCisgKiBAZGV2OglWaG9zdC11c2VyIGRldmljZQ0KKyAqIEB2cToJ CVZpcnRxdWV1ZQ0KKyAqLw0KKy8qIGNwcGNoZWNrLXN1cHByZXNzIHVudXNlZEZ1bmN0aW9uICov DQordm9pZCB2dV9xdWV1ZV9ub3RpZnkoY29uc3Qgc3RydWN0IHZ1X2RldiAqZGV2LCBzdHJ1Y3Qg dnVfdmlydHEgKnZxKQ0KK3sNCisJaWYgKCF2cS0+dnJpbmcuYXZhaWwpDQorCQlyZXR1cm47DQor DQorCWlmICghdnJpbmdfY2FuX25vdGlmeShkZXYsIHZxKSkgew0KKwkJZGVidWcoInZob3N0LXVz ZXI6IHZpcnRxdWV1ZSBjYW4gc2tpcCBub3RpZnkuLi4iKTsNCisJCXJldHVybjsNCisJfQ0KKw0K KwlpZiAoZXZlbnRmZF93cml0ZSh2cS0+Y2FsbF9mZCwgMSkgPCAwKQ0KKwkJZGllX3BlcnJvcigi RXJyb3Igd3JpdGluZyB2aG9zdC11c2VyIHF1ZXVlIGV2ZW50ZmQiKTsNCit9DQorDQorLyogdmly dHFfYXZhaWxfZXZlbnQoKSAtICBHZXQgbG9jYXRpb24gb2YgYXZhaWxhYmxlIGV2ZW50IGluZGlj ZXMNCisgKgkJCSAgICAgIChvbmx5IHdpdGggVklSVElPX0ZfRVZFTlRfSURYKQ0KKyAqIEB2cToJ CVZpcnRxdWV1ZQ0KKyAqDQorICogUmV0dXJuOiByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBh dmFpbGFibGUgZXZlbnQgaW5kZXgNCisgKi8NCitzdGF0aWMgaW5saW5lIHVpbnQxNl90ICp2aXJ0 cV9hdmFpbF9ldmVudChjb25zdCBzdHJ1Y3QgdnVfdmlydHEgKnZxKQ0KK3sNCisgICAgICAgIC8q IEZvciBiYWNrd2FyZHMgY29tcGF0LCBhdmFpbCBldmVudCBpbmRleCBpcyBhdCAqZW5kKiBvZiB1 c2VkIHJpbmcuICovDQorICAgICAgICByZXR1cm4gKHVpbnQxNl90ICopJnZxLT52cmluZy51c2Vk LT5yaW5nW3ZxLT52cmluZy5udW1dOw0KK30NCisNCisvKioNCisgKiB2cmluZ19zZXRfYXZhaWxf ZXZlbnQoKSAtIFNldCBhdmFpbF9ldmVudA0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqIEB2YWw6 CVZhbHVlIHRvIHNldCB0byBhdmFpbF9ldmVudA0KKyAqCQlhdmFpbF9ldmVudCBpcyB1c2VkIGlu IHRoZSBzYW1lIHdheSB0aGUgdXNlZF9ldmVudCBpcyBpbiB0aGUNCisgKgkJYXZhaWxfcmluZy4N CisgKgkJYXZhaWxfZXZlbnQgaXMgdXNlZCB0byBhZHZpc2UgdGhlIGRyaXZlciB0aGF0IG5vdGlm aWNhdGlvbnMNCisgKgkJYXJlIHVubmVjZXNzYXJ5IHVudGlsIHRoZSBkcml2ZXIgd3JpdGVzIGVu dHJ5IHdpdGggYW4gaW5kZXgNCisgKgkJc3BlY2lmaWVkIGJ5IGF2YWlsX2V2ZW50IGludG8gdGhl IGF2YWlsYWJsZSByaW5nLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCB2cmluZ19zZXRfYXZh aWxfZXZlbnQoY29uc3Qgc3RydWN0IHZ1X3ZpcnRxICp2cSwNCisJCQkJCSB1aW50MTZfdCB2YWwp DQorew0KKwl1aW50MTZfdCB2YWxfbGUgPSBodG9sZTE2KHZhbCk7DQorDQorCWlmICghdnEtPm5v dGlmaWNhdGlvbikNCisJCXJldHVybjsNCisNCisJbWVtY3B5KHZpcnRxX2F2YWlsX2V2ZW50KHZx KSwgJnZhbF9sZSwgc2l6ZW9mKHZhbF9sZSkpOw0KK30NCisNCisvKioNCisgKiB2aXJ0cXVldWVf bWFwX2Rlc2MoKSAtIFRyYW5zbGF0ZSBkZXNjcmlwdG9yIHJpbmcgcGh5c2ljYWwgYWRkcmVzcyBp bnRvIG91cg0KKyAqIAkJCSAgdmlydHVhbCBhZGRyZXNzIHNwYWNlDQorICogQGRldjoJVmhvc3Qt dXNlciBkZXZpY2UNCisgKiBAcF9udW1fc2c6CUZpcnN0IGlvdiBlbnRyeSB0byB1c2UgKGlucHV0 KSwNCisgKgkJZmlyc3QgaW92IGVudHJ5IG5vdCB1c2VkIChvdXRwdXQpDQorICogQGlvdjoJSW92 IGFycmF5IHRvIHVzZSB0byBzdG9yZSBidWZmZXIgdmlydHVhbCBhZGRyZXNzZXMNCisgKiBAbWF4 X251bV9zZzoJTWF4aW11bSBudW1iZXIgb2YgaW92IGVudHJpZXMNCisgKiBAcGE6CQlHdWVzdCBw aHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gbWFwIGludG8gb3VyIHZpcnR1YWwNCisg KiAJCWFkZHJlc3MNCisgKiBAc3o6CQlTaXplIG9mIHRoZSBidWZmZXINCisgKg0KKyAqIFJldHVy bjogZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlDQorICovDQorc3RhdGljIGJvb2wgdmly dHF1ZXVlX21hcF9kZXNjKHN0cnVjdCB2dV9kZXYgKmRldiwNCisJCQkgICAgICAgdW5zaWduZWQg aW50ICpwX251bV9zZywgc3RydWN0IGlvdmVjICppb3YsDQorCQkJICAgICAgIHVuc2lnbmVkIGlu dCBtYXhfbnVtX3NnLA0KKwkJCSAgICAgICB1aW50NjRfdCBwYSwgc2l6ZV90IHN6KQ0KK3sNCisJ dW5zaWduZWQgaW50IG51bV9zZyA9ICpwX251bV9zZzsNCisNCisJQVNTRVJUKG51bV9zZyA8IG1h eF9udW1fc2cpOw0KKwlBU1NFUlQoc3opOw0KKw0KKwl3aGlsZSAoc3opIHsNCisJCXVpbnQ2NF90 IGxlbiA9IHN6Ow0KKw0KKwkJaW92W251bV9zZ10uaW92X2Jhc2UgPSB2dV9ncGFfdG9fdmEoZGV2 LCAmbGVuLCBwYSk7DQorCQlpZiAoaW92W251bV9zZ10uaW92X2Jhc2UgPT0gTlVMTCkNCisJCQlk aWUoInZob3N0LXVzZXI6IGludmFsaWQgYWRkcmVzcyBmb3IgYnVmZmVycyIpOw0KKwkJaW92W251 bV9zZ10uaW92X2xlbiA9IGxlbjsNCisJCW51bV9zZysrOw0KKwkJc3ogLT0gbGVuOw0KKwkJcGEg Kz0gbGVuOw0KKwl9DQorDQorCSpwX251bV9zZyA9IG51bV9zZzsNCisJcmV0dXJuIHRydWU7DQor fQ0KKw0KKy8qKg0KKyAqIHZ1X3F1ZXVlX21hcF9kZXNjIC0gTWFwIHRoZSB2aXJ0cXVldWUgZGVz Y3JpcHRvciByaW5nIGludG8gb3VyIHZpcnR1YWwNCisgKiAJCSAgICAgICBhZGRyZXNzIHNwYWNl DQorICogQGRldjoJVmhvc3QtdXNlciBkZXZpY2UNCisgKiBAdnE6CQlWaXJ0cXVldWUNCisgKiBA aWR4OglGaXJzdCBkZXNjcmlwdG9yIHJpbmcgZW50cnkgdG8gbWFwDQorICogQGVsZW06CVZpcnRx dWV1ZSBlbGVtZW50IHRvIHN0b3JlIGRlc2NyaXB0b3IgcmluZyBpb3YNCisgKg0KKyAqIFJldHVy bjogLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIDAgb3RoZXJ3aXNlDQorICovDQorc3RhdGljIGlu dCB2dV9xdWV1ZV9tYXBfZGVzYyhzdHJ1Y3QgdnVfZGV2ICpkZXYsIHN0cnVjdCB2dV92aXJ0cSAq dnEsIHVuc2lnbmVkIGludCBpZHgsDQorCQkJICAgICBzdHJ1Y3QgdnVfdmlydHFfZWxlbWVudCAq ZWxlbSkNCit7DQorCWNvbnN0IHN0cnVjdCB2cmluZ19kZXNjICpkZXNjID0gdnEtPnZyaW5nLmRl c2M7DQorCXN0cnVjdCB2cmluZ19kZXNjIGRlc2NfYnVmW1ZJUlRRVUVVRV9NQVhfU0laRV07DQor CXVuc2lnbmVkIGludCBvdXRfbnVtID0gMCwgaW5fbnVtID0gMDsNCisJdW5zaWduZWQgaW50IG1h eCA9IHZxLT52cmluZy5udW07DQorCXVuc2lnbmVkIGludCBpID0gaWR4Ow0KKwl1aW50NjRfdCBy ZWFkX2xlbjsNCisJaW50IHJjOw0KKw0KKwlpZiAobGUxNnRvaChkZXNjW2ldLmZsYWdzKSAmIFZS SU5HX0RFU0NfRl9JTkRJUkVDVCkgew0KKwkJdW5zaWduZWQgaW50IGRlc2NfbGVuOw0KKwkJdWlu dDY0X3QgZGVzY19hZGRyOw0KKw0KKwkJaWYgKGxlMzJ0b2goZGVzY1tpXS5sZW4pICUgc2l6ZW9m KHN0cnVjdCB2cmluZ19kZXNjKSkNCisJCQlkaWUoInZob3N0LXVzZXI6IEludmFsaWQgc2l6ZSBm b3IgaW5kaXJlY3QgYnVmZmVyIHRhYmxlIik7DQorDQorCQkvKiBsb29wIG92ZXIgdGhlIGluZGly ZWN0IGRlc2NyaXB0b3IgdGFibGUgKi8NCisJCWRlc2NfYWRkciA9IGxlNjR0b2goZGVzY1tpXS5h ZGRyKTsNCisJCWRlc2NfbGVuID0gbGUzMnRvaChkZXNjW2ldLmxlbik7DQorCQltYXggPSBkZXNj X2xlbiAvIHNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYyk7DQorCQlyZWFkX2xlbiA9IGRlc2NfbGVu Ow0KKwkJZGVzYyA9IHZ1X2dwYV90b192YShkZXYsICZyZWFkX2xlbiwgZGVzY19hZGRyKTsNCisJ CWlmIChkZXNjICYmIHJlYWRfbGVuICE9IGRlc2NfbGVuKSB7DQorCQkJLyogRmFpbGVkIHRvIHVz ZSB6ZXJvIGNvcHkgKi8NCisJCQlkZXNjID0gTlVMTDsNCisJCQlpZiAoIXZpcnRxdWV1ZV9yZWFk X2luZGlyZWN0X2Rlc2MoZGV2LCBkZXNjX2J1ZiwgZGVzY19hZGRyLCBkZXNjX2xlbikpDQorCQkJ CWRlc2MgPSBkZXNjX2J1ZjsNCisJCX0NCisJCWlmICghZGVzYykNCisJCQlkaWUoInZob3N0LXVz ZXI6IEludmFsaWQgaW5kaXJlY3QgYnVmZmVyIHRhYmxlIik7DQorCQlpID0gMDsNCisJfQ0KKw0K KwkvKiBDb2xsZWN0IGFsbCB0aGUgZGVzY3JpcHRvcnMgKi8NCisJZG8gew0KKwkJaWYgKGxlMTZ0 b2goZGVzY1tpXS5mbGFncykgJiBWUklOR19ERVNDX0ZfV1JJVEUpIHsNCisJCQlpZiAoIXZpcnRx dWV1ZV9tYXBfZGVzYyhkZXYsICZpbl9udW0sIGVsZW0tPmluX3NnLA0KKwkJCQkJCWVsZW0tPmlu X251bSwNCisJCQkJCQlsZTY0dG9oKGRlc2NbaV0uYWRkciksDQorCQkJCQkJbGUzMnRvaChkZXNj W2ldLmxlbikpKQ0KKwkJCQlyZXR1cm4gLTE7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChpbl9udW0p DQorCQkJCWRpZSgiSW5jb3JyZWN0IG9yZGVyIGZvciBkZXNjcmlwdG9ycyIpOw0KKwkJCWlmICgh dmlydHF1ZXVlX21hcF9kZXNjKGRldiwgJm91dF9udW0sIGVsZW0tPm91dF9zZywNCisJCQkJCQll bGVtLT5vdXRfbnVtLA0KKwkJCQkJCWxlNjR0b2goZGVzY1tpXS5hZGRyKSwNCisJCQkJCQlsZTMy dG9oKGRlc2NbaV0ubGVuKSkpIHsNCisJCQkJcmV0dXJuIC0xOw0KKwkJCX0NCisJCX0NCisNCisJ CS8qIElmIHdlJ3ZlIGdvdCB0b28gbWFueSwgdGhhdCBpbXBsaWVzIGEgZGVzY3JpcHRvciBsb29w LiAqLw0KKwkJaWYgKChpbl9udW0gKyBvdXRfbnVtKSA+IG1heCkNCisJCQlkaWUoInZob3N0LXVz ZXI6IExvb3AgaW4gcXVldWUgZGVzY3JpcHRvciBsaXN0Iik7DQorCQlyYyA9IHZpcnRxdWV1ZV9y ZWFkX25leHRfZGVzYyhkZXNjLCBpLCBtYXgsICZpKTsNCisJfSB3aGlsZSAocmMgPT0gVklSVFFV RVVFX1JFQURfREVTQ19NT1JFKTsNCisNCisJaWYgKHJjID09IFZJUlRRVUVVRV9SRUFEX0RFU0Nf RVJST1IpDQorCQlkaWUoInZob3N0LXVzZXI6IEZhaWxlZCB0byByZWFkIGRlc2NyaXB0b3IgbGlz dCIpOw0KKw0KKwllbGVtLT5pbmRleCA9IGlkeDsNCisJZWxlbS0+aW5fbnVtID0gaW5fbnVtOw0K KwllbGVtLT5vdXRfbnVtID0gb3V0X251bTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qKg0K KyAqIHZ1X3F1ZXVlX3BvcCgpIC0gUG9wIGFuIGVudHJ5IGZyb20gdGhlIHZpcnRxdWV1ZQ0KKyAq IEBkZXY6CVZob3N0LXVzZXIgZGV2aWNlDQorICogQHZxOgkJVmlydHF1ZXVlDQorICogQGVsZW06 CVZpcnRxdWV1ZSBlbGVtZW50IHRvIGZpbGUgd2l0aCB0aGUgZW50cnkgaW5mb3JtYXRpb24NCisg Kg0KKyAqIFJldHVybjogLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIDAgb3RoZXJ3aXNlDQorICov DQorLyogY3BwY2hlY2stc3VwcHJlc3MgdW51c2VkRnVuY3Rpb24gKi8NCitpbnQgdnVfcXVldWVf cG9wKHN0cnVjdCB2dV9kZXYgKmRldiwgc3RydWN0IHZ1X3ZpcnRxICp2cSwgc3RydWN0IHZ1X3Zp cnRxX2VsZW1lbnQgKmVsZW0pDQorew0KKwl1bnNpZ25lZCBpbnQgaGVhZDsNCisJaW50IHJldDsN CisNCisJaWYgKCF2cS0+dnJpbmcuYXZhaWwpDQorCQlyZXR1cm4gLTE7DQorDQorCWlmICh2dV9x dWV1ZV9lbXB0eSh2cSkpDQorCQlyZXR1cm4gLTE7DQorDQorCS8qIE5lZWRlZCBhZnRlciB2dV9x dWV1ZV9lbXB0eSgpLCBzZWUgY29tbWVudCBpbg0KKwkgKiB2aXJ0cXVldWVfbnVtX2hlYWRzKCku DQorCSAqLw0KKwlzbXBfcm1iKCk7DQorDQorCWlmICh2cS0+aW51c2UgPj0gdnEtPnZyaW5nLm51 bSkNCisJCWRpZSgidmhvc3QtdXNlciBxdWV1ZSBzaXplIGV4Y2VlZGVkIik7DQorDQorCXZpcnRx dWV1ZV9nZXRfaGVhZCh2cSwgdnEtPmxhc3RfYXZhaWxfaWR4KyssICZoZWFkKTsNCisNCisJaWYg KHZ1X2hhc19mZWF0dXJlKGRldiwgVklSVElPX1JJTkdfRl9FVkVOVF9JRFgpKQ0KKwkJdnJpbmdf c2V0X2F2YWlsX2V2ZW50KHZxLCB2cS0+bGFzdF9hdmFpbF9pZHgpOw0KKw0KKwlyZXQgPSB2dV9x dWV1ZV9tYXBfZGVzYyhkZXYsIHZxLCBoZWFkLCBlbGVtKTsNCisNCisJaWYgKHJldCA8IDApDQor CQlyZXR1cm4gcmV0Ow0KKw0KKwl2cS0+aW51c2UrKzsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0K Ky8qKg0KKyAqIHZ1X3F1ZXVlX2RldGFjaF9lbGVtZW50KCkgLSBEZXRhY2ggYW4gZWxlbWVudCBm cm9tIHRoZSB2aXJxdWV1ZQ0KKyAqIEB2cToJCVZpcnRxdWV1ZQ0KKyAqLw0KK3ZvaWQgdnVfcXVl dWVfZGV0YWNoX2VsZW1lbnQoc3RydWN0IHZ1X3ZpcnRxICp2cSkNCit7DQorCXZxLT5pbnVzZS0t Ow0KKwkvKiB1bm1hcCwgd2hlbiBETUEgc3VwcG9ydCBpcyBhZGRlZCAqLw0KK30NCisNCisvKioN CisgKiB2dV9xdWV1ZV91bnBvcCgpIC0gUHVzaCBiYWNrIHRoZSBwcmV2aW91c2x5IHBvcHBlZCBl bGVtZW50IGZyb20gdGhlIHZpcnF1ZXVlDQorICogQHZxOgkJVmlydHF1ZXVlDQorICovDQorLyog Y3BwY2hlY2stc3VwcHJlc3MgdW51c2VkRnVuY3Rpb24gKi8NCit2b2lkIHZ1X3F1ZXVlX3VucG9w KHN0cnVjdCB2dV92aXJ0cSAqdnEpDQorew0KKwl2cS0+bGFzdF9hdmFpbF9pZHgtLTsNCisJdnVf cXVldWVfZGV0YWNoX2VsZW1lbnQodnEpOw0KK30NCisNCisvKioNCisgKiB2dV9xdWV1ZV9yZXdp bmQoKSAtIFB1c2ggYmFjayBhIGdpdmVuIG51bWJlciBvZiBwb3BwZWQgZWxlbWVudHMNCisgKiBA dnE6CQlWaXJ0cXVldWUNCisgKiBAbnVtOglOdW1iZXIgb2YgZWxlbWVudCB0byB1bnBvcA0KKyAq Lw0KKy8qIGNwcGNoZWNrLXN1cHByZXNzIHVudXNlZEZ1bmN0aW9uICovDQorYm9vbCB2dV9xdWV1 ZV9yZXdpbmQoc3RydWN0IHZ1X3ZpcnRxICp2cSwgdW5zaWduZWQgaW50IG51bSkNCit7DQorCWlm IChudW0gPiB2cS0+aW51c2UpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCXZxLT5sYXN0X2F2YWls X2lkeCAtPSBudW07DQorCXZxLT5pbnVzZSAtPSBudW07DQorCXJldHVybiB0cnVlOw0KK30NCisN CisvKioNCisgKiB2cmluZ191c2VkX3dyaXRlKCkgLSBXcml0ZSBhbiBlbnRyeSBpbiB0aGUgdXNl ZCByaW5nDQorICogQHZxOgkJVmlydHF1ZXVlDQorICogQHVlbGVtOglFbnRyeSB0byB3cml0ZQ0K KyAqIEBpOgkJSW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSB1c2VkIHJpbmcNCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgdnJpbmdfdXNlZF93cml0ZShzdHJ1Y3QgdnVfdmlydHEgKnZxLA0KKwkJ CQkgICAgY29uc3Qgc3RydWN0IHZyaW5nX3VzZWRfZWxlbSAqdWVsZW0sIGludCBpKQ0KK3sNCisJ c3RydWN0IHZyaW5nX3VzZWQgKnVzZWQgPSB2cS0+dnJpbmcudXNlZDsNCisNCisJdXNlZC0+cmlu Z1tpXSA9ICp1ZWxlbTsNCit9DQorDQorLyoqDQorICogdnVfcXVldWVfZmlsbF9ieV9pbmRleCgp IC0gVXBkYXRlIGluZm9ybWF0aW9uIG9mIGEgZGVzY3JpcHRvciByaW5nIGVudHJ5DQorICoJCQkg ICAgICBpbiB0aGUgdXNlZCByaW5nDQorICogQHZxOgkJVmlydHF1ZXVlDQorICogQGluZGV4OglE ZXNjcmlwdG9yIHJpbmcgaW5kZXgNCisgKiBAbGVuOglTaXplIG9mIHRoZSBlbGVtZW50DQorICog QGlkeDoJVXNlZCByaW5nIGVudHJ5IGluZGV4DQorICovDQordm9pZCB2dV9xdWV1ZV9maWxsX2J5 X2luZGV4KHN0cnVjdCB2dV92aXJ0cSAqdnEsIHVuc2lnbmVkIGludCBpbmRleCwNCisJCQkgICAg dW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGlkeCkNCit7DQorCXN0cnVjdCB2cmluZ191 c2VkX2VsZW0gdWVsZW07DQorDQorCWlmICghdnEtPnZyaW5nLmF2YWlsKQ0KKwkJcmV0dXJuOw0K Kw0KKwlpZHggPSAoaWR4ICsgdnEtPnVzZWRfaWR4KSAlIHZxLT52cmluZy5udW07DQorDQorCXVl bGVtLmlkID0gaHRvbGUzMihpbmRleCk7DQorCXVlbGVtLmxlbiA9IGh0b2xlMzIobGVuKTsNCisJ dnJpbmdfdXNlZF93cml0ZSh2cSwgJnVlbGVtLCBpZHgpOw0KK30NCisNCisvKioNCisgKiB2dV9x dWV1ZV9maWxsKCkgLSBVcGRhdGUgaW5mb3JtYXRpb24gb2YgYSBnaXZlbiBlbGVtZW50IGluIHRo ZSB1c2VkIHJpbmcNCisgKiBAZGV2OglWaG9zdC11c2VyIGRldmljZQ0KKyAqIEB2cToJCVZpcnRx dWV1ZQ0KKyAqIEBlbGVtOglFbGVtZW50IGluZm9ybWF0aW9uIHRvIGZpbGwNCisgKiBAbGVuOglT aXplIG9mIHRoZSBlbGVtZW50DQorICogQGlkeDoJVXNlZCByaW5nIGVudHJ5IGluZGV4DQorICov DQorLyogY3BwY2hlY2stc3VwcHJlc3MgdW51c2VkRnVuY3Rpb24gKi8NCit2b2lkIHZ1X3F1ZXVl X2ZpbGwoc3RydWN0IHZ1X3ZpcnRxICp2cSwgY29uc3Qgc3RydWN0IHZ1X3ZpcnRxX2VsZW1lbnQg KmVsZW0sDQorCQkgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgaWR4KQ0KK3sNCisJ dnVfcXVldWVfZmlsbF9ieV9pbmRleCh2cSwgZWxlbS0+aW5kZXgsIGxlbiwgaWR4KTsNCit9DQor DQorLyoqDQorICogdnJpbmdfdXNlZF9pZHhfc2V0KCkgLSBTZXQgdGhlIGRlc2NyaXB0b3Igcmlu ZyBjdXJyZW50IGluZGV4DQorICogQHZxOgkJVmlydHF1ZXVlDQorICogQHZhbDoJVmFsdWUgdG8g c2V0IGluIHRoZSBpbmRleA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCB2cmluZ191c2VkX2lk eF9zZXQoc3RydWN0IHZ1X3ZpcnRxICp2cSwgdWludDE2X3QgdmFsKQ0KK3sNCisJdnEtPnZyaW5n LnVzZWQtPmlkeCA9IGh0b2xlMTYodmFsKTsNCisNCisJdnEtPnVzZWRfaWR4ID0gdmFsOw0KK30N CisNCisvKioNCisgKiB2dV9xdWV1ZV9mbHVzaCgpIC0gRmx1c2ggdGhlIHZpcnRxdWV1ZQ0KKyAq IEB2cToJCVZpcnRxdWV1ZQ0KKyAqIEBjb3VudDoJTnVtYmVyIG9mIGVudHJ5IHRvIGZsdXNoDQor ICovDQorLyogY3BwY2hlY2stc3VwcHJlc3MgdW51c2VkRnVuY3Rpb24gKi8NCit2b2lkIHZ1X3F1 ZXVlX2ZsdXNoKHN0cnVjdCB2dV92aXJ0cSAqdnEsIHVuc2lnbmVkIGludCBjb3VudCkNCit7DQor CXVpbnQxNl90IG9sZCwgbmV3Ow0KKw0KKwlpZiAoIXZxLT52cmluZy5hdmFpbCkNCisJCXJldHVy bjsNCisNCisJLyogTWFrZSBzdXJlIGJ1ZmZlciBpcyB3cml0dGVuIGJlZm9yZSB3ZSB1cGRhdGUg aW5kZXguICovDQorCXNtcF93bWIoKTsNCisNCisJb2xkID0gdnEtPnVzZWRfaWR4Ow0KKwluZXcg PSBvbGQgKyBjb3VudDsNCisJdnJpbmdfdXNlZF9pZHhfc2V0KHZxLCBuZXcpOw0KKwl2cS0+aW51 c2UgLT0gY291bnQ7DQorCWlmICgodWludDE2X3QpKG5ldyAtIHZxLT5zaWduYWxsZWRfdXNlZCkg PCAodWludDE2X3QpKG5ldyAtIG9sZCkpDQorCQl2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQgPSBm YWxzZTsNCit9DQpkaWZmIC0tZ2l0IGEvdmlydGlvLmggYi92aXJ0aW8uaA0KbmV3IGZpbGUgbW9k ZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4uOTRlZmViMDQ5ZmJjDQotLS0gL2Rldi9udWxs DQorKysgYi92aXJ0aW8uaA0KQEAgLTAsMCArMSwxODMgQEANCisvLyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMC1vci1sYXRlcg0KKy8qDQorICogdmlydGlvIEFQSSwgdnJpbmcgYW5k IHZpcnRxdWV1ZSBmdW5jdGlvbnMgZGVmaW5pdGlvbg0KKyAqDQorICogQ29weXJpZ2h0IFJlZCBI YXQNCisgKiBBdXRob3I6IExhdXJlbnQgVml2aWVyIDxsdml2aWVyQHJlZGhhdC5jb20+DQorICov DQorDQorI2lmbmRlZiBWSVJUSU9fSA0KKyNkZWZpbmUgVklSVElPX0gNCisNCisjaW5jbHVkZSA8 c3RkYm9vbC5oPg0KKyNpbmNsdWRlIDxsaW51eC92aG9zdF90eXBlcy5oPg0KKw0KKy8qIE1heGlt dW0gc2l6ZSBvZiBhIHZpcnRxdWV1ZSAqLw0KKyNkZWZpbmUgVklSVFFVRVVFX01BWF9TSVpFIDEw MjQNCisNCisvKioNCisgKiBzdHJ1Y3QgdnVfcmluZyAtIFZpcnRxdWV1ZSByaW5ncw0KKyAqIEBu dW06CQlTaXplIG9mIHRoZSBxdWV1ZQ0KKyAqIEBkZXNjOgkJRGVzY3JpcHRvciByaW5nDQorICog QGF2YWlsOgkJQXZhaWxhYmxlIHJpbmcNCisgKiBAdXNlZDoJCVVzZWQgcmluZw0KKyAqIEBsb2df Z3Vlc3RfYWRkcjoJR3Vlc3QgYWRkcmVzcyBmb3IgbG9nZ2luZw0KKyAqIEBmbGFnczoJCVZyaW5n IGZsYWdzDQorICogCQkJVkhPU1RfVlJJTkdfRl9MT0cgaXMgc2V0IGlmIGxvZyBhZGRyZXNzIGlz IHZhbGlkDQorICovDQorc3RydWN0IHZ1X3Jpbmcgew0KKwl1bnNpZ25lZCBpbnQgbnVtOw0KKwlz dHJ1Y3QgdnJpbmdfZGVzYyAqZGVzYzsNCisJc3RydWN0IHZyaW5nX2F2YWlsICphdmFpbDsNCisJ c3RydWN0IHZyaW5nX3VzZWQgKnVzZWQ7DQorCXVpbnQ2NF90IGxvZ19ndWVzdF9hZGRyOw0KKwl1 aW50MzJfdCBmbGFnczsNCit9Ow0KKw0KKy8qKg0KKyAqIHN0cnVjdCB2dV92aXJ0cSAtIFZpcnRx dWV1ZSBkZWZpbml0aW9uDQorICogQHZyaW5nOgkJCVZpcnRxdWV1ZSByaW5ncw0KKyAqIEBsYXN0 X2F2YWlsX2lkeDoJCU5leHQgaGVhZCB0byBwb3ANCisgKiBAc2hhZG93X2F2YWlsX2lkeDoJCUxh c3QgYXZhaWxfaWR4IHJlYWQgZnJvbSBWUS4NCisgKiBAdXNlZF9pZHg6CQkJRGVzY3JpcHRvciBy aW5nIGN1cnJlbnQgaW5kZXgNCisgKiBAc2lnbmFsbGVkX3VzZWQ6CQlMYXN0IHVzZWQgaW5kZXgg dmFsdWUgd2UgaGF2ZSBzaWduYWxsZWQgb24NCisgKiBAc2lnbmFsbGVkX3VzZWRfdmFsaWQ6CVRy dWUgaWYgc2lnbmFsbGVkX3VzZWQgaWYgdmFsaWQNCisgKiBAbm90aWZpY2F0aW9uOgkJVHJ1ZSBp ZiB0aGUgcXVldWVzIG5vdGlmeSAodmlhIGV2ZW50DQorICogCQkJCWluZGV4IG9yIGludGVycnVw dCkNCisgKiBAaW51c2U6CQkJTnVtYmVyIG9mIGVudHJpZXMgaW4gdXNlDQorICogQGNhbGxfZmQ6 CQkJVGhlIGV2ZW50IGZpbGUgZGVzY3JpcHRvciB0byBzaWduYWwgd2hlbg0KKyAqIAkJCQlidWZm ZXJzIGFyZSB1c2VkLg0KKyAqIEBraWNrX2ZkOgkJCVRoZSBldmVudCBmaWxlIGRlc2NyaXB0b3Ig Zm9yIGFkZGluZw0KKyAqIAkJCQlidWZmZXJzIHRvIHRoZSB2cmluZw0KKyAqIEBlcnJfZmQ6CQkJ VGhlIGV2ZW50IGZpbGUgZGVzY3JpcHRvciB0byBzaWduYWwgd2hlbg0KKyAqIAkJCQllcnJvciBv Y2N1cnMNCisgKiBAZW5hYmxlOgkJCVRydWUgaWYgdGhlIHZpcnRxdWV1ZSBpcyBlbmFibGVkDQor ICogQHN0YXJ0ZWQ6CQkJVHJ1ZSBpZiB0aGUgdmlydHF1ZXVlIGlzIHN0YXJ0ZWQNCisgKiBAdnJh OgkJCVFFTVUgYWRkcmVzcyBvZiBvdXIgcmluZ3MNCisgKi8NCitzdHJ1Y3QgdnVfdmlydHEgew0K KwlzdHJ1Y3QgdnVfcmluZyB2cmluZzsNCisJdWludDE2X3QgbGFzdF9hdmFpbF9pZHg7DQorCXVp bnQxNl90IHNoYWRvd19hdmFpbF9pZHg7DQorCXVpbnQxNl90IHVzZWRfaWR4Ow0KKwl1aW50MTZf dCBzaWduYWxsZWRfdXNlZDsNCisJYm9vbCBzaWduYWxsZWRfdXNlZF92YWxpZDsNCisJYm9vbCBu b3RpZmljYXRpb247DQorCXVuc2lnbmVkIGludCBpbnVzZTsNCisJaW50IGNhbGxfZmQ7DQorCWlu dCBraWNrX2ZkOw0KKwlpbnQgZXJyX2ZkOw0KKwl1bnNpZ25lZCBpbnQgZW5hYmxlOw0KKwlib29s IHN0YXJ0ZWQ7DQorCXN0cnVjdCB2aG9zdF92cmluZ19hZGRyIHZyYTsNCit9Ow0KKw0KKy8qKg0K KyAqIHN0cnVjdCB2dV9kZXZfcmVnaW9uIC0gZ3Vlc3Qgc2hhcmVkIG1lbW9yeSByZWdpb24NCisg KiBAZ3BhOgkJR3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcmVnaW9uDQorICogQHNpemU6 CQlNZW1vcnkgc2l6ZSBpbiBieXRlcw0KKyAqIEBxdmE6CQlRRU1VIHZpcnR1YWwgYWRkcmVzcw0K KyAqIEBtbWFwX29mZnNldDoJT2Zmc2V0IHdoZXJlIHRoZSByZWdpb24gc3RhcnRzIGluIHRoZSBt YXBwZWQgbWVtb3J5DQorICogQG1tYXBfYWRkcjoJCUFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBtZW1v cnkNCisgKi8NCitzdHJ1Y3QgdnVfZGV2X3JlZ2lvbiB7DQorCXVpbnQ2NF90IGdwYTsNCisJdWlu dDY0X3Qgc2l6ZTsNCisJdWludDY0X3QgcXZhOw0KKwl1aW50NjRfdCBtbWFwX29mZnNldDsNCisJ dWludDY0X3QgbW1hcF9hZGRyOw0KK307DQorDQorI2RlZmluZSBWSE9TVF9VU0VSX01BWF9RVUVV RVMgMg0KKw0KKy8qDQorICogU2V0IGEgcmVhc29uYWJsZSBtYXhpbXVtIG51bWJlciBvZiByYW0g c2xvdHMsIHdoaWNoIHdpbGwgYmUgc3VwcG9ydGVkIGJ5DQorICogYW55IGFyY2hpdGVjdHVyZS4N CisgKi8NCisjZGVmaW5lIFZIT1NUX1VTRVJfTUFYX1JBTV9TTE9UUyAzMg0KKw0KKy8qKg0KKyAq IHN0cnVjdCB2dV9kZXYgLSB2aG9zdC11c2VyIGRldmljZSBpbmZvcm1hdGlvbg0KKyAqIEBjb250 ZXh0OgkJRXhlY3V0aW9uIGNvbnRleHQNCisgKiBAbnJlZ2lvbnM6CQlOdW1iZXIgb2Ygc2hhcmVk IG1lbW9yeSByZWdpb25zDQorICogQHJlZ2lvbnM6CQlHdWVzdCBzaGFyZWQgbWVtb3J5IHJlZ2lv bnMNCisgKiBAZmVhdHVyZXM6CQlWaG9zdC11c2VyIGZlYXR1cmVzDQorICogQHByb3RvY29sX2Zl YXR1cmVzOglWaG9zdC11c2VyIHByb3RvY29sIGZlYXR1cmVzDQorICovDQorc3RydWN0IHZ1X2Rl diB7DQorCXVpbnQzMl90IG5yZWdpb25zOw0KKwlzdHJ1Y3QgdnVfZGV2X3JlZ2lvbiByZWdpb25z W1ZIT1NUX1VTRVJfTUFYX1JBTV9TTE9UU107DQorCXN0cnVjdCB2dV92aXJ0cSB2cVtWSE9TVF9V U0VSX01BWF9RVUVVRVNdOw0KKwl1aW50NjRfdCBmZWF0dXJlczsNCisJdWludDY0X3QgcHJvdG9j b2xfZmVhdHVyZXM7DQorfTsNCisNCisvKioNCisgKiBzdHJ1Y3QgdnVfdmlydHFfZWxlbWVudCAt IHZpcnRxdWV1ZSBlbGVtZW50DQorICogQGluZGV4OglEZXNjcmlwdG9yIHJpbmcgaW5kZXgNCisg KiBAb3V0X251bToJTnVtYmVyIG9mIG91dGdvaW5nIGlvdmVjIGJ1ZmZlcnMNCisgKiBAaW5fbnVt OglOdW1iZXIgb2YgaW5jb21pbmcgaW92ZWMgYnVmZmVycw0KKyAqIEBpbl9zZzoJSW5jb21pbmcg aW92ZWMgYnVmZmVycw0KKyAqIEBvdXRfc2c6CU91dGdvaW5nIGlvdmVjIGJ1ZmZlcnMNCisgKi8N CitzdHJ1Y3QgdnVfdmlydHFfZWxlbWVudCB7DQorCXVuc2lnbmVkIGludCBpbmRleDsNCisJdW5z aWduZWQgaW50IG91dF9udW07DQorCXVuc2lnbmVkIGludCBpbl9udW07DQorCXN0cnVjdCBpb3Zl YyAqaW5fc2c7DQorCXN0cnVjdCBpb3ZlYyAqb3V0X3NnOw0KK307DQorDQorLyoqDQorICogaGFz X2ZlYXR1cmUoKSAtIENoZWNrIGEgZmVhdHVyZSBiaXQgaW4gYSBmZWF0dXJlcyBzZXQNCisgKiBA ZmVhdHVyZXM6CUZlYXR1cmVzIHNldA0KKyAqIEBmYjoJCUZlYXR1cmUgYml0IHRvIGNoZWNrDQor ICoNCisgKiBSZXR1cm46CVRydWUgaWYgdGhlIGZlYXR1cmUgYml0IGlzIHNldA0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgYm9vbCBoYXNfZmVhdHVyZSh1aW50NjRfdCBmZWF0dXJlcywgdW5zaWduZWQg aW50IGZiaXQpDQorew0KKwlyZXR1cm4gISEoZmVhdHVyZXMgJiAoMVVMTCA8PCBmYml0KSk7DQor fQ0KKw0KKy8qKg0KKyAqIHZ1X2hhc19mZWF0dXJlKCkgLSBDaGVjayBpZiBhIHZpcnRpby1uZXQg ZmVhdHVyZSBpcyBhdmFpbGFibGUNCisgKiBAdmRldjoJVmhvc3QtdXNlciBkZXZpY2UNCisgKiBA Yml0OglGZWF0dXJlIHRvIGNoZWNrDQorICoNCisgKiBSZXR1cm46CVRydWUgaWYgdGhlIGZlYXR1 cmUgaXMgYXZhaWxhYmxlDQorICovDQorc3RhdGljIGlubGluZSBib29sIHZ1X2hhc19mZWF0dXJl KGNvbnN0IHN0cnVjdCB2dV9kZXYgKnZkZXYsDQorCQkJCSAgdW5zaWduZWQgaW50IGZiaXQpDQor ew0KKwlyZXR1cm4gaGFzX2ZlYXR1cmUodmRldi0+ZmVhdHVyZXMsIGZiaXQpOw0KK30NCisNCisv KioNCisgKiB2dV9oYXNfcHJvdG9jb2xfZmVhdHVyZSgpIC0gQ2hlY2sgaWYgYSB2aG9zdC11c2Vy IGZlYXR1cmUgaXMgYXZhaWxhYmxlDQorICogQHZkZXY6CVZob3N0LXVzZXIgZGV2aWNlDQorICog QGJpdDoJRmVhdHVyZSB0byBjaGVjaw0KKyAqDQorICogUmV0dXJuOglUcnVlIGlmIHRoZSBmZWF0 dXJlIGlzIGF2YWlsYWJsZQ0KKyAqLw0KKy8qIGNwcGNoZWNrLXN1cHByZXNzIHVudXNlZEZ1bmN0 aW9uICovDQorc3RhdGljIGlubGluZSBib29sIHZ1X2hhc19wcm90b2NvbF9mZWF0dXJlKGNvbnN0 IHN0cnVjdCB2dV9kZXYgKnZkZXYsDQorCQkJCQkgICB1bnNpZ25lZCBpbnQgZmJpdCkNCit7DQor CXJldHVybiBoYXNfZmVhdHVyZSh2ZGV2LT5wcm90b2NvbF9mZWF0dXJlcywgZmJpdCk7DQorfQ0K Kw0KK2Jvb2wgdnVfcXVldWVfZW1wdHkoc3RydWN0IHZ1X3ZpcnRxICp2cSk7DQordm9pZCB2dV9x dWV1ZV9ub3RpZnkoY29uc3Qgc3RydWN0IHZ1X2RldiAqZGV2LCBzdHJ1Y3QgdnVfdmlydHEgKnZx KTsNCitpbnQgdnVfcXVldWVfcG9wKHN0cnVjdCB2dV9kZXYgKmRldiwgc3RydWN0IHZ1X3ZpcnRx ICp2cSwNCisJCSBzdHJ1Y3QgdnVfdmlydHFfZWxlbWVudCAqZWxlbSk7DQordm9pZCB2dV9xdWV1 ZV9kZXRhY2hfZWxlbWVudChzdHJ1Y3QgdnVfdmlydHEgKnZxKTsNCit2b2lkIHZ1X3F1ZXVlX3Vu cG9wKHN0cnVjdCB2dV92aXJ0cSAqdnEpOw0KK2Jvb2wgdnVfcXVldWVfcmV3aW5kKHN0cnVjdCB2 dV92aXJ0cSAqdnEsIHVuc2lnbmVkIGludCBudW0pOw0KK3ZvaWQgdnVfcXVldWVfZmlsbF9ieV9p bmRleChzdHJ1Y3QgdnVfdmlydHEgKnZxLCB1bnNpZ25lZCBpbnQgaW5kZXgsDQorCQkJICAgIHVu c2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBpZHgpOw0KK3ZvaWQgdnVfcXVldWVfZmlsbChz dHJ1Y3QgdnVfdmlydHEgKnZxLA0KKwkJICAgY29uc3Qgc3RydWN0IHZ1X3ZpcnRxX2VsZW1lbnQg KmVsZW0sIHVuc2lnbmVkIGludCBsZW4sDQorCQkgICB1bnNpZ25lZCBpbnQgaWR4KTsNCit2b2lk IHZ1X3F1ZXVlX2ZsdXNoKHN0cnVjdCB2dV92aXJ0cSAqdnEsIHVuc2lnbmVkIGludCBjb3VudCk7 DQorI2VuZGlmIC8qIFZJUlRJT19IICovDQotLSANCjIuNDYuMg0KDQo=