LyoKICogIGRyaXZlcnMvbXRkL25hbmQvaDE5MTAuYwogKgogKiAgQ29weXJpZ2h0IChDKSAyMDAzIEpvc2h1YSBXaXNlIChqb3NodWFAam9zaHVhd2lzZS5jb20pCiAqCiAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9tdGQvbmFuZC9lZGI3MzEyLmMKICogICAgICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcml1cyBHcvZnZXIgKG1hZ0BzeXNnby5kZSkKICogICAgICAgQ29weXJpZ2h0IChjKSAyMDAxIFRob21hcyBHbGVpeG5lciAoZ2xlaXhuZXJAYXV0cm9uaXguZGUpCiAqCiAqICRJZDogaDE5MTAuYyx2IDEuNiAyMDA1LzExLzA3IDExOjE0OjMwIGdsZWl4bmVyIEV4cCAkCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiAgT3ZlcnZpZXc6CiAqICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKICogICBpUEFRIGgxOTEwIGJvYXJkIHdoaWNoIHV0aWxpemVzIHRoZSBTYW1zdW5nIEs5RjI4MDggcGFydC4gVGhpcyBpcwogKiAgIGEgMTI4TWliaXQgKDE2TWlCIHggOCBiaXRzKSBOQU5EIGZsYXNoIGRldmljZS4KICovCgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgojaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4gLyogZm9yIENMUFM3MTExX1ZJUlRfQkFTRSAqLwojaW5jbHVkZSA8YXNtL3NpemVzLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9oMTkwMC1ncGlvLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9pcGFxLmg+CgovKgogKiBNVEQgc3RydWN0dXJlIGZvciBFREI3MzEyIGJvYXJkCiAqLwpzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpoMTkxMF9uYW5kX210ZCA9IE5VTEw7CgovKgogKiBNb2R1bGUgc3R1ZmYKICovCgojaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCi8qCiAqIERlZmluZSBzdGF0aWMgcGFydGl0aW9ucyBmb3IgZmxhc2ggZGV2aWNlCiAqLwpzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bXSA9IHsKCXsgbmFtZTogImgxOTEwIE5BTkQgRmxhc2giLAoJCSAgb2Zmc2V0OiAwLAoJCSAgc2l6ZTogMTYqMTAyNCoxMDI0IH0KfTsKI2RlZmluZSBOVU1fUEFSVElUSU9OUyAxCgojZW5kaWYKCgovKgogKgloYXJkd2FyZSBzcGVjaWZpYyBhY2Nlc3MgdG8gY29udHJvbC1saW5lcwogKi8Kc3RhdGljIHZvaWQgaDE5MTBfaHdjb250cm9sKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kKQp7CglzdHJ1Y3QgbmFuZF9jaGlwKiB0aGlzID0gKHN0cnVjdCBuYW5kX2NoaXAgKikgKG10ZC0+cHJpdik7CgoJc3dpdGNoKGNtZCkgewoKCWNhc2UgTkFORF9DVExfU0VUQ0xFOgoJCXRoaXMtPklPX0FERFJfUiB8PSAoMSA8PCAyKTsKCQl0aGlzLT5JT19BRERSX1cgfD0gKDEgPDwgMik7CgkJYnJlYWs7CgljYXNlIE5BTkRfQ1RMX0NMUkNMRToKCQl0aGlzLT5JT19BRERSX1IgJj0gfigxIDw8IDIpOwoJCXRoaXMtPklPX0FERFJfVyAmPSB+KDEgPDwgMik7CgkJYnJlYWs7CgoJY2FzZSBOQU5EX0NUTF9TRVRBTEU6CgkJdGhpcy0+SU9fQUREUl9SIHw9ICgxIDw8IDMpOwoJCXRoaXMtPklPX0FERFJfVyB8PSAoMSA8PCAzKTsKCQlicmVhazsKCWNhc2UgTkFORF9DVExfQ0xSQUxFOgoJCXRoaXMtPklPX0FERFJfUiAmPSB+KDEgPDwgMyk7CgkJdGhpcy0+SU9fQUREUl9XICY9IH4oMSA8PCAzKTsKCQlicmVhazsKCgljYXNlIE5BTkRfQ1RMX1NFVE5DRToKCQlicmVhazsKCWNhc2UgTkFORF9DVExfQ0xSTkNFOgoJCWJyZWFrOwoJfQp9CgovKgogKglyZWFkIGRldmljZSByZWFkeSBwaW4KICovCiNpZiAwCnN0YXRpYyBpbnQgaDE5MTBfZGV2aWNlX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQp7CglyZXR1cm4gKEdQTFIoNTUpICYgR1BJT19iaXQoNTUpKTsKfQojZW5kaWYKCi8qCiAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQogKi8Kc3RhdGljIGludCBfX2luaXQgaDE5MTBfaW5pdCAodm9pZCkKewoJc3RydWN0IG5hbmRfY2hpcCAqdGhpczsKCWNvbnN0IGNoYXIgKnBhcnRfdHlwZSA9IDA7CglpbnQgbXRkX3BhcnRzX25iID0gMDsKCXN0cnVjdCBtdGRfcGFydGl0aW9uICptdGRfcGFydHMgPSAwOwoJdm9pZCBfX2lvbWVtICpuYW5kYWRkcjsKCglpZiAoIW1hY2hpbmVfaXNfaDE5MDAoKSkKCQlyZXR1cm4gLUVOT0RFVjsKCgluYW5kYWRkciA9IGlvcmVtYXAoMHgwODAwMDAwMCwgMHgxMDAwKTsKCWlmICghbmFuZGFkZHIpIHsKCQlwcmludGsoIkZhaWxlZCB0byBpb3JlbWFwIG5hbmQgZmxhc2guXG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KCWgxOTEwX25hbmRfbXRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArCgkJCSAgICAgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApLAoJCQkgICAgIEdGUF9LRVJORUwpOwoJaWYgKCFoMTkxMF9uYW5kX210ZCkgewoJCXByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIGgxOTEwIE5BTkQgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKCQlpb3VubWFwICgodm9pZCAqKSBuYW5kYWRkcik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJLyogR2V0IHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhICovCgl0aGlzID0gKHN0cnVjdCBuYW5kX2NoaXAgKikgKCZoMTkxMF9uYW5kX210ZFsxXSk7CgoJLyogSW5pdGlhbGl6ZSBzdHJ1Y3R1cmVzICovCgltZW1zZXQoKGNoYXIgKikgaDE5MTBfbmFuZF9tdGQsIDAsIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKCW1lbXNldCgoY2hhciAqKSB0aGlzLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOwoKCS8qIExpbmsgdGhlIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBNVEQgc3RydWN0dXJlICovCgloMTkxMF9uYW5kX210ZC0+cHJpdiA9IHRoaXM7CgoJLyoKCSAqIEVuYWJsZSBWUEVOCgkgKi8KCUdQU1IoMzcpID0gR1BJT19iaXQoMzcpOwoKCS8qIGluc2VydCBjYWxsYmFja3MgKi8KCXRoaXMtPklPX0FERFJfUiA9IG5hbmRhZGRyOwoJdGhpcy0+SU9fQUREUl9XID0gbmFuZGFkZHI7Cgl0aGlzLT5od2NvbnRyb2wgPSBoMTkxMF9od2NvbnRyb2w7Cgl0aGlzLT5kZXZfcmVhZHkgPSBOVUxMOwkvKiB1bmtub3duIHdoZXRoZXIgdGhhdCB3YXMgY29ycmVjdCBvciBub3Qgc28gd2Ugd2lsbCBqdXN0IGRvIGl0IGxpa2UgdGhpcyAqLwoJLyogMTUgdXMgY29tbWFuZCBkZWxheSB0aW1lICovCgl0aGlzLT5jaGlwX2RlbGF5ID0gNTA7Cgl0aGlzLT5lY2Ntb2RlID0gTkFORF9FQ0NfU09GVDsKCXRoaXMtPm9wdGlvbnMgPSBOQU5EX05PX0FVVE9JTkNSOwoKCS8qIFNjYW4gdG8gZmluZCBleGlzdGVuY2Ugb2YgdGhlIGRldmljZSAqLwoJaWYgKG5hbmRfc2NhbiAoaDE5MTBfbmFuZF9tdGQsIDEpKSB7CgkJcHJpbnRrKEtFUk5fTk9USUNFICJObyBOQU5EIGRldmljZSAtIHJldHVybmluZyAtRU5YSU9cbiIpOwoJCWtmcmVlIChoMTkxMF9uYW5kX210ZCk7CgkJaW91bm1hcCAoKHZvaWQgKikgbmFuZGFkZHIpOwoJCXJldHVybiAtRU5YSU87Cgl9CgojaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCgltdGRfcGFydHNfbmIgPSBwYXJzZV9jbWRsaW5lX3BhcnRpdGlvbnMoaDE5MTBfbmFuZF9tdGQsICZtdGRfcGFydHMsCgkJCQkJCSJoMTkxMC1uYW5kIik7CglpZiAobXRkX3BhcnRzX25iID4gMCkKCSAgcGFydF90eXBlID0gImNvbW1hbmQgbGluZSI7CgllbHNlCgkgIG10ZF9wYXJ0c19uYiA9IDA7CiNlbmRpZgoJaWYgKG10ZF9wYXJ0c19uYiA9PSAwKQoJewoJCW10ZF9wYXJ0cyA9IHBhcnRpdGlvbl9pbmZvOwoJCW10ZF9wYXJ0c19uYiA9IE5VTV9QQVJUSVRJT05TOwoJCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwoJfQoKCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCglwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nICVzIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwoJYWRkX210ZF9wYXJ0aXRpb25zKGgxOTEwX25hbmRfbXRkLCBtdGRfcGFydHMsIG10ZF9wYXJ0c19uYik7CgoJLyogUmV0dXJuIGhhcHB5ICovCglyZXR1cm4gMDsKfQptb2R1bGVfaW5pdChoMTkxMF9pbml0KTsKCi8qCiAqIENsZWFuIHVwIHJvdXRpbmUKICovCnN0YXRpYyB2b2lkIF9fZXhpdCBoMTkxMF9jbGVhbnVwICh2b2lkKQp7CglzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gKHN0cnVjdCBuYW5kX2NoaXAgKikgJmgxOTEwX25hbmRfbXRkWzFdOwoKCS8qIFJlbGVhc2UgcmVzb3VyY2VzLCB1bnJlZ2lzdGVyIGRldmljZSAqLwoJbmFuZF9yZWxlYXNlIChoMTkxMF9uYW5kX210ZCk7CgoJLyogUmVsZWFzZSBpbyByZXNvdXJjZSAqLwoJaW91bm1hcCAoKHZvaWQgKikgdGhpcy0+SU9fQUREUl9XKTsKCgkvKiBGcmVlIHRoZSBNVEQgZGV2aWNlIHN0cnVjdHVyZSAqLwoJa2ZyZWUgKGgxOTEwX25hbmRfbXRkKTsKfQptb2R1bGVfZXhpdChoMTkxMF9jbGVhbnVwKTsKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigiSm9zaHVhIFdpc2UgPGpvc2h1YSBhdCBqb3NodWF3aXNlIGRvdCBjb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiTkFORCBmbGFzaCBkcml2ZXIgZm9yIGlQQVEgaDE5MTAiKTsK