From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kay Sievers Date: Tue, 02 Jun 2009 14:05:13 +0000 Subject: Re: [GIT] Experimental threaded udev Message-Id: MIME-Version: 1 Content-Type: multipart/mixed; boundary="001485f7c3b4f4bd74046b5e088c" List-Id: References: <4A1EA138.10400@tuffmail.co.uk> In-Reply-To: <4A1EA138.10400@tuffmail.co.uk> To: linux-hotplug@vger.kernel.org --001485f7c3b4f4bd74046b5e088c Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Tue, Jun 2, 2009 at 13:39, Kay Sievers wrote: > On Tue, Jun 2, 2009 at 11:13, Alan Jenkins = wrote: >>> Version 3, which should clean up events with a worker that died. Also >>> kills all workers if the config has changed. >> >> For strict correctness, I guess we need to do the same for "udevadm cont= rol >> --log-priority" and "udevadm control --env". > > Yeah, makes sense, will add that. Did that. >> Hmm, it says worker_kill_idle(). =C2=A0If there are running events at th= e time, >> their stale workers will survive. =C2=A0At the moment kill(worker->pid, = SIGTERM) >> allows the current event to finish before it terminates, so one solution >> would be to just kill all the workers. > > The main daemon will wakeup with a timeout as long as workers exists. > There migt be several rounds of killing, until all workers are gone. We kill all workers now. Version 5. I guess we should go for the signalfd stuff, it looks prett nice. The socketpair instead of the rtsignal is also nice, it allows us to pass back arbitrary data from finished events to the main daemon. This is a full coldplug run for 520 devices: $ time udev/udevd [] user 0m0.016s sys 0m0.049s We need less than a second now (compared to 1.5 for the current version): $ time (udevadm trigger; udevadm settle) real 0m0.983s It spawned 35 workers for 500 events: $ ps ax | grep udevd | wc -l 35 Now that the page faults are gone, and the main daemon does not need that much CPU anymore, all the silly things show up, like running a few shell scripts. :) $ time (udevadm trigger; udevadm settle) real 0m0.959s $ mv /lib/udev/path_id /lib/udev/path_id.0 $ time (udevadm trigger -Snet; udevadm settle) real 0m0.714s Thanks, Kay --001485f7c3b4f4bd74046b5e088c Content-Type: text/x-patch; charset=US-ASCII; name="worker5.patch" Content-Disposition: attachment; filename="worker5.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fvgoil3x0 ZGlmZiAtLWdpdCBhL05FV1MgYi9ORVdTCmluZGV4IGFjNDRkN2EuLjhlOWExYmMgMTAwNjQ0Ci0t LSBhL05FV1MKKysrIGIvTkVXUwpAQCAtMiw2ICsyLDggQEAgdWRldiAxNDMKID09PT09PT09CiBC dWdmaXhlcy4KIAorSW5vdGlmeSBzdXBwb3J0IGlzIHJlcXVpcmVkIG5vdyB0byBjb21waWxlIGFu ZCBydW4gdWRldi4KKwogVGhlIGZvcm1hdCBvZiB0aGUgcXVldWUgZXhwb3J0ZWQgYnkgdGhlIHVk ZXYgZGFtb24gaGFzIGNoYW5nZWQuIFRoZXJlIGlzCiBubyBsb25nZXIgYSAvZGV2Ly51ZGV2L3F1 ZXVlLyBkaXJlY3RvcnkuIFRoZSBxdWV1ZSBjYW4gYmUgYWNjZXNzZWQgd2l0aAogdWRldmFkbSBz ZXR0bGUgYW5kIGxpYnVkZWR2LgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJl LmFjCmluZGV4IGYxZDAwOGUuLmYxMjYxNDYgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysg Yi9jb25maWd1cmUuYWMKQEAgLTIzLDEwICsyMyw2IEBAIEFDX1NVQlNUKExJQlVERVZfTFRfQUdF KQogCiBBQ19QQVRIX1BST0coW1hTTFRQUk9DXSwgW3hzbHRwcm9jXSkKIAotQUNfQ0hFQ0tfTElC KGMsIGlub3RpZnlfaW5pdCwKLQlbQUNfREVGSU5FKFtIQVZFX0lOT1RJRlldLCAxLCBbaW5vdGlm eSBhdmFpbGFibGVdKV0sCi0JW0FDX01TR19XQVJOKFtpbm90aWZ5IHN1cHBvcnQgZGlzYWJsZWRd KV0pCi0KIEFDX0FSR19XSVRIKHVkZXYtcHJlZml4LAogCUFTX0hFTFBfU1RSSU5HKFstLXdpdGgt dWRldi1wcmVmaXg9RElSXSwgW2FkZCBwcmVmaXggdG8gaW50ZXJuYWwgdWRldiBwYXRoIG5hbWVz XSksCiAJW10sIFt3aXRoX3VkZXZfcHJlZml4PScke2V4ZWNfcHJlZml4fSddKQpkaWZmIC0tZ2l0 IGEvdWRldi9NYWtlZmlsZS5hbSBiL3VkZXYvTWFrZWZpbGUuYW0KaW5kZXggNmNkMmYyMy4uOTQ5 ODllNiAxMDA2NDQKLS0tIGEvdWRldi9NYWtlZmlsZS5hbQorKysgYi91ZGV2L01ha2VmaWxlLmFt CkBAIC0xNCw3ICsxNCw2IEBAIGNvbW1vbl9sZGFkZCA9CiAKIGNvbW1vbl9maWxlcyA9IFwKIAl1 ZGV2LmggXAotCXVkZXYtc3lzZGVwcy5oIFwKIAl1ZGV2LWV2ZW50LmMgXAogCXVkZXYtd2F0Y2gu YyBcCiAJdWRldi1ub2RlLmMgXApkaWZmIC0tZ2l0IGEvdWRldi9saWIvbGlidWRldi1tb25pdG9y LmMgYi91ZGV2L2xpYi9saWJ1ZGV2LW1vbml0b3IuYwppbmRleCAzOTVhNGQyLi41NGM5NTc2IDEw MDY0NAotLS0gYS91ZGV2L2xpYi9saWJ1ZGV2LW1vbml0b3IuYworKysgYi91ZGV2L2xpYi9saWJ1 ZGV2LW1vbml0b3IuYwpAQCAtMzIsNyArMzIsNiBAQCBzdHJ1Y3QgdWRldl9tb25pdG9yIHsKIAlp bnQgcmVmY291bnQ7CiAJaW50IHNvY2s7CiAJc3RydWN0IHNvY2thZGRyX25sIHNubDsKLQlzdHJ1 Y3Qgc29ja2FkZHJfbmwgc25sX3BlZXI7CiAJc3RydWN0IHNvY2thZGRyX3VuIHN1bjsKIAlzb2Nr bGVuX3QgYWRkcmxlbjsKIAlzdHJ1Y3QgdWRldl9saXN0X25vZGUgZmlsdGVyX3N1YnN5c3RlbV9s aXN0OwpAQCAtMTcxLDggKzE3MCw4IEBAIHN0cnVjdCB1ZGV2X21vbml0b3IgKnVkZXZfbW9uaXRv cl9uZXdfZnJvbV9uZXRsaW5rKHN0cnVjdCB1ZGV2ICp1ZGV2LCBjb25zdCBjaGFyCiAJCXJldHVy biBOVUxMOwogCiAJaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHN0cmNt cChuYW1lLCAia2VybmVsIikgPT0gMCkKKwkJZ3JvdXAgPSAwOworCWVsc2UgaWYgKHN0cmNtcChu YW1lLCAia2VybmVsIikgPT0gMCkKIAkJZ3JvdXAgPSBVREVWX01PTklUT1JfS0VSTkVMOwogCWVs c2UgaWYgKHN0cmNtcChuYW1lLCAidWRldiIpID09IDApCiAJCWdyb3VwID0gVURFVl9NT05JVE9S X1VERVY7CkBAIC0xOTMsOCArMTkyLDYgQEAgc3RydWN0IHVkZXZfbW9uaXRvciAqdWRldl9tb25p dG9yX25ld19mcm9tX25ldGxpbmsoc3RydWN0IHVkZXYgKnVkZXYsIGNvbnN0IGNoYXIKIAogCXVk ZXZfbW9uaXRvci0+c25sLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CiAJdWRldl9tb25pdG9yLT5z bmwubmxfZ3JvdXBzID0gZ3JvdXA7Ci0JdWRldl9tb25pdG9yLT5zbmxfcGVlci5ubF9mYW1pbHkg PSBBRl9ORVRMSU5LOwotCXVkZXZfbW9uaXRvci0+c25sX3BlZXIubmxfZ3JvdXBzID0gVURFVl9N T05JVE9SX1VERVY7CiAKIAlkYmcodWRldiwgIm1vbml0b3IgJXAgY3JlYXRlZCB3aXRoIE5FVExJ TktfS09CSkVDVF9VRVZFTlQgKCV1KVxuIiwgdWRldl9tb25pdG9yLCBncm91cCk7CiAJcmV0dXJu IHVkZXZfbW9uaXRvcjsKQEAgLTQzNCw3ICs0MzEsNiBAQCBzdHJ1Y3QgdWRldl9kZXZpY2UgKnVk ZXZfbW9uaXRvcl9yZWNlaXZlX2RldmljZShzdHJ1Y3QgdWRldl9tb25pdG9yICp1ZGV2X21vbml0 bwogCXN0cnVjdCBpb3ZlYyBpb3Y7CiAJY2hhciBjcmVkX21zZ1tDTVNHX1NQQUNFKHNpemVvZihz dHJ1Y3QgdWNyZWQpKV07CiAJc3RydWN0IGNtc2doZHIgKmNtc2c7Ci0Jc3RydWN0IHNvY2thZGRy X25sIHNubDsKIAlzdHJ1Y3QgdWNyZWQgKmNyZWQ7CiAJY2hhciBidWZbODE5Ml07CiAJc3NpemVf dCBidWZsZW47CkBAIC00NTksMTEgKzQ1NSw2IEBAIHJldHJ5OgogCXNtc2cubXNnX2NvbnRyb2wg PSBjcmVkX21zZzsKIAlzbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNyZWRfbXNnKTsKIAot CWlmICh1ZGV2X21vbml0b3ItPnNubC5ubF9mYW1pbHkgIT0gMCkgewotCQlzbXNnLm1zZ19uYW1l ID0gJnNubDsKLQkJc21zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihzbmwpOwotCX0KLQogCWJ1Zmxl biA9IHJlY3Ztc2codWRldl9tb25pdG9yLT5zb2NrLCAmc21zZywgMCk7CiAJaWYgKGJ1ZmxlbiA8 IDApIHsKIAkJaWYgKGVycm5vICE9IEVJTlRSKQpAQCAtNDc2LDIwICs0NjcsNiBAQCByZXRyeToK IAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKHVkZXZfbW9uaXRvci0+c25sLm5sX2ZhbWlseSAh PSAwKSB7Ci0JCWlmIChzbmwubmxfZ3JvdXBzID09IDApIHsKLQkJCWluZm8odWRldl9tb25pdG9y LT51ZGV2LCAidW5pY2FzdCBuZXRsaW5rIG1lc3NhZ2UgaWdub3JlZFxuIik7Ci0JCQlyZXR1cm4g TlVMTDsKLQkJfQotCQlpZiAoc25sLm5sX2dyb3VwcyA9PSBVREVWX01PTklUT1JfS0VSTkVMKSB7 Ci0JCQlpZiAoc25sLm5sX3BpZCA+IDApIHsKLQkJCQlpbmZvKHVkZXZfbW9uaXRvci0+dWRldiwg Im11bHRpY2FzdCBrZXJuZWwgbmV0bGluayBtZXNzYWdlIGZyb20gcGlkICVkIGlnbm9yZWRcbiIs IHNubC5ubF9waWQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaXNfa2VybmVsID0gMTsK LQkJfQotCX0KLQogCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZzbXNnKTsKIAlpZiAoY21zZyA9PSBO VUxMIHx8IGNtc2ctPmNtc2dfdHlwZSAhPSBTQ01fQ1JFREVOVElBTFMpIHsKIAkJaW5mbyh1ZGV2 X21vbml0b3ItPnVkZXYsICJubyBzZW5kZXIgY3JlZGVudGlhbHMgcmVjZWl2ZWQsIG1lc3NhZ2Ug aWdub3JlZFxuIik7CkBAIC02MjEsNyArNTk4LDcgQEAgcmV0cnk6CiAJcmV0dXJuIHVkZXZfZGV2 aWNlOwogfQogCi1pbnQgdWRldl9tb25pdG9yX3NlbmRfZGV2aWNlKHN0cnVjdCB1ZGV2X21vbml0 b3IgKnVkZXZfbW9uaXRvciwgc3RydWN0IHVkZXZfZGV2aWNlICp1ZGV2X2RldmljZSkKK2ludCB1 ZGV2X21vbml0b3Jfc2VuZF9kZXZpY2Uoc3RydWN0IHVkZXZfbW9uaXRvciAqdWRldl9tb25pdG9y LCBzdHJ1Y3QgdWRldl9kZXZpY2UgKnVkZXZfZGV2aWNlLCBwaWRfdCBwaWQpCiB7CiAJc3RydWN0 IG1zZ2hkciBzbXNnOwogCXN0cnVjdCBpb3ZlYyBpb3ZbMl07CkBAIC02NjAsNiArNjM3LDcgQEAg aW50IHVkZXZfbW9uaXRvcl9zZW5kX2RldmljZShzdHJ1Y3QgdWRldl9tb25pdG9yICp1ZGV2X21v bml0b3IsIHN0cnVjdCB1ZGV2X2RldmkKIAl9IGVsc2UgaWYgKHVkZXZfbW9uaXRvci0+c25sLm5s X2ZhbWlseSAhPSAwKSB7CiAJCWNvbnN0IGNoYXIgKnZhbDsKIAkJc3RydWN0IHVkZXZfbW9uaXRv cl9uZXRsaW5rX2hlYWRlciBubGg7CisJCXN0cnVjdCBzb2NrYWRkcl9ubCBzbmxfcGVlcjsKIAog CiAJCS8qIGFkZCB2ZXJzaW9uZWQgaGVhZGVyICovCkBAIC02ODAsMTEgKzY1OCwxOCBAQCBpbnQg dWRldl9tb25pdG9yX3NlbmRfZGV2aWNlKHN0cnVjdCB1ZGV2X21vbml0b3IgKnVkZXZfbW9uaXRv ciwgc3RydWN0IHVkZXZfZGV2aQogCQlpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKWJ1ZjsKIAkJ aW92WzFdLmlvdl9sZW4gPSBibGVuOwogCisJCS8qIHdlIHdpbGwgYWx3YXlzIGdldCBFQ09OTlJF RlVTRUQgd2hlbiBzZW5kaW5nIHRvIHRoZSBtdXRpY2FzdCBncm91cCAqLworCQltZW1zZXQoJnNu bF9wZWVyLCAweDAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX25sKSk7CisJCXNubF9wZWVyLm5s X2ZhbWlseSA9IEFGX05FVExJTks7CisJCWlmIChwaWQgPiAwKQorCQkJc25sX3BlZXIubmxfcGlk ID0gcGlkOworCQllbHNlCisJCQlzbmxfcGVlci5ubF9ncm91cHMgPSBVREVWX01PTklUT1JfVURF VjsKKwogCQltZW1zZXQoJnNtc2csIDB4MDAsIHNpemVvZihzdHJ1Y3QgbXNnaGRyKSk7CiAJCXNt c2cubXNnX2lvdiA9IGlvdjsKIAkJc21zZy5tc2dfaW92bGVuID0gMjsKLQkJLyogbm8gZGVzdGlu YXRpb24gYmVzaWRlcyB0aGUgbXV0aWNhc3QgZ3JvdXAsIHdlIHdpbGwgYWx3YXlzIGdldCBFQ09O TlJFRlVTRUQgKi8KLQkJc21zZy5tc2dfbmFtZSA9ICZ1ZGV2X21vbml0b3ItPnNubF9wZWVyOwor CQlzbXNnLm1zZ19uYW1lID0gJnNubF9wZWVyOwogCQlzbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9m KHN0cnVjdCBzb2NrYWRkcl9ubCk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0 IGEvdWRldi9saWIvbGlidWRldi1wcml2YXRlLmggYi91ZGV2L2xpYi9saWJ1ZGV2LXByaXZhdGUu aAppbmRleCBkYzAyYTg0Li5lNjAwODAyIDEwMDY0NAotLS0gYS91ZGV2L2xpYi9saWJ1ZGV2LXBy aXZhdGUuaAorKysgYi91ZGV2L2xpYi9saWJ1ZGV2LXByaXZhdGUuaApAQCAtODYsNyArODYsNyBA QCBpbnQgdWRldl9kZXZpY2VfZGVsZXRlX2RiKHN0cnVjdCB1ZGV2X2RldmljZSAqdWRldl9kZXZp Y2UpOwogaW50IHVkZXZfZGV2aWNlX3JlbmFtZV9kYihzdHJ1Y3QgdWRldl9kZXZpY2UgKnVkZXZf ZGV2aWNlLCBjb25zdCBjaGFyICpkZXZwYXRoKTsKIAogLyogbGlidWRldi1tb25pdG9yIC0gbmV0 bGluay91bml4IHNvY2tldCBjb21tdW5pY2F0aW9uICAqLwotaW50IHVkZXZfbW9uaXRvcl9zZW5k X2RldmljZShzdHJ1Y3QgdWRldl9tb25pdG9yICp1ZGV2X21vbml0b3IsIHN0cnVjdCB1ZGV2X2Rl dmljZSAqdWRldl9kZXZpY2UpOworaW50IHVkZXZfbW9uaXRvcl9zZW5kX2RldmljZShzdHJ1Y3Qg dWRldl9tb25pdG9yICp1ZGV2X21vbml0b3IsIHN0cnVjdCB1ZGV2X2RldmljZSAqdWRldl9kZXZp Y2UsIHBpZF90IHBpZCk7CiBpbnQgdWRldl9tb25pdG9yX3NldF9yZWNlaXZlX2J1ZmZlcl9zaXpl KHN0cnVjdCB1ZGV2X21vbml0b3IgKnVkZXZfbW9uaXRvciwgaW50IHNpemUpOwogCiAvKiBsaWJ1 ZGV2LWN0cmwgLSBkYWVtb24gcnVudGltZSBzZXR1cCAqLwpkaWZmIC0tZ2l0IGEvdWRldi91ZGV2 LWV2ZW50LmMgYi91ZGV2L3VkZXYtZXZlbnQuYwppbmRleCBkNTIxMjUxLi44YWIyNjJhIDEwMDY0 NAotLS0gYS91ZGV2L3VkZXYtZXZlbnQuYworKysgYi91ZGV2L3VkZXYtZXZlbnQuYwpAQCAtNzM0 LDE4ICs3MzQsMTMgQEAgaW50IHVkZXZfZXZlbnRfZXhlY3V0ZV9ydW4oc3RydWN0IHVkZXZfZXZl bnQgKmV2ZW50KQogCQkJbW9uaXRvciA9IHVkZXZfbW9uaXRvcl9uZXdfZnJvbV9zb2NrZXQoZXZl bnQtPnVkZXYsICZjbWRbc3RybGVuKCJzb2NrZXQ6IildKTsKIAkJCWlmIChtb25pdG9yID09IE5V TEwpCiAJCQkJY29udGludWU7Ci0JCQl1ZGV2X21vbml0b3Jfc2VuZF9kZXZpY2UobW9uaXRvciwg ZXZlbnQtPmRldik7CisJCQl1ZGV2X21vbml0b3Jfc2VuZF9kZXZpY2UobW9uaXRvciwgZXZlbnQt PmRldiwgMCk7CiAJCQl1ZGV2X21vbml0b3JfdW5yZWYobW9uaXRvcik7CiAJCX0gZWxzZSB7CiAJ CQljaGFyIHByb2dyYW1bVVRJTF9QQVRIX1NJWkVdOwogCQkJY2hhciAqKmVudnA7CiAKIAkJCXVk ZXZfZXZlbnRfYXBwbHlfZm9ybWF0KGV2ZW50LCBjbWQsIHByb2dyYW0sIHNpemVvZihwcm9ncmFt KSk7Ci0JCQlpZiAoZXZlbnQtPnRyYWNlKQotCQkJCWZwcmludGYoc3RkZXJyLCAicnVuICAlcyAo JWxsdSkgJyVzJ1xuIiwKLQkJCQkgICAgICAgdWRldl9kZXZpY2VfZ2V0X3N5c3BhdGgoZXZlbnQt PmRldiksCi0JCQkJICAgICAgIHVkZXZfZGV2aWNlX2dldF9zZXFudW0oZXZlbnQtPmRldiksCi0J CQkJICAgICAgIHByb2dyYW0pOwogCQkJZW52cCA9IHVkZXZfZGV2aWNlX2dldF9wcm9wZXJ0aWVz X2VudnAoZXZlbnQtPmRldik7CiAJCQlpZiAodXRpbF9ydW5fcHJvZ3JhbShldmVudC0+dWRldiwg cHJvZ3JhbSwgZW52cCwgTlVMTCwgMCwgTlVMTCkgIT0gMCkgewogCQkJCWlmICghdWRldl9saXN0 X2VudHJ5X2dldF9mbGFnKGxpc3RfZW50cnkpKQpkaWZmIC0tZ2l0IGEvdWRldi91ZGV2LXN5c2Rl cHMuaCBiL3VkZXYvdWRldi1zeXNkZXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDM1NjcxYmEuLjAwMDAwMDAKLS0tIGEvdWRldi91ZGV2LXN5c2RlcHMuaAorKysgL2Rldi9udWxs CkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiB3cmFwcGluZyBvZiBsaWJjIGZlYXR1cmVzIGFuZCBr ZXJuZWwgaW50ZXJmYWNlcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IEtheSBTaWV2 ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIg b2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+LgotICovCi0KLSNpZm5kZWYgX1VERVZfU1lTREVQU19IXwotI2RlZmluZSBfVURFVl9TWVNE RVBTX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZu ZGVmIEhBVkVfSU5PVElGWQotc3RhdGljIGlubGluZSBpbnQgaW5vdGlmeV9pbml0KHZvaWQpCi17 Ci0JZXJybm8gPSBFTk9TWVM7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBp bm90aWZ5X2FkZF93YXRjaChpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IG1hc2sp Ci17Ci0JcmV0dXJuIC0xOwotfQotCi0jZGVmaW5lIElOX0NSRUFURQkwCi0jZGVmaW5lIElOX0RF TEVURQkwCi0jZGVmaW5lIElOX01PVkUJCTAKLSNkZWZpbmUgSU5fQ0xPU0VfV1JJVEUJMAotCi0j ZW5kaWYgLyogSEFWRV9JTk9USUZZICovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3VkZXYvdWRldi13 YXRjaC5jIGIvdWRldi91ZGV2LXdhdGNoLmMKaW5kZXggNTM0OTJlNS4uNWE0OWM5NiAxMDA2NDQK LS0tIGEvdWRldi91ZGV2LXdhdGNoLmMKKysrIGIvdWRldi91ZGV2LXdhdGNoLmMKQEAgLTI2LDI3 ICsyNiwyNCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2lu Y2x1ZGUgPHVuaXN0ZC5oPgotI2lmZGVmIEhBVkVfSU5PVElGWQogI2luY2x1ZGUgPHN5cy9pbm90 aWZ5Lmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgInVkZXYuaCIKIAotaW50IGlub3RpZnlfZmQgPSAt MTsKK3N0YXRpYyBpbnQgaW5vdGlmeV9mZCA9IC0xOwogCiAvKiBpbm90aWZ5IGRlc2NyaXB0b3Is IHdpbGwgYmUgc2hhcmVkIHdpdGggcnVsZXMgZGlyZWN0b3J5OwogICogc2V0IHRvIGNsb2V4ZWMg c2luY2Ugd2UgbmVlZCBvdXIgY2hpbGRyZW4gdG8gYmUgYWJsZSB0byBhZGQKICAqIHdhdGNoZXMg Zm9yIHVzCiAgKi8KLXZvaWQgdWRldl93YXRjaF9pbml0KHN0cnVjdCB1ZGV2ICp1ZGV2KQoraW50 IHVkZXZfd2F0Y2hfaW5pdChzdHJ1Y3QgdWRldiAqdWRldikKIHsKIAlpbm90aWZ5X2ZkID0gaW5v dGlmeV9pbml0KCk7CiAJaWYgKGlub3RpZnlfZmQgPj0gMCkKIAkJdXRpbF9zZXRfZmRfY2xvZXhl Yyhpbm90aWZ5X2ZkKTsKLQllbHNlIGlmIChlcnJubyA9PSBFTk9TWVMpCi0JCWluZm8odWRldiwg InVuYWJsZSB0byB1c2UgaW5vdGlmeSwgdWRldmQgd2lsbCBub3QgbW9uaXRvciBydWxlIGZpbGVz IGNoYW5nZXNcbiIpOwogCWVsc2UKIAkJZXJyKHVkZXYsICJpbm90aWZ5X2luaXQgZmFpbGVkOiAl bVxuIik7CisJcmV0dXJuIGlub3RpZnlfZmQ7CiB9CiAKIC8qIG1vdmUgYW55IG9sZCB3YXRjaGVz IGRpcmVjdG9yeSBvdXQgb2YgdGhlIHdheSwgYW5kIHRoZW4gcmVzdG9yZQpkaWZmIC0tZ2l0IGEv dWRldi91ZGV2LmggYi91ZGV2L3VkZXYuaAppbmRleCA4ZjJjMWM2Li43MTg3OTc1IDEwMDY0NAot LS0gYS91ZGV2L3VkZXYuaAorKysgYi91ZGV2L3VkZXYuaApAQCAtMjIsNyArMjIsNiBAQAogI2lu Y2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgogCi0jaW5jbHVkZSAi dWRldi1zeXNkZXBzLmgiCiAjaW5jbHVkZSAibGliL2xpYnVkZXYuaCIKICNpbmNsdWRlICJsaWIv bGlidWRldi1wcml2YXRlLmgiCiAKQEAgLTUzLDcgKzUyLDYgQEAgc3RhdGljIGlubGluZSB2b2lk IGxvZ2dpbmdfY2xvc2Uodm9pZCkKIH0KIAogc3RydWN0IHVkZXZfZXZlbnQgewotCXN0cnVjdCB1 ZGV2X2xpc3Rfbm9kZSBub2RlOwogCXN0cnVjdCB1ZGV2ICp1ZGV2OwogCXN0cnVjdCB1ZGV2X2Rl dmljZSAqZGV2OwogCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2X3BhcmVudDsKQEAgLTY0LDEwICs2 Miw2IEBAIHN0cnVjdCB1ZGV2X2V2ZW50IHsKIAl1aWRfdCB1aWQ7CiAJZ2lkX3QgZ2lkOwogCXN0 cnVjdCB1ZGV2X2xpc3Rfbm9kZSBydW5fbGlzdDsKLQlwaWRfdCBwaWQ7Ci0JaW50IGV4aXRzdGF0 dXM7Ci0JdGltZV90IHF1ZXVlX3RpbWU7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGludCBkZWxheWlu Z19zZXFudW07CiAJdW5zaWduZWQgaW50IGdyb3VwX2ZpbmFsOjE7CiAJdW5zaWduZWQgaW50IG93 bmVyX2ZpbmFsOjE7CiAJdW5zaWduZWQgaW50IG1vZGVfZmluYWw6MTsKQEAgLTc2LDcgKzcwLDYg QEAgc3RydWN0IHVkZXZfZXZlbnQgewogCXVuc2lnbmVkIGludCBydW5fZmluYWw6MTsKIAl1bnNp Z25lZCBpbnQgaWdub3JlX2RldmljZToxOwogCXVuc2lnbmVkIGludCBpbm90aWZ5X3dhdGNoOjE7 Ci0JdW5zaWduZWQgaW50IHRyYWNlOjE7CiB9OwogCiBzdHJ1Y3QgdWRldl93YXRjaCB7CkBAIC0x MDEsOCArOTQsNyBAQCBpbnQgdWRldl9ldmVudF9hcHBseV9zdWJzeXNfa2VybmVsKHN0cnVjdCB1 ZGV2X2V2ZW50ICpldmVudCwgY29uc3QgY2hhciAqc3RyaW5nLAogCQkJCSAgIGNoYXIgKnJlc3Vs dCwgc2l6ZV90IG1heHNpemUsIGludCByZWFkX3ZhbHVlKTsKIAogLyogdWRldi13YXRjaC5jICov Ci1leHRlcm4gaW50IGlub3RpZnlfZmQ7Ci12b2lkIHVkZXZfd2F0Y2hfaW5pdChzdHJ1Y3QgdWRl diAqdWRldik7CitpbnQgdWRldl93YXRjaF9pbml0KHN0cnVjdCB1ZGV2ICp1ZGV2KTsKIHZvaWQg dWRldl93YXRjaF9yZXN0b3JlKHN0cnVjdCB1ZGV2ICp1ZGV2KTsKIHZvaWQgdWRldl93YXRjaF9i ZWdpbihzdHJ1Y3QgdWRldiAqdWRldiwgc3RydWN0IHVkZXZfZGV2aWNlICpkZXYpOwogdm9pZCB1 ZGV2X3dhdGNoX2VuZChzdHJ1Y3QgdWRldiAqdWRldiwgc3RydWN0IHVkZXZfZGV2aWNlICpkZXYp OwpkaWZmIC0tZ2l0IGEvdWRldi91ZGV2YWRtLnhtbCBiL3VkZXYvdWRldmFkbS54bWwKaW5kZXgg NTM4MTgwYi4uMmUwM2Q5OCAxMDA2NDQKLS0tIGEvdWRldi91ZGV2YWRtLnhtbAorKysgYi91ZGV2 L3VkZXZhZG0ueG1sCkBAIC0yODUsOSArMjg1LDkgQEAKICAgICAgICAgICAgICAgPHRlcm0+PG9w dGlvbj4tLXJlbG9hZC1ydWxlczwvb3B0aW9uPjwvdGVybT4KICAgICAgICAgICAgICAgPGxpc3Rp dGVtPgogICAgICAgICAgICAgICAgIDxwYXJhPlNpZ25hbCB1ZGV2ZCB0byByZWxvYWQgdGhlIHJ1 bGVzIGZpbGVzLgotICAgICAgICAgICAgICAgIFVzdWFsbHkgdGhlIHVkZXYgZGFlbW9uIGRldGVj dHMgY2hhbmdlcyBhdXRvbWF0aWNhbGx5LCB0aGlzIG1heQotICAgICAgICAgICAgICAgIG9ubHkg YmUgbmVlZGVkIG9uIHN5c3RlbXMgd2l0aG91dCBpbm90aWZ5IHN1cHBvcnQuIFJlbG9hZGluZyBy dWxlcwotICAgICAgICAgICAgICAgIGRvZXMgbm90IGFwcGx5IGFueSBjaGFuZ2VzIHRvIGFscmVh ZHkgZXhpc3RpbmcgZGV2aWNlcy48L3BhcmE+CisgICAgICAgICAgICAgICAgVGhlIHVkZXYgZGFl bW9uIGRldGVjdHMgY2hhbmdlcyBhdXRvbWF0aWNhbGx5LCB0aGlzIG9wdGlvbiBpcworICAgICAg ICAgICAgICAgIHVzdWFsbHkgbm90IG5lZWRlZC4gUmVsb2FkaW5nIHJ1bGVzIGRvZXMgbm90IGFw cGx5IGFueSBjaGFuZ2VzCisgICAgICAgICAgICAgICAgdG8gYWxyZWFkeSBleGlzdGluZyBkZXZp Y2VzLjwvcGFyYT4KICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KICAgICAgICAgICAgIDwvdmFy bGlzdGVudHJ5PgogICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KZGlmZiAtLWdpdCBhL3VkZXYv dWRldmQuYyBiL3VkZXYvdWRldmQuYwppbmRleCAzN2I1NDdhLi42YjQ3YTMwIDEwMDY0NAotLS0g YS91ZGV2L3VkZXZkLmMKKysrIGIvdWRldi91ZGV2ZC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAq IENvcHlyaWdodCAoQykgMjAwNC0yMDA4IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9y Zz4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2 cmZ5Lm9yZz4KICAqIENvcHlyaWdodCAoQykgMjAwNCBDaHJpcyBGcmllc2VuIDxjaHJpc19mcmll c2VuQHN5bXBhdGljby5jYT4KICAqIENvcHlyaWdodCAoQykgMjAwOSBDYW5vbmljYWwgTHRkLgog ICogQ29weXJpZ2h0IChDKSAyMDA5IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0 LmNvbT4KQEAgLTMwLDIzICszMCwyMSBAQAogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxn ZXRvcHQuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNp bmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbGZkLmg+CiAjaW5jbHVk ZSA8c3lzL3NlbGVjdC5oPgogI2luY2x1ZGUgPHN5cy9wb2xsLmg+CiAjaW5jbHVkZSA8c3lzL3dh aXQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2lm ZGVmIEhBVkVfSU5PVElGWQogI2luY2x1ZGUgPHN5cy9pbm90aWZ5Lmg+Ci0jZW5kaWYKIAogI2lu Y2x1ZGUgInVkZXYuaCIKIAogI2RlZmluZSBVREVWRF9QUklPUklUWQkJCS00CiAjZGVmaW5lIFVE RVZfUFJJT1JJVFkJCQktMgogCi0vKiBtYXhpbXVtIGxpbWl0IG9mIGZvcmtlZCBjaGlsZHMgKi8K LSNkZWZpbmUgVURFVkRfTUFYX0NISUxEUwkJMjU2Ci0KIHN0YXRpYyBpbnQgZGVidWc7CiAKIHN0 YXRpYyB2b2lkIGxvZ19mbihzdHJ1Y3QgdWRldiAqdWRldiwgaW50IHByaW9yaXR5LApAQCAtNjEs MTYzICs1OSwzMjAgQEAgc3RhdGljIHZvaWQgbG9nX2ZuKHN0cnVjdCB1ZGV2ICp1ZGV2LCBpbnQg cHJpb3JpdHksCiAJfQogfQogCi1zdGF0aWMgdm9pZCByZWFwX3NpZ2NoaWxkcyh2b2lkKTsKLQog c3RhdGljIGludCBkZWJ1Z190cmFjZTsKIHN0YXRpYyBzdHJ1Y3QgdWRldl9ydWxlcyAqcnVsZXM7 CiBzdGF0aWMgc3RydWN0IHVkZXZfcXVldWVfZXhwb3J0ICp1ZGV2X3F1ZXVlX2V4cG9ydDsKIHN0 YXRpYyBzdHJ1Y3QgdWRldl9jdHJsICp1ZGV2X2N0cmw7Ci1zdGF0aWMgc3RydWN0IHVkZXZfbW9u aXRvciAqa2VybmVsX21vbml0b3I7Ci1zdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHNpZ2No aWxkc193YWl0aW5nOwotc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCB1ZGV2X2V4aXQ7Ci1z dGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHJlbG9hZF9jb25maWc7Ci1zdGF0aWMgdm9sYXRp bGUgc2lnX2F0b21pY190IHNpZ25hbF9yZWNlaXZlZDsKLXN0YXRpYyB2b2xhdGlsZSBwaWRfdCBz ZXR0bGVfcGlkOwotc3RhdGljIGludCBydW5fZXhlY19xOwotc3RhdGljIGludCBzdG9wX2V4ZWNf cTsKK3N0YXRpYyBzdHJ1Y3QgdWRldl9tb25pdG9yICptb25pdG9yOworc3RhdGljIGludCB3b3Jr ZXJfc29ja2V0WzJdOworc3RhdGljIHBpZF90IHNldHRsZV9waWQ7CitzdGF0aWMgaW50IHN0b3Bf ZXhlY19xdWV1ZTsKK3N0YXRpYyBpbnQgcmVsb2FkX2NvbmZpZzsKIHN0YXRpYyBpbnQgbWF4X2No aWxkczsKIHN0YXRpYyBpbnQgY2hpbGRzOwogc3RhdGljIHN0cnVjdCB1ZGV2X2xpc3Rfbm9kZSBl dmVudF9saXN0OwotCi1zdGF0aWMgc3RydWN0IHVkZXZfZXZlbnQgKm5vZGVfdG9fZXZlbnQoc3Ry dWN0IHVkZXZfbGlzdF9ub2RlICpub2RlKQorc3RhdGljIHN0cnVjdCB1ZGV2X2xpc3Rfbm9kZSB3 b3JrZXJfbGlzdDsKK3N0YXRpYyBpbnQgdWRldl9leGl0Oworc3RhdGljIHZvbGF0aWxlIHNpZ19h dG9taWNfdCB3b3JrZXJfZXhpdDsKKworZW51bSBwb2xsX2ZkIHsKKwlGRF9DT05UUk9MLAorCUZE X05FVExJTkssCisJRkRfSU5PVElGWSwKKwlGRF9TSUdOQUwsCisJRkRfV09SS0VSLAorfTsKKwor c3RhdGljIHN0cnVjdCBwb2xsZmQgcGZkW10gPSB7CisJW0ZEX05FVExJTktdID0geyAuZXZlbnRz ID0gUE9MTElOIH0sCisJW0ZEX1dPUktFUl0gPSAgeyAuZXZlbnRzID0gUE9MTElOIH0sCisJW0ZE X1NJR05BTF0gPSAgeyAuZXZlbnRzID0gUE9MTElOIH0sCisJW0ZEX0lOT1RJRlldID0geyAuZXZl bnRzID0gUE9MTElOIH0sCisJW0ZEX0NPTlRST0xdID0geyAuZXZlbnRzID0gUE9MTElOIH0sCit9 OworCitlbnVtIGV2ZW50X3N0YXRlIHsKKwlFVkVOVF9VTkRFRiwKKwlFVkVOVF9RVUVVRUQsCisJ RVZFTlRfUlVOTklORywKK307CisKK3N0cnVjdCBldmVudCB7CisJc3RydWN0IHVkZXZfbGlzdF9u b2RlIG5vZGU7CisJc3RydWN0IHVkZXYgKnVkZXY7CisJc3RydWN0IHVkZXZfZGV2aWNlICpkZXY7 CisJZW51bSBldmVudF9zdGF0ZSBzdGF0ZTsKKwlpbnQgZXhpdGNvZGU7CisJdW5zaWduZWQgbG9u ZyBsb25nIGludCBkZWxheWluZ19zZXFudW07CisJdW5zaWduZWQgbG9uZyBsb25nIGludCBzZXFu dW07CisJY29uc3QgY2hhciAqZGV2cGF0aDsKKwlzaXplX3QgZGV2cGF0aF9sZW47CisJY29uc3Qg Y2hhciAqZGV2cGF0aF9vbGQ7Cit9OworCitzdGF0aWMgc3RydWN0IGV2ZW50ICpub2RlX3RvX2V2 ZW50KHN0cnVjdCB1ZGV2X2xpc3Rfbm9kZSAqbm9kZSkKIHsKIAljaGFyICpldmVudDsKIAogCWV2 ZW50ID0gKGNoYXIgKilub2RlOwotCWV2ZW50IC09IG9mZnNldG9mKHN0cnVjdCB1ZGV2X2V2ZW50 LCBub2RlKTsKLQlyZXR1cm4gKHN0cnVjdCB1ZGV2X2V2ZW50ICopZXZlbnQ7CisJZXZlbnQgLT0g b2Zmc2V0b2Yoc3RydWN0IGV2ZW50LCBub2RlKTsKKwlyZXR1cm4gKHN0cnVjdCBldmVudCAqKWV2 ZW50OwogfQogCi1zdGF0aWMgdm9pZCBldmVudF9xdWV1ZV9kZWxldGUoc3RydWN0IHVkZXZfZXZl bnQgKmV2ZW50KQorZW51bSB3b3JrZXJfc3RhdGUgeworCVdPUktFUl9VTkRFRiwKKwlXT1JLRVJf UlVOTklORywKKwlXT1JLRVJfSURMRSwKKwlXT1JLRVJfS0lMTEVELAorfTsKKworc3RydWN0IHdv cmtlciB7CisJc3RydWN0IHVkZXZfbGlzdF9ub2RlIG5vZGU7CisJcGlkX3QgcGlkOworCWVudW0g d29ya2VyX3N0YXRlIHN0YXRlOworCXN0cnVjdCBldmVudCAqZXZlbnQ7Cit9OworCisvKiBwYXNz ZWQgZnJvbSB3b3JrZXIgdG8gbWFpbiBwcm9jZXNzICovCitzdHJ1Y3Qgd29ya2VyX21lc3NhZ2Ug eworCXBpZF90IHBpZDsKKwlpbnQgZXhpdGNvZGU7Cit9OworCitzdGF0aWMgc3RydWN0IHdvcmtl ciAqbm9kZV90b193b3JrZXIoc3RydWN0IHVkZXZfbGlzdF9ub2RlICpub2RlKQoreworCWNoYXIg KndvcmtlcjsKKworCXdvcmtlciA9IChjaGFyICopbm9kZTsKKwl3b3JrZXIgLT0gb2Zmc2V0b2Yo c3RydWN0IHdvcmtlciwgbm9kZSk7CisJcmV0dXJuIChzdHJ1Y3Qgd29ya2VyICopd29ya2VyOwor fQorCitzdGF0aWMgdm9pZCBldmVudF9xdWV1ZV9kZWxldGUoc3RydWN0IGV2ZW50ICpldmVudCkK IHsKIAl1ZGV2X2xpc3Rfbm9kZV9yZW1vdmUoJmV2ZW50LT5ub2RlKTsKIAogCS8qIG1hcmsgYXMg ZmFpbGVkLCBpZiAiYWRkIiBldmVudCByZXR1cm5zIG5vbi16ZXJvICovCi0JaWYgKGV2ZW50LT5l eGl0c3RhdHVzICYmIHN0cmNtcCh1ZGV2X2RldmljZV9nZXRfYWN0aW9uKGV2ZW50LT5kZXYpLCAi YWRkIikgPT0gMCkKKwlpZiAoZXZlbnQtPmV4aXRjb2RlICYmIHN0cmNtcCh1ZGV2X2RldmljZV9n ZXRfYWN0aW9uKGV2ZW50LT5kZXYpLCAiYWRkIikgPT0gMCkKIAkJdWRldl9xdWV1ZV9leHBvcnRf ZGV2aWNlX2ZhaWxlZCh1ZGV2X3F1ZXVlX2V4cG9ydCwgZXZlbnQtPmRldik7CiAJZWxzZQogCQl1 ZGV2X3F1ZXVlX2V4cG9ydF9kZXZpY2VfZmluaXNoZWQodWRldl9xdWV1ZV9leHBvcnQsIGV2ZW50 LT5kZXYpOwogCiAJdWRldl9kZXZpY2VfdW5yZWYoZXZlbnQtPmRldik7Ci0JdWRldl9ldmVudF91 bnJlZihldmVudCk7CisJZnJlZShldmVudCk7CiB9CiAKIHN0YXRpYyB2b2lkIGV2ZW50X3NpZ19o YW5kbGVyKGludCBzaWdudW0pCiB7Ci0JaWYgKHNpZ251bSA9PSBTSUdBTFJNKQorCXN3aXRjaCAo c2lnbnVtKSB7CisJY2FzZSBTSUdBTFJNOgogCQlfZXhpdCgxKTsKKwkJYnJlYWs7CisJY2FzZSBT SUdURVJNOgorCQl3b3JrZXJfZXhpdCA9IDE7CisJCWJyZWFrOworCX0KIH0KIAotc3RhdGljIHZv aWQgZXZlbnRfZm9yayhzdHJ1Y3QgdWRldl9ldmVudCAqZXZlbnQpCitzdGF0aWMgdm9pZCB3b3Jr ZXJfbmV3KHN0cnVjdCBldmVudCAqZXZlbnQpCiB7CisJc3RydWN0IHdvcmtlciAqd29ya2VyOwog CXBpZF90IHBpZDsKIAlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKLQlpbnQgZXJyOwotCi0jaWYgMAot CS8qIHNpbmdsZSBwcm9jZXNzLCBubyBmb3JraW5nLCBqdXN0IGZvciB0ZXN0aW5nL3Byb2ZpbGlu ZyAqLwotCWVyciA9IHVkZXZfZXZlbnRfZXhlY3V0ZV9ydWxlcyhldmVudCwgcnVsZXMpOwotCWlm IChlcnIgPT0gMCAmJiAhZXZlbnQtPmlnbm9yZV9kZXZpY2UgJiYgdWRldl9nZXRfcnVuKGV2ZW50 LT51ZGV2KSkKLQkJdWRldl9ldmVudF9leGVjdXRlX3J1bihldmVudCk7Ci0JaW5mbyhldmVudC0+ dWRldiwgInNlcSAlbGx1IGV4aXQgd2l0aCAlaVxuIiwgdWRldl9kZXZpY2VfZ2V0X3NlcW51bShl dmVudC0+ZGV2KSwgZXJyKTsKLQlldmVudF9xdWV1ZV9kZWxldGUoZXZlbnQpOwotCXJldHVybjsK LSNlbmRpZgogCi0JaWYgKGRlYnVnX3RyYWNlKSB7Ci0JCWV2ZW50LT50cmFjZSA9IDE7Ci0JCWZw cmludGYoc3RkZXJyLCAiZm9yayAlcyAoJWxsdSlcbiIsCi0JCSAgICAgICB1ZGV2X2RldmljZV9n ZXRfc3lzcGF0aChldmVudC0+ZGV2KSwKLQkJICAgICAgIHVkZXZfZGV2aWNlX2dldF9zZXFudW0o ZXZlbnQtPmRldikpOwotCX0KKwl3b3JrZXIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB3b3Jr ZXIpKTsKKwlpZiAod29ya2VyID09IE5VTEwpCisJCXJldHVybjsKIAogCXBpZCA9IGZvcmsoKTsK IAlzd2l0Y2ggKHBpZCkgewotCWNhc2UgMDoKLQkJLyogY2hpbGQgKi8KKwljYXNlIDA6IHsKKwkJ c2lnc2V0X3QgbWFzazsKKwkJc3RydWN0IHVkZXZfZGV2aWNlICpkZXY7CisKIAkJdWRldl9xdWV1 ZV9leHBvcnRfdW5yZWYodWRldl9xdWV1ZV9leHBvcnQpOwogCQl1ZGV2X2N0cmxfdW5yZWYodWRl dl9jdHJsKTsKKwkJdWRldl9tb25pdG9yX3VucmVmKG1vbml0b3IpOworCQljbG9zZShwZmRbRkRf U0lHTkFMXS5mZCk7CisJCWNsb3NlKHdvcmtlcl9zb2NrZXRbUkVBRF9FTkRdKTsKIAkJbG9nZ2lu Z19jbG9zZSgpOwotCQlsb2dnaW5nX2luaXQoInVkZXZkLWV2ZW50Iik7CisJCWxvZ2dpbmdfaW5p dCgidWRldmQtd29yayIpOwogCQlzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIFVERVZfUFJJ T1JJVFkpOwogCisJCS8qIHJlLW9wZW4gc29ja2V0IHRvIGxpc3RlbiB0byB1ZGV2ZCBvbmx5LCBh bmQgc2VuZCBiYWNrIGxpYnVkZXYgZXZlbnRzICovCisJCW1vbml0b3IgPSB1ZGV2X21vbml0b3Jf bmV3X2Zyb21fbmV0bGluayhldmVudC0+dWRldiwgTlVMTCk7CisJCWlmIChtb25pdG9yID09IE5V TEwpCisJCQlfZXhpdCgyKTsKKwkJdWRldl9tb25pdG9yX2VuYWJsZV9yZWNlaXZpbmcobW9uaXRv cik7CisKIAkJLyogc2V0IHNpZ25hbCBoYW5kbGVycyAqLwogCQltZW1zZXQoJmFjdCwgMHgwMCwg c2l6ZW9mKGFjdCkpOwogCQlhY3Quc2FfaGFuZGxlciA9IGV2ZW50X3NpZ19oYW5kbGVyOwogCQlz aWdlbXB0eXNldCAoJmFjdC5zYV9tYXNrKTsKIAkJYWN0LnNhX2ZsYWdzID0gMDsKKwkJc2lnYWN0 aW9uKFNJR1RFUk0sICZhY3QsIE5VTEwpOwogCQlzaWdhY3Rpb24oU0lHQUxSTSwgJmFjdCwgTlVM TCk7CiAKLQkJLyogcmVzZXQgdG8gZGVmYXVsdCAqLwotCQlhY3Quc2FfaGFuZGxlciA9IFNJR19E Rkw7Ci0JCXNpZ2FjdGlvbihTSUdJTlQsICZhY3QsIE5VTEwpOwotCQlzaWdhY3Rpb24oU0lHVEVS TSwgJmFjdCwgTlVMTCk7Ci0JCXNpZ2FjdGlvbihTSUdDSExELCAmYWN0LCBOVUxMKTsKLQkJc2ln YWN0aW9uKFNJR0hVUCwgJmFjdCwgTlVMTCk7CisJCS8qIHVuYmxvY2sgc2lnbmFscyAqLworCQlz aWdmaWxsc2V0KCZtYXNrKTsKKwkJc2lnZGVsc2V0KCZtYXNrLCBTSUdURVJNKTsKKwkJc2lnZGVs c2V0KCZtYXNrLCBTSUdBTFJNKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZtYXNrLCBO VUxMKTsKIAotCQkvKiBzZXQgdGltZW91dCB0byBwcmV2ZW50IGhhbmdpbmcgcHJvY2Vzc2VzICov Ci0JCWFsYXJtKFVERVZfRVZFTlRfVElNRU9VVCk7CisJCS8qIHJlcXVlc3QgVEVSTSBzaWduYWwg aWYgbWFpbiBkYWVtb24gZXhpdHMgKi8KKwkJcHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lHVEVS TSk7CiAKLQkJLyogYXBwbHkgcnVsZXMsIGNyZWF0ZSBub2RlLCBzeW1saW5rcyAqLwotCQllcnIg PSB1ZGV2X2V2ZW50X2V4ZWN1dGVfcnVsZXMoZXZlbnQsIHJ1bGVzKTsKKwkJLyogaW5pdGlhbCBk ZXZpY2UgKi8KKwkJZGV2ID0gZXZlbnQtPmRldjsKIAotCQkvKiBydWxlcyBtYXkgY2hhbmdlL2Rp c2FibGUgdGhlIHRpbWVvdXQgKi8KLQkJaWYgKHVkZXZfZGV2aWNlX2dldF9ldmVudF90aW1lb3V0 KGV2ZW50LT5kZXYpID49IDApCi0JCQlhbGFybSh1ZGV2X2RldmljZV9nZXRfZXZlbnRfdGltZW91 dChldmVudC0+ZGV2KSk7CisJCXdoaWxlICghd29ya2VyX2V4aXQpIHsKKwkJCXN0cnVjdCB1ZGV2 X2V2ZW50ICp1ZGV2X2V2ZW50OworCQkJc3RydWN0IHdvcmtlcl9tZXNzYWdlIG1zZzsKKwkJCWlu dCBlcnI7CiAKLQkJLyogZXhlY3V0ZSBSVU49ICovCi0JCWlmIChlcnIgPT0gMCAmJiAhZXZlbnQt Pmlnbm9yZV9kZXZpY2UgJiYgdWRldl9nZXRfcnVuKGV2ZW50LT51ZGV2KSkKLQkJCXVkZXZfZXZl bnRfZXhlY3V0ZV9ydW4oZXZlbnQpOworCQkJdWRldl9ldmVudCA9IHVkZXZfZXZlbnRfbmV3KGRl dik7CisJCQlpZiAodWRldl9ldmVudCA9PSBOVUxMKQorCQkJCV9leGl0KDMpOwogCi0JCS8qIGFw cGx5L3Jlc3RvcmUgaW5vdGlmeSB3YXRjaCAqLwotCQlpZiAoZXJyID09IDAgJiYgZXZlbnQtPmlu b3RpZnlfd2F0Y2gpIHsKLQkJCXVkZXZfd2F0Y2hfYmVnaW4oZXZlbnQtPnVkZXYsIGV2ZW50LT5k ZXYpOwotCQkJdWRldl9kZXZpY2VfdXBkYXRlX2RiKGV2ZW50LT5kZXYpOwotCQl9CisJCQkvKiBz ZXQgdGltZW91dCB0byBwcmV2ZW50IGhhbmdpbmcgcHJvY2Vzc2VzICovCisJCQlhbGFybShVREVW X0VWRU5UX1RJTUVPVVQpOworCisJCQkvKiBhcHBseSBydWxlcywgY3JlYXRlIG5vZGUsIHN5bWxp bmtzICovCisJCQllcnIgPSB1ZGV2X2V2ZW50X2V4ZWN1dGVfcnVsZXModWRldl9ldmVudCwgcnVs ZXMpOworCisJCQkvKiBydWxlcyBtYXkgY2hhbmdlL2Rpc2FibGUgdGhlIHRpbWVvdXQgKi8KKwkJ CWlmICh1ZGV2X2RldmljZV9nZXRfZXZlbnRfdGltZW91dChkZXYpID49IDApCisJCQkJYWxhcm0o dWRldl9kZXZpY2VfZ2V0X2V2ZW50X3RpbWVvdXQoZGV2KSk7CisKKwkJCS8qIGV4ZWN1dGUgUlVO PSAqLworCQkJaWYgKGVyciA9PSAwICYmICF1ZGV2X2V2ZW50LT5pZ25vcmVfZGV2aWNlICYmIHVk ZXZfZ2V0X3J1bih1ZGV2X2V2ZW50LT51ZGV2KSkKKwkJCQl1ZGV2X2V2ZW50X2V4ZWN1dGVfcnVu KHVkZXZfZXZlbnQpOworCisJCQkvKiByZXNldCBhbGFybSAqLworCQkJYWxhcm0oMCk7CisKKwkJ CS8qIGFwcGx5L3Jlc3RvcmUgaW5vdGlmeSB3YXRjaCAqLworCQkJaWYgKGVyciA9PSAwICYmIHVk ZXZfZXZlbnQtPmlub3RpZnlfd2F0Y2gpIHsKKwkJCQl1ZGV2X3dhdGNoX2JlZ2luKHVkZXZfZXZl bnQtPnVkZXYsIGRldik7CisJCQkJdWRldl9kZXZpY2VfdXBkYXRlX2RiKGRldik7CisJCQl9CisK KwkJCS8qIHNlbmQgcHJvY2Vzc2VkIGV2ZW50IGJhY2sgdG8gbGlidWRldiBsaXN0ZW5lcnMgKi8K KwkJCXVkZXZfbW9uaXRvcl9zZW5kX2RldmljZShtb25pdG9yLCBkZXYsIDApOworCisJCQlpbmZv KGV2ZW50LT51ZGV2LCAic2VxICVsbHUgZmluaXNoZWQgd2l0aCAlaVxuIiwgdWRldl9kZXZpY2Vf Z2V0X3NlcW51bShkZXYpLCBlcnIpOworCQkJdWRldl9kZXZpY2VfdW5yZWYoZGV2KTsKKwkJCXVk ZXZfZXZlbnRfdW5yZWYodWRldl9ldmVudCk7CisKKwkJCS8qIHNlbmQgYmFjayB0aGUgcmVzdWx0 IG9mIHRoZSBldmVudCBleGVjdXRpb24gKi8KKwkJCW1zZy5leGl0Y29kZSA9IGVycjsKKwkJCW1z Zy5waWQgPSBnZXRwaWQoKTsKKwkJCXNlbmQod29ya2VyX3NvY2tldFtXUklURV9FTkRdLCAmbXNn LCBzaXplb2Yoc3RydWN0IHdvcmtlcl9tZXNzYWdlKSwgMCk7CiAKLQkJLyogc2VuZCBwcm9jZXNz ZWQgZXZlbnQgYmFjayB0byB0aGUga2VybmVsIG5ldGxpbmsgc29ja2V0ICovCi0JCXVkZXZfbW9u aXRvcl9zZW5kX2RldmljZShrZXJuZWxfbW9uaXRvciwgZXZlbnQtPmRldik7CisJCQkvKiB3YWl0 IGZvciBtb3JlIGRldmljZSBtZXNzYWdlcyBmcm9tIHVkZXZkICovCisJCQlkbworCQkJCWRldiA9 IHVkZXZfbW9uaXRvcl9yZWNlaXZlX2RldmljZShtb25pdG9yKTsKKwkJCXdoaWxlICghd29ya2Vy X2V4aXQgJiYgZGV2ID09IE5VTEwpOworCQl9CiAKLQkJaW5mbyhldmVudC0+dWRldiwgInNlcSAl bGx1IGV4aXQgd2l0aCAlaVxuIiwgdWRldl9kZXZpY2VfZ2V0X3NlcW51bShldmVudC0+ZGV2KSwg ZXJyKTsKKwkJdWRldl9tb25pdG9yX3VucmVmKG1vbml0b3IpOwogCQlsb2dnaW5nX2Nsb3NlKCk7 Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWV4aXQoMSk7CiAJCWV4aXQoMCk7CisJfQogCWNhc2UgLTE6 CisJCWV2ZW50LT5zdGF0ZSA9IEVWRU5UX1FVRVVFRDsKKwkJZnJlZSh3b3JrZXIpOwogCQllcnIo ZXZlbnQtPnVkZXYsICJmb3JrIG9mIGNoaWxkIGZhaWxlZDogJW1cbiIpOwotCQlldmVudF9xdWV1 ZV9kZWxldGUoZXZlbnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQkvKiBnZXQgU0lHQ0hMRCBp biBtYWluIGxvb3AgKi8KLQkJaW5mbyhldmVudC0+dWRldiwgInNlcSAlbGx1IGZvcmtlZCwgcGlk IFslZF0sICclcycgJyVzJywgJWxkIHNlY29uZHMgb2xkXG4iLAotCQkgICAgIHVkZXZfZGV2aWNl X2dldF9zZXFudW0oZXZlbnQtPmRldiksCi0JCSAgICAgcGlkLAotCQkgICAgIHVkZXZfZGV2aWNl X2dldF9hY3Rpb24oZXZlbnQtPmRldiksCi0JCSAgICAgdWRldl9kZXZpY2VfZ2V0X3N1YnN5c3Rl bShldmVudC0+ZGV2KSwKLQkJICAgICB0aW1lKE5VTEwpIC0gZXZlbnQtPnF1ZXVlX3RpbWUpOwot CQlldmVudC0+cGlkID0gcGlkOworCQlldmVudC0+c3RhdGUgPSBFVkVOVF9SVU5OSU5HOworCQl3 b3JrZXItPmV2ZW50ID0gZXZlbnQ7CisJCXdvcmtlci0+cGlkID0gcGlkOworCQl3b3JrZXItPnN0 YXRlID0gV09SS0VSX1JVTk5JTkc7CisJCXVkZXZfbGlzdF9ub2RlX2FwcGVuZCgmd29ya2VyLT5u b2RlLCAmd29ya2VyX2xpc3QpOwogCQljaGlsZHMrKzsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0 aWMgdm9pZCBldmVudF9ydW4oc3RydWN0IGV2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgdWRldl9s aXN0X25vZGUgKmxvb3A7CisKKwl1ZGV2X2xpc3Rfbm9kZV9mb3JlYWNoKGxvb3AsICZ3b3JrZXJf bGlzdCkgeworCQlzdHJ1Y3Qgd29ya2VyICp3b3JrZXIgPSBub2RlX3RvX3dvcmtlcihsb29wKTsK KwkJc3NpemVfdCBjb3VudDsKKworCQlpZiAod29ya2VyLT5zdGF0ZSAhPSBXT1JLRVJfSURMRSkK KwkJCWNvbnRpbnVlOworCisJCXdvcmtlci0+ZXZlbnQgPSBldmVudDsKKwkJd29ya2VyLT5zdGF0 ZSA9IFdPUktFUl9SVU5OSU5HOworCQlldmVudC0+c3RhdGUgPSBFVkVOVF9SVU5OSU5HOworCQlj b3VudCA9IHVkZXZfbW9uaXRvcl9zZW5kX2RldmljZShtb25pdG9yLCBldmVudC0+ZGV2LCB3b3Jr ZXItPnBpZCk7CisJCWlmIChjb3VudCA8IDApIHsKKwkJCWVycihldmVudC0+dWRldiwgIndvcmtl ciBbJXVdIGRpZCBub3QgYWNjZXB0IG1lc3NhZ2UsIGtpbGwgaXRcbiIsIHdvcmtlci0+cGlkKTsK KwkJCWV2ZW50LT5zdGF0ZSA9IEVWRU5UX1FVRVVFRDsKKwkJCXdvcmtlci0+c3RhdGUgPSBXT1JL RVJfS0lMTEVEOworCQkJa2lsbCh3b3JrZXItPnBpZCwgU0lHS0lMTCk7CisJCQljb250aW51ZTsK KwkJfQorCQlyZXR1cm47CiAJfQorCisJaWYgKGNoaWxkcyA+PSBtYXhfY2hpbGRzKSB7CisJCWlu Zm8oZXZlbnQtPnVkZXYsICJtYXhpbXVtIG51bWJlciAoJWkpIG9mIGNoaWxkcyByZWFjaGVkXG4i LCBjaGlsZHMpOworCQlyZXR1cm47CisJfQorCisJLyogc3RhcnQgbmV3IHdvcmtlciBhbmQgcGFz cyBpbml0aWFsIGRldmljZSAqLworCXdvcmtlcl9uZXcoZXZlbnQpOwogfQogCi1zdGF0aWMgdm9p ZCBldmVudF9xdWV1ZV9pbnNlcnQoc3RydWN0IHVkZXZfZXZlbnQgKmV2ZW50KQorc3RhdGljIHZv aWQgZXZlbnRfcXVldWVfaW5zZXJ0KHN0cnVjdCB1ZGV2X2RldmljZSAqZGV2KQogewotCWV2ZW50 LT5xdWV1ZV90aW1lID0gdGltZShOVUxMKTsKKwlzdHJ1Y3QgZXZlbnQgKmV2ZW50OworCisJZXZl bnQgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBldmVudCkpOworCWlmIChldmVudCA9PSBOVUxM KQorCQlyZXR1cm47CiAKLQl1ZGV2X3F1ZXVlX2V4cG9ydF9kZXZpY2VfcXVldWVkKHVkZXZfcXVl dWVfZXhwb3J0LCBldmVudC0+ZGV2KTsKLQlpbmZvKGV2ZW50LT51ZGV2LCAic2VxICVsbHUgcXVl dWVkLCAnJXMnICclcydcbiIsIHVkZXZfZGV2aWNlX2dldF9zZXFudW0oZXZlbnQtPmRldiksCi0J ICAgICB1ZGV2X2RldmljZV9nZXRfYWN0aW9uKGV2ZW50LT5kZXYpLCB1ZGV2X2RldmljZV9nZXRf c3Vic3lzdGVtKGV2ZW50LT5kZXYpKTsKKwlldmVudC0+dWRldiA9IHVkZXZfZGV2aWNlX2dldF91 ZGV2KGRldik7CisJZXZlbnQtPmRldiA9IGRldjsKKwlldmVudC0+c2VxbnVtID0gdWRldl9kZXZp Y2VfZ2V0X3NlcW51bShkZXYpOworCWV2ZW50LT5kZXZwYXRoID0gdWRldl9kZXZpY2VfZ2V0X2Rl dnBhdGgoZGV2KTsKKwlldmVudC0+ZGV2cGF0aF9sZW4gPSBzdHJsZW4oZXZlbnQtPmRldnBhdGgp OworCWV2ZW50LT5kZXZwYXRoX29sZCA9IHVkZXZfZGV2aWNlX2dldF9kZXZwYXRoX29sZChkZXYp OwogCisJdWRldl9xdWV1ZV9leHBvcnRfZGV2aWNlX3F1ZXVlZCh1ZGV2X3F1ZXVlX2V4cG9ydCwg ZGV2KTsKKwlpbmZvKGV2ZW50LT51ZGV2LCAic2VxICVsbHUgcXVldWVkLCAnJXMnICclcydcbiIs IHVkZXZfZGV2aWNlX2dldF9zZXFudW0oZGV2KSwKKwkgICAgIHVkZXZfZGV2aWNlX2dldF9hY3Rp b24oZGV2KSwgdWRldl9kZXZpY2VfZ2V0X3N1YnN5c3RlbShkZXYpKTsKKworCWV2ZW50LT5zdGF0 ZSA9IEVWRU5UX1FVRVVFRDsKIAl1ZGV2X2xpc3Rfbm9kZV9hcHBlbmQoJmV2ZW50LT5ub2RlLCAm ZXZlbnRfbGlzdCk7Ci0JcnVuX2V4ZWNfcSA9IDE7CiAKIAkvKiBydW4gYWxsIGV2ZW50cyB3aXRo IGEgdGltZW91dCBzZXQgaW1tZWRpYXRlbHkgKi8KLQlpZiAodWRldl9kZXZpY2VfZ2V0X3RpbWVv dXQoZXZlbnQtPmRldikgPiAwKSB7Ci0JCWV2ZW50X2ZvcmsoZXZlbnQpOworCWlmICh1ZGV2X2Rl dmljZV9nZXRfdGltZW91dChkZXYpID4gMCkgeworCQl3b3JrZXJfbmV3KGV2ZW50KTsKIAkJcmV0 dXJuOwogCX0KIH0KIAorc3RhdGljIHZvaWQgd29ya2VyX2tpbGwodm9pZCkKK3sKKwlzdHJ1Y3Qg dWRldl9saXN0X25vZGUgKmxvb3A7CisKKwl1ZGV2X2xpc3Rfbm9kZV9mb3JlYWNoKGxvb3AsICZ3 b3JrZXJfbGlzdCkgeworCQlzdHJ1Y3Qgd29ya2VyICp3b3JrZXIgPSBub2RlX3RvX3dvcmtlcihs b29wKTsKKworCQlpZiAod29ya2VyLT5zdGF0ZSA9PSBXT1JLRVJfS0lMTEVEKQorCQkJY29udGlu dWU7CisKKwkJd29ya2VyLT5zdGF0ZSA9IFdPUktFUl9LSUxMRUQ7CisJCWtpbGwod29ya2VyLT5w aWQsIFNJR1RFUk0pOworCX0KK30KKwogc3RhdGljIGludCBtZW1fc2l6ZV9tYih2b2lkKQogewog CUZJTEUgKmY7CkBAIC0yNDEsMTEyICszOTYsMTExIEBAIHN0YXRpYyBpbnQgbWVtX3NpemVfbWIo dm9pZCkKIAlyZXR1cm4gbWVtc2l6ZTsKIH0KIAotc3RhdGljIGludCBjb21wYXJlX2RldnBhdGgo Y29uc3QgY2hhciAqcnVubmluZywgY29uc3QgY2hhciAqd2FpdGluZykKLXsKLQlpbnQgaSA9IDA7 Ci0KLQl3aGlsZSAocnVubmluZ1tpXSAhPSAnXDAnICYmIHJ1bm5pbmdbaV0gPT0gd2FpdGluZ1tp XSkKLQkJaSsrOwotCi0JLyogaWRlbnRpY2FsIGRldmljZSBldmVudCBmb3VuZCAqLwotCWlmIChy dW5uaW5nW2ldID09ICdcMCcgJiYgd2FpdGluZ1tpXSA9PSAnXDAnKQotCQlyZXR1cm4gMTsKLQot CS8qIHBhcmVudCBkZXZpY2UgZXZlbnQgZm91bmQgKi8KLQlpZiAocnVubmluZ1tpXSA9PSAnXDAn ICYmIHdhaXRpbmdbaV0gPT0gJy8nKQotCQlyZXR1cm4gMjsKLQotCS8qIGNoaWxkIGRldmljZSBl dmVudCBmb3VuZCAqLwotCWlmIChydW5uaW5nW2ldID09ICcvJyAmJiB3YWl0aW5nW2ldID09ICdc MCcpCi0JCXJldHVybiAzOwotCi0JLyogbm8gbWF0Y2hpbmcgZXZlbnQgKi8KLQlyZXR1cm4gMDsK LX0KLQogLyogbG9va3VwIGV2ZW50IGZvciBpZGVudGljYWwsIHBhcmVudCwgY2hpbGQgZGV2aWNl ICovCi1zdGF0aWMgaW50IGRldnBhdGhfYnVzeShzdHJ1Y3QgdWRldl9ldmVudCAqZXZlbnQpCitz dGF0aWMgaW50IGRldnBhdGhfYnVzeShzdHJ1Y3QgZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCB1 ZGV2X2xpc3Rfbm9kZSAqbG9vcDsKKwlzaXplX3QgY29tbW9uOwogCiAJLyogY2hlY2sgaWYgcXVl dWUgY29udGFpbnMgZXZlbnRzIHdlIGRlcGVuZCBvbiAqLwogCXVkZXZfbGlzdF9ub2RlX2ZvcmVh Y2gobG9vcCwgJmV2ZW50X2xpc3QpIHsKLQkJc3RydWN0IHVkZXZfZXZlbnQgKmxvb3BfZXZlbnQg PSBub2RlX3RvX2V2ZW50KGxvb3ApOworCQlzdHJ1Y3QgZXZlbnQgKmxvb3BfZXZlbnQgPSBub2Rl X3RvX2V2ZW50KGxvb3ApOwogCiAJCS8qIHdlIGFscmVhZHkgZm91bmQgYSBsYXRlciBldmVudCwg ZWFybGllciBjYW4gbm90IGJsb2NrIHVzLCBubyBuZWVkIHRvIGNoZWNrIGFnYWluICovCi0JCWlm ICh1ZGV2X2RldmljZV9nZXRfc2VxbnVtKGxvb3BfZXZlbnQtPmRldikgPCBldmVudC0+ZGVsYXlp bmdfc2VxbnVtKQorCQlpZiAobG9vcF9ldmVudC0+c2VxbnVtIDwgZXZlbnQtPmRlbGF5aW5nX3Nl cW51bSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIGV2ZW50IHdlIGNoZWNrZWQgZWFybGllciBzdGls bCBleGlzdHMsIG5vIG5lZWQgdG8gY2hlY2sgYWdhaW4gKi8KLQkJaWYgKHVkZXZfZGV2aWNlX2dl dF9zZXFudW0obG9vcF9ldmVudC0+ZGV2KSA9PSBldmVudC0+ZGVsYXlpbmdfc2VxbnVtKQorCQlp ZiAobG9vcF9ldmVudC0+c2VxbnVtID09IGV2ZW50LT5kZWxheWluZ19zZXFudW0pCiAJCQlyZXR1 cm4gMjsKIAogCQkvKiBmb3VuZCBvdXJzZWxmLCBubyBsYXRlciBldmVudCBjYW4gYmxvY2sgdXMg Ki8KLQkJaWYgKHVkZXZfZGV2aWNlX2dldF9zZXFudW0obG9vcF9ldmVudC0+ZGV2KSA+PSB1ZGV2 X2RldmljZV9nZXRfc2VxbnVtKGV2ZW50LT5kZXYpKQorCQlpZiAobG9vcF9ldmVudC0+c2VxbnVt ID49IGV2ZW50LT5zZXFudW0pCiAJCQlicmVhazsKIAogCQkvKiBjaGVjayBvdXIgb2xkIG5hbWUg Ki8KLQkJaWYgKHVkZXZfZGV2aWNlX2dldF9kZXZwYXRoX29sZChldmVudC0+ZGV2KSAhPSBOVUxM KQotCQkJaWYgKHN0cmNtcCh1ZGV2X2RldmljZV9nZXRfZGV2cGF0aChsb29wX2V2ZW50LT5kZXYp LCB1ZGV2X2RldmljZV9nZXRfZGV2cGF0aF9vbGQoZXZlbnQtPmRldikpID09IDApIHsKLQkJCQll dmVudC0+ZGVsYXlpbmdfc2VxbnVtID0gdWRldl9kZXZpY2VfZ2V0X3NlcW51bShsb29wX2V2ZW50 LT5kZXYpOworCQlpZiAoZXZlbnQtPmRldnBhdGhfb2xkICE9IE5VTEwpCisJCQlpZiAoc3RyY21w KGxvb3BfZXZlbnQtPmRldnBhdGgsIGV2ZW50LT5kZXZwYXRoX29sZCkgPT0gMCkgeworCQkJCWV2 ZW50LT5kZWxheWluZ19zZXFudW0gPSBsb29wX2V2ZW50LT5zZXFudW07CiAJCQkJcmV0dXJuIDM7 CiAJCQl9CiAKLQkJLyogY2hlY2sgaWRlbnRpY2FsLCBwYXJlbnQsIG9yIGNoaWxkIGRldmljZSBl dmVudCAqLwotCQlpZiAoY29tcGFyZV9kZXZwYXRoKHVkZXZfZGV2aWNlX2dldF9kZXZwYXRoKGxv b3BfZXZlbnQtPmRldiksIHVkZXZfZGV2aWNlX2dldF9kZXZwYXRoKGV2ZW50LT5kZXYpKSAhPSAw KSB7Ci0JCQlkYmcoZXZlbnQtPnVkZXYsICIlbGx1LCBkZXZpY2UgZXZlbnQgc3RpbGwgcGVuZGlu ZyAlbGx1ICglcylcbiIsCi0JCQkgICAgdWRldl9kZXZpY2VfZ2V0X3NlcW51bShldmVudC0+ZGV2 KSwKLQkJCSAgICB1ZGV2X2RldmljZV9nZXRfc2VxbnVtKGxvb3BfZXZlbnQtPmRldiksCi0JCQkg ICAgdWRldl9kZXZpY2VfZ2V0X2RldnBhdGgobG9vcF9ldmVudC0+ZGV2KSk7Ci0JCQlldmVudC0+ ZGVsYXlpbmdfc2VxbnVtID0gdWRldl9kZXZpY2VfZ2V0X3NlcW51bShsb29wX2V2ZW50LT5kZXYp OworCQkvKiBjb21wYXJlIGRldnBhdGggKi8KKwkJY29tbW9uID0gTUlOKGxvb3BfZXZlbnQtPmRl dnBhdGhfbGVuLCBldmVudC0+ZGV2cGF0aF9sZW4pOworCisJCS8qIG9uZSBkZXZwYXRoIGlzIGNv bnRhaW5lZCBpbiB0aGUgb3RoZXI/ICovCisJCWlmIChtZW1jbXAobG9vcF9ldmVudC0+ZGV2cGF0 aCwgZXZlbnQtPmRldnBhdGgsIGNvbW1vbikgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGlk ZW50aWNhbCBkZXZpY2UgZXZlbnQgZm91bmQgKi8KKwkJaWYgKGxvb3BfZXZlbnQtPmRldnBhdGhf bGVuID09IGV2ZW50LT5kZXZwYXRoX2xlbikgeworCQkJZXZlbnQtPmRlbGF5aW5nX3NlcW51bSA9 IGxvb3BfZXZlbnQtPnNlcW51bTsKIAkJCXJldHVybiA0OwogCQl9CisKKwkJLyogcGFyZW50IGRl dmljZSBldmVudCBmb3VuZCAqLworCQlpZiAoZXZlbnQtPmRldnBhdGhbY29tbW9uXSA9PSAnLycp IHsKKwkJCWV2ZW50LT5kZWxheWluZ19zZXFudW0gPSBsb29wX2V2ZW50LT5zZXFudW07CisJCQly ZXR1cm4gNTsKKwkJfQorCisJCS8qIGNoaWxkIGRldmljZSBldmVudCBmb3VuZCAqLworCQlpZiAo bG9vcF9ldmVudC0+ZGV2cGF0aFtjb21tb25dID09ICcvJykgeworCQkJZXZlbnQtPmRlbGF5aW5n X3NlcW51bSA9IGxvb3BfZXZlbnQtPnNlcW51bTsKKwkJCXJldHVybiA2OworCQl9CisKKwkJLyog bm8gbWF0Y2hpbmcgZGV2aWNlICovCisJCWNvbnRpbnVlOwogCX0KKwogCXJldHVybiAwOwogfQog Ci0vKiBzZXJpYWxpemVzIGV2ZW50cyBmb3IgdGhlIGlkZW50aWNhbCBhbmQgcGFyZW50IGFuZCBj aGlsZCBkZXZpY2VzICovCi1zdGF0aWMgdm9pZCBldmVudF9xdWV1ZV9tYW5hZ2VyKHN0cnVjdCB1 ZGV2ICp1ZGV2KQorc3RhdGljIHZvaWQgZXZlbnRzX3N0YXJ0KHN0cnVjdCB1ZGV2ICp1ZGV2KQog ewogCXN0cnVjdCB1ZGV2X2xpc3Rfbm9kZSAqbG9vcDsKLQlzdHJ1Y3QgdWRldl9saXN0X25vZGUg KnRtcDsKLQotc3RhcnRfb3ZlcjoKLQlpZiAodWRldl9saXN0X2lzX2VtcHR5KCZldmVudF9saXN0 KSkgewotCQlpZiAoY2hpbGRzID4gMCkgewotCQkJZXJyKHVkZXYsICJldmVudCBsaXN0IGVtcHR5 LCBidXQgY2hpbGRzIGNvdW50IGlzICVpIiwgY2hpbGRzKTsKLQkJCWNoaWxkcyA9IDA7Ci0JCX0K LQkJcmV0dXJuOwotCX0KLQotCXVkZXZfbGlzdF9ub2RlX2ZvcmVhY2hfc2FmZShsb29wLCB0bXAs ICZldmVudF9saXN0KSB7Ci0JCXN0cnVjdCB1ZGV2X2V2ZW50ICpsb29wX2V2ZW50ID0gbm9kZV90 b19ldmVudChsb29wKTsKIAotCQlpZiAoY2hpbGRzID49IG1heF9jaGlsZHMpIHsKLQkJCWluZm8o dWRldiwgIm1heGltdW0gbnVtYmVyICglaSkgb2YgY2hpbGRzIHJlYWNoZWRcbiIsIGNoaWxkcyk7 Ci0JCQlicmVhazsKLQkJfQorCXVkZXZfbGlzdF9ub2RlX2ZvcmVhY2gobG9vcCwgJmV2ZW50X2xp c3QpIHsKKwkJc3RydWN0IGV2ZW50ICpldmVudCA9IG5vZGVfdG9fZXZlbnQobG9vcCk7CiAKLQkJ aWYgKGxvb3BfZXZlbnQtPnBpZCAhPSAwKQorCQlpZiAoZXZlbnQtPnN0YXRlICE9IEVWRU5UX1FV RVVFRCkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIGRvIG5vdCBzdGFydCBldmVudCBpZiBwYXJlbnQg b3IgY2hpbGQgZXZlbnQgaXMgc3RpbGwgcnVubmluZyAqLwotCQlpZiAoZGV2cGF0aF9idXN5KGxv b3BfZXZlbnQpICE9IDApIHsKLQkJCWRiZyh1ZGV2LCAiZGVsYXkgc2VxICVsbHUgKCVzKVxuIiwK LQkJCSAgICB1ZGV2X2RldmljZV9nZXRfc2VxbnVtKGxvb3BfZXZlbnQtPmRldiksCi0JCQkgICAg dWRldl9kZXZpY2VfZ2V0X2RldnBhdGgobG9vcF9ldmVudC0+ZGV2KSk7CisJCWlmIChkZXZwYXRo X2J1c3koZXZlbnQpICE9IDApIHsKKwkJCWRiZyh1ZGV2LCAiZGVsYXkgc2VxICVsbHUgKCVzKVxu IiwgZXZlbnQtPnNlcW51bSwgZXZlbnQtPmRldnBhdGgpOwogCQkJY29udGludWU7CiAJCX0KIAot CQlldmVudF9mb3JrKGxvb3BfZXZlbnQpOwotCQlkYmcodWRldiwgIm1vdmVkIHNlcSAlbGx1IHRv IHJ1bm5pbmcgbGlzdFxuIiwgdWRldl9kZXZpY2VfZ2V0X3NlcW51bShsb29wX2V2ZW50LT5kZXYp KTsKKwkJZXZlbnRfcnVuKGV2ZW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdvcmtlcl9yZXR1 cm5lZCh2b2lkKQoreworCXdoaWxlICgxKSB7CisJCXN0cnVjdCB3b3JrZXJfbWVzc2FnZSBtc2c7 CisJCXNzaXplX3Qgc2l6ZTsKKwkJc3RydWN0IHVkZXZfbGlzdF9ub2RlICpsb29wOworCisJCXNp emUgPSByZWN2KHBmZFtGRF9XT1JLRVJdLmZkLCAmbXNnLCBzaXplb2Yoc3RydWN0IHdvcmtlcl9t ZXNzYWdlKSwgTVNHX0RPTlRXQUlUKTsKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB3b3Jr ZXJfbWVzc2FnZSkpCisJCQlicmVhazsKKworCQkvKiBsb29rdXAgd29ya2VyIHdobyBzZW50IHRo ZSBzaWduYWwgKi8KKwkJdWRldl9saXN0X25vZGVfZm9yZWFjaChsb29wLCAmd29ya2VyX2xpc3Qp IHsKKwkJCXN0cnVjdCB3b3JrZXIgKndvcmtlciA9IG5vZGVfdG9fd29ya2VyKGxvb3ApOworCisJ CQlpZiAod29ya2VyLT5waWQgIT0gbXNnLnBpZCkKKwkJCQljb250aW51ZTsKIAotCQkvKiByZXRy eSBpZiBldmVudHMgZmluaXNoZWQgaW4gdGhlIG1lYW50aW1lICovCi0JCWlmIChzaWdjaGlsZHNf d2FpdGluZykgewotCQkJc2lnY2hpbGRzX3dhaXRpbmcgPSAwOwotCQkJcmVhcF9zaWdjaGlsZHMo KTsKLQkJCWdvdG8gc3RhcnRfb3ZlcjsKKwkJCS8qIHdvcmtlciByZXR1cm5lZCAqLworCQkJd29y a2VyLT5ldmVudC0+ZXhpdGNvZGUgPSBtc2cuZXhpdGNvZGU7CisJCQlldmVudF9xdWV1ZV9kZWxl dGUod29ya2VyLT5ldmVudCk7CisJCQl3b3JrZXItPmV2ZW50ID0gTlVMTDsKKwkJCXdvcmtlci0+ c3RhdGUgPSBXT1JLRVJfSURMRTsKKwkJCWJyZWFrOwogCQl9CiAJfQogfQpAQCAtMzY3LDE3ICs1 MjEsMTcgQEAgc3RhdGljIHZvaWQgaGFuZGxlX2N0cmxfbXNnKHN0cnVjdCB1ZGV2X2N0cmwgKnVj dHJsKQogCWlmIChpID49IDApIHsKIAkJaW5mbyh1ZGV2LCAidWRldmQgbWVzc2FnZSAoU0VUX0xP R19QUklPUklUWSkgcmVjZWl2ZWQsIGxvZ19wcmlvcml0eT0laVxuIiwgaSk7CiAJCXVkZXZfc2V0 X2xvZ19wcmlvcml0eSh1ZGV2LCBpKTsKKwkJd29ya2VyX2tpbGwoKTsKIAl9CiAKIAlpZiAodWRl dl9jdHJsX2dldF9zdG9wX2V4ZWNfcXVldWUoY3RybF9tc2cpID4gMCkgewogCQlpbmZvKHVkZXYs ICJ1ZGV2ZCBtZXNzYWdlIChTVE9QX0VYRUNfUVVFVUUpIHJlY2VpdmVkXG4iKTsKLQkJc3RvcF9l eGVjX3EgPSAxOworCQlzdG9wX2V4ZWNfcXVldWUgPSAxOwogCX0KIAogCWlmICh1ZGV2X2N0cmxf Z2V0X3N0YXJ0X2V4ZWNfcXVldWUoY3RybF9tc2cpID4gMCkgewogCQlpbmZvKHVkZXYsICJ1ZGV2 ZCBtZXNzYWdlIChTVEFSVF9FWEVDX1FVRVVFKSByZWNlaXZlZFxuIik7Ci0JCXN0b3BfZXhlY19x ID0gMDsKLQkJZXZlbnRfcXVldWVfbWFuYWdlcih1ZGV2KTsKKwkJc3RvcF9leGVjX3F1ZXVlID0g MDsKIAl9CiAKIAlpZiAodWRldl9jdHJsX2dldF9yZWxvYWRfcnVsZXMoY3RybF9tc2cpID4gMCkg ewpAQCAtNDA5LDYgKzU2Myw3IEBAIHN0YXRpYyB2b2lkIGhhbmRsZV9jdHJsX21zZyhzdHJ1Y3Qg dWRldl9jdHJsICp1Y3RybCkKIAkJCX0KIAkJCWZyZWUoa2V5KTsKIAkJfQorCQl3b3JrZXJfa2ls bCgpOwogCX0KIAogCWkgPSB1ZGV2X2N0cmxfZ2V0X3NldF9tYXhfY2hpbGRzKGN0cmxfbXNnKTsK QEAgLTQyMCw2ICs1NzUsOCBAQCBzdGF0aWMgdm9pZCBoYW5kbGVfY3RybF9tc2coc3RydWN0IHVk ZXZfY3RybCAqdWN0cmwpCiAJc2V0dGxlX3BpZCA9IHVkZXZfY3RybF9nZXRfc2V0dGxlKGN0cmxf bXNnKTsKIAlpZiAoc2V0dGxlX3BpZCA+IDApIHsKIAkJaW5mbyh1ZGV2LCAidWRldmQgbWVzc2Fn ZSAoU0VUVExFKSByZWNlaXZlZFxuIik7CisJCWtpbGwoc2V0dGxlX3BpZCwgU0lHVVNSMSk7CisJ CXNldHRsZV9waWQgPSAwOwogCX0KIAl1ZGV2X2N0cmxfbXNnX3VucmVmKGN0cmxfbXNnKTsKIH0K QEAgLTQyNywyMiArNTg0LDIwIEBAIHN0YXRpYyB2b2lkIGhhbmRsZV9jdHJsX21zZyhzdHJ1Y3Qg dWRldl9jdHJsICp1Y3RybCkKIC8qIHJlYWQgaW5vdGlmeSBtZXNzYWdlcyAqLwogc3RhdGljIGlu dCBoYW5kbGVfaW5vdGlmeShzdHJ1Y3QgdWRldiAqdWRldikKIHsKLQlpbnQgbmJ5dGVzLCBwb3M7 CisJc3NpemVfdCBuYnl0ZXMsIHBvczsKIAljaGFyICpidWY7CiAJc3RydWN0IGlub3RpZnlfZXZl bnQgKmV2OwogCi0JaWYgKChpb2N0bChpbm90aWZ5X2ZkLCBGSU9OUkVBRCwgJm5ieXRlcykgPCAw KSB8fCAobmJ5dGVzIDw9IDApKQorCWlmICgoaW9jdGwocGZkW0ZEX0lOT1RJRlldLmZkLCBGSU9O UkVBRCwgJm5ieXRlcykgPCAwKSB8fCAobmJ5dGVzIDw9IDApKQogCQlyZXR1cm4gMDsKIAogCWJ1 ZiA9IG1hbGxvYyhuYnl0ZXMpOwogCWlmIChidWYgPT0gTlVMTCkgewogCQllcnIodWRldiwgImVy cm9yIGdldHRpbmcgYnVmZmVyIGZvciBpbm90aWZ5LCBkaXNhYmxlIHdhdGNoaW5nXG4iKTsKLQkJ Y2xvc2UoaW5vdGlmeV9mZCk7Ci0JCWlub3RpZnlfZmQgPSAtMTsKLQkJcmV0dXJuIDA7CisJCXJl dHVybiAtMTsKIAl9CiAKLQlyZWFkKGlub3RpZnlfZmQsIGJ1ZiwgbmJ5dGVzKTsKKwluYnl0ZXMg PSByZWFkKHBmZFtGRF9JTk9USUZZXS5mZCwgYnVmLCBuYnl0ZXMpOwogCiAJZm9yIChwb3MgPSAw OyBwb3MgPCBuYnl0ZXM7IHBvcyArPSBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpICsgZXYt PmxlbikgewogCQlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKQEAgLTQ4MCw2OCArNjM1LDQ0IEBA IHN0YXRpYyBpbnQgaGFuZGxlX2lub3RpZnkoc3RydWN0IHVkZXYgKnVkZXYpCiAJcmV0dXJuIDA7 CiB9CiAKLXN0YXRpYyB2b2lkIHNpZ19oYW5kbGVyKGludCBzaWdudW0pCitzdGF0aWMgdm9pZCBo YW5kbGVfc2lnbmFsKGludCBzaWdubykKIHsKLQlzd2l0Y2ggKHNpZ251bSkgewotCQljYXNlIFNJ R0lOVDoKLQkJY2FzZSBTSUdURVJNOgotCQkJdWRldl9leGl0ID0gMTsKLQkJCWJyZWFrOwotCQlj YXNlIFNJR0NITEQ6Ci0JCQkvKiBzZXQgZmxhZywgdGhlbiB3cml0ZSB0byBwaXBlIGlmIG5lZWRl ZCAqLwotCQkJc2lnY2hpbGRzX3dhaXRpbmcgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lHSFVQ OgotCQkJcmVsb2FkX2NvbmZpZyA9IDE7Ci0JCQlicmVhazsKLQl9CisJc3dpdGNoIChzaWdubykg eworCWNhc2UgU0lHSU5UOgorCWNhc2UgU0lHVEVSTToKKwkJdWRldl9leGl0ID0gMTsKKwkJYnJl YWs7CisJY2FzZSBTSUdDSExEOgorCQl3aGlsZSAoMSkgeworCQkJcGlkX3QgcGlkOworCQkJc3Ry dWN0IHVkZXZfbGlzdF9ub2RlICpsb29wLCAqdG1wOwogCi0Jc2lnbmFsX3JlY2VpdmVkID0gMTsK LX0KKwkJCXBpZCA9IHdhaXRwaWQoLTEsIE5VTEwsIFdOT0hBTkcpOworCQkJaWYgKHBpZCA8PSAw KQorCQkJCWJyZWFrOwogCi1zdGF0aWMgdm9pZCB1ZGV2X2RvbmUoaW50IHBpZCwgaW50IGV4aXRz dGF0dXMpCi17Ci0Jc3RydWN0IHVkZXZfbGlzdF9ub2RlICpsb29wOworCQkJdWRldl9saXN0X25v ZGVfZm9yZWFjaF9zYWZlKGxvb3AsIHRtcCwgJndvcmtlcl9saXN0KSB7CisJCQkJc3RydWN0IHdv cmtlciAqd29ya2VyID0gbm9kZV90b193b3JrZXIobG9vcCk7CiAKLQkvKiBmaW5kIGV2ZW50IGFz c29jaWF0ZWQgd2l0aCBwaWQgYW5kIGRlbGV0ZSBpdCAqLwotCXVkZXZfbGlzdF9ub2RlX2ZvcmVh Y2gobG9vcCwgJmV2ZW50X2xpc3QpIHsKLQkJc3RydWN0IHVkZXZfZXZlbnQgKmxvb3BfZXZlbnQg PSBub2RlX3RvX2V2ZW50KGxvb3ApOwotCi0JCWlmIChsb29wX2V2ZW50LT5waWQgPT0gcGlkKSB7 Ci0JCQlpbmZvKGxvb3BfZXZlbnQtPnVkZXYsICJzZXEgJWxsdSBjbGVhbnVwLCBwaWQgWyVkXSwg c3RhdHVzICVpLCAlbGQgc2Vjb25kcyBvbGRcbiIsCi0JCQkgICAgIHVkZXZfZGV2aWNlX2dldF9z ZXFudW0obG9vcF9ldmVudC0+ZGV2KSwgbG9vcF9ldmVudC0+cGlkLAotCQkJICAgICBleGl0c3Rh dHVzLCB0aW1lKE5VTEwpIC0gbG9vcF9ldmVudC0+cXVldWVfdGltZSk7Ci0JCQlsb29wX2V2ZW50 LT5leGl0c3RhdHVzID0gZXhpdHN0YXR1czsKLQkJCWlmIChkZWJ1Z190cmFjZSkKLQkJCQlmcHJp bnRmKHN0ZGVyciwgImV4aXQgJXMgKCVsbHUpXG4iLAotCQkJCSAgICAgICB1ZGV2X2RldmljZV9n ZXRfc3lzcGF0aChsb29wX2V2ZW50LT5kZXYpLAotCQkJCSAgICAgICB1ZGV2X2RldmljZV9nZXRf c2VxbnVtKGxvb3BfZXZlbnQtPmRldikpOwotCQkJZXZlbnRfcXVldWVfZGVsZXRlKGxvb3BfZXZl bnQpOwotCQkJY2hpbGRzLS07Ci0KLQkJCS8qIHRoZXJlIG1heSBiZSBkZXBlbmRlbnQgZXZlbnRz IHdhaXRpbmcgKi8KLQkJCXJ1bl9leGVjX3EgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQor CQkJCWlmICh3b3JrZXItPnBpZCAhPSBwaWQpCisJCQkJCWNvbnRpbnVlOwogCi1zdGF0aWMgdm9p ZCByZWFwX3NpZ2NoaWxkcyh2b2lkKQotewotCXBpZF90IHBpZDsKLQlpbnQgc3RhdHVzOworCQkJ CS8qIGZhaWwgZXZlbnQsIGlmIHdvcmtlciBkaWVkIHVuZXhwZWN0ZWRseSAqLworCQkJCWlmICh3 b3JrZXItPmV2ZW50ICE9IE5VTEwpIHsKKwkJCQkJd29ya2VyLT5ldmVudC0+ZXhpdGNvZGUgPSAx Mjc7CisJCQkJCWV2ZW50X3F1ZXVlX2RlbGV0ZSh3b3JrZXItPmV2ZW50KTsKKwkJCQl9CiAKLQl3 aGlsZSAoMSkgewotCQlwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBXTk9IQU5HKTsKLQkJaWYg KHBpZCA8PSAwKQotCQkJYnJlYWs7Ci0JCWlmIChXSUZFWElURUQoc3RhdHVzKSkKLQkJCXN0YXR1 cyA9IFdFWElUU1RBVFVTKHN0YXR1cyk7Ci0JCWVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykp Ci0JCQlzdGF0dXMgPSBXVEVSTVNJRyhzdGF0dXMpICsgMTI4OwotCQllbHNlCi0JCQlzdGF0dXMg PSAwOwotCQl1ZGV2X2RvbmUocGlkLCBzdGF0dXMpOworCQkJCXVkZXZfbGlzdF9ub2RlX3JlbW92 ZSgmd29ya2VyLT5ub2RlKTsKKwkJCQlmcmVlKHdvcmtlcik7CisJCQkJY2hpbGRzLS07CisJCQkJ YnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTSUdIVVA6CisJCXJlbG9hZF9jb25m aWcgPSAxOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTU3Niw3ICs3MDcsNyBAQCBpbnQgbWFpbihp bnQgYXJnYywgY2hhciAqYXJndltdKQogewogCXN0cnVjdCB1ZGV2ICp1ZGV2OwogCWludCBmZDsK LQlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKwlzaWdzZXRfdCBtYXNrOwogCWNvbnN0IGNoYXIgKnZh bHVlOwogCWludCBkYWVtb25pemUgPSAwOwogCWludCByZXNvbHZlX25hbWVzID0gMTsKQEAgLTY2 OSwyOSArODAwLDc2IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiAJCXJjID0g MTsKIAkJZ290byBleGl0OwogCX0KLQogCWlmICh1ZGV2X2N0cmxfZW5hYmxlX3JlY2VpdmluZyh1 ZGV2X2N0cmwpIDwgMCkgewogCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIGJpbmRpbmcgY29udHJv bCBzb2NrZXQsIHNlZW1zIHVkZXZkIGlzIGFscmVhZHkgcnVubmluZ1xuIik7CiAJCWVycih1ZGV2 LCAiZXJyb3IgYmluZGluZyBjb250cm9sIHNvY2tldCwgc2VlbXMgdWRldmQgaXMgYWxyZWFkeSBy dW5uaW5nXG4iKTsKIAkJcmMgPSAxOwogCQlnb3RvIGV4aXQ7CiAJfQorCXBmZFtGRF9DT05UUk9M XS5mZCA9IHVkZXZfY3RybF9nZXRfZmQodWRldl9jdHJsKTsKIAotCWtlcm5lbF9tb25pdG9yID0g dWRldl9tb25pdG9yX25ld19mcm9tX25ldGxpbmsodWRldiwgImtlcm5lbCIpOwotCWlmIChrZXJu ZWxfbW9uaXRvciA9PSBOVUxMIHx8IHVkZXZfbW9uaXRvcl9lbmFibGVfcmVjZWl2aW5nKGtlcm5l bF9tb25pdG9yKSA8IDApIHsKKwltb25pdG9yID0gdWRldl9tb25pdG9yX25ld19mcm9tX25ldGxp bmsodWRldiwgImtlcm5lbCIpOworCWlmIChtb25pdG9yID09IE5VTEwgfHwgdWRldl9tb25pdG9y X2VuYWJsZV9yZWNlaXZpbmcobW9uaXRvcikgPCAwKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiZXJy b3IgaW5pdGlhbGl6aW5nIG5ldGxpbmsgc29ja2V0XG4iKTsKIAkJZXJyKHVkZXYsICJlcnJvciBp bml0aWFsaXppbmcgbmV0bGluayBzb2NrZXRcbiIpOwogCQlyYyA9IDM7CiAJCWdvdG8gZXhpdDsK IAl9Ci0JdWRldl9tb25pdG9yX3NldF9yZWNlaXZlX2J1ZmZlcl9zaXplKGtlcm5lbF9tb25pdG9y LCAxMjgqMTAyNCoxMDI0KTsKKwl1ZGV2X21vbml0b3Jfc2V0X3JlY2VpdmVfYnVmZmVyX3NpemUo bW9uaXRvciwgMTI4KjEwMjQqMTAyNCk7CisJcGZkW0ZEX05FVExJTktdLmZkID0gdWRldl9tb25p dG9yX2dldF9mZChtb25pdG9yKTsKKworCXBmZFtGRF9JTk9USUZZXS5mZCA9IHVkZXZfd2F0Y2hf aW5pdCh1ZGV2KTsKKwlpZiAocGZkW0ZEX0lOT1RJRlldLmZkIDwgMCkgeworCQlmcHJpbnRmKHN0 ZGVyciwgImVycm9yIGluaXRpYWxpemluZyBpbm90aWZ5XG4iKTsKKwkJZXJyKHVkZXYsICJlcnJv ciBpbml0aWFsaXppbmcgaW5vdGlmeVxuIik7CisJCXJjID0gNDsKKwkJZ290byBleGl0OworCX0K KworCWlmICh1ZGV2X2dldF9ydWxlc19wYXRoKHVkZXYpICE9IE5VTEwpIHsKKwkJaW5vdGlmeV9h ZGRfd2F0Y2gocGZkW0ZEX0lOT1RJRlldLmZkLCB1ZGV2X2dldF9ydWxlc19wYXRoKHVkZXYpLAor CQkJCSAgSU5fQ1JFQVRFIHwgSU5fREVMRVRFIHwgSU5fTU9WRSB8IElOX0NMT1NFX1dSSVRFKTsK Kwl9IGVsc2UgeworCQljaGFyIGZpbGVuYW1lW1VUSUxfUEFUSF9TSVpFXTsKKworCQlpbm90aWZ5 X2FkZF93YXRjaChwZmRbRkRfSU5PVElGWV0uZmQsIFVERVZfUFJFRklYICIvbGliL3VkZXYvcnVs ZXMuZCIsCisJCQkJICBJTl9DUkVBVEUgfCBJTl9ERUxFVEUgfCBJTl9NT1ZFIHwgSU5fQ0xPU0Vf V1JJVEUpOworCQlpbm90aWZ5X2FkZF93YXRjaChwZmRbRkRfSU5PVElGWV0uZmQsIFNZU0NPTkZE SVIgIi91ZGV2L3J1bGVzLmQiLAorCQkJCSAgSU5fQ1JFQVRFIHwgSU5fREVMRVRFIHwgSU5fTU9W RSB8IElOX0NMT1NFX1dSSVRFKTsKKworCQkvKiB3YXRjaCBkeW5hbWljIHJ1bGVzIGRpcmVjdG9y eSAqLworCQl1dGlsX3N0cnNjcHlsKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCB1ZGV2X2dl dF9kZXZfcGF0aCh1ZGV2KSwgIi8udWRldi9ydWxlcy5kIiwgTlVMTCk7CisJCWlub3RpZnlfYWRk X3dhdGNoKHBmZFtGRF9JTk9USUZZXS5mZCwgZmlsZW5hbWUsCisJCQkJICBJTl9DUkVBVEUgfCBJ Tl9ERUxFVEUgfCBJTl9NT1ZFIHwgSU5fQ0xPU0VfV1JJVEUpOworCX0KKwl1ZGV2X3dhdGNoX3Jl c3RvcmUodWRldik7CisKKwkvKiBibG9jayBhbmQgbGlzdGVuIHRvIGFsbCBzaWduYWxzIG9uIHNp Z25hbGZkICovCisJc2lnZmlsbHNldCgmbWFzayk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ss ICZtYXNrLCBOVUxMKTsKKwlwZmRbRkRfU0lHTkFMXS5mZCA9IHNpZ25hbGZkKC0xLCAmbWFzaywg MCk7CisJaWYgKHBmZFtGRF9TSUdOQUxdLmZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVy cm9yIGdldHRpbmcgc2lnbmFsZmRcbiIpOworCQllcnIodWRldiwgImVycm9yIGdldHRpbmcgc2ln bmFsZmRcbiIpOworCQlyYyA9IDU7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB1bm5hbWVkIHNv Y2tldCBmcm9tIHdvcmtlcnMgdG8gdGhlIG1haW4gZGFlbW9uICovCisJaWYgKHNvY2tldHBhaXIo QUZfTE9DQUwsIFNPQ0tfREdSQU0sIDAsIHdvcmtlcl9zb2NrZXQpIDwgMCkgeworCQlmcHJpbnRm KHN0ZGVyciwgImVycm9yIGdldHRpbmcgc29ja2V0cGFpclxuIik7CisJCWVycih1ZGV2LCAiZXJy b3IgZ2V0dGluZyBzb2NrZXRwYWlyXG4iKTsKKwkJcmMgPSA2OworCQlnb3RvIGV4aXQ7CisJfQor CXBmZFtGRF9XT1JLRVJdLmZkID0gd29ya2VyX3NvY2tldFtSRUFEX0VORF07CiAKIAlydWxlcyA9 IHVkZXZfcnVsZXNfbmV3KHVkZXYsIHJlc29sdmVfbmFtZXMpOwogCWlmIChydWxlcyA9PSBOVUxM KSB7CiAJCWVycih1ZGV2LCAiZXJyb3IgcmVhZGluZyBydWxlc1xuIik7CiAJCWdvdG8gZXhpdDsK IAl9Ci0JdWRldl9saXN0X2luaXQoJmV2ZW50X2xpc3QpOworCiAJdWRldl9xdWV1ZV9leHBvcnQg PSB1ZGV2X3F1ZXVlX2V4cG9ydF9uZXcodWRldik7CiAJaWYgKHVkZXZfcXVldWVfZXhwb3J0ID09 IE5VTEwpIHsKIAkJZXJyKHVkZXYsICJlcnJvciBjcmVhdGluZyBxdWV1ZSBmaWxlXG4iKTsKQEAg LTcwNCwxOSArODgyLDE5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiAJCXBp ZCA9IGZvcmsoKTsKIAkJc3dpdGNoIChwaWQpIHsKIAkJY2FzZSAwOgotCQkJZGJnKHVkZXYsICJk YWVtb25pemVkIGZvcmsgcnVubmluZ1xuIik7CiAJCQlicmVhazsKIAkJY2FzZSAtMToKIAkJCWVy cih1ZGV2LCAiZm9yayBvZiBkYWVtb24gZmFpbGVkOiAlbVxuIik7CiAJCQlyYyA9IDQ7CiAJCQln b3RvIGV4aXQ7CiAJCWRlZmF1bHQ6Ci0JCQlkYmcodWRldiwgImNoaWxkIFsldV0gcnVubmluZywg cGFyZW50IGV4aXRzXG4iLCBwaWQpOwogCQkJcmMgPSAwOwogCQkJZ290byBleGl0OwogCQl9CiAJ fQogCisJc3RhcnR1cF9sb2codWRldik7CisKIAkvKiByZWRpcmVjdCBzdGR7b3V0LGVycn0gKi8K IAlpZiAoIWRlYnVnICYmICFkZWJ1Z190cmFjZSkgewogCQlkdXAyKGZkLCBTVERJTl9GSUxFTk8p OwpAQCAtNzQyLDE1OSArOTIwLDEwOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltd KQogCQljbG9zZShmZCk7CiAJfQogCi0Jc3RhcnR1cF9sb2codWRldik7Ci0KLQkvKiBzZXQgc2ln bmFsIGhhbmRsZXJzICovCi0JbWVtc2V0KCZhY3QsIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2lnYWN0 aW9uKSk7Ci0JYWN0LnNhX2hhbmRsZXIgPSBzaWdfaGFuZGxlcjsKLQlzaWdlbXB0eXNldCgmYWN0 LnNhX21hc2spOwotCWFjdC5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7Ci0Jc2lnYWN0aW9uKFNJR0lO VCwgJmFjdCwgTlVMTCk7Ci0Jc2lnYWN0aW9uKFNJR1RFUk0sICZhY3QsIE5VTEwpOwotCXNpZ2Fj dGlvbihTSUdDSExELCAmYWN0LCBOVUxMKTsKLQlzaWdhY3Rpb24oU0lHSFVQLCAmYWN0LCBOVUxM KTsKLQotCS8qIHdhdGNoIHJ1bGVzIGRpcmVjdG9yeSAqLwotCXVkZXZfd2F0Y2hfaW5pdCh1ZGV2 KTsKLQlpZiAoaW5vdGlmeV9mZCA+PSAwKSB7Ci0JCWlmICh1ZGV2X2dldF9ydWxlc19wYXRoKHVk ZXYpICE9IE5VTEwpIHsKLQkJCWlub3RpZnlfYWRkX3dhdGNoKGlub3RpZnlfZmQsIHVkZXZfZ2V0 X3J1bGVzX3BhdGgodWRldiksCi0JCQkJCSAgSU5fQ1JFQVRFIHwgSU5fREVMRVRFIHwgSU5fTU9W RSB8IElOX0NMT1NFX1dSSVRFKTsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgZmlsZW5hbWVbVVRJTF9Q QVRIX1NJWkVdOwotCi0JCQlpbm90aWZ5X2FkZF93YXRjaChpbm90aWZ5X2ZkLCBVREVWX1BSRUZJ WCAiL2xpYi91ZGV2L3J1bGVzLmQiLAotCQkJCQkgIElOX0NSRUFURSB8IElOX0RFTEVURSB8IElO X01PVkUgfCBJTl9DTE9TRV9XUklURSk7Ci0JCQlpbm90aWZ5X2FkZF93YXRjaChpbm90aWZ5X2Zk LCBTWVNDT05GRElSICIvdWRldi9ydWxlcy5kIiwKLQkJCQkJICBJTl9DUkVBVEUgfCBJTl9ERUxF VEUgfCBJTl9NT1ZFIHwgSU5fQ0xPU0VfV1JJVEUpOwotCi0JCQkvKiB3YXRjaCBkeW5hbWljIHJ1 bGVzIGRpcmVjdG9yeSAqLwotCQkJdXRpbF9zdHJzY3B5bChmaWxlbmFtZSwgc2l6ZW9mKGZpbGVu YW1lKSwgdWRldl9nZXRfZGV2X3BhdGgodWRldiksICIvLnVkZXYvcnVsZXMuZCIsIE5VTEwpOwot CQkJaW5vdGlmeV9hZGRfd2F0Y2goaW5vdGlmeV9mZCwgZmlsZW5hbWUsCi0JCQkJCSAgSU5fQ1JF QVRFIHwgSU5fREVMRVRFIHwgSU5fTU9WRSB8IElOX0NMT1NFX1dSSVRFKTsKLQkJfQotCi0JCXVk ZXZfd2F0Y2hfcmVzdG9yZSh1ZGV2KTsKLQl9Ci0KIAkvKiBpbiB0cmFjZSBtb2RlIHJ1biBvbmUg ZXZlbnQgYWZ0ZXIgdGhlIG90aGVyICovCiAJaWYgKGRlYnVnX3RyYWNlKSB7CiAJCW1heF9jaGls ZHMgPSAxOwogCX0gZWxzZSB7CiAJCWludCBtZW1zaXplID0gbWVtX3NpemVfbWIoKTsKKwogCQlp ZiAobWVtc2l6ZSA+IDApCi0JCQltYXhfY2hpbGRzID0gMTI4ICsgKG1lbXNpemUgLyA0KTsKKwkJ CW1heF9jaGlsZHMgPSAxMjggKyAobWVtc2l6ZSAvIDgpOwogCQllbHNlCi0JCQltYXhfY2hpbGRz ID0gVURFVkRfTUFYX0NISUxEUzsKKwkJCW1heF9jaGlsZHMgPSAxMjg7CiAJfQorCiAJLyogcG9z c2libHkgb3ZlcndyaXRlIG1heGltdW0gbGltaXQgb2YgZXhlY3V0ZWQgZXZlbnRzICovCiAJdmFs dWUgPSBnZXRlbnYoIlVERVZEX01BWF9DSElMRFMiKTsKIAlpZiAodmFsdWUpCiAJCW1heF9jaGls ZHMgPSBzdHJ0b3VsKHZhbHVlLCBOVUxMLCAxMCk7CiAJaW5mbyh1ZGV2LCAiaW5pdGlhbGl6ZSBt YXhfY2hpbGRzIHRvICV1XG4iLCBtYXhfY2hpbGRzKTsKIAorCXVkZXZfbGlzdF9pbml0KCZldmVu dF9saXN0KTsKKwl1ZGV2X2xpc3RfaW5pdCgmd29ya2VyX2xpc3QpOworCiAJd2hpbGUgKCF1ZGV2 X2V4aXQpIHsKLQkJc2lnc2V0X3QgYmxvY2tlZF9tYXNrLCBvcmlnX21hc2s7Ci0JCXN0cnVjdCBw b2xsZmQgcGZkWzRdOwotCQlzdHJ1Y3QgcG9sbGZkICpjdHJsX3BvbGwsICptb25pdG9yX3BvbGws ICppbm90aWZ5X3BvbGwgPSBOVUxMOwotCQlpbnQgbmZkcyA9IDA7CiAJCWludCBmZGNvdW50Owor CQlpbnQgdGltZW91dDsKIAotCQlzaWdmaWxsc2V0KCZibG9ja2VkX21hc2spOwotCQlzaWdwcm9j bWFzayhTSUdfU0VUTUFTSywgJmJsb2NrZWRfbWFzaywgJm9yaWdfbWFzayk7Ci0JCWlmIChzaWdu YWxfcmVjZWl2ZWQpIHsKLQkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3JpZ19tYXNrLCBO VUxMKTsKLQkJCWdvdG8gaGFuZGxlX3NpZ25hbHM7Ci0JCX0KKwkJLyogc2V0IHRpbWVvdXQgdG8g a2lsbCBpZGxlIHdvcmtlcnMgKi8KKwkJaWYgKHVkZXZfbGlzdF9pc19lbXB0eSgmZXZlbnRfbGlz dCkgJiYgIXVkZXZfbGlzdF9pc19lbXB0eSgmd29ya2VyX2xpc3QpKQorCQkJdGltZW91dCA9IDMg KiAxMDAwOworCQllbHNlCisJCQl0aW1lb3V0ID0gLTE7CisJCS8qIHdhaXQgZm9yIGV2ZW50cyAq LworCQlmZGNvdW50ID0gcG9sbChwZmQsIEFSUkFZX1NJWkUocGZkKSwgdGltZW91dCk7CisJCWlm IChmZGNvdW50IDwgMCkKKwkJCWNvbnRpbnVlOwogCi0JCWN0cmxfcG9sbCA9ICZwZmRbbmZkcysr XTsKLQkJY3RybF9wb2xsLT5mZCA9IHVkZXZfY3RybF9nZXRfZmQodWRldl9jdHJsKTsKLQkJY3Ry bF9wb2xsLT5ldmVudHMgPSBQT0xMSU47CisJCS8qIHRpbWVvdXQgLSBraWxsIGlkbGUgd29ya2Vy cyAqLworCQlpZiAoZmRjb3VudCA9PSAwKQorCQkJd29ya2VyX2tpbGwoKTsKIAotCQltb25pdG9y X3BvbGwgPSAmcGZkW25mZHMrK107Ci0JCW1vbml0b3JfcG9sbC0+ZmQgPSB1ZGV2X21vbml0b3Jf Z2V0X2ZkKGtlcm5lbF9tb25pdG9yKTsKLQkJbW9uaXRvcl9wb2xsLT5ldmVudHMgPSBQT0xMSU47 CisJCS8qIGV2ZW50IGhhcyBmaW5pc2hlZCAqLworCQlpZiAocGZkW0ZEX1dPUktFUl0ucmV2ZW50 cyAmIFBPTExJTikKKwkJCXdvcmtlcl9yZXR1cm5lZCgpOwogCi0JCWlmIChpbm90aWZ5X2ZkID49 IDApIHsKLQkJCWlub3RpZnlfcG9sbCA9ICZwZmRbbmZkcysrXTsKLQkJCWlub3RpZnlfcG9sbC0+ ZmQgPSBpbm90aWZ5X2ZkOwotCQkJaW5vdGlmeV9wb2xsLT5ldmVudHMgPSBQT0xMSU47Ci0JCX0K KwkJLyogZ2V0IGtlcm5lbCB1ZXZlbnQgKi8KKwkJaWYgKHBmZFtGRF9ORVRMSU5LXS5yZXZlbnRz ICYgUE9MTElOKSB7CisJCQlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKIAotCQlmZGNvdW50ID0g cHBvbGwocGZkLCBuZmRzLCBOVUxMLCAmb3JpZ19tYXNrKTsKLQkJc2lncHJvY21hc2soU0lHX1NF VE1BU0ssICZvcmlnX21hc2ssIE5VTEwpOwotCQlpZiAoZmRjb3VudCA8IDApIHsKLQkJCWlmIChl cnJubyA9PSBFSU5UUikKLQkJCQlnb3RvIGhhbmRsZV9zaWduYWxzOwotCQkJZXJyKHVkZXYsICJl cnJvciBpbiBzZWxlY3Q6ICVtXG4iKTsKLQkJCWNvbnRpbnVlOworCQkJZGV2ID0gdWRldl9tb25p dG9yX3JlY2VpdmVfZGV2aWNlKG1vbml0b3IpOworCQkJaWYgKGRldiAhPSBOVUxMKQorCQkJCWV2 ZW50X3F1ZXVlX2luc2VydChkZXYpOworCQkJZWxzZQorCQkJCXVkZXZfZGV2aWNlX3VucmVmKGRl dik7CiAJCX0KIAogCQkvKiBnZXQgY29udHJvbCBtZXNzYWdlICovCi0JCWlmIChjdHJsX3BvbGwt PnJldmVudHMgJiBQT0xMSU4pCisJCWlmIChwZmRbRkRfQ09OVFJPTF0ucmV2ZW50cyAmIFBPTExJ TikKIAkJCWhhbmRsZV9jdHJsX21zZyh1ZGV2X2N0cmwpOwogCi0JCS8qIGdldCBrZXJuZWwgdWV2 ZW50ICovCi0JCWlmIChtb25pdG9yX3BvbGwtPnJldmVudHMgJiBQT0xMSU4pIHsKLQkJCXN0cnVj dCB1ZGV2X2RldmljZSAqZGV2OworCQkvKiBzdGFydCBuZXcgZXZlbnRzICovCisJCWlmICghdWRl dl9saXN0X2lzX2VtcHR5KCZldmVudF9saXN0KSAmJiAhc3RvcF9leGVjX3F1ZXVlKQorCQkJZXZl bnRzX3N0YXJ0KHVkZXYpOwogCi0JCQlkZXYgPSB1ZGV2X21vbml0b3JfcmVjZWl2ZV9kZXZpY2Uo a2VybmVsX21vbml0b3IpOwotCQkJaWYgKGRldiAhPSBOVUxMKSB7Ci0JCQkJc3RydWN0IHVkZXZf ZXZlbnQgKmV2ZW50OworCQkvKiBnZXQgc2lnbmFsICovCisJCWlmIChwZmRbRkRfU0lHTkFMXS5y ZXZlbnRzICYgUE9MTElOKSB7CisJCQlzdHJ1Y3Qgc2lnbmFsZmRfc2lnaW5mbyBmZHNpOworCQkJ c3NpemVfdCBzaXplOwogCi0JCQkJZXZlbnQgPSB1ZGV2X2V2ZW50X25ldyhkZXYpOwotCQkJCWlm IChldmVudCAhPSBOVUxMKQotCQkJCQlldmVudF9xdWV1ZV9pbnNlcnQoZXZlbnQpOwotCQkJCWVs c2UKLQkJCQkJdWRldl9kZXZpY2VfdW5yZWYoZGV2KTsKLQkJCX0KKwkJCXNpemUgPSByZWFkKHBm ZFtGRF9TSUdOQUxdLmZkLCAmZmRzaSwgc2l6ZW9mKHN0cnVjdCBzaWduYWxmZF9zaWdpbmZvKSk7 CisJCQlpZiAoc2l6ZSA9PSBzaXplb2Yoc3RydWN0IHNpZ25hbGZkX3NpZ2luZm8pKQorCQkJCWhh bmRsZV9zaWduYWwoZmRzaS5zc2lfc2lnbm8pOwogCQl9CiAKLQkJLyogcnVsZXMgZGlyZWN0b3J5 IGlub3RpZnkgd2F0Y2ggKi8KLQkJaWYgKGlub3RpZnlfcG9sbCAmJiAoaW5vdGlmeV9wb2xsLT5y ZXZlbnRzICYgUE9MTElOKSkKKwkJLyogZGV2aWNlIG5vZGUgYW5kIHJ1bGVzIGRpcmVjdG9yeSBp bm90aWZ5IHdhdGNoICovCisJCWlmIChwZmRbRkRfSU5PVElGWV0ucmV2ZW50cyAmIFBPTExJTikK IAkJCWhhbmRsZV9pbm90aWZ5KHVkZXYpOwogCi1oYW5kbGVfc2lnbmFsczoKLQkJc2lnbmFsX3Jl Y2VpdmVkID0gMDsKLQogCQkvKiBydWxlcyBjaGFuZ2VkLCBzZXQgYnkgaW5vdGlmeSBvciBhIEhV UCBzaWduYWwgKi8KIAkJaWYgKHJlbG9hZF9jb25maWcpIHsKIAkJCXN0cnVjdCB1ZGV2X3J1bGVz ICpydWxlc19uZXc7CiAKLQkJCXJlbG9hZF9jb25maWcgPSAwOworCQkJd29ya2VyX2tpbGwoKTsK IAkJCXJ1bGVzX25ldyA9IHVkZXZfcnVsZXNfbmV3KHVkZXYsIHJlc29sdmVfbmFtZXMpOwogCQkJ aWYgKHJ1bGVzX25ldyAhPSBOVUxMKSB7CiAJCQkJdWRldl9ydWxlc191bnJlZihydWxlcyk7CiAJ CQkJcnVsZXMgPSBydWxlc19uZXc7CiAJCQl9Ci0JCX0KLQotCQlpZiAoc2lnY2hpbGRzX3dhaXRp bmcpIHsKLQkJCXNpZ2NoaWxkc193YWl0aW5nID0gMDsKLQkJCXJlYXBfc2lnY2hpbGRzKCk7Ci0J CX0KLQotCQlpZiAocnVuX2V4ZWNfcSkgewotCQkJcnVuX2V4ZWNfcSA9IDA7Ci0JCQlpZiAoIXN0 b3BfZXhlY19xKQotCQkJCWV2ZW50X3F1ZXVlX21hbmFnZXIodWRldik7Ci0JCX0KLQotCQlpZiAo c2V0dGxlX3BpZCA+IDApIHsKLQkJCWtpbGwoc2V0dGxlX3BpZCwgU0lHVVNSMSk7Ci0JCQlzZXR0 bGVfcGlkID0gMDsKKwkJCXJlbG9hZF9jb25maWcgPSAwOwogCQl9CiAJfQorCiAJdWRldl9xdWV1 ZV9leHBvcnRfY2xlYW51cCh1ZGV2X3F1ZXVlX2V4cG9ydCk7CiAJcmMgPSAwOwogZXhpdDoKLQog CXVkZXZfcXVldWVfZXhwb3J0X3VucmVmKHVkZXZfcXVldWVfZXhwb3J0KTsKIAl1ZGV2X3J1bGVz X3VucmVmKHJ1bGVzKTsKIAl1ZGV2X2N0cmxfdW5yZWYodWRldl9jdHJsKTsKLQlpZiAoaW5vdGlm eV9mZCA+PSAwKQotCQljbG9zZShpbm90aWZ5X2ZkKTsKLQl1ZGV2X21vbml0b3JfdW5yZWYoa2Vy bmVsX21vbml0b3IpOworCWlmIChwZmRbRkRfU0lHTkFMXS5mZCA+PSAwKQorCQljbG9zZShwZmRb RkRfU0lHTkFMXS5mZCk7CisJaWYgKHdvcmtlcl9zb2NrZXRbUkVBRF9FTkRdID49IDApCisJCWNs b3NlKHdvcmtlcl9zb2NrZXRbUkVBRF9FTkRdKTsKKwlpZiAod29ya2VyX3NvY2tldFtXUklURV9F TkRdID49IDApCisJCWNsb3NlKHdvcmtlcl9zb2NrZXRbV1JJVEVfRU5EXSk7CisJdWRldl9tb25p dG9yX3VucmVmKG1vbml0b3IpOwogCXVkZXZfc2VsaW51eF9leGl0KHVkZXYpOwogCXVkZXZfdW5y ZWYodWRldik7CiAJbG9nZ2luZ19jbG9zZSgpOwo= --001485f7c3b4f4bd74046b5e088c--