LyogLSotIGxpbnV4LWMgLSotCiAqIEN5cHJlc3MgVVNCIFRoZXJtb21ldGVyIGRyaXZlciAKICogCiAqIENvcHlyaWdodCAoYykgMjAwNCBFcmlrIFJpZ3RvcnAgPGVya2tpQGxpbnV4Lm51PiA8ZXJpa0ByaWd0b3JwLmNvbT4KICogCiAqIFRoaXMgZHJpdmVyIHdvcmtzIHdpdGggRWxla3RvciBtYWdhemluZSBVU0IgSW50ZXJmYWNlIGFzIHB1Ymxpc2hlZCBpbiAKICogaXNzdWUgIzI5MS4gSXQgc2hvdWxkIGFsc28gd29yayB3aXRoIHRoZSBvcmlnaW5hbCBzdGFydGVyIGtpdC9kZW1vIGJvYXJkCiAqIGZyb20gQ3lwcmVzcy4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgogKgogKi8KCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgoKI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuMCIKI2RlZmluZSBEUklWRVJfQVVUSE9SICJFcmlrIFJpZ3RvcnAiCiNkZWZpbmUgRFJJVkVSX0RFU0MgIkN5cHJlc3MgVVNCIFRoZXJtb21ldGVyIGRyaXZlciIKCiNkZWZpbmUgVVNCX1NLRUxfVkVORE9SX0lECTB4MDRiNAojZGVmaW5lIFVTQl9TS0VMX1BST0RVQ1RfSUQJMHgwMDAyCgpzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGUgW10gPSB7Cgl7IFVTQl9ERVZJQ0UoVVNCX1NLRUxfVkVORE9SX0lELCBVU0JfU0tFTF9QUk9EVUNUX0lEKSB9LAoJeyB9Cn07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgaWRfdGFibGUpOwoKLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8Kc3RydWN0IHVzYl9jeXRoZXJtIHsKCXN0cnVjdCB1c2JfZGV2aWNlICAgICp1ZGV2OwkgLyogc2F2ZSBvZmYgdGhlIHVzYiBkZXZpY2UgcG9pbnRlciAqLwoJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsgLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KCWludCBicmlnaHRuZXNzOwp9OwoKCi8qIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8Kc3RhdGljIGludCBjeXRoZXJtX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIAoJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKc3RhdGljIHZvaWQgY3l0aGVybV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOwoKCi8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8Kc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGN5dGhlcm1fZHJpdmVyID0gewoJLm5hbWUgPQkJImN5dGhlcm0iLAoJLnByb2JlID0JY3l0aGVybV9wcm9iZSwKCS5kaXNjb25uZWN0ID0JY3l0aGVybV9kaXNjb25uZWN0LAoJLmlkX3RhYmxlID0JaWRfdGFibGUsCn07CgovKiBWZW5kb3IgcmVxdWVzdHMgKi8KLyogVGhleSBhbGwgb3BlcmF0ZSBvbiBvbmUgYnl0ZSBhdCBhIHRpbWUgKi8KI2RlZmluZSBQSU5HICAgICAgIDB4MDAKI2RlZmluZSBSRUFEX1JPTSAgIDB4MDEgLyogUmVhZHMgZm9ybSBST00sIHZhbHVlID0gYWRkcmVzcyAqLwojZGVmaW5lIFJFQURfUkFNICAgMHgwMiAvKiBSZWFkcyBmb3JtIFJBTSwgdmFsdWUgPSBhZGRyZXNzICovCiNkZWZpbmUgV1JJVEVfUkFNICAweDAzIC8qIFdyaXRlIHRvIFJBTSwgdmFsdWUgPSBhZGRyZXNzLCBpbmRleCA9IGRhdGEgKi8KI2RlZmluZSBSRUFEX1BPUlQgIDB4MDQgLyogUmVhZHMgZnJvbSBwb3J0LCB2YWx1ZSA9IGFkZHJlc3MgKi8KI2RlZmluZSBXUklURV9QT1JUIDB4MDUgLyogV3JpdGUgdG8gcG9ydCwgdmFsdWUgPSBhZGRyZXNzLCBpbmRleCA9IGRhdGEgKi8gCgoKLyogU2VuZCBhIHZlbmRvciBjb21tYW5kIHRvIGRldmljZSAqLwpzdGF0aWMgaW50IHZlbmRvcl9jb21tYW5kKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgcmVxdWVzdCwgCgkJCSAgdW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgY2hhciBpbmRleCwKCQkJICB2b2lkICpidWYsIGludCBzaXplKQp7CglyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCgkJCSAgICAgICByZXF1ZXN0LCAKCQkJICAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfT1RIRVIsCgkJCSAgICAgICB2YWx1ZSwgCgkJCSAgICAgICBpbmRleCwgYnVmLCBzaXplLAoJCQkgICAgICAgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOwp9CgoKCiNkZWZpbmUgQlJJR0hUTkVTUyAweDJjICAgICAvKiBSQU0gbG9jYXRpb24gZm9yIGJyaWdodG5lc3MgdmFsdWUgKi8KI2RlZmluZSBCUklHSFRORVNTX1NFTSAweDJiIC8qIFJBTSBsb2NhdGlvbiBmb3IgYnJpZ2h0bmVzcyBzZW1hcGhvcmUgKi8KCnN0YXRpYyBzc2l6ZV90IHNob3dfYnJpZ2h0bmVzcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOyAgICAKCXN0cnVjdCB1c2JfY3l0aGVybSAqY3l0aGVybSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7ICAgICAKCglyZXR1cm4gc3ByaW50ZihidWYsICIlaSIsIGN5dGhlcm0tPmJyaWdodG5lc3MpOwp9CgpzdGF0aWMgc3NpemVfdCBzZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCgkJCSAgICAgIHNpemVfdCBjb3VudCkKewoJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CglzdHJ1Y3QgdXNiX2N5dGhlcm0gKmN5dGhlcm0gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwoKCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKCWludCByZXR2YWw7CiAgIAoJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKCWlmICghYnVmZmVyKSB7CgkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CgkJcmV0dXJuIDA7Cgl9CgoJY3l0aGVybS0+YnJpZ2h0bmVzcyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogICAKCWlmIChjeXRoZXJtLT5icmlnaHRuZXNzID4gMHhGRikKCQljeXRoZXJtLT5icmlnaHRuZXNzID0gMHhGRjsKCWVsc2UgaWYgKGN5dGhlcm0tPmJyaWdodG5lc3MgPCAwKQoJCWN5dGhlcm0tPmJyaWdodG5lc3MgPSAwOwogICAKCS8qIFNldCBicmlnaHRuZXNzICovCglyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBXUklURV9SQU0sIEJSSUdIVE5FU1MsIAoJCQkJY3l0aGVybS0+YnJpZ2h0bmVzcywgYnVmZmVyLCA4KTsKCWlmIChyZXR2YWwpCgkJZGV2X2RiZygmY3l0aGVybS0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CgkvKiBJbmZvcm0gtUMgdGhhdCB3ZSBoYXZlIGNoYW5nZWQgdGhlIGJyaWdodG5lc3Mgc2V0dGluZyAqLwoJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgV1JJVEVfUkFNLCBCUklHSFRORVNTX1NFTSwKCQkJCTB4MDEsIGJ1ZmZlciwgOCk7CglpZiAocmV0dmFsKQoJCWRldl9kYmcoJmN5dGhlcm0tPnVkZXYtPmRldiwgInJldHZhbCA9ICVkXG4iLCByZXR2YWwpOwogICAKCWtmcmVlKGJ1ZmZlcik7CiAgIAoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgREVWSUNFX0FUVFIoYnJpZ2h0bmVzcywgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQLCAKCQkgICBzaG93X2JyaWdodG5lc3MsIHNldF9icmlnaHRuZXNzKTsKCgojZGVmaW5lIFRFTVAgMHgzMyAvKiBSQU0gbG9jYXRpb24gZm9yIHRlbXBlcmF0dXJlICovCiNkZWZpbmUgU0lHTiAweDM0IC8qIFJBTSBsb2NhdGlvbiBmb3IgdGVtcGVyYXR1cmUgc2lnbiAqLwoKc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoKCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwoJc3RydWN0IHVzYl9jeXRoZXJtICpjeXRoZXJtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKCglpbnQgcmV0dmFsOwoJdW5zaWduZWQgY2hhciAqYnVmZmVyOwoKCWludCB0ZW1wLCBzaWduOwogICAKCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CglpZiAoIWJ1ZmZlcikgewoJCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwoJCXJldHVybiAwOwoJfQoKCS8qIHJlYWQgdGVtcGVyYXR1cmUgKi8KCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFJFQURfUkFNLCBURU1QLCAwLCBidWZmZXIsIDgpOwoJaWYgKHJldHZhbCkKCQlkZXZfZGJnKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKCXRlbXAgPSBidWZmZXJbMV07CiAgIAoJLyogcmVhZCBzaWduICovCglyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBSRUFEX1JBTSwgU0lHTiwgMCwgYnVmZmVyLCA4KTsKCWlmIChyZXR2YWwpCgkJZGV2X2RiZygmY3l0aGVybS0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CglzaWduID0gYnVmZmVyWzFdOwoKCWtmcmVlKGJ1ZmZlcik7CiAgIAoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlaS4laSIsIHNpZ24gPyAnLScgOiAnKycsIHRlbXAgPj4gMSwKCQkgICAgICAgNSoodGVtcCAtICgodGVtcCA+PiAxKSA8PCAxKSkpOwp9CgoKc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIERFVklDRV9BVFRSKHRlbXAsIFNfSVJVR08sIHNob3dfdGVtcCwgc2V0X3RlbXApOwoKCiNkZWZpbmUgQlVUVE9OIDB4N2EKCnN0YXRpYyBzc2l6ZV90IHNob3dfYnV0dG9uKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoKCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwoJc3RydWN0IHVzYl9jeXRoZXJtICpjeXRoZXJtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKCglpbnQgcmV0dmFsOwoJdW5zaWduZWQgY2hhciAqYnVmZmVyOwoKCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CglpZiAoIWJ1ZmZlcikgewoJCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwoJCXJldHVybiAwOwoJfQoKCS8qIGNoZWNrIGJ1dHRvbiAqLwoJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgUkVBRF9SQU0sIEJVVFRPTiwgMCwgYnVmZmVyLCA4KTsKCWlmIChyZXR2YWwpCgkJZGV2X2RiZygmY3l0aGVybS0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CiAgIAoJcmV0dmFsID0gYnVmZmVyWzFdOwoKCWtmcmVlKGJ1ZmZlcik7CgoJaWYgKHJldHZhbCkKCQlyZXR1cm4gc3ByaW50ZihidWYsICIxIik7CgllbHNlCgkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCIpOwp9CgoKc3RhdGljIHNzaXplX3Qgc2V0X2J1dHRvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKewoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgREVWSUNFX0FUVFIoYnV0dG9uLCBTX0lSVUdPLCBzaG93X2J1dHRvbiwgc2V0X2J1dHRvbik7CgoKc3RhdGljIHNzaXplX3Qgc2hvd19wb3J0MChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwoJc3RydWN0IHVzYl9jeXRoZXJtICpjeXRoZXJtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKCglpbnQgcmV0dmFsOwoJdW5zaWduZWQgY2hhciAqYnVmZmVyOwoKCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CglpZiAoIWJ1ZmZlcikgewoJCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwoJCXJldHVybiAwOwoJfQoKCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFJFQURfUE9SVCwgMCwgMCwgYnVmZmVyLCA4KTsKCWlmIChyZXR2YWwpCgkJZGV2X2RiZygmY3l0aGVybS0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CgoJcmV0dmFsID0gYnVmZmVyWzFdOwoKCWtmcmVlKGJ1ZmZlcik7CgoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCByZXR2YWwpOwp9CgoKc3RhdGljIHNzaXplX3Qgc2V0X3BvcnQwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQp7CglzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKCXN0cnVjdCB1c2JfY3l0aGVybSAqY3l0aGVybSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CgoJdW5zaWduZWQgY2hhciAqYnVmZmVyOwoJaW50IHJldHZhbDsKCWludCB0bXA7CiAgIAoJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKCWlmICghYnVmZmVyKSB7CgkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CgkJcmV0dXJuIDA7Cgl9CgoJdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAgIAoJaWYgKHRtcCA+IDB4RkYpCgkJdG1wID0gMHhGRjsKCWVsc2UgaWYgKHRtcCA8IDApCgkJdG1wID0gMDsKICAgCglyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBXUklURV9QT1JULCAwLAoJCQkJdG1wLCBidWZmZXIsIDgpOwoJaWYgKHJldHZhbCkKCQlkZXZfZGJnKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKCglrZnJlZShidWZmZXIpOwoKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIERFVklDRV9BVFRSKHBvcnQwLCBTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlAsIHNob3dfcG9ydDAsIHNldF9wb3J0MCk7CgpzdGF0aWMgc3NpemVfdCBzaG93X3BvcnQxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CglzdHJ1Y3QgdXNiX2N5dGhlcm0gKmN5dGhlcm0gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwoKCWludCByZXR2YWw7Cgl1bnNpZ25lZCBjaGFyICpidWZmZXI7CgoJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKCWlmICghYnVmZmVyKSB7CgkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CgkJcmV0dXJuIDA7Cgl9CgoJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgUkVBRF9QT1JULCAxLCAwLCBidWZmZXIsIDgpOwoJaWYgKHJldHZhbCkKCQlkZXZfZGJnKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKICAgCglyZXR2YWwgPSBidWZmZXJbMV07CgoJa2ZyZWUoYnVmZmVyKTsKCglyZXR1cm4gc3ByaW50ZihidWYsICIlZCIsIHJldHZhbCk7Cn0KCgpzdGF0aWMgc3NpemVfdCBzZXRfcG9ydDEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwoJc3RydWN0IHVzYl9jeXRoZXJtICpjeXRoZXJtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKCgl1bnNpZ25lZCBjaGFyICpidWZmZXI7CglpbnQgcmV0dmFsOwoJaW50IHRtcDsKICAgCglidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwoJaWYgKCFidWZmZXIpIHsKCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKCQlyZXR1cm4gMDsKCX0KCgl0bXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKICAgCglpZiAodG1wID4gMHhGRikKCQl0bXAgPSAweEZGOwoJZWxzZSBpZiAodG1wIDwgMCkKCQl0bXAgPSAwOwogICAKCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFdSSVRFX1BPUlQsIDEsCgkJCQl0bXAsIGJ1ZmZlciwgOCk7CglpZiAocmV0dmFsKQoJCWRldl9kYmcoJmN5dGhlcm0tPnVkZXYtPmRldiwgInJldHZhbCA9ICVkXG4iLCByZXR2YWwpOwoKCWtmcmVlKGJ1ZmZlcik7CgoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgREVWSUNFX0FUVFIocG9ydDEsIFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCwgc2hvd19wb3J0MSwgc2V0X3BvcnQxKTsKCgoKc3RhdGljIGludCBjeXRoZXJtX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIAoJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKCXN0cnVjdCB1c2JfY3l0aGVybSAqZGV2ID0gTlVMTDsKCWludCByZXR2YWwgPSAtRU5PTUVNOwoKCWRldiA9IGt6YWxsb2MgKHNpemVvZihzdHJ1Y3QgdXNiX2N5dGhlcm0pLCBHRlBfS0VSTkVMKTsKCWlmIChkZXYgPT0gTlVMTCkgewoJCWRldl9lcnIgKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOwoJCWdvdG8gZXJyb3I7Cgl9CgoJZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CgoJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBkZXYpOwoKCWRldi0+YnJpZ2h0bmVzcyA9IDB4RkY7CgoJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2JyaWdodG5lc3MpOyAgIAoJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3RlbXApOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2J1dHRvbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfcG9ydDApOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQxKTsKCglkZXZfaW5mbyAoJmludGVyZmFjZS0+ZGV2LCAKCQkgICJDeXByZXNzIHRoZXJtb21ldGVyIGRldmljZSBub3cgYXR0YWNoZWRcbiIpOwoJcmV0dXJuIDA7CgogZXJyb3I6CglrZnJlZShkZXYpOwoJcmV0dXJuIHJldHZhbDsKfQoKc3RhdGljIHZvaWQgY3l0aGVybV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCnsKCXN0cnVjdCB1c2JfY3l0aGVybSAqZGV2OwoKCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGVyZmFjZSk7Cgl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIE5VTEwpOwoKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9icmlnaHRuZXNzKTsKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl90ZW1wKTsKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9idXR0b24pOwoJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQwKTsKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9wb3J0MSk7CgoJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKCglrZnJlZShkZXYpOwoKCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIkN5cHJlc3MgdGhlcm1vbWV0ZXIgbm93IGRpc2Nvbm5lY3RlZFxuIik7Cn0KCgpzdGF0aWMgaW50IF9faW5pdCB1c2JfY3l0aGVybV9pbml0KHZvaWQpCnsKCWludCByZXN1bHQ7CgoJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZjeXRoZXJtX2RyaXZlcik7CglpZiAocmVzdWx0KSAKCXsJCgkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CgoJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCB1c2JfY3l0aGVybV9leGl0KHZvaWQpCnsKCXVzYl9kZXJlZ2lzdGVyKCZjeXRoZXJtX2RyaXZlcik7Cn0KCgptb2R1bGVfaW5pdCAodXNiX2N5dGhlcm1faW5pdCk7Cm1vZHVsZV9leGl0ICh1c2JfY3l0aGVybV9leGl0KTsKCk1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ck1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK