From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [RFC v3 10/12] drm/client: Add fbdev emulation client Date: Tue, 6 Mar 2018 10:06:06 +0100 Message-ID: <20180306090606.GI22212@phenom.ffwll.local> References: <20180222200653.19453-1-noralf@tronnes.org> <20180222200653.19453-11-noralf@tronnes.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20180222200653.19453-11-noralf@tronnes.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Noralf =?iso-8859-1?Q?Tr=F8nnes?= Cc: daniel.vetter@ffwll.ch, intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, laurent.pinchart@ideasonboard.com List-Id: intel-gfx@lists.freedesktop.org T24gVGh1LCBGZWIgMjIsIDIwMTggYXQgMDk6MDY6NTFQTSArMDEwMCwgTm9yYWxmIFRyw7hubmVz IHdyb3RlOgo+IFRoaXMgYWRkcyBnZW5lcmljIGZiZGV2IGVtdWxhdGlvbiBmb3IgZHJpdmVycyB0 aGF0IHN1cHBvcnQgdGhlCj4gZHVtYiBidWZmZXIgQVBJLiBObyBmYmRldiBjb2RlIGlzIG5lY2Vz c2FyeSBpbiB0aGUgZHJpdmVyLgo+IAo+IERpZmZlcmVuY2VzIGZyb20gZHJtX2ZiX2hlbHBlcjoK PiAtIFRoZSBiYWNraW5nIGJ1ZmZlciBpcyBjcmVhdGVkIHdoZW4gdGhlIGZpcnN0IGZkIGlzIG9w ZW5lZC4KPiAtIFN1cHBvcnRzIGNoYW5naW5nIHRoZSBtb2RlIGZyb20gdXNlcnNwYWNlLgo+IC0g RG9lc24ndCByZXN0b3JlIG9uIGxhc3RjbG9zZSBpZiB0aGVyZSBpcyBubyBmZC9mYmNvbiBvcGVu Lgo+IC0gU3VwcG9ydHMgY2hhbmdpbmcgdGhlIGJ1ZmZlciBzaXplICh5cmVzX3ZpcnR1YWwpIGZy b20gdXNlcnNwYWNlIGJlZm9yZQo+ICAgdGhlIGZkIGlzIG9wZW5lZCAoZG91YmxlL3RyaXBwZWwv Li4uIGJ1ZmZlcmluZykuCj4gLSBQYW5uaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGFzIHBhZ2UgZmxp cHBpbmcsIHNvIG5vIHBhcnRpYWwgb2Zmc2V0Lgo+IC0gU3VwcG9ydHMgcmVhbCBwYWdlIGZsaXBw aW5nIHdpdGggRkJJT19XQUlURk9SVlNZTkMgd2FpdGluZyBvbiB0aGUKPiAgIGFjdHVhbCBmbGlw Lgo+IC0gU3VwcG9ydHMgZnJhbWVidWZmZXIgZmx1c2hpbmcgZm9yIGZiY29uIG9uIGJ1ZmZlcnMg dGhhdCBkb2Vzbid0IHN1cHBvcnQKPiAgIGZiZGV2IGRlZmVycmVkIEkvTyAoc2htZW0pLiBtbWFw IGRvZXNuJ3Qgd29yayBidXQgZmJjb24gZG9lcy4KPiAKPiBUT0RPOgo+IC0gc3VzcGVuZC9yZXN1 bWUKPiAtIHN5c3JxCj4gLSBMb29rIG1vcmUgaW50byBwbGFuZSBmb3JtYXQgc2VsZWN0aW9uL3N1 cHBvcnQuCj4gLSBOZWVkIGEgd2F5IGZvciB0aGUgZHJpdmVyIHRvIHNheSB0aGF0IGl0IHdhbnRz IGdlbmVyaWMgZmJkZXYgZW11bGF0aW9uLgo+ICAgVGhlIGNsaWVudCAubmV3IGhvb2sgaXMgcnVu IGluIGRybV9kZXZfcmVnaXN0ZXIoKSB3aGljaCBpcyBiZWZvcmUKPiAgIGRyaXZlcnMgc2V0IHVw IGZiZGV2IHRoZW1zZWx2ZXMuIFNvIHRoZSBjbGllbnQgY2FuJ3QgbG9vayBhdAo+ICAgZHJtX2Rl dmljZS0+ZmJfaGVscGVyIHRvIGZpbmQgb3V0LgoKRm9yIGZiZGV2IEkgdGhpbmsgdGhlIGJldHRl ciBvcHRpb24gKGdpdmVuIHdoZXJlIHdlIGFyZSByaWdodCBub3cpIGlzIHRvCmludGVncmF0ZSB0 aGUgZ2VuZXJpYyBidWZmZXIgYWxsb2NhdGlvbiBzdXBwb3J0IGludG8gdGhlIGV4aXN0aW5nIGZi ZGV2CmhlbHBlcnMsIGFzIGEgZGVmYXVsdCBmYl9wcm9iZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFs bG9jYXRlcyBhIHN1aXRhYmxlCmJ1ZmZlci4KClRoaXMgaGFzIGEgYnVuY2ggb2YgdXBzaWRlczoK LSBpbnRlZ3JhdGVzIHdpdGggZXhpc3Rpbmcgcy9yIHN1cHBvcnQKLSBpbnRlZ3JhdGVzIHdpdGgg ZXhpc3RpbmcgZHJpdmVyIGxvYWQgc2VxdWVuY2UsIGF2b2lkaW5nIGJ1Z3MgYW5kIHN0dWZmCi0g aW50ZWdyYXRlcyB3aXRoIGV4aXN0aW5nIG1vZHVsZSBvcHRpb25zIGFuZCBzaW1pbGFyIHRvIGRp c2FibGUgZmJkZXYKICAoYWx0aG91Z2ggdGhleSdyZSBhbGwgbm93IGdlbmVyaWMgYW5kIHNob3Vs ZCBiZSB1c2luZyB0aGUgb25lIEtjb25maWcKICBvcHRpb24gd2UgaGF2ZSBmb3IgdGhhdCkuCgpG dXJ0aGVybW9yZSB0aGlzIGdpdmVzIGRyaXZlcnMgbW9yZSBmbGV4aWJpbGl0eSBvZiBzdGlsbCBv dmVyd3JpdGluZyBwYXJ0cwpvZiB0aGUgZmJkZXYgaGVscGVycy4gVGhpcyBpcyB1c2VmdWwgZm9y IGRyaXZlcnMgd2l0aCBhIGRpcnR5ZmIgaG9vazoKQmVjYXVzZSBvZiB0aGUgcmF0aGVyIG5hc3R5 IG5hdHVyZSBvZiB0aGUgZGVmaW8gdHJhY2tpbmcgcmVxdWlyZWQgYnkgZmJkZXYKbW1hcCBzZW1h bnRpY3MgaXQncyBiZXR0ZXIgdG8gZGlzYWJsZSBkaXJ0eWZiIGZvciBmYmRldiBlbXVsYXRpb24g KGlmCnBvc3NpYmxlIGJ5IHRoZSBoYXJkd2FyZSksIGV2ZW4gaWYgdGhhdCBjb3N0cyBzb21lIHBl cmZvcm1hbmNlL2luY3Jhc2VzCnBvd2VyIGNvbnN1bXB0aW9uLiBUaGlzIGlzIGUuZy4gd2hhdCB3 ZSBkbyBmb3IgaTkxNSAtIHdlIHNpbXBseSBkaXNhYmxlCm1hbnVhbCB1cGxvYWQgd2hlbiBzd2l0 Y2hpbmcgdG8gZmJkZXYuCgpPZiBjb3Vyc2UgZm9yIHlvdXIgcGFuZWxzIHlvdSBhbHdheXMgbmVl ZCBtYW51YWwgdXBsb2FkLCBzbyBub3QgYSBjb25jZXJuLgoKUmV1c2luZyB0aGUgZXhpc3Rpbmcg ZmJkZXYgY29kZSBhbHNvIG1lYW5zIGJldHRlciBjb250aW51aXR5IGFuZApiaXNlY3RhYmlsaXR5 LCB3aGljaCBpcyBBbHdheXMgR29vZCAodG0pIGluIGtlcm5lbCBsYW5kIDotKQoKVGhlIG9ubHkg ZG93bnNpZGUgaXMgdGhhdCB0aGVyZSdzIGEgYml0IG1vcmUgbGF5ZXJpbmcgYW5kIGl0IHdpbGwg dGFrZSB1cwphIGJpdCBsb25nZXIgdW50aWwgd2UgcmVhY2ggdGhlIHBlcmZlY3RseSBjbGVhbiB3 b3JsZCBmb3IgbW9zdCBkcml2ZXJzLApidXQgdGhhdCdzIGp1c3QgdGhlIHVzdWFsIHByaWNlIHRv IHBheS4KCkZvciB0aGUgb3RoZXIvbmV3IGNsaWVudHMgKGJvb3RzcGxhc2gpIEkgdGhpbmsgdXNp bmcgeW91ciAtPm5ldyBob29rcwptYWtlcyBwZXJmZWN0IHNlbnNlLgoKPiAtIERvIHdlIG5lZWQg dG8gc3VwcG9ydCBGQl9WSVNVQUxfUFNFVURPQ09MT1I/Cj4gCj4gVFJPVUJMRToKPiAtIGZiY29u IGNhbid0IGhhbmRsZSBmYl9vcGVuIHJldHVybmluZyBhbiBlcnJvciwgaXQganVzdCBoZWFkcyBv bi4gVGhpcwo+ICAgcmVzdWx0cyBpbiBhIE5VTEwgZGVyZWYgaW4gZmJjb25faW5pdCgpLiBmYmNv bi92dCBpcyBhd2Z1bCB3aGVuIGl0Cj4gICBjb21lcyB0byBlcnJvciBoYW5kbGluZy4gSXQgZG9l c24ndCBsb29rIHRvIGJlIGVhc2lseSBmaXhlZCwgc28gSSBndWVzcwo+ICAgYSBidWZmZXIgaGFz IHRvIGJlIHByZS1hbGxvY2F0ZWQgdG8gZW5zdXJlIGhlYWx0aCBhbmQgc2FmZXR5LgoKWXVwLCB3 ZSBuZWVkIHRvIHN0aWNrIHRvIHRoZSBleGFjdCBzYW1lIGxvZ2ljIGFzIHRoZSBjdXJyZW50IGZi ZGV2IGhlbHBlcnMKb2YgYWxsb2NhdGluZyBhdCBpbml0IHRpbWUsIGFuZCB0aGVuIHJldXNpbmcg dGhlIHNhbWUgYnVmZmVyIGZvcgpldmVyeXRoaW5nLiBUaGUgbW1hcCBzdHVmZiBzaG91bGQgYWxs IHN0aWxsIHdvcmsuCi1EYW5pZWwKCj4gCj4gU2lnbmVkLW9mZi1ieTogTm9yYWxmIFRyw7hubmVz IDxub3JhbGZAdHJvbm5lcy5vcmc+Cj4gLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9jbGllbnQvS2Nv bmZpZyAgICAgfCAgMTYgKwo+ICBkcml2ZXJzL2dwdS9kcm0vY2xpZW50L01ha2VmaWxlICAgIHwg ICAyICsKPiAgZHJpdmVycy9ncHUvZHJtL2NsaWVudC9kcm1fZmJkZXYuYyB8IDk5NyArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMTAxNSBp bnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vY2xpZW50 L2RybV9mYmRldi5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9jbGllbnQvS2Nv bmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9jbGllbnQvS2NvbmZpZwo+IGluZGV4IDRiYjhlNDY1NWZm Ny4uNzM5MDJhYjQ0Yzc1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9jbGllbnQvS2Nv bmZpZwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9jbGllbnQvS2NvbmZpZwo+IEBAIC0xLDQgKzEs MjAgQEAKPiAgbWVudSAiRFJNIENsaWVudHMiCj4gIAlkZXBlbmRzIG9uIERSTQo+ICAKPiArY29u ZmlnIERSTV9DTElFTlRfRkJERVYKPiArCXRyaXN0YXRlICJHZW5lcmljIGZiZGV2IGVtdWxhdGlv biIKPiArCWRlcGVuZHMgb24gRFJNCj4gKwlzZWxlY3QgRkIKPiArCXNlbGVjdCBGUkFNRUJVRkZF Ul9DT05TT0xFIGlmICFFWFBFUlQKPiArCXNlbGVjdCBGUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVD VF9QUklNQVJZIGlmIEZSQU1FQlVGRkVSX0NPTlNPTEUKPiArCXNlbGVjdCBGQl9TWVNfRk9QUwo+ ICsJc2VsZWN0IEZCX1NZU19GSUxMUkVDVAo+ICsJc2VsZWN0IEZCX1NZU19DT1BZQVJFQQo+ICsJ c2VsZWN0IEZCX1NZU19JTUFHRUJMSVQKPiArCXNlbGVjdCBGQl9ERUZFUlJFRF9JTwo+ICsJc2Vs ZWN0IEZCX01PREVfSEVMUEVSUwo+ICsJc2VsZWN0IFZJREVPTU9ERV9IRUxQRVJTCj4gKwloZWxw Cj4gKwkgIEdlbmVyaWMgZmJkZXYgZW11bGF0aW9uCj4gKwo+ICBlbmRtZW51Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9jbGllbnQvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vY2xp ZW50L01ha2VmaWxlCj4gaW5kZXggZjY2NTU0Y2Q1YzQ1Li4zZmY2OTQ0MjlkZWMgMTAwNjQ0Cj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2NsaWVudC9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9jbGllbnQvTWFrZWZpbGUKPiBAQCAtMSArMSwzIEBACj4gICMgU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAKPiArCj4gK29iai0kKENPTkZJR19EUk1fQ0xJRU5UX0ZCREVWKSAr PSBkcm1fZmJkZXYubwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vY2xpZW50L2RybV9m YmRldi5jIGIvZHJpdmVycy9ncHUvZHJtL2NsaWVudC9kcm1fZmJkZXYuYwo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi5lMjg0MTZkNzJkZTEKPiAtLS0gL2Rldi9u dWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2NsaWVudC9kcm1fZmJkZXYuYwo+IEBAIC0wLDAg KzEsOTk3IEBACj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gKy8vIENv cHlyaWdodCAyMDE4IE5vcmFsZiBUcsO4bm5lcwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L2NvbnNv bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RtYS1idWYuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2Zi Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVs ZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ICsjaW5jbHVkZSA8bGludXgvd29ya3F1 ZXVlLmg+Cj4gKyNpbmNsdWRlIDx2aWRlby92aWRlb21vZGUuaD4KPiArCj4gKyNpbmNsdWRlIDxk cm0vZHJtX2NsaWVudC5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9kcnYuaD4KPiArI2luY2x1ZGUg PGRybS9kcm1fZm91cmNjLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1lYnVmZmVyLmg+Cj4g KyNpbmNsdWRlIDxkcm0vZHJtX21vZGVzLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+ Cj4gKwo+ICtzdHJ1Y3QgZHJtX2ZiZGV2IHsKPiArCXN0cnVjdCBtdXRleCBsb2NrOwo+ICsKPiAr CXN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50Owo+ICsJc3RydWN0IGRybV9jbGllbnRfZGlz cGxheSAqZGlzcGxheTsKPiArCj4gKwl1bnNpZ25lZCBpbnQgb3Blbl9jb3VudDsKPiArCXN0cnVj dCBkcm1fY2xpZW50X2J1ZmZlciAqYnVmZmVyOwo+ICsJYm9vbCBwYWdlX2ZsaXBfc2VudDsKPiAr CXUzMiBjdXJyX2ZiOwo+ICsKPiArCXN0cnVjdCBmYl9pbmZvICppbmZvOwo+ICsJdTMyIHBzZXVk b19wYWxldHRlWzE3XTsKPiArCj4gKwlib29sIGZsdXNoOwo+ICsJYm9vbCBkZWZpb19ub19mbHVz aGluZzsKPiArCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGRpcnR5X2NsaXA7Cj4gKwlzcGlubG9ja190 IGRpcnR5X2xvY2s7Cj4gKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGlydHlfd29yazsKPiArfTsKPiAr Cj4gK3N0YXRpYyBpbnQgZHJtX2ZiZGV2X21vZGVfdG9fZmJfbW9kZShzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2LAo+ICsJCQkJICAgICBzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gKm1vZGUsCj4gKwkJ CQkgICAgIHN0cnVjdCBmYl92aWRlb21vZGUgKmZiX21vZGUpCj4gK3sKPiArCXN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlIGRpc3BsYXlfbW9kZSA9IHsgfTsKPiArCXN0cnVjdCB2aWRlb21vZGUgdmlk ZW9tb2RlID0geyB9Owo+ICsJaW50IHJldDsKPiArCj4gKwlyZXQgPSBkcm1fbW9kZV9jb252ZXJ0 X3Vtb2RlKGRldiwgJmRpc3BsYXlfbW9kZSwgbW9kZSk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVy biByZXQ7Cj4gKwo+ICsJbWVtc2V0KGZiX21vZGUsIDAsIHNpemVvZigqZmJfbW9kZSkpOwo+ICsJ ZHJtX2Rpc3BsYXlfbW9kZV90b192aWRlb21vZGUoJmRpc3BsYXlfbW9kZSwgJnZpZGVvbW9kZSk7 Cj4gKwlmYl92aWRlb21vZGVfZnJvbV92aWRlb21vZGUoJnZpZGVvbW9kZSwgZmJfbW9kZSk7Cj4g Kwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRybV9mYmRldl9kZXN0cm95 X21vZGVsaXN0KHN0cnVjdCBmYl9pbmZvICppbmZvKQo+ICt7Cj4gKwlzdHJ1Y3QgZmJfbW9kZWxp c3QgKm1vZGVsaXN0LCAqdG1wOwo+ICsKPiArCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2Rl bGlzdCwgdG1wLCAmaW5mby0+bW9kZWxpc3QsIGxpc3QpIHsKPiArCQlrZnJlZShtb2RlbGlzdC0+ bW9kZS5uYW1lKTsKPiArCQlsaXN0X2RlbCgmbW9kZWxpc3QtPmxpc3QpOwo+ICsJCWtmcmVlKG1v ZGVsaXN0KTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHJtX2ZiZGV2X3VzZV9maXJz dF9tb2RlKHN0cnVjdCBmYl9pbmZvICppbmZvKQo+ICt7Cj4gKwlzdHJ1Y3QgZmJfbW9kZWxpc3Qg Km1vZGVsaXN0Owo+ICsKPiArCW1vZGVsaXN0ID0gbGlzdF9maXJzdF9lbnRyeSgmaW5mby0+bW9k ZWxpc3QsIHN0cnVjdCBmYl9tb2RlbGlzdCwgbGlzdCk7Cj4gKwlmYl92aWRlb21vZGVfdG9fdmFy KCZpbmZvLT52YXIsICZtb2RlbGlzdC0+bW9kZSk7Cj4gKwlpbmZvLT5tb2RlID0gJm1vZGVsaXN0 LT5tb2RlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGRybV9tb2RlX21vZGVpbmZvICpkcm1f ZmJkZXZfZ2V0X2RybV9tb2RlKHN0cnVjdCBkcm1fZmJkZXYgKmZiZGV2KQo+ICt7Cj4gKwlzdHJ1 Y3QgZHJtX21vZGVfbW9kZWluZm8gKm1vZGVfcG9zLCAqbW9kZSA9IE5VTEw7Cj4gKwlzdHJ1Y3Qg ZmJfaW5mbyAqaW5mbyA9IGZiZGV2LT5pbmZvOwo+ICsJc3RydWN0IGZiX3ZpZGVvbW9kZSB0bXA7 Cj4gKwo+ICsJbXV0ZXhfbG9jaygmZmJkZXYtPmRpc3BsYXktPm1vZGVzX2xvY2spOwo+ICsJZHJt X2NsaWVudF9kaXNwbGF5X2Zvcl9lYWNoX21vZGUoZmJkZXYtPmRpc3BsYXksIG1vZGVfcG9zKSB7 Cj4gKwkJaWYgKGRybV9mYmRldl9tb2RlX3RvX2ZiX21vZGUoZmJkZXYtPmNsaWVudC0+ZGV2LCBt b2RlX3BvcywgJnRtcCkpCj4gKwkJCWNvbnRpbnVlOwo+ICsJCWlmIChmYl9tb2RlX2lzX2VxdWFs KGluZm8tPm1vZGUsICZ0bXApKSB7Cj4gKwkJCW1vZGUgPSBtb2RlX3BvczsKPiArCQkJYnJlYWs7 Cj4gKwkJfQo+ICsJfQo+ICsJbXV0ZXhfdW5sb2NrKCZmYmRldi0+ZGlzcGxheS0+bW9kZXNfbG9j ayk7Cj4gKwo+ICsJcmV0dXJuIG1vZGU7Cj4gK30KPiArCj4gKy8qIFJldHVybiBudW1iZXIgb2Yg bW9kZXMgb3IgbmVnYXRpdmUgZXJyb3IgKi8KPiArc3RhdGljIGludCBkcm1fZmJkZXZfc3luY19t b2RlcyhzdHJ1Y3QgZHJtX2ZiZGV2ICpmYmRldiwgYm9vbCBmb3JjZSkKPiArewo+ICsJc3RydWN0 IGZiX2luZm8gKmluZm8gPSBmYmRldi0+aW5mbzsKPiArCXN0cnVjdCBkcm1fbW9kZV9tb2RlaW5m byAqbW9kZTsKPiArCXN0cnVjdCBmYl92aWRlb21vZGUgZmJfbW9kZTsKPiArCWJvb2wgY2hhbmdl ZDsKPiArCj4gKwlzdHJ1Y3QgZmJfbW9kZWxpc3QgKmZiZGV2X21vZGVsaXN0Owo+ICsJaW50IG51 bV9tb2RlczsKPiArCj4gKwludW1fbW9kZXMgPSBkcm1fY2xpZW50X2Rpc3BsYXlfdXBkYXRlX21v ZGVzKGZiZGV2LT5kaXNwbGF5LCAmY2hhbmdlZCk7Cj4gKwlpZiAobnVtX21vZGVzIDw9IDApCj4g KwkJcmV0dXJuIG51bV9tb2RlczsKPiArCj4gKwlpZiAoIWluZm8pCj4gKwkJcmV0dXJuIG51bV9t b2RlczsKPiArCj4gKwlpZiAoIWZvcmNlICYmICFjaGFuZ2VkKQo+ICsJCXJldHVybiBudW1fbW9k ZXM7Cj4gKwo+ICsJZHJtX2ZiZGV2X2Rlc3Ryb3lfbW9kZWxpc3QoaW5mbyk7Cj4gKwo+ICsJbXV0 ZXhfbG9jaygmZmJkZXYtPmRpc3BsYXktPm1vZGVzX2xvY2spOwo+ICsJZHJtX2NsaWVudF9kaXNw bGF5X2Zvcl9lYWNoX21vZGUoZmJkZXYtPmRpc3BsYXksIG1vZGUpIHsKPiArCQlpZiAoZHJtX2Zi ZGV2X21vZGVfdG9fZmJfbW9kZShmYmRldi0+Y2xpZW50LT5kZXYsIG1vZGUsICZmYl9tb2RlKSkg ewo+ICsJCQludW1fbW9kZXMtLTsKPiArCQkJY29udGludWU7Cj4gKwkJfQo+ICsKPiArCQlmYmRl dl9tb2RlbGlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpmYmRldl9tb2RlbGlzdCksIEdGUF9LRVJORUwp Owo+ICsJCWlmICghZmJkZXZfbW9kZWxpc3QpIHsKPiArCQkJZHJtX2ZiZGV2X2Rlc3Ryb3lfbW9k ZWxpc3QoaW5mbyk7Cj4gKwkJCW11dGV4X3VubG9jaygmZmJkZXYtPmRpc3BsYXktPm1vZGVzX2xv Y2spOwo+ICsJCQlyZXR1cm4gLUVOT01FTTsKPiArCQl9Cj4gKwo+ICsJCWZiZGV2X21vZGVsaXN0 LT5tb2RlID0gZmJfbW9kZTsKPiArCQlmYmRldl9tb2RlbGlzdC0+bW9kZS5uYW1lID0ga3N0cm5k dXAobW9kZS0+bmFtZSwKPiArCQkJCQkJICAgICBEUk1fRElTUExBWV9NT0RFX0xFTiwKPiArCQkJ CQkJICAgICBHRlBfS0VSTkVMKTsKPiArCj4gKwkJaWYgKG1vZGUtPnR5cGUgJiBEUk1fTU9ERV9U WVBFX1BSRUZFUlJFRCkKPiArCQkJZmJkZXZfbW9kZWxpc3QtPm1vZGUuZmxhZyB8PSBGQl9NT0RF X0lTX0ZJUlNUOwo+ICsKPiArCQlsaXN0X2FkZF90YWlsKCZmYmRldl9tb2RlbGlzdC0+bGlzdCwg JmluZm8tPm1vZGVsaXN0KTsKPiArCX0KPiArCW11dGV4X3VubG9jaygmZmJkZXYtPmRpc3BsYXkt Pm1vZGVzX2xvY2spOwo+ICsKPiArCWlmICghZmJkZXYtPm9wZW5fY291bnQpCj4gKwkJZHJtX2Zi ZGV2X3VzZV9maXJzdF9tb2RlKGluZm8pOwo+ICsKPiArCXJldHVybiBudW1fbW9kZXM7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIGRybV9mYmRldl9mb3JtYXRfZmlsbF92YXIodTMyIGZvcm1hdCwg c3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCj4gK3sKPiArCXN3aXRjaCAoZm9ybWF0KSB7 Cj4gKwljYXNlIERSTV9GT1JNQVRfWFJHQjE1NTU6Cj4gKwkJdmFyLT5yZWQub2Zmc2V0ID0gMTA7 Cj4gKwkJdmFyLT5yZWQubGVuZ3RoID0gNTsKPiArCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7Cj4g KwkJdmFyLT5ncmVlbi5sZW5ndGggPSA1Owo+ICsJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwo+ICsJ CXZhci0+Ymx1ZS5sZW5ndGggPSA1Owo+ICsJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7Cj4gKwkJ dmFyLT50cmFuc3AubGVuZ3RoID0gMDsKPiArCQlicmVhazsKPiArCWNhc2UgRFJNX0ZPUk1BVF9B UkdCMTU1NToKPiArCQl2YXItPnJlZC5vZmZzZXQgPSAxMDsKPiArCQl2YXItPnJlZC5sZW5ndGgg PSA1Owo+ICsJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKPiArCQl2YXItPmdyZWVuLmxlbmd0aCA9 IDU7Cj4gKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7Cj4gKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7 Cj4gKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMTU7Cj4gKwkJdmFyLT50cmFuc3AubGVuZ3RoID0g MTsKPiArCQlicmVhazsKPiArCWNhc2UgRFJNX0ZPUk1BVF9SR0I1NjU6Cj4gKwkJdmFyLT5yZWQu b2Zmc2V0ID0gMTE7Cj4gKwkJdmFyLT5yZWQubGVuZ3RoID0gNTsKPiArCQl2YXItPmdyZWVuLm9m ZnNldCA9IDU7Cj4gKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA2Owo+ICsJCXZhci0+Ymx1ZS5vZmZz ZXQgPSAwOwo+ICsJCXZhci0+Ymx1ZS5sZW5ndGggPSA1Owo+ICsJCXZhci0+dHJhbnNwLm9mZnNl dCA9IDA7Cj4gKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKPiArCQlicmVhazsKPiArCWNhc2Ug RFJNX0ZPUk1BVF9SR0I4ODg6Cj4gKwljYXNlIERSTV9GT1JNQVRfWFJHQjg4ODg6Cj4gKwkJdmFy LT5yZWQub2Zmc2V0ID0gMTY7Cj4gKwkJdmFyLT5yZWQubGVuZ3RoID0gODsKPiArCQl2YXItPmdy ZWVuLm9mZnNldCA9IDg7Cj4gKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA4Owo+ICsJCXZhci0+Ymx1 ZS5vZmZzZXQgPSAwOwo+ICsJCXZhci0+Ymx1ZS5sZW5ndGggPSA4Owo+ICsJCXZhci0+dHJhbnNw Lm9mZnNldCA9IDA7Cj4gKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKPiArCQlicmVhazsKPiAr CWNhc2UgRFJNX0ZPUk1BVF9BUkdCODg4ODoKPiArCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKPiAr CQl2YXItPnJlZC5sZW5ndGggPSA4Owo+ICsJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKPiArCQl2 YXItPmdyZWVuLmxlbmd0aCA9IDg7Cj4gKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7Cj4gKwkJdmFy LT5ibHVlLmxlbmd0aCA9IDg7Cj4gKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7Cj4gKwkJdmFy LT50cmFuc3AubGVuZ3RoID0gODsKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJV0FSTl9P Tl9PTkNFKDEpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwl2YXItPmNvbG9yc3BhY2UgPSAw Owo+ICsJdmFyLT5ncmF5c2NhbGUgPSAwOwo+ICsJdmFyLT5ub25zdGQgPSAwOwo+ICt9Cj4gKwo+ ICtpbnQgZHJtX2ZiZGV2X3Zhcl90b19mb3JtYXQoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2 YXIsIHUzMiAqZm9ybWF0KQo+ICt7Cj4gKwlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsK PiArCWNhc2UgMTU6Cj4gKwkJKmZvcm1hdCA9IERSTV9GT1JNQVRfQVJHQjE1NTU7Cj4gKwkJYnJl YWs7Cj4gKwljYXNlIDE2Ogo+ICsJCWlmICh2YXItPmdyZWVuLmxlbmd0aCAhPSA1KQo+ICsJCQkq Zm9ybWF0ID0gRFJNX0ZPUk1BVF9SR0I1NjU7Cj4gKwkJZWxzZSBpZiAodmFyLT50cmFuc3AubGVu Z3RoID4gMCkKPiArCQkJKmZvcm1hdCA9IERSTV9GT1JNQVRfQVJHQjE1NTU7Cj4gKwkJZWxzZQo+ ICsJCQkqZm9ybWF0ID0gRFJNX0ZPUk1BVF9YUkdCMTU1NTsKPiArCQlicmVhazsKPiArCWNhc2Ug MjQ6Cj4gKwkJKmZvcm1hdCA9IERSTV9GT1JNQVRfUkdCODg4Owo+ICsJCWJyZWFrOwo+ICsJY2Fz ZSAzMjoKPiArCQlpZiAodmFyLT50cmFuc3AubGVuZ3RoID4gMCkKPiArCQkJKmZvcm1hdCA9IERS TV9GT1JNQVRfQVJHQjg4ODg7Cj4gKwkJZWxzZQo+ICsJCQkqZm9ybWF0ID0gRFJNX0ZPUk1BVF9Y UkdCODg4ODsKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRybV9mYmRldl9k aXJ0eV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiArewo+ICsJc3RydWN0IGRybV9m YmRldiAqZmJkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRybV9mYmRldiwKPiArCQkJ CQkgICAgICAgZGlydHlfd29yayk7Cj4gKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcCA9ICZm YmRldi0+ZGlydHlfY2xpcDsKPiArCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGNsaXBfY29weTsKPiAr CXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmZiZGV2LT5k aXJ0eV9sb2NrLCBmbGFncyk7Cj4gKwljbGlwX2NvcHkgPSAqY2xpcDsKPiArCWNsaXAtPngxID0g Y2xpcC0+eTEgPSB+MDsKPiArCWNsaXAtPngyID0gY2xpcC0+eTIgPSAwOwo+ICsJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmZmJkZXYtPmRpcnR5X2xvY2ssIGZsYWdzKTsKPiArCj4gKwkvKiBjYWxs IGRpcnR5IGNhbGxiYWNrIG9ubHkgd2hlbiBpdCBoYXMgYmVlbiByZWFsbHkgdG91Y2hlZCAqLwo+ ICsJaWYgKGNsaXBfY29weS54MSA8IGNsaXBfY29weS54MiAmJiBjbGlwX2NvcHkueTEgPCBjbGlw X2NvcHkueTIpCj4gKwkJZHJtX2NsaWVudF9kaXNwbGF5X2ZsdXNoKGZiZGV2LT5kaXNwbGF5LCBm YmRldi0+Y3Vycl9mYiwKPiArCQkJCQkgJmNsaXBfY29weSwgMSk7Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGRybV9mYmRldl9kaXJ0eShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdTMyIHgsIHUzMiB5 LAo+ICsJCQkgICAgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2Zi ZGV2ICpmYmRldiA9IGluZm8tPnBhcjsKPiArCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwID0g JmZiZGV2LT5kaXJ0eV9jbGlwOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCj4gKwlpZiAo IWZiZGV2LT5mbHVzaCkKPiArCQlyZXR1cm47Cj4gKwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmZi ZGV2LT5kaXJ0eV9sb2NrLCBmbGFncyk7Cj4gKwljbGlwLT54MSA9IG1pbl90KHUzMiwgY2xpcC0+ eDEsIHgpOwo+ICsJY2xpcC0+eTEgPSBtaW5fdCh1MzIsIGNsaXAtPnkxLCB5KTsKPiArCWNsaXAt PngyID0gbWF4X3QodTMyLCBjbGlwLT54MiwgeCArIHdpZHRoKTsKPiArCWNsaXAtPnkyID0gbWF4 X3QodTMyLCBjbGlwLT55MiwgeSArIGhlaWdodCk7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZmYmRldi0+ZGlydHlfbG9jaywgZmxhZ3MpOwo+ICsKPiArCXNjaGVkdWxlX3dvcmsoJmZiZGV2 LT5kaXJ0eV93b3JrKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHJtX2ZiZGV2X2RlZmVycmVk X2lvKHN0cnVjdCBmYl9pbmZvICppbmZvLAo+ICsJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdl bGlzdCkKPiArewo+ICsJc3RydWN0IGRybV9mYmRldiAqZmJkZXYgPSBpbmZvLT5wYXI7Cj4gKwl1 bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQsIG1pbiwgbWF4Owo+ICsJc3RydWN0IHBhZ2UgKnBhZ2U7 Cj4gKwl1MzIgeTEsIHkyOwo+ICsKPiArCS8qIElzIHVzZXJzcGFjZSBkb2luZyBleHBsaWNpdCBw YWdlZmxpcCBmbHVzaGluZz8gKi8KPiArCWlmIChmYmRldi0+ZGVmaW9fbm9fZmx1c2hpbmcpCj4g KwkJcmV0dXJuOwo+ICsKPiArCW1pbiA9IFVMT05HX01BWDsKPiArCW1heCA9IDA7Cj4gKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsIHBhZ2VsaXN0LCBscnUpIHsKPiArCQlzdGFydCA9IHBhZ2Ut PmluZGV4IDw8IFBBR0VfU0hJRlQ7Cj4gKwkJZW5kID0gc3RhcnQgKyBQQUdFX1NJWkU7Cj4gKwkJ bWluID0gbWluKG1pbiwgc3RhcnQpOwo+ICsJCW1heCA9IG1heChtYXgsIGVuZCk7Cj4gKwl9Cj4g Kwo+ICsJaWYgKG1pbiA8IG1heCkgewo+ICsJCXkxID0gbWluIC8gaW5mby0+Zml4LmxpbmVfbGVu Z3RoOwo+ICsJCXkyID0gRElWX1JPVU5EX1VQKG1heCwgaW5mby0+Zml4LmxpbmVfbGVuZ3RoKTsK PiArCQl5MiA9IG1pbih5MiwgaW5mby0+dmFyLnlyZXMpOwo+ICsJCWRybV9mYmRldl9kaXJ0eShp bmZvLCAwLCB5MSwgaW5mby0+dmFyLnhyZXMsIHkyIC0geTEpOwo+ICsJfQo+ICt9Cj4gKwo+ICtz dGF0aWMgc3RydWN0IGZiX2RlZmVycmVkX2lvIGRybV9mYmRldl9mYmRlZmlvID0gewo+ICsJLmRl bGF5CQk9IEhaIC8gMjAsCj4gKwkuZGVmZXJyZWRfaW8JPSBkcm1fZmJkZXZfZGVmZXJyZWRfaW8s Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50Cj4gK2RybV9mYmRldl9mYl9tbWFwX25vdHN1cHAoc3Ry dWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQo+ICt7Cj4gKwly ZXR1cm4gLUVOT1RTVVBQOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcm1fZmJkZXZfZGVsZXRl X2J1ZmZlcihzdHJ1Y3QgZHJtX2ZiZGV2ICpmYmRldikKPiArewo+ICsJc3RydWN0IGZiX2luZm8g KmluZm8gPSBmYmRldi0+aW5mbzsKPiArCj4gKwlpZiAoaW5mby0+ZmJkZWZpbykgewo+ICsJCS8q IFN0b3Agd29ya2VyIGFuZCBjbGVhciBwYWdlLT5tYXBwaW5nICovCj4gKwkJZmJfZGVmZXJyZWRf aW9fY2xlYW51cChpbmZvKTsKPiArCQlpbmZvLT5mYmRlZmlvID0gTlVMTDsKPiArCX0KPiArCWlm IChmYmRldi0+Zmx1c2gpIHsKPiArCQlmYmRldi0+Zmx1c2ggPSBmYWxzZTsKPiArCQljYW5jZWxf d29ya19zeW5jKCZmYmRldi0+ZGlydHlfd29yayk7Cj4gKwl9Cj4gKwo+ICsJZHJtX2NsaWVudF9i dWZmZXJfcm1mYihmYmRldi0+YnVmZmVyKTsKPiArCWRybV9jbGllbnRfYnVmZmVyX2RlbGV0ZShm YmRldi0+YnVmZmVyKTsKPiArCj4gKwlmYmRldi0+YnVmZmVyID0gTlVMTDsKPiArCWZiZGV2LT5j dXJyX2ZiID0gMDsKPiArCWZiZGV2LT5wYWdlX2ZsaXBfc2VudCA9IGZhbHNlOwo+ICsJaW5mby0+ c2NyZWVuX2J1ZmZlciA9IE5VTEw7Cj4gKwlpbmZvLT5zY3JlZW5fc2l6ZSA9IDA7Cj4gKwlpbmZv LT5maXguc21lbV9sZW4gPSAwOwo+ICsJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gMDsKPiArfQo+ ICsKPiArLyogVGVtcG9yYXJ5IGhhY2sgdG8gbWFrZSB0aW55ZHJtIHdvcmsgYmVmb3JlIGNvbnZl cnRpbmcgdG8gdm1hbGxvYyBidWZmZXJzICovCj4gK3N0YXRpYyBpbnQgZHJtX2ZiZGV2X2NtYV9k ZWZlcnJlZF9pb19tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAo+ICsJCQkJCSAgc3RydWN0IHZt X2FyZWFfc3RydWN0ICp2bWEpCj4gK3sKPiArCWZiX2RlZmVycmVkX2lvX21tYXAoaW5mbywgdm1h KTsKPiArCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3Bh Z2VfcHJvdCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHJtX2Zi ZGV2X2NyZWF0ZV9idWZmZXIoc3RydWN0IGRybV9mYmRldiAqZmJkZXYpCj4gK3sKPiArCXN0cnVj dCBkcm1fY2xpZW50X2RldiAqY2xpZW50ID0gZmJkZXYtPmNsaWVudDsKPiArCXN0cnVjdCBmYl9p bmZvICppbmZvID0gZmJkZXYtPmluZm87Cj4gKwlzdHJ1Y3QgZHJtX2NsaWVudF9idWZmZXIgKmJ1 ZmZlcjsKPiArCXN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbyAqbW9kZTsKPiArCXUzMiBmb3JtYXQ7 Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IGRybV9mYmRldl92YXJfdG9fZm9ybWF0KCZpbmZv LT52YXIsICZmb3JtYXQpOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWJ1 ZmZlciA9IGRybV9jbGllbnRfYnVmZmVyX2NyZWF0ZShjbGllbnQsIGluZm8tPnZhci54cmVzX3Zp cnR1YWwsCj4gKwkJCQkJICBpbmZvLT52YXIueXJlc192aXJ0dWFsLCBmb3JtYXQpOwo+ICsJaWYg KElTX0VSUihidWZmZXIpKQo+ICsJCXJldHVybiBQVFJfRVJSKGJ1ZmZlcik7Cj4gKwo+ICsJbW9k ZSA9IGRybV9mYmRldl9nZXRfZHJtX21vZGUoZmJkZXYpOwo+ICsJaWYgKCFtb2RlKQo+ICsJCXJl dHVybiAtRUlOVkFMOwo+ICsKPiArCXJldCA9IGRybV9jbGllbnRfYnVmZmVyX2FkZGZiKGJ1ZmZl ciwgbW9kZSk7Cj4gKwlpZiAocmV0KQo+ICsJCWdvdG8gZXJyX2ZyZWVfYnVmZmVyOwo+ICsKPiAr CWZiZGV2LT5jdXJyX2ZiID0gYnVmZmVyLT5mYl9pZHNbMF07Cj4gKwo+ICsJaWYgKGRybV9tb2Rl X2Nhbl9kaXJ0eWZiKGNsaWVudC0+ZGV2LCBmYmRldi0+Y3Vycl9mYiwgY2xpZW50LT5maWxlKSkg ewo+ICsJCWZiZGV2LT5mbHVzaCA9IHRydWU7Cj4gKy8qCQlpZiAoaXNfdm1hbGxvY19hZGRyKGJ1 ZmZlci0+dmFkZHIpKSB7ICovCj4gKy8qIFRlbXBvcmFyeSBoYWNrIGZvciB0ZXN0aW5nIG9uIHRp bnlkcm0gYmVmb3JlIGl0IGhhcyBtb3ZlZCB0byB2bWFsbG9jICovCj4gKwkJaWYgKDEpIHsKPiAr CQkJZmJkZXYtPmRpcnR5X2NsaXAueDEgPSBmYmRldi0+ZGlydHlfY2xpcC55MSA9IH4wOwo+ICsJ CQlmYmRldi0+ZGlydHlfY2xpcC54MiA9IGZiZGV2LT5kaXJ0eV9jbGlwLnkyID0gMDsKPiArCQkJ aW5mby0+ZmJkZWZpbyA9ICZkcm1fZmJkZXZfZmJkZWZpbzsKPiArCj4gKwkJCS8qIHRpbnlkcm0g aGFjayAqLwo+ICsJCQlpbmZvLT5maXguc21lbV9zdGFydCA9IHBhZ2VfdG9fcGh5cyh2aXJ0X3Rv X3BhZ2UoYnVmZmVyLT52YWRkcikpOwo+ICsKPiArCQkJZmJfZGVmZXJyZWRfaW9faW5pdChpbmZv KTsKPiArCQkJLyogdGlueWRybSBoYWNrICovCj4gKwkJCWluZm8tPmZib3BzLT5mYl9tbWFwID0g ZHJtX2ZiZGV2X2NtYV9kZWZlcnJlZF9pb19tbWFwOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWluZm8t PmZib3BzLT5mYl9tbWFwID0gZHJtX2ZiZGV2X2ZiX21tYXBfbm90c3VwcDsKPiArCQl9Cj4gKwl9 Cj4gKwo+ICsJZmJkZXYtPmJ1ZmZlciA9IGJ1ZmZlcjsKPiArCWluZm8tPnNjcmVlbl9idWZmZXIg PSBidWZmZXItPnZhZGRyOwo+ICsJaW5mby0+c2NyZWVuX3NpemUgPSBidWZmZXItPnNpemU7Cj4g KwlpbmZvLT5maXguc21lbV9sZW4gPSBidWZmZXItPnNpemU7Cj4gKwlpbmZvLT5maXgubGluZV9s ZW5ndGggPSBidWZmZXItPnBpdGNoOwo+ICsKPiArCXJldHVybiAwOwo+ICsKPiArZXJyX2ZyZWVf YnVmZmVyOgo+ICsJZHJtX2NsaWVudF9idWZmZXJfZGVsZXRlKGJ1ZmZlcik7Cj4gKwo+ICsJcmV0 dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcm1fZmJkZXZfZmJfb3BlbihzdHJ1Y3Qg ZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCj4gK3sKPiArCXN0cnVjdCBkcm1fZmJkZXYgKmZiZGV2 ID0gaW5mby0+cGFyOwo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19LTVMo ZmJkZXYtPmNsaWVudC0+ZGV2LT5kZXYsICJcbiIpOwo+ICsKPiArCW11dGV4X2xvY2soJmZiZGV2 LT5sb2NrKTsKPiArCj4gKwlpZiAoIWZiZGV2LT5kaXNwbGF5KSB7Cj4gKwkJcmV0ID0gLUVOT0RF VjsKPiArCQlnb3RvIG91dF91bmxvY2s7Cj4gKwl9Cj4gKwo+ICsJaWYgKCFmYmRldi0+b3Blbl9j b3VudCkgewo+ICsJCS8qIFBpcGVsaW5lIGlzIGRpc2FibGVkLCBtYWtlIHN1cmUgaXQncyBmb3Jj ZWQgb24gKi8KPiArCQlpbmZvLT52YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1cgfCBGQl9B Q1RJVkFURV9GT1JDRTsKPiArCQlyZXQgPSBkcm1fZmJkZXZfY3JlYXRlX2J1ZmZlcihmYmRldik7 Cj4gKwkJaWYgKHJldCkKPiArCQkJZ290byBvdXRfdW5sb2NrOwo+ICsJfQo+ICsKPiArCWZiZGV2 LT5vcGVuX2NvdW50Kys7Cj4gKwo+ICtvdXRfdW5sb2NrOgo+ICsJbXV0ZXhfdW5sb2NrKCZmYmRl di0+bG9jayk7Cj4gKwo+ICsJaWYgKHJldCkKPiArCQlEUk1fREVWX0VSUk9SKGZiZGV2LT5jbGll bnQtPmRldi0+ZGV2LCAiZmJfb3BlbiBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKPiArCj4gKwlyZXR1 cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRybV9mYmRldl9mYl9yZWxlYXNlKHN0cnVj dCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKPiArewo+ICsJc3RydWN0IGRybV9mYmRldiAqZmJk ZXYgPSBpbmZvLT5wYXI7Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19LTVMoZmJkZXYtPmNsaWVudC0+ ZGV2LT5kZXYsICJcbiIpOwo+ICsJbXV0ZXhfbG9jaygmZmJkZXYtPmxvY2spOwo+ICsKPiArCWlm ICgtLWZiZGV2LT5vcGVuX2NvdW50ID09IDApIHsKPiArCQlkcm1fY2xpZW50X2Rpc3BsYXlfZHBt cyhmYmRldi0+ZGlzcGxheSwgRFJNX01PREVfRFBNU19PRkYpOwo+ICsJCWRybV9mYmRldl9kZWxl dGVfYnVmZmVyKGZiZGV2KTsKPiArCX0KPiArCj4gKwlmYmRldi0+ZGVmaW9fbm9fZmx1c2hpbmcg PSBmYWxzZTsKPiArCj4gKwltdXRleF91bmxvY2soJmZiZGV2LT5sb2NrKTsKPiArCj4gKwlyZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgZHJtX2ZiZGV2X2ZiX3dyaXRlKHN0cnVj dCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAo+ICsJCQkJICBzaXplX3Qg Y291bnQsIGxvZmZfdCAqcHBvcykKPiArewo+ICsJc3NpemVfdCByZXQ7Cj4gKwo+ICsJcmV0ID0g ZmJfc3lzX3dyaXRlKGluZm8sIGJ1ZiwgY291bnQsIHBwb3MpOwo+ICsJaWYgKHJldCA+IDApCj4g KwkJZHJtX2ZiZGV2X2RpcnR5KGluZm8sIDAsIDAsIGluZm8tPnZhci54cmVzLCBpbmZvLT52YXIu eXJlcyk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQKPiArZHJt X2ZiZGV2X2ZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJf ZmlsbHJlY3QgKnJlY3QpCj4gK3sKPiArCXN5c19maWxscmVjdChpbmZvLCByZWN0KTsKPiArCWRy bV9mYmRldl9kaXJ0eShpbmZvLCByZWN0LT5keCwgcmVjdC0+ZHksIHJlY3QtPndpZHRoLCByZWN0 LT5oZWlnaHQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZAo+ICtkcm1fZmJkZXZfZmJfY29weWFy ZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkK PiArewo+ICsJc3lzX2NvcHlhcmVhKGluZm8sIGFyZWEpOwo+ICsJZHJtX2ZiZGV2X2RpcnR5KGlu Zm8sIGFyZWEtPmR4LCBhcmVhLT5keSwgYXJlYS0+d2lkdGgsIGFyZWEtPmhlaWdodCk7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkCj4gK2RybV9mYmRldl9mYl9pbWFnZWJsaXQoc3RydWN0IGZiX2lu Zm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCj4gK3sKPiArCXN5c19pbWFn ZWJsaXQoaW5mbywgaW1hZ2UpOwo+ICsJZHJtX2ZiZGV2X2RpcnR5KGluZm8sIGltYWdlLT5keCwg aW1hZ2UtPmR5LCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50Cj4gK2RybV9mYmRldl9mYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZv ICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQo+ICt7Cj4gKwl1MzIgbmV3X2Zvcm1hdCwgb2xk X2Zvcm1hdCwgeXJlc192aXJ0dWFsOwo+ICsJc3RydWN0IGRybV9mYmRldiAqZmJkZXYgPSBpbmZv LT5wYXI7Cj4gKwljb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICpmYl9tb2RlOwo+ICsJYm9vbCBp c19vcGVuOwo+ICsJaW50IHJldDsKPiArCj4gKwltdXRleF9sb2NrKCZmYmRldi0+bG9jayk7Cj4g Kwlpc19vcGVuID0gZmJkZXYtPm9wZW5fY291bnQ7Cj4gKwltdXRleF91bmxvY2soJmZiZGV2LT5s b2NrKTsKPiArCj4gKwlpZiAoIWlzX29wZW4gJiYgaW5fZGJnX21hc3RlcigpKQo+ICsJCXJldHVy biAtRUlOVkFMOwo+ICsKPiArCS8qIENhbiBiZSBjYWxsZWQgZnJvbSBzeXNmcyAqLwo+ICsJaWYg KGlzX29wZW4gJiYgKHZhci0+eHJlc192aXJ0dWFsID4gZmJkZXYtPmJ1ZmZlci0+d2lkdGggfHwK PiArCSAgICB2YXItPnlyZXNfdmlydHVhbCA+IGZiZGV2LT5idWZmZXItPmhlaWdodCkpIHsKPiAr CQlEUk1fREVCVUdfS01TKCJDYW5ub3QgaW5jcmVhc2UgdmlydHVhbCByZXNvbHV0aW9uIHdoaWxl IG9wZW5cbiIpOwo+ICsJCXJldHVybiAtRUJVU1k7Cj4gKwl9Cj4gKwo+ICsJaWYgKHZhci0+eHJl cyA+IHZhci0+eHJlc192aXJ0dWFsIHx8IHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKSB7 Cj4gKwkJRFJNX0RFQlVHX0tNUygiUmVxdWVzdGVkIHdpZHRoL2hlaWdodCB0byBiaWc6ICVkeCVk ID4gdmlydHVhbCAlZHglZFxuIiwKPiArCQkJICAgICAgdmFyLT54cmVzLCB2YXItPnlyZXMsIHZh ci0+eHJlc192aXJ0dWFsLAo+ICsJCQkgICAgICB2YXItPnlyZXNfdmlydHVhbCk7Cj4gKwkJcmV0 dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZHJtX2ZiZGV2X3Zhcl90b19mb3JtYXQo dmFyLCAmbmV3X2Zvcm1hdCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJRFJNX0RFQlVHX0tNUygiVW5z dXBwb3J0ZWQgZm9ybWF0XG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwly ZXQgPSBkcm1fZmJkZXZfdmFyX3RvX2Zvcm1hdCgmaW5mby0+dmFyLCAmb2xkX2Zvcm1hdCk7Cj4g KwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaWYgKG5ld19mb3JtYXQgIT0gb2xk X2Zvcm1hdCAmJiBpc19vcGVuKSB7Cj4gKwkJRFJNX0RFQlVHX0tNUygiQ2Fubm90IGNoYW5nZSBm b3JtYXQgd2hpbGUgb3BlblxuIik7Cj4gKwkJcmV0dXJuIC1FQlVTWTsKPiArCX0KPiArCj4gKwlk cm1fZmJkZXZfZm9ybWF0X2ZpbGxfdmFyKG5ld19mb3JtYXQsIHZhcik7Cj4gKwo+ICsJZmJfbW9k ZSA9IGZiX2ZpbmRfYmVzdF9tb2RlKHZhciwgJmluZm8tPm1vZGVsaXN0KTsKPiArCWlmICghZmJf bW9kZSkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwl5cmVzX3ZpcnR1YWwgPSB2YXItPnly ZXNfdmlydHVhbDsKPiArCWZiX3ZpZGVvbW9kZV90b192YXIodmFyLCBmYl9tb2RlKTsKPiArCXZh ci0+eXJlc192aXJ0dWFsID0geXJlc192aXJ0dWFsOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IGRybV9mYmRldl9mYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZv KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2ZiZGV2ICpmYmRldiA9IGluZm8tPnBhcjsKPiArCWNvbnN0 IHN0cnVjdCBmYl92aWRlb21vZGUgKmZiX21vZGU7Cj4gKwlzdHJ1Y3QgZHJtX21vZGVfbW9kZWlu Zm8gKm1vZGU7Cj4gKwlib29sIG1vZGVfY2hhbmdlZDsKPiArCWludCByZXQ7Cj4gKwo+ICsJbXV0 ZXhfbG9jaygmZmJkZXYtPmxvY2spOwo+ICsKPiArCWlmICghZmJkZXYtPm9wZW5fY291bnQpIHsK PiArCQlyZXQgPSAwOwo+ICsJCWdvdG8gb3V0X3VubG9jazsKPiArCX0KPiArCj4gKwlmYl9tb2Rl ID0gZmJfbWF0Y2hfbW9kZSgmaW5mby0+dmFyLCAmaW5mby0+bW9kZWxpc3QpOwo+ICsJaWYgKCFm Yl9tb2RlKSB7Cj4gKwkJRFJNX0RFQlVHX0tNUygiQ291bGRuJ3QgZmluZCB2YXIgbW9kZVxuIik7 Cj4gKwkJcmV0ID0gLUVJTlZBTDsKPiArCQlnb3RvIG91dF91bmxvY2s7Cj4gKwl9Cj4gKwo+ICsJ bW9kZV9jaGFuZ2VkID0gIWZiX21vZGVfaXNfZXF1YWwoaW5mby0+bW9kZSwgZmJfbW9kZSk7Cj4g KwlpbmZvLT5tb2RlID0gKHN0cnVjdCBmYl92aWRlb21vZGUgKilmYl9tb2RlOwo+ICsKPiArCW1v ZGUgPSBkcm1fZmJkZXZfZ2V0X2RybV9tb2RlKGZiZGV2KTsKPiArCWlmICghbW9kZSkgewo+ICsJ CURSTV9ERUJVR19LTVMoIkNvdWxkbid0IGZpbmQgdGhlIG1hdGNoaW5nIERSTSBtb2RlXG4iKTsK PiArCQlyZXQgPSAtRUlOVkFMOwo+ICsJCWdvdG8gb3V0X3VubG9jazsKPiArCX0KPiArCj4gKwlp ZiAobW9kZV9jaGFuZ2VkKSB7Cj4gKwkJZHJtX2NsaWVudF9idWZmZXJfcm1mYihmYmRldi0+YnVm ZmVyKTsKPiArCQlmYmRldi0+Y3Vycl9mYiA9IDA7Cj4gKwkJcmV0ID0gZHJtX2NsaWVudF9idWZm ZXJfYWRkZmIoZmJkZXYtPmJ1ZmZlciwgbW9kZSk7Cj4gKwkJaWYgKHJldCkKPiArCQkJZ290byBv dXRfdW5sb2NrOwo+ICsKPiArCQlmYmRldi0+Y3Vycl9mYiA9IGZiZGV2LT5idWZmZXItPmZiX2lk c1swXTsKPiArCQlpbmZvLT52YXIueW9mZnNldCA9IDA7Cj4gKwl9Cj4gKwo+ICsvLwlpbmZvLT52 YXIud2lkdGggPSBkcm1fbW9kZS0+d2lkdGhfbW07Cj4gKy8vCWluZm8tPnZhci5oZWlnaHQgPSBk cm1fbW9kZS0+aGVpZ2h0X21tOwo+ICsKPiArCS8qIFBhbm5pbmcgaXMgb25seSBzdXBwb3J0ZWQg dG8gZG8gcGFnZSBmbGlwcGluZyAqLwo+ICsJaW5mby0+Zml4LnlwYW5zdGVwID0gaW5mby0+dmFy LnlyZXM7Cj4gKwo+ICsJcmV0ID0gZHJtX2NsaWVudF9kaXNwbGF5X2NvbW1pdF9tb2RlKGZiZGV2 LT5kaXNwbGF5LCBmYmRldi0+Y3Vycl9mYiwgbW9kZSk7Cj4gKwo+ICtvdXRfdW5sb2NrOgo+ICsJ bXV0ZXhfdW5sb2NrKCZmYmRldi0+bG9jayk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsK PiArLyoKPiArICogRG8gd2UgbmVlZCB0byBzdXBwb3J0IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUj8K PiArCj4gK3N0YXRpYyBpbnQgZHJtX2ZiZGV2X2ZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywg dW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKPiArCQkgICAgdW5zaWduZWQgYmx1ZSwgdW5z aWduZWQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPiArewo+ICsKPiArfQo+ICsqLwo+ ICsKPiArc3RhdGljIGludCBzZXRjbWFwX3BzZXVkb19wYWxldHRlKHN0cnVjdCBmYl9jbWFwICpj bWFwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPiArewo+ICsJdTMyICpwYWxldHRlID0gKHUzMiAq KWluZm8tPnBzZXVkb19wYWxldHRlOwo+ICsJaW50IGk7Cj4gKwo+ICsJaWYgKGNtYXAtPnN0YXJ0 ICsgY21hcC0+bGVuID4gMTYpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJZm9yIChpID0g MDsgaSA8IGNtYXAtPmxlbjsgKytpKSB7Cj4gKwkJdTE2IHJlZCA9IGNtYXAtPnJlZFtpXTsKPiAr CQl1MTYgZ3JlZW4gPSBjbWFwLT5ncmVlbltpXTsKPiArCQl1MTYgYmx1ZSA9IGNtYXAtPmJsdWVb aV07Cj4gKwkJdTMyIHZhbHVlOwo+ICsKPiArCQlyZWQgPj49IDE2IC0gaW5mby0+dmFyLnJlZC5s ZW5ndGg7Cj4gKwkJZ3JlZW4gPj49IDE2IC0gaW5mby0+dmFyLmdyZWVuLmxlbmd0aDsKPiArCQli bHVlID4+PSAxNiAtIGluZm8tPnZhci5ibHVlLmxlbmd0aDsKPiArCQl2YWx1ZSA9IChyZWQgPDwg aW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKPiArCQkJKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5v ZmZzZXQpIHwKPiArCQkJKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKPiArCQlpZiAo aW5mby0+dmFyLnRyYW5zcC5sZW5ndGggPiAwKSB7Cj4gKwkJCXUzMiBtYXNrID0gKDEgPDwgaW5m by0+dmFyLnRyYW5zcC5sZW5ndGgpIC0gMTsKPiArCj4gKwkJCW1hc2sgPDw9IGluZm8tPnZhci50 cmFuc3Aub2Zmc2V0Owo+ICsJCQl2YWx1ZSB8PSBtYXNrOwo+ICsJCX0KPiArCQlwYWxldHRlW2Nt YXAtPnN0YXJ0ICsgaV0gPSB2YWx1ZTsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK PiArc3RhdGljIGludCBkcm1fZmJkZXZfZmJfc2V0Y21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwg c3RydWN0IGZiX2luZm8gKmluZm8pCj4gK3sKPiArCWlmIChvb3BzX2luX3Byb2dyZXNzKQo+ICsJ CXJldHVybiAtRUJVU1k7Cj4gKwo+ICsJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFM X1RSVUVDT0xPUikKPiArCQlyZXR1cm4gc2V0Y21hcF9wc2V1ZG9fcGFsZXR0ZShjbWFwLCBpbmZv KTsKPiArCj4gKwlyZXR1cm4gLUVJTlZBTDsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcm1fZmJk ZXZfZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPiArewo+ICsJc3Ry dWN0IGRybV9mYmRldiAqZmJkZXYgPSBpbmZvLT5wYXI7Cj4gKwlib29sIGlzX29wZW47Cj4gKwlp bnQgbW9kZTsKPiArCj4gKwlpZiAob29wc19pbl9wcm9ncmVzcykKPiArCQlyZXR1cm4gLUVCVVNZ Owo+ICsKPiArCW11dGV4X2xvY2soJmZiZGV2LT5sb2NrKTsKPiArCWlzX29wZW4gPSBmYmRldi0+ b3Blbl9jb3VudDsKPiArCW11dGV4X3VubG9jaygmZmJkZXYtPmxvY2spOwo+ICsKPiArCWlmICgh aXNfb3BlbikKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlpZiAoYmxhbmsgPT0gRkJfQkxB TktfVU5CTEFOSykKPiArCQltb2RlID0gRFJNX01PREVfRFBNU19PTjsKPiArCWVsc2UKPiArCQlt b2RlID0gRFJNX01PREVfRFBNU19PRkY7Cj4gKwo+ICsJcmV0dXJuIGRybV9jbGllbnRfZGlzcGxh eV9kcG1zKGZiZGV2LT5kaXNwbGF5LCBtb2RlKTsKPiArfQo+ICsKPiArc3RhdGljIGludAo+ICtk cm1fZmJkZXZfZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0 cnVjdCBmYl9pbmZvICppbmZvKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2ZiZGV2ICpmYmRldiA9IGlu Zm8tPnBhcjsKPiArCXN0cnVjdCBkcm1fZXZlbnQgKmV2ZW50Owo+ICsJdW5zaWduZWQgaW50IGZi X2lkeDsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCW11dGV4X2xvY2soJmZiZGV2LT5sb2NrKTsK PiArCj4gKwlpZiAoIWZiZGV2LT5vcGVuX2NvdW50KQo+ICsJCWdvdG8gb3V0X3VubG9jazsKPiAr Cj4gKwlmYl9pZHggPSB2YXItPnlvZmZzZXQgLyBpbmZvLT52YXIueXJlczsKPiArCWlmIChmYl9p ZHggPj0gZmJkZXYtPmJ1ZmZlci0+bnVtX2Zicykgewo+ICsJCXJldCA9IC1FSU5WQUw7Cj4gKwkJ Z290byBvdXRfdW5sb2NrOwo+ICsJfQo+ICsKPiArCS8qIERyYWluIHByZXZpb3VzIGZsaXAgZXZl bnQgaWYgdXNlcnNwYWNlIGRpZG4ndCBjYXJlICovCj4gKwlpZiAoZmJkZXYtPnBhZ2VfZmxpcF9z ZW50KSB7Cj4gKwkJZXZlbnQgPSBkcm1fY2xpZW50X3JlYWRfZXZlbnQoZmJkZXYtPmNsaWVudCwg ZmFsc2UpOwo+ICsJCWlmICghSVNfRVJSKGV2ZW50KSkKPiArCQkJa2ZyZWUoZXZlbnQpOwo+ICsJ CWZiZGV2LT5wYWdlX2ZsaXBfc2VudCA9IGZhbHNlOwo+ICsJfQo+ICsKPiArCWlmIChmYmRldi0+ Y3Vycl9mYiA9PSBmYmRldi0+YnVmZmVyLT5mYl9pZHNbZmJfaWR4XSkKPiArCQlnb3RvIG91dF91 bmxvY2s7Cj4gKwo+ICsJZmJkZXYtPmN1cnJfZmIgPSBmYmRldi0+YnVmZmVyLT5mYl9pZHNbZmJf aWR4XTsKPiArCWZiZGV2LT5kZWZpb19ub19mbHVzaGluZyA9IHRydWU7Cj4gKwo+ICsJcmV0ID0g ZHJtX2NsaWVudF9kaXNwbGF5X3BhZ2VfZmxpcChmYmRldi0+ZGlzcGxheSwgZmJkZXYtPmN1cnJf ZmIsIHRydWUpOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIG91dF91bmxvY2s7Cj4gKwo+ICsJZmJk ZXYtPnBhZ2VfZmxpcF9zZW50ID0gdHJ1ZTsKPiArCj4gK291dF91bmxvY2s6Cj4gKwltdXRleF91 bmxvY2soJmZiZGV2LT5sb2NrKTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGRybV9mYmRldl9mYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQg aW50IGNtZCwKPiArCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCj4gK3sKPiArCXN0cnVjdCBk cm1fZmJkZXYgKmZiZGV2ID0gaW5mby0+cGFyOwo+ICsJc3RydWN0IGRybV9ldmVudCAqZXZlbnQ7 Cj4gKwlib29sIHBhZ2VfZmxpcF9zZW50Owo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJc3dpdGNo IChjbWQpIHsKPiArLy8JY2FzZSBGQklPR0VUX1ZCTEFOSzoKPiArLy8JCWJyZWFrOwo+ICsJY2Fz ZSBGQklPX1dBSVRGT1JWU1lOQzoKPiArCQltdXRleF9sb2NrKCZmYmRldi0+bG9jayk7Cj4gKwkJ cGFnZV9mbGlwX3NlbnQgPSBmYmRldi0+cGFnZV9mbGlwX3NlbnQ7Cj4gKwkJZmJkZXYtPnBhZ2Vf ZmxpcF9zZW50ID0gZmFsc2U7Cj4gKwkJbXV0ZXhfdW5sb2NrKCZmYmRldi0+bG9jayk7Cj4gKwo+ ICsJCWlmIChwYWdlX2ZsaXBfc2VudCkgewo+ICsJCQlldmVudCA9IGRybV9jbGllbnRfcmVhZF9l dmVudChmYmRldi0+Y2xpZW50LCB0cnVlKTsKPiArCQkJaWYgKElTX0VSUihldmVudCkpCj4gKwkJ CQlyZXQgPSBQVFJfRVJSKGV2ZW50KTsKPiArCQkJZWxzZQo+ICsJCQkJa2ZyZWUoZXZlbnQpOwo+ ICsJCX0gZWxzZSB7Cj4gKwkJCWRybV9jbGllbnRfZGlzcGxheV93YWl0X3ZibGFuayhmYmRldi0+ ZGlzcGxheSk7Cj4gKwkJfQo+ICsKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0ID0g LUVOT1RUWTsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGRybV9mYmRldl9mYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9z dHJ1Y3QgKnZtYSkKPiArewo+ICsJc3RydWN0IGRybV9mYmRldiAqZmJkZXYgPSBpbmZvLT5wYXI7 Cj4gKwo+ICsJcmV0dXJuIGRtYV9idWZfbW1hcChmYmRldi0+YnVmZmVyLT5kbWFfYnVmLCB2bWEs IDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcm1fZmJkZXZfZmJfZGVzdHJveShzdHJ1Y3Qg ZmJfaW5mbyAqaW5mbykKPiArewo+ICsJc3RydWN0IGRybV9mYmRldiAqZmJkZXYgPSBpbmZvLT5w YXI7Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19LTVMoZmJkZXYtPmNsaWVudC0+ZGV2LT5kZXYsICJc biIpOwo+ICsJZHJtX2NsaWVudF9kaXNwbGF5X2ZyZWUoZmJkZXYtPmRpc3BsYXkpOwo+ICsJZHJt X2NsaWVudF9mcmVlKGZiZGV2LT5jbGllbnQpOwo+ICsJa2ZyZWUoZmJkZXYpOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgc3RydWN0IGZiX29wcyBkcm1fZmJkZXZfZmJfb3BzID0gewo+ICsJLm93bmVyCQk9 IFRISVNfTU9EVUxFLAo+ICsJLmZiX29wZW4JPSBkcm1fZmJkZXZfZmJfb3BlbiwKPiArCS5mYl9y ZWxlYXNlCT0gZHJtX2ZiZGV2X2ZiX3JlbGVhc2UsCj4gKwkuZmJfcmVhZAk9IGZiX3N5c19yZWFk LAo+ICsJLmZiX3dyaXRlCT0gZHJtX2ZiZGV2X2ZiX3dyaXRlLAo+ICsJLmZiX2NoZWNrX3Zhcgk9 IGRybV9mYmRldl9mYl9jaGVja192YXIsCj4gKwkuZmJfc2V0X3Bhcgk9IGRybV9mYmRldl9mYl9z ZXRfcGFyLAo+ICsvLwkuZmJfc2V0Y29scmVnCT0gZHJtX2ZiZGV2X2ZiX3NldGNvbHJlZywKPiAr CS5mYl9zZXRjbWFwCT0gZHJtX2ZiZGV2X2ZiX3NldGNtYXAsCj4gKwkuZmJfYmxhbmsJPSBkcm1f ZmJkZXZfZmJfYmxhbmssCj4gKwkuZmJfcGFuX2Rpc3BsYXkJPSBkcm1fZmJkZXZfZmJfcGFuX2Rp c3BsYXksCj4gKwkuZmJfZmlsbHJlY3QJPSBkcm1fZmJkZXZfZmJfZmlsbHJlY3QsCj4gKwkuZmJf Y29weWFyZWEJPSBkcm1fZmJkZXZfZmJfY29weWFyZWEsCj4gKwkuZmJfaW1hZ2VibGl0CT0gZHJt X2ZiZGV2X2ZiX2ltYWdlYmxpdCwKPiArCS5mYl9pb2N0bAk9IGRybV9mYmRldl9mYl9pb2N0bCwK PiArCS5mYl9tbWFwCT0gZHJtX2ZiZGV2X2ZiX21tYXAsCj4gKwkuZmJfZGVzdHJveQk9IGRybV9m YmRldl9mYl9kZXN0cm95LAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBkcm1fZmJkZXZfcmVnaXN0 ZXJfZnJhbWVidWZmZXIoc3RydWN0IGRybV9mYmRldiAqZmJkZXYpCj4gK3sKPiArCXN0cnVjdCBk cm1fY2xpZW50X2Rpc3BsYXkgKmRpc3BsYXk7Cj4gKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKPiAr CXN0cnVjdCBmYl9vcHMgKmZib3BzOwo+ICsJdTMyIGZvcm1hdDsKPiArCWludCByZXQ7Cj4gKwo+ ICsJZGlzcGxheSA9IGRybV9jbGllbnRfZGlzcGxheV9nZXRfZmlyc3RfZW5hYmxlZChmYmRldi0+ Y2xpZW50LCBmYWxzZSk7Cj4gKwlpZiAoSVNfRVJSX09SX05VTEwoZGlzcGxheSkpCj4gKwkJcmV0 dXJuIFBUUl9FUlJfT1JfWkVSTyhkaXNwbGF5KTsKPiArCj4gKwlmYmRldi0+ZGlzcGxheSA9IGRp c3BsYXk7Cj4gKwo+ICsJLyoKPiArCSAqIGZiX2RlZmVycmVkX2lvX2NsZWFudXAoKSBjbGVhcnMg JmZib3BzLT5mYl9tbWFwIHNvIGEgcGVyIGluc3RhbmNlCj4gKwkgKiB2ZXJzaW9uIGlzIG5lY2Vz c2FyeS4gV2UgZG8gaXQgZm9yIGFsbCB1c2VycyBzaW5jZSB3ZSBkb24ndCBrbm93Cj4gKwkgKiB5 ZXQgaWYgdGhlIGZiIGhhcyBhIGRpcnR5IGNhbGxiYWNrLgo+ICsJICovCj4gKwlmYm9wcyA9IGt6 YWxsb2Moc2l6ZW9mKCpmYm9wcyksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFmYm9wcykgewo+ICsJ CXJldCA9IC1FTk9NRU07Cj4gKwkJZ290byBlcnJfZnJlZTsKPiArCX0KPiArCj4gKwkqZmJvcHMg PSBkcm1fZmJkZXZfZmJfb3BzOwo+ICsKPiArCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygwLCBm YmRldi0+Y2xpZW50LT5kZXYtPmRldik7Cj4gKwlpZiAoIWluZm8pIHsKPiArCQlyZXQgPSAtRU5P TUVNOwo+ICsJCWdvdG8gZXJyX2ZyZWU7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZmJfYWxsb2NfY21h cCgmaW5mby0+Y21hcCwgMjU2LCAwKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBlcnJfcmVsZWFz ZTsKPiArCj4gKwlpbmZvLT5wYXIgPSBmYmRldjsKPiArCWluZm8tPmZib3BzID0gZmJvcHM7Cj4g KwlJTklUX0xJU1RfSEVBRCgmaW5mby0+bW9kZWxpc3QpOwo+ICsJaW5mby0+cHNldWRvX3BhbGV0 dGUgPSBmYmRldi0+cHNldWRvX3BhbGV0dGU7Cj4gKwo+ICsJaW5mby0+Zml4LnR5cGUgPSBGQl9U WVBFX1BBQ0tFRF9QSVhFTFM7Cj4gKwlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVD T0xPUjsKPiArCWluZm8tPmZpeC55cGFuc3RlcCA9IGluZm8tPnZhci55cmVzOwo+ICsKPiArCXN0 cmNweShpbmZvLT5maXguaWQsICJEUk0gZW11bGF0ZWQiKTsKPiArCj4gKwlmYmRldi0+aW5mbyA9 IGluZm87Cj4gKwlyZXQgPSBkcm1fZmJkZXZfc3luY19tb2RlcyhmYmRldiwgdHJ1ZSk7Cj4gKwlp ZiAocmV0IDwgMCkKPiArCQlnb3RvIGVycl9mcmVlX2NtYXA7Cj4gKwo+ICsJaW5mby0+dmFyLmJp dHNfcGVyX3BpeGVsID0gZHJtX2NsaWVudF9kaXNwbGF5X3ByZWZlcnJlZF9kZXB0aChmYmRldi0+ ZGlzcGxheSk7Cj4gKwlyZXQgPSBkcm1fZmJkZXZfdmFyX3RvX2Zvcm1hdCgmaW5mby0+dmFyLCAm Zm9ybWF0KTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fV0FSTigiVW5zdXBwb3J0ZWQgYnBwLCBh c3N1bWluZyB4OHI4ZzhiOCBwaXhlbCBmb3JtYXRcbiIpOwo+ICsJCWZvcm1hdCA9IERSTV9GT1JN QVRfWFJHQjg4ODg7Cj4gKwl9Cj4gKwlkcm1fZmJkZXZfZm9ybWF0X2ZpbGxfdmFyKGZvcm1hdCwg JmluZm8tPnZhcik7Cj4gKwo+ICsJaW5mby0+dmFyLnhyZXNfdmlydHVhbCA9IGluZm8tPnZhci54 cmVzOwo+ICsJaW5mby0+dmFyLnlyZXNfdmlydHVhbCA9IGluZm8tPnZhci55cmVzOwo+ICsKPiAr CWluZm8tPnZhci55cmVzX3ZpcnR1YWwgKj0gQ09ORklHX0RSTV9GQkRFVl9PVkVSQUxMT0M7Cj4g KwlpbmZvLT52YXIueXJlc192aXJ0dWFsIC89IDEwMDsKPiArCj4gKwlyZXQgPSByZWdpc3Rlcl9m cmFtZWJ1ZmZlcihpbmZvKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBlcnJfZnJlZV9jbWFwOwo+ ICsKPiArCWRldl9pbmZvKGZiZGV2LT5jbGllbnQtPmRldi0+ZGV2LCAiZmIlZDogJXMgZnJhbWUg YnVmZmVyIGRldmljZVxuIiwKPiArCQkgaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkKTsKPiArCj4g KwlyZXR1cm4gMDsKPiArCj4gK2Vycl9mcmVlX2NtYXA6Cj4gKwlmYl9kZWFsbG9jX2NtYXAoJmlu Zm8tPmNtYXApOwo+ICtlcnJfcmVsZWFzZToKPiArCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7 Cj4gK2Vycl9mcmVlOgo+ICsJa2ZyZWUoZmJvcHMpOwo+ICsJZmJkZXYtPmluZm8gPSBOVUxMOwo+ ICsJZHJtX2NsaWVudF9kaXNwbGF5X2ZyZWUoZmJkZXYtPmRpc3BsYXkpOwo+ICsJZmJkZXYtPmRp c3BsYXkgPSBOVUxMOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg ZHJtX2ZiZGV2X2NsaWVudF9ob3RwbHVnKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50KQo+ ICt7Cj4gKwlzdHJ1Y3QgZHJtX2ZiZGV2ICpmYmRldiA9IGNsaWVudC0+cHJpdmF0ZTsKPiArCWlu dCByZXQ7Cj4gKwo+ICsJaWYgKCFmYmRldi0+aW5mbykKPiArCQlyZXQgPSBkcm1fZmJkZXZfcmVn aXN0ZXJfZnJhbWVidWZmZXIoZmJkZXYpOwo+ICsJZWxzZQo+ICsJCXJldCA9IGRybV9mYmRldl9z eW5jX21vZGVzKGZiZGV2LCBmYWxzZSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBkcm1fZmJkZXZfY2xpZW50X25ldyhzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNs aWVudCkKPiArewo+ICsJc3RydWN0IGRybV9mYmRldiAqZmJkZXY7Cj4gKwo+ICsJZmJkZXYgPSBr emFsbG9jKHNpemVvZigqZmJkZXYpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghZmJkZXYpCj4gKwkJ cmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJbXV0ZXhfaW5pdCgmZmJkZXYtPmxvY2spOwo+ICsJc3Bp bl9sb2NrX2luaXQoJmZiZGV2LT5kaXJ0eV9sb2NrKTsKPiArCUlOSVRfV09SSygmZmJkZXYtPmRp cnR5X3dvcmssIGRybV9mYmRldl9kaXJ0eV93b3JrKTsKPiArCj4gKwlmYmRldi0+Y2xpZW50ID0g Y2xpZW50Owo+ICsJY2xpZW50LT5wcml2YXRlID0gZmJkZXY7Cj4gKwo+ICsJLyoKPiArCSAqIHZj NCBpc24ndCBkb25lIHdpdGggaXQncyBzZXR1cCB3aGVuIGRybV9kZXZfcmVnaXN0ZXIoKSBpcyBj YWxsZWQuCj4gKwkgKiBJdCBzaG91bGQgaGF2ZSBzaG91bGRuJ3QgaXQ/Cj4gKwkgKiBTbyB0byBr ZWVwIGl0IGZyb20gY3Jhc2hpbmcgZGVmZXIgc2V0dXAgdG8gaG90cGx1Zy4uLgo+ICsJICovCj4g KwlpZiAoY2xpZW50LT5kZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCkKPiArCQlkcm1fZmJkZXZf Y2xpZW50X2hvdHBsdWcoY2xpZW50KTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIGludCBkcm1fZmJkZXZfY2xpZW50X3JlbW92ZShzdHJ1Y3QgZHJtX2NsaWVudF9kZXYgKmNs aWVudCkKPiArewo+ICsJc3RydWN0IGRybV9mYmRldiAqZmJkZXYgPSBjbGllbnQtPnByaXZhdGU7 Cj4gKwo+ICsJaWYgKCFmYmRldi0+aW5mbykgewo+ICsJCWtmcmVlKGZiZGV2KTsKPiArCQlyZXR1 cm4gMDsKPiArCX0KPiArCj4gKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiZGV2LT5pbmZvKTsK PiArCj4gKwkvKiBkcm1fZmJkZXZfZmJfZGVzdHJveSgpIGZyZWVzIHRoZSBjbGllbnQgKi8KPiAr CXJldHVybiAxOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRybV9mYmRldl9jbGllbnRfbGFzdGNs b3NlKHN0cnVjdCBkcm1fY2xpZW50X2RldiAqY2xpZW50KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2Zi ZGV2ICpmYmRldiA9IGNsaWVudC0+cHJpdmF0ZTsKPiArCWludCByZXQgPSAtRU5PRU5UOwo+ICsK PiArCWlmIChmYmRldi0+aW5mbykKPiArCQlyZXQgPSBmYmRldi0+aW5mby0+ZmJvcHMtPmZiX3Nl dF9wYXIoZmJkZXYtPmluZm8pOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgZHJtX2NsaWVudF9mdW5jcyBkcm1fZmJkZXZfY2xpZW50X2Z1bmNzID0g ewo+ICsJLm5hbWUJCT0gImRybV9mYmRldiIsCj4gKwkubmV3CQk9IGRybV9mYmRldl9jbGllbnRf bmV3LAo+ICsJLnJlbW92ZQkJPSBkcm1fZmJkZXZfY2xpZW50X3JlbW92ZSwKPiArCS5sYXN0Y2xv c2UJPSBkcm1fZmJkZXZfY2xpZW50X2xhc3RjbG9zZSwKPiArCS5ob3RwbHVnCT0gZHJtX2ZiZGV2 X2NsaWVudF9ob3RwbHVnLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBfX2luaXQgZHJtX2ZiZGV2 X2luaXQodm9pZCkKPiArewo+ICsJcmV0dXJuIGRybV9jbGllbnRfcmVnaXN0ZXIoJmRybV9mYmRl dl9jbGllbnRfZnVuY3MpOwo+ICt9Cj4gK21vZHVsZV9pbml0KGRybV9mYmRldl9pbml0KTsKPiAr Cj4gK3N0YXRpYyB2b2lkIF9fZXhpdCBkcm1fZmJkZXZfZXhpdCh2b2lkKQo+ICt7Cj4gKwlkcm1f Y2xpZW50X3VucmVnaXN0ZXIoJmRybV9mYmRldl9jbGllbnRfZnVuY3MpOwo+ICt9Cj4gK21vZHVs ZV9leGl0KGRybV9mYmRldl9leGl0KTsKPiArCj4gK01PRFVMRV9ERVNDUklQVElPTigiRFJNIEdl bmVyaWMgZmJkZXYgZW11bGF0aW9uIik7Cj4gK01PRFVMRV9BVVRIT1IoIk5vcmFsZiBUcsO4bm5l cyIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gLS0gCj4gMi4xNS4xCj4gCgotLSAKRGFu aWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24KaHR0cDovL2Js b2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs Cg==