From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: [PATCH 10/10] drm/msm/a6xx: Track and manage a6xx state memory Date: Fri, 2 Nov 2018 09:25:26 -0600 Message-ID: <20181102152526.23854-11-jcrouse@codeaurora.org> References: <20181102152526.23854-1-jcrouse@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20181102152526.23854-1-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, hoegsberg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, smasetty-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: linux-arm-msm@vger.kernel.org VGhlIGE2eHggR1BVIHN0YXRlIGFsbG9jYXRlcyBhIExPVCBvZiBtZW1vcnkuIEFkZCBhIGJpdCBv ZgppbmZyYXN0cnVjdHVyZSB0byB0cmFjayB0aGUgbWVtb3J5IGFsbG9jYXRpb25zIGluIHRoZSBH UFUgc3RydWN0dXJlCmFuZCBkZWxldGUgdGhlbSB3aGVuIHRoZSBzdGF0ZSBpcyBkZXN0cm95ZWQg bXVjaCB0aGUgc2FtZSB3YXkKdGhhdCBkZXZtIHdvcmtzIHdpdGggdGhlIGRldmljZSBtb2RlbCBh cyBhIHdob2xlLiAgVGhpcyBwcm90ZWN0cwphZ2FpbnN0IHRoZSBkZXZlbG9wZXIgYWNjaWRlbnRh bGx5IGZvcmdldHRpbmcgdG8gYWRkIGEga2ZyZWUoKSB0bwphbiBldmVyIGdyb3dpbmcgbGlzdC4K ClNpZ25lZC1vZmYtYnk6IEpvcmRhbiBDcm91c2UgPGpjcm91c2VAY29kZWF1cm9yYS5vcmc+Ci0t LQogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHVfc3RhdGUuYyB8IDE5MiArKysr KysrKysrKy0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDEwMiBpbnNlcnRpb25zKCspLCA5MCBk ZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNnh4 X2dwdV9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHVfc3RhdGUu YwppbmRleCAyMGY1YjkxNGM2ZmIuLmVjNTdkZGViOGM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL21zbS9hZHJlbm8vYTZ4eF9ncHVfc3RhdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v bXNtL2FkcmVuby9hNnh4X2dwdV9zdGF0ZS5jCkBAIC00MSw2ICs0MSw4IEBAIHN0cnVjdCBhNnh4 X2dwdV9zdGF0ZSB7CiAKIAlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGVfb2JqICpjeF9kZWJ1Z2J1czsK IAlpbnQgbnJfY3hfZGVidWdidXM7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG9ianM7CiB9OwogCiBz dGF0aWMgaW5saW5lIGludCBDUkFTSERVTVBfV1JJVEUodTY0ICppbiwgdTMyIHJlZywgdTMyIHZh bCkKQEAgLTczLDYgKzc1LDMzIEBAIHN0cnVjdCBhNnh4X2NyYXNoZHVtcGVyIHsKIAl1NjQgaW92 YTsKIH07CiAKK3N0cnVjdCBhNnh4X3N0YXRlX21lbW9iaiB7CisJc3RydWN0IGxpc3RfaGVhZCBu b2RlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhW107Cit9OworCit2b2lkICpzdGF0ZV9rY2Fs bG9jKHN0cnVjdCBhNnh4X2dwdV9zdGF0ZSAqYTZ4eF9zdGF0ZSwgaW50IG5yLCBzaXplX3Qgb2Jq c2l6ZSkKK3sKKwlzdHJ1Y3QgYTZ4eF9zdGF0ZV9tZW1vYmogKm9iaiA9CisJCWt6YWxsb2MoKG5y ICogb2Jqc2l6ZSkgKyBzaXplb2YoKm9iaiksIEdGUF9LRVJORUwpOworCisJaWYgKCFvYmopCisJ CXJldHVybiBOVUxMOworCisJbGlzdF9hZGRfdGFpbCgmb2JqLT5ub2RlLCAmYTZ4eF9zdGF0ZS0+ b2Jqcyk7CisJcmV0dXJuICZvYmotPmRhdGE7Cit9CisKK3ZvaWQgKnN0YXRlX2ttZW1kdXAoc3Ry dWN0IGE2eHhfZ3B1X3N0YXRlICphNnh4X3N0YXRlLCB2b2lkICpzcmMsCisJCXNpemVfdCBzaXpl KQoreworCXZvaWQgKmRzdCA9IHN0YXRlX2tjYWxsb2MoYTZ4eF9zdGF0ZSwgMSwgc2l6ZSk7CisK KwlpZiAoZHN0KQorCQltZW1jcHkoZHN0LCBzcmMsIHNpemUpOworCXJldHVybiBkc3Q7Cit9CisK IC8qCiAgKiBBbGxvY2F0ZSAxTUIgZm9yIHRoZSBjcmFzaGR1bXBlciBzY3JhdGNoIHJlZ2lvbiAt IDhrIGZvciB0aGUgc2NyaXB0IGFuZAogICogdGhlIHJlc3QgZm9yIHRoZSBkYXRhCkBAIC0yMDMs MTIgKzIzMiwxNyBAQCBzdGF0aWMgaW50IHZiaWZfZGVidWdidXNfcmVhZChzdHJ1Y3QgbXNtX2dw dSAqZ3B1LCB1MzIgY3RybDAsIHUzMiBjdHJsMSwKIAkgKDEyICogWElOX0NPUkVfQkxPQ0tTKSkK IAogc3RhdGljIHZvaWQgYTZ4eF9nZXRfdmJpZl9kZWJ1Z2J1c19ibG9jayhzdHJ1Y3QgbXNtX2dw dSAqZ3B1LAorCQlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGUgKmE2eHhfc3RhdGUsCiAJCXN0cnVjdCBh Nnh4X2dwdV9zdGF0ZV9vYmogKm9iaikKIHsKIAl1MzIgY2xrLCAqcHRyOwogCWludCBpOwogCi0J b2JqLT5kYXRhID0ga2NhbGxvYyhWQklGX0RFQlVHQlVTX0JMT0NLX1NJWkUsIHNpemVvZih1MzIp LCBHRlBfS0VSTkVMKTsKKwlvYmotPmRhdGEgPSBzdGF0ZV9rY2FsbG9jKGE2eHhfc3RhdGUsIFZC SUZfREVCVUdCVVNfQkxPQ0tfU0laRSwKKwkJc2l6ZW9mKHUzMikpOworCWlmICghb2JqLT5kYXRh KQorCQlyZXR1cm47CisKIAlvYmotPmhhbmRsZSA9IE5VTEw7CiAKIAkvKiBHZXQgdGhlIGN1cnJl bnQgY2xvY2sgc2V0dGluZyAqLwpAQCAtMjUyLDEzICsyODYsMTQgQEAgc3RhdGljIHZvaWQgYTZ4 eF9nZXRfdmJpZl9kZWJ1Z2J1c19ibG9jayhzdHJ1Y3QgbXNtX2dwdSAqZ3B1LAogfQogCiBzdGF0 aWMgdm9pZCBhNnh4X2dldF9kZWJ1Z2J1c19ibG9jayhzdHJ1Y3QgbXNtX2dwdSAqZ3B1LAorCQlz dHJ1Y3QgYTZ4eF9ncHVfc3RhdGUgKmE2eHhfc3RhdGUsCiAJCWNvbnN0IHN0cnVjdCBhNnh4X2Rl YnVnYnVzX2Jsb2NrICpibG9jaywKIAkJc3RydWN0IGE2eHhfZ3B1X3N0YXRlX29iaiAqb2JqKQog ewogCWludCBpOwogCXUzMiAqcHRyOwogCi0Jb2JqLT5kYXRhID0ga2NhbGxvYyhibG9jay0+Y291 bnQsIHNpemVvZih1NjQpLCBHRlBfS0VSTkVMKTsKKwlvYmotPmRhdGEgPSBzdGF0ZV9rY2FsbG9j KGE2eHhfc3RhdGUsIGJsb2NrLT5jb3VudCwgc2l6ZW9mKHU2NCkpOwogCWlmICghb2JqLT5kYXRh KQogCQlyZXR1cm47CiAKQEAgLTI2OSwxMyArMzA0LDE0IEBAIHN0YXRpYyB2b2lkIGE2eHhfZ2V0 X2RlYnVnYnVzX2Jsb2NrKHN0cnVjdCBtc21fZ3B1ICpncHUsCiB9CiAKIHN0YXRpYyB2b2lkIGE2 eHhfZ2V0X2N4X2RlYnVnYnVzX2Jsb2NrKHZvaWQgX19pb21lbSAqY3hkYmcsCisJCXN0cnVjdCBh Nnh4X2dwdV9zdGF0ZSAqYTZ4eF9zdGF0ZSwKIAkJY29uc3Qgc3RydWN0IGE2eHhfZGVidWdidXNf YmxvY2sgKmJsb2NrLAogCQlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGVfb2JqICpvYmopCiB7CiAJaW50 IGk7CiAJdTMyICpwdHI7CiAKLQlvYmotPmRhdGEgPSBrY2FsbG9jKGJsb2NrLT5jb3VudCwgc2l6 ZW9mKHU2NCksIEdGUF9LRVJORUwpOworCW9iai0+ZGF0YSA9IHN0YXRlX2tjYWxsb2MoYTZ4eF9z dGF0ZSwgYmxvY2stPmNvdW50LCBzaXplb2YodTY0KSk7CiAJaWYgKCFvYmotPmRhdGEpCiAJCXJl dHVybjsKIApAQCAtMzQ0LDM2ICszODAsNDIgQEAgc3RhdGljIHZvaWQgYTZ4eF9nZXRfZGVidWdi dXMoc3RydWN0IG1zbV9ncHUgKmdwdSwKIAkJY3hkYmdfd3JpdGUoY3hkYmcsIFJFR19BNlhYX0RC R0NfQ0ZHX0RCR0JVU19NQVNLTF8zLCAwKTsKIAl9CiAKLQlhNnh4X3N0YXRlLT5kZWJ1Z2J1cyA9 IGtjYWxsb2MoQVJSQVlfU0laRShhNnh4X2RlYnVnYnVzX2Jsb2NrcyksCi0JCXNpemVvZigqYTZ4 eF9zdGF0ZS0+ZGVidWdidXMpLCBHRlBfS0VSTkVMKTsKKwlhNnh4X3N0YXRlLT5kZWJ1Z2J1cyA9 IHN0YXRlX2tjYWxsb2MoYTZ4eF9zdGF0ZSwKKwkJQVJSQVlfU0laRShhNnh4X2RlYnVnYnVzX2Js b2NrcyksCisJCXNpemVvZigqYTZ4eF9zdGF0ZS0+ZGVidWdidXMpKTsKIAogCWlmIChhNnh4X3N0 YXRlLT5kZWJ1Z2J1cykgewogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0la RShhNnh4X2RlYnVnYnVzX2Jsb2Nrcyk7IGkrKykKIAkJCWE2eHhfZ2V0X2RlYnVnYnVzX2Jsb2Nr KGdwdSwKKwkJCQlhNnh4X3N0YXRlLAogCQkJCSZhNnh4X2RlYnVnYnVzX2Jsb2Nrc1tpXSwKIAkJ CQkmYTZ4eF9zdGF0ZS0+ZGVidWdidXNbaV0pOwogCiAJCWE2eHhfc3RhdGUtPm5yX2RlYnVnYnVz ID0gQVJSQVlfU0laRShhNnh4X2RlYnVnYnVzX2Jsb2Nrcyk7CiAJfQogCi0JYTZ4eF9zdGF0ZS0+ dmJpZl9kZWJ1Z2J1cyA9IGt6YWxsb2Moc2l6ZW9mKCphNnh4X3N0YXRlLT52YmlmX2RlYnVnYnVz KSwKLQkJR0ZQX0tFUk5FTCk7CisJYTZ4eF9zdGF0ZS0+dmJpZl9kZWJ1Z2J1cyA9CisJCXN0YXRl X2tjYWxsb2MoYTZ4eF9zdGF0ZSwgMSwKKwkJCXNpemVvZigqYTZ4eF9zdGF0ZS0+dmJpZl9kZWJ1 Z2J1cykpOwogCiAJaWYgKGE2eHhfc3RhdGUtPnZiaWZfZGVidWdidXMpCi0JCWE2eHhfZ2V0X3Zi aWZfZGVidWdidXNfYmxvY2soZ3B1LCBhNnh4X3N0YXRlLT52YmlmX2RlYnVnYnVzKTsKKwkJYTZ4 eF9nZXRfdmJpZl9kZWJ1Z2J1c19ibG9jayhncHUsIGE2eHhfc3RhdGUsCisJCQlhNnh4X3N0YXRl LT52YmlmX2RlYnVnYnVzKTsKIAogCWlmIChjeGRiZykgewogCQlhNnh4X3N0YXRlLT5jeF9kZWJ1 Z2J1cyA9Ci0JCQlrY2FsbG9jKEFSUkFZX1NJWkUoYTZ4eF9jeF9kZWJ1Z2J1c19ibG9ja3MpLAot CQkJc2l6ZW9mKCphNnh4X3N0YXRlLT5jeF9kZWJ1Z2J1cyksIEdGUF9LRVJORUwpOworCQkJc3Rh dGVfa2NhbGxvYyhhNnh4X3N0YXRlLAorCQkJQVJSQVlfU0laRShhNnh4X2N4X2RlYnVnYnVzX2Js b2NrcyksCisJCQlzaXplb2YoKmE2eHhfc3RhdGUtPmN4X2RlYnVnYnVzKSk7CiAKIAkJaWYgKGE2 eHhfc3RhdGUtPmN4X2RlYnVnYnVzKSB7CiAJCQlpbnQgaTsKIAogCQkJZm9yIChpID0gMDsgaSA8 IEFSUkFZX1NJWkUoYTZ4eF9jeF9kZWJ1Z2J1c19ibG9ja3MpOyBpKyspCiAJCQkJYTZ4eF9nZXRf Y3hfZGVidWdidXNfYmxvY2soY3hkYmcsCisJCQkJCWE2eHhfc3RhdGUsCiAJCQkJCSZhNnh4X2N4 X2RlYnVnYnVzX2Jsb2Nrc1tpXSwKIAkJCQkJJmE2eHhfc3RhdGUtPmN4X2RlYnVnYnVzW2ldKTsK IApAQCAtMzg5LDYgKzQzMSw3IEBAIHN0YXRpYyB2b2lkIGE2eHhfZ2V0X2RlYnVnYnVzKHN0cnVj dCBtc21fZ3B1ICpncHUsCiAKIC8qIFJlYWQgYSBkYXRhIGNsdXN0ZXIgZnJvbSBiZWhpbmQgdGhl IEFIQiBhcGVydHVyZSAqLwogc3RhdGljIHZvaWQgYTZ4eF9nZXRfZGJnYWhiX2NsdXN0ZXIoc3Ry dWN0IG1zbV9ncHUgKmdwdSwKKwkJc3RydWN0IGE2eHhfZ3B1X3N0YXRlICphNnh4X3N0YXRlLAog CQljb25zdCBzdHJ1Y3QgYTZ4eF9kYmdhaGJfY2x1c3RlciAqZGJnYWhiLAogCQlzdHJ1Y3QgYTZ4 eF9ncHVfc3RhdGVfb2JqICpvYmosCiAJCXN0cnVjdCBhNnh4X2NyYXNoZHVtcGVyICpkdW1wZXIp CkBAIC00MjksOCArNDcyLDggQEAgc3RhdGljIHZvaWQgYTZ4eF9nZXRfZGJnYWhiX2NsdXN0ZXIo c3RydWN0IG1zbV9ncHUgKmdwdSwKIAkJcmV0dXJuOwogCiAJb2JqLT5oYW5kbGUgPSBkYmdhaGI7 Ci0Jb2JqLT5kYXRhID0ga21lbWR1cChkdW1wZXItPnB0ciArIEE2WFhfQ0RfREFUQV9PRkZTRVQs Ci0JCWRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwlvYmotPmRhdGEgPSBzdGF0ZV9rbWVtZHVwKGE2 eHhfc3RhdGUsIGR1bXBlci0+cHRyICsgQTZYWF9DRF9EQVRBX09GRlNFVCwKKwkJZGF0YXNpemUp OwogfQogCiBzdGF0aWMgdm9pZCBhNnh4X2dldF9kYmdhaGJfY2x1c3RlcnMoc3RydWN0IG1zbV9n cHUgKmdwdSwKQEAgLTQzOSw4ICs0ODIsOSBAQCBzdGF0aWMgdm9pZCBhNnh4X2dldF9kYmdhaGJf Y2x1c3RlcnMoc3RydWN0IG1zbV9ncHUgKmdwdSwKIHsKIAlpbnQgaTsKIAotCWE2eHhfc3RhdGUt PmRiZ2FoYl9jbHVzdGVycyA9IGtjYWxsb2MoQVJSQVlfU0laRShhNnh4X2RiZ2FoYl9jbHVzdGVy cyksCi0JCXNpemVvZigqYTZ4eF9zdGF0ZS0+ZGJnYWhiX2NsdXN0ZXJzKSwgR0ZQX0tFUk5FTCk7 CisJYTZ4eF9zdGF0ZS0+ZGJnYWhiX2NsdXN0ZXJzID0gc3RhdGVfa2NhbGxvYyhhNnh4X3N0YXRl LAorCQlBUlJBWV9TSVpFKGE2eHhfZGJnYWhiX2NsdXN0ZXJzKSwKKwkJc2l6ZW9mKCphNnh4X3N0 YXRlLT5kYmdhaGJfY2x1c3RlcnMpKTsKIAogCWlmICghYTZ4eF9zdGF0ZS0+ZGJnYWhiX2NsdXN0 ZXJzKQogCQlyZXR1cm47CkBAIC00NDgsMTIgKzQ5MiwxNCBAQCBzdGF0aWMgdm9pZCBhNnh4X2dl dF9kYmdhaGJfY2x1c3RlcnMoc3RydWN0IG1zbV9ncHUgKmdwdSwKIAlhNnh4X3N0YXRlLT5ucl9k YmdhaGJfY2x1c3RlcnMgPSBBUlJBWV9TSVpFKGE2eHhfZGJnYWhiX2NsdXN0ZXJzKTsKIAogCWZv ciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGE2eHhfZGJnYWhiX2NsdXN0ZXJzKTsgaSsrKQotCQlh Nnh4X2dldF9kYmdhaGJfY2x1c3RlcihncHUsICZhNnh4X2RiZ2FoYl9jbHVzdGVyc1tpXSwKKwkJ YTZ4eF9nZXRfZGJnYWhiX2NsdXN0ZXIoZ3B1LCBhNnh4X3N0YXRlLAorCQkJJmE2eHhfZGJnYWhi X2NsdXN0ZXJzW2ldLAogCQkJJmE2eHhfc3RhdGUtPmRiZ2FoYl9jbHVzdGVyc1tpXSwgZHVtcGVy KTsKIH0KIAogLyogUmVhZCBhIGRhdGEgY2x1c3RlciBmcm9tIHRoZSBDUCBhcGVydHVyZSB3aXRo IHRoZSBjcmFzaGR1bXBlciAqLwogc3RhdGljIHZvaWQgYTZ4eF9nZXRfY2x1c3RlcihzdHJ1Y3Qg bXNtX2dwdSAqZ3B1LAorCQlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGUgKmE2eHhfc3RhdGUsCiAJCWNv bnN0IHN0cnVjdCBhNnh4X2NsdXN0ZXIgKmNsdXN0ZXIsCiAJCXN0cnVjdCBhNnh4X2dwdV9zdGF0 ZV9vYmogKm9iaiwKIAkJc3RydWN0IGE2eHhfY3Jhc2hkdW1wZXIgKmR1bXBlcikKQEAgLTQ5Nyw4 ICs1NDMsOCBAQCBzdGF0aWMgdm9pZCBhNnh4X2dldF9jbHVzdGVyKHN0cnVjdCBtc21fZ3B1ICpn cHUsCiAJCXJldHVybjsKIAogCW9iai0+aGFuZGxlID0gY2x1c3RlcjsKLQlvYmotPmRhdGEgPSBr bWVtZHVwKGR1bXBlci0+cHRyICsgQTZYWF9DRF9EQVRBX09GRlNFVCwKLQkJZGF0YXNpemUsIEdG UF9LRVJORUwpOworCW9iai0+ZGF0YSA9IHN0YXRlX2ttZW1kdXAoYTZ4eF9zdGF0ZSwgZHVtcGVy LT5wdHIgKyBBNlhYX0NEX0RBVEFfT0ZGU0VULAorCQlkYXRhc2l6ZSk7CiB9CiAKIHN0YXRpYyB2 b2lkIGE2eHhfZ2V0X2NsdXN0ZXJzKHN0cnVjdCBtc21fZ3B1ICpncHUsCkBAIC01MDcsOCArNTUz LDggQEAgc3RhdGljIHZvaWQgYTZ4eF9nZXRfY2x1c3RlcnMoc3RydWN0IG1zbV9ncHUgKmdwdSwK IHsKIAlpbnQgaTsKIAotCWE2eHhfc3RhdGUtPmNsdXN0ZXJzID0ga2NhbGxvYyhBUlJBWV9TSVpF KGE2eHhfY2x1c3RlcnMpLAotCQlzaXplb2YoKmE2eHhfc3RhdGUtPmNsdXN0ZXJzKSwgR0ZQX0tF Uk5FTCk7CisJYTZ4eF9zdGF0ZS0+Y2x1c3RlcnMgPSBzdGF0ZV9rY2FsbG9jKGE2eHhfc3RhdGUs CisJCUFSUkFZX1NJWkUoYTZ4eF9jbHVzdGVycyksIHNpemVvZigqYTZ4eF9zdGF0ZS0+Y2x1c3Rl cnMpKTsKIAogCWlmICghYTZ4eF9zdGF0ZS0+Y2x1c3RlcnMpCiAJCXJldHVybjsKQEAgLTUxNiwx MiArNTYyLDEzIEBAIHN0YXRpYyB2b2lkIGE2eHhfZ2V0X2NsdXN0ZXJzKHN0cnVjdCBtc21fZ3B1 ICpncHUsCiAJYTZ4eF9zdGF0ZS0+bnJfY2x1c3RlcnMgPSBBUlJBWV9TSVpFKGE2eHhfY2x1c3Rl cnMpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYTZ4eF9jbHVzdGVycyk7IGkrKykK LQkJYTZ4eF9nZXRfY2x1c3RlcihncHUsICZhNnh4X2NsdXN0ZXJzW2ldLAorCQlhNnh4X2dldF9j bHVzdGVyKGdwdSwgYTZ4eF9zdGF0ZSwgJmE2eHhfY2x1c3RlcnNbaV0sCiAJCQkmYTZ4eF9zdGF0 ZS0+Y2x1c3RlcnNbaV0sIGR1bXBlcik7CiB9CiAKIC8qIFJlYWQgYSBzaGFkZXIgLyBkZWJ1ZyBi bG9jayBmcm9tIHRoZSBITFNRIGFwZXJ0dXJlIHdpdGggdGhlIGNyYXNoZHVtcGVyICovCiBzdGF0 aWMgdm9pZCBhNnh4X2dldF9zaGFkZXJfYmxvY2soc3RydWN0IG1zbV9ncHUgKmdwdSwKKwkJc3Ry dWN0IGE2eHhfZ3B1X3N0YXRlICphNnh4X3N0YXRlLAogCQljb25zdCBzdHJ1Y3QgYTZ4eF9zaGFk ZXJfYmxvY2sgKmJsb2NrLAogCQlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGVfb2JqICpvYmosCiAJCXN0 cnVjdCBhNnh4X2NyYXNoZHVtcGVyICpkdW1wZXIpCkBAIC01NDcsOCArNTk0LDggQEAgc3RhdGlj IHZvaWQgYTZ4eF9nZXRfc2hhZGVyX2Jsb2NrKHN0cnVjdCBtc21fZ3B1ICpncHUsCiAJCXJldHVy bjsKIAogCW9iai0+aGFuZGxlID0gYmxvY2s7Ci0Jb2JqLT5kYXRhID0ga21lbWR1cChkdW1wZXIt PnB0ciArIEE2WFhfQ0RfREFUQV9PRkZTRVQsCi0JCWRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwlv YmotPmRhdGEgPSBzdGF0ZV9rbWVtZHVwKGE2eHhfc3RhdGUsIGR1bXBlci0+cHRyICsgQTZYWF9D RF9EQVRBX09GRlNFVCwKKwkJZGF0YXNpemUpOwogfQogCiBzdGF0aWMgdm9pZCBhNnh4X2dldF9z aGFkZXJzKHN0cnVjdCBtc21fZ3B1ICpncHUsCkBAIC01NTcsOCArNjA0LDggQEAgc3RhdGljIHZv aWQgYTZ4eF9nZXRfc2hhZGVycyhzdHJ1Y3QgbXNtX2dwdSAqZ3B1LAogewogCWludCBpOwogCi0J YTZ4eF9zdGF0ZS0+c2hhZGVycyA9IGtjYWxsb2MoQVJSQVlfU0laRShhNnh4X3NoYWRlcl9ibG9j a3MpLAotCQlzaXplb2YoKmE2eHhfc3RhdGUtPnNoYWRlcnMpLCBHRlBfS0VSTkVMKTsKKwlhNnh4 X3N0YXRlLT5zaGFkZXJzID0gc3RhdGVfa2NhbGxvYyhhNnh4X3N0YXRlLAorCQlBUlJBWV9TSVpF KGE2eHhfc2hhZGVyX2Jsb2NrcyksIHNpemVvZigqYTZ4eF9zdGF0ZS0+c2hhZGVycykpOwogCiAJ aWYgKCFhNnh4X3N0YXRlLT5zaGFkZXJzKQogCQlyZXR1cm47CkBAIC01NjYsMTIgKzYxMywxMyBA QCBzdGF0aWMgdm9pZCBhNnh4X2dldF9zaGFkZXJzKHN0cnVjdCBtc21fZ3B1ICpncHUsCiAJYTZ4 eF9zdGF0ZS0+bnJfc2hhZGVycyA9IEFSUkFZX1NJWkUoYTZ4eF9zaGFkZXJfYmxvY2tzKTsKIAog CWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGE2eHhfc2hhZGVyX2Jsb2Nrcyk7IGkrKykKLQkJ YTZ4eF9nZXRfc2hhZGVyX2Jsb2NrKGdwdSwgJmE2eHhfc2hhZGVyX2Jsb2Nrc1tpXSwKKwkJYTZ4 eF9nZXRfc2hhZGVyX2Jsb2NrKGdwdSwgYTZ4eF9zdGF0ZSwgJmE2eHhfc2hhZGVyX2Jsb2Nrc1tp XSwKIAkJCSZhNnh4X3N0YXRlLT5zaGFkZXJzW2ldLCBkdW1wZXIpOwogfQogCiAvKiBSZWFkIHJl Z2lzdGVycyBmcm9tIGJlaGluZCB0aGUgSExTUSBhcGVydHVyZSB3aXRoIHRoZSBjcmFzaGR1bXBl ciAqLwogc3RhdGljIHZvaWQgYTZ4eF9nZXRfY3Jhc2hkdW1wZXJfaGxzcV9yZWdpc3RlcnMoc3Ry dWN0IG1zbV9ncHUgKmdwdSwKKwkJc3RydWN0IGE2eHhfZ3B1X3N0YXRlICphNnh4X3N0YXRlLAog CQljb25zdCBzdHJ1Y3QgYTZ4eF9yZWdpc3RlcnMgKnJlZ3MsCiAJCXN0cnVjdCBhNnh4X2dwdV9z dGF0ZV9vYmogKm9iaiwKIAkJc3RydWN0IGE2eHhfY3Jhc2hkdW1wZXIgKmR1bXBlcikKQEAgLTYw MywxMiArNjUxLDEzIEBAIHN0YXRpYyB2b2lkIGE2eHhfZ2V0X2NyYXNoZHVtcGVyX2hsc3FfcmVn aXN0ZXJzKHN0cnVjdCBtc21fZ3B1ICpncHUsCiAJCXJldHVybjsKIAogCW9iai0+aGFuZGxlID0g cmVnczsKLQlvYmotPmRhdGEgPSBrbWVtZHVwKGR1bXBlci0+cHRyICsgQTZYWF9DRF9EQVRBX09G RlNFVCwKLQkJcmVnY291bnQgKiBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJb2JqLT5kYXRh ID0gc3RhdGVfa21lbWR1cChhNnh4X3N0YXRlLCBkdW1wZXItPnB0ciArIEE2WFhfQ0RfREFUQV9P RkZTRVQsCisJCXJlZ2NvdW50ICogc2l6ZW9mKHUzMikpOwogfQogCiAvKiBSZWFkIGEgYmxvY2sg b2YgcmVnaXN0ZXJzIHVzaW5nIHRoZSBjcmFzaGR1bXBlciAqLwogc3RhdGljIHZvaWQgYTZ4eF9n ZXRfY3Jhc2hkdW1wZXJfcmVnaXN0ZXJzKHN0cnVjdCBtc21fZ3B1ICpncHUsCisJCXN0cnVjdCBh Nnh4X2dwdV9zdGF0ZSAqYTZ4eF9zdGF0ZSwKIAkJY29uc3Qgc3RydWN0IGE2eHhfcmVnaXN0ZXJz ICpyZWdzLAogCQlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGVfb2JqICpvYmosCiAJCXN0cnVjdCBhNnh4 X2NyYXNoZHVtcGVyICpkdW1wZXIpCkBAIC02NDAsMTIgKzY4OSwxMyBAQCBzdGF0aWMgdm9pZCBh Nnh4X2dldF9jcmFzaGR1bXBlcl9yZWdpc3RlcnMoc3RydWN0IG1zbV9ncHUgKmdwdSwKIAkJcmV0 dXJuOwogCiAJb2JqLT5oYW5kbGUgPSByZWdzOwotCW9iai0+ZGF0YSA9IGttZW1kdXAoZHVtcGVy LT5wdHIgKyBBNlhYX0NEX0RBVEFfT0ZGU0VULAotCQlyZWdjb3VudCAqIHNpemVvZih1MzIpLCBH RlBfS0VSTkVMKTsKKwlvYmotPmRhdGEgPSBzdGF0ZV9rbWVtZHVwKGE2eHhfc3RhdGUsIGR1bXBl ci0+cHRyICsgQTZYWF9DRF9EQVRBX09GRlNFVCwKKwkJcmVnY291bnQgKiBzaXplb2YodTMyKSk7 CiB9CiAKIC8qIFJlYWQgYSBibG9jayBvZiByZWdpc3RlcnMgdmlhIEFIQiAqLwogc3RhdGljIHZv aWQgYTZ4eF9nZXRfYWhiX2dwdV9yZWdpc3RlcnMoc3RydWN0IG1zbV9ncHUgKmdwdSwKKwkJc3Ry dWN0IGE2eHhfZ3B1X3N0YXRlICphNnh4X3N0YXRlLAogCQljb25zdCBzdHJ1Y3QgYTZ4eF9yZWdp c3RlcnMgKnJlZ3MsCiAJCXN0cnVjdCBhNnh4X2dwdV9zdGF0ZV9vYmogKm9iaikKIHsKQEAgLTY1 NSw3ICs3MDUsNyBAQCBzdGF0aWMgdm9pZCBhNnh4X2dldF9haGJfZ3B1X3JlZ2lzdGVycyhzdHJ1 Y3QgbXNtX2dwdSAqZ3B1LAogCQlyZWdjb3VudCArPSBSQU5HRShyZWdzLT5yZWdpc3RlcnMsIGkp OwogCiAJb2JqLT5oYW5kbGUgPSAoY29uc3Qgdm9pZCAqKSByZWdzOwotCW9iai0+ZGF0YSA9IGtj YWxsb2MocmVnY291bnQsIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwlvYmotPmRhdGEgPSBz dGF0ZV9rY2FsbG9jKGE2eHhfc3RhdGUsIHJlZ2NvdW50LCBzaXplb2YodTMyKSk7CiAJaWYgKCFv YmotPmRhdGEpCiAJCXJldHVybjsKIApAQCAtNjcxLDYgKzcyMSw3IEBAIHN0YXRpYyB2b2lkIGE2 eHhfZ2V0X2FoYl9ncHVfcmVnaXN0ZXJzKHN0cnVjdCBtc21fZ3B1ICpncHUsCiAKIC8qIFJlYWQg YSBibG9jayBvZiBHTVUgcmVnaXN0ZXJzICovCiBzdGF0aWMgdm9pZCBfYTZ4eF9nZXRfZ211X3Jl Z2lzdGVycyhzdHJ1Y3QgbXNtX2dwdSAqZ3B1LAorCQlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGUgKmE2 eHhfc3RhdGUsCiAJCWNvbnN0IHN0cnVjdCBhNnh4X3JlZ2lzdGVycyAqcmVncywKIAkJc3RydWN0 IGE2eHhfZ3B1X3N0YXRlX29iaiAqb2JqKQogewpAQCAtNjgzLDcgKzczNCw3IEBAIHN0YXRpYyB2 b2lkIF9hNnh4X2dldF9nbXVfcmVnaXN0ZXJzKHN0cnVjdCBtc21fZ3B1ICpncHUsCiAJCXJlZ2Nv dW50ICs9IFJBTkdFKHJlZ3MtPnJlZ2lzdGVycywgaSk7CiAKIAlvYmotPmhhbmRsZSA9IChjb25z dCB2b2lkICopIHJlZ3M7Ci0Jb2JqLT5kYXRhID0ga2NhbGxvYyhyZWdjb3VudCwgc2l6ZW9mKHUz MiksIEdGUF9LRVJORUwpOworCW9iai0+ZGF0YSA9IHN0YXRlX2tjYWxsb2MoYTZ4eF9zdGF0ZSwg cmVnY291bnQsIHNpemVvZih1MzIpKTsKIAlpZiAoIW9iai0+ZGF0YSkKIAkJcmV0dXJuOwogCkBA IC03MDMsOCArNzU0LDggQEAgc3RhdGljIHZvaWQgYTZ4eF9nZXRfZ211X3JlZ2lzdGVycyhzdHJ1 Y3QgbXNtX2dwdSAqZ3B1LAogCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gdG9fYWRy ZW5vX2dwdShncHUpOwogCXN0cnVjdCBhNnh4X2dwdSAqYTZ4eF9ncHUgPSB0b19hNnh4X2dwdShh ZHJlbm9fZ3B1KTsKIAotCWE2eHhfc3RhdGUtPmdtdV9yZWdpc3RlcnMgPSBrY2FsbG9jKDIsCi0J CXNpemVvZigqYTZ4eF9zdGF0ZS0+Z211X3JlZ2lzdGVycyksIEdGUF9LRVJORUwpOworCWE2eHhf c3RhdGUtPmdtdV9yZWdpc3RlcnMgPSBzdGF0ZV9rY2FsbG9jKGE2eHhfc3RhdGUsCisJCTIsIHNp emVvZigqYTZ4eF9zdGF0ZS0+Z211X3JlZ2lzdGVycykpOwogCiAJaWYgKCFhNnh4X3N0YXRlLT5n bXVfcmVnaXN0ZXJzKQogCQlyZXR1cm47CkBAIC03MTIsNyArNzYzLDcgQEAgc3RhdGljIHZvaWQg YTZ4eF9nZXRfZ211X3JlZ2lzdGVycyhzdHJ1Y3QgbXNtX2dwdSAqZ3B1LAogCWE2eHhfc3RhdGUt Pm5yX2dtdV9yZWdpc3RlcnMgPSAyOwogCiAJLyogR2V0IHRoZSBDWCBHTVUgcmVnaXN0ZXJzIGZy b20gQUhCICovCi0JX2E2eHhfZ2V0X2dtdV9yZWdpc3RlcnMoZ3B1LCAmYTZ4eF9nbXVfcmVnbGlz dFswXSwKKwlfYTZ4eF9nZXRfZ211X3JlZ2lzdGVycyhncHUsIGE2eHhfc3RhdGUsICZhNnh4X2dt dV9yZWdsaXN0WzBdLAogCQkmYTZ4eF9zdGF0ZS0+Z211X3JlZ2lzdGVyc1swXSk7CiAKIAlpZiAo IWE2eHhfZ211X2d4X2lzX29uKCZhNnh4X2dwdS0+Z211KSkKQEAgLTcyMSw3ICs3NzIsNyBAQCBz dGF0aWMgdm9pZCBhNnh4X2dldF9nbXVfcmVnaXN0ZXJzKHN0cnVjdCBtc21fZ3B1ICpncHUsCiAJ LyogU2V0IHRoZSBmZW5jZSB0byBBTExPVyBtb2RlIHNvIHdlIGNhbiBhY2Nlc3MgdGhlIHJlZ2lz dGVycyAqLwogCWdwdV93cml0ZShncHUsIFJFR19BNlhYX0dNVV9BT19BSEJfRkVOQ0VfQ1RSTCwg MCk7CiAKLQlfYTZ4eF9nZXRfZ211X3JlZ2lzdGVycyhncHUsICZhNnh4X2dtdV9yZWdsaXN0WzFd LAorCV9hNnh4X2dldF9nbXVfcmVnaXN0ZXJzKGdwdSwgYTZ4eF9zdGF0ZSwgJmE2eHhfZ211X3Jl Z2xpc3RbMV0sCiAJCSZhNnh4X3N0YXRlLT5nbXVfcmVnaXN0ZXJzWzFdKTsKIH0KIApAQCAtNzM0 LDggKzc4NSw4IEBAIHN0YXRpYyB2b2lkIGE2eHhfZ2V0X3JlZ2lzdGVycyhzdHJ1Y3QgbXNtX2dw dSAqZ3B1LAogCQlBUlJBWV9TSVpFKGE2eHhfaGxzcV9yZWdsaXN0KTsKIAlpbnQgaW5kZXggPSAw OwogCi0JYTZ4eF9zdGF0ZS0+cmVnaXN0ZXJzID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKCphNnh4 X3N0YXRlLT5yZWdpc3RlcnMpLAotCQlHRlBfS0VSTkVMKTsKKwlhNnh4X3N0YXRlLT5yZWdpc3Rl cnMgPSBzdGF0ZV9rY2FsbG9jKGE2eHhfc3RhdGUsCisJCWNvdW50LCBzaXplb2YoKmE2eHhfc3Rh dGUtPnJlZ2lzdGVycykpOwogCiAJaWYgKCFhNnh4X3N0YXRlLT5yZWdpc3RlcnMpCiAJCXJldHVy bjsKQEAgLTc0NCwzMSArNzk1LDMyIEBAIHN0YXRpYyB2b2lkIGE2eHhfZ2V0X3JlZ2lzdGVycyhz dHJ1Y3QgbXNtX2dwdSAqZ3B1LAogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYTZ4eF9h aGJfcmVnbGlzdCk7IGkrKykKIAkJYTZ4eF9nZXRfYWhiX2dwdV9yZWdpc3RlcnMoZ3B1LAotCQkJ JmE2eHhfYWhiX3JlZ2xpc3RbaV0sCisJCQlhNnh4X3N0YXRlLCAmYTZ4eF9haGJfcmVnbGlzdFtp XSwKIAkJCSZhNnh4X3N0YXRlLT5yZWdpc3RlcnNbaW5kZXgrK10pOwogCiAJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUoYTZ4eF9yZWdsaXN0KTsgaSsrKQogCQlhNnh4X2dldF9jcmFzaGR1bXBl cl9yZWdpc3RlcnMoZ3B1LAotCQkJJmE2eHhfcmVnbGlzdFtpXSwKKwkJCWE2eHhfc3RhdGUsICZh Nnh4X3JlZ2xpc3RbaV0sCiAJCQkmYTZ4eF9zdGF0ZS0+cmVnaXN0ZXJzW2luZGV4KytdLAogCQkJ ZHVtcGVyKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGE2eHhfaGxzcV9yZWdsaXN0 KTsgaSsrKQogCQlhNnh4X2dldF9jcmFzaGR1bXBlcl9obHNxX3JlZ2lzdGVycyhncHUsCi0JCQkm YTZ4eF9obHNxX3JlZ2xpc3RbaV0sCisJCQlhNnh4X3N0YXRlLCAmYTZ4eF9obHNxX3JlZ2xpc3Rb aV0sCiAJCQkmYTZ4eF9zdGF0ZS0+cmVnaXN0ZXJzW2luZGV4KytdLAogCQkJZHVtcGVyKTsKIH0K IAogLyogUmVhZCBhIGJsb2NrIG9mIGRhdGEgZnJvbSBhbiBpbmRleGVkIHJlZ2lzdGVyIHBhaXIg Ki8KIHN0YXRpYyB2b2lkIGE2eHhfZ2V0X2luZGV4ZWRfcmVncyhzdHJ1Y3QgbXNtX2dwdSAqZ3B1 LAorCQlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGUgKmE2eHhfc3RhdGUsCiAJCWNvbnN0IHN0cnVjdCBh Nnh4X2luZGV4ZWRfcmVnaXN0ZXJzICppbmRleGVkLAogCQlzdHJ1Y3QgYTZ4eF9ncHVfc3RhdGVf b2JqICpvYmopCiB7CiAJaW50IGk7CiAKIAlvYmotPmhhbmRsZSA9IChjb25zdCB2b2lkICopIGlu ZGV4ZWQ7Ci0Jb2JqLT5kYXRhID0ga2NhbGxvYyhpbmRleGVkLT5jb3VudCwgc2l6ZW9mKHUzMiks IEdGUF9LRVJORUwpOworCW9iai0+ZGF0YSA9IHN0YXRlX2tjYWxsb2MoYTZ4eF9zdGF0ZSwgaW5k ZXhlZC0+Y291bnQsIHNpemVvZih1MzIpKTsKIAlpZiAoIW9iai0+ZGF0YSkKIAkJcmV0dXJuOwog CkBAIC03ODcsMTMgKzgzOSwxMyBAQCBzdGF0aWMgdm9pZCBhNnh4X2dldF9pbmRleGVkX3JlZ2lz dGVycyhzdHJ1Y3QgbXNtX2dwdSAqZ3B1LAogCWludCBjb3VudCA9IEFSUkFZX1NJWkUoYTZ4eF9p bmRleGVkX3JlZ2xpc3QpICsgMTsKIAlpbnQgaTsKIAotCWE2eHhfc3RhdGUtPmluZGV4ZWRfcmVn cyA9IGtjYWxsb2MoY291bnQsCi0JCXNpemVvZihhNnh4X3N0YXRlLT5pbmRleGVkX3JlZ3MpLCBH RlBfS0VSTkVMKTsKKwlhNnh4X3N0YXRlLT5pbmRleGVkX3JlZ3MgPSBzdGF0ZV9rY2FsbG9jKGE2 eHhfc3RhdGUsIGNvdW50LAorCQlzaXplb2YoYTZ4eF9zdGF0ZS0+aW5kZXhlZF9yZWdzKSk7CiAJ aWYgKCFhNnh4X3N0YXRlLT5pbmRleGVkX3JlZ3MpCiAJCXJldHVybjsKIAogCWZvciAoaSA9IDA7 IGkgPCBBUlJBWV9TSVpFKGE2eHhfaW5kZXhlZF9yZWdsaXN0KTsgaSsrKQotCQlhNnh4X2dldF9p bmRleGVkX3JlZ3MoZ3B1LCAmYTZ4eF9pbmRleGVkX3JlZ2xpc3RbaV0sCisJCWE2eHhfZ2V0X2lu ZGV4ZWRfcmVncyhncHUsIGE2eHhfc3RhdGUsICZhNnh4X2luZGV4ZWRfcmVnbGlzdFtpXSwKIAkJ CSZhNnh4X3N0YXRlLT5pbmRleGVkX3JlZ3NbaV0pOwogCiAJLyogU2V0IHRoZSBDUCBtZW1wb29s IHNpemUgdG8gMCB0byBzdGFiaWxpemUgaXQgd2hpbGUgZHVtcGluZyAqLwpAQCAtODAxLDcgKzg1 Myw3IEBAIHN0YXRpYyB2b2lkIGE2eHhfZ2V0X2luZGV4ZWRfcmVnaXN0ZXJzKHN0cnVjdCBtc21f Z3B1ICpncHUsCiAJZ3B1X3dyaXRlKGdwdSwgUkVHX0E2WFhfQ1BfTUVNX1BPT0xfU0laRSwgMCk7 CiAKIAkvKiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBDUCBtZW1wb29sICovCi0JYTZ4eF9nZXRf aW5kZXhlZF9yZWdzKGdwdSwgJmE2eHhfY3BfbWVtcG9vbF9pbmRleGVkLAorCWE2eHhfZ2V0X2lu ZGV4ZWRfcmVncyhncHUsIGE2eHhfc3RhdGUsICZhNnh4X2NwX21lbXBvb2xfaW5kZXhlZCwKIAkJ JmE2eHhfc3RhdGUtPmluZGV4ZWRfcmVnc1tpXSk7CiAKIAkvKgpAQCAtODI3LDYgKzg3OSw4IEBA IHN0cnVjdCBtc21fZ3B1X3N0YXRlICphNnh4X2dwdV9zdGF0ZV9nZXQoc3RydWN0IG1zbV9ncHUg KmdwdSkKIAlpZiAoIWE2eHhfc3RhdGUpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCisJ SU5JVF9MSVNUX0hFQUQoJmE2eHhfc3RhdGUtPm9ianMpOworCiAJLyogR2V0IHRoZSBnZW5lcmlj IHN0YXRlIGZyb20gdGhlIGFkcmVubyBjb3JlICovCiAJYWRyZW5vX2dwdV9zdGF0ZV9nZXQoZ3B1 LCAmYTZ4eF9zdGF0ZS0+YmFzZSk7CiAKQEAgLTg1Niw1NiArOTEwLDE0IEBAIHN0cnVjdCBtc21f Z3B1X3N0YXRlICphNnh4X2dwdV9zdGF0ZV9nZXQoc3RydWN0IG1zbV9ncHUgKmdwdSkKIAogdm9p ZCBhNnh4X2dwdV9zdGF0ZV9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQogeworCXN0cnVjdCBh Nnh4X3N0YXRlX21lbW9iaiAqb2JqLCAqdG1wOwogCXN0cnVjdCBtc21fZ3B1X3N0YXRlICpzdGF0 ZSA9IGNvbnRhaW5lcl9vZihrcmVmLAogCQkJc3RydWN0IG1zbV9ncHVfc3RhdGUsIHJlZik7CiAJ c3RydWN0IGE2eHhfZ3B1X3N0YXRlICphNnh4X3N0YXRlID0gY29udGFpbmVyX29mKHN0YXRlLAog CQkJc3RydWN0IGE2eHhfZ3B1X3N0YXRlLCBiYXNlKTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7 IGkgPCBhNnh4X3N0YXRlLT5ucl9nbXVfcmVnaXN0ZXJzOyBpKyspCi0JCWtmcmVlKGE2eHhfc3Rh dGUtPmdtdV9yZWdpc3RlcnNbaV0uZGF0YSk7Ci0KLQlrZnJlZShhNnh4X3N0YXRlLT5nbXVfcmVn aXN0ZXJzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhNnh4X3N0YXRlLT5ucl9yZWdpc3RlcnM7IGkr KykKLQkJa2ZyZWUoYTZ4eF9zdGF0ZS0+cmVnaXN0ZXJzW2ldLmRhdGEpOwotCi0Ja2ZyZWUoYTZ4 eF9zdGF0ZS0+cmVnaXN0ZXJzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhNnh4X3N0YXRlLT5ucl9z aGFkZXJzOyBpKyspCi0JCWtmcmVlKGE2eHhfc3RhdGUtPnNoYWRlcnNbaV0uZGF0YSk7Ci0KLQlr ZnJlZShhNnh4X3N0YXRlLT5zaGFkZXJzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhNnh4X3N0YXRl LT5ucl9jbHVzdGVyczsgaSsrKQotCQlrZnJlZShhNnh4X3N0YXRlLT5jbHVzdGVyc1tpXS5kYXRh KTsKLQotCWtmcmVlKGE2eHhfc3RhdGUtPmNsdXN0ZXJzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBh Nnh4X3N0YXRlLT5ucl9kYmdhaGJfY2x1c3RlcnM7IGkrKykKLQkJa2ZyZWUoYTZ4eF9zdGF0ZS0+ ZGJnYWhiX2NsdXN0ZXJzW2ldLmRhdGEpOwotCi0Ja2ZyZWUoYTZ4eF9zdGF0ZS0+ZGJnYWhiX2Ns dXN0ZXJzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhNnh4X3N0YXRlLT5ucl9pbmRleGVkX3JlZ3M7 IGkrKykKLQkJa2ZyZWUoYTZ4eF9zdGF0ZS0+aW5kZXhlZF9yZWdzW2ldLmRhdGEpOwotCi0Ja2Zy ZWUoYTZ4eF9zdGF0ZS0+aW5kZXhlZF9yZWdzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhNnh4X3N0 YXRlLT5ucl9kZWJ1Z2J1czsgaSsrKQotCQlrZnJlZShhNnh4X3N0YXRlLT5kZWJ1Z2J1c1tpXS5k YXRhKTsKLQotCWtmcmVlKGE2eHhfc3RhdGUtPmRlYnVnYnVzKTsKLQotCWlmIChhNnh4X3N0YXRl LT52YmlmX2RlYnVnYnVzKQotCQlrZnJlZShhNnh4X3N0YXRlLT52YmlmX2RlYnVnYnVzLT5kYXRh KTsKLQotCWtmcmVlKGE2eHhfc3RhdGUtPnZiaWZfZGVidWdidXMpOwotCi0JZm9yIChpID0gMDsg aSA8IGE2eHhfc3RhdGUtPm5yX2N4X2RlYnVnYnVzOyBpKyspCi0JCWtmcmVlKGE2eHhfc3RhdGUt PmN4X2RlYnVnYnVzW2ldLmRhdGEpOwogCi0Ja2ZyZWUoYTZ4eF9zdGF0ZS0+Y3hfZGVidWdidXMp OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIHRtcCwgJmE2eHhfc3RhdGUtPm9ianMs IG5vZGUpCisJCWtmcmVlKG9iaik7CiAKIAlhZHJlbm9fZ3B1X3N0YXRlX2Rlc3Ryb3koc3RhdGUp OwogCWtmcmVlKGE2eHhfc3RhdGUpOwotLSAKMi4xOC4wCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpGcmVlZHJlbm8gbWFpbGluZyBsaXN0CkZyZWVkcmVu b0BsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9mcmVlZHJlbm8K