From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH v2 1/6] drm/i915: Eliminate vmap overhead for cmd parser Date: Fri, 20 Nov 2015 10:55:56 +0000 Message-ID: <1448016961-25331-2-git-send-email-chris@chris-wilson.co.uk> References: <1448016961-25331-1-git-send-email-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fireflyinternet.com (mail.fireflyinternet.com [87.106.93.118]) by gabe.freedesktop.org (Postfix) with ESMTP id 9B26C6EA9D for ; Fri, 20 Nov 2015 02:56:14 -0800 (PST) In-Reply-To: <1448016961-25331-1-git-send-email-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org V2l0aCBhIGxpdHRsZSBjb21wbGV4aXR5IHRvIGhhbmRsZSBjbWRzIHN0cmFkZGxpbmcgcGFnZSBi b3VuZGFyaWVzLCB3ZQpjYW4gY29tcGxldGVseSBhdm9pZGluZyBoYXZpbmcgdG8gdm1hcCB0aGUg YmF0Y2ggYW5kIHRoZSBzaGFkb3cgYmF0Y2gKb2JqZWN0cyB3aGlsc3QgcnVubmluZyB0aGUgY29t bWFuZCBwYXJzZXIuCgpPbiBpdmIgaTctMzcyME1ROgoKeDExcGVyZiAtZG90IGJlZm9yZSA1NC4z TSwgYWZ0ZXIgNTMuMk0gKG1heCAyMDNNKQpnbHhnZWFycyBiZWZvcmUgNzExMCBmcHMsIGFmdGVy IDczMDAgZnBzIChtYXggNzg2MCBmcHMpCgpCZWZvcmU6ClRpbWUgdG8gYmx0IDE2Mzg0IGJ5dGVz IHggICAgICAxOgkgMTIuNDAwwrVzLCAxLjJHaUIvcwpUaW1lIHRvIGJsdCAxNjM4NCBieXRlcyB4 ICAgNDA5NjoJICAzLjA1NcK1cywgNS4wR2lCL3MKCkFmdGVyOgpUaW1lIHRvIGJsdCAxNjM4NCBi eXRlcyB4ICAgICAgMToJICA4LjYwMMK1cywgMS44R2lCL3MKVGltZSB0byBibHQgMTYzODQgYnl0 ZXMgeCAgIDQwOTY6CSAgMi40NTbCtXMsIDYuMkdpQi9zCgpSZW1vdmluZyB0aGUgdm1hcCBpcyBt b3N0bHkgYSB3aW4sIGV4Y2VwdCB3ZSBsb3NlIGluIGEgZmV3IGNhc2VzIHdoZXJlCnRoZSBiYXRj aCBzaXplIGlzIGdyZWF0ZXIgdGhhbiBhIHBhZ2UgZHVlIHRvIHRoZSBleHRyYSBjb21wbGV4aXR5 IChsb3NzCm9mIGEgc2ltcGxlIGNhY2hlIGVmZmljaWVudCBsYXJnZSBjb3B5LCBhbmQgYm91bmRh cnkgaGFuZGxpbmcpLgoKdjI6IFJlb3JkZXIgc28gdGhhdCB3ZSBkbyBjaGVjayBvYWNvbnRyb2wg cmVtYWluaW5nIHNldCBhdCBlbmQtb2YtYmF0Y2gKdjM6IFN0YWdlIHRoZSBjb3B5IHRocm91Z2gg YSB0ZW1wb3JhcnkgcGFnZSBzbyB0aGF0IHdlIG9ubHkgY29weSBpbnRvCmRzdCBjb21tYW5kcyB0 aGF0IGhhdmUgYmVlbiB2ZXJpZmllZC4KClNpZ25lZC1vZmYtYnk6IENocmlzIFdpbHNvbiA8Y2hy aXNAY2hyaXMtd2lsc29uLmNvLnVrPgpDYzogVmlsbGUgU3lyasOkbMOkIDx2aWxsZS5zeXJqYWxh QGxpbnV4LmludGVsLmNvbT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2NtZF9wYXJz ZXIuYyB8IDMwNSArKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFu Z2VkLCAxNTMgaW5zZXJ0aW9ucygrKSwgMTUyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfY21kX3BhcnNlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9jbWRfcGFyc2VyLmMKaW5kZXggODE0ZDg5NGVkOTI1Li5kYjNhMDRlYTAzNmEgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfY21kX3BhcnNlci5jCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfY21kX3BhcnNlci5jCkBAIC04NjAsMTAwICs4NjAsNiBA QCBmaW5kX3JlZyhjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfcmVnX2Rlc2NyaXB0b3IgKnRhYmxlLAog CXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdTMyICp2bWFwX2JhdGNoKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmosCi0JCSAgICAgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVu KQotewotCWludCBpOwotCXZvaWQgKmFkZHIgPSBOVUxMOwotCXN0cnVjdCBzZ19wYWdlX2l0ZXIg c2dfaXRlcjsKLQlpbnQgZmlyc3RfcGFnZSA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7Ci0JaW50IGxh c3RfcGFnZSA9IChsZW4gKyBzdGFydCArIDQwOTUpID4+IFBBR0VfU0hJRlQ7Ci0JaW50IG5wYWdl cyA9IGxhc3RfcGFnZSAtIGZpcnN0X3BhZ2U7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlczsKLQotCXBh Z2VzID0gZHJtX21hbGxvY19hYihucGFnZXMsIHNpemVvZigqcGFnZXMpKTsKLQlpZiAocGFnZXMg PT0gTlVMTCkgewotCQlEUk1fREVCVUdfRFJJVkVSKCJGYWlsZWQgdG8gZ2V0IHNwYWNlIGZvciBw YWdlc1xuIik7Ci0JCWdvdG8gZmluaXNoOwotCX0KLQotCWkgPSAwOwotCWZvcl9lYWNoX3NnX3Bh Z2Uob2JqLT5wYWdlcy0+c2dsLCAmc2dfaXRlciwgb2JqLT5wYWdlcy0+bmVudHMsIGZpcnN0X3Bh Z2UpIHsKLQkJcGFnZXNbaSsrXSA9IHNnX3BhZ2VfaXRlcl9wYWdlKCZzZ19pdGVyKTsKLQkJaWYg KGkgPT0gbnBhZ2VzKQotCQkJYnJlYWs7Ci0JfQotCi0JYWRkciA9IHZtYXAocGFnZXMsIGksIDAs IFBBR0VfS0VSTkVMKTsKLQlpZiAoYWRkciA9PSBOVUxMKSB7Ci0JCURSTV9ERUJVR19EUklWRVIo IkZhaWxlZCB0byB2bWFwIHBhZ2VzXG4iKTsKLQkJZ290byBmaW5pc2g7Ci0JfQotCi1maW5pc2g6 Ci0JaWYgKHBhZ2VzKQotCQlkcm1fZnJlZV9sYXJnZShwYWdlcyk7Ci0JcmV0dXJuICh1MzIqKWFk ZHI7Ci19Ci0KLS8qIFJldHVybnMgYSB2bWFwJ2QgcG9pbnRlciB0byBkZXN0X29iaiwgd2hpY2gg dGhlIGNhbGxlciBtdXN0IHVubWFwICovCi1zdGF0aWMgdTMyICpjb3B5X2JhdGNoKHN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpkZXN0X29iaiwKLQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpzcmNfb2JqLAotCQkgICAgICAgdTMyIGJhdGNoX3N0YXJ0X29mZnNldCwKLQkJ ICAgICAgIHUzMiBiYXRjaF9sZW4pCi17Ci0JaW50IG5lZWRzX2NsZmx1c2ggPSAwOwotCXZvaWQg KnNyY19iYXNlLCAqc3JjOwotCXZvaWQgKmRzdCA9IE5VTEw7Ci0JaW50IHJldDsKLQotCWlmIChi YXRjaF9sZW4gPiBkZXN0X29iai0+YmFzZS5zaXplIHx8Ci0JICAgIGJhdGNoX2xlbiArIGJhdGNo X3N0YXJ0X29mZnNldCA+IHNyY19vYmotPmJhc2Uuc2l6ZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUUy QklHKTsKLQotCWlmIChXQVJOX09OKGRlc3Rfb2JqLT5wYWdlc19waW5fY291bnQgPT0gMCkpCi0J CXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCi0JcmV0ID0gaTkxNV9nZW1fb2JqX3ByZXBhcmVf c2htZW1fcmVhZChzcmNfb2JqLCAmbmVlZHNfY2xmbHVzaCk7Ci0JaWYgKHJldCkgewotCQlEUk1f REVCVUdfRFJJVkVSKCJDTUQ6IGZhaWxlZCB0byBwcmVwYXJlIHNoYWRvdyBiYXRjaFxuIik7Ci0J CXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQotCi0Jc3JjX2Jhc2UgPSB2bWFwX2JhdGNoKHNyY19v YmosIGJhdGNoX3N0YXJ0X29mZnNldCwgYmF0Y2hfbGVuKTsKLQlpZiAoIXNyY19iYXNlKSB7Ci0J CURSTV9ERUJVR19EUklWRVIoIkNNRDogRmFpbGVkIHRvIHZtYXAgYmF0Y2hcbiIpOwotCQlyZXQg PSAtRU5PTUVNOwotCQlnb3RvIHVucGluX3NyYzsKLQl9Ci0KLQlyZXQgPSBpOTE1X2dlbV9vYmpl Y3Rfc2V0X3RvX2NwdV9kb21haW4oZGVzdF9vYmosIHRydWUpOwotCWlmIChyZXQpIHsKLQkJRFJN X0RFQlVHX0RSSVZFUigiQ01EOiBGYWlsZWQgdG8gc2V0IHNoYWRvdyBiYXRjaCB0byBDUFVcbiIp OwotCQlnb3RvIHVubWFwX3NyYzsKLQl9Ci0KLQlkc3QgPSB2bWFwX2JhdGNoKGRlc3Rfb2JqLCAw LCBiYXRjaF9sZW4pOwotCWlmICghZHN0KSB7Ci0JCURSTV9ERUJVR19EUklWRVIoIkNNRDogRmFp bGVkIHRvIHZtYXAgc2hhZG93IGJhdGNoXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byB1 bm1hcF9zcmM7Ci0JfQotCi0Jc3JjID0gc3JjX2Jhc2UgKyBvZmZzZXRfaW5fcGFnZShiYXRjaF9z dGFydF9vZmZzZXQpOwotCWlmIChuZWVkc19jbGZsdXNoKQotCQlkcm1fY2xmbHVzaF92aXJ0X3Jh bmdlKHNyYywgYmF0Y2hfbGVuKTsKLQotCW1lbWNweShkc3QsIHNyYywgYmF0Y2hfbGVuKTsKLQot dW5tYXBfc3JjOgotCXZ1bm1hcChzcmNfYmFzZSk7Ci11bnBpbl9zcmM6Ci0JaTkxNV9nZW1fb2Jq ZWN0X3VucGluX3BhZ2VzKHNyY19vYmopOwotCi0JcmV0dXJuIHJldCA/IEVSUl9QVFIocmV0KSA6 IGRzdDsKLX0KLQogLyoqCiAgKiBpOTE1X25lZWRzX2NtZF9wYXJzZXIoKSAtIHNob3VsZCBhIGdp dmVuIHJpbmcgdXNlIHNvZnR3YXJlIGNvbW1hbmQgcGFyc2luZz8KICAqIEByaW5nOiB0aGUgcmlu ZyBpbiBxdWVzdGlvbgpAQCAtMTA5Nyw2ICsxMDAzLDcgQEAgc3RhdGljIGJvb2wgY2hlY2tfY21k KGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCiB9CiAKICNkZWZpbmUgTEVOR1RI X0JJQVMgMgorI2RlZmluZSBNQVhfUEFSVElBTCAyNTYKIAogLyoqCiAgKiBpOTE1X3BhcnNlX2Nt ZHMoKSAtIHBhcnNlIGEgc3VibWl0dGVkIGJhdGNoIGJ1ZmZlciBmb3IgcHJpdmlsZWdlIHZpb2xh dGlvbnMKQEAgLTExMjAsODYgKzEwMjcsMTgwIEBAIGludCBpOTE1X3BhcnNlX2NtZHMoc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqcmluZywKIAkJICAgIHUzMiBiYXRjaF9sZW4sCiAJCSAgICBib29s IGlzX21hc3RlcikKIHsKLQl1MzIgKmNtZCwgKmJhdGNoX2Jhc2UsICpiYXRjaF9lbmQ7CisJY29u c3Qgc3RydWN0IGRybV9pOTE1X2NtZF9kZXNjcmlwdG9yICpkZXNjOworCXVuc2lnbmVkIGRzdF9p dGVyLCBzcmNfaXRlcjsKKwlpbnQgbmVlZHNfY2xmbHVzaCA9IDA7CisJc3RydWN0IGdldF9wYWdl IHJld2luZDsKKwl2b2lkICpzcmMsICpkc3QsICp0bXA7CisJdTMyIHBhcnRpYWwsIGxlbmd0aDsK Kwl1bnNpZ25lZCBpbiwgb3V0OwogCXN0cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvciBkZWZh dWx0X2Rlc2MgPSB7IDAgfTsKIAlib29sIG9hY29udHJvbF9zZXQgPSBmYWxzZTsgLyogT0FDT05U Uk9MIHRyYWNraW5nLiBTZWUgY2hlY2tfY21kKCkgKi8KIAlpbnQgcmV0ID0gMDsKIAotCWJhdGNo X2Jhc2UgPSBjb3B5X2JhdGNoKHNoYWRvd19iYXRjaF9vYmosIGJhdGNoX29iaiwKLQkJCQliYXRj aF9zdGFydF9vZmZzZXQsIGJhdGNoX2xlbik7Ci0JaWYgKElTX0VSUihiYXRjaF9iYXNlKSkgewot CQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6IEZhaWxlZCB0byBjb3B5IGJhdGNoXG4iKTsKLQkJcmV0 dXJuIFBUUl9FUlIoYmF0Y2hfYmFzZSk7CisJaWYgKGJhdGNoX2xlbiA+IHNoYWRvd19iYXRjaF9v YmotPmJhc2Uuc2l6ZSB8fAorCSAgICBiYXRjaF9sZW4gKyBiYXRjaF9zdGFydF9vZmZzZXQgPiBi YXRjaF9vYmotPmJhc2Uuc2l6ZSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCWlmIChXQVJOX09OKHNo YWRvd19iYXRjaF9vYmotPnBhZ2VzX3Bpbl9jb3VudCA9PSAwKSkKKwkJcmV0dXJuIC1FTk9ERVY7 CisKKwlyZXQgPSBpOTE1X2dlbV9vYmpfcHJlcGFyZV9zaG1lbV9yZWFkKGJhdGNoX29iaiwgJm5l ZWRzX2NsZmx1c2gpOworCWlmIChyZXQpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiQ01EOiBmYWls ZWQgdG8gcHJlcGFyZSBzaGFkb3cgYmF0Y2hcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJl dCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbihzaGFkb3dfYmF0Y2hfb2JqLCB0 cnVlKTsKKwlpZiAocmV0KSB7CisJCURSTV9ERUJVR19EUklWRVIoIkNNRDogRmFpbGVkIHRvIHNl dCBzaGFkb3cgYmF0Y2ggdG8gQ1BVXG4iKTsKKwkJZ290byB1bnBpbjsKIAl9CiAKKwl0bXAgPSBr bWFsbG9jKFBBR0VfU0laRSArIE1BWF9QQVJUSUFMLCBHRlBfS0VSTkVMKTsKKwlpZiAodG1wID09 IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyoKIAkgKiBXZSB1c2UgdGhlIGJhdGNoIGxl bmd0aCBhcyBzaXplIGJlY2F1c2UgdGhlIHNoYWRvdyBvYmplY3QgaXMgYXMKIAkgKiBsYXJnZSBv ciBsYXJnZXIgYW5kIGNvcHlfYmF0Y2goKSB3aWxsIHdyaXRlIE1JX05PUHMgdG8gdGhlIGV4dHJh CiAJICogc3BhY2UuIFBhcnNpbmcgc2hvdWxkIGJlIGZhc3RlciBpbiBzb21lIGNhc2VzIHRoaXMg d2F5LgogCSAqLwotCWJhdGNoX2VuZCA9IGJhdGNoX2Jhc2UgKyAoYmF0Y2hfbGVuIC8gc2l6ZW9m KCpiYXRjaF9lbmQpKTsKKwlyZXQgPSAtRUlOVkFMOworCXJld2luZCA9IGJhdGNoX29iai0+Z2V0 X3BhZ2U7CisKKwlkc3RfaXRlciA9IDA7CisJZHN0ID0ga21hcF9hdG9taWMoaTkxNV9nZW1fb2Jq ZWN0X2dldF9wYWdlKHNoYWRvd19iYXRjaF9vYmosIGRzdF9pdGVyKSk7CisJb3V0ID0gMDsKKwor CWluID0gb2Zmc2V0X2luX3BhZ2UoYmF0Y2hfc3RhcnRfb2Zmc2V0KTsKKwlwYXJ0aWFsID0gMDsK Kwlmb3IgKHNyY19pdGVyID0gYmF0Y2hfc3RhcnRfb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CisJICAg ICBzcmNfaXRlciA8IGJhdGNoX29iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CisJICAgICBz cmNfaXRlcisrKSB7CisJCXUzMiAqY21kLCAqcGFnZV9lbmQsICpiYXRjaF9lbmQ7CisJCXUzMiB0 aGlzOworCisJCXRoaXMgPSBiYXRjaF9sZW47CisJCWlmICh0aGlzID4gUEFHRV9TSVpFIC0gaW4p CisJCQl0aGlzID0gUEFHRV9TSVpFIC0gaW47CisKKwkJc3JjID0ga21hcF9hdG9taWMoaTkxNV9n ZW1fb2JqZWN0X2dldF9wYWdlKGJhdGNoX29iaiwgc3JjX2l0ZXIpKTsKKwkJaWYgKG5lZWRzX2Ns Zmx1c2gpCisJCQlkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKHNyYyArIGluLCB0aGlzKTsKKworCQlp ZiAodGhpcyA9PSBQQUdFX1NJWkUgJiYgcGFydGlhbCA9PSAwKQorCQkJY29weV9wYWdlKHRtcCwg c3JjKTsKKwkJZWxzZQorCQkJbWVtY3B5KHRtcCtwYXJ0aWFsLCBzcmMraW4sIHRoaXMpOworCisJ CWNtZCA9IHRtcDsKKwkJcGFnZV9lbmQgPSB0bXAgKyB0aGlzICsgcGFydGlhbDsKKwkJYmF0Y2hf ZW5kID0gdG1wICsgYmF0Y2hfbGVuICsgcGFydGlhbDsKKwkJcGFydGlhbCA9IDA7CisKKwkJZG8g eworCQkJaWYgKCpjbWQgPT0gTUlfQkFUQ0hfQlVGRkVSX0VORCkgeworCQkJCWlmIChvYWNvbnRy b2xfc2V0KSB7CisJCQkJCURSTV9ERUJVR19EUklWRVIoIkNNRDogYmF0Y2ggc2V0IE9BQ09OVFJP TCBidXQgZGlkIG5vdCBjbGVhciBpdFxuIik7CisJCQkJCWdvdG8gdW5tYXA7CisJCQkJfQogCi0J Y21kID0gYmF0Y2hfYmFzZTsKLQl3aGlsZSAoY21kIDwgYmF0Y2hfZW5kKSB7Ci0JCWNvbnN0IHN0 cnVjdCBkcm1faTkxNV9jbWRfZGVzY3JpcHRvciAqZGVzYzsKLQkJdTMyIGxlbmd0aDsKKwkJCQlj bWQrKzsgLyogY29weSB0aGlzIGNtZCB0byBkc3QgKi8KKwkJCQliYXRjaF9sZW4gPSB0aGlzOyAv KiBubyBtb3JlIHNyYyAqLworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CiAKLQkJaWYg KCpjbWQgPT0gTUlfQkFUQ0hfQlVGRkVSX0VORCkKLQkJCWJyZWFrOworCQkJZGVzYyA9IGZpbmRf Y21kKHJpbmcsICpjbWQsICZkZWZhdWx0X2Rlc2MpOworCQkJaWYgKCFkZXNjKSB7CisJCQkJRFJN X0RFQlVHX0RSSVZFUigiQ01EOiBVbnJlY29nbml6ZWQgY29tbWFuZDogMHglMDhYXG4iLAorCQkJ CQkJICpjbWQpOworCQkJCWdvdG8gdW5tYXA7CisJCQl9CiAKLQkJZGVzYyA9IGZpbmRfY21kKHJp bmcsICpjbWQsICZkZWZhdWx0X2Rlc2MpOwotCQlpZiAoIWRlc2MpIHsKLQkJCURSTV9ERUJVR19E UklWRVIoIkNNRDogVW5yZWNvZ25pemVkIGNvbW1hbmQ6IDB4JTA4WFxuIiwKLQkJCQkJICpjbWQp OwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9CisJCQkvKgorCQkJICogSWYgdGhl IGJhdGNoIGJ1ZmZlciBjb250YWlucyBhIGNoYWluZWQgYmF0Y2gsIHJldHVybiBhbgorCQkJICog ZXJyb3IgdGhhdCB0ZWxscyB0aGUgY2FsbGVyIHRvIGFib3J0IGFuZCBkaXNwYXRjaCB0aGUKKwkJ CSAqIHdvcmtsb2FkIGFzIGEgbm9uLXNlY3VyZSBiYXRjaC4KKwkJCSAqLworCQkJaWYgKGRlc2Mt PmNtZC52YWx1ZSA9PSBNSV9CQVRDSF9CVUZGRVJfU1RBUlQpIHsKKwkJCQlyZXQgPSAtRUFDQ0VT OworCQkJCWdvdG8gdW5tYXA7CisJCQl9CiAKLQkJLyoKLQkJICogSWYgdGhlIGJhdGNoIGJ1ZmZl ciBjb250YWlucyBhIGNoYWluZWQgYmF0Y2gsIHJldHVybiBhbgotCQkgKiBlcnJvciB0aGF0IHRl bGxzIHRoZSBjYWxsZXIgdG8gYWJvcnQgYW5kIGRpc3BhdGNoIHRoZQotCQkgKiB3b3JrbG9hZCBh cyBhIG5vbi1zZWN1cmUgYmF0Y2guCi0JCSAqLwotCQlpZiAoZGVzYy0+Y21kLnZhbHVlID09IE1J X0JBVENIX0JVRkZFUl9TVEFSVCkgewotCQkJcmV0ID0gLUVBQ0NFUzsKLQkJCWJyZWFrOwotCQl9 CisJCQlpZiAoZGVzYy0+ZmxhZ3MgJiBDTURfREVTQ19GSVhFRCkKKwkJCQlsZW5ndGggPSBkZXNj LT5sZW5ndGguZml4ZWQ7CisJCQllbHNlCisJCQkJbGVuZ3RoID0gKCgqY21kICYgZGVzYy0+bGVu Z3RoLm1hc2spICsgTEVOR1RIX0JJQVMpOwogCi0JCWlmIChkZXNjLT5mbGFncyAmIENNRF9ERVND X0ZJWEVEKQotCQkJbGVuZ3RoID0gZGVzYy0+bGVuZ3RoLmZpeGVkOwotCQllbHNlCi0JCQlsZW5n dGggPSAoKCpjbWQgJiBkZXNjLT5sZW5ndGgubWFzaykgKyBMRU5HVEhfQklBUyk7Ci0KLQkJaWYg KChiYXRjaF9lbmQgLSBjbWQpIDwgbGVuZ3RoKSB7Ci0JCQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6 IENvbW1hbmQgbGVuZ3RoIGV4Y2VlZHMgYmF0Y2ggbGVuZ3RoOiAweCUwOFggbGVuZ3RoPSV1IGJh dGNobGVuPSV0ZFxuIiwKLQkJCQkJICpjbWQsCi0JCQkJCSBsZW5ndGgsCi0JCQkJCSBiYXRjaF9l bmQgLSBjbWQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9CisJCQlpZiAodW5s aWtlbHkoY21kICsgbGVuZ3RoID4gcGFnZV9lbmQpKSB7CisJCQkJaWYgKHVubGlrZWx5KGNtZCAr IGxlbmd0aCA+IGJhdGNoX2VuZCkpIHsKKwkJCQkJRFJNX0RFQlVHX0RSSVZFUigiQ01EOiBDb21t YW5kIGxlbmd0aCBleGNlZWRzIGJhdGNoIGxlbmd0aDogMHglMDhYIGxlbmd0aD0ldSBiYXRjaGxl bj0ldGRcbiIsCisJCQkJCQkJICpjbWQsIGxlbmd0aCwgYmF0Y2hfZW5kIC0gY21kKTsKKwkJCQkJ Z290byB1bm1hcDsKKwkJCQl9CiAKLQkJaWYgKCFjaGVja19jbWQocmluZywgZGVzYywgY21kLCBs ZW5ndGgsIGlzX21hc3RlciwKLQkJCSAgICAgICAmb2Fjb250cm9sX3NldCkpIHsKLQkJCXJldCA9 IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQorCQkJCWlmIChXQVJOX09OKGxlbmd0aCA+IE1BWF9Q QVJUSUFMKSkgeworCQkJCQlyZXQgPSAtRU5PREVWOworCQkJCQlnb3RvIHVubWFwOworCQkJCX0K IAotCQljbWQgKz0gbGVuZ3RoOwotCX0KKwkJCQlwYXJ0aWFsID0gNCoocGFnZV9lbmQgLSBjbWQp OworCQkJCWJyZWFrOworCQkJfQogCi0JaWYgKG9hY29udHJvbF9zZXQpIHsKLQkJRFJNX0RFQlVH X0RSSVZFUigiQ01EOiBiYXRjaCBzZXQgT0FDT05UUk9MIGJ1dCBkaWQgbm90IGNsZWFyIGl0XG4i KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9CisJCQlpZiAoIWNoZWNrX2NtZChyaW5nLCBkZXNjLCBj bWQsIGxlbmd0aCwgaXNfbWFzdGVyLAorCQkJCSAgICAgICAmb2Fjb250cm9sX3NldCkpCisJCQkJ Z290byB1bm1hcDsKKworCQkJY21kICs9IGxlbmd0aDsKKwkJfSB3aGlsZSAoY21kIDwgcGFnZV9l bmQpOworCisJCS8qIENvcHkgdGhlIHZhbGlkYXRlZCBwYWdlIHRvIHRoZSBHUFUgYmF0Y2ggKi8K KwkJeworCQkJLyogZXhjbHVkZSBwYXJ0aWFsIGNtZCwgd2UgY29weSBpdCBuZXh0IHRpbWUgKi8K KwkJCXVuc2lnbmVkIGRzdF9sZW5ndGggPSAodm9pZCAqKWNtZCAtIHRtcDsKKwkJCWluID0gMDsK KwkJCWRvIHsKKwkJCQlpbnQgbGVuOworCisJCQkJaWYgKG91dCA9PSBQQUdFX1NJWkUpIHsKKwkJ CQkJa3VubWFwX2F0b21pYyhkc3QpOworCQkJCQlkc3QgPSBrbWFwX2F0b21pYyhpOTE1X2dlbV9v YmplY3RfZ2V0X3BhZ2Uoc2hhZG93X2JhdGNoX29iaiwgKytkc3RfaXRlcikpOworCQkJCQlvdXQg PSAwOworCQkJCX0KIAotCWlmIChjbWQgPj0gYmF0Y2hfZW5kKSB7Ci0JCURSTV9ERUJVR19EUklW RVIoIkNNRDogR290IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3L28gYSBCQkUgY21kIVxuIik7 Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQorCQkJCWxlbiA9IGRzdF9sZW5ndGg7CisJCQkJaWYgKGxl biArIG91dCA+IFBBR0VfU0laRSkKKwkJCQkJbGVuID0gUEFHRV9TSVpFIC0gb3V0OworCQkJCWlm IChsZW4gPT0gUEFHRV9TSVpFKQorCQkJCQljb3B5X3BhZ2UoZHN0LCB0bXAgKyBpbik7CisJCQkJ ZWxzZQorCQkJCQltZW1jcHkoZHN0ICsgb3V0LCB0bXAgKyBpbiwgbGVuKTsKKwkJCQlpbiArPSBs ZW47CisJCQkJb3V0ICs9IGxlbjsKKwkJCQlkc3RfbGVuZ3RoIC09IGxlbjsKKwkJCX0gd2hpbGUg KGRzdF9sZW5ndGgpOworCQl9CisKKwkJYmF0Y2hfbGVuIC09IHRoaXM7CisJCWlmIChiYXRjaF9s ZW4gPT0gMCkKKwkJCWJyZWFrOwogCi0JdnVubWFwKGJhdGNoX2Jhc2UpOworCQlpZiAocGFydGlh bCkKKwkJCW1lbW1vdmUodG1wLCBjbWQsIHBhcnRpYWwpOwogCisJCWt1bm1hcF9hdG9taWMoc3Jj KTsKKwkJaW4gPSAwOworCX0KK3VubWFwOgorCWt1bm1hcF9hdG9taWMoc3JjKTsKKwlrdW5tYXBf YXRvbWljKGRzdCk7CisJYmF0Y2hfb2JqLT5nZXRfcGFnZSA9IHJld2luZDsKKwlrZnJlZSh0bXAp OwordW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKGJhdGNoX29iaik7CiAJcmV0 dXJuIHJldDsKIH0KIAotLSAKMi42LjIKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vaW50ZWwtZ2Z4Cg==