LyoKICogbGludXgvZHJpdmVycy9zMzkwL2Npby9jbWYuYyAoJFJldmlzaW9uOiAxLjE2ICQpCiAqCiAqIExpbnV4IG9uIHpTZXJpZXMgQ2hhbm5lbCBNZWFzdXJlbWVudCBGYWNpbGl0eSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwLDIwMDMgSUJNIENvcnBvcmF0aW9uCiAqCiAqIEF1dGhvcjogQXJuZCBCZXJnbWFubiA8YXJuZGJAZGUuaWJtLmNvbT4KICoKICogb3JpZ2luYWwgaWRlYSBmcm9tIE5hdGFyYWphbiBLcmlzaG5hc3dhbWkgPG5rcmlzaG5hQHVzLmlibS5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KCiNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiNpbmNsdWRlIDxhc20vY2lvLmg+CiNpbmNsdWRlIDxhc20vY21iLmg+CgojaW5jbHVkZSAiY2lvLmgiCiNpbmNsdWRlICJjc3MuaCIKI2luY2x1ZGUgImRldmljZS5oIgojaW5jbHVkZSAiaW9hc20uaCIKI2luY2x1ZGUgImNoc2MuaCIKCi8qIHBhcmFtZXRlciB0byBlbmFibGUgY21mIGR1cmluZyBib290LCBwb3NzaWJsZSB1c2VzIGFyZToKICogICJzMzkwY21mIiAtLSBlbmFibGUgY21mIGFuZCBhbGxvY2F0ZSAyIE1CIG9mIHJhbSBzbyBtZWFzdXJpbmcgY2FuIGJlCiAqICAgICAgICAgICAgICAgdXNlZCBvbiBhbnkgc3ViY2hhbm5lbAogKiAgInMzOTBjbWY9PG51bT4iIC0tIGVuYWJsZSBjbWYgYW5kIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gbWVhc3VyZQogKiAgICAgICAgICAgICAgICAgICAgIDxudW0+IHN1YmNoYW5uZWwsIHdoZXJlIDxudW0+IGlzIGFuIGludGVnZXIKICogICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIDEgYW5kIDY1NTM1LCBkZWZhdWx0IGlzIDEwMjQKICovCiNkZWZpbmUgQVJHU1RSSU5HICJzMzkwY21mIgoKLyogaW5kaWNlcyBmb3IgUkVBRENNQiAqLwplbnVtIGNtYl9pbmRleCB7CiAvKiBiYXNpYyBhbmQgZXhlbmRlZCBmb3JtYXQ6ICovCgljbWJfc3NjaF9yc2NoX2NvdW50LAoJY21iX3NhbXBsZV9jb3VudCwKCWNtYl9kZXZpY2VfY29ubmVjdF90aW1lLAoJY21iX2Z1bmN0aW9uX3BlbmRpbmdfdGltZSwKCWNtYl9kZXZpY2VfZGlzY29ubmVjdF90aW1lLAoJY21iX2NvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWUsCgljbWJfZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWUsCiAvKiBleHRlbmRlZCBmb3JtYXQgb25seTogKi8KCWNtYl9kZXZpY2VfYnVzeV90aW1lLAoJY21iX2luaXRpYWxfY29tbWFuZF9yZXNwb25zZV90aW1lLAp9OwoKLyoqCiAqIGVudW0gY21iX2Zvcm1hdCAtIHR5cGVzIG9mIHN1cHBvcnRlZCBtZWFzdXJlbWVudCBibG9jayBmb3JtYXRzCiAqCiAqIEBDTUZfQkFTSUM6ICAgICAgdHJhZGl0aW9uYWwgY2hhbm5lbCBtZWFzdXJlbWVudCBibG9ja3Mgc3VwcG9ydGVkCiAqIAkJICAgIGJ5IGFsbCBtYWNoaW5lcyB0aGF0IHdlIHJ1biBvbgogKiBAQ01GX0VYVEVOREVEOiAgIGltcHJvdmVkIGZvcm1hdCB0aGF0IHdhcyBpbnRyb2R1Y2VkIHdpdGggdGhlIHo5OTAKICogCQkgICAgbWFjaGluZQogKiBAQ01GX0FVVE9ERVRFQ1Q6IGRlZmF1bHQ6IHVzZSBleHRlbmRlZCBmb3JtYXQgd2hlbiBydW5uaW5nIG9uIGEgejk5MAogKiAgICAgICAgICAgICAgICAgIG9yIGxhdGVyIG1hY2hpbmUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gYmFzaWMgZm9ybWF0CiAqKi8KZW51bSBjbWJfZm9ybWF0IHsKCUNNRl9CQVNJQywKCUNNRl9FWFRFTkRFRCwKCUNNRl9BVVRPREVURUNUID0gLTEsCn07Ci8qKgogKiBmb3JtYXQgLSBhY3R1YWwgZm9ybWF0IGZvciBhbGwgbWVhc3VyZW1lbnQgYmxvY2tzCiAqCiAqIFRoZSBmb3JtYXQgbW9kdWxlIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIGEgdmFsdWUgb2YgMCAoemVybykKICogb3IgMSwgaW5kaWNhdGluZyBiYXNpYyBvciBleHRlbmRlZCBmb3JtYXQgYXMgZGVzY3JpYmVkIGZvcgogKiBlbnVtIGNtYl9mb3JtYXQuCiAqLwpzdGF0aWMgaW50IGZvcm1hdCA9IENNRl9BVVRPREVURUNUOwptb2R1bGVfcGFyYW0oZm9ybWF0LCBib29sLCAwNDQ0KTsKCi8qKgogKiBzdHJ1Y3QgY21iX29wZXJhdGlvbnMgLSBmdW5jdGlvbnMgdG8gdXNlIGRlcGVuZGluZyBvbiBjbWJfZm9ybWF0CiAqCiAqIGFsbCB0aGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBhIHN0cnVjdCBjbWZfZGV2aWNlLiBUaGVyZSBpcyBvbmx5CiAqIG9uZSBpbnN0YW5jZSBvZiBzdHJ1Y3QgY21iX29wZXJhdGlvbnMgYmVjYXVzZSBhbGwgY21mX2RldmljZQogKiBvYmplY3RzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUuCiAqCiAqIEBhbGxvYzoJYWxsb2NhdGUgbWVtb3J5IGZvciBhIGNoYW5uZWwgbWVhc3VyZW1lbnQgYmxvY2ssCiAqCQllaXRoZXIgd2l0aCB0aGUgaGVscCBvZiBhIHNwZWNpYWwgcG9vbCBvciB3aXRoIGttYWxsb2MKICogQGZyZWU6CWZyZWUgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIEBhbGxvYwogKiBAc2V0OgllbmFibGUgb3IgZGlzYWJsZSBtZWFzdXJlbWVudAogKiBAcmVhZGFsbDoJcmVhZCBhIG1lYXN1cmVtZW50IGJsb2NrIGluIGEgY29tbW9uIGZvcm1hdAogKiBAcmVzZXQ6CWNsZWFyIHRoZSBkYXRhIGluIHRoZSBhc3NvY2lhdGVkIG1lYXN1cmVtZW50IGJsb2NrIGFuZAogKgkJcmVzZXQgaXRzIHRpbWUgc3RhbXAKICovCnN0cnVjdCBjbWJfb3BlcmF0aW9ucyB7CglpbnQgKCphbGxvYykgIChzdHJ1Y3QgY2N3X2RldmljZSopOwoJdm9pZCgqZnJlZSkgICAoc3RydWN0IGNjd19kZXZpY2UqKTsKCWludCAoKnNldCkgICAgKHN0cnVjdCBjY3dfZGV2aWNlKiwgdTMyKTsKCXU2NCAoKnJlYWQpICAgKHN0cnVjdCBjY3dfZGV2aWNlKiwgaW50KTsKCWludCAoKnJlYWRhbGwpKHN0cnVjdCBjY3dfZGV2aWNlKiwgc3RydWN0IGNtYmRhdGEgKik7Cgl2b2lkICgqcmVzZXQpIChzdHJ1Y3QgY2N3X2RldmljZSopOwoKCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJfZ3JvdXA7Cn07CnN0YXRpYyBzdHJ1Y3QgY21iX29wZXJhdGlvbnMgKmNtYm9wczsKCi8qIG91ciB1c2VyIGludGVyZmFjZSBpcyBkZXNpZ25lZCBpbiB0ZXJtcyBvZiBuYW5vc2Vjb25kcywKICogd2hpbGUgdGhlIGhhcmR3YXJlIG1lYXN1cmVzIHRvdGFsIHRpbWVzIGluIGl0cyBvd24KICogdW5pdC4qLwpzdGF0aWMgaW5saW5lIHU2NCB0aW1lX3RvX25zZWModTMyIHZhbHVlKQp7CglyZXR1cm4gKCh1NjQpdmFsdWUpICogMTI4MDAwdWxsOwp9CgovKgogKiBVc2VycyBhcmUgdXN1YWxseSBpbnRlcmVzdGVkIGluIGF2ZXJhZ2UgdGltZXMsCiAqIG5vdCBhY2N1bXVsYXRlZCB0aW1lLgogKiBUaGlzIGFsc28gaGVscHMgdXMgd2l0aCBhdG9taWNpdHkgcHJvYmxlbXMKICogd2hlbiByZWFkaW5nIHNpbmxnZSB2YWx1ZXMuCiAqLwpzdGF0aWMgaW5saW5lIHU2NCB0aW1lX3RvX2F2Z19uc2VjKHUzMiB2YWx1ZSwgdTMyIGNvdW50KQp7Cgl1NjQgcmV0OwoKCS8qIG5vIHNhbXBsZXMgeWV0LCBhdm9pZCBkaXZpc2lvbiBieSAwICovCglpZiAoY291bnQgPT0gMCkKCQlyZXR1cm4gMDsKCgkvKiB2YWx1ZSBjb21lcyBpbiB1bml0cyBvZiAxMjggtXNlYyAqLwoJcmV0ID0gdGltZV90b19uc2VjKHZhbHVlKTsKCWRvX2RpdihyZXQsIGNvdW50KTsKCglyZXR1cm4gcmV0Owp9CgovKiBhY3RpdmF0ZSBvciBkZWFjdGl2YXRlIHRoZSBjaGFubmVsIG1vbml0b3IuIFdoZW4gYXJlYSBpcyBOVUxMLAogKiB0aGUgbW9uaXRvciBpcyBkZWFjdGl2YXRlZC4gVGhlIGNoYW5uZWwgbW9uaXRvciBuZWVkcyB0bwogKiBiZSBhY3RpdmUgaW4gb3JkZXIgdG8gbWVhc3VyZSBzdWJjaGFubmVscywgd2hpY2ggYWxzbyBuZWVkCiAqIHRvIGJlIGVuYWJsZWQuICovCnN0YXRpYyBpbmxpbmUgdm9pZApjbWZfYWN0aXZhdGUodm9pZCAqYXJlYSwgdW5zaWduZWQgaW50IG9ub2ZmKQp7CglyZWdpc3RlciB2b2lkICogX19ncHIyIGFzbSgiMiIpOwoJcmVnaXN0ZXIgbG9uZyBfX2dwcjEgYXNtKCIxIik7CgoJX19ncHIyID0gYXJlYTsKCV9fZ3ByMSA9IG9ub2ZmID8gMiA6IDA7CgkvKiBhY3RpdmF0ZSBjaGFubmVsIG1lYXN1cmVtZW50ICovCglhc20oInNjaG0iIDogOiAiZCIgKF9fZ3ByMiksICJkIiAoX19ncHIxKSApOwp9CgpzdGF0aWMgaW50CnNldF9zY2hpYihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgdTMyIG1tZSwgaW50IG1iZmMsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKewoJaW50IHJldDsKCWludCByZXRyeTsKCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CglzdHJ1Y3Qgc2NoaWIgKnNjaGliOwoKCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CglzY2hpYiA9ICZzY2gtPnNjaGliOwoJLyogbXNjaCBjYW4gc2lsZW50bHkgZmFpbCwgc28gZG8gaXQgYWdhaW4gaWYgbmVjZXNzYXJ5ICovCglmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAzOyByZXRyeSsrKSB7CgkJLyogcHJlcGFyZSBzY2hpYiAqLwoJCXN0c2NoKHNjaC0+aXJxLCBzY2hpYik7CgkJc2NoaWItPnBtY3cubW1lICA9IG1tZTsKCQlzY2hpYi0+cG1jdy5tYmZjID0gbWJmYzsKCQkvKiBhZGRyZXNzIGNhbiBiZSBlaXRoZXIgYSBibG9jayBhZGRyZXNzIG9yIGEgYmxvY2sgaW5kZXggKi8KCQlpZiAobWJmYykKCQkJc2NoaWItPm1iYSA9IGFkZHJlc3M7CgkJZWxzZQoJCQlzY2hpYi0+cG1jdy5tYmkgPSBhZGRyZXNzOwoKCQkvKiB0cnkgdG8gc3VibWl0IGl0ICovCgkJc3dpdGNoKHJldCA9IG1zY2hfZXJyKHNjaC0+aXJxLCBzY2hpYikpIHsKCQkJY2FzZSAwOgoJCQkJYnJlYWs7CgkJCWNhc2UgMToKCQkJY2FzZSAyOiAvKiBpbiBJL08gb3Igc3RhdHVzIHBlbmRpbmcgKi8KCQkJCXJldCA9IC1FQlVTWTsKCQkJCWJyZWFrOwoJCQljYXNlIDM6IC8qIHN1YmNoYW5uZWwgaXMgbm8gbG9uZ2VyIHZhbGlkICovCgkJCQlyZXQgPSAtRU5PREVWOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6IC8qIG1zY2ggY2F1Z2h0IGFuIGV4Y2VwdGlvbiAqLwoJCQkJcmV0ID0gLUVJTlZBTDsKCQkJCWJyZWFrOwoJCX0KCQlzdHNjaChzY2gtPmlycSwgc2NoaWIpOyAvKiByZXN0b3JlIHRoZSBzY2hpYiAqLwoKCQlpZiAocmV0KQoJCQlicmVhazsKCgkJLyogY2hlY2sgaWYgaXQgd29ya2VkICovCgkJaWYgKHNjaGliLT5wbWN3Lm1tZSAgPT0gbW1lICYmCgkJICAgIHNjaGliLT5wbWN3Lm1iZmMgPT0gbWJmYyAmJgoJCSAgICAobWJmYyA/IChzY2hpYi0+bWJhID09IGFkZHJlc3MpCgkJCSAgOiAoc2NoaWItPnBtY3cubWJpID09IGFkZHJlc3MpKSkKCQkJcmV0dXJuIDA7CgoJCXJldCA9IC1FSU5WQUw7Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RydWN0IHNldF9zY2hpYl9zdHJ1Y3QgewoJdTMyIG1tZTsKCWludCBtYmZjOwoJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwoJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKCWludCByZXQ7Cn07CgpzdGF0aWMgaW50IHNldF9zY2hpYl93YWl0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB1MzIgbW1lLAoJCQkJaW50IG1iZmMsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKewoJc3RydWN0IHNldF9zY2hpYl9zdHJ1Y3QgcyA9IHsKCQkubW1lID0gbW1lLAoJCS5tYmZjID0gbWJmYywKCQkuYWRkcmVzcyA9IGFkZHJlc3MsCgkJLndhaXQgPSBfX1dBSVRfUVVFVUVfSEVBRF9JTklUSUFMSVpFUihzLndhaXQpLAoJfTsKCglzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJcy5yZXQgPSBzZXRfc2NoaWIoY2RldiwgbW1lLCBtYmZjLCBhZGRyZXNzKTsKCWlmIChzLnJldCAhPSAtRUJVU1kpIHsKCQlnb3RvIG91dF9ub3dhaXQ7Cgl9CgoJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9PTkxJTkUpIHsKCQlzLnJldCA9IC1FQlVTWTsKCQkvKiBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvbmxpbmUsIGRvbid0IGV2ZW4gdHJ5IGFnYWluICovCgkJZ290byBvdXRfbm93YWl0OwoJfQoJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfQ01GQ0hBTkdFOwoJY2Rldi0+cHJpdmF0ZS0+Y21iX3dhaXQgPSAmczsKCXMucmV0ID0gMTsKCglzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CglpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHMud2FpdCwgcy5yZXQgIT0gMSkpIHsKCQlzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJCWlmIChzLnJldCA9PSAxKSB7CgkJCXMucmV0ID0gLUVSRVNUQVJUU1lTOwoJCQljZGV2LT5wcml2YXRlLT5jbWJfd2FpdCA9IDA7CgkJCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfQ01GQ0hBTkdFKQoJCQkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfT05MSU5FOwoJCX0KCQlzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7Cgl9CglyZXR1cm4gcy5yZXQ7CgpvdXRfbm93YWl0OgoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJcmV0dXJuIHMucmV0Owp9Cgp2b2lkIHJldHJ5X3NldF9zY2hpYihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKewoJc3RydWN0IHNldF9zY2hpYl9zdHJ1Y3QgKnM7CgoJcyA9IGNkZXYtPnByaXZhdGUtPmNtYl93YWl0OwoJY2Rldi0+cHJpdmF0ZS0+Y21iX3dhaXQgPSAwOwoJaWYgKCFzKSB7CgkJV0FSTl9PTigxKTsKCQlyZXR1cm47Cgl9CglzLT5yZXQgPSBzZXRfc2NoaWIoY2Rldiwgcy0+bW1lLCBzLT5tYmZjLCBzLT5hZGRyZXNzKTsKCXdha2VfdXAoJnMtPndhaXQpOwp9CgovKioKICogc3RydWN0IGNtYl9hcmVhIC0gY29udGFpbmVyIGZvciBnbG9iYWwgY21iIGRhdGEKICoKICogQG1lbToJcG9pbnRlciB0byBDTUJzIChvbmx5IGluIGJhc2ljIG1lYXN1cmVtZW50IG1vZGUpCiAqIEBsaXN0Ogljb250YWlucyBhIGxpbmtlZCBsaXN0IG9mIGFsbCBzdWJjaGFubmVscwogKiBAbG9jazoJcHJvdGVjdCBjb25jdXJyZW50IGFjY2VzcyB0byBAbWVtIGFuZCBAbGlzdAogKi8Kc3RydWN0IGNtYl9hcmVhIHsKCXN0cnVjdCBjbWIgKm1lbTsKCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKCWludCBudW1fY2hhbm5lbHM7CglzcGlubG9ja190IGxvY2s7Cn07CgpzdGF0aWMgc3RydWN0IGNtYl9hcmVhIGNtYl9hcmVhID0gewoJLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCgkubGlzdCA9IExJU1RfSEVBRF9JTklUKGNtYl9hcmVhLmxpc3QpLAoJLm51bV9jaGFubmVscyAgPSAxMDI0LAp9OwoKDAovKiAqKioqKiogb2xkIHN0eWxlIENNQiBoYW5kbGluZyAqKioqKioqKi8KCi8qKiBpbnQgbWF4Y2hhbm5lbHMKICoKICogQmFzaWMgY2hhbm5lbCBtZWFzdXJlbWVudCBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbiBvbmUgY29udGlndW91cwogKiBibG9jayBvZiBtZW1vcnksIHdoaWNoIGNhbiBub3QgYmUgbW92ZWQgYXMgbG9uZyBhcyBhbnkgY2hhbm5lbAogKiBpcyBhY3RpdmUuIFRoZXJlZm9yZSwgYSBtYXhpbXVtIG51bWJlciBvZiBzdWJjaGFubmVscyBuZWVkcyB0bwogKiBiZSBkZWZpbmVkIHNvbWV3aGVyZS4gVGhpcyBpcyBhIG1vZHVsZSBwYXJhbWV0ZXIsIGRlZmF1bHRpbmcgdG8KICogYSByZXNvbmFibGUgdmFsdWUgb2YgMTAyNCwgb3IgMzIga2Igb2YgbWVtb3J5LgogKiBDdXJyZW50IGtlcm5lbHMgZG9uJ3QgYWxsb3cga21hbGxvYyB3aXRoIG1vcmUgdGhhbiAxMjhrYiwgc28gdGhlCiAqIG1heGltdW0gaXMgNDA5NgogKi8KCm1vZHVsZV9wYXJhbV9uYW1lZChtYXhjaGFubmVscywgY21iX2FyZWEubnVtX2NoYW5uZWxzLCB1aW50LCAwNDQ0KTsKCi8qKgogKiBzdHJ1Y3QgY21iIC0gYmFzaWMgY2hhbm5lbCBtZWFzdXJlbWVudCBibG9jawogKgogKiBjbWIgYXMgdXNlZCBieSB0aGUgaGFyZHdhcmUgdGhlIGZpZWxkcyBhcmUgZGVzY3JpYmVkIGluIHovQXJjaGl0ZWN0dXJlCiAqIFByaW5jaXBsZXMgb2YgT3BlcmF0aW9uLCBjaGFwdGVyIDE3LgogKiBUaGUgYXJlYSB0byBiZSBhIGNvbnRpZ3VvdXMgYXJyYXkgYW5kIG1heSBub3QgYmUgcmVhbGxvY2F0ZWQgb3IgZnJlZWQuCiAqIE9ubHkgb25lIGNtYiBhcmVhIGNhbiBiZSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uCiAqLwpzdHJ1Y3QgY21iIHsKCXUxNiBzc2NoX3JzY2hfY291bnQ7Cgl1MTYgc2FtcGxlX2NvdW50OwoJdTMyIGRldmljZV9jb25uZWN0X3RpbWU7Cgl1MzIgZnVuY3Rpb25fcGVuZGluZ190aW1lOwoJdTMyIGRldmljZV9kaXNjb25uZWN0X3RpbWU7Cgl1MzIgY29udHJvbF91bml0X3F1ZXVpbmdfdGltZTsKCXUzMiBkZXZpY2VfYWN0aXZlX29ubHlfdGltZTsKCXUzMiByZXNlcnZlZFsyXTsKfTsKCi8qIGluc2VydCBhIHNpbmdsZSBkZXZpY2UgaW50byB0aGUgY21iX2FyZWEgbGlzdAogKiBjYWxsZWQgd2l0aCBjbWJfYXJlYS5sb2NrIGhlbGQgZnJvbSBhbGxvY19jbWIKICovCnN0YXRpYyBpbmxpbmUgaW50CmFsbG9jX2NtYl9zaW5nbGUgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CglzdHJ1Y3QgY21iICpjbWI7CglzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlICpub2RlOwoJaW50IHJldDsKCglzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJaWYgKCFsaXN0X2VtcHR5KCZjZGV2LT5wcml2YXRlLT5jbWJfbGlzdCkpIHsKCQlyZXQgPSAtRUJVU1k7CgkJZ290byBvdXQ7Cgl9CgoJLyogZmluZCBmaXJzdCB1bnVzZWQgY21iIGluIGNtYl9hcmVhLm1lbS4KCSAqIHRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5OiBjbWJfYXJlYS5saXN0CgkgKiByZW1haW5zIHNvcnRlZCBieSAtPmNtYiBwb2ludGVycyAqLwoJY21iID0gY21iX2FyZWEubWVtOwoJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmY21iX2FyZWEubGlzdCwgY21iX2xpc3QpIHsKCQlpZiAoKHN0cnVjdCBjbWIqKW5vZGUtPmNtYiA+IGNtYikKCQkJYnJlYWs7CgkJY21iKys7Cgl9CglpZiAoY21iIC0gY21iX2FyZWEubWVtID49IGNtYl9hcmVhLm51bV9jaGFubmVscykgewoJCXJldCA9IC1FTk9NRU07CgkJZ290byBvdXQ7Cgl9CgoJLyogaW5zZXJ0IG5ldyBjbWIgKi8KCWxpc3RfYWRkX3RhaWwoJmNkZXYtPnByaXZhdGUtPmNtYl9saXN0LCAmbm9kZS0+Y21iX2xpc3QpOwoJY2Rldi0+cHJpdmF0ZS0+Y21iID0gY21iOwoJcmV0ID0gMDsKb3V0OgoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludAphbGxvY19jbWIgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CglpbnQgcmV0OwoJc3RydWN0IGNtYiAqbWVtOwoJc3NpemVfdCBzaXplOwoKCXNwaW5fbG9jaygmY21iX2FyZWEubG9jayk7CgoJaWYgKCFjbWJfYXJlYS5tZW0pIHsKCQkvKiB0aGVyZSBpcyBubyB1c2VyIHlldCwgc28gd2UgbmVlZCBhIG5ldyBhcmVhICovCgkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21iKSAqIGNtYl9hcmVhLm51bV9jaGFubmVsczsKCQlXQVJOX09OKCFsaXN0X2VtcHR5KCZjbWJfYXJlYS5saXN0KSk7CgoJCXNwaW5fdW5sb2NrKCZjbWJfYXJlYS5sb2NrKTsKCQltZW0gPSAodm9pZCopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgR0ZQX0RNQSwKCQkJCSBnZXRfb3JkZXIoc2l6ZSkpOwoJCXNwaW5fbG9jaygmY21iX2FyZWEubG9jayk7CgoJCWlmIChjbWJfYXJlYS5tZW0pIHsKCQkJLyogb2ssIGFub3RoZXIgdGhyZWFkIHdhcyBmYXN0ZXIgKi8KCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW0sIGdldF9vcmRlcihzaXplKSk7CgkJfSBlbHNlIGlmICghbWVtKSB7CgkJCS8qIG5vIGx1Y2sgKi8KCQkJcmV0ID0gLUVOT01FTTsKCQkJZ290byBvdXQ7CgkJfSBlbHNlIHsKCQkJLyogZXZlcnl0aGluZyBvayAqLwoJCQltZW1zZXQobWVtLCAwLCBzaXplKTsKCQkJY21iX2FyZWEubWVtID0gbWVtOwoJCQljbWZfYWN0aXZhdGUoY21iX2FyZWEubWVtLCAxKTsKCQl9Cgl9CgoJLyogZG8gdGhlIGFjdHVhbCBhbGxvY2F0aW9uICovCglyZXQgPSBhbGxvY19jbWJfc2luZ2xlKGNkZXYpOwpvdXQ6CglzcGluX3VubG9jaygmY21iX2FyZWEubG9jayk7CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQKZnJlZV9jbWIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7CgoJcHJpdiA9IGNkZXYtPnByaXZhdGU7CgoJc3Bpbl9sb2NrKCZjbWJfYXJlYS5sb2NrKTsKCXNwaW5fbG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CgoJaWYgKGxpc3RfZW1wdHkoJnByaXYtPmNtYl9saXN0KSkgewoJCS8qIGFscmVhZHkgZnJlZWQgKi8KCQlnb3RvIG91dDsKCX0KCglwcml2LT5jbWIgPSBOVUxMOwoJbGlzdF9kZWxfaW5pdCgmcHJpdi0+Y21iX2xpc3QpOwoKCWlmIChsaXN0X2VtcHR5KCZjbWJfYXJlYS5saXN0KSkgewoJCXNzaXplX3Qgc2l6ZTsKCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBjbWIpICogY21iX2FyZWEubnVtX2NoYW5uZWxzOwoJCWNtZl9hY3RpdmF0ZShOVUxMLCAwKTsKCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWNtYl9hcmVhLm1lbSwgZ2V0X29yZGVyKHNpemUpKTsKCQljbWJfYXJlYS5tZW0gPSBOVUxMOwoJfQpvdXQ6CglzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CglzcGluX3VubG9jaygmY21iX2FyZWEubG9jayk7Cn0KCnN0YXRpYyBpbnQKc2V0X2NtYihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgdTMyIG1tZSkKewoJdTE2IG9mZnNldDsKCglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikKCQlyZXR1cm4gLUVJTlZBTDsKCglvZmZzZXQgPSBtbWUgPyAoc3RydWN0IGNtYiAqKWNkZXYtPnByaXZhdGUtPmNtYiAtIGNtYl9hcmVhLm1lbSA6IDA7CgoJcmV0dXJuIHNldF9zY2hpYl93YWl0KGNkZXYsIG1tZSwgMCwgb2Zmc2V0KTsKfQoKc3RhdGljIHU2NApyZWFkX2NtYiAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGludCBpbmRleCkKewoJLyogeWVzLCB3ZSBoYXZlIHRvIHB1dCBpdCBvbiB0aGUgc3RhY2sKCSAqIGJlY2F1c2UgdGhlIGNtYiBtdXN0IG9ubHkgYmUgYWNjZXNzZWQKCSAqIGF0b21pY2FsbHksIGUuZy4gd2l0aCBtdmMgKi8KCXN0cnVjdCBjbWIgY21iOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXUzMiB2YWw7CgoJc3Bpbl9sb2NrX2lycXNhdmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJaWYgKCFjZGV2LT5wcml2YXRlLT5jbWIpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCQlyZXR1cm4gMDsKCX0KCgljbWIgPSAqKHN0cnVjdCBjbWIqKWNkZXYtPnByaXZhdGUtPmNtYjsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoKCXN3aXRjaCAoaW5kZXgpIHsKCWNhc2UgY21iX3NzY2hfcnNjaF9jb3VudDoKCQlyZXR1cm4gY21iLnNzY2hfcnNjaF9jb3VudDsKCWNhc2UgY21iX3NhbXBsZV9jb3VudDoKCQlyZXR1cm4gY21iLnNhbXBsZV9jb3VudDsKCWNhc2UgY21iX2RldmljZV9jb25uZWN0X3RpbWU6CgkJdmFsID0gY21iLmRldmljZV9jb25uZWN0X3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9mdW5jdGlvbl9wZW5kaW5nX3RpbWU6CgkJdmFsID0gY21iLmZ1bmN0aW9uX3BlbmRpbmdfdGltZTsKCQlicmVhazsKCWNhc2UgY21iX2RldmljZV9kaXNjb25uZWN0X3RpbWU6CgkJdmFsID0gY21iLmRldmljZV9kaXNjb25uZWN0X3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9jb250cm9sX3VuaXRfcXVldWluZ190aW1lOgoJCXZhbCA9IGNtYi5jb250cm9sX3VuaXRfcXVldWluZ190aW1lOwoJCWJyZWFrOwoJY2FzZSBjbWJfZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWU6CgkJdmFsID0gY21iLmRldmljZV9hY3RpdmVfb25seV90aW1lOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCXJldHVybiB0aW1lX3RvX2F2Z19uc2VjKHZhbCwgY21iLnNhbXBsZV9jb3VudCk7Cn0KCnN0YXRpYyBpbnQKcmVhZGFsbF9jbWIgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBzdHJ1Y3QgY21iZGF0YSAqZGF0YSkKewoJLyogeWVzLCB3ZSBoYXZlIHRvIHB1dCBpdCBvbiB0aGUgc3RhY2sKCSAqIGJlY2F1c2UgdGhlIGNtYiBtdXN0IG9ubHkgYmUgYWNjZXNzZWQKCSAqIGF0b21pY2FsbHksIGUuZy4gd2l0aCBtdmMgKi8KCXN0cnVjdCBjbWIgY21iOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXU2NCB0aW1lOwoKCXNwaW5fbG9ja19pcnFzYXZlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCWlmICghY2Rldi0+cHJpdmF0ZS0+Y21iKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJY21iID0gKihzdHJ1Y3QgY21iKiljZGV2LT5wcml2YXRlLT5jbWI7Cgl0aW1lID0gZ2V0X2Nsb2NrKCkgLSBjZGV2LT5wcml2YXRlLT5jbWJfc3RhcnRfdGltZTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoKCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGNtYmRhdGEpKTsKCgkvKiB3ZSBvbmx5IGtub3cgdmFsdWVzIGJlZm9yZSBkZXZpY2VfYnVzeV90aW1lICovCglkYXRhLT5zaXplID0gb2Zmc2V0b2Yoc3RydWN0IGNtYmRhdGEsIGRldmljZV9idXN5X3RpbWUpOwoKCS8qIGNvbnZlcnQgdG8gbmFub3NlY29uZHMgKi8KCWRhdGEtPmVsYXBzZWRfdGltZSA9ICh0aW1lICogMTAwMCkgPj4gMTI7CgoJLyogY29weSBkYXRhIHRvIG5ldyBzdHJ1Y3R1cmUgKi8KCWRhdGEtPnNzY2hfcnNjaF9jb3VudCA9IGNtYi5zc2NoX3JzY2hfY291bnQ7CglkYXRhLT5zYW1wbGVfY291bnQgPSBjbWIuc2FtcGxlX2NvdW50OwoKCS8qIHRpbWUgZmllbGRzIGFyZSBjb252ZXJ0ZWQgdG8gbmFub3NlY29uZHMgd2hpbGUgY29weWluZyAqLwoJZGF0YS0+ZGV2aWNlX2Nvbm5lY3RfdGltZSA9IHRpbWVfdG9fbnNlYyhjbWIuZGV2aWNlX2Nvbm5lY3RfdGltZSk7CglkYXRhLT5mdW5jdGlvbl9wZW5kaW5nX3RpbWUgPSB0aW1lX3RvX25zZWMoY21iLmZ1bmN0aW9uX3BlbmRpbmdfdGltZSk7CglkYXRhLT5kZXZpY2VfZGlzY29ubmVjdF90aW1lID0gdGltZV90b19uc2VjKGNtYi5kZXZpY2VfZGlzY29ubmVjdF90aW1lKTsKCWRhdGEtPmNvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWUKCQk9IHRpbWVfdG9fbnNlYyhjbWIuY29udHJvbF91bml0X3F1ZXVpbmdfdGltZSk7CglkYXRhLT5kZXZpY2VfYWN0aXZlX29ubHlfdGltZQoJCT0gdGltZV90b19uc2VjKGNtYi5kZXZpY2VfYWN0aXZlX29ubHlfdGltZSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnJlc2V0X2NtYihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKewoJc3RydWN0IGNtYiAqY21iOwoJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKCWNtYiA9IGNkZXYtPnByaXZhdGUtPmNtYjsKCWlmIChjbWIpCgkJbWVtc2V0IChjbWIsIDAsIHNpemVvZiAoKmNtYikpOwoJY2Rldi0+cHJpdmF0ZS0+Y21iX3N0YXJ0X3RpbWUgPSBnZXRfY2xvY2soKTsKCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKfQoKc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY21mX2F0dHJfZ3JvdXA7CgpzdGF0aWMgc3RydWN0IGNtYl9vcGVyYXRpb25zIGNtYm9wc19iYXNpYyA9IHsKCS5hbGxvYwk9IGFsbG9jX2NtYiwKCS5mcmVlCT0gZnJlZV9jbWIsCgkuc2V0CT0gc2V0X2NtYiwKCS5yZWFkCT0gcmVhZF9jbWIsCgkucmVhZGFsbCAgICA9IHJlYWRhbGxfY21iLAoJLnJlc2V0CSAgICA9IHJlc2V0X2NtYiwKCS5hdHRyX2dyb3VwID0gJmNtZl9hdHRyX2dyb3VwLAp9OwoMCi8qICoqKioqKioqIGV4dGVuZGVkIGNtYiBoYW5kbGluZyAqKioqKioqKi8KCi8qKgogKiBzdHJ1Y3QgY21iZSAtIGV4dGVuZGVkIGNoYW5uZWwgbWVhc3VyZW1lbnQgYmxvY2sKICoKICogY21iIGFzIHVzZWQgYnkgdGhlIGhhcmR3YXJlLCBtYXkgYmUgaW4gYW55IDY0IGJpdCBwaHlzaWNhbCBsb2NhdGlvbiwKICogdGhlIGZpZWxkcyBhcmUgZGVzY3JpYmVkIGluIHovQXJjaGl0ZWN0dXJlIFByaW5jaXBsZXMgb2YgT3BlcmF0aW9uLAogKiB0aGlyZCBlZGl0aW9uLCBjaGFwdGVyIDE3LgogKi8Kc3RydWN0IGNtYmUgewoJdTMyIHNzY2hfcnNjaF9jb3VudDsKCXUzMiBzYW1wbGVfY291bnQ7Cgl1MzIgZGV2aWNlX2Nvbm5lY3RfdGltZTsKCXUzMiBmdW5jdGlvbl9wZW5kaW5nX3RpbWU7Cgl1MzIgZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZTsKCXUzMiBjb250cm9sX3VuaXRfcXVldWluZ190aW1lOwoJdTMyIGRldmljZV9hY3RpdmVfb25seV90aW1lOwoJdTMyIGRldmljZV9idXN5X3RpbWU7Cgl1MzIgaW5pdGlhbF9jb21tYW5kX3Jlc3BvbnNlX3RpbWU7Cgl1MzIgcmVzZXJ2ZWRbN107Cn07CgovKiBrbWFsbG9jIG9ubHkgZ3VhcmFudGVlcyA4IGJ5dGUgYWxpZ25tZW50LCBidXQgd2UgbmVlZCBjbWJlCiAqIHBvaW50ZXJzIHRvIGJlIG5hdHVyYWxseSBhbGlnbmVkLiBNYWtlIHN1cmUgdG8gYWxsb2NhdGUKICogZW5vdWdoIHNwYWNlIGZvciB0d28gY21iZXMgKi8Kc3RhdGljIGlubGluZSBzdHJ1Y3QgY21iZSogY21iZV9hbGlnbihzdHJ1Y3QgY21iZSAqYykKewoJdW5zaWduZWQgbG9uZyBhZGRyOwoJYWRkciA9ICgodW5zaWduZWQgbG9uZyljICsgc2l6ZW9mIChzdHJ1Y3QgY21iZSkgLSBzaXplb2YobG9uZykpICYKCQkJCSB+KHNpemVvZiAoc3RydWN0IGNtYmUpIC0gc2l6ZW9mKGxvbmcpKTsKCXJldHVybiAoc3RydWN0IGNtYmUqKWFkZHI7Cn0KCnN0YXRpYyBpbnQKYWxsb2NfY21iZSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXN0cnVjdCBjbWJlICpjbWJlOwoJY21iZSA9IGttYWxsb2MgKHNpemVvZiAoKmNtYmUpICogMiwgR0ZQX0tFUk5FTCk7CglpZiAoIWNtYmUpCgkJcmV0dXJuIC1FTk9NRU07CgoJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKCWlmIChjZGV2LT5wcml2YXRlLT5jbWIpIHsKCQlrZnJlZShjbWJlKTsKCQlzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CgkJcmV0dXJuIC1FQlVTWTsKCX0KCgljZGV2LT5wcml2YXRlLT5jbWIgPSBjbWJlOwoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoKCS8qIGFjdGl2YXRlIGdsb2JhbCBtZWFzdXJlbWVudCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjaGFubmVsICovCglzcGluX2xvY2soJmNtYl9hcmVhLmxvY2spOwoJaWYgKGxpc3RfZW1wdHkoJmNtYl9hcmVhLmxpc3QpKQoJCWNtZl9hY3RpdmF0ZShOVUxMLCAxKTsKCWxpc3RfYWRkX3RhaWwoJmNkZXYtPnByaXZhdGUtPmNtYl9saXN0LCAmY21iX2FyZWEubGlzdCk7CglzcGluX3VubG9jaygmY21iX2FyZWEubG9jayk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCmZyZWVfY21iZSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXNwaW5fbG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CglpZiAoY2Rldi0+cHJpdmF0ZS0+Y21iKQoJCWtmcmVlKGNkZXYtPnByaXZhdGUtPmNtYik7CgljZGV2LT5wcml2YXRlLT5jbWIgPSBOVUxMOwoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoKCS8qIGRlYWN0aXZhdGUgZ2xvYmFsIG1lYXN1cmVtZW50IGlmIHRoaXMgaXMgdGhlIGxhc3QgY2hhbm5lbCAqLwoJc3Bpbl9sb2NrKCZjbWJfYXJlYS5sb2NrKTsKCWxpc3RfZGVsX2luaXQoJmNkZXYtPnByaXZhdGUtPmNtYl9saXN0KTsKCWlmIChsaXN0X2VtcHR5KCZjbWJfYXJlYS5saXN0KSkKCQljbWZfYWN0aXZhdGUoTlVMTCwgMCk7CglzcGluX3VubG9jaygmY21iX2FyZWEubG9jayk7Cn0KCnN0YXRpYyBpbnQKc2V0X2NtYmUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHUzMiBtbWUpCnsKCXVuc2lnbmVkIGxvbmcgbWJhOwoKCWlmICghY2Rldi0+cHJpdmF0ZS0+Y21iKQoJCXJldHVybiAtRUlOVkFMOwoJbWJhID0gbW1lID8gKHVuc2lnbmVkIGxvbmcpIGNtYmVfYWxpZ24oY2Rldi0+cHJpdmF0ZS0+Y21iKSA6IDA7CgoJcmV0dXJuIHNldF9zY2hpYl93YWl0KGNkZXYsIG1tZSwgMSwgbWJhKTsKfQoKCnU2NApyZWFkX2NtYmUgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBpbnQgaW5kZXgpCnsKCS8qIHllcywgd2UgaGF2ZSB0byBwdXQgaXQgb24gdGhlIHN0YWNrCgkgKiBiZWNhdXNlIHRoZSBjbWIgbXVzdCBvbmx5IGJlIGFjY2Vzc2VkCgkgKiBhdG9taWNhbGx5LCBlLmcuIHdpdGggbXZjICovCglzdHJ1Y3QgY21iZSBjbWI7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTMyIHZhbDsKCglzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJCXJldHVybiAwOwoJfQoKCWNtYiA9ICpjbWJlX2FsaWduKGNkZXYtPnByaXZhdGUtPmNtYik7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCglzd2l0Y2ggKGluZGV4KSB7CgljYXNlIGNtYl9zc2NoX3JzY2hfY291bnQ6CgkJcmV0dXJuIGNtYi5zc2NoX3JzY2hfY291bnQ7CgljYXNlIGNtYl9zYW1wbGVfY291bnQ6CgkJcmV0dXJuIGNtYi5zYW1wbGVfY291bnQ7CgljYXNlIGNtYl9kZXZpY2VfY29ubmVjdF90aW1lOgoJCXZhbCA9IGNtYi5kZXZpY2VfY29ubmVjdF90aW1lOwoJCWJyZWFrOwoJY2FzZSBjbWJfZnVuY3Rpb25fcGVuZGluZ190aW1lOgoJCXZhbCA9IGNtYi5mdW5jdGlvbl9wZW5kaW5nX3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9kZXZpY2VfZGlzY29ubmVjdF90aW1lOgoJCXZhbCA9IGNtYi5kZXZpY2VfZGlzY29ubmVjdF90aW1lOwoJCWJyZWFrOwoJY2FzZSBjbWJfY29udHJvbF91bml0X3F1ZXVpbmdfdGltZToKCQl2YWwgPSBjbWIuY29udHJvbF91bml0X3F1ZXVpbmdfdGltZTsKCQlicmVhazsKCWNhc2UgY21iX2RldmljZV9hY3RpdmVfb25seV90aW1lOgoJCXZhbCA9IGNtYi5kZXZpY2VfYWN0aXZlX29ubHlfdGltZTsKCQlicmVhazsKCWNhc2UgY21iX2RldmljZV9idXN5X3RpbWU6CgkJdmFsID0gY21iLmRldmljZV9idXN5X3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9pbml0aWFsX2NvbW1hbmRfcmVzcG9uc2VfdGltZToKCQl2YWwgPSBjbWIuaW5pdGlhbF9jb21tYW5kX3Jlc3BvbnNlX3RpbWU7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAwOwoJfQoJcmV0dXJuIHRpbWVfdG9fYXZnX25zZWModmFsLCBjbWIuc2FtcGxlX2NvdW50KTsKfQoKc3RhdGljIGludApyZWFkYWxsX2NtYmUgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBzdHJ1Y3QgY21iZGF0YSAqZGF0YSkKewoJLyogeWVzLCB3ZSBoYXZlIHRvIHB1dCBpdCBvbiB0aGUgc3RhY2sKCSAqIGJlY2F1c2UgdGhlIGNtYiBtdXN0IG9ubHkgYmUgYWNjZXNzZWQKCSAqIGF0b21pY2FsbHksIGUuZy4gd2l0aCBtdmMgKi8KCXN0cnVjdCBjbWJlIGNtYjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1NjQgdGltZTsKCglzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWNtYiA9ICpjbWJlX2FsaWduKGNkZXYtPnByaXZhdGUtPmNtYik7Cgl0aW1lID0gZ2V0X2Nsb2NrKCkgLSBjZGV2LT5wcml2YXRlLT5jbWJfc3RhcnRfdGltZTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoKCW1lbXNldCAoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBjbWJkYXRhKSk7CgoJLyogd2Ugb25seSBrbm93IHZhbHVlcyBiZWZvcmUgZGV2aWNlX2J1c3lfdGltZSAqLwoJZGF0YS0+c2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBjbWJkYXRhLCBkZXZpY2VfYnVzeV90aW1lKTsKCgkvKiBjb252ZXIgdG8gbmFub3NlY29uZHMgKi8KCWRhdGEtPmVsYXBzZWRfdGltZSA9ICh0aW1lICogMTAwMCkgPj4gMTI7CgoJLyogY29weSBkYXRhIHRvIG5ldyBzdHJ1Y3R1cmUgKi8KCWRhdGEtPnNzY2hfcnNjaF9jb3VudCA9IGNtYi5zc2NoX3JzY2hfY291bnQ7CglkYXRhLT5zYW1wbGVfY291bnQgPSBjbWIuc2FtcGxlX2NvdW50OwoKCS8qIHRpbWUgZmllbGRzIGFyZSBjb252ZXJ0ZWQgdG8gbmFub3NlY29uZHMgd2hpbGUgY29weWluZyAqLwoJZGF0YS0+ZGV2aWNlX2Nvbm5lY3RfdGltZSA9IHRpbWVfdG9fbnNlYyhjbWIuZGV2aWNlX2Nvbm5lY3RfdGltZSk7CglkYXRhLT5mdW5jdGlvbl9wZW5kaW5nX3RpbWUgPSB0aW1lX3RvX25zZWMoY21iLmZ1bmN0aW9uX3BlbmRpbmdfdGltZSk7CglkYXRhLT5kZXZpY2VfZGlzY29ubmVjdF90aW1lID0gdGltZV90b19uc2VjKGNtYi5kZXZpY2VfZGlzY29ubmVjdF90aW1lKTsKCWRhdGEtPmNvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWUKCQk9IHRpbWVfdG9fbnNlYyhjbWIuY29udHJvbF91bml0X3F1ZXVpbmdfdGltZSk7CglkYXRhLT5kZXZpY2VfYWN0aXZlX29ubHlfdGltZQoJCT0gdGltZV90b19uc2VjKGNtYi5kZXZpY2VfYWN0aXZlX29ubHlfdGltZSk7CglkYXRhLT5kZXZpY2VfYnVzeV90aW1lID0gdGltZV90b19uc2VjKGNtYi5kZXZpY2VfYnVzeV90aW1lKTsKCWRhdGEtPmluaXRpYWxfY29tbWFuZF9yZXNwb25zZV90aW1lCgkJPSB0aW1lX3RvX25zZWMoY21iLmluaXRpYWxfY29tbWFuZF9yZXNwb25zZV90aW1lKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKcmVzZXRfY21iZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKewoJc3RydWN0IGNtYmUgKmNtYjsKCXNwaW5fbG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CgljbWIgPSBjbWJlX2FsaWduKGNkZXYtPnByaXZhdGUtPmNtYik7CglpZiAoY21iKQoJCW1lbXNldCAoY21iLCAwLCBzaXplb2YgKCpjbWIpKTsKCWNkZXYtPnByaXZhdGUtPmNtYl9zdGFydF90aW1lID0gZ2V0X2Nsb2NrKCk7CglzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7Cn0KCnN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNtZl9hdHRyX2dyb3VwX2V4dDsKCnN0YXRpYyBzdHJ1Y3QgY21iX29wZXJhdGlvbnMgY21ib3BzX2V4dGVuZGVkID0gewoJLmFsbG9jCSAgICA9IGFsbG9jX2NtYmUsCgkuZnJlZQkgICAgPSBmcmVlX2NtYmUsCgkuc2V0CSAgICA9IHNldF9jbWJlLAoJLnJlYWQJICAgID0gcmVhZF9jbWJlLAoJLnJlYWRhbGwgICAgPSByZWFkYWxsX2NtYmUsCgkucmVzZXQJICAgID0gcmVzZXRfY21iZSwKCS5hdHRyX2dyb3VwID0gJmNtZl9hdHRyX2dyb3VwX2V4dCwKfTsKDAoKc3RhdGljIHNzaXplX3QKY21iX3Nob3dfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgZW51bSBjbWJfaW5kZXggaWR4KQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGxkXG4iLAoJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGNtZl9yZWFkKHRvX2Njd2RldihkZXYpLCBpZHgpKTsKfQoKc3RhdGljIHNzaXplX3QKY21iX3Nob3dfYXZnX3NhbXBsZV9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwoJbG9uZyBpbnRlcnZhbDsKCXVuc2lnbmVkIGxvbmcgY291bnQ7CgoJY2RldiA9IHRvX2Njd2RldihkZXYpOwoJaW50ZXJ2YWwgID0gZ2V0X2Nsb2NrKCkgLSBjZGV2LT5wcml2YXRlLT5jbWJfc3RhcnRfdGltZTsKCWNvdW50ID0gY21mX3JlYWQoY2RldiwgY21iX3NhbXBsZV9jb3VudCk7CglpZiAoY291bnQpCgkJaW50ZXJ2YWwgLz0gY291bnQ7CgllbHNlCgkJaW50ZXJ2YWwgPSAtMTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgaW50ZXJ2YWwpOwp9CgpzdGF0aWMgc3NpemVfdApjbWJfc2hvd19hdmdfdXRpbGl6YXRpb24oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY21iZGF0YSBkYXRhOwoJdTY0IHV0aWxpemF0aW9uOwoJdW5zaWduZWQgbG9uZyB0LCB1OwoJaW50IHJldDsKCglyZXQgPSBjbWZfcmVhZGFsbCh0b19jY3dkZXYoZGV2KSwgJmRhdGEpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKCXV0aWxpemF0aW9uID0gZGF0YS5kZXZpY2VfY29ubmVjdF90aW1lICsKCQkgICAgICBkYXRhLmZ1bmN0aW9uX3BlbmRpbmdfdGltZSArCgkJICAgICAgZGF0YS5kZXZpY2VfZGlzY29ubmVjdF90aW1lOwoKCS8qIHNoaWZ0IHRvIGF2b2lkIGxvbmcgbG9uZyBkaXZpc2lvbiAqLwoJd2hpbGUgKC0xdWwgPCAoZGF0YS5lbGFwc2VkX3RpbWUgfCB1dGlsaXphdGlvbikpIHsKCQl1dGlsaXphdGlvbiA+Pj0gODsKCQlkYXRhLmVsYXBzZWRfdGltZSA+Pj0gODsKCX0KCgkvKiBjYWxjdWxhdGUgdmFsdWUgaW4gMC4xIHBlcmNlbnQgdW5pdHMgKi8KCXQgPSAodW5zaWduZWQgbG9uZykgZGF0YS5lbGFwc2VkX3RpbWUgLyAxMDAwOwoJdSA9ICh1bnNpZ25lZCBsb25nKSB1dGlsaXphdGlvbiAvIHQ7CgoJcmV0dXJuIHNwcmludGYoYnVmLCAiJTAybGQuJTAxbGQlJVxuIiwgdS8gMTAsIHUgLSAodS8gMTApICogMTApOwp9CgojZGVmaW5lIGNtZl9hdHRyKG5hbWUpIFwKc3RhdGljIHNzaXplX3Qgc2hvd18gIyMgbmFtZSAoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKiBidWYpIFwKeyByZXR1cm4gY21iX3Nob3dfYXR0cigoZGV2KSwgYnVmLCBjbWJfICMjIG5hbWUpOyB9IFwKc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIDA0NDQsIHNob3dfICMjIG5hbWUsIE5VTEwpOwoKI2RlZmluZSBjbWZfYXR0cl9hdmcobmFtZSkgXApzdGF0aWMgc3NpemVfdCBzaG93X2F2Z18gIyMgbmFtZSAoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKiBidWYpIFwKeyByZXR1cm4gY21iX3Nob3dfYXR0cigoZGV2KSwgYnVmLCBjbWJfICMjIG5hbWUpOyB9IFwKc3RhdGljIERFVklDRV9BVFRSKGF2Z18gIyMgbmFtZSwgMDQ0NCwgc2hvd19hdmdfICMjIG5hbWUsIE5VTEwpOwoKY21mX2F0dHIoc3NjaF9yc2NoX2NvdW50KTsKY21mX2F0dHIoc2FtcGxlX2NvdW50KTsKY21mX2F0dHJfYXZnKGRldmljZV9jb25uZWN0X3RpbWUpOwpjbWZfYXR0cl9hdmcoZnVuY3Rpb25fcGVuZGluZ190aW1lKTsKY21mX2F0dHJfYXZnKGRldmljZV9kaXNjb25uZWN0X3RpbWUpOwpjbWZfYXR0cl9hdmcoY29udHJvbF91bml0X3F1ZXVpbmdfdGltZSk7CmNtZl9hdHRyX2F2ZyhkZXZpY2VfYWN0aXZlX29ubHlfdGltZSk7CmNtZl9hdHRyX2F2ZyhkZXZpY2VfYnVzeV90aW1lKTsKY21mX2F0dHJfYXZnKGluaXRpYWxfY29tbWFuZF9yZXNwb25zZV90aW1lKTsKCnN0YXRpYyBERVZJQ0VfQVRUUihhdmdfc2FtcGxlX2ludGVydmFsLCAwNDQ0LCBjbWJfc2hvd19hdmdfc2FtcGxlX2ludGVydmFsLCBOVUxMKTsKc3RhdGljIERFVklDRV9BVFRSKGF2Z191dGlsaXphdGlvbiwgMDQ0NCwgY21iX3Nob3dfYXZnX3V0aWxpemF0aW9uLCBOVUxMKTsKCnN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjbWZfYXR0cmlidXRlc1tdID0gewoJJmRldl9hdHRyX2F2Z19zYW1wbGVfaW50ZXJ2YWwuYXR0ciwKCSZkZXZfYXR0cl9hdmdfdXRpbGl6YXRpb24uYXR0ciwKCSZkZXZfYXR0cl9zc2NoX3JzY2hfY291bnQuYXR0ciwKCSZkZXZfYXR0cl9zYW1wbGVfY291bnQuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZGV2aWNlX2Nvbm5lY3RfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19mdW5jdGlvbl9wZW5kaW5nX3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19jb250cm9sX3VuaXRfcXVldWluZ190aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9hY3RpdmVfb25seV90aW1lLmF0dHIsCgkwLAp9OwoKc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY21mX2F0dHJfZ3JvdXAgPSB7CgkubmFtZSAgPSAiY21mIiwKCS5hdHRycyA9IGNtZl9hdHRyaWJ1dGVzLAp9OwoKc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNtZl9hdHRyaWJ1dGVzX2V4dFtdID0gewoJJmRldl9hdHRyX2F2Z19zYW1wbGVfaW50ZXJ2YWwuYXR0ciwKCSZkZXZfYXR0cl9hdmdfdXRpbGl6YXRpb24uYXR0ciwKCSZkZXZfYXR0cl9zc2NoX3JzY2hfY291bnQuYXR0ciwKCSZkZXZfYXR0cl9zYW1wbGVfY291bnQuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZGV2aWNlX2Nvbm5lY3RfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19mdW5jdGlvbl9wZW5kaW5nX3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19jb250cm9sX3VuaXRfcXVldWluZ190aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9hY3RpdmVfb25seV90aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9idXN5X3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfaW5pdGlhbF9jb21tYW5kX3Jlc3BvbnNlX3RpbWUuYXR0ciwKCTAsCn07CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjbWZfYXR0cl9ncm91cF9leHQgPSB7CgkubmFtZSAgPSAiY21mIiwKCS5hdHRycyA9IGNtZl9hdHRyaWJ1dGVzX2V4dCwKfTsKCnN0YXRpYyBzc2l6ZV90IGNtYl9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19jY3dkZXYoZGV2KS0+cHJpdmF0ZS0+Y21iID8gMSA6IDApOwp9CgpzdGF0aWMgc3NpemVfdCBjbWJfZW5hYmxlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGMpCnsKCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwoJaW50IHJldDsKCgljZGV2ID0gdG9fY2N3ZGV2KGRldik7CgoJc3dpdGNoIChidWZbMF0pIHsKCWNhc2UgJzAnOgoJCXJldCA9IGRpc2FibGVfY21mKGNkZXYpOwoJCWlmIChyZXQpCgkJCXByaW50ayhLRVJOX0lORk8gImRpc2FibGVfY21mIGZhaWxlZCAoJWQpXG4iLCByZXQpOwoJCWJyZWFrOwoJY2FzZSAnMSc6CgkJcmV0ID0gZW5hYmxlX2NtZihjZGV2KTsKCQlpZiAocmV0ICYmIHJldCAhPSAtRUJVU1kpCgkJCXByaW50ayhLRVJOX0lORk8gImVuYWJsZV9jbWYgZmFpbGVkICglZClcbiIsIHJldCk7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuIGM7Cn0KCkRFVklDRV9BVFRSKGNtYl9lbmFibGUsIDA2NDQsIGNtYl9lbmFibGVfc2hvdywgY21iX2VuYWJsZV9zdG9yZSk7CgovKiBlbmFibGVfY21mL2Rpc2FibGVfY21mOiBtb2R1bGUgaW50ZXJmYWNlIGZvciBjbWYgKGRlKWFjdGl2YXRpb24gKi8KaW50CmVuYWJsZV9jbWYoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCWludCByZXQ7CgoJcmV0ID0gY21ib3BzLT5hbGxvYyhjZGV2KTsKCWNtYm9wcy0+cmVzZXQoY2Rldik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CglyZXQgPSBjbWJvcHMtPnNldChjZGV2LCAyKTsKCWlmIChyZXQpIHsKCQljbWJvcHMtPmZyZWUoY2Rldik7CgkJcmV0dXJuIHJldDsKCX0KCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2Rldi0+ZGV2LmtvYmosIGNtYm9wcy0+YXR0cl9ncm91cCk7CglpZiAoIXJldCkKCQlyZXR1cm4gMDsKCWNtYm9wcy0+c2V0KGNkZXYsIDApOyAgLy9GSVhNRTogdGhpcyBjYW4gZmFpbAoJY21ib3BzLT5mcmVlKGNkZXYpOwoJcmV0dXJuIHJldDsKfQoKaW50CmRpc2FibGVfY21mKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CglpbnQgcmV0OwoKCXJldCA9IGNtYm9wcy0+c2V0KGNkZXYsIDApOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJY21ib3BzLT5mcmVlKGNkZXYpOwoJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjZGV2LT5kZXYua29iaiwgY21ib3BzLT5hdHRyX2dyb3VwKTsKCXJldHVybiByZXQ7Cn0KCnU2NApjbWZfcmVhZChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGluZGV4KQp7CglyZXR1cm4gY21ib3BzLT5yZWFkKGNkZXYsIGluZGV4KTsKfQoKaW50CmNtZl9yZWFkYWxsKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBzdHJ1Y3QgY21iZGF0YSAqZGF0YSkKewoJcmV0dXJuIGNtYm9wcy0+cmVhZGFsbChjZGV2LCBkYXRhKTsKfQoKc3RhdGljIGludCBfX2luaXQKaW5pdF9jbWYodm9pZCkKewoJY2hhciAqZm9ybWF0X3N0cmluZzsKCWNoYXIgKmRldGVjdF9zdHJpbmcgPSAicGFyYW1ldGVyIjsKCgkvKiBXZSBjYW5ub3QgcmVhbGx5IGF1dG9wcm9iZSB0aGlzLiBJZiB0aGUgdXNlciBkaWQgbm90IGdpdmUgYSBwYXJhbWV0ZXIsCgkgICBzZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24gejk5MCBvciB1cCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBiYXNpYyBtb2RlLiAqLwoKCWlmIChmb3JtYXQgPT0gQ01GX0FVVE9ERVRFQ1QpIHsKCQlpZiAoIWNzc19jaGFyYWN0ZXJpc3RpY3NfYXZhaWwgfHwKCQkgICAgIWNzc19nZW5lcmFsX2NoYXJhY3RlcmlzdGljcy5leHRfbWIpIHsKCQkJZm9ybWF0ID0gQ01GX0JBU0lDOwoJCX0gZWxzZSB7CgkJCWZvcm1hdCA9IENNRl9FWFRFTkRFRDsKCQl9CgkJZGV0ZWN0X3N0cmluZyA9ICJhdXRvZGV0ZWN0ZWQiOwoJfSBlbHNlIHsKCQlkZXRlY3Rfc3RyaW5nID0gInBhcmFtZXRlciI7Cgl9CgoJc3dpdGNoIChmb3JtYXQpIHsKCWNhc2UgQ01GX0JBU0lDOgoJCWZvcm1hdF9zdHJpbmcgPSAiYmFzaWMiOwoJCWNtYm9wcyA9ICZjbWJvcHNfYmFzaWM7CgkJaWYgKGNtYl9hcmVhLm51bV9jaGFubmVscyA+IDQwOTYgfHwgY21iX2FyZWEubnVtX2NoYW5uZWxzIDwgMSkgewoJCQlwcmludGsoS0VSTl9FUlIgIkJhc2ljIGNoYW5uZWwgbWVhc3VyZW1lbnQgZmFjaWxpdHkiCgkJCQkJIiBjYW4gb25seSB1c2UgMSB0byA0MDk2IGRldmljZXNcbiIKCQkJICAgICAgIEtFUk5fRVJSICJ3aGVuIHRoZSBjbWYgZHJpdmVyIGlzIGJ1aWx0IgoJCQkJCSIgYXMgYSBsb2FkYWJsZSBtb2R1bGVcbiIpOwoJCQlyZXR1cm4gMTsKCQl9CgkJYnJlYWs7CgljYXNlIENNRl9FWFRFTkRFRDoKIAkJZm9ybWF0X3N0cmluZyA9ICJleHRlbmRlZCI7CgkJY21ib3BzID0gJmNtYm9wc19leHRlbmRlZDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGZvcm1hdCAlZCBmb3IgY2hhbm5lbCAiCgkJCSJtZWFzdXJlbWVudCBmYWNpbGl0eVxuIiwgZm9ybWF0KTsKCQlyZXR1cm4gMTsKCX0KCglwcmludGsoS0VSTl9JTkZPICJDaGFubmVsIG1lYXN1cmVtZW50IGZhY2lsaXR5IHVzaW5nICVzIGZvcm1hdCAoJXMpXG4iLAoJCWZvcm1hdF9zdHJpbmcsIGRldGVjdF9zdHJpbmcpOwoJcmV0dXJuIDA7Cn0KCm1vZHVsZV9pbml0KGluaXRfY21mKTsKCgpNT0RVTEVfQVVUSE9SKCJBcm5kIEJlcmdtYW5uIDxhcm5kYkBkZS5pYm0uY29tPiIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9ERVNDUklQVElPTigiY2hhbm5lbCBtZWFzdXJlbWVudCBmYWNpbGl0eSBiYXNlIGRyaXZlclxuIgoJCSAgICJDb3B5cmlnaHQgMjAwMyBJQk0gQ29ycG9yYXRpb25cbiIpOwoKRVhQT1JUX1NZTUJPTF9HUEwoZW5hYmxlX2NtZik7CkVYUE9SVF9TWU1CT0xfR1BMKGRpc2FibGVfY21mKTsKRVhQT1JUX1NZTUJPTF9HUEwoY21mX3JlYWQpOwpFWFBPUlRfU1lNQk9MX0dQTChjbWZfcmVhZGFsbCk7Cg==