LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fZXRoLmMKICogVmVyc2lvbjogICAgICAgCiAqIERlc2NyaXB0aW9uOiAgIAogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgVGh1IE9jdCAxNSAwODozNzo1OCAxOTk4CiAqIE1vZGlmaWVkIGF0OiAgIFR1ZSBNYXIgMjEgMDk6MDY6NDEgMjAwMAogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIFNvdXJjZXM6ICAgICAgIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQENFU0RJUy5nc2ZjLm5hc2EuZ292PgogKiAgICAgICAgICAgICAgICBzbGlwLmMgYnkgTGF1cmVuY2UgQ3VsaGFuZSwgICA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KICogICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgIAogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICogIAogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqICAgICAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgojaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPG5ldC9hcnAuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY29tbW9uLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jbGllbnQuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V2ZW50Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldGguaD4KCnN0YXRpYyBpbnQgIGlybGFuX2V0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50ICBpcmxhbl9ldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyBpbnQgIGlybGFuX2V0aF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgdm9pZCBpcmxhbl9ldGhfc2V0X211bHRpY2FzdF9saXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcmxhbl9ldGhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwoKLyoKICogRnVuY3Rpb24gaXJsYW5fZXRoX3NldHVwIChkZXYpCiAqCiAqICAgIFRoZSBuZXR3b3JrIGRldmljZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KICoKICovCnN0YXRpYyB2b2lkIGlybGFuX2V0aF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglkZXYtPm9wZW4gICAgICAgICAgICAgICA9IGlybGFuX2V0aF9vcGVuOwoJZGV2LT5zdG9wICAgICAgICAgICAgICAgPSBpcmxhbl9ldGhfY2xvc2U7CglkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9IGlybGFuX2V0aF94bWl0OyAKCWRldi0+Z2V0X3N0YXRzCSAgICAgICAgPSBpcmxhbl9ldGhfZ2V0X3N0YXRzOwoJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBpcmxhbl9ldGhfc2V0X211bHRpY2FzdF9saXN0OwoJZGV2LT5kZXN0cnVjdG9yCQk9IGZyZWVfbmV0ZGV2OwoKCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKCglldGhlcl9zZXR1cChkZXYpOwoJCgkvKiAKCSAqIExldHMgZG8gYWxsIHF1ZXVlaW5nIGluIElyVFRQIGluc3RlYWQgb2YgdGhpcyBkZXZpY2UgZHJpdmVyLgoJICogUXVldWVpbmcgaGVyZSBhcyB3ZWxsIGNhbiBpbnRyb2R1Y2Ugc29tZSBzdHJhbmdlIGxhdGVuY3kKCSAqIHByb2JsZW1zLCB3aGljaCB3ZSB3aWxsIGF2b2lkIGJ5IHNldHRpbmcgdGhlIHF1ZXVlIHNpemUgdG8gMC4KCSAqLwoJLyoKCSAqIFRoZSBidWdzIGluIElyVFRQIGFuZCBJckxBTiB0aGF0IGNyZWF0ZWQgdGhpcyBsYXRlbmN5IGlzc3VlCgkgKiBoYXZlIG5vdyBiZWVuIGZpeGVkLCBhbmQgd2UgY2FuIHByb3BhZ2F0ZSBmbG93IGNvbnRyb2wgcHJvcGVybHkKCSAqIHRvIHRoZSBuZXR3b3JrIGxheWVyLiBIb3dldmVyLCB0aGlzIHJlcXVpcmVzIGEgbWluaW1hbCBxdWV1ZSBvZgoJICogcGFja2V0cyBmb3IgdGhlIGRldmljZS4KCSAqIFdpdGhvdXQgZmxvdyBjb250cm9sLCB0aGUgVHggUXVldWUgaXMgMTQgKHR0cCkgKyAwIChkZXYpID0gMTQKCSAqIFdpdGggZmxvdyBjb250cm9sLCB0aGUgVHggUXVldWUgaXMgNyAodHRwKSArIDQgKGRldikgPSAxMQoJICogU2VlIGlybGFuX2V0aF9mbG93X2luZGljYXRpb24oKS4uLgoJICogTm90ZSA6IHRoaXMgbnVtYmVyIHdhcyByYW5kb21seSBzZWxlY3RlZCBhbmQgd291bGQgbmVlZCB0bwoJICogYmUgYWRqdXN0ZWQuCgkgKiBKZWFuIElJICovCglkZXYtPnR4X3F1ZXVlX2xlbiA9IDQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIGFsbG9jX2lybGFuZGV2CiAqCiAqICAgIEFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGFuZCBjb250cm9sIGJsb2NrCiAqCiAqLwpzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaXJsYW5kZXYoY29uc3QgY2hhciAqbmFtZSkKewoJcmV0dXJuIGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGlybGFuX2NiKSwgbmFtZSwKCQkJICAgIGlybGFuX2V0aF9zZXR1cCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2V0aF9vcGVuIChkZXYpCiAqCiAqICAgIE5ldHdvcmsgZGV2aWNlIGhhcyBiZWVuIG9wZW5lZCBieSB1c2VyCiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX2V0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7CgkKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCS8qIFJlYWR5IHRvIHBsYXkhICovCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOyAvKiBXYWl0IHVudGlsIGRhdGEgbGluayBpcyByZWFkeSAqLwoKCS8qIFdlIGFyZSBub3cgb3Blbiwgc28gdGltZSB0byBkbyBzb21lIHdvcmsgKi8KCXNlbGYtPmRpc2Nvbm5lY3RfcmVhc29uID0gMDsKCWlybGFuX2NsaWVudF93YWtldXAoc2VsZiwgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyKTsKCgkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGhhcmR3YXJlIGFkZHJlc3MgYmVmb3JlIHdlIHJldHVybiwgCgkgICBzbyBESENQIGNsaWVudHMgZ2V0cyBoYXBweSAqLwoJcmV0dXJuIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZWxmLT5vcGVuX3dhaXQsCgkJCQkJIXNlbGYtPnRzYXBfZGF0YS0+Y29ubmVjdGVkKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZXRoX2Nsb3NlIChkZXYpCiAqCiAqICAgIFN0b3AgdGhlIGV0aGVyIG5ldHdvcmsgZGV2aWNlLCBoaXMgZnVuY3Rpb24gd2lsbCB1c3VhbGx5IGJlIGNhbGxlZCBieQogKiAgICBpZmNvbmZpZyBkb3duLiBXZSBzaG91bGQgbm93IGRpc2Nvbm5lY3QgdGhlIGxpbmssIFdlIHN0YXJ0IHRoZSAKICogICAgY2xvc2UgdGltZXIsIHNvIHRoYXQgdGhlIGluc3RhbmNlIHdpbGwgYmUgcmVtb3ZlZCBpZiB3ZSBhcmUgdW5hYmxlCiAqICAgIHRvIGRpc2NvdmVyIHRoZSByZW1vdGUgZGV2aWNlIGFmdGVyIHRoZSBkaXNjb25uZWN0LgogKi8Kc3RhdGljIGludCBpcmxhbl9ldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJc3RydWN0IGlybGFuX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKCQoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCS8qIFN0b3AgZGV2aWNlICovCgluZXRpZl9zdG9wX3F1ZXVlKGRldik7CgkKCWlybGFuX2Nsb3NlX2RhdGFfY2hhbm5lbChzZWxmKTsKCWlybGFuX2Nsb3NlX3RzYXBzKHNlbGYpOwoKCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7Cglpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7CQoJCgkvKiBSZW1vdmUgZnJhbWVzIHF1ZXVlZCBvbiB0aGUgY29udHJvbCBjaGFubmVsICovCglza2JfcXVldWVfcHVyZ2UoJnNlbGYtPmNsaWVudC50eHEpOwoKCXNlbGYtPmNsaWVudC50eF9idXN5ID0gMDsKCQoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2V0aF90eCAoc2tiKQogKgogKiAgICBUcmFuc21pdHMgZXRoZXJuZXQgZnJhbWVzIG92ZXIgSXJEQSBsaW5rLgogKgogKi8Kc3RhdGljIGludCBpcmxhbl9ldGhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwoJaW50IHJldDsKCgkvKiBza2IgaGVhZHJvb20gbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gYWxsIElyREEtaGVhZGVycz8gKi8KCWlmICgoc2tiX2hlYWRyb29tKHNrYikgPCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpIHx8IChza2Jfc2hhcmVkKHNrYikpKSB7CgkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSAKCQkJc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOwoKCQkvKiAgV2UgaGF2ZSB0byBmcmVlIHRoZSBvcmlnaW5hbCBza2IgYW55d2F5ICovCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCQkvKiBEaWQgdGhlIHJlYWxsb2Mgc3VjY2VlZD8gKi8KCQlpZiAobmV3X3NrYiA9PSBOVUxMKQoJCQlyZXR1cm4gMDsKCgkJLyogVXNlIHRoZSBuZXcgc2tiIGluc3RlYWQgKi8KCQlza2IgPSBuZXdfc2tiOwoJfSAKCglkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKCgkvKiBOb3cgcXVldWUgdGhlIHBhY2tldCBpbiB0aGUgdHJhbnNwb3J0IGxheWVyICovCglpZiAoc2VsZi0+dXNlX3VkYXRhKQoJCXJldCA9IGlydHRwX3VkYXRhX3JlcXVlc3Qoc2VsZi0+dHNhcF9kYXRhLCBza2IpOwoJZWxzZQoJCXJldCA9IGlydHRwX2RhdGFfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIHNrYik7CgoJaWYgKHJldCA8IDApIHsKCQkvKiAgIAoJCSAqIElyVFRQcyB0eCBxdWV1ZSBpcyBmdWxsLCBzbyB3ZSBqdXN0IGhhdmUgdG8KCQkgKiBkcm9wIHRoZSBmcmFtZSEgWW91IG1pZ2h0IHRoaW5rIHRoYXQgd2Ugc2hvdWxkCgkJICoganVzdCByZXR1cm4gLTEgYW5kIGRvbid0IGRlYWxsb2NhdGUgdGhlIGZyYW1lLAoJCSAqIGJ1dCB0aGF0IGlzIGRhbmdlcm91cyBzaW5jZSBpdCdzIHBvc3NpYmxlIHRoYXQKCQkgKiB3ZSBoYXZlIHJlcGxhY2VkIHRoZSBvcmlnaW5hbCBza2Igd2l0aCBhIG5ldwoJCSAqIG9uZSB3aXRoIGxhcmdlciBoZWFkcm9vbSwgYW5kIHRoYXQgd291bGQgcmVhbGx5CgkJICogY29uZnVzZSBkb19kZXZfcXVldWVfeG1pdCgpIGluIGRldi5jISBJIGhhdmUKCQkgKiB0cmllZCA6LSkgREIgCgkJICovCgkJLyogaXJ0dHBfZGF0YV9yZXF1ZXN0IGFscmVhZHkgZnJlZSB0aGUgcGFja2V0ICovCgkJc2VsZi0+c3RhdHMudHhfZHJvcHBlZCsrOwoJfSBlbHNlIHsKCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CgkJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47IAoJfQoJCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZXRoX3JlY2VpdmUgKGhhbmRsZSwgc2tiKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGRhdGEgdGhhdCBpcyByZWNlaXZlZCBvbiB0aGUgZGF0YSBjaGFubmVsCiAqCiAqLwppbnQgaXJsYW5fZXRoX3JlY2VpdmUodm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlybGFuX2NiICpzZWxmID0gaW5zdGFuY2U7CgoJaWYgKHNrYiA9PSBOVUxMKSB7CgkJKytzZWxmLT5zdGF0cy5yeF9kcm9wcGVkOyAKCQlyZXR1cm4gMDsKCX0KCWlmIChza2ItPmxlbiA8IEVUSF9ITEVOKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSA6IElyTEFOIGZyYW1lIHRvbyBzaG9ydCAoJWQpXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIHNrYi0+bGVuKTsKCQkrK3NlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQ7IAoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCQlyZXR1cm4gMDsKCX0KCQkKCS8qIAoJICogQWRvcHQgdGhpcyBmcmFtZSEgSW1wb3J0YW50IHRvIHNldCBhbGwgdGhlc2UgZmllbGRzIHNpbmNlIHRoZXkgCgkgKiBtaWdodCBoYXZlIGJlZW4gcHJldmlvdXNseSBzZXQgYnkgdGhlIGxvdyBsZXZlbCBJckRBIG5ldHdvcmsKCSAqIGRldmljZSBkcml2ZXIgCgkgKi8KCXNrYi0+ZGV2ID0gc2VsZi0+ZGV2OwoJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsgLyogUmVtb3ZlIGV0aCBoZWFkZXIgKi8KCQoJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwoJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47IAoKCW5ldGlmX3J4KHNrYik7ICAgLyogRWF0IGl0ISAqLwoJCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZXRoX2Zsb3cgKHN0YXR1cykKICoKICogICAgRG8gZmxvdyBjb250cm9sIGJldHdlZW4gSVAvRXRoZXJuZXQgYW5kIElyTEFOL0lyVFRQLiBUaGlzIGlzIGRvbmUgYnkgCiAqICAgIGNvbnRyb2xsaW5nIHRoZSBxdWV1ZSBzdG9wL3N0YXJ0LgogKgogKiBUaGUgSXJEQSBsaW5rIGxheWVyIGhhcyB0aGUgYWR2YW50YWdlIHRvIGhhdmUgZmxvdyBjb250cm9sLCBhbmQKICogSXJUVFAgbm93IHByb3Blcmx5IGhhbmRsZXMgdGhhdC4gRmxvdyBjb250cm9sbGluZyB0aGUgaGlnaGVyIGxheWVycwogKiBwcmV2ZW50IHVzIHRvIGRyb3AgVHggcGFja2V0cyBpbiBoZXJlICh1cCB0byAxNSUgZm9yIGEgVENQIHNvY2tldCwKICogbW9yZSBmb3IgVURQIHNvY2tldCkuCiAqIEFsc28sIHRoaXMgYWxsb3cgdXMgdG8gcmVkdWNlIHRoZSBvdmVyYWxsIHRyYW5zbWl0IHF1ZXVlLCB3aGljaCBtZWFucwogKiBsZXNzIGxhdGVuY3kgaW4gY2FzZSBvZiBtaXhlZCB0cmFmZmljLgogKiBKZWFuIElJCiAqLwp2b2lkIGlybGFuX2V0aF9mbG93X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgTE9DQUxfRkxPVyBmbG93KQp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwoKCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgkKCWRldiA9IHNlbGYtPmRldjsKCglJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuOyk7CgkKCUlSREFfREVCVUcoMCwgIiVzKCkgOiBmbG93ICVzIDsgcnVubmluZyAlZFxuIiwgX19GVU5DVElPTl9fLAoJCSAgIGZsb3cgPT0gRkxPV19TVE9QID8gIkZMT1dfU1RPUCIgOiAiRkxPV19TVEFSVCIsCgkJICAgbmV0aWZfcnVubmluZyhkZXYpKTsKCglzd2l0Y2ggKGZsb3cpIHsKCWNhc2UgRkxPV19TVE9QOgoJCS8qIElyVFRQIGlzIGZ1bGwsIHN0b3AgaGlnaGVyIGxheWVycyAqLwoJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCQlicmVhazsKCWNhc2UgRkxPV19TVEFSVDoKCWRlZmF1bHQ6CgkJLyogVGVsbCB1cHBlciBsYXllcnMgdGhhdCBpdHMgdGltZSB0byB0cmFuc21pdCBmcmFtZXMgYWdhaW4gKi8KCQkvKiBTY2hlZHVsZSBuZXR3b3JrIGxheWVyICovCgkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwoJCWJyZWFrOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9ldGNfc2VuZF9ncmF0dWl0b3VzX2FycCAoZGV2KQogKgogKiAgICBTZW5kIGdyYXR1aXRvdXMgQVJQIHRvIGFubm91bmNlIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkCiAqICAgIGhhcmR3YXJlIGFkZHJlc3MsIHNvIHRoYXQgYWxsIHBlZXJzIHVwZGF0ZXMgdGhlaXIgQVJQIHRhYmxlcwogKi8Kdm9pZCBpcmxhbl9ldGhfc2VuZF9ncmF0dWl0b3VzX2FycChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CgoJLyogCgkgKiBXaGVuIHdlIGdldCBhIG5ldyBNQUMgYWRkcmVzcyBkbyBhIGdyYXR1aXRvdXMgQVJQLiBUaGlzCgkgKiBpcyB1c2VmdWwgaWYgd2UgaGF2ZSBjaGFuZ2VkIGFjY2VzcyBwb2ludHMgb24gdGhlIHNhbWUKCSAqIHN1Ym5ldC4gIAoJICovCiNpZmRlZiBDT05GSUdfSU5FVAoJSVJEQV9ERUJVRyg0LCAiSXJMQU46IFNlbmRpbmcgZ3JhdHVpdG91cyBBUlBcbiIpOwoJcmN1X3JlYWRfbG9jaygpOwoJaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldik7CglpZiAoaW5fZGV2ID09IE5VTEwpCgkJZ290byBvdXQ7CglpZiAoaW5fZGV2LT5pZmFfbGlzdCkKCQkKCWFycF9zZW5kKEFSUE9QX1JFUVVFU1QsIEVUSF9QX0FSUCwgCgkJIGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzLAoJCSBkZXYsIAoJCSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzcywKCQkgTlVMTCwgZGV2LT5kZXZfYWRkciwgTlVMTCk7Cm91dDoKCXJjdV9yZWFkX3VubG9jaygpOwojZW5kaWYgLyogQ09ORklHX0lORVQgKi8KfQoKLyoKICogRnVuY3Rpb24gc2V0X211bHRpY2FzdF9saXN0IChkZXYpCiAqCiAqICAgIENvbmZpZ3VyZSB0aGUgZmlsdGVyaW5nIG9mIHRoZSBkZXZpY2UKICoKICovCiNkZWZpbmUgSFdfTUFYX0FERFJTIDQgLyogTXVzdCBxdWVyeSB0byBnZXQgaXQhICovCnN0YXRpYyB2b2lkIGlybGFuX2V0aF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCnsKIAlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCS8qIENoZWNrIGlmIGRhdGEgY2hhbm5lbCBoYXMgYmVlbiBjb25uZWN0ZWQgeWV0ICovCglpZiAoc2VsZi0+Y2xpZW50LnN0YXRlICE9IElSTEFOX0RBVEEpIHsKCQlJUkRBX0RFQlVHKDEsICIlcygpLCBkZWxheWluZyFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybjsKCX0KCglpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CgkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KCQlJUkRBX1dBUk5JTkcoIlByb21pc2NvdXMgbW9kZSBub3QgaW1wbGVtZW50ZWQgYnkgSXJMQU4hXG4iKTsKCX0gCgllbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgZGV2LT5tY19jb3VudCA+IEhXX01BWF9BRERSUykgewoJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgdXNlIG5vcm1hbCBtb2RlLiAqLwoJCUlSREFfREVCVUcoNCwgIiVzKCksIFNldHRpbmcgbXVsdGljYXN0IGZpbHRlclxuIiwgX19GVU5DVElPTl9fICk7CgkJLyogaGFyZHdhcmVfc2V0X2ZpbHRlcihOVUxMKTsgKi8KCgkJaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7Cgl9CgllbHNlIGlmIChkZXYtPm1jX2NvdW50KSB7CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgU2V0dGluZyBtdWx0aWNhc3QgZmlsdGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQkvKiBXYWxrIHRoZSBhZGRyZXNzIGxpc3QsIGFuZCBsb2FkIHRoZSBmaWx0ZXIgKi8KCQkvKiBoYXJkd2FyZV9zZXRfZmlsdGVyKGRldi0+bWNfbGlzdCk7ICovCgoJCWlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyKHNlbGYsIFRSVUUpOwoJfQoJZWxzZSB7CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgQ2xlYXJpbmcgbXVsdGljYXN0IGZpbHRlclxuIiwgX19GVU5DVElPTl9fICk7CgkJaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc2VsZiwgRkFMU0UpOwoJfQoKCWlmIChkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkKCQlpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlcihzZWxmLCBUUlVFKTsKCWVsc2UKCQlpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlcihzZWxmLCBGQUxTRSk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2dldF9zdGF0cyAoZGV2KQogKgogKiAgICBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcyBmb3IgdGhpcyBkZXZpY2UKICoKICovCnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJsYW5fZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKewoJc3RydWN0IGlybGFuX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKCglyZXR1cm4gJnNlbGYtPnN0YXRzOwp9Cg==