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:27:02 +0000 Message-ID: <9cd5762d-0ced-b741-aaa1-80c185f1da63@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 mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id 083136EC69 for ; Tue, 15 Jan 2019 10:27:02 +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 ZWQ7Cj4gKwkJcGlubmVkID0gMDsKPiArCQlnb3RvIG91dF9wdmVjOwo+ICsJfQo+ICAgCj4gLQkv KiBJZiB1c2Vyc3BhY2Ugc2hvdWxkIGVuZ2luZWVyIHRoYXQgdGhlc2UgcGFnZXMgYXJlIHJlcGxh Y2VkIGluCj4gKwlpZiAocGlubmVkIDwgbnVtX3BhZ2VzKSB7Cj4gKwkJZXJyID0gLUVGQVVMVDsK PiArCQlnb3RvIG91dF9waW5uZWQ7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gX19pOTE1X2dlbV91c2Vy cHRyX2FsbG9jX3BhZ2VzKG9iaiwgcHZlYywgbnVtX3BhZ2VzKTsKPiArCWlmIChlcnIpCj4gKwkJ Z290byBvdXRfcGlubmVkOwo+ICsKPiArCV9faTkxNV9nZW1fdXNlcnB0cl9zZXRfYWN0aXZlKG9i aiwgdHJ1ZSk7Cj4gKwlwaW5uZWQgPSAwOwo+ICtvdXRfcGlubmVkOgo+ICsJcmVsZWFzZV9wYWdl cyhwdmVjLCBwaW5uZWQpOwo+ICtvdXRfcHZlYzoKPiArCWt2ZnJlZShwdmVjKTsKPiArCXJldHVy biBlcnI7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXMo c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKPiArewo+ICsJc3RydWN0IG1tX3N0cnVj dCAqbW0gPSBvYmotPnVzZXJwdHIubW0tPm1tOwo+ICsJaW50IGVycjsKPiArCj4gKwkvKgo+ICsJ ICogSWYgdXNlcnNwYWNlIHNob3VsZCBlbmdpbmVlciB0aGF0IHRoZXNlIHBhZ2VzIGFyZSByZXBs YWNlZCBpbgo+ICAgCSAqIHRoZSB2bWEgYmV0d2VlbiB1cyBiaW5kaW5nIHRoaXMgcGFnZSBpbnRv IHRoZSBHVFQgYW5kIGNvbXBsZXRpb24KPiAgIAkgKiBvZiByZW5kZXJpbmcuLi4gVGhlaXIgbG9z cy4gSWYgdGhleSBjaGFuZ2UgdGhlIG1hcHBpbmcgb2YgdGhlaXIKPiAgIAkgKiBwYWdlcyB0aGV5 IG5lZWQgdG8gY3JlYXRlIGEgbmV3IGJvIHRvIHBvaW50IHRvIHRoZSBuZXcgdm1hLgo+IEBAIC02 MjAsNDAgKzY4MiwyNCBAQCBzdGF0aWMgaW50IGk5MTVfZ2VtX3VzZXJwdHJfZ2V0X3BhZ2VzKHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCj4gICAJCQlyZXR1cm4gLUVBR0FJTjsKPiAg IAl9Cj4gICAKPiAtCXB2ZWMgPSBOVUxMOwo+IC0JcGlubmVkID0gMDsKPiArCWlmIChtbSA9PSBj dXJyZW50LT5tbSAmJiB0cnlfZmFzdF9ndXAob2JqKSA9PSAwKQo+ICsJCXJldHVybiAwOwo+ICAg Cj4gLQlpZiAobW0gPT0gY3VycmVudC0+bW0pIHsKPiAtCQlwdmVjID0ga3ZtYWxsb2NfYXJyYXko bnVtX3BhZ2VzLCBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCj4gLQkJCQkgICAgICBHRlBfS0VSTkVM IHwKPiAtCQkJCSAgICAgIF9fR0ZQX05PUkVUUlkgfAo+IC0JCQkJICAgICAgX19HRlBfTk9XQVJO KTsKPiAtCQlpZiAocHZlYykgLyogZGVmZXIgdG8gd29ya2VyIGlmIG1hbGxvYyBmYWlscyAqLwo+ IC0JCQlwaW5uZWQgPSBfX2dldF91c2VyX3BhZ2VzX2Zhc3Qob2JqLT51c2VycHRyLnB0ciwKPiAt CQkJCQkJICAgICAgIG51bV9wYWdlcywKPiAtCQkJCQkJICAgICAgICFpOTE1X2dlbV9vYmplY3Rf aXNfcmVhZG9ubHkob2JqKSwKPiAtCQkJCQkJICAgICAgIHB2ZWMpOwo+IC0JfQo+ICsJLyogbG9j a2RlcCBkb2Vzbid0IHlldCBhdXRvbWF0aWNhbGx5IGFsbG93IG5lc3Rpbmcgb2YgcmVhZGVycyAq Lwo+ICsJZG93bl9yZWFkX25lc3RlZCgmbW0tPm1tYXBfc2VtLCBTSU5HTEVfREVQVEhfTkVTVElO Ryk7Cj4gICAKPiAtCWFjdGl2ZSA9IGZhbHNlOwo+IC0JaWYgKHBpbm5lZCA8IDApIHsKPiAtCQlw YWdlcyA9IEVSUl9QVFIocGlubmVkKTsKPiAtCQlwaW5uZWQgPSAwOwo+IC0JfSBlbHNlIGlmIChw aW5uZWQgPCBudW1fcGFnZXMpIHsKPiAtCQlwYWdlcyA9IF9faTkxNV9nZW1fdXNlcnB0cl9nZXRf cGFnZXNfc2NoZWR1bGUob2JqKTsKPiAtCQlhY3RpdmUgPSBwYWdlcyA9PSBFUlJfUFRSKC1FQUdB SU4pOwo+IC0JfSBlbHNlIHsKPiAtCQlwYWdlcyA9IF9faTkxNV9nZW1fdXNlcnB0cl9hbGxvY19w YWdlcyhvYmosIHB2ZWMsIG51bV9wYWdlcyk7Cj4gLQkJYWN0aXZlID0gIUlTX0VSUihwYWdlcyk7 Cj4gLQl9Cj4gLQlpZiAoYWN0aXZlKQo+ICsJZXJyID0gcHJvYmVfcmFuZ2UobW0sIG9iai0+dXNl cnB0ci5wdHIsIG9iai0+YmFzZS5zaXplKTsKClN0aWNrIGEgY29tbWVudCBoZXJlIGFib3V0IGhv dyB0aGUgcHJvYmUgaXMgbm90IGEgZ3VhcmFudGVlIHRoZSBtYXBwaW5nIAp3b24ndCBjaGFuZ2Ug YnkgdGhlIHRpbWUgZ3VwIHdvcmtlciBydW5zLgoKPiArCWlmIChlcnIpCj4gKwkJZ290byBlcnJf dW5sb2NrOwo+ICsKPiArCWVyciA9IF9faTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXNfc2NoZWR1 bGUob2JqKTsKPiArCWlmIChlcnIgPT0gLUVBR0FJTikKPiAgIAkJX19pOTE1X2dlbV91c2VycHRy X3NldF9hY3RpdmUob2JqLCB0cnVlKTsKPiAgIAo+IC0JaWYgKElTX0VSUihwYWdlcykpCj4gLQkJ cmVsZWFzZV9wYWdlcyhwdmVjLCBwaW5uZWQpOwo+IC0Ja3ZmcmVlKHB2ZWMpOwo+ICtlcnJfdW5s b2NrOgo+ICsJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKCk1heSBiZSBzYWZlciB0byBkcm9wIHRo ZSBsb2NrIGVhcmxpZXIsIGltbWVkaWF0ZWx5IGFmdGVyIHByb2JlLiBJIGRvbid0IApzZWUgaG9s ZGluZyBpdCB3aGlsZSBxdWV1aW5nIHRoZSB3b3JrZXIgYW5kIGRvaW5nIGludGVybmFsIGJvb2st a2VlcGluZyAKaXMgdXNlZnVsIGFuZCBtaWdodCBqdXN0IGNyZWF0ZSBtb3JlIGxvY2sgY2hhaW4g ZGVwZW5kZW5jaWVzLgoKUmVnYXJkcywKClR2cnRrbwoKPiAgIAo+IC0JcmV0dXJuIFBUUl9FUlJf T1JfWkVSTyhwYWdlcyk7Cj4gKwlyZXR1cm4gZXJyOwo+ICAgfQo+ICAgCj4gICBzdGF0aWMgdm9p ZAo+IApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRl bC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6 Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK