From mboxrd@z Thu Jan 1 00:00:00 1970 From: Roger Pau Monne Subject: [PATCH v2 09/30] x86/vtd: fix and simplify mapping RMRR regions Date: Tue, 27 Sep 2016 17:57:04 +0200 Message-ID: <1474991845-27962-10-git-send-email-roger.pau@citrix.com> References: <1474991845-27962-1-git-send-email-roger.pau@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1boulw-0007Ue-7Z for xen-devel@lists.xenproject.org; Tue, 27 Sep 2016 15:58:20 +0000 In-Reply-To: <1474991845-27962-1-git-send-email-roger.pau@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: Kevin Tian , Feng Wu , George Dunlap , Andrew Cooper , Jan Beulich , boris.ostrovsky@oracle.com, Roger Pau Monne List-Id: xen-devel@lists.xenproject.org VGhlIGN1cnJlbnQgY29kZSB1c2VkIGJ5IEludGVsIFZUZCB3aWxsIG9ubHkgbWFwIFJNUlIgcmVn aW9ucyBmb3IgdGhlCmhhcmR3YXJlIGRvbWFpbiwgYnV0IHdpbGwgZmFpbCB0byBtYXAgUk1SUiBy ZWdpb25zIGZvciB1bnByaXZpbGVnZWQgZG9tYWlucwp1bmxlc3MgdGhlIHBhZ2UgdGFibGVzIGFy ZSBzaGFyZWQgYmV0d2VlbiBFUFQgYW5kIElPTU1VLiBGaXggdGhpcyBhbmQKc2ltcGxpZnkgdGhl IGNvZGUsIHJlbW92aW5nIHRoZSB7c2V0L2NsZWFyfV9pZGVudGl0eV9wMm1fZW50cnkgaGVscGVy cyBhbmQKanVzdCB1c2luZyB0aGUgbm9ybWFsIE1NSU8gbWFwcGluZyBmdW5jdGlvbnMuIEludHJv ZHVjZSBhIG5ldyBNTUlPCm1hcHBpbmcvdW5tYXBwaW5nIGhlbHBlciwgdGhhdCB0YWtlcyBjYXJl IG9mIGNoZWNraW5nIGZvciBwZW5kaW5nIElSUXMgaWYKdGhlIG1hcHBlZCByZWdpb24gaXMgYmln IGVub3VnaCB0aGF0IGl0IGNhbm5vdCBiZSBkb25lIGluIG9uZSBzaG90LgoKU2lnbmVkLW9mZi1i eTogUm9nZXIgUGF1IE1vbm7DqSA8cm9nZXIucGF1QGNpdHJpeC5jb20+Ci0tLQpDYzogR2Vvcmdl IER1bmxhcCA8Z2VvcmdlLmR1bmxhcEBldS5jaXRyaXguY29tPgpDYzogSmFuIEJldWxpY2ggPGpi ZXVsaWNoQHN1c2UuY29tPgpDYzogQW5kcmV3IENvb3BlciA8YW5kcmV3LmNvb3BlcjNAY2l0cml4 LmNvbT4KQ2M6IEtldmluIFRpYW4gPGtldmluLnRpYW5AaW50ZWwuY29tPgpDYzogRmVuZyBXdSA8 ZmVuZy53dUBpbnRlbC5jb20+Ci0tLQogeGVuL2FyY2gveDg2L21tL3AybS5jICAgICAgICAgICAg ICAgfCA4NiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB4ZW4vZHJpdmVy cy9wYXNzdGhyb3VnaC92dGQvaW9tbXUuYyB8IDIxICsrKysrLS0tLQogeGVuL2luY2x1ZGUvYXNt LXg4Ni9wMm0uaCAgICAgICAgICAgfCAgNSAtLS0KIHhlbi9pbmNsdWRlL3hlbi9wMm0tY29tbW9u LmggICAgICAgIHwgMzAgKysrKysrKysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCA0MiBpbnNlcnRp b25zKCspLCAxMDAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEveGVuL2FyY2gveDg2L21tL3Ay bS5jIGIveGVuL2FyY2gveDg2L21tL3AybS5jCmluZGV4IDk1MjZmZmYuLjQ0NDkyYWUgMTAwNjQ0 Ci0tLSBhL3hlbi9hcmNoL3g4Ni9tbS9wMm0uYworKysgYi94ZW4vYXJjaC94ODYvbW0vcDJtLmMK QEAgLTEwMjksNTYgKzEwMjksNiBAQCBpbnQgc2V0X21taW9fcDJtX2VudHJ5KHN0cnVjdCBkb21h aW4gKmQsIHVuc2lnbmVkIGxvbmcgZ2ZuLCBtZm5fdCBtZm4sCiAgICAgcmV0dXJuIHNldF90eXBl ZF9wMm1fZW50cnkoZCwgZ2ZuLCBtZm4sIG9yZGVyLCBwMm1fbW1pb19kaXJlY3QsIGFjY2Vzcyk7 CiB9CiAKLWludCBzZXRfaWRlbnRpdHlfcDJtX2VudHJ5KHN0cnVjdCBkb21haW4gKmQsIHVuc2ln bmVkIGxvbmcgZ2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJtX2FjY2Vzc190IHAy bWEsIHVuc2lnbmVkIGludCBmbGFnKQotewotICAgIHAybV90eXBlX3QgcDJtdDsKLSAgICBwMm1f YWNjZXNzX3QgYTsKLSAgICBtZm5fdCBtZm47Ci0gICAgc3RydWN0IHAybV9kb21haW4gKnAybSA9 IHAybV9nZXRfaG9zdHAybShkKTsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKCAhcGFnaW5nX21v ZGVfdHJhbnNsYXRlKHAybS0+ZG9tYWluKSApCi0gICAgewotICAgICAgICBpZiAoICFuZWVkX2lv bW11KGQpICkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gaW9tbXVfbWFw X3BhZ2UoZCwgZ2ZuLCBnZm4sIElPTU1VRl9yZWFkYWJsZXxJT01NVUZfd3JpdGFibGUpOwotICAg IH0KLQotICAgIGdmbl9sb2NrKHAybSwgZ2ZuLCAwKTsKLQotICAgIG1mbiA9IHAybS0+Z2V0X2Vu dHJ5KHAybSwgZ2ZuLCAmcDJtdCwgJmEsIDAsIE5VTEwsIE5VTEwpOwotCi0gICAgaWYgKCBwMm10 ID09IHAybV9pbnZhbGlkIHx8IHAybXQgPT0gcDJtX21taW9fZG0gKQotICAgICAgICByZXQgPSBw Mm1fc2V0X2VudHJ5KHAybSwgZ2ZuLCBfbWZuKGdmbiksIFBBR0VfT1JERVJfNEssCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgcDJtX21taW9fZGlyZWN0LCBwMm1hKTsKLSAgICBlbHNlIGlm ICggbWZuX3gobWZuKSA9PSBnZm4gJiYgcDJtdCA9PSBwMm1fbW1pb19kaXJlY3QgJiYgYSA9PSBw Mm1hICkKLSAgICB7Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFBW SCBmaXhtZTogZHVyaW5nIERvbTAgUFZIIGNvbnN0cnVjdGlvbiwgcDJtIGVudHJpZXMgYXJlIGJl aW5nIHNldAotICAgICAgICAgKiBidXQgaW9tZW0gcmVnaW9ucyBhcmUgbm90IG1hcHBlZCB3aXRo IElPTU1VLiBUaGlzIG1ha2VzIHN1cmUgdGhhdAotICAgICAgICAgKiBSTVJScyBhcmUgY29ycmVj dGx5IG1hcHBlZCB3aXRoIElPTU1VLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBpc19oYXJk d2FyZV9kb21haW4oZCkgJiYgIWlvbW11X3VzZV9oYXBfcHQoZCkgKQotICAgICAgICAgICAgcmV0 ID0gaW9tbXVfbWFwX3BhZ2UoZCwgZ2ZuLCBnZm4sIElPTU1VRl9yZWFkYWJsZXxJT01NVUZfd3Jp dGFibGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoIGZsYWcgJiBYRU5f RE9NQ1RMX0RFVl9SRE1fUkVMQVhFRCApCi0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICBl bHNlCi0gICAgICAgICAgICByZXQgPSAtRUJVU1k7Ci0gICAgICAgIHByaW50ayhYRU5MT0dfR19X QVJOSU5HCi0gICAgICAgICAgICAgICAiQ2Fubm90IHNldHVwIGlkZW50aXR5IG1hcCBkJWQ6JWx4 LCIKLSAgICAgICAgICAgICAgICIgZ2ZuIGFscmVhZHkgbWFwcGVkIHRvICVseC5cbiIsCi0gICAg ICAgICAgICAgICBkLT5kb21haW5faWQsIGdmbiwgbWZuX3gobWZuKSk7Ci0gICAgfQotCi0gICAg Z2ZuX3VubG9jayhwMm0sIGdmbiwgMCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogLyoKICAqIFJl dHVybnM6CiAgKiAgICAwICAgICAgICBmb3Igc3VjY2VzcwpAQCAtMTEyNyw0MiArMTA3Nyw2IEBA IGludCBjbGVhcl9tbWlvX3AybV9lbnRyeShzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25n IGdmbiwgbWZuX3QgbWZuLAogICAgIHJldHVybiByYzsKIH0KIAotaW50IGNsZWFyX2lkZW50aXR5 X3AybV9lbnRyeShzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIGdmbikKLXsKLSAgICBw Mm1fdHlwZV90IHAybXQ7Ci0gICAgcDJtX2FjY2Vzc190IGE7Ci0gICAgbWZuX3QgbWZuOwotICAg IHN0cnVjdCBwMm1fZG9tYWluICpwMm0gPSBwMm1fZ2V0X2hvc3RwMm0oZCk7Ci0gICAgaW50IHJl dDsKLQotICAgIGlmICggIXBhZ2luZ19tb2RlX3RyYW5zbGF0ZShkKSApCi0gICAgewotICAgICAg ICBpZiAoICFuZWVkX2lvbW11KGQpICkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBy ZXR1cm4gaW9tbXVfdW5tYXBfcGFnZShkLCBnZm4pOwotICAgIH0KLQotICAgIGdmbl9sb2NrKHAy bSwgZ2ZuLCAwKTsKLQotICAgIG1mbiA9IHAybS0+Z2V0X2VudHJ5KHAybSwgZ2ZuLCAmcDJtdCwg JmEsIDAsIE5VTEwsIE5VTEwpOwotICAgIGlmICggcDJtdCA9PSBwMm1fbW1pb19kaXJlY3QgJiYg bWZuX3gobWZuKSA9PSBnZm4gKQotICAgIHsKLSAgICAgICAgcmV0ID0gcDJtX3NldF9lbnRyeShw Mm0sIGdmbiwgSU5WQUxJRF9NRk4sIFBBR0VfT1JERVJfNEssCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgcDJtX2ludmFsaWQsIHAybS0+ZGVmYXVsdF9hY2Nlc3MpOwotICAgICAgICBnZm5f dW5sb2NrKHAybSwgZ2ZuLCAwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZ2Zu X3VubG9jayhwMm0sIGdmbiwgMCk7Ci0gICAgICAgIHByaW50ayhYRU5MT0dfR19XQVJOSU5HCi0g ICAgICAgICAgICAgICAibm9uLWlkZW50aXR5IG1hcCBkJWQ6JWx4IG5vdCBjbGVhcmVkIChtYXBw ZWQgdG8gJWx4KVxuIiwKLSAgICAgICAgICAgICAgIGQtPmRvbWFpbl9pZCwgZ2ZuLCBtZm5feCht Zm4pKTsKLSAgICAgICAgcmV0ID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCiAv KiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzLCAtZXJybm8gZm9yIGZhaWx1cmUgKi8KIGludCBzZXRf c2hhcmVkX3AybV9lbnRyeShzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIGdmbiwgbWZu X3QgbWZuKQogewpkaWZmIC0tZ2l0IGEveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvdnRkL2lvbW11 LmMgYi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC92dGQvaW9tbXUuYwppbmRleCA5MTk5OTNlLi43 MTRhMTllIDEwMDY0NAotLS0gYS94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC92dGQvaW9tbXUuYwor KysgYi94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC92dGQvaW9tbXUuYwpAQCAtMTg5Niw2ICsxODk2 LDcgQEAgc3RhdGljIGludCBybXJyX2lkZW50aXR5X21hcHBpbmcoc3RydWN0IGRvbWFpbiAqZCwg Ym9vbF90IG1hcCwKICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSBQQUdFX0FMSUdOXzRLKHJt cnItPmVuZF9hZGRyZXNzKSA+PiBQQUdFX1NISUZUXzRLOwogICAgIHN0cnVjdCBtYXBwZWRfcm1y ciAqbXJtcnI7CiAgICAgc3RydWN0IGRvbWFpbl9pb21tdSAqaGQgPSBkb21faW9tbXUoZCk7Cisg ICAgaW50IHJldCA9IDA7CiAKICAgICBBU1NFUlQocGNpZGV2c19sb2NrZWQoKSk7CiAgICAgQVNT RVJUKHJtcnItPmJhc2VfYWRkcmVzcyA8IHJtcnItPmVuZF9hZGRyZXNzKTsKQEAgLTE5MDksOCAr MTkxMCw2IEBAIHN0YXRpYyBpbnQgcm1ycl9pZGVudGl0eV9tYXBwaW5nKHN0cnVjdCBkb21haW4g KmQsIGJvb2xfdCBtYXAsCiAgICAgICAgIGlmICggbXJtcnItPmJhc2UgPT0gcm1yci0+YmFzZV9h ZGRyZXNzICYmCiAgICAgICAgICAgICAgbXJtcnItPmVuZCA9PSBybXJyLT5lbmRfYWRkcmVzcyAp CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCByZXQgPSAwOwotCiAgICAgICAgICAgICBpZiAo IG1hcCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgKyttcm1yci0+Y291bnQ7CkBA IC0xOTIwLDkgKzE5MTksMTAgQEAgc3RhdGljIGludCBybXJyX2lkZW50aXR5X21hcHBpbmcoc3Ry dWN0IGRvbWFpbiAqZCwgYm9vbF90IG1hcCwKICAgICAgICAgICAgIGlmICggLS1tcm1yci0+Y291 bnQgKQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgICAgICB3aGlsZSAoIGJh c2VfcGZuIDwgZW5kX3BmbiApCisgICAgICAgICAgICByZXQgPSBtb2RpZnlfbW1pb18xMShkLCBi YXNlX3BmbiwgZW5kX3BmbiAtIGJhc2VfcGZuLCBmYWxzZSk7CisgICAgICAgICAgICB3aGlsZSAo ICFpb21tdV91c2VfaGFwX3B0KGQpICYmIGJhc2VfcGZuIDwgZW5kX3BmbiApCiAgICAgICAgICAg ICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjbGVhcl9pZGVudGl0eV9wMm1fZW50cnkoZCwgYmFz ZV9wZm4pICkKKyAgICAgICAgICAgICAgICBpZiAoIGlvbW11X3VubWFwX3BhZ2UoZCwgYmFzZV9w Zm4pICkKICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVOWElPOwogICAgICAgICAgICAgICAg IGJhc2VfcGZuKys7CiAgICAgICAgICAgICB9CkBAIC0xOTM2LDEyICsxOTM2LDE1IEBAIHN0YXRp YyBpbnQgcm1ycl9pZGVudGl0eV9tYXBwaW5nKHN0cnVjdCBkb21haW4gKmQsIGJvb2xfdCBtYXAs CiAgICAgaWYgKCAhbWFwICkKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAKLSAgICB3aGlsZSAo IGJhc2VfcGZuIDwgZW5kX3BmbiApCisgICAgcmV0ID0gbW9kaWZ5X21taW9fMTEoZCwgYmFzZV9w Zm4sIGVuZF9wZm4gLSBiYXNlX3BmbiwgdHJ1ZSk7CisgICAgaWYgKCByZXQgKQorICAgICAgICBy ZXR1cm4gcmV0OworICAgIHdoaWxlICggIWlvbW11X3VzZV9oYXBfcHQoZCkgJiYgYmFzZV9wZm4g PCBlbmRfcGZuICkKICAgICB7Ci0gICAgICAgIGludCBlcnIgPSBzZXRfaWRlbnRpdHlfcDJtX2Vu dHJ5KGQsIGJhc2VfcGZuLCBwMm1fYWNjZXNzX3J3LCBmbGFnKTsKLQotICAgICAgICBpZiAoIGVy ciApCi0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXQgPSBpb21tdV9tYXBfcGFn ZShkLCBiYXNlX3BmbiwgYmFzZV9wZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElP TU1VRl9yZWFkYWJsZXxJT01NVUZfd3JpdGFibGUpOworICAgICAgICBpZiAoIHJldCApCisgICAg ICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBiYXNlX3BmbisrOwogICAgIH0KIApkaWZmIC0t Z2l0IGEveGVuL2luY2x1ZGUvYXNtLXg4Ni9wMm0uaCBiL3hlbi9pbmNsdWRlL2FzbS14ODYvcDJt LmgKaW5kZXggNzAzNTg2MC4uY2NmMTllNSAxMDA2NDQKLS0tIGEveGVuL2luY2x1ZGUvYXNtLXg4 Ni9wMm0uaAorKysgYi94ZW4vaW5jbHVkZS9hc20teDg2L3AybS5oCkBAIC02MDIsMTEgKzYwMiw2 IEBAIGludCBzZXRfbW1pb19wMm1fZW50cnkoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9u ZyBnZm4sIG1mbl90IG1mbiwKIGludCBjbGVhcl9tbWlvX3AybV9lbnRyeShzdHJ1Y3QgZG9tYWlu ICpkLCB1bnNpZ25lZCBsb25nIGdmbiwgbWZuX3QgbWZuLAogICAgICAgICAgICAgICAgICAgICAg ICAgIHVuc2lnbmVkIGludCBvcmRlcik7CiAKLS8qIFNldCBpZGVudGl0eSBhZGRyZXNzZXMgaW4g dGhlIHAybSB0YWJsZSAoZm9yIHBhc3MtdGhyb3VnaCkgKi8KLWludCBzZXRfaWRlbnRpdHlfcDJt X2VudHJ5KHN0cnVjdCBkb21haW4gKmQsIHVuc2lnbmVkIGxvbmcgZ2ZuLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgcDJtX2FjY2Vzc190IHAybWEsIHVuc2lnbmVkIGludCBmbGFnKTsKLWlu dCBjbGVhcl9pZGVudGl0eV9wMm1fZW50cnkoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9u ZyBnZm4pOwotCiAvKiBBZGQgZm9yZWlnbiBtYXBwaW5nIHRvIHRoZSBndWVzdCdzIHAybSB0YWJs ZS4gKi8KIGludCBwMm1fYWRkX2ZvcmVpZ24oc3RydWN0IGRvbWFpbiAqdGRvbSwgdW5zaWduZWQg bG9uZyBmZ2ZuLAogICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGdwZm4sIGRvbWlk X3QgZm9yZWlnbl9kb21pZCk7CmRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS94ZW4vcDJtLWNvbW1v bi5oIGIveGVuL2luY2x1ZGUveGVuL3AybS1jb21tb24uaAppbmRleCAzYmUxZTkxLi41ZjZiNGVm IDEwMDY0NAotLS0gYS94ZW4vaW5jbHVkZS94ZW4vcDJtLWNvbW1vbi5oCisrKyBiL3hlbi9pbmNs dWRlL3hlbi9wMm0tY29tbW9uLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9YRU5fUDJNX0NP TU1PTl9ICiAKICNpbmNsdWRlIDxwdWJsaWMvdm1fZXZlbnQuaD4KKyNpbmNsdWRlIDx4ZW4vc29m dGlycS5oPgogCiAvKgogICogQWRkaXRpb25hbCBhY2Nlc3MgdHlwZXMsIHdoaWNoIGFyZSB1c2Vk IHRvIGZ1cnRoZXIgcmVzdHJpY3QKQEAgLTQ2LDYgKzQ3LDM1IEBAIGludCB1bm1hcF9tbWlvX3Jl Z2lvbnMoc3RydWN0IGRvbWFpbiAqZCwKICAgICAgICAgICAgICAgICAgICAgICAgbWZuX3QgbWZu KTsKIAogLyoKKyAqIFByZWVtcHRpdmUgSGVscGVyIGZvciBtYXBwaW5nL3VubWFwcGluZyBNTUlP IHJlZ2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG1vZGlmeV9tbWlvXzExKHN0cnVjdCBk b21haW4gKmQsIHVuc2lnbmVkIGxvbmcgcGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgYm9vbCBtYXApCit7CisgICAgaW50IHJjOwor CisgICAgd2hpbGUgKCBucl9wYWdlcyA+IDAgKQorICAgIHsKKyAgICAgICAgcmMgPSAobWFwID8g bWFwX21taW9fcmVnaW9ucyA6IHVubWFwX21taW9fcmVnaW9ucykKKyAgICAgICAgICAgICAoZCwg X2dmbihwZm4pLCBucl9wYWdlcywgX21mbihwZm4pKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkK KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIHJjIDwgMCApCisgICAgICAgIHsKKyAg ICAgICAgICAgIHByaW50ayhYRU5MT0dfRVJSCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byAl c21hcCAlI2x4IC0gJSNseCBpbnRvIGRvbWFpbiAlZCBtZW1vcnkgbWFwOiAlZFxuIiwKKyAgICAg ICAgICAgICAgICAgICBtYXAgPyAiIiA6ICJ1biIsIHBmbiwgcGZuICsgbnJfcGFnZXMsIGQtPmRv bWFpbl9pZCwgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAg IG5yX3BhZ2VzIC09IHJjOworICAgICAgICBwZm4gKz0gcmM7CisgICAgICAgIHByb2Nlc3NfcGVu ZGluZ19zb2Z0aXJxcygpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoKICAqIFNl dCBhY2Nlc3MgdHlwZSBmb3IgYSByZWdpb24gb2YgZ2Zucy4KICAqIElmIGdmbiA9PSBJTlZBTElE X0dGTiwgc2V0cyB0aGUgZGVmYXVsdCBhY2Nlc3MgdHlwZS4KICAqLwotLSAKMi43LjQgKEFwcGxl IEdpdC02NikKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8v bGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK