LyoKICogbGludXgvZHJpdmVycy9zMzkwL2Npby9jbWYuYyAoJFJldmlzaW9uOiAxLjE2ICQpCiAqCiAqIExpbnV4IG9uIHpTZXJpZXMgQ2hhbm5lbCBNZWFzdXJlbWVudCBGYWNpbGl0eSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwLDIwMDMgSUJNIENvcnBvcmF0aW9uCiAqCiAqIEF1dGhvcjogQXJuZCBCZXJnbWFubiA8YXJuZGJAZGUuaWJtLmNvbT4KICoKICogb3JpZ2luYWwgaWRlYSBmcm9tIE5hdGFyYWphbiBLcmlzaG5hc3dhbWkgPG5rcmlzaG5hQHVzLmlibS5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CS8qIGdldF9jbG9jaygpICovCgojaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgojaW5jbHVkZSA8YXNtL2Npby5oPgojaW5jbHVkZSA8YXNtL2NtYi5oPgojaW5jbHVkZSA8YXNtL2RpdjY0Lmg+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+Y2N3bG9jayk7CglrZnJlZShjZGV2LT5wcml2YXRlLT5jbWIpOwoJY2Rldi0+cHJpdmF0ZS0+Y21iID0gTlVMTDsKCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKCgkvKiBkZWFjdGl2YXRlIGdsb2JhbCBtZWFzdXJlbWVudCBpZiB0aGlzIGlzIHRoZSBsYXN0IGNoYW5uZWwgKi8KCXNwaW5fbG9jaygmY21iX2FyZWEubG9jayk7CglsaXN0X2RlbF9pbml0KCZjZGV2LT5wcml2YXRlLT5jbWJfbGlzdCk7CglpZiAobGlzdF9lbXB0eSgmY21iX2FyZWEubGlzdCkpCgkJY21mX2FjdGl2YXRlKE5VTEwsIDApOwoJc3Bpbl91bmxvY2soJmNtYl9hcmVhLmxvY2spOwp9CgpzdGF0aWMgaW50CnNldF9jbWJlKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB1MzIgbW1lKQp7Cgl1bnNpZ25lZCBsb25nIG1iYTsKCglpZiAoIWNkZXYtPnByaXZhdGUtPmNtYikKCQlyZXR1cm4gLUVJTlZBTDsKCW1iYSA9IG1tZSA/ICh1bnNpZ25lZCBsb25nKSBjbWJlX2FsaWduKGNkZXYtPnByaXZhdGUtPmNtYikgOiAwOwoKCXJldHVybiBzZXRfc2NoaWJfd2FpdChjZGV2LCBtbWUsIDEsIG1iYSk7Cn0KCgp1NjQKcmVhZF9jbWJlIChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGluZGV4KQp7CgkvKiB5ZXMsIHdlIGhhdmUgdG8gcHV0IGl0IG9uIHRoZSBzdGFjawoJICogYmVjYXVzZSB0aGUgY21iIG11c3Qgb25seSBiZSBhY2Nlc3NlZAoJICogYXRvbWljYWxseSwgZS5nLiB3aXRoIG12YyAqLwoJc3RydWN0IGNtYmUgY21iOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXUzMiB2YWw7CgoJc3Bpbl9sb2NrX2lycXNhdmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJaWYgKCFjZGV2LT5wcml2YXRlLT5jbWIpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCQlyZXR1cm4gMDsKCX0KCgljbWIgPSAqY21iZV9hbGlnbihjZGV2LT5wcml2YXRlLT5jbWIpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CgoJc3dpdGNoIChpbmRleCkgewoJY2FzZSBjbWJfc3NjaF9yc2NoX2NvdW50OgoJCXJldHVybiBjbWIuc3NjaF9yc2NoX2NvdW50OwoJY2FzZSBjbWJfc2FtcGxlX2NvdW50OgoJCXJldHVybiBjbWIuc2FtcGxlX2NvdW50OwoJY2FzZSBjbWJfZGV2aWNlX2Nvbm5lY3RfdGltZToKCQl2YWwgPSBjbWIuZGV2aWNlX2Nvbm5lY3RfdGltZTsKCQlicmVhazsKCWNhc2UgY21iX2Z1bmN0aW9uX3BlbmRpbmdfdGltZToKCQl2YWwgPSBjbWIuZnVuY3Rpb25fcGVuZGluZ190aW1lOwoJCWJyZWFrOwoJY2FzZSBjbWJfZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZToKCQl2YWwgPSBjbWIuZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZTsKCQlicmVhazsKCWNhc2UgY21iX2NvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWU6CgkJdmFsID0gY21iLmNvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9kZXZpY2VfYWN0aXZlX29ubHlfdGltZToKCQl2YWwgPSBjbWIuZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWU7CgkJYnJlYWs7CgljYXNlIGNtYl9kZXZpY2VfYnVzeV90aW1lOgoJCXZhbCA9IGNtYi5kZXZpY2VfYnVzeV90aW1lOwoJCWJyZWFrOwoJY2FzZSBjbWJfaW5pdGlhbF9jb21tYW5kX3Jlc3BvbnNlX3RpbWU6CgkJdmFsID0gY21iLmluaXRpYWxfY29tbWFuZF9yZXNwb25zZV90aW1lOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCXJldHVybiB0aW1lX3RvX2F2Z19uc2VjKHZhbCwgY21iLnNhbXBsZV9jb3VudCk7Cn0KCnN0YXRpYyBpbnQKcmVhZGFsbF9jbWJlIChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgc3RydWN0IGNtYmRhdGEgKmRhdGEpCnsKCS8qIHllcywgd2UgaGF2ZSB0byBwdXQgaXQgb24gdGhlIHN0YWNrCgkgKiBiZWNhdXNlIHRoZSBjbWIgbXVzdCBvbmx5IGJlIGFjY2Vzc2VkCgkgKiBhdG9taWNhbGx5LCBlLmcuIHdpdGggbXZjICovCglzdHJ1Y3QgY21iZSBjbWI7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTY0IHRpbWU7CgoJc3Bpbl9sb2NrX2lycXNhdmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwoJaWYgKCFjZGV2LT5wcml2YXRlLT5jbWIpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgljbWIgPSAqY21iZV9hbGlnbihjZGV2LT5wcml2YXRlLT5jbWIpOwoJdGltZSA9IGdldF9jbG9jaygpIC0gY2Rldi0+cHJpdmF0ZS0+Y21iX3N0YXJ0X3RpbWU7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKCgltZW1zZXQgKGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgY21iZGF0YSkpOwoKCS8qIHdlIG9ubHkga25vdyB2YWx1ZXMgYmVmb3JlIGRldmljZV9idXN5X3RpbWUgKi8KCWRhdGEtPnNpemUgPSBvZmZzZXRvZihzdHJ1Y3QgY21iZGF0YSwgZGV2aWNlX2J1c3lfdGltZSk7CgoJLyogY29udmVyIHRvIG5hbm9zZWNvbmRzICovCglkYXRhLT5lbGFwc2VkX3RpbWUgPSAodGltZSAqIDEwMDApID4+IDEyOwoKCS8qIGNvcHkgZGF0YSB0byBuZXcgc3RydWN0dXJlICovCglkYXRhLT5zc2NoX3JzY2hfY291bnQgPSBjbWIuc3NjaF9yc2NoX2NvdW50OwoJZGF0YS0+c2FtcGxlX2NvdW50ID0gY21iLnNhbXBsZV9jb3VudDsKCgkvKiB0aW1lIGZpZWxkcyBhcmUgY29udmVydGVkIHRvIG5hbm9zZWNvbmRzIHdoaWxlIGNvcHlpbmcgKi8KCWRhdGEtPmRldmljZV9jb25uZWN0X3RpbWUgPSB0aW1lX3RvX25zZWMoY21iLmRldmljZV9jb25uZWN0X3RpbWUpOwoJZGF0YS0+ZnVuY3Rpb25fcGVuZGluZ190aW1lID0gdGltZV90b19uc2VjKGNtYi5mdW5jdGlvbl9wZW5kaW5nX3RpbWUpOwoJZGF0YS0+ZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZSA9IHRpbWVfdG9fbnNlYyhjbWIuZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZSk7CglkYXRhLT5jb250cm9sX3VuaXRfcXVldWluZ190aW1lCgkJPSB0aW1lX3RvX25zZWMoY21iLmNvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWUpOwoJZGF0YS0+ZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWUKCQk9IHRpbWVfdG9fbnNlYyhjbWIuZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWUpOwoJZGF0YS0+ZGV2aWNlX2J1c3lfdGltZSA9IHRpbWVfdG9fbnNlYyhjbWIuZGV2aWNlX2J1c3lfdGltZSk7CglkYXRhLT5pbml0aWFsX2NvbW1hbmRfcmVzcG9uc2VfdGltZQoJCT0gdGltZV90b19uc2VjKGNtYi5pbml0aWFsX2NvbW1hbmRfcmVzcG9uc2VfdGltZSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnJlc2V0X2NtYmUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCnsKCXN0cnVjdCBjbWJlICpjbWI7CglzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwoJY21iID0gY21iZV9hbGlnbihjZGV2LT5wcml2YXRlLT5jbWIpOwoJaWYgKGNtYikKCQltZW1zZXQgKGNtYiwgMCwgc2l6ZW9mICgqY21iKSk7CgljZGV2LT5wcml2YXRlLT5jbWJfc3RhcnRfdGltZSA9IGdldF9jbG9jaygpOwoJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwp9CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjbWZfYXR0cl9ncm91cF9leHQ7CgpzdGF0aWMgc3RydWN0IGNtYl9vcGVyYXRpb25zIGNtYm9wc19leHRlbmRlZCA9IHsKCS5hbGxvYwkgICAgPSBhbGxvY19jbWJlLAoJLmZyZWUJICAgID0gZnJlZV9jbWJlLAoJLnNldAkgICAgPSBzZXRfY21iZSwKCS5yZWFkCSAgICA9IHJlYWRfY21iZSwKCS5yZWFkYWxsICAgID0gcmVhZGFsbF9jbWJlLAoJLnJlc2V0CSAgICA9IHJlc2V0X2NtYmUsCgkuYXR0cl9ncm91cCA9ICZjbWZfYXR0cl9ncm91cF9leHQsCn07CgwKCnN0YXRpYyBzc2l6ZV90CmNtYl9zaG93X2F0dHIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGVudW0gY21iX2luZGV4IGlkeCkKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsZFxuIiwKCQkodW5zaWduZWQgbG9uZyBsb25nKSBjbWZfcmVhZCh0b19jY3dkZXYoZGV2KSwgaWR4KSk7Cn0KCnN0YXRpYyBzc2l6ZV90CmNtYl9zaG93X2F2Z19zYW1wbGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKCWxvbmcgaW50ZXJ2YWw7Cgl1bnNpZ25lZCBsb25nIGNvdW50OwoKCWNkZXYgPSB0b19jY3dkZXYoZGV2KTsKCWludGVydmFsICA9IGdldF9jbG9jaygpIC0gY2Rldi0+cHJpdmF0ZS0+Y21iX3N0YXJ0X3RpbWU7Cgljb3VudCA9IGNtZl9yZWFkKGNkZXYsIGNtYl9zYW1wbGVfY291bnQpOwoJaWYgKGNvdW50KQoJCWludGVydmFsIC89IGNvdW50OwoJZWxzZQoJCWludGVydmFsID0gLTE7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGludGVydmFsKTsKfQoKc3RhdGljIHNzaXplX3QKY21iX3Nob3dfYXZnX3V0aWxpemF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoJc3RydWN0IGNtYmRhdGEgZGF0YTsKCXU2NCB1dGlsaXphdGlvbjsKCXVuc2lnbmVkIGxvbmcgdCwgdTsKCWludCByZXQ7CgoJcmV0ID0gY21mX3JlYWRhbGwodG9fY2N3ZGV2KGRldiksICZkYXRhKTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCgl1dGlsaXphdGlvbiA9IGRhdGEuZGV2aWNlX2Nvbm5lY3RfdGltZSArCgkJICAgICAgZGF0YS5mdW5jdGlvbl9wZW5kaW5nX3RpbWUgKwoJCSAgICAgIGRhdGEuZGV2aWNlX2Rpc2Nvbm5lY3RfdGltZTsKCgkvKiBzaGlmdCB0byBhdm9pZCBsb25nIGxvbmcgZGl2aXNpb24gKi8KCXdoaWxlICgtMXVsIDwgKGRhdGEuZWxhcHNlZF90aW1lIHwgdXRpbGl6YXRpb24pKSB7CgkJdXRpbGl6YXRpb24gPj49IDg7CgkJZGF0YS5lbGFwc2VkX3RpbWUgPj49IDg7Cgl9CgoJLyogY2FsY3VsYXRlIHZhbHVlIGluIDAuMSBwZXJjZW50IHVuaXRzICovCgl0ID0gKHVuc2lnbmVkIGxvbmcpIGRhdGEuZWxhcHNlZF90aW1lIC8gMTAwMDsKCXUgPSAodW5zaWduZWQgbG9uZykgdXRpbGl6YXRpb24gLyB0OwoKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwMmxkLiUwMWxkJSVcbiIsIHUvIDEwLCB1IC0gKHUvIDEwKSAqIDEwKTsKfQoKI2RlZmluZSBjbWZfYXR0cihuYW1lKSBcCnN0YXRpYyBzc2l6ZV90IHNob3dfICMjIG5hbWUgKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICogYnVmKSBcCnsgcmV0dXJuIGNtYl9zaG93X2F0dHIoKGRldiksIGJ1ZiwgY21iXyAjIyBuYW1lKTsgfSBcCnN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCAwNDQ0LCBzaG93XyAjIyBuYW1lLCBOVUxMKTsKCiNkZWZpbmUgY21mX2F0dHJfYXZnKG5hbWUpIFwKc3RhdGljIHNzaXplX3Qgc2hvd19hdmdfICMjIG5hbWUgKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICogYnVmKSBcCnsgcmV0dXJuIGNtYl9zaG93X2F0dHIoKGRldiksIGJ1ZiwgY21iXyAjIyBuYW1lKTsgfSBcCnN0YXRpYyBERVZJQ0VfQVRUUihhdmdfICMjIG5hbWUsIDA0NDQsIHNob3dfYXZnXyAjIyBuYW1lLCBOVUxMKTsKCmNtZl9hdHRyKHNzY2hfcnNjaF9jb3VudCk7CmNtZl9hdHRyKHNhbXBsZV9jb3VudCk7CmNtZl9hdHRyX2F2ZyhkZXZpY2VfY29ubmVjdF90aW1lKTsKY21mX2F0dHJfYXZnKGZ1bmN0aW9uX3BlbmRpbmdfdGltZSk7CmNtZl9hdHRyX2F2ZyhkZXZpY2VfZGlzY29ubmVjdF90aW1lKTsKY21mX2F0dHJfYXZnKGNvbnRyb2xfdW5pdF9xdWV1aW5nX3RpbWUpOwpjbWZfYXR0cl9hdmcoZGV2aWNlX2FjdGl2ZV9vbmx5X3RpbWUpOwpjbWZfYXR0cl9hdmcoZGV2aWNlX2J1c3lfdGltZSk7CmNtZl9hdHRyX2F2Zyhpbml0aWFsX2NvbW1hbmRfcmVzcG9uc2VfdGltZSk7CgpzdGF0aWMgREVWSUNFX0FUVFIoYXZnX3NhbXBsZV9pbnRlcnZhbCwgMDQ0NCwgY21iX3Nob3dfYXZnX3NhbXBsZV9pbnRlcnZhbCwgTlVMTCk7CnN0YXRpYyBERVZJQ0VfQVRUUihhdmdfdXRpbGl6YXRpb24sIDA0NDQsIGNtYl9zaG93X2F2Z191dGlsaXphdGlvbiwgTlVMTCk7CgpzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY21mX2F0dHJpYnV0ZXNbXSA9IHsKCSZkZXZfYXR0cl9hdmdfc2FtcGxlX2ludGVydmFsLmF0dHIsCgkmZGV2X2F0dHJfYXZnX3V0aWxpemF0aW9uLmF0dHIsCgkmZGV2X2F0dHJfc3NjaF9yc2NoX2NvdW50LmF0dHIsCgkmZGV2X2F0dHJfc2FtcGxlX2NvdW50LmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9jb25uZWN0X3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZnVuY3Rpb25fcGVuZGluZ190aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9kaXNjb25uZWN0X3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfY29udHJvbF91bml0X3F1ZXVpbmdfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19kZXZpY2VfYWN0aXZlX29ubHlfdGltZS5hdHRyLAoJMCwKfTsKCnN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNtZl9hdHRyX2dyb3VwID0gewoJLm5hbWUgID0gImNtZiIsCgkuYXR0cnMgPSBjbWZfYXR0cmlidXRlcywKfTsKCnN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjbWZfYXR0cmlidXRlc19leHRbXSA9IHsKCSZkZXZfYXR0cl9hdmdfc2FtcGxlX2ludGVydmFsLmF0dHIsCgkmZGV2X2F0dHJfYXZnX3V0aWxpemF0aW9uLmF0dHIsCgkmZGV2X2F0dHJfc3NjaF9yc2NoX2NvdW50LmF0dHIsCgkmZGV2X2F0dHJfc2FtcGxlX2NvdW50LmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9jb25uZWN0X3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfZnVuY3Rpb25fcGVuZGluZ190aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2RldmljZV9kaXNjb25uZWN0X3RpbWUuYXR0ciwKCSZkZXZfYXR0cl9hdmdfY29udHJvbF91bml0X3F1ZXVpbmdfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19kZXZpY2VfYWN0aXZlX29ubHlfdGltZS5hdHRyLAoJJmRldl9hdHRyX2F2Z19kZXZpY2VfYnVzeV90aW1lLmF0dHIsCgkmZGV2X2F0dHJfYXZnX2luaXRpYWxfY29tbWFuZF9yZXNwb25zZV90aW1lLmF0dHIsCgkwLAp9OwoKc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY21mX2F0dHJfZ3JvdXBfZXh0ID0gewoJLm5hbWUgID0gImNtZiIsCgkuYXR0cnMgPSBjbWZfYXR0cmlidXRlc19leHQsCn07CgpzdGF0aWMgc3NpemVfdCBjbWJfZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG9fY2N3ZGV2KGRldiktPnByaXZhdGUtPmNtYiA/IDEgOiAwKTsKfQoKc3RhdGljIHNzaXplX3QgY21iX2VuYWJsZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjKQp7CglzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKCWludCByZXQ7CgoJY2RldiA9IHRvX2Njd2RldihkZXYpOwoKCXN3aXRjaCAoYnVmWzBdKSB7CgljYXNlICcwJzoKCQlyZXQgPSBkaXNhYmxlX2NtZihjZGV2KTsKCQlpZiAocmV0KQoJCQlwcmludGsoS0VSTl9JTkZPICJkaXNhYmxlX2NtZiBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKCQlicmVhazsKCWNhc2UgJzEnOgoJCXJldCA9IGVuYWJsZV9jbWYoY2Rldik7CgkJaWYgKHJldCAmJiByZXQgIT0gLUVCVVNZKQoJCQlwcmludGsoS0VSTl9JTkZPICJlbmFibGVfY21mIGZhaWxlZCAoJWQpXG4iLCByZXQpOwoJCWJyZWFrOwoJfQoKCXJldHVybiBjOwp9CgpERVZJQ0VfQVRUUihjbWJfZW5hYmxlLCAwNjQ0LCBjbWJfZW5hYmxlX3Nob3csIGNtYl9lbmFibGVfc3RvcmUpOwoKLyogZW5hYmxlX2NtZi9kaXNhYmxlX2NtZjogbW9kdWxlIGludGVyZmFjZSBmb3IgY21mIChkZSlhY3RpdmF0aW9uICovCmludAplbmFibGVfY21mKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQp7CglpbnQgcmV0OwoKCXJldCA9IGNtYm9wcy0+YWxsb2MoY2Rldik7CgljbWJvcHMtPnJlc2V0KGNkZXYpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJcmV0ID0gY21ib3BzLT5zZXQoY2RldiwgMik7CglpZiAocmV0KSB7CgkJY21ib3BzLT5mcmVlKGNkZXYpOwoJCXJldHVybiByZXQ7Cgl9CglyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNkZXYtPmRldi5rb2JqLCBjbWJvcHMtPmF0dHJfZ3JvdXApOwoJaWYgKCFyZXQpCgkJcmV0dXJuIDA7CgljbWJvcHMtPnNldChjZGV2LCAwKTsgIC8vRklYTUU6IHRoaXMgY2FuIGZhaWwKCWNtYm9wcy0+ZnJlZShjZGV2KTsKCXJldHVybiByZXQ7Cn0KCmludApkaXNhYmxlX2NtZihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKewoJaW50IHJldDsKCglyZXQgPSBjbWJvcHMtPnNldChjZGV2LCAwKTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCWNtYm9wcy0+ZnJlZShjZGV2KTsKCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2Rldi0+ZGV2LmtvYmosIGNtYm9wcy0+YXR0cl9ncm91cCk7CglyZXR1cm4gcmV0Owp9Cgp1NjQKY21mX3JlYWQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGludCBpbmRleCkKewoJcmV0dXJuIGNtYm9wcy0+cmVhZChjZGV2LCBpbmRleCk7Cn0KCmludApjbWZfcmVhZGFsbChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgc3RydWN0IGNtYmRhdGEgKmRhdGEpCnsKCXJldHVybiBjbWJvcHMtPnJlYWRhbGwoY2RldiwgZGF0YSk7Cn0KCnN0YXRpYyBpbnQgX19pbml0CmluaXRfY21mKHZvaWQpCnsKCWNoYXIgKmZvcm1hdF9zdHJpbmc7CgljaGFyICpkZXRlY3Rfc3RyaW5nID0gInBhcmFtZXRlciI7CgoJLyogV2UgY2Fubm90IHJlYWxseSBhdXRvcHJvYmUgdGhpcy4gSWYgdGhlIHVzZXIgZGlkIG5vdCBnaXZlIGEgcGFyYW1ldGVyLAoJICAgc2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHo5OTAgb3IgdXAsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gYmFzaWMgbW9kZS4gKi8KCglpZiAoZm9ybWF0ID09IENNRl9BVVRPREVURUNUKSB7CgkJaWYgKCFjc3NfY2hhcmFjdGVyaXN0aWNzX2F2YWlsIHx8CgkJICAgICFjc3NfZ2VuZXJhbF9jaGFyYWN0ZXJpc3RpY3MuZXh0X21iKSB7CgkJCWZvcm1hdCA9IENNRl9CQVNJQzsKCQl9IGVsc2UgewoJCQlmb3JtYXQgPSBDTUZfRVhURU5ERUQ7CgkJfQoJCWRldGVjdF9zdHJpbmcgPSAiYXV0b2RldGVjdGVkIjsKCX0gZWxzZSB7CgkJZGV0ZWN0X3N0cmluZyA9ICJwYXJhbWV0ZXIiOwoJfQoKCXN3aXRjaCAoZm9ybWF0KSB7CgljYXNlIENNRl9CQVNJQzoKCQlmb3JtYXRfc3RyaW5nID0gImJhc2ljIjsKCQljbWJvcHMgPSAmY21ib3BzX2Jhc2ljOwoJCWlmIChjbWJfYXJlYS5udW1fY2hhbm5lbHMgPiA0MDk2IHx8IGNtYl9hcmVhLm51bV9jaGFubmVscyA8IDEpIHsKCQkJcHJpbnRrKEtFUk5fRVJSICJCYXNpYyBjaGFubmVsIG1lYXN1cmVtZW50IGZhY2lsaXR5IgoJCQkJCSIgY2FuIG9ubHkgdXNlIDEgdG8gNDA5NiBkZXZpY2VzXG4iCgkJCSAgICAgICBLRVJOX0VSUiAid2hlbiB0aGUgY21mIGRyaXZlciBpcyBidWlsdCIKCQkJCQkiIGFzIGEgbG9hZGFibGUgbW9kdWxlXG4iKTsKCQkJcmV0dXJuIDE7CgkJfQoJCWJyZWFrOwoJY2FzZSBDTUZfRVhURU5ERUQ6CiAJCWZvcm1hdF9zdHJpbmcgPSAiZXh0ZW5kZWQiOwoJCWNtYm9wcyA9ICZjbWJvcHNfZXh0ZW5kZWQ7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBmb3JtYXQgJWQgZm9yIGNoYW5uZWwgIgoJCQkibWVhc3VyZW1lbnQgZmFjaWxpdHlcbiIsIGZvcm1hdCk7CgkJcmV0dXJuIDE7Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiQ2hhbm5lbCBtZWFzdXJlbWVudCBmYWNpbGl0eSB1c2luZyAlcyBmb3JtYXQgKCVzKVxuIiwKCQlmb3JtYXRfc3RyaW5nLCBkZXRlY3Rfc3RyaW5nKTsKCXJldHVybiAwOwp9Cgptb2R1bGVfaW5pdChpbml0X2NtZik7CgoKTU9EVUxFX0FVVEhPUigiQXJuZCBCZXJnbWFubiA8YXJuZGJAZGUuaWJtLmNvbT4iKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfREVTQ1JJUFRJT04oImNoYW5uZWwgbWVhc3VyZW1lbnQgZmFjaWxpdHkgYmFzZSBkcml2ZXJcbiIKCQkgICAiQ29weXJpZ2h0IDIwMDMgSUJNIENvcnBvcmF0aW9uXG4iKTsKCkVYUE9SVF9TWU1CT0xfR1BMKGVuYWJsZV9jbWYpOwpFWFBPUlRfU1lNQk9MX0dQTChkaXNhYmxlX2NtZik7CkVYUE9SVF9TWU1CT0xfR1BMKGNtZl9yZWFkKTsKRVhQT1JUX1NZTUJPTF9HUEwoY21mX3JlYWRhbGwpOwo=