LyogLSotIGxpbnV4LWMgLSotCiAqIEN5cHJlc3MgVVNCIFRoZXJtb21ldGVyIGRyaXZlciAKICogCiAqIENvcHlyaWdodCAoYykgMjAwNCBFcmlrIFJpZ3RvcnAgPGVya2tpQGxpbnV4Lm51PiA8ZXJpa0ByaWd0b3JwLmNvbT4KICogCiAqIFRoaXMgZHJpdmVyIHdvcmtzIHdpdGggRWxla3RvciBtYWdhemluZSBVU0IgSW50ZXJmYWNlIGFzIHB1Ymxpc2hlZCBpbiAKICogaXNzdWUgIzI5MS4gSXQgc2hvdWxkIGFsc28gd29yayB3aXRoIHRoZSBvcmlnaW5hbCBzdGFydGVyIGtpdC9kZW1vIGJvYXJkCiAqIGZyb20gQ3lwcmVzcy4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgogKgogKi8KCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC91c2IuaD4KCiNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjAiCiNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiRXJpayBSaWd0b3JwIgojZGVmaW5lIERSSVZFUl9ERVNDICJDeXByZXNzIFVTQiBUaGVybW9tZXRlciBkcml2ZXIiCgojZGVmaW5lIFVTQl9TS0VMX1ZFTkRPUl9JRAkweDA0YjQKI2RlZmluZSBVU0JfU0tFTF9QUk9EVUNUX0lECTB4MDAwMgoKc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0gewoJeyBVU0JfREVWSUNFKFVTQl9TS0VMX1ZFTkRPUl9JRCwgVVNCX1NLRUxfUFJPRFVDVF9JRCkgfSwKCXsgfQp9OwpNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGlkX3RhYmxlKTsKCi8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmICovCnN0cnVjdCB1c2JfY3l0aGVybSB7CglzdHJ1Y3QgdXNiX2RldmljZSAgICAqdWRldjsJIC8qIHNhdmUgb2ZmIHRoZSB1c2IgZGV2aWNlIHBvaW50ZXIgKi8KCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7IC8qIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgZGV2aWNlICovCglpbnQgYnJpZ2h0bmVzczsKfTsKCgovKiBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCnN0YXRpYyBpbnQgY3l0aGVybV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCAKCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CnN0YXRpYyB2b2lkIGN5dGhlcm1fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKCgovKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCnN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBjeXRoZXJtX2RyaXZlciA9IHsKCS5uYW1lID0JCSJjeXRoZXJtIiwKCS5wcm9iZSA9CWN5dGhlcm1fcHJvYmUsCgkuZGlzY29ubmVjdCA9CWN5dGhlcm1fZGlzY29ubmVjdCwKCS5pZF90YWJsZSA9CWlkX3RhYmxlLAp9OwoKLyogVmVuZG9yIHJlcXVlc3RzICovCi8qIFRoZXkgYWxsIG9wZXJhdGUgb24gb25lIGJ5dGUgYXQgYSB0aW1lICovCiNkZWZpbmUgUElORyAgICAgICAweDAwCiNkZWZpbmUgUkVBRF9ST00gICAweDAxIC8qIFJlYWRzIGZvcm0gUk9NLCB2YWx1ZSA9IGFkZHJlc3MgKi8KI2RlZmluZSBSRUFEX1JBTSAgIDB4MDIgLyogUmVhZHMgZm9ybSBSQU0sIHZhbHVlID0gYWRkcmVzcyAqLwojZGVmaW5lIFdSSVRFX1JBTSAgMHgwMyAvKiBXcml0ZSB0byBSQU0sIHZhbHVlID0gYWRkcmVzcywgaW5kZXggPSBkYXRhICovCiNkZWZpbmUgUkVBRF9QT1JUICAweDA0IC8qIFJlYWRzIGZyb20gcG9ydCwgdmFsdWUgPSBhZGRyZXNzICovCiNkZWZpbmUgV1JJVEVfUE9SVCAweDA1IC8qIFdyaXRlIHRvIHBvcnQsIHZhbHVlID0gYWRkcmVzcywgaW5kZXggPSBkYXRhICovIAoKCi8qIFNlbmQgYSB2ZW5kb3IgY29tbWFuZCB0byBkZXZpY2UgKi8Kc3RhdGljIGludCB2ZW5kb3JfY29tbWFuZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIHJlcXVlc3QsIAoJCQkgIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGNoYXIgaW5kZXgsCgkJCSAgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKewoJcmV0dXJuIHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAoJCQkgICAgICAgcmVxdWVzdCwgCgkJCSAgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX09USEVSLAoJCQkgICAgICAgdmFsdWUsIAoJCQkgICAgICAgaW5kZXgsIGJ1Ziwgc2l6ZSwKCQkJICAgICAgIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKfQoKCgojZGVmaW5lIEJSSUdIVE5FU1MgMHgyYyAgICAgLyogUkFNIGxvY2F0aW9uIGZvciBicmlnaHRuZXNzIHZhbHVlICovCiNkZWZpbmUgQlJJR0hUTkVTU19TRU0gMHgyYiAvKiBSQU0gbG9jYXRpb24gZm9yIGJyaWdodG5lc3Mgc2VtYXBob3JlICovCgpzdGF0aWMgc3NpemVfdCBzaG93X2JyaWdodG5lc3Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsgICAgCglzdHJ1Y3QgdXNiX2N5dGhlcm0gKmN5dGhlcm0gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOyAgICAgCgoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWkiLCBjeXRoZXJtLT5icmlnaHRuZXNzKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2JyaWdodG5lc3Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAoJCQkgICAgICBzaXplX3QgY291bnQpCnsKCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwoJc3RydWN0IHVzYl9jeXRoZXJtICpjeXRoZXJtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKCgl1bnNpZ25lZCBjaGFyICpidWZmZXI7CglpbnQgcmV0dmFsOwogICAKCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CglpZiAoIWJ1ZmZlcikgewoJCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwoJCXJldHVybiAwOwoJfQoKCWN5dGhlcm0tPmJyaWdodG5lc3MgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKICAgCglpZiAoY3l0aGVybS0+YnJpZ2h0bmVzcyA+IDB4RkYpCgkJY3l0aGVybS0+YnJpZ2h0bmVzcyA9IDB4RkY7CgllbHNlIGlmIChjeXRoZXJtLT5icmlnaHRuZXNzIDwgMCkKCQljeXRoZXJtLT5icmlnaHRuZXNzID0gMDsKICAgCgkvKiBTZXQgYnJpZ2h0bmVzcyAqLwoJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgV1JJVEVfUkFNLCBCUklHSFRORVNTLCAKCQkJCWN5dGhlcm0tPmJyaWdodG5lc3MsIGJ1ZmZlciwgOCk7CglpZiAocmV0dmFsKQoJCWRldl9kYmcoJmN5dGhlcm0tPnVkZXYtPmRldiwgInJldHZhbCA9ICVkXG4iLCByZXR2YWwpOwoJLyogSW5mb3JtILVDIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkIHRoZSBicmlnaHRuZXNzIHNldHRpbmcgKi8KCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFdSSVRFX1JBTSwgQlJJR0hUTkVTU19TRU0sCgkJCQkweDAxLCBidWZmZXIsIDgpOwoJaWYgKHJldHZhbCkKCQlkZXZfZGJnKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKICAgCglrZnJlZShidWZmZXIpOwogICAKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIERFVklDRV9BVFRSKGJyaWdodG5lc3MsIFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCwgCgkJICAgc2hvd19icmlnaHRuZXNzLCBzZXRfYnJpZ2h0bmVzcyk7CgoKI2RlZmluZSBURU1QIDB4MzMgLyogUkFNIGxvY2F0aW9uIGZvciB0ZW1wZXJhdHVyZSAqLwojZGVmaW5lIFNJR04gMHgzNCAvKiBSQU0gbG9jYXRpb24gZm9yIHRlbXBlcmF0dXJlIHNpZ24gKi8KCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCglzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKCXN0cnVjdCB1c2JfY3l0aGVybSAqY3l0aGVybSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CgoJaW50IHJldHZhbDsKCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKCglpbnQgdGVtcCwgc2lnbjsKICAgCglidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwoJaWYgKCFidWZmZXIpIHsKCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKCQlyZXR1cm4gMDsKCX0KCgkvKiByZWFkIHRlbXBlcmF0dXJlICovCglyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBSRUFEX1JBTSwgVEVNUCwgMCwgYnVmZmVyLCA4KTsKCWlmIChyZXR2YWwpCgkJZGV2X2RiZygmY3l0aGVybS0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7Cgl0ZW1wID0gYnVmZmVyWzFdOwogICAKCS8qIHJlYWQgc2lnbiAqLwoJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgUkVBRF9SQU0sIFNJR04sIDAsIGJ1ZmZlciwgOCk7CglpZiAocmV0dmFsKQoJCWRldl9kYmcoJmN5dGhlcm0tPnVkZXYtPmRldiwgInJldHZhbCA9ICVkXG4iLCByZXR2YWwpOwoJc2lnbiA9IGJ1ZmZlclsxXTsKCglrZnJlZShidWZmZXIpOwogICAKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWkuJWkiLCBzaWduID8gJy0nIDogJysnLCB0ZW1wID4+IDEsCgkJICAgICAgIDUqKHRlbXAgLSAoKHRlbXAgPj4gMSkgPDwgMSkpKTsKfQoKCnN0YXRpYyBzc2l6ZV90IHNldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQp7CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wLCBTX0lSVUdPLCBzaG93X3RlbXAsIHNldF90ZW1wKTsKCgojZGVmaW5lIEJVVFRPTiAweDdhCgpzdGF0aWMgc3NpemVfdCBzaG93X2J1dHRvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCglzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKCXN0cnVjdCB1c2JfY3l0aGVybSAqY3l0aGVybSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CgoJaW50IHJldHZhbDsKCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKCglidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwoJaWYgKCFidWZmZXIpIHsKCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKCQlyZXR1cm4gMDsKCX0KCgkvKiBjaGVjayBidXR0b24gKi8KCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFJFQURfUkFNLCBCVVRUT04sIDAsIGJ1ZmZlciwgOCk7CglpZiAocmV0dmFsKQoJCWRldl9kYmcoJmN5dGhlcm0tPnVkZXYtPmRldiwgInJldHZhbCA9ICVkXG4iLCByZXR2YWwpOwogICAKCXJldHZhbCA9IGJ1ZmZlclsxXTsKCglrZnJlZShidWZmZXIpOwoKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSIpOwoJZWxzZQoJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAiKTsKfQoKCnN0YXRpYyBzc2l6ZV90IHNldF9idXR0b24oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIERFVklDRV9BVFRSKGJ1dHRvbiwgU19JUlVHTywgc2hvd19idXR0b24sIHNldF9idXR0b24pOwoKCnN0YXRpYyBzc2l6ZV90IHNob3dfcG9ydDAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKCXN0cnVjdCB1c2JfY3l0aGVybSAqY3l0aGVybSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CgoJaW50IHJldHZhbDsKCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKCglidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwoJaWYgKCFidWZmZXIpIHsKCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKCQlyZXR1cm4gMDsKCX0KCglyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBSRUFEX1BPUlQsIDAsIDAsIGJ1ZmZlciwgOCk7CglpZiAocmV0dmFsKQoJCWRldl9kYmcoJmN5dGhlcm0tPnVkZXYtPmRldiwgInJldHZhbCA9ICVkXG4iLCByZXR2YWwpOwoKCXJldHZhbCA9IGJ1ZmZlclsxXTsKCglrZnJlZShidWZmZXIpOwoKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkIiwgcmV0dmFsKTsKfQoKCnN0YXRpYyBzc2l6ZV90IHNldF9wb3J0MChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKewoJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CglzdHJ1Y3QgdXNiX2N5dGhlcm0gKmN5dGhlcm0gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwoKCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKCWludCByZXR2YWw7CglpbnQgdG1wOwogICAKCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CglpZiAoIWJ1ZmZlcikgewoJCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwoJCXJldHVybiAwOwoJfQoKCXRtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogICAKCWlmICh0bXAgPiAweEZGKQoJCXRtcCA9IDB4RkY7CgllbHNlIGlmICh0bXAgPCAwKQoJCXRtcCA9IDA7CiAgIAoJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgV1JJVEVfUE9SVCwgMCwKCQkJCXRtcCwgYnVmZmVyLCA4KTsKCWlmIChyZXR2YWwpCgkJZGV2X2RiZygmY3l0aGVybS0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CgoJa2ZyZWUoYnVmZmVyKTsKCglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBERVZJQ0VfQVRUUihwb3J0MCwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQLCBzaG93X3BvcnQwLCBzZXRfcG9ydDApOwoKc3RhdGljIHNzaXplX3Qgc2hvd19wb3J0MShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwoJc3RydWN0IHVzYl9jeXRoZXJtICpjeXRoZXJtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKCglpbnQgcmV0dmFsOwoJdW5zaWduZWQgY2hhciAqYnVmZmVyOwoKCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CglpZiAoIWJ1ZmZlcikgewoJCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwoJCXJldHVybiAwOwoJfQoKCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFJFQURfUE9SVCwgMSwgMCwgYnVmZmVyLCA4KTsKCWlmIChyZXR2YWwpCgkJZGV2X2RiZygmY3l0aGVybS0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CiAgIAoJcmV0dmFsID0gYnVmZmVyWzFdOwoKCWtmcmVlKGJ1ZmZlcik7CgoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCByZXR2YWwpOwp9CgoKc3RhdGljIHNzaXplX3Qgc2V0X3BvcnQxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQp7CglzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKCXN0cnVjdCB1c2JfY3l0aGVybSAqY3l0aGVybSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CgoJdW5zaWduZWQgY2hhciAqYnVmZmVyOwoJaW50IHJldHZhbDsKCWludCB0bXA7CiAgIAoJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKCWlmICghYnVmZmVyKSB7CgkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CgkJcmV0dXJuIDA7Cgl9CgoJdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAgIAoJaWYgKHRtcCA+IDB4RkYpCgkJdG1wID0gMHhGRjsKCWVsc2UgaWYgKHRtcCA8IDApCgkJdG1wID0gMDsKICAgCglyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBXUklURV9QT1JULCAxLAoJCQkJdG1wLCBidWZmZXIsIDgpOwoJaWYgKHJldHZhbCkKCQlkZXZfZGJnKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKCglrZnJlZShidWZmZXIpOwoKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIERFVklDRV9BVFRSKHBvcnQxLCBTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlAsIHNob3dfcG9ydDEsIHNldF9wb3J0MSk7CgoKCnN0YXRpYyBpbnQgY3l0aGVybV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCAKCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKewoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CglzdHJ1Y3QgdXNiX2N5dGhlcm0gKmRldiA9IE5VTEw7CglpbnQgcmV0dmFsID0gLUVOT01FTTsKCglkZXYgPSBremFsbG9jIChzaXplb2Yoc3RydWN0IHVzYl9jeXRoZXJtKSwgR0ZQX0tFUk5FTCk7CglpZiAoZGV2ID09IE5VTEwpIHsKCQlkZXZfZXJyICgmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKCQlnb3RvIGVycm9yX21lbTsKCX0KCglkZXYtPnVkZXYgPSB1c2JfZ2V0X2Rldih1ZGV2KTsKCgl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIGRldik7CgoJZGV2LT5icmlnaHRuZXNzID0gMHhGRjsKCglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfYnJpZ2h0bmVzcyk7CglpZiAocmV0dmFsKQoJCWdvdG8gZXJyb3I7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfdGVtcCk7CglpZiAocmV0dmFsKQoJCWdvdG8gZXJyb3I7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfYnV0dG9uKTsKCWlmIChyZXR2YWwpCgkJZ290byBlcnJvcjsKCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9wb3J0MCk7CglpZiAocmV0dmFsKQoJCWdvdG8gZXJyb3I7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfcG9ydDEpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGVycm9yOwoKCWRldl9pbmZvICgmaW50ZXJmYWNlLT5kZXYsCgkJICAiQ3lwcmVzcyB0aGVybW9tZXRlciBkZXZpY2Ugbm93IGF0dGFjaGVkXG4iKTsKCXJldHVybiAwOwplcnJvcjoKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9icmlnaHRuZXNzKTsKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl90ZW1wKTsKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9idXR0b24pOwoJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQwKTsKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9wb3J0MSk7Cgl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIE5VTEwpOwoJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKCWtmcmVlKGRldik7CmVycm9yX21lbToKCXJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkIGN5dGhlcm1fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQp7CglzdHJ1Y3QgdXNiX2N5dGhlcm0gKmRldjsKCglkZXYgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRlcmZhY2UpOwoJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBOVUxMKTsKCglkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfYnJpZ2h0bmVzcyk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfdGVtcCk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfYnV0dG9uKTsKCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9wb3J0MCk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfcG9ydDEpOwoKCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CgoJa2ZyZWUoZGV2KTsKCglkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJDeXByZXNzIHRoZXJtb21ldGVyIG5vdyBkaXNjb25uZWN0ZWRcbiIpOwp9CgoKc3RhdGljIGludCBfX2luaXQgdXNiX2N5dGhlcm1faW5pdCh2b2lkKQp7CglpbnQgcmVzdWx0OwoKCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmY3l0aGVybV9kcml2ZXIpOwoJaWYgKHJlc3VsdCkgCgl7CQoJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmVzdWx0KTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoKCWluZm8oRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX2N5dGhlcm1fZXhpdCh2b2lkKQp7Cgl1c2JfZGVyZWdpc3RlcigmY3l0aGVybV9kcml2ZXIpOwp9CgoKbW9kdWxlX2luaXQgKHVzYl9jeXRoZXJtX2luaXQpOwptb2R1bGVfZXhpdCAodXNiX2N5dGhlcm1fZXhpdCk7CgpNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwpNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==