LyoKICogIGRyaXZlcnMvbXRkL25hbmQvaDE5MTAuYwogKgogKiAgQ29weXJpZ2h0IChDKSAyMDAzIEpvc2h1YSBXaXNlIChqb3NodWFAam9zaHVhd2lzZS5jb20pCiAqCiAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9tdGQvbmFuZC9lZGI3MzEyLmMKICogICAgICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcml1cyBHcvZnZXIgKG1hZ0BzeXNnby5kZSkKICogICAgICAgQ29weXJpZ2h0IChjKSAyMDAxIFRob21hcyBHbGVpeG5lciAoZ2xlaXhuZXJAYXV0cm9uaXguZGUpCiAqCiAqICRJZDogaDE5MTAuYyx2IDEuNSAyMDA0LzExLzA0IDEyOjUzOjEwIGdsZWl4bmVyIEV4cCAkCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiAgT3ZlcnZpZXc6CiAqICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKICogICBpUEFRIGgxOTEwIGJvYXJkIHdoaWNoIHV0aWxpemVzIHRoZSBTYW1zdW5nIEs5RjI4MDggcGFydC4gVGhpcyBpcwogKiAgIGEgMTI4TWliaXQgKDE2TWlCIHggOCBiaXRzKSBOQU5EIGZsYXNoIGRldmljZS4KICovCgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgojaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4gLyogZm9yIENMUFM3MTExX1ZJUlRfQkFTRSAqLwojaW5jbHVkZSA8YXNtL3NpemVzLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9oMTkwMC1ncGlvLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9pcGFxLmg+CgovKgogKiBNVEQgc3RydWN0dXJlIGZvciBFREI3MzEyIGJvYXJkCiAqLwpzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpoMTkxMF9uYW5kX210ZCA9IE5VTEw7CgovKgogKiBNb2R1bGUgc3R1ZmYKICovCgojaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCi8qCiAqIERlZmluZSBzdGF0aWMgcGFydGl0aW9ucyBmb3IgZmxhc2ggZGV2aWNlCiAqLwpzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bXSA9IHsKCXsgbmFtZTogImgxOTEwIE5BTkQgRmxhc2giLAoJCSAgb2Zmc2V0OiAwLAoJCSAgc2l6ZTogMTYqMTAyNCoxMDI0IH0KfTsKI2RlZmluZSBOVU1fUEFSVElUSU9OUyAxCgojZW5kaWYKCgovKiAKICoJaGFyZHdhcmUgc3BlY2lmaWMgYWNjZXNzIHRvIGNvbnRyb2wtbGluZXMKICovCnN0YXRpYyB2b2lkIGgxOTEwX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCkgCnsKCXN0cnVjdCBuYW5kX2NoaXAqIHRoaXMgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSAobXRkLT5wcml2KTsKCQoJc3dpdGNoKGNtZCkgewoJCQoJY2FzZSBOQU5EX0NUTF9TRVRDTEU6IAoJCXRoaXMtPklPX0FERFJfUiB8PSAoMSA8PCAyKTsKCQl0aGlzLT5JT19BRERSX1cgfD0gKDEgPDwgMik7CgkJYnJlYWs7CgljYXNlIE5BTkRfQ1RMX0NMUkNMRTogCgkJdGhpcy0+SU9fQUREUl9SICY9IH4oMSA8PCAyKTsKCQl0aGlzLT5JT19BRERSX1cgJj0gfigxIDw8IDIpOwoJCWJyZWFrOwoJCQoJY2FzZSBOQU5EX0NUTF9TRVRBTEU6CgkJdGhpcy0+SU9fQUREUl9SIHw9ICgxIDw8IDMpOwoJCXRoaXMtPklPX0FERFJfVyB8PSAoMSA8PCAzKTsKCQlicmVhazsKCWNhc2UgTkFORF9DVExfQ0xSQUxFOgoJCXRoaXMtPklPX0FERFJfUiAmPSB+KDEgPDwgMyk7CgkJdGhpcy0+SU9fQUREUl9XICY9IH4oMSA8PCAzKTsKCQlicmVhazsKCQkKCWNhc2UgTkFORF9DVExfU0VUTkNFOgoJCWJyZWFrOwoJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6CgkJYnJlYWs7Cgl9Cn0KCi8qCiAqCXJlYWQgZGV2aWNlIHJlYWR5IHBpbgogKi8KI2lmIDAKc3RhdGljIGludCBoMTkxMF9kZXZpY2VfcmVhZHkoc3RydWN0IG10ZF9pbmZvICptdGQpCnsKCXJldHVybiAoR1BMUig1NSkgJiBHUElPX2JpdCg1NSkpOwp9CiNlbmRpZgoKLyoKICogTWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCiAqLwpzdGF0aWMgaW50IF9faW5pdCBoMTkxMF9pbml0ICh2b2lkKQp7CglzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwoJY29uc3QgY2hhciAqcGFydF90eXBlID0gMDsKCWludCBtdGRfcGFydHNfbmIgPSAwOwoJc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyA9IDA7Cgl2b2lkIF9faW9tZW0gKm5hbmRhZGRyOwoJCglpZiAoIW1hY2hpbmVfaXNfaDE5MDAoKSkKCQlyZXR1cm4gLUVOT0RFVjsKCQkKCW5hbmRhZGRyID0gX19pb3JlbWFwKDB4MDgwMDAwMDAsIDB4MTAwMCwgMCwgMSk7CglpZiAoIW5hbmRhZGRyKSB7CgkJcHJpbnRrKCJGYWlsZWQgdG8gaW9yZW1hcCBuYW5kIGZsYXNoLlxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgkKCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgTVREIGRldmljZSBzdHJ1Y3R1cmUgYW5kIHByaXZhdGUgZGF0YSAqLwoJaDE5MTBfbmFuZF9tdGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pICsgCgkJCSAgICAgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApLAoJCQkgICAgIEdGUF9LRVJORUwpOwoJaWYgKCFoMTkxMF9uYW5kX210ZCkgewoJCXByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIGgxOTEwIE5BTkQgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKCQlpb3VubWFwICgodm9pZCAqKSBuYW5kYWRkcik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgkKCS8qIEdldCBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLwoJdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopICgmaDE5MTBfbmFuZF9tdGRbMV0pOwoJCgkvKiBJbml0aWFsaXplIHN0cnVjdHVyZXMgKi8KCW1lbXNldCgoY2hhciAqKSBoMTkxMF9uYW5kX210ZCwgMCwgc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykpOwoJbWVtc2V0KChjaGFyICopIHRoaXMsIDAsIHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSk7CgkKCS8qIExpbmsgdGhlIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBNVEQgc3RydWN0dXJlICovCgloMTkxMF9uYW5kX210ZC0+cHJpdiA9IHRoaXM7CgkKCS8qCgkgKiBFbmFibGUgVlBFTgoJICovCglHUFNSKDM3KSA9IEdQSU9fYml0KDM3KTsKCQoJLyogaW5zZXJ0IGNhbGxiYWNrcyAqLwoJdGhpcy0+SU9fQUREUl9SID0gbmFuZGFkZHI7Cgl0aGlzLT5JT19BRERSX1cgPSBuYW5kYWRkcjsKCXRoaXMtPmh3Y29udHJvbCA9IGgxOTEwX2h3Y29udHJvbDsKCXRoaXMtPmRldl9yZWFkeSA9IE5VTEw7CS8qIHVua25vd24gd2hldGhlciB0aGF0IHdhcyBjb3JyZWN0IG9yIG5vdCBzbyB3ZSB3aWxsIGp1c3QgZG8gaXQgbGlrZSB0aGlzICovCgkvKiAxNSB1cyBjb21tYW5kIGRlbGF5IHRpbWUgKi8KCXRoaXMtPmNoaXBfZGVsYXkgPSA1MDsKCXRoaXMtPmVjY21vZGUgPSBOQU5EX0VDQ19TT0ZUOwoJdGhpcy0+b3B0aW9ucyA9IE5BTkRfTk9fQVVUT0lOQ1I7CgkKCS8qIFNjYW4gdG8gZmluZCBleGlzdGVuY2Ugb2YgdGhlIGRldmljZSAqLwoJaWYgKG5hbmRfc2NhbiAoaDE5MTBfbmFuZF9tdGQsIDEpKSB7CgkJcHJpbnRrKEtFUk5fTk9USUNFICJObyBOQU5EIGRldmljZSAtIHJldHVybmluZyAtRU5YSU9cbiIpOwoJCWtmcmVlIChoMTkxMF9uYW5kX210ZCk7CgkJaW91bm1hcCAoKHZvaWQgKikgbmFuZGFkZHIpOwoJCXJldHVybiAtRU5YSU87Cgl9CgkKI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwoJbXRkX3BhcnRzX25iID0gcGFyc2VfY21kbGluZV9wYXJ0aXRpb25zKGgxOTEwX25hbmRfbXRkLCAmbXRkX3BhcnRzLCAKCQkJCQkJImgxOTEwLW5hbmQiKTsKCWlmIChtdGRfcGFydHNfbmIgPiAwKQoJICBwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKCWVsc2UKCSAgbXRkX3BhcnRzX25iID0gMDsKI2VuZGlmCglpZiAobXRkX3BhcnRzX25iID09IDApCgl7CgkJbXRkX3BhcnRzID0gcGFydGl0aW9uX2luZm87CgkJbXRkX3BhcnRzX25iID0gTlVNX1BBUlRJVElPTlM7CgkJcGFydF90eXBlID0gInN0YXRpYyI7Cgl9CgkKCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCglwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nICVzIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwoJYWRkX210ZF9wYXJ0aXRpb25zKGgxOTEwX25hbmRfbXRkLCBtdGRfcGFydHMsIG10ZF9wYXJ0c19uYik7CgkKCS8qIFJldHVybiBoYXBweSAqLwoJcmV0dXJuIDA7Cn0KbW9kdWxlX2luaXQoaDE5MTBfaW5pdCk7CgovKgogKiBDbGVhbiB1cCByb3V0aW5lCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgaDE5MTBfY2xlYW51cCAodm9pZCkKewoJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopICZoMTkxMF9uYW5kX210ZFsxXTsKCQoJLyogUmVsZWFzZSByZXNvdXJjZXMsIHVucmVnaXN0ZXIgZGV2aWNlICovCgluYW5kX3JlbGVhc2UgKGgxOTEwX25hbmRfbXRkKTsKCgkvKiBSZWxlYXNlIGlvIHJlc291cmNlICovCglpb3VubWFwICgodm9pZCAqKSB0aGlzLT5JT19BRERSX1cpOwoKCS8qIEZyZWUgdGhlIE1URCBkZXZpY2Ugc3RydWN0dXJlICovCglrZnJlZSAoaDE5MTBfbmFuZF9tdGQpOwp9Cm1vZHVsZV9leGl0KGgxOTEwX2NsZWFudXApOwoKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQVVUSE9SKCJKb3NodWEgV2lzZSA8am9zaHVhIGF0IGpvc2h1YXdpc2UgZG90IGNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJOQU5EIGZsYXNoIGRyaXZlciBmb3IgaVBBUSBoMTkxMCIpOwo=