From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH 3/3] drm/i915/userptr: Probe vma range before gup Date: Tue, 15 Jan 2019 10:19:11 +0000 Message-ID: <8a0cf258-af35-8a26-2ba9-8c6933fb6537@linux.intel.com> References: <20190114211729.30352-1-chris@chris-wilson.co.uk> <20190114211729.30352-3-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by gabe.freedesktop.org (Postfix) with ESMTPS id 639AA897AC for ; Tue, 15 Jan 2019 10:19:12 +0000 (UTC) In-Reply-To: <20190114211729.30352-3-chris@chris-wilson.co.uk> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Chris Wilson , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org Ck9uIDE0LzAxLzIwMTkgMjE6MTcsIENocmlzIFdpbHNvbiB3cm90ZToKPiBXZSB3YW50IHRvIGV4 Y2x1ZGUgYW55IEdHVFQgb2JqZWN0cyBmcm9tIGJlaW5nIHByZXNlbnQgb24gb3VyIGludGVybmFs Cj4gbGlzdHMgdG8gYXZvaWQgdGhlIGRlYWRsb2NrIHdlIG1heSBydW4gaW50byB3aXRoIG91ciBy ZXF1aXJlbWVudCBmb3IKPiBzdHJ1Y3RfbXV0ZXggZHVyaW5nIGludmFsaWRhdGUuIEhvd2V2ZXIs IGlmIHRoZSBndXBfZmFzdCBmYWlscywgd2UgcHV0Cj4gdGhlIHVzZXJwdHIgb250byB0aGUgd29y a3F1ZXVlIGFuZCBtYXJrIGl0IGFzIGFjdGl2ZSwgc28gdGhhdCB3ZQo+IHJlbWVtYmVyIHRvIHNl cmlhbGlzZSB0aGUgd29ya2VyIHVwb24gbW11X2ludmFsaWRhdGUuCj4gCj4gTm90ZSB0aGF0IGRl c3BpdGUgdGhlIHByZXZpb3VzIGZpeCwgaXQgaXMgc3RpbGwgYmV0dGVyIHRvIGF2b2lkIHRoZQo+ IHN0cnVjdF9tdXRleCByZWN1cnNpb24gd2hlcmUgcG9zc2libGUsIGxlYXZpbmcgdGhlIHJlY3Vy c2lvbiBvbmx5IHRvCj4gaGFuZGxlIHRoZSBzaHJpbmtlci1lc3F1ZSBwYXRocy4KPiAKPiB2Mjog SG9sZCBtbWFwX3NlbSB0byBwcmV2ZW50IG1vZGlmaWNhdGlvbnMgdG8gdGhlIG1tIHdoaWxlIHdl IHByb2JlIGFuZAo+IGFkZCBvdXJzZWx2ZXMgdG8gdGhlIGludGVydmFsLXRyZWUgZm9yIG5vdGlm aWNpYXRpb24uCj4gdjM6IFJlbHkgb24gbW1hcF9zZW0gZm9yIGEgc2ltcGxlciBwYXRjaC4KPiB2 NDogTWFyayB1cCB0aGUgbW1hcF9zZW0gbmVzdGluZwo+IHY1OiBEb24ndCBkZWFjdGl2YXRlIG9u IC1FQUdBSU4gYXMgdGhhdCBtZWFucyB0aGUgd29ya2VyIGlzIHF1ZXVlZAo+IHY2OiBGaWdodCB0 aGUgaW5kZW50YXRpb24gYW5kIGNoYWluZWQgaWYtZWxzZSBlcnJvciBoYW5kbGluZwo+IHY3OiBG aWdodCBhZ2Fpbi4KPiAKPiBCdWd6aWxsYTogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9z aG93X2J1Zy5jZ2k/aWQ9MTA0MjA5Cj4gU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJp c0BjaHJpcy13aWxzb24uY28udWs+Cj4gQ2M6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJzdWxp bkBpbnRlbC5jb20+Cj4gQ2M6IE1pY2hhxYIgV2luaWFyc2tpIDxtaWNoYWwud2luaWFyc2tpQGlu dGVsLmNvbT4KPiAtLS0KPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3VzZXJwdHIu YyB8IDE1MCArKysrKysrKysrKysrKysrLS0tLS0tLS0KPiAgIDEgZmlsZSBjaGFuZ2VkLCA5OCBp bnNlcnRpb25zKCspLCA1MiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW1fdXNlcnB0ci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9nZW1fdXNlcnB0ci5jCj4gaW5kZXggOWMyMDA4YTQ4MGUyLi43YjllMTRiYzNiYzUgMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdXNlcnB0ci5jCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdXNlcnB0ci5jCj4gQEAgLTQzNSw3ICs0MzUs NyBAQCBzdHJ1Y3QgZ2V0X3BhZ2VzX3dvcmsgewo+ICAgCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFz azsKPiAgIH07Cj4gICAKPiAtc3RhdGljIHN0cnVjdCBzZ190YWJsZSAqCj4gK3N0YXRpYyBpbnQK PiAgIF9faTkxNV9nZW1fdXNlcnB0cl9hbGxvY19wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqLAo+ICAgCQkJICAgICAgIHN0cnVjdCBwYWdlICoqcHZlYywgaW50IG51bV9wYWdl cykKPiAgIHsKPiBAQCAtNDQ2LDcgKzQ0Niw3IEBAIF9faTkxNV9nZW1fdXNlcnB0cl9hbGxvY19w YWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICAgCj4gICAJc3QgPSBrbWFs bG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKPiAgIAlpZiAoIXN0KQo+IC0JCXJldHVybiBF UlJfUFRSKC1FTk9NRU0pOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICAgCj4gICBhbGxvY190YWJs ZToKPiAgIAlyZXQgPSBfX3NnX2FsbG9jX3RhYmxlX2Zyb21fcGFnZXMoc3QsIHB2ZWMsIG51bV9w YWdlcywKPiBAQCAtNDU1LDcgKzQ1NSw3IEBAIF9faTkxNV9nZW1fdXNlcnB0cl9hbGxvY19wYWdl cyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ICAgCQkJCQkgIEdGUF9LRVJORUwp Owo+ICAgCWlmIChyZXQpIHsKPiAgIAkJa2ZyZWUoc3QpOwo+IC0JCXJldHVybiBFUlJfUFRSKHJl dCk7Cj4gKwkJcmV0dXJuIHJldDsKPiAgIAl9Cj4gICAKPiAgIAlyZXQgPSBpOTE1X2dlbV9ndHRf cHJlcGFyZV9wYWdlcyhvYmosIHN0KTsKPiBAQCAtNDY4LDE0ICs0NjgsMTQgQEAgX19pOTE1X2dl bV91c2VycHRyX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCj4g ICAJCX0KPiAgIAo+ICAgCQlrZnJlZShzdCk7Cj4gLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKPiAr CQlyZXR1cm4gcmV0Owo+ICAgCX0KPiAgIAo+ICAgCXNnX3BhZ2Vfc2l6ZXMgPSBpOTE1X3NnX3Bh Z2Vfc2l6ZXMoc3QtPnNnbCk7Cj4gICAKPiAgIAlfX2k5MTVfZ2VtX29iamVjdF9zZXRfcGFnZXMo b2JqLCBzdCwgc2dfcGFnZV9zaXplcyk7Cj4gICAKPiAtCXJldHVybiBzdDsKPiArCXJldHVybiAw Owo+ICAgfQo+ICAgCj4gICBzdGF0aWMgdm9pZAo+IEBAIC01MjAsMTkgKzUyMCwxNCBAQCBfX2k5 MTVfZ2VtX3VzZXJwdHJfZ2V0X3BhZ2VzX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl93b3Jr KQo+ICAgCj4gICAJbXV0ZXhfbG9jaygmb2JqLT5tbS5sb2NrKTsKPiAgIAlpZiAob2JqLT51c2Vy cHRyLndvcmsgPT0gJndvcmstPndvcmspIHsKPiAtCQlzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzID0g RVJSX1BUUihyZXQpOwo+IC0KPiAgIAkJaWYgKHBpbm5lZCA9PSBucGFnZXMpIHsKPiAtCQkJcGFn ZXMgPSBfX2k5MTVfZ2VtX3VzZXJwdHJfYWxsb2NfcGFnZXMob2JqLCBwdmVjLAo+IC0JCQkJCQkJ ICAgICAgIG5wYWdlcyk7Cj4gLQkJCWlmICghSVNfRVJSKHBhZ2VzKSkgewo+ICsJCQlyZXQgPSBf X2k5MTVfZ2VtX3VzZXJwdHJfYWxsb2NfcGFnZXMob2JqLCBwdmVjLCBucGFnZXMpOwo+ICsJCQlp ZiAoIXJldCkKPiAgIAkJCQlwaW5uZWQgPSAwOwo+IC0JCQkJcGFnZXMgPSBOVUxMOwo+IC0JCQl9 Cj4gICAJCX0KPiAgIAo+IC0JCW9iai0+dXNlcnB0ci53b3JrID0gRVJSX0NBU1QocGFnZXMpOwo+ IC0JCWlmIChJU19FUlIocGFnZXMpKQo+ICsJCW9iai0+dXNlcnB0ci53b3JrID0gRVJSX1BUUihy ZXQpOwo+ICsJCWlmIChyZXQpCj4gICAJCQlfX2k5MTVfZ2VtX3VzZXJwdHJfc2V0X2FjdGl2ZShv YmosIGZhbHNlKTsKPiAgIAl9Cj4gICAJbXV0ZXhfdW5sb2NrKCZvYmotPm1tLmxvY2spOwo+IEBA IC01NDUsNyArNTQwLDcgQEAgX19pOTE1X2dlbV91c2VycHRyX2dldF9wYWdlc193b3JrZXIoc3Ry dWN0IHdvcmtfc3RydWN0ICpfd29yaykKPiAgIAlrZnJlZSh3b3JrKTsKPiAgIH0KPiAgIAo+IC1z dGF0aWMgc3RydWN0IHNnX3RhYmxlICoKPiArc3RhdGljIGludAo+ICAgX19pOTE1X2dlbV91c2Vy cHRyX2dldF9wYWdlc19zY2hlZHVsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+ ICAgewo+ICAgCXN0cnVjdCBnZXRfcGFnZXNfd29yayAqd29yazsKPiBAQCAtNTcxLDcgKzU2Niw3 IEBAIF9faTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXNfc2NoZWR1bGUoc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaikKPiAgIAkgKi8KPiAgIAl3b3JrID0ga21hbGxvYyhzaXplb2YoKndv cmspLCBHRlBfS0VSTkVMKTsKPiAgIAlpZiAod29yayA9PSBOVUxMKQo+IC0JCXJldHVybiBFUlJf UFRSKC1FTk9NRU0pOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICAgCj4gICAJb2JqLT51c2VycHRy LndvcmsgPSAmd29yay0+d29yazsKPiAgIAo+IEBAIC01ODMsMTkgKzU3OCw4NiBAQCBfX2k5MTVf Z2VtX3VzZXJwdHJfZ2V0X3BhZ2VzX3NjaGVkdWxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmopCj4gICAJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBfX2k5MTVfZ2VtX3VzZXJwdHJfZ2V0 X3BhZ2VzX3dvcmtlcik7Cj4gICAJcXVldWVfd29yayh0b19pOTE1KG9iai0+YmFzZS5kZXYpLT5t bS51c2VycHRyX3dxLCAmd29yay0+d29yayk7Cj4gICAKPiAtCXJldHVybiBFUlJfUFRSKC1FQUdB SU4pOwo+ICsJcmV0dXJuIC1FQUdBSU47Cj4gICB9Cj4gICAKPiAtc3RhdGljIGludCBpOTE1X2dl bV91c2VycHRyX2dldF9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+ICtz dGF0aWMgaW50Cj4gK3Byb2JlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBs b25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQo+ICt7Cj4gKwljb25zdCB1bnNpZ25lZCBsb25n IGVuZCA9IGFkZHIgKyBsZW47Cj4gKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKPiArCWlu dCByZXQgPSAtRUZBVUxUOwo+ICsKPiArCWZvciAodm1hID0gZmluZF92bWEobW0sIGFkZHIpOyB2 bWE7IHZtYSA9IHZtYS0+dm1fbmV4dCkgewo+ICsJCWlmICh2bWEtPnZtX3N0YXJ0ID4gYWRkcikK PiArCQkJYnJlYWs7Cj4gKwo+ICsJCS8qCj4gKwkJICogRXhjbHVkZSBhbnkgVk1BIHRoYXQgaXMg bm90IGJhY2tlZCBvbmx5IGJ5IHN0cnVjdF9wYWdlLCBpLmUuCj4gKwkJICogSU8gcmVnaW9ucyB0 aGF0IGluY2x1ZGUgb3VyIG93biBHR1RUIG1tYXBzLiBXZSBjYW5ub3QgaGFuZGxlCj4gKwkJICog c3VjaCByYW5nZXMsIGFzIHdlIG1heSBlbmNvdW50ZXIgZGVhZGxvY2tzIGFyb3VuZCBvdXIKPiAr CQkgKiBzdHJ1Y3RfbXV0ZXggb24gbW11X2ludmFsaWRhdGVfcmFuZ2UuCj4gKwkJICovCj4gKwkJ aWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUEZOTUFQIHwgVk1fTUlYRURNQVApKQo+ICsJCQlicmVh azsKPiArCj4gKwkJaWYgKHZtYS0+dm1fZW5kID49IGVuZCkgewo+ICsJCQlyZXQgPSAwOwo+ICsJ CQlicmVhazsKPiArCQl9Cj4gKwo+ICsJCWFkZHIgPSB2bWEtPnZtX2VuZDsKPiArCX0KPiArCj4g KwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHRyeV9mYXN0X2d1cChzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQo+ICAgewo+ICAgCWNvbnN0IGludCBudW1fcGFnZXMg PSBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUOwo+IC0Jc3RydWN0IG1tX3N0cnVjdCAqbW0g PSBvYmotPnVzZXJwdHIubW0tPm1tOwo+ICAgCXN0cnVjdCBwYWdlICoqcHZlYzsKPiAtCXN0cnVj dCBzZ190YWJsZSAqcGFnZXM7Cj4gLQlib29sIGFjdGl2ZTsKPiAtCWludCBwaW5uZWQ7Cj4gKwlp bnQgcGlubmVkLCBlcnI7Cj4gKwo+ICsJcHZlYyA9IGt2bWFsbG9jX2FycmF5KG51bV9wYWdlcywg c2l6ZW9mKHN0cnVjdCBwYWdlICopLAo+ICsJCQkgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfTk9S RVRSWSB8IF9fR0ZQX05PV0FSTik7Cj4gKwlpZiAoIXB2ZWMpIC8qIGRlZmVyIHRvIHdvcmtlciBp ZiBtYWxsb2MgZmFpbHMgKi8KPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlwaW5uZWQgPSBf X2dldF91c2VyX3BhZ2VzX2Zhc3Qob2JqLT51c2VycHRyLnB0ciwKPiArCQkJCSAgICAgICBudW1f cGFnZXMsCj4gKwkJCQkgICAgICAgIWk5MTVfZ2VtX29iamVjdF9pc19yZWFkb25seShvYmopLAo+ ICsJCQkJICAgICAgIHB2ZWMpOwo+ICsJaWYgKHBpbm5lZCA8IDApIHsKPiArCQllcnIgPSBwaW5u ZWQ7Cj4gKwkJcGlubmVkID0gMDsKCnBpbm5lZCBpcyB1bnVzZWQgb24gdGhlIGV4aXQgYnJhbmNo LgoKPiArCQlnb3RvIG91dF9wdmVjOwo+ICsJfQo+ICAgCj4gLQkvKiBJZiB1c2Vyc3BhY2Ugc2hv dWxkIGVuZ2luZWVyIHRoYXQgdGhlc2UgcGFnZXMgYXJlIHJlcGxhY2VkIGluCj4gKwlpZiAocGlu bmVkIDwgbnVtX3BhZ2VzKSB7Cj4gKwkJZXJyID0gLUVGQVVMVDsKPiArCQlnb3RvIG91dF9waW5u ZWQ7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gX19pOTE1X2dlbV91c2VycHRyX2FsbG9jX3BhZ2VzKG9i aiwgcHZlYywgbnVtX3BhZ2VzKTsKPiArCWlmIChlcnIpCj4gKwkJZ290byBvdXRfcGlubmVkOwo+ ICsKPiArCV9faTkxNV9nZW1fdXNlcnB0cl9zZXRfYWN0aXZlKG9iaiwgdHJ1ZSk7Cj4gKwlwaW5u ZWQgPSAwOwo+ICtvdXRfcGlubmVkOgo+ICsJcmVsZWFzZV9wYWdlcyhwdmVjLCBwaW5uZWQpOwo+ ICtvdXRfcHZlYzoKPiArCWt2ZnJlZShwdmVjKTsKPiArCXJldHVybiBlcnI7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgaTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKPiArewo+ICsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBvYmotPnVzZXJw dHIubW0tPm1tOwo+ICsJaW50IGVycjsKPiArCj4gKwkvKgo+ICsJICogSWYgdXNlcnNwYWNlIHNo b3VsZCBlbmdpbmVlciB0aGF0IHRoZXNlIHBhZ2VzIGFyZSByZXBsYWNlZCBpbgo+ICAgCSAqIHRo ZSB2bWEgYmV0d2VlbiB1cyBiaW5kaW5nIHRoaXMgcGFnZSBpbnRvIHRoZSBHVFQgYW5kIGNvbXBs ZXRpb24KPiAgIAkgKiBvZiByZW5kZXJpbmcuLi4gVGhlaXIgbG9zcy4gSWYgdGhleSBjaGFuZ2Ug dGhlIG1hcHBpbmcgb2YgdGhlaXIKPiAgIAkgKiBwYWdlcyB0aGV5IG5lZWQgdG8gY3JlYXRlIGEg bmV3IGJvIHRvIHBvaW50IHRvIHRoZSBuZXcgdm1hLgo+IEBAIC02MjAsNDAgKzY4MiwyNCBAQCBz dGF0aWMgaW50IGk5MTVfZ2VtX3VzZXJwdHJfZ2V0X3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmopCj4gICAJCQlyZXR1cm4gLUVBR0FJTjsKPiAgIAl9Cj4gICAKPiAtCXB2ZWMg PSBOVUxMOwo+IC0JcGlubmVkID0gMDsKPiArCWlmIChtbSA9PSBjdXJyZW50LT5tbSAmJiB0cnlf ZmFzdF9ndXAob2JqKSA9PSAwKQo+ICsJCXJldHVybiAwOwoKSXMgdHJ5X2Zhc3RfZ3VwIGd1YXJh bnRlZWQgdG8gZmFpbCBvbiByYW5nZXMgcHJvYmVfcmFuZ2Ugd291bGQgaGF2ZSAKcmVqZWN0ZWQ/ Cgo+ICAgCj4gLQlpZiAobW0gPT0gY3VycmVudC0+bW0pIHsKPiAtCQlwdmVjID0ga3ZtYWxsb2Nf YXJyYXkobnVtX3BhZ2VzLCBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCj4gLQkJCQkgICAgICBHRlBf S0VSTkVMIHwKPiAtCQkJCSAgICAgIF9fR0ZQX05PUkVUUlkgfAo+IC0JCQkJICAgICAgX19HRlBf Tk9XQVJOKTsKPiAtCQlpZiAocHZlYykgLyogZGVmZXIgdG8gd29ya2VyIGlmIG1hbGxvYyBmYWls cyAqLwo+IC0JCQlwaW5uZWQgPSBfX2dldF91c2VyX3BhZ2VzX2Zhc3Qob2JqLT51c2VycHRyLnB0 ciwKPiAtCQkJCQkJICAgICAgIG51bV9wYWdlcywKPiAtCQkJCQkJICAgICAgICFpOTE1X2dlbV9v YmplY3RfaXNfcmVhZG9ubHkob2JqKSwKPiAtCQkJCQkJICAgICAgIHB2ZWMpOwo+IC0JfQo+ICsJ LyogbG9ja2RlcCBkb2Vzbid0IHlldCBhdXRvbWF0aWNhbGx5IGFsbG93IG5lc3Rpbmcgb2YgcmVh ZGVycyAqLwo+ICsJZG93bl9yZWFkX25lc3RlZCgmbW0tPm1tYXBfc2VtLCBTSU5HTEVfREVQVEhf TkVTVElORyk7CgpXaHkgaXMgbmVzdGluZyBuZWVkZWQgLSBjb21tZW50IG5lZWRzIHRvIGV4cGxh aW4uCgo+ICAgCj4gLQlhY3RpdmUgPSBmYWxzZTsKPiAtCWlmIChwaW5uZWQgPCAwKSB7Cj4gLQkJ cGFnZXMgPSBFUlJfUFRSKHBpbm5lZCk7Cj4gLQkJcGlubmVkID0gMDsKPiAtCX0gZWxzZSBpZiAo cGlubmVkIDwgbnVtX3BhZ2VzKSB7Cj4gLQkJcGFnZXMgPSBfX2k5MTVfZ2VtX3VzZXJwdHJfZ2V0 X3BhZ2VzX3NjaGVkdWxlKG9iaik7Cj4gLQkJYWN0aXZlID0gcGFnZXMgPT0gRVJSX1BUUigtRUFH QUlOKTsKPiAtCX0gZWxzZSB7Cj4gLQkJcGFnZXMgPSBfX2k5MTVfZ2VtX3VzZXJwdHJfYWxsb2Nf cGFnZXMob2JqLCBwdmVjLCBudW1fcGFnZXMpOwo+IC0JCWFjdGl2ZSA9ICFJU19FUlIocGFnZXMp Owo+IC0JfQo+IC0JaWYgKGFjdGl2ZSkKPiArCWVyciA9IHByb2JlX3JhbmdlKG1tLCBvYmotPnVz ZXJwdHIucHRyLCBvYmotPmJhc2Uuc2l6ZSk7Cj4gKwlpZiAoZXJyKQo+ICsJCWdvdG8gZXJyX3Vu bG9jazsKPiArCj4gKwllcnIgPSBfX2k5MTVfZ2VtX3VzZXJwdHJfZ2V0X3BhZ2VzX3NjaGVkdWxl KG9iaik7Cj4gKwlpZiAoZXJyID09IC1FQUdBSU4pCj4gICAJCV9faTkxNV9nZW1fdXNlcnB0cl9z ZXRfYWN0aXZlKG9iaiwgdHJ1ZSk7Cj4gICAKPiAtCWlmIChJU19FUlIocGFnZXMpKQo+IC0JCXJl bGVhc2VfcGFnZXMocHZlYywgcGlubmVkKTsKPiAtCWt2ZnJlZShwdmVjKTsKPiArZXJyX3VubG9j azoKPiArCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gICAKPiAtCXJldHVybiBQVFJfRVJSX09S X1pFUk8ocGFnZXMpOwo+ICsJcmV0dXJuIGVycjsKPiAgIH0KPiAgIAo+ICAgc3RhdGljIHZvaWQK PiAKClJlZ2FyZHMsCgpUdnJ0a28KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v aW50ZWwtZ2Z4Cg==