LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fZXRoLmMKICogVmVyc2lvbjogICAgICAgCiAqIERlc2NyaXB0aW9uOiAgIAogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgVGh1IE9jdCAxNSAwODozNzo1OCAxOTk4CiAqIE1vZGlmaWVkIGF0OiAgIFR1ZSBNYXIgMjEgMDk6MDY6NDEgMjAwMAogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIFNvdXJjZXM6ICAgICAgIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQENFU0RJUy5nc2ZjLm5hc2EuZ292PgogKiAgICAgICAgICAgICAgICBzbGlwLmMgYnkgTGF1cmVuY2UgQ3VsaGFuZSwgICA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KICogICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgIAogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICogIAogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqICAgICAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxuZXQvYXJwLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY2xpZW50Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldmVudC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXRoLmg+CgpzdGF0aWMgaW50ICBpcmxhbl9ldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKc3RhdGljIGludCAgaXJsYW5fZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50ICBpcmxhbl9ldGhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKc3RhdGljIHZvaWQgaXJsYW5fZXRoX3NldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJsYW5fZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2V0aF9zZXR1cCAoZGV2KQogKgogKiAgICBUaGUgbmV0d29yayBkZXZpY2UgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmxhbl9ldGhfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBpcmxhbl9ldGhfb3BlbjsKCWRldi0+c3RvcCAgICAgICAgICAgICAgID0gaXJsYW5fZXRoX2Nsb3NlOwoJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBpcmxhbl9ldGhfeG1pdDsgCglkZXYtPmdldF9zdGF0cwkgICAgICAgID0gaXJsYW5fZXRoX2dldF9zdGF0czsKCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gaXJsYW5fZXRoX3NldF9tdWx0aWNhc3RfbGlzdDsKCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKCglTRVRfTU9EVUxFX09XTkVSKGRldik7CgoJZXRoZXJfc2V0dXAoZGV2KTsKCQoJLyogCgkgKiBMZXRzIGRvIGFsbCBxdWV1ZWluZyBpbiBJclRUUCBpbnN0ZWFkIG9mIHRoaXMgZGV2aWNlIGRyaXZlci4KCSAqIFF1ZXVlaW5nIGhlcmUgYXMgd2VsbCBjYW4gaW50cm9kdWNlIHNvbWUgc3RyYW5nZSBsYXRlbmN5CgkgKiBwcm9ibGVtcywgd2hpY2ggd2Ugd2lsbCBhdm9pZCBieSBzZXR0aW5nIHRoZSBxdWV1ZSBzaXplIHRvIDAuCgkgKi8KCS8qCgkgKiBUaGUgYnVncyBpbiBJclRUUCBhbmQgSXJMQU4gdGhhdCBjcmVhdGVkIHRoaXMgbGF0ZW5jeSBpc3N1ZQoJICogaGF2ZSBub3cgYmVlbiBmaXhlZCwgYW5kIHdlIGNhbiBwcm9wYWdhdGUgZmxvdyBjb250cm9sIHByb3Blcmx5CgkgKiB0byB0aGUgbmV0d29yayBsYXllci4gSG93ZXZlciwgdGhpcyByZXF1aXJlcyBhIG1pbmltYWwgcXVldWUgb2YKCSAqIHBhY2tldHMgZm9yIHRoZSBkZXZpY2UuCgkgKiBXaXRob3V0IGZsb3cgY29udHJvbCwgdGhlIFR4IFF1ZXVlIGlzIDE0ICh0dHApICsgMCAoZGV2KSA9IDE0CgkgKiBXaXRoIGZsb3cgY29udHJvbCwgdGhlIFR4IFF1ZXVlIGlzIDcgKHR0cCkgKyA0IChkZXYpID0gMTEKCSAqIFNlZSBpcmxhbl9ldGhfZmxvd19pbmRpY2F0aW9uKCkuLi4KCSAqIE5vdGUgOiB0aGlzIG51bWJlciB3YXMgcmFuZG9tbHkgc2VsZWN0ZWQgYW5kIHdvdWxkIG5lZWQgdG8KCSAqIGJlIGFkanVzdGVkLgoJICogSmVhbiBJSSAqLwoJZGV2LT50eF9xdWV1ZV9sZW4gPSA0Owp9CgovKgogKiBGdW5jdGlvbiBhbGxvY19pcmxhbmRldgogKgogKiAgICBBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSBhbmQgY29udHJvbCBibG9jawogKgogKi8Kc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2lybGFuZGV2KGNvbnN0IGNoYXIgKm5hbWUpCnsKCXJldHVybiBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBpcmxhbl9jYiksIG5hbWUsCgkJCSAgICBpcmxhbl9ldGhfc2V0dXApOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9ldGhfb3BlbiAoZGV2KQogKgogKiAgICBOZXR3b3JrIGRldmljZSBoYXMgYmVlbiBvcGVuZWQgYnkgdXNlcgogKgogKi8Kc3RhdGljIGludCBpcmxhbl9ldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwoJCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCgkvKiBSZWFkeSB0byBwbGF5ISAqLwogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsgLyogV2FpdCB1bnRpbCBkYXRhIGxpbmsgaXMgcmVhZHkgKi8KCgkvKiBXZSBhcmUgbm93IG9wZW4sIHNvIHRpbWUgdG8gZG8gc29tZSB3b3JrICovCglzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9IDA7Cglpcmxhbl9jbGllbnRfd2FrZXVwKHNlbGYsIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkcik7CgoJLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBoYXJkd2FyZSBhZGRyZXNzIGJlZm9yZSB3ZSByZXR1cm4sIAoJICAgc28gREhDUCBjbGllbnRzIGdldHMgaGFwcHkgKi8KCXJldHVybiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2VsZi0+b3Blbl93YWl0LAoJCQkJCSFzZWxmLT50c2FwX2RhdGEtPmNvbm5lY3RlZCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2V0aF9jbG9zZSAoZGV2KQogKgogKiAgICBTdG9wIHRoZSBldGhlciBuZXR3b3JrIGRldmljZSwgaGlzIGZ1bmN0aW9uIHdpbGwgdXN1YWxseSBiZSBjYWxsZWQgYnkKICogICAgaWZjb25maWcgZG93bi4gV2Ugc2hvdWxkIG5vdyBkaXNjb25uZWN0IHRoZSBsaW5rLCBXZSBzdGFydCB0aGUgCiAqICAgIGNsb3NlIHRpbWVyLCBzbyB0aGF0IHRoZSBpbnN0YW5jZSB3aWxsIGJlIHJlbW92ZWQgaWYgd2UgYXJlIHVuYWJsZQogKiAgICB0byBkaXNjb3ZlciB0aGUgcmVtb3RlIGRldmljZSBhZnRlciB0aGUgZGlzY29ubmVjdC4KICovCnN0YXRpYyBpbnQgaXJsYW5fZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7CgkKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJCgkvKiBTdG9wIGRldmljZSAqLwoJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwoJCglpcmxhbl9jbG9zZV9kYXRhX2NoYW5uZWwoc2VsZik7Cglpcmxhbl9jbG9zZV90c2FwcyhzZWxmKTsKCglpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fTE1QX0RJU0NPTk5FQ1QsIE5VTEwpOwoJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fTE1QX0RJU0NPTk5FQ1QsIE5VTEwpOwkKCQoJLyogUmVtb3ZlIGZyYW1lcyBxdWV1ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCAqLwoJc2tiX3F1ZXVlX3B1cmdlKCZzZWxmLT5jbGllbnQudHhxKTsKCglzZWxmLT5jbGllbnQudHhfYnVzeSA9IDA7CgkKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9ldGhfdHggKHNrYikKICoKICogICAgVHJhbnNtaXRzIGV0aGVybmV0IGZyYW1lcyBvdmVyIElyREEgbGluay4KICoKICovCnN0YXRpYyBpbnQgaXJsYW5fZXRoX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJc3RydWN0IGlybGFuX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKCWludCByZXQ7CgoJLyogc2tiIGhlYWRyb29tIGxhcmdlIGVub3VnaCB0byBjb250YWluIGFsbCBJckRBLWhlYWRlcnM/ICovCglpZiAoKHNrYl9oZWFkcm9vbShza2IpIDwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKSB8fCAoc2tiX3NoYXJlZChza2IpKSkgewoJCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0gCgkJCXNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCgkJLyogIFdlIGhhdmUgdG8gZnJlZSB0aGUgb3JpZ2luYWwgc2tiIGFueXdheSAqLwoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCgkJLyogRGlkIHRoZSByZWFsbG9jIHN1Y2NlZWQ/ICovCgkJaWYgKG5ld19za2IgPT0gTlVMTCkKCQkJcmV0dXJuIDA7CgoJCS8qIFVzZSB0aGUgbmV3IHNrYiBpbnN0ZWFkICovCgkJc2tiID0gbmV3X3NrYjsKCX0gCgoJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CgoJLyogTm93IHF1ZXVlIHRoZSBwYWNrZXQgaW4gdGhlIHRyYW5zcG9ydCBsYXllciAqLwoJaWYgKHNlbGYtPnVzZV91ZGF0YSkKCQlyZXQgPSBpcnR0cF91ZGF0YV9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwgc2tiKTsKCWVsc2UKCQlyZXQgPSBpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+dHNhcF9kYXRhLCBza2IpOwoKCWlmIChyZXQgPCAwKSB7CgkJLyogICAKCQkgKiBJclRUUHMgdHggcXVldWUgaXMgZnVsbCwgc28gd2UganVzdCBoYXZlIHRvCgkJICogZHJvcCB0aGUgZnJhbWUhIFlvdSBtaWdodCB0aGluayB0aGF0IHdlIHNob3VsZAoJCSAqIGp1c3QgcmV0dXJuIC0xIGFuZCBkb24ndCBkZWFsbG9jYXRlIHRoZSBmcmFtZSwKCQkgKiBidXQgdGhhdCBpcyBkYW5nZXJvdXMgc2luY2UgaXQncyBwb3NzaWJsZSB0aGF0CgkJICogd2UgaGF2ZSByZXBsYWNlZCB0aGUgb3JpZ2luYWwgc2tiIHdpdGggYSBuZXcKCQkgKiBvbmUgd2l0aCBsYXJnZXIgaGVhZHJvb20sIGFuZCB0aGF0IHdvdWxkIHJlYWxseQoJCSAqIGNvbmZ1c2UgZG9fZGV2X3F1ZXVlX3htaXQoKSBpbiBkZXYuYyEgSSBoYXZlCgkJICogdHJpZWQgOi0pIERCIAoJCSAqLwoJCS8qIGlydHRwX2RhdGFfcmVxdWVzdCBhbHJlYWR5IGZyZWUgdGhlIHBhY2tldCAqLwoJCXNlbGYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKCX0gZWxzZSB7CgkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOwoJCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOyAKCX0KCQoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2V0aF9yZWNlaXZlIChoYW5kbGUsIHNrYikKICoKICogICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBkYXRhIHRoYXQgaXMgcmVjZWl2ZWQgb24gdGhlIGRhdGEgY2hhbm5lbAogKgogKi8KaW50IGlybGFuX2V0aF9yZWNlaXZlKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IGluc3RhbmNlOwoKCWlmIChza2IgPT0gTlVMTCkgewoJCSsrc2VsZi0+c3RhdHMucnhfZHJvcHBlZDsgCgkJcmV0dXJuIDA7Cgl9CglpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikgewoJCUlSREFfREVCVUcoMCwgIiVzKCkgOiBJckxBTiBmcmFtZSB0b28gc2hvcnQgKCVkKVxuIiwKCQkJICAgX19GVU5DVElPTl9fLCBza2ItPmxlbik7CgkJKytzZWxmLT5zdGF0cy5yeF9kcm9wcGVkOyAKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkJcmV0dXJuIDA7Cgl9CgkJCgkvKiAKCSAqIEFkb3B0IHRoaXMgZnJhbWUhIEltcG9ydGFudCB0byBzZXQgYWxsIHRoZXNlIGZpZWxkcyBzaW5jZSB0aGV5IAoJICogbWlnaHQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBsb3cgbGV2ZWwgSXJEQSBuZXR3b3JrCgkgKiBkZXZpY2UgZHJpdmVyIAoJICovCglza2ItPmRldiA9IHNlbGYtPmRldjsKCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7IC8qIFJlbW92ZSBldGggaGVhZGVyICovCgkKCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOyAKCgluZXRpZl9yeChza2IpOyAgIC8qIEVhdCBpdCEgKi8KCQoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2V0aF9mbG93IChzdGF0dXMpCiAqCiAqICAgIERvIGZsb3cgY29udHJvbCBiZXR3ZWVuIElQL0V0aGVybmV0IGFuZCBJckxBTi9JclRUUC4gVGhpcyBpcyBkb25lIGJ5IAogKiAgICBjb250cm9sbGluZyB0aGUgcXVldWUgc3RvcC9zdGFydC4KICoKICogVGhlIElyREEgbGluayBsYXllciBoYXMgdGhlIGFkdmFudGFnZSB0byBoYXZlIGZsb3cgY29udHJvbCwgYW5kCiAqIElyVFRQIG5vdyBwcm9wZXJseSBoYW5kbGVzIHRoYXQuIEZsb3cgY29udHJvbGxpbmcgdGhlIGhpZ2hlciBsYXllcnMKICogcHJldmVudCB1cyB0byBkcm9wIFR4IHBhY2tldHMgaW4gaGVyZSAodXAgdG8gMTUlIGZvciBhIFRDUCBzb2NrZXQsCiAqIG1vcmUgZm9yIFVEUCBzb2NrZXQpLgogKiBBbHNvLCB0aGlzIGFsbG93IHVzIHRvIHJlZHVjZSB0aGUgb3ZlcmFsbCB0cmFuc21pdCBxdWV1ZSwgd2hpY2ggbWVhbnMKICogbGVzcyBsYXRlbmN5IGluIGNhc2Ugb2YgbWl4ZWQgdHJhZmZpYy4KICogSmVhbiBJSQogKi8Kdm9pZCBpcmxhbl9ldGhfZmxvd19pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIExPQ0FMX0ZMT1cgZmxvdykKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoJCglkZXYgPSBzZWxmLT5kZXY7CgoJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybjspOwoJCglJUkRBX0RFQlVHKDAsICIlcygpIDogZmxvdyAlcyA7IHJ1bm5pbmcgJWRcbiIsIF9fRlVOQ1RJT05fXywKCQkgICBmbG93ID09IEZMT1dfU1RPUCA/ICJGTE9XX1NUT1AiIDogIkZMT1dfU1RBUlQiLAoJCSAgIG5ldGlmX3J1bm5pbmcoZGV2KSk7CgoJc3dpdGNoIChmbG93KSB7CgljYXNlIEZMT1dfU1RPUDoKCQkvKiBJclRUUCBpcyBmdWxsLCBzdG9wIGhpZ2hlciBsYXllcnMgKi8KCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CgkJYnJlYWs7CgljYXNlIEZMT1dfU1RBUlQ6CglkZWZhdWx0OgoJCS8qIFRlbGwgdXBwZXIgbGF5ZXJzIHRoYXQgaXRzIHRpbWUgdG8gdHJhbnNtaXQgZnJhbWVzIGFnYWluICovCgkJLyogU2NoZWR1bGUgbmV0d29yayBsYXllciAqLwoJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKCQlicmVhazsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZXRjX3NlbmRfZ3JhdHVpdG91c19hcnAgKGRldikKICoKICogICAgU2VuZCBncmF0dWl0b3VzIEFSUCB0byBhbm5vdW5jZSB0aGF0IHdlIGhhdmUgY2hhbmdlZAogKiAgICBoYXJkd2FyZSBhZGRyZXNzLCBzbyB0aGF0IGFsbCBwZWVycyB1cGRhdGVzIHRoZWlyIEFSUCB0YWJsZXMKICovCnZvaWQgaXJsYW5fZXRoX3NlbmRfZ3JhdHVpdG91c19hcnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwoKCS8qIAoJICogV2hlbiB3ZSBnZXQgYSBuZXcgTUFDIGFkZHJlc3MgZG8gYSBncmF0dWl0b3VzIEFSUC4gVGhpcwoJICogaXMgdXNlZnVsIGlmIHdlIGhhdmUgY2hhbmdlZCBhY2Nlc3MgcG9pbnRzIG9uIHRoZSBzYW1lCgkgKiBzdWJuZXQuICAKCSAqLwojaWZkZWYgQ09ORklHX0lORVQKCUlSREFfREVCVUcoNCwgIklyTEFOOiBTZW5kaW5nIGdyYXR1aXRvdXMgQVJQXG4iKTsKCXJjdV9yZWFkX2xvY2soKTsKCWluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KTsKCWlmIChpbl9kZXYgPT0gTlVMTCkKCQlnb3RvIG91dDsKCWlmIChpbl9kZXYtPmlmYV9saXN0KQoJCQoJYXJwX3NlbmQoQVJQT1BfUkVRVUVTVCwgRVRIX1BfQVJQLCAKCQkgaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2FkZHJlc3MsCgkJIGRldiwgCgkJIGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzLAoJCSBOVUxMLCBkZXYtPmRldl9hZGRyLCBOVUxMKTsKb3V0OgoJcmN1X3JlYWRfdW5sb2NrKCk7CiNlbmRpZiAvKiBDT05GSUdfSU5FVCAqLwp9CgovKgogKiBGdW5jdGlvbiBzZXRfbXVsdGljYXN0X2xpc3QgKGRldikKICoKICogICAgQ29uZmlndXJlIHRoZSBmaWx0ZXJpbmcgb2YgdGhlIGRldmljZQogKgogKi8KI2RlZmluZSBIV19NQVhfQUREUlMgNCAvKiBNdXN0IHF1ZXJ5IHRvIGdldCBpdCEgKi8Kc3RhdGljIHZvaWQgaXJsYW5fZXRoX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKewogCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJLyogQ2hlY2sgaWYgZGF0YSBjaGFubmVsIGhhcyBiZWVuIGNvbm5lY3RlZCB5ZXQgKi8KCWlmIChzZWxmLT5jbGllbnQuc3RhdGUgIT0gSVJMQU5fREFUQSkgewoJCUlSREFfREVCVUcoMSwgIiVzKCksIGRlbGF5aW5nIVxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuOwoJfQoKCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKCQkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwoJCUlSREFfV0FSTklORygiUHJvbWlzY291cyBtb2RlIG5vdCBpbXBsZW1lbnRlZCBieSBJckxBTiFcbiIpOwoJfSAKCWVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCBkZXYtPm1jX2NvdW50ID4gSFdfTUFYX0FERFJTKSB7CgkJLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCB1c2Ugbm9ybWFsIG1vZGUuICovCgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgU2V0dGluZyBtdWx0aWNhc3QgZmlsdGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQkvKiBoYXJkd2FyZV9zZXRfZmlsdGVyKE5VTEwpOyAqLwoKCQlpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlcihzZWxmLCBUUlVFKTsKCX0KCWVsc2UgaWYgKGRldi0+bWNfY291bnQpIHsKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBTZXR0aW5nIG11bHRpY2FzdCBmaWx0ZXJcbiIsIF9fRlVOQ1RJT05fXyApOwoJCS8qIFdhbGsgdGhlIGFkZHJlc3MgbGlzdCwgYW5kIGxvYWQgdGhlIGZpbHRlciAqLwoJCS8qIGhhcmR3YXJlX3NldF9maWx0ZXIoZGV2LT5tY19saXN0KTsgKi8KCgkJaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7Cgl9CgllbHNlIHsKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBDbGVhcmluZyBtdWx0aWNhc3QgZmlsdGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlcihzZWxmLCBGQUxTRSk7Cgl9CgoJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQlJPQURDQVNUKQoJCWlybGFuX3NldF9icm9hZGNhc3RfZmlsdGVyKHNlbGYsIFRSVUUpOwoJZWxzZQoJCWlybGFuX3NldF9icm9hZGNhc3RfZmlsdGVyKHNlbGYsIEZBTFNFKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZ2V0X3N0YXRzIChkZXYpCiAqCiAqICAgIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzIGZvciB0aGlzIGRldmljZQogKgogKi8Kc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcmxhbl9ldGhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwoKCXJldHVybiAmc2VsZi0+c3RhdHM7Cn0K