LyogCiAgIEJORVAgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IEJsdWV0b290aCBzdGFjayAoQmx1ZVopLgogICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBJbnZlbnRlbCBTeXN0ZW1lcwogICBXcml0dGVuIDIwMDEtMjAwMiBieQoJQ2zpbWVudCBNb3JlYXUgPGNsZW1lbnQubW9yZWF1QGludmVudGVsLmZyPgoJRGF2aWQgTGliYXVsdCAgPGRhdmlkLmxpYmF1bHRAaW52ZW50ZWwuZnI+CgogICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CgogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwogICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCiAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCiAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCiAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgogICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAogICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCiAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCiovCgovKgogKiAkSWQ6IG5ldGRldi5jLHYgMS44IDIwMDIvMDgvMDQgMjE6MjM6NTggbWF4ayBFeHAgJAogKi8gCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KCiNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CgojaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbDJjYXAuaD4KCiNpbmNsdWRlICJibmVwLmgiCgojaWZuZGVmIENPTkZJR19CVF9CTkVQX0RFQlVHCiN1bmRlZiAgQlRfREJHCiNkZWZpbmUgQlRfREJHKCBBLi4uICkKI2VuZGlmCgojZGVmaW5lIEJORVBfVFhfUVVFVUVfTEVOIDIwCgpzdGF0aWMgaW50IGJuZXBfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGJuZXBfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJuZXBfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzID0gZGV2LT5wcml2OwoJcmV0dXJuICZzLT5zdGF0czsKfQoKc3RhdGljIHZvaWQgYm5lcF9uZXRfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewojaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCglzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzID0gZGV2LT5wcml2OwoJc3RydWN0IHNvY2sgKnNrID0gcy0+c29jay0+c2s7CglzdHJ1Y3QgYm5lcF9zZXRfZmlsdGVyX3JlcSAqcjsKCXN0cnVjdCBza19idWZmICpza2I7CglpbnQgc2l6ZTsKCglCVF9EQkcoIiVzIG1jX2NvdW50ICVkIiwgZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50KTsKCglzaXplID0gc2l6ZW9mKCpyKSArIChCTkVQX01BWF9NVUxUSUNBU1RfRklMVEVSUyArIDEpICogRVRIX0FMRU4gKiAyOwoJc2tiICA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKSB7CgkJQlRfRVJSKCIlcyBNdWx0aWNhc3QgbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIsIGRldi0+bmFtZSk7CgkJcmV0dXJuOwoJfQoKCXIgPSAodm9pZCAqKSBza2ItPmRhdGE7CglfX3NrYl9wdXQoc2tiLCBzaXplb2YoKnIpKTsKCglyLT50eXBlID0gQk5FUF9DT05UUk9MOwoJci0+Y3RybCA9IEJORVBfRklMVEVSX01VTFRJX0FERFJfU0VUOwoKICAgICAgICBpZiAoZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQyB8IElGRl9BTExNVUxUSSkpIHsKCQl1OCBzdGFydFtFVEhfQUxFTl0gPSB7IDB4MDEgfTsKCgkJLyogUmVxdWVzdCBhbGwgYWRkcmVzc2VzICovCgkJbWVtY3B5KF9fc2tiX3B1dChza2IsIEVUSF9BTEVOKSwgc3RhcnQsIEVUSF9BTEVOKTsKCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pOwoJCXItPmxlbiA9IGh0b25zKEVUSF9BTEVOICogMik7Cgl9IGVsc2UgewogICAgICAgICAgICAgICAgc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CgkJaW50IGksIGxlbiA9IHNrYi0+bGVuOwoKCQlpZiAoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpIHsKCQkJbWVtY3B5KF9fc2tiX3B1dChza2IsIEVUSF9BTEVOKSwgZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKTsKCQkJbWVtY3B5KF9fc2tiX3B1dChza2IsIEVUSF9BTEVOKSwgZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKTsKCQl9CQoJCQoJCS8qIEZJWE1FOiBXZSBzaG91bGQgZ3JvdXAgYWRkcmVzc2VzIGhlcmUuICovCgoJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50ICYmIGkgPCBCTkVQX01BWF9NVUxUSUNBU1RfRklMVEVSUzsgaSsrKSB7CgkJCW1lbWNweShfX3NrYl9wdXQoc2tiLCBFVEhfQUxFTiksIGRtaS0+ZG1pX2FkZHIsIEVUSF9BTEVOKTsKCQkJbWVtY3B5KF9fc2tiX3B1dChza2IsIEVUSF9BTEVOKSwgZG1pLT5kbWlfYWRkciwgRVRIX0FMRU4pOwoJCQlkbWkgPSBkbWktPm5leHQ7CgkJfQoJCXItPmxlbiA9IGh0b25zKHNrYi0+bGVuIC0gbGVuKTsKCX0KCglza2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOwoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CiNlbmRpZgp9CgpzdGF0aWMgaW50IGJuZXBfbmV0X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphcmcpCnsKCUJUX0RCRygiJXMiLCBkZXYtPm5hbWUpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGJuZXBfbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJQlRfREJHKCJuZXRfdGltZW91dCIpOwoJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwp9CgpzdGF0aWMgaW50IGJuZXBfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQp7CglyZXR1cm4gLUVJTlZBTDsKfQoKI2lmZGVmIENPTkZJR19CVF9CTkVQX01DX0ZJTFRFUgpzdGF0aWMgaW5saW5lIGludCBibmVwX25ldF9tY19maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKewoJc3RydWN0IGV0aGhkciAqZWggPSAodm9pZCAqKSBza2ItPmRhdGE7CgoJaWYgKChlaC0+aF9kZXN0WzBdICYgMSkgJiYgIXRlc3RfYml0KGJuZXBfbWNfaGFzaChlaC0+aF9kZXN0KSwgKHVsb25nICopICZzLT5tY19maWx0ZXIpKQoJCXJldHVybiAxOwoJcmV0dXJuIDA7Cn0KI2VuZGlmCgojaWZkZWYgQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSCi8qIERldGVybWluZSBldGhlciBwcm90b2NvbC4gQmFzZWQgb24gZXRoX3R5cGVfdHJhbnMuICovCnN0YXRpYyBpbmxpbmUgdTE2IGJuZXBfbmV0X2V0aF9wcm90byhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgZXRoaGRyICplaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKCXUxNiBwcm90byA9IG50b2hzKGVoLT5oX3Byb3RvKTsKCQoJaWYgKHByb3RvID49IDE1MzYpCgkJcmV0dXJuIHByb3RvOwoJCQoJaWYgKGdldF91bmFsaWduZWQoKF9fYmUxNiAqKSBza2ItPmRhdGEpID09IGh0b25zKDB4RkZGRikpCgkJcmV0dXJuIEVUSF9QXzgwMl8zOwoJCQoJcmV0dXJuIEVUSF9QXzgwMl8yOwp9CgpzdGF0aWMgaW5saW5lIGludCBibmVwX25ldF9wcm90b19maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKewoJdTE2IHByb3RvID0gYm5lcF9uZXRfZXRoX3Byb3RvKHNrYik7CglzdHJ1Y3QgYm5lcF9wcm90b19maWx0ZXIgKmYgPSBzLT5wcm90b19maWx0ZXI7CglpbnQgaTsKCQoJZm9yIChpID0gMDsgaSA8IEJORVBfTUFYX1BST1RPX0ZJTFRFUlMgJiYgZltpXS5lbmQ7IGkrKykgewoJCWlmIChwcm90byA+PSBmW2ldLnN0YXJ0ICYmIHByb3RvIDw9IGZbaV0uZW5kKQoJCQlyZXR1cm4gMDsKCX0KCglCVF9EQkcoIkJORVA6IGZpbHRlcmVkIHNrYiAlcCwgcHJvdG8gMHglLjR4Iiwgc2tiLCBwcm90byk7CglyZXR1cm4gMTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYm5lcF9uZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzID0gZGV2LT5wcml2OwoJc3RydWN0IHNvY2sgKnNrID0gcy0+c29jay0+c2s7CgoJQlRfREJHKCJza2IgJXAsIGRldiAlcCIsIHNrYiwgZGV2KTsKCiNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKCWlmIChibmVwX25ldF9tY19maWx0ZXIoc2tiLCBzKSkgewoJCWtmcmVlX3NrYihza2IpOwoJCXJldHVybiAwOwoJfQojZW5kaWYKCQojaWZkZWYgQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSCglpZiAoYm5lcF9uZXRfcHJvdG9fZmlsdGVyKHNrYiwgcykpIHsKCQlrZnJlZV9za2Ioc2tiKTsKCQlyZXR1cm4gMDsKCX0KI2VuZGlmCgkKCS8qCgkgKiBXZSBjYW5ub3Qgc2VuZCBMMkNBUCBwYWNrZXRzIGZyb20gaGVyZSBhcyB3ZSBhcmUgcG90ZW50aWFsbHkgaW4gYSBiaC4KCSAqIFNvIHdlIGhhdmUgdG8gcXVldWUgdGhlbSBhbmQgd2FrZSB1cCBzZXNzaW9uIHRocmVhZCB3aGljaCBpcyBzbGVlcGluZwoJICogb24gdGhlIHNrLT5za19zbGVlcC4KCSAqLwoJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Cglza2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOwoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CgoJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za193cml0ZV9xdWV1ZSkgPj0gQk5FUF9UWF9RVUVVRV9MRU4pIHsKCQlCVF9EQkcoInR4IHF1ZXVlIGlzIGZ1bGwiKTsKCgkJLyogU3RvcCBxdWV1aW5nLgoJCSAqIFNlc3Npb24gdGhyZWFkIHdpbGwgZG8gbmV0aWZfd2FrZV9xdWV1ZSgpICovCgkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwoJfQoKCXJldHVybiAwOwp9Cgp2b2lkIGJuZXBfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCgltZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4ZmYsIEVUSF9BTEVOKTsKCWRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKCglldGhlcl9zZXR1cChkZXYpOwoKCWRldi0+b3BlbiAgICAgICAgICAgID0gYm5lcF9uZXRfb3BlbjsKCWRldi0+c3RvcCAgICAgICAgICAgID0gYm5lcF9uZXRfY2xvc2U7CglkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJuZXBfbmV0X3htaXQ7CglkZXYtPmdldF9zdGF0cyAgICAgICA9IGJuZXBfbmV0X2dldF9zdGF0czsKCWRldi0+ZG9faW9jdGwgICAgICAgID0gYm5lcF9uZXRfaW9jdGw7CglkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGJuZXBfbmV0X3NldF9tYWNfYWRkcjsKCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYm5lcF9uZXRfc2V0X21jX2xpc3Q7CgoJZGV2LT53YXRjaGRvZ190aW1lbyAgPSBIWiAqIDI7CglkZXYtPnR4X3RpbWVvdXQgICAgICA9IGJuZXBfbmV0X3RpbWVvdXQ7Cn0K