LyogCiAgIEJORVAgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IEJsdWV0b290aCBzdGFjayAoQmx1ZVopLgogICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBJbnZlbnRlbCBTeXN0ZW1lcwogICBXcml0dGVuIDIwMDEtMjAwMiBieQoJQ2zpbWVudCBNb3JlYXUgPGNsZW1lbnQubW9yZWF1QGludmVudGVsLmZyPgoJRGF2aWQgTGliYXVsdCAgPGRhdmlkLmxpYmF1bHRAaW52ZW50ZWwuZnI+CgogICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CgogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwogICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCiAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCiAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCiAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgogICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAogICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCiAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCiovCgovKgogKiAkSWQ6IG5ldGRldi5jLHYgMS44IDIwMDIvMDgvMDQgMjE6MjM6NTggbWF4ayBFeHAgJAogKi8gCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KCiNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgoKI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KCiNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgojaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgojaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgoKI2luY2x1ZGUgImJuZXAuaCIKCiNpZm5kZWYgQ09ORklHX0JUX0JORVBfREVCVUcKI3VuZGVmICBCVF9EQkcKI2RlZmluZSBCVF9EQkcoIEEuLi4gKQojZW5kaWYKCiNkZWZpbmUgQk5FUF9UWF9RVUVVRV9MRU4gMjAKCnN0YXRpYyBpbnQgYm5lcF9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CgluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYm5lcF9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYm5lcF9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMgPSBkZXYtPnByaXY7CglyZXR1cm4gJnMtPnN0YXRzOwp9CgpzdGF0aWMgdm9pZCBibmVwX25ldF9zZXRfbWNfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMgPSBkZXYtPnByaXY7CglzdHJ1Y3Qgc29jayAqc2sgPSBzLT5zb2NrLT5zazsKCXN0cnVjdCBibmVwX3NldF9maWx0ZXJfcmVxICpyOwoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCWludCBzaXplOwoKCUJUX0RCRygiJXMgbWNfY291bnQgJWQiLCBkZXYtPm5hbWUsIGRldi0+bWNfY291bnQpOwoKCXNpemUgPSBzaXplb2YoKnIpICsgKEJORVBfTUFYX01VTFRJQ0FTVF9GSUxURVJTICsgMSkgKiBFVEhfQUxFTiAqIDI7Cglza2IgID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOwoJaWYgKCFza2IpIHsKCQlCVF9FUlIoIiVzIE11bHRpY2FzdCBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIiwgZGV2LT5uYW1lKTsKCQlyZXR1cm47Cgl9CgoJciA9ICh2b2lkICopIHNrYi0+ZGF0YTsKCV9fc2tiX3B1dChza2IsIHNpemVvZigqcikpOwoKCXItPnR5cGUgPSBCTkVQX0NPTlRST0w7CglyLT5jdHJsID0gQk5FUF9GSUxURVJfTVVMVElfQUREUl9TRVQ7CgogICAgICAgIGlmIChkZXYtPmZsYWdzICYgKElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJKSkgewoJCXU4IHN0YXJ0W0VUSF9BTEVOXSA9IHsgMHgwMSB9OwoKCQkvKiBSZXF1ZXN0IGFsbCBhZGRyZXNzZXMgKi8KCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBzdGFydCwgRVRIX0FMRU4pOwoJCW1lbWNweShfX3NrYl9wdXQoc2tiLCBFVEhfQUxFTiksIGRldi0+YnJvYWRjYXN0LCBFVEhfQUxFTik7CgkJci0+bGVuID0gaHRvbnMoRVRIX0FMRU4gKiAyKTsKCX0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKCQlpbnQgaSwgbGVuID0gc2tiLT5sZW47CgoJCWlmIChkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkgewoJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pOwoJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pOwoJCX0JCgkJCgkJLyogRklYTUU6IFdlIHNob3VsZCBncm91cCBhZGRyZXNzZXMgaGVyZS4gKi8KCgkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQgJiYgaSA8IEJORVBfTUFYX01VTFRJQ0FTVF9GSUxURVJTOyBpKyspIHsKCQkJbWVtY3B5KF9fc2tiX3B1dChza2IsIEVUSF9BTEVOKSwgZG1pLT5kbWlfYWRkciwgRVRIX0FMRU4pOwoJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBkbWktPmRtaV9hZGRyLCBFVEhfQUxFTik7CgkJCWRtaSA9IGRtaS0+bmV4dDsKCQl9CgkJci0+bGVuID0gaHRvbnMoc2tiLT5sZW4gLSBsZW4pOwoJfQoKCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7Cgl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKI2VuZGlmCn0KCnN0YXRpYyBpbnQgYm5lcF9uZXRfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFyZykKewoJQlRfREJHKCIlcyIsIGRldi0+bmFtZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgYm5lcF9uZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglCVF9EQkcoIm5ldF90aW1lb3V0Iik7CgluZXRpZl93YWtlX3F1ZXVlKGRldik7Cn0KCnN0YXRpYyBpbnQgYm5lcF9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCnsKCXJldHVybiAtRUlOVkFMOwp9CgojaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCnN0YXRpYyBpbmxpbmUgaW50IGJuZXBfbmV0X21jX2ZpbHRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzKQp7CglzdHJ1Y3QgZXRoaGRyICplaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKCglpZiAoKGVoLT5oX2Rlc3RbMF0gJiAxKSAmJiAhdGVzdF9iaXQoYm5lcF9tY19oYXNoKGVoLT5oX2Rlc3QpLCAodWxvbmcgKikgJnMtPm1jX2ZpbHRlcikpCgkJcmV0dXJuIDE7CglyZXR1cm4gMDsKfQojZW5kaWYKCiNpZmRlZiBDT05GSUdfQlRfQk5FUF9QUk9UT19GSUxURVIKLyogRGV0ZXJtaW5lIGV0aGVyIHByb3RvY29sLiBCYXNlZCBvbiBldGhfdHlwZV90cmFucy4gKi8Kc3RhdGljIGlubGluZSB1MTYgYm5lcF9uZXRfZXRoX3Byb3RvKHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBldGhoZHIgKmVoID0gKHZvaWQgKikgc2tiLT5kYXRhOwoJCglpZiAobnRvaHMoZWgtPmhfcHJvdG8pID49IDE1MzYpCgkJcmV0dXJuIGVoLT5oX3Byb3RvOwoJCQoJaWYgKGdldF91bmFsaWduZWQoKHUxNiAqKSBza2ItPmRhdGEpID09IDB4RkZGRikKCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzMpOwoJCQoJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKfQoKc3RhdGljIGlubGluZSBpbnQgYm5lcF9uZXRfcHJvdG9fZmlsdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCnsKCXUxNiBwcm90byA9IGJuZXBfbmV0X2V0aF9wcm90byhza2IpOwoJc3RydWN0IGJuZXBfcHJvdG9fZmlsdGVyICpmID0gcy0+cHJvdG9fZmlsdGVyOwoJaW50IGk7CgkKCWZvciAoaSA9IDA7IGkgPCBCTkVQX01BWF9QUk9UT19GSUxURVJTICYmIGZbaV0uZW5kOyBpKyspIHsKCQlpZiAocHJvdG8gPj0gZltpXS5zdGFydCAmJiBwcm90byA8PSBmW2ldLmVuZCkKCQkJcmV0dXJuIDA7Cgl9CgoJQlRfREJHKCJCTkVQOiBmaWx0ZXJlZCBza2IgJXAsIHByb3RvIDB4JS40eCIsIHNrYiwgcHJvdG8pOwoJcmV0dXJuIDE7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGJuZXBfbmV0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJc3RydWN0IGJuZXBfc2Vzc2lvbiAqcyA9IGRldi0+cHJpdjsKCXN0cnVjdCBzb2NrICpzayA9IHMtPnNvY2stPnNrOwoKCUJUX0RCRygic2tiICVwLCBkZXYgJXAiLCBza2IsIGRldik7CgojaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCglpZiAoYm5lcF9uZXRfbWNfZmlsdGVyKHNrYiwgcykpIHsKCQlrZnJlZV9za2Ioc2tiKTsKCQlyZXR1cm4gMDsKCX0KI2VuZGlmCgkKI2lmZGVmIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUgoJaWYgKGJuZXBfbmV0X3Byb3RvX2ZpbHRlcihza2IsIHMpKSB7CgkJa2ZyZWVfc2tiKHNrYik7CgkJcmV0dXJuIDA7Cgl9CiNlbmRpZgoJCgkvKgoJICogV2UgY2Fubm90IHNlbmQgTDJDQVAgcGFja2V0cyBmcm9tIGhlcmUgYXMgd2UgYXJlIHBvdGVudGlhbGx5IGluIGEgYmguCgkgKiBTbyB3ZSBoYXZlIHRvIHF1ZXVlIHRoZW0gYW5kIHdha2UgdXAgc2Vzc2lvbiB0aHJlYWQgd2hpY2ggaXMgc2xlZXBpbmcKCSAqIG9uIHRoZSBzay0+c2tfc2xlZXAuCgkgKi8KCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwoJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOwoKCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfd3JpdGVfcXVldWUpID49IEJORVBfVFhfUVVFVUVfTEVOKSB7CgkJQlRfREJHKCJ0eCBxdWV1ZSBpcyBmdWxsIik7CgoJCS8qIFN0b3AgcXVldWluZy4KCQkgKiBTZXNzaW9uIHRocmVhZCB3aWxsIGRvIG5ldGlmX3dha2VfcXVldWUoKSAqLwoJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCX0KCglyZXR1cm4gMDsKfQoKdm9pZCBibmVwX25ldF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CgoJbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweGZmLCBFVEhfQUxFTik7CglkZXYtPmFkZHJfbGVuID0gRVRIX0FMRU47CgoJZXRoZXJfc2V0dXAoZGV2KTsKCglkZXYtPm9wZW4gICAgICAgICAgICA9IGJuZXBfbmV0X29wZW47CglkZXYtPnN0b3AgICAgICAgICAgICA9IGJuZXBfbmV0X2Nsb3NlOwoJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBibmVwX25ldF94bWl0OwoJZGV2LT5nZXRfc3RhdHMgICAgICAgPSBibmVwX25ldF9nZXRfc3RhdHM7CglkZXYtPmRvX2lvY3RsICAgICAgICA9IGJuZXBfbmV0X2lvY3RsOwoJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBibmVwX25ldF9zZXRfbWFjX2FkZHI7CglkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGJuZXBfbmV0X3NldF9tY19saXN0OwoKCWRldi0+d2F0Y2hkb2dfdGltZW8gID0gSFogKiAyOwoJZGV2LT50eF90aW1lb3V0ICAgICAgPSBibmVwX25ldF90aW1lb3V0Owp9Cg==