From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lucas Stach Subject: [PATCH v2 07/14] drm/etnaviv: add GEM submit and cmdstream validation bits Date: Wed, 9 Dec 2015 12:48:20 +0100 Message-ID: <1449661707-30532-7-git-send-email-l.stach@pengutronix.de> References: <1449661707-30532-1-git-send-email-l.stach@pengutronix.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1449661707-30532-1-git-send-email-l.stach@pengutronix.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: David Airlie , Rob Herring , Shawn Guo , Andrew Lunn Cc: devicetree@vger.kernel.org, Jason Cooper , dri-devel@lists.freedesktop.org, patchwork-lst@pengutronix.de, kernel@pengutronix.de, Gregory Clement , Russell King , linux-arm-kernel@lists.infradead.org, Sebastian Hesselbarth List-Id: devicetree@vger.kernel.org RnJvbTogVGhlIGV0bmF2aXYgYXV0aG9ycyA8ZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9y Zz4KClRoaXMgYWRkcyB0aGUgR0VNIHN1Ym1pdCBmdW5jdGlvbmFsaXR5IGFuZCB0aGUgbmVlZGVk IGNvbW1hbmRzdHJlYW0KdmFsaWRhdGlvbiBhbmQgR1BVIGJ1ZmZlciBoYW5kbGluZyBiaXRzIHRv IGdvIHdpdGggdGhhdC4KClNpZ25lZC1vZmYtYnk6IENocmlzdGlhbiBHbWVpbmVyIDxjaHJpc3Rp YW4uZ21laW5lckBnbWFpbC5jb20+ClNpZ25lZC1vZmYtYnk6IFJ1c3NlbGwgS2luZyA8cm1rK2tl cm5lbEBhcm0ubGludXgub3JnLnVrPgpTaWduZWQtb2ZmLWJ5OiBMdWNhcyBTdGFjaCA8bC5zdGFj aEBwZW5ndXRyb25peC5kZT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2J1 ZmZlci5jICAgICB8IDI2OCArKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vZXRuYXZp di9ldG5hdml2X2NtZF9wYXJzZXIuYyB8IDIwOSArKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9k cm0vZXRuYXZpdi9ldG5hdml2X2dlbV9zdWJtaXQuYyB8IDQzOCArKysrKysrKysrKysrKysrKysr KysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgOTE1IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2J1ZmZlci5jCiBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9jbWRfcGFyc2VyLmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dlbV9z dWJtaXQuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfYnVm ZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2J1ZmZlci5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMzMyYzU1ZWJiYTZkCi0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9idWZmZXIuYwpAQCAtMCww ICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBFdG5hdml2IFByb2plY3QKKyAq IEF1dGhvcjogQ2hyaXN0aWFuIEdtZWluZXIgPGNocmlzdGlhbi5nbWVpbmVyQGdtYWlsLmNvbT4K KyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRB QklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICog WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6 Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJldG5hdml2X2dwdS5o IgorI2luY2x1ZGUgImV0bmF2aXZfZ2VtLmgiCisjaW5jbHVkZSAiZXRuYXZpdl9tbXUuaCIKKwor I2luY2x1ZGUgImNvbW1vbi54bWwuaCIKKyNpbmNsdWRlICJzdGF0ZS54bWwuaCIKKyNpbmNsdWRl ICJjbWRzdHJlYW0ueG1sLmgiCisKKy8qCisgKiBDb21tYW5kIEJ1ZmZlciBoZWxwZXI6CisgKi8K KworCitzdGF0aWMgaW5saW5lIHZvaWQgT1VUKHN0cnVjdCBldG5hdml2X2NtZGJ1ZiAqYnVmZmVy LCB1MzIgZGF0YSkKK3sKKwl1MzIgKnZhZGRyID0gKHUzMiAqKWJ1ZmZlci0+dmFkZHI7CisKKwlC VUdfT04oYnVmZmVyLT51c2VyX3NpemUgPj0gYnVmZmVyLT5zaXplKTsKKworCXZhZGRyW2J1ZmZl ci0+dXNlcl9zaXplIC8gNF0gPSBkYXRhOworCWJ1ZmZlci0+dXNlcl9zaXplICs9IDQ7Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCBDTURfTE9BRF9TVEFURShzdHJ1Y3QgZXRuYXZpdl9jbWRidWYg KmJ1ZmZlciwKKwl1MzIgcmVnLCB1MzIgdmFsdWUpCit7CisJdTMyIGluZGV4ID0gcmVnID4+IFZJ Vl9GRV9MT0FEX1NUQVRFX0hFQURFUl9PRkZTRVRfX1NIUjsKKworCWJ1ZmZlci0+dXNlcl9zaXpl ID0gQUxJR04oYnVmZmVyLT51c2VyX3NpemUsIDgpOworCisJLyogd3JpdGUgYSByZWdpc3RlciB2 aWEgY21kIHN0cmVhbSAqLworCU9VVChidWZmZXIsIFZJVl9GRV9MT0FEX1NUQVRFX0hFQURFUl9P UF9MT0FEX1NUQVRFIHwKKwkJICAgIFZJVl9GRV9MT0FEX1NUQVRFX0hFQURFUl9DT1VOVCgxKSB8 CisJCSAgICBWSVZfRkVfTE9BRF9TVEFURV9IRUFERVJfT0ZGU0VUKGluZGV4KSk7CisJT1VUKGJ1 ZmZlciwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQ01EX0VORChzdHJ1Y3QgZXRu YXZpdl9jbWRidWYgKmJ1ZmZlcikKK3sKKwlidWZmZXItPnVzZXJfc2l6ZSA9IEFMSUdOKGJ1ZmZl ci0+dXNlcl9zaXplLCA4KTsKKworCU9VVChidWZmZXIsIFZJVl9GRV9FTkRfSEVBREVSX09QX0VO RCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBDTURfV0FJVChzdHJ1Y3QgZXRuYXZpdl9jbWRi dWYgKmJ1ZmZlcikKK3sKKwlidWZmZXItPnVzZXJfc2l6ZSA9IEFMSUdOKGJ1ZmZlci0+dXNlcl9z aXplLCA4KTsKKworCU9VVChidWZmZXIsIFZJVl9GRV9XQUlUX0hFQURFUl9PUF9XQUlUIHwgMjAw KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIENNRF9MSU5LKHN0cnVjdCBldG5hdml2X2NtZGJ1 ZiAqYnVmZmVyLAorCXUxNiBwcmVmZXRjaCwgdTMyIGFkZHJlc3MpCit7CisJYnVmZmVyLT51c2Vy X3NpemUgPSBBTElHTihidWZmZXItPnVzZXJfc2l6ZSwgOCk7CisKKwlPVVQoYnVmZmVyLCBWSVZf RkVfTElOS19IRUFERVJfT1BfTElOSyB8CisJCSAgICBWSVZfRkVfTElOS19IRUFERVJfUFJFRkVU Q0gocHJlZmV0Y2gpKTsKKwlPVVQoYnVmZmVyLCBhZGRyZXNzKTsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkIENNRF9TVEFMTChzdHJ1Y3QgZXRuYXZpdl9jbWRidWYgKmJ1ZmZlciwKKwl1MzIgZnJv bSwgdTMyIHRvKQoreworCWJ1ZmZlci0+dXNlcl9zaXplID0gQUxJR04oYnVmZmVyLT51c2VyX3Np emUsIDgpOworCisJT1VUKGJ1ZmZlciwgVklWX0ZFX1NUQUxMX0hFQURFUl9PUF9TVEFMTCk7CisJ T1VUKGJ1ZmZlciwgVklWX0ZFX1NUQUxMX1RPS0VOX0ZST00oZnJvbSkgfCBWSVZfRkVfU1RBTExf VE9LRU5fVE8odG8pKTsKK30KKworc3RhdGljIHZvaWQgZXRuYXZpdl9jbWRfc2VsZWN0X3BpcGUo c3RydWN0IGV0bmF2aXZfY21kYnVmICpidWZmZXIsIHU4IHBpcGUpCit7CisJdTMyIGZsdXNoOwor CXUzMiBzdGFsbDsKKworCS8qCisJICogVGhpcyBhc3N1bWVzIHRoYXQgaWYgd2UncmUgc3dpdGNo aW5nIHRvIDJELCB3ZSdyZSBzd2l0Y2hpbmcKKwkgKiBhd2F5IGZyb20gM0QsIGFuZCB2aWNlIHZl cnNhLiAgSGVuY2UsIGlmIHdlJ3JlIHN3aXRjaGluZyB0bworCSAqIHRoZSAyRCBjb3JlLCB3ZSBu ZWVkIHRvIGZsdXNoIHRoZSAzRCBkZXB0aCBhbmQgY29sb3IgY2FjaGVzLAorCSAqIG90aGVyd2lz ZSB3ZSBuZWVkIHRvIGZsdXNoIHRoZSAyRCBwaXhlbCBlbmdpbmUgY2FjaGUuCisJICovCisJaWYg KHBpcGUgPT0gRVROQV9QSVBFXzJEKQorCQlmbHVzaCA9IFZJVlNfR0xfRkxVU0hfQ0FDSEVfREVQ VEggfCBWSVZTX0dMX0ZMVVNIX0NBQ0hFX0NPTE9SOworCWVsc2UKKwkJZmx1c2ggPSBWSVZTX0dM X0ZMVVNIX0NBQ0hFX1BFMkQ7CisKKwlzdGFsbCA9IFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOX0ZS T00oU1lOQ19SRUNJUElFTlRfRkUpIHwKKwkJVklWU19HTF9TRU1BUEhPUkVfVE9LRU5fVE8oU1lO Q19SRUNJUElFTlRfUEUpOworCisJQ01EX0xPQURfU1RBVEUoYnVmZmVyLCBWSVZTX0dMX0ZMVVNI X0NBQ0hFLCBmbHVzaCk7CisJQ01EX0xPQURfU1RBVEUoYnVmZmVyLCBWSVZTX0dMX1NFTUFQSE9S RV9UT0tFTiwgc3RhbGwpOworCisJQ01EX1NUQUxMKGJ1ZmZlciwgU1lOQ19SRUNJUElFTlRfRkUs IFNZTkNfUkVDSVBJRU5UX1BFKTsKKworCUNNRF9MT0FEX1NUQVRFKGJ1ZmZlciwgVklWU19HTF9Q SVBFX1NFTEVDVCwKKwkJICAgICAgIFZJVlNfR0xfUElQRV9TRUxFQ1RfUElQRShwaXBlKSk7Cit9 CisKK3N0YXRpYyB1MzIgZ3B1X3ZhKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LCBzdHJ1Y3QgZXRu YXZpdl9jbWRidWYgKmJ1ZikKK3sKKwlyZXR1cm4gYnVmLT5wYWRkciAtIGdwdS0+bWVtb3J5X2Jh c2U7Cit9CisKK3N0YXRpYyB2b2lkIGV0bmF2aXZfYnVmZmVyX2R1bXAoc3RydWN0IGV0bmF2aXZf Z3B1ICpncHUsCisJc3RydWN0IGV0bmF2aXZfY21kYnVmICpidWYsIHUzMiBvZmYsIHUzMiBsZW4p Cit7CisJdTMyIHNpemUgPSBidWYtPnNpemU7CisJdTMyICpwdHIgPSBidWYtPnZhZGRyICsgb2Zm OworCisJZGV2X2luZm8oZ3B1LT5kZXYsICJ2aXJ0ICVwIHBoeXMgMHglMDh4IGZyZWUgMHglMDh4 XG4iLAorCQkJcHRyLCBncHVfdmEoZ3B1LCBidWYpICsgb2ZmLCBzaXplIC0gbGVuICogNCAtIG9m Zik7CisKKwlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICJjbWQgIiwgRFVNUF9QUkVGSVhfT0ZG U0VULCAxNiwgNCwKKwkJCXB0ciwgbGVuICogNCwgMCk7Cit9CisKK3UxNiBldG5hdml2X2J1ZmZl cl9pbml0KHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1KQoreworCXN0cnVjdCBldG5hdml2X2NtZGJ1 ZiAqYnVmZmVyID0gZ3B1LT5idWZmZXI7CisKKwkvKiBpbml0aWFsaXplIGJ1ZmZlciAqLworCWJ1 ZmZlci0+dXNlcl9zaXplID0gMDsKKworCUNNRF9XQUlUKGJ1ZmZlcik7CisJQ01EX0xJTksoYnVm ZmVyLCAyLCBncHVfdmEoZ3B1LCBidWZmZXIpICsgYnVmZmVyLT51c2VyX3NpemUgLSA0KTsKKwor CXJldHVybiBidWZmZXItPnVzZXJfc2l6ZSAvIDg7Cit9CisKK3ZvaWQgZXRuYXZpdl9idWZmZXJf ZW5kKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1KQoreworCXN0cnVjdCBldG5hdml2X2NtZGJ1ZiAq YnVmZmVyID0gZ3B1LT5idWZmZXI7CisKKwkvKiBSZXBsYWNlIHRoZSBsYXN0IFdBSVQgd2l0aCBh biBFTkQgKi8KKwlidWZmZXItPnVzZXJfc2l6ZSAtPSAxNjsKKworCUNNRF9FTkQoYnVmZmVyKTsK KwltYigpOworfQorCit2b2lkIGV0bmF2aXZfYnVmZmVyX3F1ZXVlKHN0cnVjdCBldG5hdml2X2dw dSAqZ3B1LCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJc3RydWN0IGV0bmF2aXZfY21kYnVmICpjbWRi dWYpCit7CisJc3RydWN0IGV0bmF2aXZfY21kYnVmICpidWZmZXIgPSBncHUtPmJ1ZmZlcjsKKwl1 MzIgKmx3ID0gYnVmZmVyLT52YWRkciArIGJ1ZmZlci0+dXNlcl9zaXplIC0gMTY7CisJdTMyIGJh Y2ssIGxpbmtfdGFyZ2V0LCBsaW5rX3NpemUsIHJlc2VydmVfc2l6ZSwgZXh0cmFfc2l6ZSA9IDA7 CisKKwlpZiAoZHJtX2RlYnVnICYgRFJNX1VUX0RSSVZFUikKKwkJZXRuYXZpdl9idWZmZXJfZHVt cChncHUsIGJ1ZmZlciwgMCwgMHg1MCk7CisKKwkvKgorCSAqIElmIHdlIG5lZWQgdG8gZmx1c2gg dGhlIE1NVSBwcmlvciB0byBzdWJtaXR0aW5nIHRoaXMgYnVmZmVyLCB3ZQorCSAqIHdpbGwgbmVl ZCB0byBhcHBlbmQgYSBtbXUgZmx1c2ggbG9hZCBzdGF0ZSwgZm9sbG93ZWQgYnkgYSBuZXcKKwkg KiBsaW5rIHRvIHRoaXMgYnVmZmVyIC0gYSB0b3RhbCBvZiBmb3VyIGFkZGl0aW9uYWwgd29yZHMu CisJICovCisJaWYgKGdwdS0+bW11LT5uZWVkX2ZsdXNoIHx8IGdwdS0+c3dpdGNoX2NvbnRleHQp IHsKKwkJLyogbGluayBjb21tYW5kICovCisJCWV4dHJhX3NpemUgKz0gMjsKKwkJLyogZmx1c2gg Y29tbWFuZCAqLworCQlpZiAoZ3B1LT5tbXUtPm5lZWRfZmx1c2gpCisJCQlleHRyYV9zaXplICs9 IDI7CisJCS8qIHBpcGUgc3dpdGNoIGNvbW1hbmRzICovCisJCWlmIChncHUtPnN3aXRjaF9jb250 ZXh0KQorCQkJZXh0cmFfc2l6ZSArPSA4OworCX0KKworCXJlc2VydmVfc2l6ZSA9ICg2ICsgZXh0 cmFfc2l6ZSkgKiA0OworCisJLyoKKwkgKiBpZiB3ZSBhcmUgZ29pbmcgdG8gY29tcGxldGVseSBv dmVyZmxvdyB0aGUgYnVmZmVyLCB3ZSBuZWVkIHRvIHdyYXAuCisJICovCisJaWYgKGJ1ZmZlci0+ dXNlcl9zaXplICsgcmVzZXJ2ZV9zaXplID4gYnVmZmVyLT5zaXplKQorCQlidWZmZXItPnVzZXJf c2l6ZSA9IDA7CisKKwkvKiBzYXZlIG9mZnNldCBiYWNrIGludG8gbWFpbiBidWZmZXIgKi8KKwli YWNrID0gYnVmZmVyLT51c2VyX3NpemUgKyByZXNlcnZlX3NpemUgLSA2ICogNDsKKwlsaW5rX3Rh cmdldCA9IGdwdV92YShncHUsIGJ1ZmZlcikgKyBidWZmZXItPnVzZXJfc2l6ZTsKKwlsaW5rX3Np emUgPSA2OworCisJLyogU2tpcCBvdmVyIGFueSBleHRyYSBpbnN0cnVjdGlvbnMgKi8KKwlsaW5r X3RhcmdldCArPSBleHRyYV9zaXplICogc2l6ZW9mKHUzMik7CisKKwlpZiAoZHJtX2RlYnVnICYg RFJNX1VUX0RSSVZFUikKKwkJcHJfaW5mbygic3RyZWFtIGxpbmsgdG8gMHglMDh4IEAgMHglMDh4 ICVwXG4iLAorCQkJbGlua190YXJnZXQsIGdwdV92YShncHUsIGNtZGJ1ZiksIGNtZGJ1Zi0+dmFk ZHIpOworCisJLyoganVtcCBiYWNrIGZyb20gY21kIHRvIG1haW4gYnVmZmVyICovCisJQ01EX0xJ TksoY21kYnVmLCBsaW5rX3NpemUsIGxpbmtfdGFyZ2V0KTsKKworCWxpbmtfdGFyZ2V0ID0gZ3B1 X3ZhKGdwdSwgY21kYnVmKTsKKwlsaW5rX3NpemUgPSBjbWRidWYtPnNpemUgLyA4OworCisKKwor CWlmIChkcm1fZGVidWcgJiBEUk1fVVRfRFJJVkVSKSB7CisJCXByaW50X2hleF9kdW1wKEtFUk5f SU5GTywgImNtZCAiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCA0LAorCQkJICAgICAgIGNtZGJ1 Zi0+dmFkZHIsIGNtZGJ1Zi0+c2l6ZSwgMCk7CisKKwkJcHJfaW5mbygibGluayBvcDogJXBcbiIs IGx3KTsKKwkJcHJfaW5mbygibGluayBhZGRyOiAlcFxuIiwgbHcgKyAxKTsKKwkJcHJfaW5mbygi YWRkcjogMHglMDh4XG4iLCBsaW5rX3RhcmdldCk7CisJCXByX2luZm8oImJhY2s6IDB4JTA4eFxu IiwgZ3B1X3ZhKGdwdSwgYnVmZmVyKSArIGJhY2spOworCQlwcl9pbmZvKCJldmVudDogJWRcbiIs IGV2ZW50KTsKKwl9CisKKwlpZiAoZ3B1LT5tbXUtPm5lZWRfZmx1c2ggfHwgZ3B1LT5zd2l0Y2hf Y29udGV4dCkgeworCQl1MzIgbmV3X3RhcmdldCA9IGdwdV92YShncHUsIGJ1ZmZlcikgKyBidWZm ZXItPnVzZXJfc2l6ZTsKKworCQlpZiAoZ3B1LT5tbXUtPm5lZWRfZmx1c2gpIHsKKwkJCS8qIEFk ZCB0aGUgTU1VIGZsdXNoICovCisJCQlDTURfTE9BRF9TVEFURShidWZmZXIsIFZJVlNfR0xfRkxV U0hfTU1VLAorCQkJCSAgICAgICBWSVZTX0dMX0ZMVVNIX01NVV9GTFVTSF9GRU1NVSB8CisJCQkJ ICAgICAgIFZJVlNfR0xfRkxVU0hfTU1VX0ZMVVNIX1VOSzEgfAorCQkJCSAgICAgICBWSVZTX0dM X0ZMVVNIX01NVV9GTFVTSF9VTksyIHwKKwkJCQkgICAgICAgVklWU19HTF9GTFVTSF9NTVVfRkxV U0hfUEVNTVUgfAorCQkJCSAgICAgICBWSVZTX0dMX0ZMVVNIX01NVV9GTFVTSF9VTks0KTsKKwor CQkJZ3B1LT5tbXUtPm5lZWRfZmx1c2ggPSBmYWxzZTsKKwkJfQorCisJCWlmIChncHUtPnN3aXRj aF9jb250ZXh0KSB7CisJCQlldG5hdml2X2NtZF9zZWxlY3RfcGlwZShidWZmZXIsIGNtZGJ1Zi0+ ZXhlY19zdGF0ZSk7CisJCQlncHUtPnN3aXRjaF9jb250ZXh0ID0gZmFsc2U7CisJCX0KKworCQkv KiBBbmQgdGhlIGxpbmsgdG8gdGhlIGZpcnN0IGJ1ZmZlciAqLworCQlDTURfTElOSyhidWZmZXIs IGxpbmtfc2l6ZSwgbGlua190YXJnZXQpOworCisJCS8qIFVwZGF0ZSB0aGUgbGluayB0YXJnZXQg dG8gcG9pbnQgdG8gYWJvdmUgaW5zdHJ1Y3Rpb25zICovCisJCWxpbmtfdGFyZ2V0ID0gbmV3X3Rh cmdldDsKKwkJbGlua19zaXplID0gZXh0cmFfc2l6ZTsKKwl9CisKKwkvKiB0cmlnZ2VyIGV2ZW50 ICovCisJQ01EX0xPQURfU1RBVEUoYnVmZmVyLCBWSVZTX0dMX0VWRU5ULCBWSVZTX0dMX0VWRU5U X0VWRU5UX0lEKGV2ZW50KSB8CisJCSAgICAgICBWSVZTX0dMX0VWRU5UX0ZST01fUEUpOworCisJ LyogYXBwZW5kIFdBSVQvTElOSyB0byBtYWluIGJ1ZmZlciAqLworCUNNRF9XQUlUKGJ1ZmZlcik7 CisJQ01EX0xJTksoYnVmZmVyLCAyLCBncHVfdmEoZ3B1LCBidWZmZXIpICsgKGJ1ZmZlci0+dXNl cl9zaXplIC0gNCkpOworCisJLyogQ2hhbmdlIFdBSVQgaW50byBhIExJTksgY29tbWFuZDsgd3Jp dGUgdGhlIGFkZHJlc3MgZmlyc3QuICovCisJKihsdyArIDEpID0gbGlua190YXJnZXQ7CisJbWIo KTsKKwkqKGx3KSA9IFZJVl9GRV9MSU5LX0hFQURFUl9PUF9MSU5LIHwKKwkJVklWX0ZFX0xJTktf SEVBREVSX1BSRUZFVENIKGxpbmtfc2l6ZSk7CisJbWIoKTsKKworCWlmIChkcm1fZGVidWcgJiBE Uk1fVVRfRFJJVkVSKQorCQlldG5hdml2X2J1ZmZlcl9kdW1wKGdwdSwgYnVmZmVyLCAwLCAweDUw KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfY21kX3Bh cnNlci5jIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9jbWRfcGFyc2VyLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5kY2ZkNTY1Yzg4ZDEKLS0tIC9k ZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2NtZF9wYXJzZXIu YwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBFdG5hdml2IFBy b2plY3QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAor ICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVS Q0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisg KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUg PGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9r ZXJuZWwuaD4KKworI2luY2x1ZGUgImV0bmF2aXZfZ2VtLmgiCisjaW5jbHVkZSAiZXRuYXZpdl9n cHUuaCIKKworI2luY2x1ZGUgImNtZHN0cmVhbS54bWwuaCIKKworI2RlZmluZSBFWFRSQUNUKHZh bCwgZmllbGQpICgoKHZhbCkgJiBmaWVsZCMjX19NQVNLKSA+PiBmaWVsZCMjX19TSElGVCkKKwor c3RydWN0IGV0bmFfdmFsaWRhdGlvbl9zdGF0ZSB7CisJc3RydWN0IGV0bmF2aXZfZ3B1ICpncHU7 CisJY29uc3Qgc3RydWN0IGRybV9ldG5hdml2X2dlbV9zdWJtaXRfcmVsb2MgKnJlbG9jczsKKwl1 bnNpZ25lZCBpbnQgbnVtX3JlbG9jczsKKwl1MzIgKnN0YXJ0OworfTsKKworc3RhdGljIGNvbnN0 IHN0cnVjdCB7CisJdTE2IG9mZnNldDsKKwl1MTYgc2l6ZTsKK30gZXRuYXZpdl9zZW5zaXRpdmVf c3RhdGVzW10gX19pbml0Y29uc3QgPSB7CisjZGVmaW5lIFNUKHN0YXJ0LCBudW0pIHsgKHN0YXJ0 KSA+PiAyLCAobnVtKSB9CisJLyogMkQgKi8KKwlTVCgweDEyMDAsIDEpLAorCVNUKDB4MTIyOCwg MSksCisJU1QoMHgxMjM4LCAxKSwKKwlTVCgweDEyODQsIDEpLAorCVNUKDB4MTI4YywgMSksCisJ U1QoMHgxMzA0LCAxKSwKKwlTVCgweDEzMTAsIDEpLAorCVNUKDB4MTMxOCwgMSksCisJU1QoMHgx MjgwMCwgNCksCisJU1QoMHgxMjhhMCwgNCksCisJU1QoMHgxMjhjMCwgNCksCisJU1QoMHgxMjk3 MCwgNCksCisJU1QoMHgxMmEwMCwgOCksCisJU1QoMHgxMmI0MCwgOCksCisJU1QoMHgxMmI4MCwg OCksCisJU1QoMHgxMmNlMCwgOCksCisJLyogM0QgKi8KKwlTVCgweDA2NDQsIDEpLAorCVNUKDB4 MDY0YywgMSksCisJU1QoMHgwNjgwLCA4KSwKKwlTVCgweDE0MTAsIDEpLAorCVNUKDB4MTQzMCwg MSksCisJU1QoMHgxNDU4LCAxKSwKKwlTVCgweDE0NjAsIDgpLAorCVNUKDB4MTQ4MCwgOCksCisJ U1QoMHgxNTAwLCA4KSwKKwlTVCgweDE1MjAsIDgpLAorCVNUKDB4MTYwOCwgMSksCisJU1QoMHgx NjEwLCAxKSwKKwlTVCgweDE2NTgsIDEpLAorCVNUKDB4MTY1YywgMSksCisJU1QoMHgxNjY0LCAx KSwKKwlTVCgweDE2NjgsIDEpLAorCVNUKDB4MTZhNCwgMSksCisJU1QoMHgxNmMwLCA4KSwKKwlT VCgweDE2ZTAsIDgpLAorCVNUKDB4MTc0MCwgOCksCisJU1QoMHgyNDAwLCAxNCAqIDE2KSwKKwlT VCgweDEwODAwLCAzMiAqIDE2KSwKKyN1bmRlZiBTVAorfTsKKworI2RlZmluZSBFVE5BVklWX1NU QVRFU19TSVpFIChWSVZfRkVfTE9BRF9TVEFURV9IRUFERVJfT0ZGU0VUX19NQVNLICsgMXUpCitz dGF0aWMgREVDTEFSRV9CSVRNQVAoZXRuYXZpdl9zdGF0ZXMsIEVUTkFWSVZfU1RBVEVTX1NJWkUp OworCit2b2lkIF9faW5pdCBldG5hdml2X3ZhbGlkYXRlX2luaXQodm9pZCkKK3sKKwl1bnNpZ25l ZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV0bmF2aXZfc2Vuc2l0aXZl X3N0YXRlcyk7IGkrKykKKwkJYml0bWFwX3NldChldG5hdml2X3N0YXRlcywgZXRuYXZpdl9zZW5z aXRpdmVfc3RhdGVzW2ldLm9mZnNldCwKKwkJCSAgIGV0bmF2aXZfc2Vuc2l0aXZlX3N0YXRlc1tp XS5zaXplKTsKK30KKworc3RhdGljIHZvaWQgZXRuYXZpdl93YXJuX2lmX25vbl9zZW5zaXRpdmUo c3RydWN0IGV0bmFfdmFsaWRhdGlvbl9zdGF0ZSAqc3RhdGUsCisJdW5zaWduZWQgaW50IGJ1Zl9v ZmZzZXQsIHVuc2lnbmVkIGludCBzdGF0ZV9hZGRyKQoreworCWlmIChzdGF0ZS0+bnVtX3JlbG9j cyAmJiBzdGF0ZS0+cmVsb2NzLT5zdWJtaXRfb2Zmc2V0IDwgYnVmX29mZnNldCkgeworCQlkZXZf d2Fybl9vbmNlKHN0YXRlLT5ncHUtPmRldiwKKwkJCSAgICAgICIlczogcmVsb2NhdGlvbiBmb3Ig bm9uLXNlbnNpdGl2ZSBzdGF0ZSAweCV4IGF0IG9mZnNldCAldVxuIiwKKwkJCSAgICAgIF9fZnVu Y19fLCBzdGF0ZV9hZGRyLAorCQkJICAgICAgc3RhdGUtPnJlbG9jcy0+c3VibWl0X29mZnNldCk7 CisJCXdoaWxlIChzdGF0ZS0+bnVtX3JlbG9jcyAmJgorCQkgICAgICAgc3RhdGUtPnJlbG9jcy0+ c3VibWl0X29mZnNldCA8IGJ1Zl9vZmZzZXQpIHsKKwkJCXN0YXRlLT5yZWxvY3MrKzsKKwkJCXN0 YXRlLT5udW1fcmVsb2NzLS07CisJCX0KKwl9Cit9CisKK3N0YXRpYyBib29sIGV0bmF2aXZfdmFs aWRhdGVfbG9hZF9zdGF0ZShzdHJ1Y3QgZXRuYV92YWxpZGF0aW9uX3N0YXRlICpzdGF0ZSwKKwl1 MzIgKnB0ciwgdW5zaWduZWQgaW50IHN0YXRlX29mZnNldCwgdW5zaWduZWQgaW50IG51bSkKK3sK Kwl1bnNpZ25lZCBpbnQgc2l6ZSA9IG1pbihFVE5BVklWX1NUQVRFU19TSVpFLCBzdGF0ZV9vZmZz ZXQgKyBudW0pOworCXVuc2lnbmVkIGludCBzdF9vZmZzZXQgPSBzdGF0ZV9vZmZzZXQsIGJ1Zl9v ZmZzZXQ7CisKKwlmb3JfZWFjaF9zZXRfYml0X2Zyb20oc3Rfb2Zmc2V0LCBldG5hdml2X3N0YXRl cywgc2l6ZSkgeworCQlidWZfb2Zmc2V0ID0gKHB0ciAtIHN0YXRlLT5zdGFydCArCisJCQkgICAg ICBzdF9vZmZzZXQgLSBzdGF0ZV9vZmZzZXQpICogNDsKKworCQlldG5hdml2X3dhcm5faWZfbm9u X3NlbnNpdGl2ZShzdGF0ZSwgYnVmX29mZnNldCwgc3Rfb2Zmc2V0ICogNCk7CisJCWlmIChzdGF0 ZS0+bnVtX3JlbG9jcyAmJgorCQkgICAgc3RhdGUtPnJlbG9jcy0+c3VibWl0X29mZnNldCA9PSBi dWZfb2Zmc2V0KSB7CisJCQlzdGF0ZS0+cmVsb2NzKys7CisJCQlzdGF0ZS0+bnVtX3JlbG9jcy0t OworCQkJY29udGludWU7CisJCX0KKworCQlkZXZfd2Fybl9yYXRlbGltaXRlZChzdGF0ZS0+Z3B1 LT5kZXYsCisJCQkJICAgICAiJXM6IGxvYWQgc3RhdGUgdG91Y2hlcyByZXN0cmljdGVkIHN0YXRl IDB4JXggYXQgb2Zmc2V0ICV1XG4iLAorCQkJCSAgICAgX19mdW5jX18sIHN0X29mZnNldCAqIDQs IGJ1Zl9vZmZzZXQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHN0YXRlLT5udW1fcmVs b2NzKSB7CisJCWJ1Zl9vZmZzZXQgPSAocHRyIC0gc3RhdGUtPnN0YXJ0ICsgbnVtKSAqIDQ7CisJ CWV0bmF2aXZfd2Fybl9pZl9ub25fc2Vuc2l0aXZlKHN0YXRlLCBidWZfb2Zmc2V0LCBzdF9vZmZz ZXQgKiA0ICsKKwkJCQkJICAgICAgc3RhdGUtPnJlbG9jcy0+c3VibWl0X29mZnNldCAtCisJCQkJ CSAgICAgIGJ1Zl9vZmZzZXQpOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWlu dDhfdCBjbWRfbGVuZ3RoWzMyXSA9IHsKKwlbRkVfT1BDT0RFX0RSQVdfUFJJTUlUSVZFU10gPSA0 LAorCVtGRV9PUENPREVfRFJBV19JTkRFWEVEX1BSSU1JVElWRVNdID0gNiwKKwlbRkVfT1BDT0RF X05PUF0gPSAyLAorCVtGRV9PUENPREVfU1RBTExdID0gMiwKK307CisKK2Jvb2wgZXRuYXZpdl9j bWRfdmFsaWRhdGVfb25lKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LCB1MzIgKnN0cmVhbSwKKwkJ CSAgICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJICAgICAgc3RydWN0IGRybV9ldG5hdml2X2dl bV9zdWJtaXRfcmVsb2MgKnJlbG9jcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCByZWxvY19zaXpl KQoreworCXN0cnVjdCBldG5hX3ZhbGlkYXRpb25fc3RhdGUgc3RhdGU7CisJdTMyICpidWYgPSBz dHJlYW07CisJdTMyICplbmQgPSBidWYgKyBzaXplOworCisJc3RhdGUuZ3B1ID0gZ3B1OworCXN0 YXRlLnJlbG9jcyA9IHJlbG9jczsKKwlzdGF0ZS5udW1fcmVsb2NzID0gcmVsb2Nfc2l6ZTsKKwlz dGF0ZS5zdGFydCA9IHN0cmVhbTsKKworCXdoaWxlIChidWYgPCBlbmQpIHsKKwkJdTMyIGNtZCA9 ICpidWY7CisJCXVuc2lnbmVkIGludCBsZW4sIG4sIG9mZjsKKwkJdW5zaWduZWQgaW50IG9wID0g Y21kID4+IDI3OworCisJCXN3aXRjaCAob3ApIHsKKwkJY2FzZSBGRV9PUENPREVfTE9BRF9TVEFU RToKKwkJCW4gPSBFWFRSQUNUKGNtZCwgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX0NPVU5UKTsK KwkJCWxlbiA9IEFMSUdOKDEgKyBuLCAyKTsKKwkJCWlmIChidWYgKyBsZW4gPiBlbmQpCisJCQkJ YnJlYWs7CisKKwkJCW9mZiA9IEVYVFJBQ1QoY21kLCBWSVZfRkVfTE9BRF9TVEFURV9IRUFERVJf T0ZGU0VUKTsKKwkJCWlmICghZXRuYXZpdl92YWxpZGF0ZV9sb2FkX3N0YXRlKCZzdGF0ZSwgYnVm ICsgMSwKKwkJCQkJCQkgb2ZmLCBuKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlicmVhazsKKwor CQljYXNlIEZFX09QQ09ERV9EUkFXXzJEOgorCQkJbiA9IEVYVFJBQ1QoY21kLCBWSVZfRkVfRFJB V18yRF9IRUFERVJfQ09VTlQpOworCQkJaWYgKG4gPT0gMCkKKwkJCQluID0gMjU2OworCQkJbGVu ID0gMiArIG4gKiAyOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWxlbiA9IGNtZF9sZW5n dGhbb3BdOworCQkJaWYgKGxlbiA9PSAwKSB7CisJCQkJZGV2X2VycihncHUtPmRldiwgIiVzOiBv cCAldSBub3QgcGVybWl0dGVkIGF0IG9mZnNldCAldHVcbiIsCisJCQkJCV9fZnVuY19fLCBvcCwg YnVmIC0gc3RhdGUuc3RhcnQpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWJyZWFrOwor CQl9CisKKwkJYnVmICs9IGxlbjsKKwl9CisKKwlpZiAoYnVmID4gZW5kKSB7CisJCWRldl9lcnIo Z3B1LT5kZXYsICIlczogY29tbWFuZHMgb3ZlcmZsb3cgZW5kIG9mIGJ1ZmZlcjogJXR1ID4gJXVc biIsCisJCQlfX2Z1bmNfXywgYnVmIC0gc3RhdGUuc3RhcnQsIHNpemUpOworCQlyZXR1cm4gZmFs c2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v ZXRuYXZpdi9ldG5hdml2X2dlbV9zdWJtaXQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0 bmF2aXZfZ2VtX3N1Ym1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw MC4uZmVjNWZmZGUyOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2 aXYvZXRuYXZpdl9nZW1fc3VibWl0LmMKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBDb3B5cmln aHQgKEMpIDIwMTUgRXRuYXZpdiBQcm9qZWN0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAy IGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisg KiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv cgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMg cHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAq LworCisjaW5jbHVkZSA8bGludXgvcmVzZXJ2YXRpb24uaD4KKyNpbmNsdWRlICJldG5hdml2X2Ry di5oIgorI2luY2x1ZGUgImV0bmF2aXZfZ3B1LmgiCisjaW5jbHVkZSAiZXRuYXZpdl9nZW0uaCIK KworLyoKKyAqIENtZHN0cmVhbSBzdWJtaXNzaW9uOgorICovCisKKyNkZWZpbmUgQk9fSU5WQUxJ RF9GTEFHUyB+KEVUTkFfU1VCTUlUX0JPX1JFQUQgfCBFVE5BX1NVQk1JVF9CT19XUklURSkKKy8q IG1ha2Ugc3VyZSB0aGVzZSBkb24ndCBjb25mbGljdCB3LyBFVE5BVklWX1NVQk1JVF9CT194ICov CisjZGVmaW5lIEJPX0xPQ0tFRCAgIDB4NDAwMAorI2RlZmluZSBCT19QSU5ORUQgICAweDIwMDAK Kworc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqdG9fdXNlcl9wdHIodTY0IGFkZHJlc3MpCit7 CisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpYWRkcmVzczsKK30KKworc3RhdGlj IHN0cnVjdCBldG5hdml2X2dlbV9zdWJtaXQgKnN1Ym1pdF9jcmVhdGUoc3RydWN0IGRybV9kZXZp Y2UgKmRldiwKKwkJc3RydWN0IGV0bmF2aXZfZ3B1ICpncHUsIHNpemVfdCBucikKK3sKKwlzdHJ1 Y3QgZXRuYXZpdl9nZW1fc3VibWl0ICpzdWJtaXQ7CisJc2l6ZV90IHN6ID0gc2l6ZV92c3RydWN0 KG5yLCBzaXplb2Yoc3VibWl0LT5ib3NbMF0pLCBzaXplb2YoKnN1Ym1pdCkpOworCisJc3VibWl0 ID0ga21hbGxvYyhzeiwgR0ZQX1RFTVBPUkFSWSB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVU UlkpOworCWlmIChzdWJtaXQpIHsKKwkJc3VibWl0LT5kZXYgPSBkZXY7CisJCXN1Ym1pdC0+Z3B1 ID0gZ3B1OworCisJCS8qIGluaXRpYWxseSwgdW50aWwgY29weV9mcm9tX3VzZXIoKSBhbmQgYm8g bG9va3VwIHN1Y2NlZWRzOiAqLworCQlzdWJtaXQtPm5yX2JvcyA9IDA7CisKKwkJd3dfYWNxdWly ZV9pbml0KCZzdWJtaXQtPnRpY2tldCwgJnJlc2VydmF0aW9uX3d3X2NsYXNzKTsKKwl9CisKKwly ZXR1cm4gc3VibWl0OworfQorCitzdGF0aWMgaW50IHN1Ym1pdF9sb29rdXBfb2JqZWN0cyhzdHJ1 Y3QgZXRuYXZpdl9nZW1fc3VibWl0ICpzdWJtaXQsCisJc3RydWN0IGRybV9maWxlICpmaWxlLCBz dHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX3N1Ym1pdF9ibyAqc3VibWl0X2JvcywKKwl1bnNpZ25lZCBu cl9ib3MpCit7CisJc3RydWN0IGRybV9ldG5hdml2X2dlbV9zdWJtaXRfYm8gKmJvOworCXVuc2ln bmVkIGk7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmZpbGUtPnRhYmxlX2xvY2spOwor CisJZm9yIChpID0gMCwgYm8gPSBzdWJtaXRfYm9zOyBpIDwgbnJfYm9zOyBpKyssIGJvKyspIHsK KwkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisKKwkJaWYgKGJvLT5mbGFncyAmIEJPX0lO VkFMSURfRkxBR1MpIHsKKwkJCURSTV9FUlJPUigiaW52YWxpZCBmbGFnczogJXhcbiIsIGJvLT5m bGFncyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJ c3VibWl0LT5ib3NbaV0uZmxhZ3MgPSBiby0+ZmxhZ3M7CisKKwkJLyogbm9ybWFsbHkgdXNlIGRy bV9nZW1fb2JqZWN0X2xvb2t1cCgpLCBidXQgZm9yIGJ1bGsgbG9va3VwCisJCSAqIGFsbCB1bmRl ciBzaW5nbGUgdGFibGVfbG9jayBqdXN0IGhpdCBvYmplY3RfaWRyIGRpcmVjdGx5OgorCQkgKi8K KwkJb2JqID0gaWRyX2ZpbmQoJmZpbGUtPm9iamVjdF9pZHIsIGJvLT5oYW5kbGUpOworCQlpZiAo IW9iaikgeworCQkJRFJNX0VSUk9SKCJpbnZhbGlkIGhhbmRsZSAldSBhdCBpbmRleCAldVxuIiwK KwkJCQkgIGJvLT5oYW5kbGUsIGkpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3Vu bG9jazsKKwkJfQorCisJCS8qCisJCSAqIFRha2UgYSByZWZjb3VudCBvbiB0aGUgb2JqZWN0LiBU aGUgZmlsZSB0YWJsZSBsb2NrCisJCSAqIHByZXZlbnRzIHRoZSBvYmplY3RfaWRyJ3MgcmVmY291 bnQgb24gdGhpcyBiZWluZyBkcm9wcGVkLgorCQkgKi8KKwkJZHJtX2dlbV9vYmplY3RfcmVmZXJl bmNlKG9iaik7CisKKwkJc3VibWl0LT5ib3NbaV0ub2JqID0gdG9fZXRuYXZpdl9ibyhvYmopOwor CX0KKworb3V0X3VubG9jazoKKwlzdWJtaXQtPm5yX2JvcyA9IGk7CisJc3Bpbl91bmxvY2soJmZp bGUtPnRhYmxlX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc3VibWl0 X3VubG9ja19vYmplY3Qoc3RydWN0IGV0bmF2aXZfZ2VtX3N1Ym1pdCAqc3VibWl0LCBpbnQgaSkK K3sKKwlpZiAoc3VibWl0LT5ib3NbaV0uZmxhZ3MgJiBCT19MT0NLRUQpIHsKKwkJc3RydWN0IGV0 bmF2aXZfZ2VtX29iamVjdCAqZXRuYXZpdl9vYmogPSBzdWJtaXQtPmJvc1tpXS5vYmo7CisKKwkJ d3dfbXV0ZXhfdW5sb2NrKCZldG5hdml2X29iai0+cmVzdi0+bG9jayk7CisJCXN1Ym1pdC0+Ym9z W2ldLmZsYWdzICY9IH5CT19MT0NLRUQ7CisJfQorfQorCitzdGF0aWMgaW50IHN1Ym1pdF9sb2Nr X29iamVjdHMoc3RydWN0IGV0bmF2aXZfZ2VtX3N1Ym1pdCAqc3VibWl0KQoreworCWludCBjb250 ZW5kZWQsIHNsb3dfbG9ja2VkID0gLTEsIGksIHJldCA9IDA7CisKK3JldHJ5OgorCWZvciAoaSA9 IDA7IGkgPCBzdWJtaXQtPm5yX2JvczsgaSsrKSB7CisJCXN0cnVjdCBldG5hdml2X2dlbV9vYmpl Y3QgKmV0bmF2aXZfb2JqID0gc3VibWl0LT5ib3NbaV0ub2JqOworCisJCWlmIChzbG93X2xvY2tl ZCA9PSBpKQorCQkJc2xvd19sb2NrZWQgPSAtMTsKKworCQljb250ZW5kZWQgPSBpOworCisJCWlm ICghKHN1Ym1pdC0+Ym9zW2ldLmZsYWdzICYgQk9fTE9DS0VEKSkgeworCQkJcmV0ID0gd3dfbXV0 ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZldG5hdml2X29iai0+cmVzdi0+bG9jaywKKwkJCQkJJnN1 Ym1pdC0+dGlja2V0KTsKKwkJCWlmIChyZXQgPT0gLUVBTFJFQURZKQorCQkJCURSTV9FUlJPUigi Qk8gYXQgaW5kZXggJXUgYWxyZWFkeSBvbiBzdWJtaXQgbGlzdFxuIiwKKwkJCQkJICBpKTsKKwkJ CWlmIChyZXQpCisJCQkJZ290byBmYWlsOworCQkJc3VibWl0LT5ib3NbaV0uZmxhZ3MgfD0gQk9f TE9DS0VEOworCQl9CisJfQorCisJd3dfYWNxdWlyZV9kb25lKCZzdWJtaXQtPnRpY2tldCk7CisK KwlyZXR1cm4gMDsKKworZmFpbDoKKwlmb3IgKDsgaSA+PSAwOyBpLS0pCisJCXN1Ym1pdF91bmxv Y2tfb2JqZWN0KHN1Ym1pdCwgaSk7CisKKwlpZiAoc2xvd19sb2NrZWQgPiAwKQorCQlzdWJtaXRf dW5sb2NrX29iamVjdChzdWJtaXQsIHNsb3dfbG9ja2VkKTsKKworCWlmIChyZXQgPT0gLUVERUFE TEspIHsKKwkJc3RydWN0IGV0bmF2aXZfZ2VtX29iamVjdCAqZXRuYXZpdl9vYmo7CisKKwkJZXRu YXZpdl9vYmogPSBzdWJtaXQtPmJvc1tjb250ZW5kZWRdLm9iajsKKworCQkvKiB3ZSBsb3N0IG91 dCBpbiBhIHNlcW5vIHJhY2UsIGxvY2sgYW5kIHJldHJ5Li4gKi8KKwkJcmV0ID0gd3dfbXV0ZXhf bG9ja19zbG93X2ludGVycnVwdGlibGUoJmV0bmF2aXZfb2JqLT5yZXN2LT5sb2NrLAorCQkJCSZz dWJtaXQtPnRpY2tldCk7CisJCWlmICghcmV0KSB7CisJCQlzdWJtaXQtPmJvc1tjb250ZW5kZWRd LmZsYWdzIHw9IEJPX0xPQ0tFRDsKKwkJCXNsb3dfbG9ja2VkID0gY29udGVuZGVkOworCQkJZ290 byByZXRyeTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VibWl0 X2ZlbmNlX3N5bmMoY29uc3Qgc3RydWN0IGV0bmF2aXZfZ2VtX3N1Ym1pdCAqc3VibWl0KQorewor CXVuc2lnbmVkIGludCBjb250ZXh0ID0gc3VibWl0LT5ncHUtPmZlbmNlX2NvbnRleHQ7CisJaW50 IGksIHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3VibWl0LT5ucl9ib3M7IGkrKykgewor CQlzdHJ1Y3QgZXRuYXZpdl9nZW1fb2JqZWN0ICpldG5hdml2X29iaiA9IHN1Ym1pdC0+Ym9zW2ld Lm9iajsKKwkJYm9vbCB3cml0ZSA9IHN1Ym1pdC0+Ym9zW2ldLmZsYWdzICYgRVROQV9TVUJNSVRf Qk9fV1JJVEU7CisKKwkJcmV0ID0gZXRuYXZpdl9ncHVfZmVuY2Vfc3luY19vYmooZXRuYXZpdl9v YmosIGNvbnRleHQsIHdyaXRlKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHN1Ym1pdF91bnBpbl9vYmplY3RzKHN0cnVjdCBldG5h dml2X2dlbV9zdWJtaXQgKnN1Ym1pdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBz dWJtaXQtPm5yX2JvczsgaSsrKSB7CisJCXN0cnVjdCBldG5hdml2X2dlbV9vYmplY3QgKmV0bmF2 aXZfb2JqID0gc3VibWl0LT5ib3NbaV0ub2JqOworCisJCWlmIChzdWJtaXQtPmJvc1tpXS5mbGFn cyAmIEJPX1BJTk5FRCkKKwkJCWV0bmF2aXZfZ2VtX3B1dF9pb3ZhKHN1Ym1pdC0+Z3B1LCAmZXRu YXZpdl9vYmotPmJhc2UpOworCisJCXN1Ym1pdC0+Ym9zW2ldLmlvdmEgPSAwOworCQlzdWJtaXQt PmJvc1tpXS5mbGFncyAmPSB+Qk9fUElOTkVEOworCX0KK30KKworc3RhdGljIGludCBzdWJtaXRf cGluX29iamVjdHMoc3RydWN0IGV0bmF2aXZfZ2VtX3N1Ym1pdCAqc3VibWl0KQoreworCWludCBp LCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHN1Ym1pdC0+bnJfYm9zOyBpKyspIHsKKwkJ c3RydWN0IGV0bmF2aXZfZ2VtX29iamVjdCAqZXRuYXZpdl9vYmogPSBzdWJtaXQtPmJvc1tpXS5v Ymo7CisJCXUzMiBpb3ZhOworCisJCXJldCA9IGV0bmF2aXZfZ2VtX2dldF9pb3ZhKHN1Ym1pdC0+ Z3B1LCAmZXRuYXZpdl9vYmotPmJhc2UsCisJCQkJCSAgICZpb3ZhKTsKKwkJaWYgKHJldCkKKwkJ CWJyZWFrOworCisJCXN1Ym1pdC0+Ym9zW2ldLmZsYWdzIHw9IEJPX1BJTk5FRDsKKwkJc3VibWl0 LT5ib3NbaV0uaW92YSA9IGlvdmE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCBzdWJtaXRfYm8oc3RydWN0IGV0bmF2aXZfZ2VtX3N1Ym1pdCAqc3VibWl0LCB1MzIgaWR4LAor CQlzdHJ1Y3QgZXRuYXZpdl9nZW1fb2JqZWN0ICoqb2JqLCB1MzIgKmlvdmEpCit7CisJaWYgKGlk eCA+PSBzdWJtaXQtPm5yX2JvcykgeworCQlEUk1fRVJST1IoImludmFsaWQgYnVmZmVyIGluZGV4 OiAldSAob3V0IG9mICV1KVxuIiwKKwkJCQlpZHgsIHN1Ym1pdC0+bnJfYm9zKTsKKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCisJaWYgKG9iaikKKwkJKm9iaiA9IHN1Ym1pdC0+Ym9zW2lkeF0ub2Jq OworCWlmIChpb3ZhKQorCQkqaW92YSA9IHN1Ym1pdC0+Ym9zW2lkeF0uaW92YTsKKworCXJldHVy biAwOworfQorCisvKiBwcm9jZXNzIHRoZSByZWxvYydzIGFuZCBwYXRjaCB1cCB0aGUgY21kc3Ry ZWFtIGFzIG5lZWRlZDogKi8KK3N0YXRpYyBpbnQgc3VibWl0X3JlbG9jKHN0cnVjdCBldG5hdml2 X2dlbV9zdWJtaXQgKnN1Ym1pdCwgdm9pZCAqc3RyZWFtLAorCQl1MzIgc2l6ZSwgY29uc3Qgc3Ry dWN0IGRybV9ldG5hdml2X2dlbV9zdWJtaXRfcmVsb2MgKnJlbG9jcywKKwkJdTMyIG5yX3JlbG9j cykKK3sKKwl1MzIgaSwgbGFzdF9vZmZzZXQgPSAwOworCXUzMiAqcHRyID0gc3RyZWFtOworCWlu dCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcmVsb2NzOyBpKyspIHsKKwkJY29uc3Qgc3Ry dWN0IGRybV9ldG5hdml2X2dlbV9zdWJtaXRfcmVsb2MgKnIgPSByZWxvY3MgKyBpOworCQlzdHJ1 Y3QgZXRuYXZpdl9nZW1fb2JqZWN0ICpib2JqOworCQl1MzIgaW92YSwgb2ZmOworCisJCWlmIChy LT5zdWJtaXRfb2Zmc2V0ICUgNCkgeworCQkJRFJNX0VSUk9SKCJub24tYWxpZ25lZCByZWxvYyBv ZmZzZXQ6ICV1XG4iLAorCQkJCSAgci0+c3VibWl0X29mZnNldCk7CisJCQlyZXR1cm4gLUVJTlZB TDsKKwkJfQorCisJCS8qIG9mZnNldCBpbiBkd29yZHM6ICovCisJCW9mZiA9IHItPnN1Ym1pdF9v ZmZzZXQgLyA0OworCisJCWlmICgob2ZmID49IHNpemUgKSB8fAorCQkJCShvZmYgPCBsYXN0X29m ZnNldCkpIHsKKwkJCURSTV9FUlJPUigiaW52YWxpZCBvZmZzZXQgJXUgYXQgcmVsb2MgJXVcbiIs IG9mZiwgaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldCA9IHN1Ym1pdF9ibyhz dWJtaXQsIHItPnJlbG9jX2lkeCwgJmJvYmosICZpb3ZhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVy biByZXQ7CisKKwkJaWYgKHItPnJlbG9jX29mZnNldCA+PQorCQkgICAgYm9iai0+YmFzZS5zaXpl IC0gc2l6ZW9mKCpwdHIpKSB7CisJCQlEUk1fRVJST1IoInJlbG9jYXRpb24gJXUgb3V0c2lkZSBv YmplY3QiLCBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcHRyW29mZl0gPSBpb3Zh ICsgci0+cmVsb2Nfb2Zmc2V0OworCisJCWxhc3Rfb2Zmc2V0ID0gb2ZmOworCX0KKworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfY2xlYW51cChzdHJ1Y3QgZXRuYXZpdl9nZW1f c3VibWl0ICpzdWJtaXQpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzdWJt aXQtPm5yX2JvczsgaSsrKSB7CisJCXN0cnVjdCBldG5hdml2X2dlbV9vYmplY3QgKmV0bmF2aXZf b2JqID0gc3VibWl0LT5ib3NbaV0ub2JqOworCisJCXN1Ym1pdF91bmxvY2tfb2JqZWN0KHN1Ym1p dCwgaSk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKCZldG5hdml2X29i ai0+YmFzZSk7CisJfQorCisJd3dfYWNxdWlyZV9maW5pKCZzdWJtaXQtPnRpY2tldCk7CisJa2Zy ZWUoc3VibWl0KTsKK30KKworaW50IGV0bmF2aXZfaW9jdGxfZ2VtX3N1Ym1pdChzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCit7CisJ c3RydWN0IGV0bmF2aXZfZHJtX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0 cnVjdCBkcm1fZXRuYXZpdl9nZW1fc3VibWl0ICphcmdzID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2V0 bmF2aXZfZ2VtX3N1Ym1pdF9yZWxvYyAqcmVsb2NzOworCXN0cnVjdCBkcm1fZXRuYXZpdl9nZW1f c3VibWl0X2JvICpib3M7CisJc3RydWN0IGV0bmF2aXZfZ2VtX3N1Ym1pdCAqc3VibWl0OworCXN0 cnVjdCBldG5hdml2X2NtZGJ1ZiAqY21kYnVmOworCXN0cnVjdCBldG5hdml2X2dwdSAqZ3B1Owor CXZvaWQgKnN0cmVhbTsKKwlpbnQgcmV0OworCisJaWYgKGFyZ3MtPnBpcGUgPj0gRVROQV9NQVhf UElQRVMpCisJCXJldHVybiAtRUlOVkFMOworCisJZ3B1ID0gcHJpdi0+Z3B1W2FyZ3MtPnBpcGVd OworCWlmICghZ3B1KQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKGFyZ3MtPnN0cmVhbV9zaXpl ICUgNCkgeworCQlEUk1fRVJST1IoIm5vbi1hbGlnbmVkIGNtZHN0cmVhbSBidWZmZXIgc2l6ZTog JXVcbiIsCisJCQkgIGFyZ3MtPnN0cmVhbV9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQor CisJaWYgKGFyZ3MtPmV4ZWNfc3RhdGUgIT0gRVROQV9QSVBFXzNEICYmCisJICAgIGFyZ3MtPmV4 ZWNfc3RhdGUgIT0gRVROQV9QSVBFXzJEICYmCisJICAgIGFyZ3MtPmV4ZWNfc3RhdGUgIT0gRVRO QV9QSVBFX1ZHKSB7CisJCURSTV9FUlJPUigiaW52YWxpZCBleGVjX3N0YXRlOiAweCV4XG4iLCBh cmdzLT5leGVjX3N0YXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBDb3B5 IHRoZSBjb21tYW5kIHN1Ym1pc3Npb24gYW5kIGJvIGFycmF5IHRvIGtlcm5lbCBzcGFjZSBpbgor CSAqIG9uZSBnbywgYW5kIGRvIHRoaXMgb3V0c2lkZSBvZiBhbnkgbG9ja3MuCisJICovCisJYm9z ID0gZHJtX21hbGxvY19hYihhcmdzLT5ucl9ib3MsIHNpemVvZigqYm9zKSk7CisJcmVsb2NzID0g ZHJtX21hbGxvY19hYihhcmdzLT5ucl9yZWxvY3MsIHNpemVvZigqcmVsb2NzKSk7CisJc3RyZWFt ID0gZHJtX21hbGxvY19hYigxLCBhcmdzLT5zdHJlYW1fc2l6ZSk7CisJY21kYnVmID0gZXRuYXZp dl9ncHVfY21kYnVmX25ldyhncHUsIEFMSUdOKGFyZ3MtPnN0cmVhbV9zaXplLCA4KSArIDgsCisJ CQkJCWFyZ3MtPm5yX2Jvcyk7CisJaWYgKCFib3MgfHwgIXJlbG9jcyB8fCAhc3RyZWFtIHx8ICFj bWRidWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfc3VibWl0X2NtZHM7CisJfQor CisJY21kYnVmLT5leGVjX3N0YXRlID0gYXJncy0+ZXhlY19zdGF0ZTsKKwljbWRidWYtPmN0eCA9 IGZpbGUtPmRyaXZlcl9wcml2OworCisJcmV0ID0gY29weV9mcm9tX3VzZXIoYm9zLCB0b191c2Vy X3B0cihhcmdzLT5ib3MpLAorCQkJICAgICBhcmdzLT5ucl9ib3MgKiBzaXplb2YoKmJvcykpOwor CWlmIChyZXQpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfc3VibWl0X2NtZHM7CisJ fQorCisJcmV0ID0gY29weV9mcm9tX3VzZXIocmVsb2NzLCB0b191c2VyX3B0cihhcmdzLT5yZWxv Y3MpLAorCQkJICAgICBhcmdzLT5ucl9yZWxvY3MgKiBzaXplb2YoKnJlbG9jcykpOworCWlmIChy ZXQpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfc3VibWl0X2NtZHM7CisJfQorCisJ cmV0ID0gY29weV9mcm9tX3VzZXIoc3RyZWFtLCB0b191c2VyX3B0cihhcmdzLT5zdHJlYW0pLAor CQkJICAgICBhcmdzLT5zdHJlYW1fc2l6ZSk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUZBVUxU OworCQlnb3RvIGVycl9zdWJtaXRfY21kczsKKwl9CisKKwlzdWJtaXQgPSBzdWJtaXRfY3JlYXRl KGRldiwgZ3B1LCBhcmdzLT5ucl9ib3MpOworCWlmICghc3VibWl0KSB7CisJCXJldCA9IC1FTk9N RU07CisJCWdvdG8gZXJyX3N1Ym1pdF9jbWRzOworCX0KKworCXJldCA9IHN1Ym1pdF9sb29rdXBf b2JqZWN0cyhzdWJtaXQsIGZpbGUsIGJvcywgYXJncy0+bnJfYm9zKTsKKwlpZiAocmV0KQorCQln b3RvIGVycl9zdWJtaXRfb2JqZWN0czsKKworCXJldCA9IHN1Ym1pdF9sb2NrX29iamVjdHMoc3Vi bWl0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9zdWJtaXRfb2JqZWN0czsKKworCWlmICghZXRu YXZpdl9jbWRfdmFsaWRhdGVfb25lKGdwdSwgc3RyZWFtLCBhcmdzLT5zdHJlYW1fc2l6ZSAvIDQs CisJCQkJICAgICAgcmVsb2NzLCBhcmdzLT5ucl9yZWxvY3MpKSB7CisJCXJldCA9IC1FSU5WQUw7 CisJCWdvdG8gZXJyX3N1Ym1pdF9vYmplY3RzOworCX0KKworCXJldCA9IHN1Ym1pdF9mZW5jZV9z eW5jKHN1Ym1pdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfc3VibWl0X29iamVjdHM7CisKKwly ZXQgPSBzdWJtaXRfcGluX29iamVjdHMoc3VibWl0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsK KworCXJldCA9IHN1Ym1pdF9yZWxvYyhzdWJtaXQsIHN0cmVhbSwgYXJncy0+c3RyZWFtX3NpemUg LyA0LAorCQkJICAgcmVsb2NzLCBhcmdzLT5ucl9yZWxvY3MpOworCWlmIChyZXQpCisJCWdvdG8g b3V0OworCisJbWVtY3B5KGNtZGJ1Zi0+dmFkZHIsIHN0cmVhbSwgYXJncy0+c3RyZWFtX3NpemUp OworCWNtZGJ1Zi0+dXNlcl9zaXplID0gQUxJR04oYXJncy0+c3RyZWFtX3NpemUsIDgpOworCisJ cmV0ID0gZXRuYXZpdl9ncHVfc3VibWl0KGdwdSwgc3VibWl0LCBjbWRidWYpOworCWlmIChyZXQg PT0gMCkKKwkJY21kYnVmID0gTlVMTDsKKworCWFyZ3MtPmZlbmNlID0gc3VibWl0LT5mZW5jZTsK Kworb3V0OgorCXN1Ym1pdF91bnBpbl9vYmplY3RzKHN1Ym1pdCk7CisKKwkvKgorCSAqIElmIHdl J3JlIHJldHVybmluZyAtRUFHQUlOLCBpdCBtYXkgYmUgZHVlIHRvIHRoZSB1c2VycHRyIGNvZGUK KwkgKiB3YW50aW5nIHRvIHJ1biBpdHMgd29ya3F1ZXVlIG91dHNpZGUgb2YgYW55IGxvY2tzLiBG bHVzaCBvdXIKKwkgKiB3b3JrcXVldWUgdG8gZW5zdXJlIHRoYXQgaXQgaXMgcnVuIGluIGEgdGlt ZWx5IG1hbm5lci4KKwkgKi8KKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCWZsdXNoX3dvcmtxdWV1 ZShwcml2LT53cSk7CisKK2Vycl9zdWJtaXRfb2JqZWN0czoKKwlzdWJtaXRfY2xlYW51cChzdWJt aXQpOworCitlcnJfc3VibWl0X2NtZHM6CisJLyogaWYgd2Ugc3RpbGwgb3duIHRoZSBjbWRidWYg Ki8KKwlpZiAoY21kYnVmKQorCQlldG5hdml2X2dwdV9jbWRidWZfZnJlZShjbWRidWYpOworCWlm IChzdHJlYW0pCisJCWRybV9mcmVlX2xhcmdlKHN0cmVhbSk7CisJaWYgKGJvcykKKwkJZHJtX2Zy ZWVfbGFyZ2UoYm9zKTsKKwlpZiAocmVsb2NzKQorCQlkcm1fZnJlZV9sYXJnZShyZWxvY3MpOwor CisJcmV0dXJuIHJldDsKK30KLS0gCjIuNi4yCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2RyaS1kZXZlbAo=