ZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL0tjb25maWcgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzhkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC0wLDAgKzEsMTA5OCBAQAorIworIyBSVEMgY2xhc3MvZHJpdmVycyBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBSVENfTElCCisJYm9vbAorCittZW51Y29uZmlnIFJUQ19DTEFTUworCWJvb2wgIlJlYWwgVGltZSBDbG9jayIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uICFTMzkwICYmICFVTUwKKwlzZWxlY3QgUlRDX0xJQgorCWhlbHAKKwkgIEdlbmVyaWMgUlRDIGNsYXNzIHN1cHBvcnQuIElmIHlvdSBzYXkgeWVzIGhlcmUsIHlvdSB3aWxsCisgCSAgYmUgYWxsb3dlZCB0byBwbHVnIG9uZSBvciBtb3JlIFJUQ3MgdG8geW91ciBzeXN0ZW0uIFlvdSB3aWxsCisJICBwcm9iYWJseSB3YW50IHRvIGVuYWJsZSBvbmUgb3IgbW9yZSBvZiB0aGUgaW50ZXJmYWNlcyBiZWxvdy4KKworaWYgUlRDX0NMQVNTCisKK2NvbmZpZyBSVENfSENUT1NZUworCWJvb2wgIlNldCBzeXN0ZW0gdGltZSBmcm9tIFJUQyBvbiBzdGFydHVwIGFuZCByZXN1bWUiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgPSB5CisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSwgdGhlIHN5c3RlbSB0aW1lICh3YWxsIGNsb2NrKSB3aWxsIGJlIHNldCB1c2luZworCSAgdGhlIHZhbHVlIHJlYWQgZnJvbSBhIHNwZWNpZmllZCBSVEMgZGV2aWNlLiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZAorCSAgdW5uZWNlc3NhcnkgZnNjayBydW5zIGF0IGJvb3QgdGltZSwgYW5kIHRvIG5ldHdvcmsgYmV0dGVyLgorCitjb25maWcgUlRDX0hDVE9TWVNfREVWSUNFCisJc3RyaW5nICJSVEMgdXNlZCB0byBzZXQgdGhlIHN5c3RlbSB0aW1lIgorCWRlcGVuZHMgb24gUlRDX0hDVE9TWVMgPSB5CisJZGVmYXVsdCAicnRjMCIKKwloZWxwCisJICBUaGUgUlRDIGRldmljZSB0aGF0IHdpbGwgYmUgdXNlZCB0byAocmUpaW5pdGlhbGl6ZSB0aGUgc3lzdGVtCisJICBjbG9jaywgdXN1YWxseSBydGMwLiBJbml0aWFsaXphdGlvbiBpcyBkb25lIHdoZW4gdGhlIHN5c3RlbQorCSAgc3RhcnRzIHVwLCBhbmQgd2hlbiBpdCByZXN1bWVzIGZyb20gYSBsb3cgcG93ZXIgc3RhdGUuIFRoaXMKKwkgIGRldmljZSBzaG91bGQgcmVjb3JkIHRpbWUgaW4gVVRDLCBzaW5jZSB0aGUga2VybmVsIHdvbid0IGRvCisJICB0aW1lem9uZSBjb3JyZWN0aW9uLgorCisJICBUaGUgZHJpdmVyIGZvciB0aGlzIFJUQyBkZXZpY2UgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIGxhdGVfaW5pdGNhbGwKKwkgIGZ1bmN0aW9ucyBydW4sIHNvIGl0IG11c3QgdXN1YWxseSBiZSBzdGF0aWNhbGx5IGxpbmtlZC4KKworCSAgVGhpcyBjbG9jayBzaG91bGQgYmUgYmF0dGVyeS1iYWNrZWQsIHNvIHRoYXQgaXQgcmVhZHMgdGhlIGNvcnJlY3QKKwkgIHRpbWUgd2hlbiB0aGUgc3lzdGVtIGJvb3RzIGZyb20gYSBwb3dlci1vZmYgc3RhdGUuIE90aGVyd2lzZSwgeW91cgorCSAgc3lzdGVtIHdpbGwgbmVlZCBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2UgKGxpa2UgYW4gTlRQIHNlcnZlcikuCisKKwkgIElmIHRoZSBjbG9jayB5b3Ugc3BlY2lmeSBoZXJlIGlzIG5vdCBiYXR0ZXJ5IGJhY2tlZCwgaXQgbWF5IHN0aWxsCisJICBiZSB1c2VmdWwgdG8gcmVpbml0aWFsaXplIHN5c3RlbSB0aW1lIHdoZW4gcmVzdW1pbmcgZnJvbSBzeXN0ZW0KKwkgIHNsZWVwIHN0YXRlcy4gRG8gbm90IHNwZWNpZnkgYW4gUlRDIGhlcmUgdW5sZXNzIGl0IHN0YXlzIHBvd2VyZWQKKwkgIGR1cmluZyBhbGwgdGhpcyBzeXN0ZW0ncyBzdXBwb3J0ZWQgc2xlZXAgc3RhdGVzLgorCitjb25maWcgUlRDX0RFQlVHCisJYm9vbCAiUlRDIGRlYnVnIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgPSB5CisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgc3VwcG9ydCBpbiB0aGUgUlRDIGZyYW1ld29yaworCSAgYW5kIGluZGl2aWR1YWwgUlRDIGRyaXZlcnMuCisKK2NvbW1lbnQgIlJUQyBpbnRlcmZhY2VzIgorCitjb25maWcgUlRDX0lOVEZfU1lTRlMKKwlib29sZWFuICIvc3lzL2NsYXNzL3J0Yy9ydGNOIChzeXNmcykiCisJZGVwZW5kcyBvbiBTWVNGUworCWRlZmF1bHQgUlRDX0NMQVNTCisJaGVscAorCSAgU2F5IHllcyBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIFJUQ3MgdXNpbmcgc3lzZnMgaW50ZXJmYWNlcywKKwkgIC9zeXMvY2xhc3MvcnRjL3J0YzAgdGhyb3VnaCAvc3lzLy4uLi9ydGNOLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgUlRDX0lOVEZfUFJPQworCWJvb2xlYW4gIi9wcm9jL2RyaXZlci9ydGMgKHByb2NmcyBmb3IgcnRjMCkiCisJZGVwZW5kcyBvbiBQUk9DX0ZTCisJZGVmYXVsdCBSVENfQ0xBU1MKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgZmlyc3QgUlRDIHRocm91Z2ggdGhlIHByb2MKKwkgIGludGVyZmFjZSwgL3Byb2MvZHJpdmVyL3J0Yy4gT3RoZXIgUlRDcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUKKwkgIHRocm91Z2ggdGhhdCBBUEkuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBSVENfSU5URl9ERVYKKwlib29sZWFuICIvZGV2L3J0Y04gKGNoYXJhY3RlciBkZXZpY2VzKSIKKwlkZWZhdWx0IFJUQ19DTEFTUworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgeW91ciBSVENzIHVzaW5nIHRoZSAvZGV2CisJICBpbnRlcmZhY2VzLCB3aGljaCAidWRldiIgc2V0cyB1cCBhcyAvZGV2L3J0YzAgdGhyb3VnaAorCSAgL2Rldi9ydGNOLgorCisJICBZb3UgbWF5IHdhbnQgdG8gc2V0IHVwIGEgc3ltYm9saWMgbGluayBzbyBvbmUgb2YgdGhlc2UKKwkgIGNhbiBiZSBhY2Nlc3NlZCBhcyAvZGV2L3J0Yywgd2hpY2ggaXMgYSBuYW1lCisJICBleHBlY3RlZCBieSAiaHdjbG9jayIgYW5kIHNvbWUgb3RoZXIgcHJvZ3JhbXMuIFJlY2VudAorCSAgdmVyc2lvbnMgb2YgInVkZXYiIGFyZSBrbm93biB0byBzZXQgdXAgdGhlIHN5bWxpbmsgZm9yIHlvdS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIFJUQ19JTlRGX0RFVl9VSUVfRU1VTAorCWJvb2wgIlJUQyBVSUUgZW11bGF0aW9uIG9uIGRldiBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBSVENfSU5URl9ERVYKKwloZWxwCisJICBQcm92aWRlcyBhbiBlbXVsYXRpb24gZm9yIFJUQ19VSUUgaWYgdGhlIHVuZGVybHlpbmcgcnRjIGNoaXAKKwkgIGRyaXZlciBkb2VzIG5vdCBleHBvc2UgUlRDX1VJRSBpb2N0bHMuIFRob3NlIHJlcXVlc3RzIGdlbmVyYXRlCisJICBvbmNlLXBlci1zZWNvbmQgdXBkYXRlIGludGVycnVwdHMsIHVzZWQgZm9yIHN5bmNocm9uaXphdGlvbi4KKworCSAgVGhlIGVtdWxhdGlvbiBjb2RlIHdpbGwgcmVhZCB0aGUgdGltZSBmcm9tIHRoZSBoYXJkd2FyZQorCSAgY2xvY2sgc2V2ZXJhbCB0aW1lcyBwZXIgc2Vjb25kLCBwbGVhc2UgZW5hYmxlIHRoaXMgb3B0aW9uCisJICBvbmx5IGlmIHlvdSBrbm93IHRoYXQgeW91IHJlYWxseSBuZWVkIGl0LgorCitjb25maWcgUlRDX0RSVl9URVNUCisJdHJpc3RhdGUgIlRlc3QgZHJpdmVyL2RldmljZSIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBSVEMgdGVzdCBkcml2ZXIuIEl0J3MgYSBzb2Z0d2FyZSBSVEMgd2hpY2ggY2FuIGJlCisJICB1c2VkIHRvIHRlc3QgdGhlIFJUQyBzdWJzeXN0ZW0gQVBJcy4gSXQgZ2V0cworCSAgdGhlIHRpbWUgZnJvbSB0aGUgc3lzdGVtIGNsb2NrLgorCSAgWW91IHdhbnQgdGhpcyBkcml2ZXIgb25seSBpZiB5b3UgYXJlIGRvaW5nIGRldmVsb3BtZW50CisJICBvbiB0aGUgUlRDIHN1YnN5c3RlbS4gUGxlYXNlIHJlYWQgdGhlIHNvdXJjZSBjb2RlCisJICBmb3IgZnVydGhlciBkZXRhaWxzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy10ZXN0LgorCitjb21tZW50ICJJMkMgUlRDIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBJMkMKKworaWYgSTJDCisKK2NvbmZpZyBSVENfRFJWXzg4UE04NjBYCisJdHJpc3RhdGUgIk1hcnZlbGwgODhQTTg2MHgiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDICYmIE1GRF84OFBNODYwWAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBSVEMgZnVuY3Rpb24gaW4gTWFydmVsbAorCSAgODhQTTg2MHggY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLTg4cG04NjB4LgorCitjb25maWcgUlRDX0RSVl9EUzEzMDcKKwl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTMwNy8zNy8zOC8zOS80MCwgU1QgTTQxVDAwLCBFUFNPTiBSWC04MDI1IgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB2YXJpb3VzIGNvbXBhdGlibGUgUlRDCisJICBjaGlwcyAob2Z0ZW4gd2l0aCBiYXR0ZXJ5IGJhY2t1cCkgY29ubmVjdGVkIHdpdGggSTJDLiBUaGlzIGRyaXZlcgorCSAgc2hvdWxkIGhhbmRsZSBEUzEzMDcsIERTMTMzNywgRFMxMzM4LCBEUzEzMzksIERTMTM0MCwgU1QgTTQxVDAwLAorCSAgRVBTT04gUlgtODAyNSBhbmQgcHJvYmFibHkgb3RoZXIgY2hpcHMuIEluIHNvbWUgY2FzZXMgdGhlIFJUQworCSAgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCAoYnkgbWFudWZhY3R1cmluZyBvciBhCisJICBib290bG9hZGVyKS4KKworCSAgVGhlIGZpcnN0IHNldmVuIHJlZ2lzdGVycyBvbiB0aGVzZSBjaGlwcyBob2xkIGFuIFJUQywgYW5kIG90aGVyCisJICByZWdpc3RlcnMgbWF5IGFkZCBmZWF0dXJlcyBzdWNoIGFzIE5WUkFNLCBhIHRyaWNrbGUgY2hhcmdlciBmb3IKKwkgIHRoZSBSVEMvTlZSQU0gYmFja3VwIHBvd2VyLCBhbmQgYWxhcm1zLiBOVlJBTSBpcyB2aXNpYmxlIGluCisJICBzeXNmcywgYnV0IG90aGVyIGNoaXAgZmVhdHVyZXMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWRzMTMwNy4KKworY29uZmlnIFJUQ19EUlZfRFMxMzc0CisJdHJpc3RhdGUgIkRhbGxhcy9NYXhpbSBEUzEzNzQiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yCisJICBEUzEzNzQgcmVhbC10aW1lIGNsb2NrIGNoaXBzLiBJZiBhbiBpbnRlcnJ1cHQgaXMgYXNzb2NpYXRlZAorCSAgd2l0aCB0aGUgZGV2aWNlLCB0aGUgYWxhcm0gZnVuY3Rpb25hbGl0eSBpcyBzdXBwb3J0ZWQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWRzMTM3NC4KKworY29uZmlnIFJUQ19EUlZfRFMxNjcyCisJdHJpc3RhdGUgIkRhbGxhcy9NYXhpbSBEUzE2NzIiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgRGFsbGFzL01heGltIERTMTY3MiB0aW1la2VlcGluZyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczE2NzIuCisKK2NvbmZpZyBSVENfRFJWX0RTMzIzMgorCXRyaXN0YXRlICJEYWxsYXMvTWF4aW0gRFMzMjMyIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgorCSAgRFMzMjMyIHJlYWwtdGltZSBjbG9jayBjaGlwcy4gSWYgYW4gaW50ZXJydXB0IGlzIGFzc29jaWF0ZWQKKwkgIHdpdGggdGhlIGRldmljZSwgdGhlIGFsYXJtIGZ1bmN0aW9uYWxpdHkgaXMgc3VwcG9ydGVkLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtZHMzMjMyLgorCitjb25maWcgUlRDX0RSVl9NQVg2OTAwCisJdHJpc3RhdGUgIk1heGltIE1BWDY5MDAiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBNYXhpbSBNQVg2OTAwIEkyQyBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtbWF4NjkwMC4KKworY29uZmlnIFJUQ19EUlZfTUFYODkyNQorCXRyaXN0YXRlICJNYXhpbSBNQVg4OTI1IgorCWRlcGVuZHMgb24gTUZEX01BWDg5MjUKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFJUQyBvZiBNYXhpbSBNQVg4OTI1IFBNSUMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW1heDg5MjUuCisKK2NvbmZpZyBSVENfRFJWX01BWDg5OTgKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODk5OCIKKwlkZXBlbmRzIG9uIE1GRF9NQVg4OTk4CisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBSVEMgb2YgTWF4aW0gTUFYODk5OCBQTUlDLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tYXg4OTk4LgorCitjb25maWcgUlRDX0RSVl9SUzVDMzcyCisJdHJpc3RhdGUgIlJpY29oIFIyMDI1Uy9ELCBSUzVDMzcyQS9CLCBSVjVDMzg2LCBSVjVDMzg3QSIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBSaWNvaCBSMjAyNVMvRCwgUlM1QzM3MkEsIFJTNUMzNzJCLCBSVjVDMzg2LCBhbmQgUlY1QzM4N0EgUlRDIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1yczVjMzcyLgorCitjb25maWcgUlRDX0RSVl9JU0wxMjA4CisJdHJpc3RhdGUgIkludGVyc2lsIElTTDEyMDgiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgSW50ZXJzaWwgSVNMMTIwOCBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtaXNsMTIwOC4KKworY29uZmlnIFJUQ19EUlZfSVNMMTIwMjIKKwl0cmlzdGF0ZSAiSW50ZXJzaWwgSVNMMTIwMjIiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgSW50ZXJzaWwgSVNMMTIwMjIgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWlzbDEyMDIyLgorCitjb25maWcgUlRDX0RSVl9YMTIwNQorCXRyaXN0YXRlICJYaWNvci9JbnRlcnNpbCBYMTIwNSIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBYaWNvci9JbnRlcnNpbCBYMTIwNSBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMteDEyMDUuCisKK2NvbmZpZyBSVENfRFJWX1BDRjg1NjMKKwl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0Y4NTYzL0Vwc29uIFJUQzg1NjQiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgUGhpbGlwcyBQQ0Y4NTYzIFJUQyBjaGlwLiBUaGUgRXBzb24gUlRDODU2NAorCSAgc2hvdWxkIHdvcmsgYXMgd2VsbC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtcGNmODU2My4KKworY29uZmlnIFJUQ19EUlZfUENGODU4MworCXRyaXN0YXRlICJQaGlsaXBzIFBDRjg1ODMiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIFBDRjg1ODMKKwkgIFJUQyBjaGlwIGZvdW5kIG9uIEFjb3JuIFJpc2NQQ3MuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZQorCSAgcGxhdGZvcm0gc3BlY2lmaWMgbWV0aG9kIG9mIHJldHJpZXZpbmcgdGhlIGN1cnJlbnQgeWVhciBmcm9tCisJICB0aGUgUlRDJ3MgU1JBTS4gSXQgd2lsbCB3b3JrIG9uIG90aGVyIHBsYXRmb3JtcyB3aXRoIHRoZSBzYW1lCisJICBjaGlwLCBidXQgdGhlIHllYXIgd2lsbCBwcm9iYWJseSBoYXZlIHRvIGJlIHR3ZWFrZWQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXBjZjg1ODMuCisKK2NvbmZpZyBSVENfRFJWX000MVQ4MAorCXRyaXN0YXRlICJTVCBNNDFUNjIvNjUvTTQxVDgwLzgxLzgyLzgzLzg0Lzg1Lzg3IgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgU1QgTTQxVDYwCisJICBhbmQgTTQxVDgwIFJUQyBjaGlwcyBzZXJpZXMuIEN1cnJlbnRseSwgdGhlIGZvbGxvd2luZyBjaGlwcyBhcmUKKwkgIHN1cHBvcnRlZDogTTQxVDYyLCBNNDFUNjUsIE00MVQ4MCwgTTQxVDgxLCBNNDFUODIsIE00MVQ4MywgTTQxU1Q4NCwKKwkgIE00MVNUODUsIGFuZCBNNDFTVDg3LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tNDF0ODAuCisKK2NvbmZpZyBSVENfRFJWX000MVQ4MF9XRFQKKwlib29sICJTVCBNNDFUNjUvTTQxVDgwIHNlcmllcyBSVEMgd2F0Y2hkb2cgdGltZXIiCisJZGVwZW5kcyBvbiBSVENfRFJWX000MVQ4MAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIHdhdGNoZG9nIHRpbWVyIGluIHRoZSBTVCBNNDFUNjAgYW5kIE00MVQ4MCBSVEMgY2hpcHMgc2VyaWVzLgorCitjb25maWcgUlRDX0RSVl9CUTMySworCXRyaXN0YXRlICJUSSBCUTMyMDAwIgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgVEkKKwkgIEJRMzIwMDAgSTJDIFJUQyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1icTMyay4KKworY29uZmlnIFJUQ19EUlZfRE0zNTVFVk0KKwl0cmlzdGF0ZSAiVEkgRGFWaW5jaSBETTM1NSBFVk0gUlRDIgorCWRlcGVuZHMgb24gTUZEX0RNMzU1RVZNX01TUAorCWhlbHAKKwkgIFN1cHBvcnRzIHRoZSBSVEMgZmlybXdhcmUgaW4gdGhlIE1TUDQzMCBvbiB0aGUgRE0zNTUgRVZNLgorCitjb25maWcgUlRDX0RSVl9UV0w5MjMzMAorCWJvb2xlYW4gIlRJIFRXTDkyMzMwL01lbmVsYXVzIgorCWRlcGVuZHMgb24gTUVORUxBVVMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBvbiB0aGUKKwkgIFRXTDkyMzMwICJNZW5lbGF1cyIgcG93ZXIgbWFuYWdlbWVudCBjaGlwLCB1c2VkIHdpdGggT01BUDIKKwkgIHBsYXRmb3Jtcy4gVGhlIHN1cHBvcnQgaXMgaW50ZWdyYXRlZCB3aXRoIHRoZSByZXN0IG9mCisJICB0aGUgTWVuZWxhdXMgZHJpdmVyOyBpdCdzIG5vdCBzZXBhcmF0ZSBtb2R1bGUuCisKK2NvbmZpZyBSVENfRFJWX1RXTDQwMzAKKwl0cmlzdGF0ZSAiVEkgVFdMNDAzMC9UV0w1MDMwL1RXTDYwMzAvVFBTNjU5eDAiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgVFdMNDAzMF9DT1JFCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgb24gdGhlCisJICBUV0w0MDMwL1RXTDUwMzAvVFdMNjAzMCBmYW1pbHkgY2hpcHMsIHVzZWQgbW9zdGx5IHdpdGggT01BUDMgcGxhdGZvcm1zLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy10d2wuCisKK2NvbmZpZyBSVENfRFJWX1MzNTM5MEEKKwl0cmlzdGF0ZSAiU2Vpa28gSW5zdHJ1bWVudHMgUy0zNTM5MEEiCisJc2VsZWN0IEJJVFJFVkVSU0UKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgU2Vpa28KKwkgIEluc3RydW1lbnRzIFMtMzUzOTBBLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28gdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXMzNTM5MGEuCisKK2NvbmZpZyBSVENfRFJWX0ZNMzEzMAorCXRyaXN0YXRlICJSYW10cm9uIEZNMzEzMCIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBSYW10cm9uIEZNMzEzMCBSVEMgY2hpcHMuCisJICBSYW10cm9uIEZNMzEzMCBpcyBhIGNoaXAgd2l0aCB0d28gc2VwYXJhdGUgZGV2aWNlcyBpbnNpZGUsCisJICBSVEMgY2xvY2sgYW5kIEZSQU0uIFRoaXMgZHJpdmVyIHByb3ZpZGVzIG9ubHkgUlRDIGZ1bmN0aW9uYWxpdHkuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbyB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtZm0zMTMwLgorCitjb25maWcgUlRDX0RSVl9SWDg1ODEKKwl0cmlzdGF0ZSAiRXBzb24gUlgtODU4MSIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgRXBzb24gUlgtODU4MS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1yeDg1ODEuCisKK2NvbmZpZyBSVENfRFJWX1JYODAyNQorCXRyaXN0YXRlICJFcHNvbiBSWC04MDI1U0EvTkIiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBFcHNvbgorCSAgUlgtODAyNVNBL05CIFJUQyBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtcng4MDI1LgorCitjb25maWcgUlRDX0RSVl9FTTMwMjcKKwl0cmlzdGF0ZSAiRU0gTWljcm9lbGVjdHJvbmljIEVNMzAyNyIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEVNCisJICBNaWNyb2VsZWN0cm9uaWMgRU0zMDI3IFJUQyBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtZW0zMDI3LgorCitjb25maWcgUlRDX0RSVl9SVjMwMjlDMgorCXRyaXN0YXRlICJNaWNybyBDcnlzdGFsIFJUQyIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1pY3JvIENyeXN0YWwKKwkgIFJWMzAyOS1DMiBSVEMgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXJ2MzAyOWMyLgorCitlbmRpZiAjIEkyQworCitjb21tZW50ICJTUEkgUlRDIGRyaXZlcnMiCisKK2lmIFNQSV9NQVNURVIKKworY29uZmlnIFJUQ19EUlZfTTQxVDkzCisgICAgICAgIHRyaXN0YXRlICJTVCBNNDFUOTMiCisgICAgICAgIGhlbHAKKyAgICAgICAgICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKyAgICAgICAgICBTVCBNNDFUOTMgU1BJIFJUQyBjaGlwLgorCisgICAgICAgICAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisgICAgICAgICAgd2lsbCBiZSBjYWxsZWQgcnRjLW00MXQ5My4KKworY29uZmlnIFJUQ19EUlZfTTQxVDk0CisJdHJpc3RhdGUgIlNUIE00MVQ5NCIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFNUIE00MVQ5NCBTUEkgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW00MXQ5NC4KKworY29uZmlnIFJUQ19EUlZfRFMxMzA1CisJdHJpc3RhdGUgIkRhbGxhcy9NYXhpbSBEUzEzMDUvRFMxMzA2IgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGRyaXZlciB0byBnZXQgc3VwcG9ydCBmb3IgdGhlIERhbGxhcy9NYXhpbSBEUzEzMDUKKwkgIGFuZCBEUzEzMDYgcmVhbCB0aW1lIGNsb2NrIGNoaXBzLiBUaGVzZSBzdXBwb3J0IGEgdHJpY2tsZQorCSAgY2hhcmdlciwgYWxhcm1zLCBhbmQgTlZSQU0gaW4gYWRkaXRpb24gdG8gdGhlIGNsb2NrLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczEzMDUuCisKK2NvbmZpZyBSVENfRFJWX0RTMTM5MAorCXRyaXN0YXRlICJEYWxsYXMvTWF4aW0gRFMxMzkwLzkzLzk0IgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIERhbGxhcy9NYXhpbSBEUzEzOTAvOTMvOTQgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIFJUQyBmZWF0dXJlLCBhbmQgbm90IG90aGVyIGNoaXAKKwkgIGZlYXR1cmVzIHN1Y2ggYXMgYWxhcm1zIGFuZCB0cmlja2xlIGNoYXJnaW5nLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczEzOTAuCisKK2NvbmZpZyBSVENfRFJWX01BWDY5MDIKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjkwMiIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIE1heGltIE1BWDY5MDIgU1BJIFJUQyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tYXg2OTAyLgorCitjb25maWcgUlRDX0RSVl9SOTcwMQorCXRyaXN0YXRlICJFcHNvbiBSVEMtOTcwMUpFIgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgRXBzb24gUlRDLTk3MDFKRSBTUEkgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXI5NzAxLgorCitjb25maWcgUlRDX0RSVl9SUzVDMzQ4CisJdHJpc3RhdGUgIlJpY29oIFJTNUMzNDhBL0IiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgUmljb2ggUlM1QzM0OEEgYW5kIFJTNUMzNDhCIFJUQyBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtcnM1YzM0OC4KKworY29uZmlnIFJUQ19EUlZfRFMzMjM0CisJdHJpc3RhdGUgIk1heGltL0RhbGxhcyBEUzMyMzQiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgTWF4aW0vRGFsbGFzIERTMzIzNCBTUEkgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWRzMzIzNC4KKworY29uZmlnIFJUQ19EUlZfUENGMjEyMworCXRyaXN0YXRlICJOWFAgUENGMjEyMyIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5YUCBQQ0YyMTIzCisJICBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtcGNmMjEyMy4KKworZW5kaWYgIyBTUElfTUFTVEVSCisKK2NvbW1lbnQgIlBsYXRmb3JtIFJUQyBkcml2ZXJzIgorCisjIHRoaXMgJ0NNT1MnIFJUQyBkcml2ZXIgaXMgYXJjaCBkZXBlbmRlbnQgYmVjYXVzZSA8YXNtLWdlbmVyaWMvcnRjLmg+CisjIHJlcXVpcmVzIDxhc20vbWMxNDY4MThydGMuaD4gZGVmaW5pbmcgQ01PU19SRUFEL0NNT1NfV1JJVEUsIGFuZCBhCisjIGdsb2JhbCBydGNfbG9jayAuLi4gaXQncyBub3QgeWV0IGp1c3QgYW5vdGhlciBwbGF0Zm9ybV9kZXZpY2UuCisKK2NvbmZpZyBSVENfRFJWX0NNT1MKKwl0cmlzdGF0ZSAiUEMtc3R5bGUgJ0NNT1MnIgorCWRlcGVuZHMgb24gWDg2IHx8IEFMUEhBIHx8IEFSTSB8fCBNMzJSIHx8IEFUQVJJIHx8IFBQQyB8fCBNSVBTIHx8IFNQQVJDNjQKKwlkZWZhdWx0IHkgaWYgWDg2CisJaGVscAorCSAgU2F5ICJ5ZXMiIGhlcmUgdG8gZ2V0IGRpcmVjdCBzdXBwb3J0IGZvciB0aGUgcmVhbCB0aW1lIGNsb2NrCisJICBmb3VuZCBpbiBldmVyeSBQQyBvciBBQ1BJLWJhc2VkIHN5c3RlbSwgYW5kIHNvbWUgb3RoZXIgYm9hcmRzLgorCSAgU3BlY2lmaWNhbGx5IHRoZSBvcmlnaW5hbCBNQzE0NjgxOCwgY29tcGF0aWJsZXMgbGlrZSB0aG9zZSBpbgorCSAgUEMgc291dGggYnJpZGdlcywgdGhlIERTMTI4ODcgb3IgTTQ4VDg2LCBzb21lIG11bHRpZnVuY3Rpb24KKwkgIG9yIExQQyBidXMgY2hpcHMsIGFuZCBzbyBvbi4KKworCSAgWW91ciBzeXN0ZW0gd2lsbCBuZWVkIHRvIGRlZmluZSB0aGUgcGxhdGZvcm0gZGV2aWNlIHVzZWQgYnkKKwkgIHRoaXMgZHJpdmVyLCBvdGhlcndpc2UgaXQgd29uJ3QgYmUgYWNjZXNzaWJsZS4gVGhpcyBtZWFucworCSAgeW91IGNhbiBzYWZlbHkgZW5hYmxlIHRoaXMgZHJpdmVyIGlmIHlvdSBkb24ndCBrbm93IHdoZXRoZXIKKwkgIG9yIG5vdCB5b3VyIGJvYXJkIGhhcyB0aGlzIGtpbmQgb2YgaGFyZHdhcmUuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWNtb3MuCisKK2NvbmZpZyBSVENfRFJWX1ZSVEMKKwl0cmlzdGF0ZSAiVmlydHVhbCBSVEMgZm9yIEludGVsIE1JRCBwbGF0Zm9ybXMiCisJZGVwZW5kcyBvbiBYODZfSU5URUxfTUlECisJZGVmYXVsdCB5IGlmIFg4Nl9JTlRFTF9NSUQKKworCWhlbHAKKwlTYXkgInllcyIgaGVyZSB0byBnZXQgZGlyZWN0IHN1cHBvcnQgZm9yIHRoZSByZWFsIHRpbWUgY2xvY2sKKwlmb3VuZCBvbiBNb29yZXN0b3duIHBsYXRmb3Jtcy4gVGhlIFZSVEMgaXMgYSBlbXVsYXRlZCBSVEMgdGhhdAorCWRlcml2ZXMgaXRzIGNsb2NrIHNvdXJjZSBmcm9tIGEgcmVhbCBSVEMgaW4gdGhlIFBNSUMuIFRoZSBNQzE0NjgxOAorCXN0eWxlIHByb2dyYW1taW5nIGludGVyZmFjZSBpcyBtb3N0bHkgY29uc2VydmVkLCBidXQgYW55CisJdXBkYXRlcyBhcmUgZG9uZSB2aWEgSVBDIGNhbGxzIHRvIHRoZSBzeXN0ZW0gY29udHJvbGxlciBGVy4KKworY29uZmlnIFJUQ19EUlZfRFMxMjE2CisJdHJpc3RhdGUgIkRhbGxhcyBEUzEyMTYiCisJZGVwZW5kcyBvbiBTTklfUk0KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIERhbGxhcyBEUzEyMTYgUlRDIGNoaXBzLgorCitjb25maWcgUlRDX0RSVl9EUzEyODYKKwl0cmlzdGF0ZSAiRGFsbGFzIERTMTI4NiIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIERhbGxhcyBEUzEyODYgUlRDIGNoaXBzLgorCitjb25maWcgUlRDX0RSVl9EUzEzMDIKKwl0cmlzdGF0ZSAiRGFsbGFzIERTMTMwMiIKKwlkZXBlbmRzIG9uIFNIX1NFQ1VSRUVER0U1NDEwCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBEYWxsYXMgRFMxMzAyIFJUQyBjaGlwcy4KKworY29uZmlnIFJUQ19EUlZfRFMxNTExCisJdHJpc3RhdGUgIkRhbGxhcyBEUzE1MTEiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBEYWxsYXMgRFMxNTExIHRpbWVrZWVwaW5nL3dhdGNoZG9nIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWRzMTUxMS4KKworY29uZmlnIFJUQ19EUlZfRFMxNTUzCisJdHJpc3RhdGUgIk1heGltL0RhbGxhcyBEUzE1NTMiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgTWF4aW0vRGFsbGFzIERTMTU1MyB0aW1la2VlcGluZyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczE1NTMuCisKK2NvbmZpZyBSVENfRFJWX0RTMTc0MgorCXRyaXN0YXRlICJNYXhpbS9EYWxsYXMgRFMxNzQyLzE3NDMiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgTWF4aW0vRGFsbGFzIERTMTc0Mi8xNzQzIHRpbWVrZWVwaW5nIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWRzMTc0Mi4KKworY29uZmlnIFJUQ19EUlZfREE5MDUyCisJdHJpc3RhdGUgIkRpYWxvZyBEQTkwNTIvREE5MDUzIFJUQyIKKwlkZXBlbmRzIG9uIFBNSUNfREE5MDUyCisJaGVscAorCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IHRoZSBSVEMgZHJpdmVyIGZvciBEaWFsb2cgU2VtaWNvbmR1Y3RvcgorCSAgREE5MDUyLUJDIGFuZCBEQTkwNTMtQUEvQnggUE1JQ3MuCisKK2NvbmZpZyBSVENfRFJWX0VGSQorCXRyaXN0YXRlICJFRkkgUlRDIgorCWRlcGVuZHMgb24gSUE2NAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZSBFRkkKKwkgIFJlYWwgVGltZSBDbG9jay4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtZWZpLgorCitjb25maWcgUlRDX0RSVl9TVEsxN1RBOAorCXRyaXN0YXRlICJTaW10ZWsgU1RLMTdUQTgiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBTaW10ZWsgU1RLMTdUQTggdGltZWtlZXBpbmcgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtc3RrMTd0YTguCisKK2NvbmZpZyBSVENfRFJWX000OFQ4NgorCXRyaXN0YXRlICJTVCBNNDhUODYvRGFsbGFzIERTMTI4ODciCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgU1QgTTQ4VDg2IGFuZCBEYWxsYXMgRFMxMjg4NyBSVEMgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW00OHQ4Ni4KKworY29uZmlnIFJUQ19EUlZfTTQ4VDM1CisJdHJpc3RhdGUgIlNUIE00OFQzNSIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBTVCBNNDhUMzUgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLCBpZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgInJ0Yy1tNDh0MzUiLgorCitjb25maWcgUlRDX0RSVl9NNDhUNTkKKwl0cmlzdGF0ZSAiU1QgTTQ4VDU5L000OFQwOC9NNDhUMDIiCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgU1QgTTQ4VDU5IFJUQyBjaGlwIGFuZCBjb21wYXRpYmxlIFNUIE00OFQwOCBhbmQgTTQ4VDAyLgorCisJICBUaGVzZSBjaGlwcyBhcmUgdXN1YWxseSBmb3VuZCBpbiBTdW4gU1BBUkMgYW5kIFVsdHJhU1BBUkMKKwkgIHdvcmtzdGF0aW9ucy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUsIGlmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCAicnRjLW00OHQ1OSIuCisKK2NvbmZpZyBSVENfRFJWX01TTTYyNDIKKwl0cmlzdGF0ZSAiT2tpIE1TTTYyNDIiCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBPa2kgTVNNNjI0MgorCSAgdGltZWtlZXBpbmcgY2hpcC4gSXQgaXMgdXNlZCBpbiBzb21lIEFtaWdhIG1vZGVscyAoZS5nLiBBMjAwMCkuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW1zbTYyNDIuCisKK2NvbmZpZyBSVENfRFJWX0lNWERJCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBJTVggRHJ5SWNlIFJlYWwgVGltZSBDbG9jayIKKwlkZXBlbmRzIG9uIEFSQ0hfTVgyNQorCWRlcGVuZHMgb24gUlRDX0NMQVNTCisJaGVscAorCSAgIFN1cHBvcnQgZm9yIEZyZWVzY2FsZSBJTVggRHJ5SWNlIFJUQworCisJICAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUsIGlmIHNvLCB0aGUgbW9kdWxlCisJICAgd2lsbCBiZSBjYWxsZWQgInJ0Yy1pbXhkaSIuCisKK2NvbmZpZyBSVENfTVhDCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBNWEMgUmVhbCBUaW1lIENsb2NrIgorCWRlcGVuZHMgb24gQVJDSF9NWEMKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWhlbHAKKwkgICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEZyZWVzY2FsZSBNWEMKKwkgICBSVEMgbW9kdWxlLgorCisJICAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUsIGlmIHNvLCB0aGUgbW9kdWxlCisJICAgd2lsbCBiZSBjYWxsZWQgInJ0Yy1teGMiLgorCitjb25maWcgUlRDX0RSVl9CUTQ4MDIKKwl0cmlzdGF0ZSAiVEkgQlE0ODAyIgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgVEkKKwkgIEJRNDgwMiBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtYnE0ODAyLgorCitjb25maWcgUlRDX0RSVl9SUDVDMDEKKwl0cmlzdGF0ZSAiUmljb2ggUlA1QzAxIgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgUmljb2ggUlA1QzAxCisJICB0aW1la2VlcGluZyBjaGlwLiBJdCBpcyB1c2VkIGluIHNvbWUgQW1pZ2EgbW9kZWxzIChlLmcuIEEzMDAwCisJICBhbmQgQTQwMDApLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1ycDVjMDEuCisKK2NvbmZpZyBSVENfRFJWX1YzMDIwCisJdHJpc3RhdGUgIkVNIE1pY3JvZWxlY3Ryb25pYyBWMzAyMCIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIEVNIE1pY3JvZWxlY3Ryb25pYyB2MzAyMCBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtdjMwMjAuCisKK2NvbmZpZyBSVENfRFJWX1dNODMxWAorCXRyaXN0YXRlICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzF4IFJUQyIKKwlkZXBlbmRzIG9uIE1GRF9XTTgzMVgKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgUlRDIHN1YnN5c3RlbQorCSAgb2YgdGhlIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTgzMVggc2VyaWVzIFBNSUNzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkICJydGMtd204MzF4Ii4KKworY29uZmlnIFJUQ19EUlZfV004MzUwCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTgzNTAgUlRDIgorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgc3Vic3lzdGVtCisJICBvZiB0aGUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODM1MC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCAicnRjLXdtODM1MCIuCisKK2NvbmZpZyBSVENfRFJWX1NQRUFSCisJdHJpc3RhdGUgIlNQRUFSIFNUIFJUQyIKKwlkZXBlbmRzIG9uIFBMQVRfU1BFQVIKKwlkZWZhdWx0IHkKKwloZWxwCisJIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgUlRDIGZvdW5kIG9uCisJIHNwZWFyCisKK2NvbmZpZyBSVENfRFJWX1BDRjUwNjMzCisJZGVwZW5kcyBvbiBNRkRfUENGNTA2MzMKKwl0cmlzdGF0ZSAiTlhQIFBDRjUwNjMzIFJUQyIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBzdWJzeXN0ZW0gb2YgdGhlCisJICBOWFAgUENGNTA2MzMgdXNlZCBpbiBlbWJlZGRlZCBzeXN0ZW1zLgorCitjb25maWcgUlRDX0RSVl9BQjMxMDAKKwl0cmlzdGF0ZSAiU1QtRXJpY3Nzb24gQUIzMTAwIFJUQyIKKwlkZXBlbmRzIG9uIEFCMzEwMF9DT1JFCisJZGVmYXVsdCB5IGlmIEFCMzEwMF9DT1JFCisJaGVscAorCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIHRoZSBTVC1Fcmljc3NvbiBBQjMxMDAgTWl4ZWQgU2lnbmFsIElDIFJUQworCSAgc3VwcG9ydC4gVGhpcyBjaGlwIGNvbnRhaW5zIGEgYmF0dGVyeS0gYW5kIGNhcGFjaXRvci1iYWNrZWQgUlRDLgorCitjb25maWcgUlRDX0RSVl9BQjg1MDAKKwl0cmlzdGF0ZSAiU1QtRXJpY3Nzb24gQUI4NTAwIFJUQyIKKwlkZXBlbmRzIG9uIEFCODUwMF9DT1JFCisJaGVscAorCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIHRoZSBTVC1Fcmljc3NvbiBBQjg1MDAgcG93ZXIgbWFuYWdlbWVudCBJQyBSVEMKKwkgIHN1cHBvcnQuIFRoaXMgY2hpcCBjb250YWlucyBhIGJhdHRlcnktIGFuZCBjYXBhY2l0b3ItYmFja2VkIFJUQy4KKworY29uZmlnIFJUQ19EUlZfTlVDOTAwCisJdHJpc3RhdGUgIk5VQzkxMC9OVUM5MjAgUlRDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBBUkNIX1c5MFg5MDAKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBzdWJzeXN0ZW0gb2YgdGhlCisJICBOVUM5MTAvTlVDOTIwIHVzZWQgaW4gZW1iZWRkZWQgc3lzdGVtcy4KKworY29tbWVudCAib24tQ1BVIFJUQyBkcml2ZXJzIgorCitjb25maWcgUlRDX0RSVl9EQVZJTkNJCisJdHJpc3RhdGUgIlRJIERhVmluY2kgUlRDIgorCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJX0RNMzY1CisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgb24gdGhlCisJICBEYVZpbmNpIHBsYXRmb3JtcyAoRE0zNjUpLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kYXZpbmNpLgorCitjb25maWcgUlRDX0RSVl9PTUFQCisJdHJpc3RhdGUgIlRJIE9NQVAxIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMTVYWCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMCB8fCBBUkNIX0RBVklOQ0lfREE4WFgKKwloZWxwCisJICBTYXkgInllcyIgaGVyZSB0byBzdXBwb3J0IHRoZSByZWFsIHRpbWUgY2xvY2sgb24gVEkgT01BUDEgYW5kCisJICBEQTh4eC9PTUFQLUwxM3ggY2hpcHMuICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhCisJICBtb2R1bGUgY2FsbGVkIHJ0Yy1vbWFwLgorCitjb25maWcgSEFWRV9TM0NfUlRDCisJYm9vbAorCWhlbHAKKwkgIFRoaXMgd2lsbCBpbmNsdWRlIFJUQyBzdXBwb3J0IGZvciBTYW1zdW5nIFNvQ3MuIElmCisJICB5b3Ugd2FudCB0byBpbmNsdWRlIFJUQyBzdXBwb3J0IGZvciBhbnkgbWFjaGluZSwga2luZGx5CisJICBzZWxlY3QgdGhpcyBpbiB0aGUgcmVzcGVjdGl2ZSBtYWNoLVhYWFgvS2NvbmZpZyBmaWxlLgorCitjb25maWcgUlRDX0RSVl9TM0MKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBTM0Mgc2VyaWVzIFNvQyBSVEMiCisJZGVwZW5kcyBvbiBBUkNIX1MzQzY0WFggfHwgSEFWRV9TM0NfUlRDCisJaGVscAorCSAgUlRDIChSZWFsdGltZSBDbG9jaykgZHJpdmVyIGZvciB0aGUgY2xvY2sgaW5idWlsdCBpbnRvIHRoZQorCSAgU2Ftc3VuZyBTM0MyNFhYIHNlcmllcyBvZiBTb0NzLiBUaGlzIGNhbiBwcm92aWRlIHBlcmlvZGljCisJICBpbnRlcnJ1cHQgcmF0ZXMgZnJvbSAxSHogdG8gNjRIeiBmb3IgdXNlciBwcm9ncmFtcywgYW5kCisJICB3YWtldXAgZnJvbSBBbGFybS4KKworCSAgVGhlIGRyaXZlciBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIGNvbW1vbiBmZWF0dXJlcyBvbiBhbGwgdGhlCisJICBTM0MyNFhYIHJhbmdlLCBzdWNoIGFzIHRoZSBTM0MyNDEwLCBTM0MyNDEyLCBTM0MyNDEzLCBTM0MyNDQwCisJICBhbmQgUzNDMjQ0Mi4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtczNjLgorCitjb25maWcgUlRDX0RSVl9FUDkzWFgKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIEVQOTNYWCIKKwlkZXBlbmRzIG9uIEFSQ0hfRVA5M1hYCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgUlRDIGVtYmVkZGVkIGluIHRoZSBDaXJydXMgTG9naWMgRVA5M1hYIHByb2Nlc3NvcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWVwOTN4eC4KKworY29uZmlnIFJUQ19EUlZfU0ExMTAwCisJdHJpc3RhdGUgIlNBMTF4MC9QWEEyeHgvUFhBOTEwIgorCWRlcGVuZHMgb24gQVJDSF9TQTExMDAgfHwgQVJDSF9QWEEgfHwgQVJDSF9NTVAKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgYWNjZXNzIHRvIHRoZSByZWFsIHRpbWUgY2xvY2sKKwkgIGJ1aWx0IGludG8geW91ciBTQTExeDAgb3IgUFhBMnh4IENQVS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcnRjLXNhMTEwMC4KKworY29uZmlnIFJUQ19EUlZfU0gKKwl0cmlzdGF0ZSAiU3VwZXJIIE9uLUNoaXAgUlRDIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFNVUEVSSCAmJiBIQVZFX0NMSworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBvbi1jaGlwIFJUQyBmb3VuZCBpbgorCSAgbW9zdCBTdXBlckggcHJvY2Vzc29ycy4KKworIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJ0Yy1zaC4KKworY29uZmlnIFJUQ19EUlZfVlI0MVhYCisJdHJpc3RhdGUgIk5FQyBWUjQxWFgiCisJZGVwZW5kcyBvbiBDUFVfVlI0MVhYCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrCisJICBidWlsdCBpbnRvIHlvdXIgTkVDIFZSNDFYWCBDUFUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJ0Yy12cjQxeHguCisKK2NvbmZpZyBSVENfRFJWX1BMMDMwCisJdHJpc3RhdGUgIkFSTSBBTUJBIFBMMDMwIFJUQyIKKwlkZXBlbmRzIG9uIEFSTV9BTUJBCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IGFjY2VzcyB0byBBUk0gQU1CQQorCSAgUHJpbWVDZWxsIFBMMDMwIFJUQyBmb3VuZCBvbiBjZXJ0YWluIEFSTSBTT0NzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGMtcGwwMzAuCisKK2NvbmZpZyBSVENfRFJWX1BMMDMxCisJdHJpc3RhdGUgIkFSTSBBTUJBIFBMMDMxIFJUQyIKKwlkZXBlbmRzIG9uIEFSTV9BTUJBCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IGFjY2VzcyB0byBBUk0gQU1CQQorCSAgUHJpbWVDZWxsIFBMMDMxIFJUQyBmb3VuZCBvbiBjZXJ0YWluIEFSTSBTT0NzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGMtcGwwMzEuCisKK2NvbmZpZyBSVENfRFJWX0FUMzJBUDcwMFgKKwl0cmlzdGF0ZSAiQVQzMkFQNzAwWCBzZXJpZXMgUlRDIgorCWRlcGVuZHMgb24gUExBVEZPUk1fQVQzMkFQCisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgaW50ZXJuYWwgUlRDIChSZWFsdGltZSBDbG9jaykgb24gQXRtZWwgQVZSMzIKKwkgIEFUMzJBUDcwMHggZmFtaWx5IHByb2Nlc3NvcnMuCisKK2NvbmZpZyBSVENfRFJWX0FUOTFSTTkyMDAKKwl0cmlzdGF0ZSAiQVQ5MVJNOTIwMCBvciBzb21lIEFUOTFTQU05IFJUQyIKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVJNOTIwMCB8fCBBUkNIX0FUOTFTQU05UkwgfHwgQVJDSF9BVDkxU0FNOUc0NQorCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIGludGVybmFsIFJUQyAoUmVhbHRpbWUgQ2xvY2spIG1vZHVsZSBmb3VuZCBvbgorCSAgQXRtZWwgQVQ5MVJNOTIwMCdzIGFuZCBzb21lICBBVDkxU0FNOSBjaGlwcy4gT24gQVQ5MVNBTTkgY2hpcHMKKwkgIHRoaXMgaXMgcG93ZXJlZCBieSB0aGUgYmFja3VwIHBvd2VyIHN1cHBseS4KKworY29uZmlnIFJUQ19EUlZfQVQ5MVNBTTkKKwl0cmlzdGF0ZSAiQVQ5MVNBTTl4L0FUOTFDQVA5IFJUVCBhcyBSVEMiCisJZGVwZW5kcyBvbiBBUkNIX0FUOTEgJiYgIShBUkNIX0FUOTFSTTkyMDAgfHwgQVJDSF9BVDkxWDQwKQorCWhlbHAKKwkgIFJUQyBkcml2ZXIgZm9yIHRoZSBBdG1lbCBBVDkxU0FNOXggYW5kIEFUOTFDQVA5IGludGVybmFsIFJUVAorCSAgKFJlYWwgVGltZSBUaW1lcikuIFRoZXNlIHRpbWVycyBhcmUgcG93ZXJlZCBieSB0aGUgYmFja3VwIHBvd2VyCisJICBzdXBwbHkgKHN1Y2ggYXMgYSBzbWFsbCBjb2luIGNlbGwgYmF0dGVyeSksIGJ1dCBkbyBub3QgbmVlZCB0bworCSAgYmUgdXNlZCBhcyBSVENzLgorCisJICAoT24gQVQ5MVNBTTlybCBhbmQgQVQ5MVNBTTlHNDUgY2hpcHMgeW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIHRoZQorCSAgZGVkaWNhdGVkIFJUQyBtb2R1bGUgYW5kIGxlYXZlIHRoZSBSVFQgYXZhaWxhYmxlIGZvciBvdGhlciB1c2VzLikKKworY29uZmlnIFJUQ19EUlZfQVQ5MVNBTTlfUlRUCisJaW50CisJcmFuZ2UgMCAxCisJZGVmYXVsdCAwCisJcHJvbXB0ICJSVFQgbW9kdWxlIE51bWJlciIgaWYgQVJDSF9BVDkxU0FNOTI2MworCWRlcGVuZHMgb24gUlRDX0RSVl9BVDkxU0FNOQorCWhlbHAKKwkgIE1vcmUgdGhhbiBvbmUgUlRUIG1vZHVsZSBpcyBhdmFpbGFibGUuIFlvdSBjYW4gY2hvb3NlIHdoaWNoCisJICBvbmUgd2lsbCBiZSB1c2VkIGFzIGFuIFJUQy4gVGhlIGRlZmF1bHQgb2YgemVybyBpcyBub3JtYWxseQorCSAgT0sgdG8gdXNlLCB0aG91Z2ggc29tZSBzeXN0ZW1zIHVzZSB0aGF0IGZvciBub24tUlRDIHB1cnBvc2VzLgorCitjb25maWcgUlRDX0RSVl9BVDkxU0FNOV9HUEJSCisJaW50CisJcmFuZ2UgMCAzIGlmICFBUkNIX0FUOTFTQU05MjYzCisJcmFuZ2UgMCAxNSBpZiBBUkNIX0FUOTFTQU05MjYzCisJZGVmYXVsdCAwCisJcHJvbXB0ICJCYWNrdXAgUmVnaXN0ZXIgTnVtYmVyIgorCWRlcGVuZHMgb24gUlRDX0RSVl9BVDkxU0FNOQorCWhlbHAKKwkgIFRoZSBSVEMgZHJpdmVyIG5lZWRzIHRvIHVzZSBvbmUgb2YgdGhlIEdlbmVyYWwgUHVycG9zZSBCYWNrdXAKKwkgIFJlZ2lzdGVycyAoR1BCUnMpIGFzIHdlbGwgYXMgdGhlIFJUVC4gWW91IGNhbiBjaG9vc2Ugd2hpY2ggb25lCisJICB3aWxsIGJlIHVzZWQuIFRoZSBkZWZhdWx0IG9mIHplcm8gaXMgbm9ybWFsbHkgT0sgdG8gdXNlLCBidXQKKwkgIG9uIHNvbWUgc3lzdGVtcyBvdGhlciBzb2Z0d2FyZSBuZWVkcyB0byB1c2UgdGhhdCByZWdpc3Rlci4KKworY29uZmlnIFJUQ19EUlZfQVUxWFhYCisJdHJpc3RhdGUgIkF1MXh4eCBDb3VudGVyMCBSVEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBBdTF4eHggb24tY2hpcCBDb3VudGVyMCAoVGltZS1PZi1ZZWFyCisJICBjb3VudGVyKSB0byBiZSB1c2VkIGFzIGEgUlRDLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1hdTF4eHguCisKK2NvbmZpZyBSVENfRFJWX0JGSU4KKwl0cmlzdGF0ZSAiQmxhY2tmaW4gT24tQ2hpcCBSVEMiCisJZGVwZW5kcyBvbiBCTEFDS0ZJTiAmJiAhQkY1NjEKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIEJsYWNrZmluIE9uLUNoaXAgUmVhbCBUaW1lIENsb2NrLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1iZmluLgorCitjb25maWcgUlRDX0RSVl9SUzVDMzEzCisJdHJpc3RhdGUgIlJpY29oIFJTNUMzMTMiCisJZGVwZW5kcyBvbiBTSF9MQU5ESVNLCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSaWNvaCBSUzVDMzEzIFJUQyBjaGlwcy4KKworY29uZmlnIFJUQ19EUlZfR0VORVJJQworCXRyaXN0YXRlICJHZW5lcmljIFJUQyBzdXBwb3J0IgorCSMgUGxlYXNlIGNvbnNpZGVyIHdyaXRpbmcgYSBuZXcgUlRDIGRyaXZlciBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBnZW5lcmljCisJIyBSVEMgYWJzdHJhY3Rpb24KKwlkZXBlbmRzIG9uIFBBUklTQyB8fCBNNjhLIHx8IFBQQyB8fCBTVVBFUkgzMgorCWhlbHAKKwkgIFNheSBZIG9yIE0gaGVyZSB0byBlbmFibGUgUlRDIHN1cHBvcnQgb24gc3lzdGVtcyB1c2luZyB0aGUgZ2VuZXJpYworCSAgUlRDIGFic3RyYWN0aW9uLiBJZiB5b3UgZG8gbm90IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCB5b3Ugc2hvdWxkCisJICBqdXN0IHNheSBZLgorCitjb25maWcgUlRDX0RSVl9QWEEKKyAgICAgICB0cmlzdGF0ZSAiUFhBMjd4L1BYQTN4eCIKKyAgICAgICBkZXBlbmRzIG9uIEFSQ0hfUFhBCisgICAgICAgaGVscAorICAgICAgICAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrCisgICAgICAgICBidWlsdCBpbnRvIHlvdXIgUFhBMjd4IG9yIFBYQTN4eCBDUFUuCisKKyAgICAgICAgIFRoaXMgUlRDIGRyaXZlciB1c2VzIFBYQSBSVEMgcmVnaXN0ZXJzIGF2YWlsYWJsZSBzaW5jZSBweGEyN3gKKyAgICAgICAgIHNlcmllcyAoUkR4UiwgUll4UikgaW5zdGVhZCBvZiBsZWdhY3kgUkNOUiwgUlRBUi4KKworY29uZmlnIFJUQ19EUlZfVlQ4NTAwCisJdHJpc3RhdGUgIlZJQS9Xb25kZXJNZWRpYSA4NXh4IFNvQyBSVEMiCisJZGVwZW5kcyBvbiBBUkNIX1ZUODUwMAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBhY2Nlc3MgdG8gdGhlIHJlYWwgdGltZSBjbG9jaworCSAgYnVpbHQgaW50byB5b3VyIFZJQSBWVDg1MDAgU29DIG9yIGl0cyByZWxhdGl2ZXMuCisKKworY29uZmlnIFJUQ19EUlZfU1VONFYKKwlib29sICJTVU40ViBIeXBlcnZpc29yIFJUQyIKKwlkZXBlbmRzIG9uIFNQQVJDNjQKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIEh5cGVydmlzb3IKKwkgIGJhc2VkIFJUQyBvbiBTVU40ViBzeXN0ZW1zLgorCitjb25maWcgUlRDX0RSVl9TVEFSRklSRQorCWJvb2wgIlN0YXJmaXJlIFJUQyIKKwlkZXBlbmRzIG9uIFNQQVJDNjQKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBmb3VuZCBvbgorCSAgU3RhcmZpcmUgc3lzdGVtcy4KKworY29uZmlnIFJUQ19EUlZfVFg0OTM5CisJdHJpc3RhdGUgIlRYNDkzOSBTb0MiCisJZGVwZW5kcyBvbiBTT0NfVFg0OTM5CisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgaW50ZXJuYWwgUlRDIChSZWFsdGltZSBDbG9jaykgbW9kdWxlIGZvdW5kIG9uCisJICBUb3NoaWJhIFRYNDkzOSBTb0MuCisKK2NvbmZpZyBSVENfRFJWX01WCisJdHJpc3RhdGUgIk1hcnZlbGwgU29DIFJUQyIKKwlkZXBlbmRzIG9uIEFSQ0hfS0lSS1dPT0QgfHwgQVJDSF9ET1ZFCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIGluLWNoaXAgUlRDCisJICB0aGF0IGNhbiBiZSBmb3VuZCBpbiBzb21lIG9mIE1hcnZlbGwncyBTb0MgZGV2aWNlcywgc3VjaCBhcworCSAgdGhlIEtpcmt3b29kIDg4RjYyODEgYW5kIDg4RjYxOTIuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW12LgorCitjb25maWcgUlRDX0RSVl9QUzMKKwl0cmlzdGF0ZSAiUFMzIFJUQyIKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgUlRDIG9uIFBTMy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtcHMzLgorCitjb25maWcgUlRDX0RSVl9DT0g5MDEzMzEKKwl0cmlzdGF0ZSAiU1QtRXJpY3Nzb24gQ09IIDkwMSAzMzEgUlRDIgorCWRlcGVuZHMgb24gQVJDSF9VMzAwCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IGFjY2VzcyB0byBTVC1Fcmljc3NvbgorCSAgQ09IIDkwMSAzMzEgUlRDIGNsb2NrIGZvdW5kIGluIHNvbWUgU1QtRXJpY3Nzb24gTW9iaWxlCisJICBQbGF0Zm9ybXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgInJ0Yy1jb2g5MDEzMzEiLgorCisKK2NvbmZpZyBSVENfRFJWX1NUTVAKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIFNUTVAzeHh4L2kuTVgyMy9pLk1YMjggUlRDIgorCWRlcGVuZHMgb24gQVJDSF9NWFMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgb25ib2FyZAorCSAgU1RNUDN4eHgvaS5NWDIzL2kuTVgyOCBSVEMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXN0bXAzeHh4LgorCitjb25maWcgUlRDX0RSVl9QQ0FQCisJdHJpc3RhdGUgIlBDQVAgUlRDIgorCWRlcGVuZHMgb24gRVpYX1BDQVAKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBmb3VuZCBvbgorCSAgdGhlIFBDQVAyIEFTSUMgdXNlZCBvbiBzb21lIE1vdG9yb2xhIHBob25lcy4KKworY29uZmlnIFJUQ19EUlZfTUMxM1hYWAorCWRlcGVuZHMgb24gTUZEX01DMTNYWFgKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1DMTN4eHggUlRDIgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUlRDcyBmb3VuZCBvbiBGcmVlc2NhbGUncyBQTUlDcworCSAgTUMxMzc4MyBhbmQgTUMxMzg5Mi4KKworY29uZmlnIFJUQ19EUlZfTVBDNTEyMQorCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDNTEyMSBidWlsdC1pbiBSVEMiCisJZGVwZW5kcyBvbiBQUENfTVBDNTEyeCB8fCBQUENfTVBDNTJ4eAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgYnVpbHQtaW4gUlRDIG9uIE1QQzUxMjEgb3Igb24gTVBDNTIwMC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtbXBjNTEyMS4KKworY29uZmlnIFJUQ19EUlZfSlo0NzQwCisJdHJpc3RhdGUgIkluZ2VuaWMgSlo0NzQwIFNvQyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEluZ2VuaWMgSlo0NzQwIFNvQyBSVEMKKwkgIGNvbnRyb2xsZXIuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWxsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1qejQ3NDAuCisKK2NvbmZpZyBSVENfRFJWX0xQQzMyWFgKKwlkZXBlbmRzIG9uIEFSQ0hfTFBDMzJYWAorCXRyaXN0YXRlICJOWFAgTFBDMzJYWCBSVEMiCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBOWFAgUlRDIGluIHRoZSBMUEMzMlhYCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWxsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1scGMzMnh4LgorCitjb25maWcgUlRDX0RSVl9QTThYWFgKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gUE1JQzhYWFggUlRDIgorCWRlcGVuZHMgb24gTUZEX1BNOFhYWAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFF1YWxjb21tIFBNSUM4WFhYIFJUQy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcnRjLXBtOHh4eC4KKworY29uZmlnIFJUQ19EUlZfVEVHUkEKKwl0cmlzdGF0ZSAiTlZJRElBIFRlZ3JhIEludGVybmFsIFJUQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgQVJDSF9URUdSQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFRlZ3JhIDIwMCBzZXJpZXMgaW50ZXJuYWwgUlRDIG1vZHVsZS4KKworCSAgVGhpcyBkcml2ZSBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy10ZWdyYS4KKworY29uZmlnIFJUQ19EUlZfVElMRQorCXRyaXN0YXRlICJUaWxlcmEgaHlwZXJ2aXNvciBSVEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRJTEUKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIExpbnV4IGRyaXZlciBzaWRlIG9mIHRoZSBUaWxlcmEKKwkgIGh5cGVydmlzb3IncyByZWFsLXRpbWUgY2xvY2sgaW50ZXJmYWNlLgorCitjb25maWcgUlRDX0RSVl9QVVYzCisJdHJpc3RhdGUgIlBLVW5pdHkgdjMgUlRDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX1BVVjMKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFJUQyBpbiB0aGUgUEtVbml0eS12MyBTb0NzLgorCisJICBUaGlzIGRyaXZlIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXB1djMuCisKK2NvbmZpZyBSVENfRFJWX0xPT05HU09OMQorCXRyaXN0YXRlICJsb29uZ3NvbjEgUlRDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQUNIX0xPT05HU09OMQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBsb29uZ3NvbjEgb24tY2hpcCBDb3VudGVyMCAoVGltZS1PZi1ZZWFyCisJICBjb3VudGVyKSB0byBiZSB1c2VkIGFzIGEgUlRDLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1sczF4LgorY29uZmlnIFJUQ19aWDI5NzUxMAorCXRyaXN0YXRlICJaWDI5NzUxMCBSVEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyA9IHkKKwkKK2NvbmZpZyBSVENfWlgyMzQyOTAJCisgICAgdHJpc3RhdGUgIlpYMjM0MjkwIFJUQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUlRDX0NMQVNTID0geQorCWRlcGVuZHMgb24gTUZEX1pYMjM0MjkwCisJZGVmYXVsdCB5CitlbmRpZiAjIFJUQ19DTEFTUwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2NlZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFJUQyBjbGFzcy9kcml2ZXJzLgorIworCitjY2ZsYWdzLSQoQ09ORklHX1JUQ19ERUJVRykJOj0gLURERUJVRworb2JqLSQoQ09ORklHX1JUQ19MSUIpCQkrPSBydGMtbGliLm8KK29iai0kKENPTkZJR19SVENfSENUT1NZUykJKz0gaGN0b3N5cy5vCitvYmotJChDT05GSUdfUlRDX0NMQVNTKQkJKz0gcnRjLWNvcmUubworcnRjLWNvcmUteQkJCTo9IGNsYXNzLm8gaW50ZXJmYWNlLm8KKworcnRjLWNvcmUtJChDT05GSUdfUlRDX0lOVEZfREVWKQkrPSBydGMtZGV2Lm8KK3J0Yy1jb3JlLSQoQ09ORklHX1JUQ19JTlRGX1BST0MpICs9IHJ0Yy1wcm9jLm8KK3J0Yy1jb3JlLSQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTKSArPSBydGMtc3lzZnMubworCisjIEtlZXAgdGhlIGxpc3Qgb3JkZXJlZC4KKworb2JqLSQoQ09ORklHX1JUQ19EUlZfODhQTTg2MFgpICArPSBydGMtODhwbTg2MHgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQUIzMTAwKQkrPSBydGMtYWIzMTAwLm8KK29iai0kKENPTkZJR19SVENfRFJWX0FCODUwMCkJKz0gcnRjLWFiODUwMC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9BVDMyQVA3MDBYKSs9IHJ0Yy1hdDMyYXA3MDB4Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0FUOTFSTTkyMDApKz0gcnRjLWF0OTFybTkyMDAubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQ5MVNBTTkpCSs9IHJ0Yy1hdDkxc2FtOS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9BVTFYWFgpCSs9IHJ0Yy1hdTF4eHgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQkZJTikJKz0gcnRjLWJmaW4ubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQlEzMkspCSs9IHJ0Yy1icTMyay5vCitvYmotJChDT05GSUdfUlRDX0RSVl9CUTQ4MDIpCSs9IHJ0Yy1icTQ4MDIubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQ01PUykJKz0gcnRjLWNtb3Mubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQ09IOTAxMzMxKQkrPSBydGMtY29oOTAxMzMxLm8KK29iai0kKENPTkZJR19SVENfRFJWX0RBOTA1MikJKz0gcnRjLWRhOTA1Mi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EQVZJTkNJKQkrPSBydGMtZGF2aW5jaS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9ETTM1NUVWTSkJKz0gcnRjLWRtMzU1ZXZtLm8KK29iai0kKENPTkZJR19SVENfRFJWX1ZSVEMpCSs9IHJ0Yy1tcnN0Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTIxNikJKz0gcnRjLWRzMTIxNi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzEyODYpCSs9IHJ0Yy1kczEyODYubworb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxMzAyKQkrPSBydGMtZHMxMzAyLm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTMwNSkJKz0gcnRjLWRzMTMwNS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzEzMDcpCSs9IHJ0Yy1kczEzMDcubworb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxMzc0KQkrPSBydGMtZHMxMzc0Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTM5MCkJKz0gcnRjLWRzMTM5MC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzE1MTEpCSs9IHJ0Yy1kczE1MTEubworb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNTUzKQkrPSBydGMtZHMxNTUzLm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTY3MikJKz0gcnRjLWRzMTY3Mi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzE3NDIpCSs9IHJ0Yy1kczE3NDIubworb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMzMjMyKQkrPSBydGMtZHMzMjMyLm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMzIzNCkJKz0gcnRjLWRzMzIzNC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9FRkkpCSs9IHJ0Yy1lZmkubworb2JqLSQoQ09ORklHX1JUQ19EUlZfRU0zMDI3KQkrPSBydGMtZW0zMDI3Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0VQOTNYWCkJKz0gcnRjLWVwOTN4eC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9GTTMxMzApCSs9IHJ0Yy1mbTMxMzAubworb2JqLSQoQ09ORklHX1JUQ19EUlZfR0VORVJJQykJKz0gcnRjLWdlbmVyaWMubworb2JqLSQoQ09ORklHX1JUQ19EUlZfSU1YREkpCSs9IHJ0Yy1pbXhkaS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9JU0wxMjA4KQkrPSBydGMtaXNsMTIwOC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9JU0wxMjAyMikJKz0gcnRjLWlzbDEyMDIyLm8KK29iai0kKENPTkZJR19SVENfRFJWX0paNDc0MCkJKz0gcnRjLWp6NDc0MC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9MUEMzMlhYKQkrPSBydGMtbHBjMzJ4eC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9MT09OR1NPTjEpCSs9IHJ0Yy1sczF4Lm8KK29iai0kKENPTkZJR19SVENfRFJWX000MVQ4MCkJKz0gcnRjLW00MXQ4MC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NNDFUOTMpCSs9IHJ0Yy1tNDF0OTMubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQxVDk0KQkrPSBydGMtbTQxdDk0Lm8KK29iai0kKENPTkZJR19SVENfRFJWX000OFQzNSkJKz0gcnRjLW00OHQzNS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NNDhUNTkpCSs9IHJ0Yy1tNDh0NTkubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQ4VDg2KQkrPSBydGMtbTQ4dDg2Lm8KK29iai0kKENPTkZJR19SVENfTVhDKQkJKz0gcnRjLW14Yy5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NQVg2OTAwKQkrPSBydGMtbWF4NjkwMC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NQVg4OTI1KQkrPSBydGMtbWF4ODkyNS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NQVg4OTk4KQkrPSBydGMtbWF4ODk5OC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NQVg2OTAyKQkrPSBydGMtbWF4NjkwMi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NQzEzWFhYKQkrPSBydGMtbWMxM3h4eC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NU002MjQyKQkrPSBydGMtbXNtNjI0Mi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NUEM1MTIxKQkrPSBydGMtbXBjNTEyMS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NVikJKz0gcnRjLW12Lm8KK29iai0kKENPTkZJR19SVENfRFJWX05VQzkwMCkJKz0gcnRjLW51YzkwMC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9PTUFQKQkrPSBydGMtb21hcC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QQ0FQKQkrPSBydGMtcGNhcC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzKQkrPSBydGMtcGNmODU2My5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzKQkrPSBydGMtcGNmODU4My5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QQ0YyMTIzKQkrPSBydGMtcGNmMjEyMy5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y1MDYzMykJKz0gcnRjLXBjZjUwNjMzLm8KK29iai0kKENPTkZJR19SVENfRFJWX1BMMDMwKQkrPSBydGMtcGwwMzAubworb2JqLSQoQ09ORklHX1JUQ19EUlZfUEwwMzEpCSs9IHJ0Yy1wbDAzMS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QTThYWFgpCSs9IHJ0Yy1wbTh4eHgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfUFMzKQkrPSBydGMtcHMzLm8KK29iai0kKENPTkZJR19SVENfRFJWX1BVVjMpCSs9IHJ0Yy1wdXYzLm8KK29iai0kKENPTkZJR19SVENfRFJWX1BYQSkJKz0gcnRjLXB4YS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9SOTcwMSkJKz0gcnRjLXI5NzAxLm8KK29iai0kKENPTkZJR19SVENfRFJWX1JQNUMwMSkJKz0gcnRjLXJwNWMwMS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzEzKQkrPSBydGMtcnM1YzMxMy5vCitvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzQ4KQkrPSBydGMtcnM1YzM0OC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzcyKQkrPSBydGMtcnM1YzM3Mi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9SVjMwMjlDMikJKz0gcnRjLXJ2MzAyOWMyLm8KK29iai0kKENPTkZJR19SVENfRFJWX1JYODAyNSkJKz0gcnRjLXJ4ODAyNS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9SWDg1ODEpCSs9IHJ0Yy1yeDg1ODEubworb2JqLSQoQ09ORklHX1JUQ19EUlZfUzM1MzkwQSkJKz0gcnRjLXMzNTM5MGEubworb2JqLSQoQ09ORklHX1JUQ19EUlZfUzNDKQkrPSBydGMtczNjLm8KK29iai0kKENPTkZJR19SVENfRFJWX1NBMTEwMCkJKz0gcnRjLXNhMTEwMC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9TSCkJKz0gcnRjLXNoLm8KK29iai0kKENPTkZJR19SVENfRFJWX1NQRUFSKQkrPSBydGMtc3BlYXIubworb2JqLSQoQ09ORklHX1JUQ19EUlZfU1RBUkZJUkUpCSs9IHJ0Yy1zdGFyZmlyZS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCkJKz0gcnRjLXN0azE3dGE4Lm8KK29iai0kKENPTkZJR19SVENfRFJWX1NUTVApCSs9IHJ0Yy1zdG1wM3h4eC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9TVU40VikJKz0gcnRjLXN1bjR2Lm8KK29iai0kKENPTkZJR19SVENfRFJWX1RFR1JBKQkrPSBydGMtdGVncmEubworb2JqLSQoQ09ORklHX1JUQ19EUlZfVEVTVCkJKz0gcnRjLXRlc3Qubworb2JqLSQoQ09ORklHX1JUQ19EUlZfVElMRSkJKz0gcnRjLXRpbGUubworb2JqLSQoQ09ORklHX1JUQ19EUlZfVFdMNDAzMCkJKz0gcnRjLXR3bC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9UWDQ5MzkpCSs9IHJ0Yy10eDQ5Mzkubworb2JqLSQoQ09ORklHX1JUQ19EUlZfVjMwMjApCSs9IHJ0Yy12MzAyMC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9WUjQxWFgpCSs9IHJ0Yy12cjQxeHgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfVlQ4NTAwKQkrPSBydGMtdnQ4NTAwLm8KK29iai0kKENPTkZJR19SVENfRFJWX1dNODMxWCkJKz0gcnRjLXdtODMxeC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9XTTgzNTApCSs9IHJ0Yy13bTgzNTAubworb2JqLSQoQ09ORklHX1JUQ19EUlZfWDEyMDUpCSs9IHJ0Yy14MTIwNS5vCitvYmotJChDT05GSUdfUlRDX1pYMjk3NTEwKSArPSB6eDI5NzUxMC1ydGMubworb2JqLSQoQ09ORklHX1JUQ19aWDIzNDI5MCkgKz0gengyMzQyOTAtcnRjLm8KZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL2NsYXNzLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9jbGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNGMyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9jbGFzcy5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogUlRDIHN1YnN5c3RlbSwgYmFzZSBjbGFzcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUb3dlciBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+CisgKgorICogY2xhc3Mgc2tlbGV0b24gZnJvbSBkcml2ZXJzL2h3bW9uL2h3bW9uLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgInJ0Yy1jb3JlLmgiCisKKworc3RhdGljIERFRklORV9JREEocnRjX2lkYSk7CitzdHJ1Y3QgY2xhc3MgKnJ0Y19jbGFzczsKKworc3RhdGljIHZvaWQgcnRjX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gdG9fcnRjX2RldmljZShkZXYpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZydGNfaWRhLCBydGMtPmlkKTsKKwlrZnJlZShydGMpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSkKKworLyoKKyAqIE9uIHN1c3BlbmQoKSwgbWVhc3VyZSB0aGUgZGVsdGEgYmV0d2VlbiBvbmUgUlRDIGFuZCB0aGUKKyAqIHN5c3RlbSdzIHdhbGwgY2xvY2s7IHJlc3RvcmUgaXQgb24gcmVzdW1lKCkuCisgKi8KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBvbGRfcnRjLCBvbGRfc3lzdGVtLCBvbGRfZGVsdGE7CisKKworc3RhdGljIGludCBydGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXN0cnVjdCBydGNfZGV2aWNlCSpydGMgPSB0b19ydGNfZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y190aW1lCQl0bTsKKwlzdHJ1Y3QgdGltZXNwZWMJCWRlbHRhLCBkZWx0YV9kZWx0YTsKKwlpZiAoc3RyY21wKGRldl9uYW1lKCZydGMtPmRldiksIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpICE9IDApCisJCXJldHVybiAwOworCisJLyogc25hcHNob3QgdGhlIGN1cnJlbnQgUlRDIGFuZCBzeXN0ZW0gdGltZSBhdCBzdXNwZW5kKi8KKwlydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKKwlnZXRuc3RpbWVvZmRheSgmb2xkX3N5c3RlbSk7CisJcnRjX3RtX3RvX3RpbWUoJnRtLCAmb2xkX3J0Yy50dl9zZWMpOworCisKKwkvKgorCSAqIFRvIGF2b2lkIGRyaWZ0IGNhdXNlZCBieSByZXBlYXRlZCBzdXNwZW5kL3Jlc3VtZXMsCisJICogd2hpY2ggZWFjaCBjYW4gYWRkIH4xIHNlY29uZCBkcmlmdCBlcnJvciwKKwkgKiB0cnkgdG8gY29tcGVuc2F0ZSBzbyB0aGUgZGlmZmVyZW5jZSBpbiBzeXN0ZW0gdGltZQorCSAqIGFuZCBydGMgdGltZSBzdGF5cyBjbG9zZSB0byBjb25zdGFudC4KKwkgKi8KKwlkZWx0YSA9IHRpbWVzcGVjX3N1YihvbGRfc3lzdGVtLCBvbGRfcnRjKTsKKwlkZWx0YV9kZWx0YSA9IHRpbWVzcGVjX3N1YihkZWx0YSwgb2xkX2RlbHRhKTsKKwlpZiAoZGVsdGFfZGVsdGEudHZfc2VjIDwgLTIgfHwgZGVsdGFfZGVsdGEudHZfc2VjID49IDIpIHsKKwkJLyoKKwkJICogaWYgZGVsdGFfZGVsdGEgaXMgdG9vIGxhcmdlLCBhc3N1bWUgdGltZSBjb3JyZWN0aW9uCisJCSAqIGhhcyBvY2N1cmVkIGFuZCBzZXQgb2xkX2RlbHRhIHRvIHRoZSBjdXJyZW50IGRlbHRhLgorCQkgKi8KKwkJb2xkX2RlbHRhID0gZGVsdGE7CisJfSBlbHNlIHsKKwkJLyogT3RoZXJ3aXNlIHRyeSB0byBhZGp1c3Qgb2xkX3N5c3RlbSB0byBjb21wZW5zYXRlICovCisJCW9sZF9zeXN0ZW0gPSB0aW1lc3BlY19zdWIob2xkX3N5c3RlbSwgZGVsdGFfZGVsdGEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlCSpydGMgPSB0b19ydGNfZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y190aW1lCQl0bTsKKwlzdHJ1Y3QgdGltZXNwZWMJCW5ld19zeXN0ZW0sIG5ld19ydGM7CisJc3RydWN0IHRpbWVzcGVjCQlzbGVlcF90aW1lOworCisJaWYgKHN0cmNtcChkZXZfbmFtZSgmcnRjLT5kZXYpLCBDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qIHNuYXBzaG90IHRoZSBjdXJyZW50IHJ0YyBhbmQgc3lzdGVtIHRpbWUgYXQgcmVzdW1lICovCisJZ2V0bnN0aW1lb2ZkYXkoJm5ld19zeXN0ZW0pOworCXJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCWlmIChydGNfdmFsaWRfdG0oJnRtKSAhPSAwKSB7CisJCXByX2RlYnVnKCIlczogIGJvZ3VzIHJlc3VtZSB0aW1lXG4iLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCXJ0Y190bV90b190aW1lKCZ0bSwgJm5ld19ydGMudHZfc2VjKTsKKwluZXdfcnRjLnR2X25zZWMgPSAwOworCisJaWYgKG5ld19ydGMudHZfc2VjIDwgb2xkX3J0Yy50dl9zZWMpIHsKKwkJcHJfZGVidWcoIiVzOiAgdGltZSB0cmF2ZWwhXG4iLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogY2FsY3VsYXRlIHRoZSBSVEMgdGltZSBkZWx0YSAoc2xlZXAgdGltZSkqLworCXNsZWVwX3RpbWUgPSB0aW1lc3BlY19zdWIobmV3X3J0Yywgb2xkX3J0Yyk7CisKKwkvKgorCSAqIFNpbmNlIHRoZXNlIFJUQyBzdXNwZW5kL3Jlc3VtZSBoYW5kbGVycyBhcmUgbm90IGNhbGxlZAorCSAqIGF0IHRoZSB2ZXJ5IGVuZCBvZiBzdXNwZW5kIG9yIHRoZSBzdGFydCBvZiByZXN1bWUsCisJICogc29tZSBydW4tdGltZSBtYXkgcGFzcyBvbiBlaXRoZXIgc2lkZXMgb2YgdGhlIHNsZWVwIHRpbWUKKwkgKiBzbyBzdWJ0cmFjdCBrZXJuZWwgcnVuLXRpbWUgYmV0d2VlbiBydGNfc3VzcGVuZCB0byBydGNfcmVzdW1lCisJICogdG8ga2VlcCB0aGluZ3MgYWNjdXJhdGUuCisJICovCisJc2xlZXBfdGltZSA9IHRpbWVzcGVjX3N1YihzbGVlcF90aW1lLAorCQkJdGltZXNwZWNfc3ViKG5ld19zeXN0ZW0sIG9sZF9zeXN0ZW0pKTsKKworCWlmIChzbGVlcF90aW1lLnR2X3NlYyA+PSAwKQorCQl0aW1la2VlcGluZ19pbmplY3Rfc2xlZXB0aW1lKCZzbGVlcF90aW1lKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgcnRjX3N1c3BlbmQJTlVMTAorI2RlZmluZSBydGNfcmVzdW1lCU5VTEwKKyNlbmRpZgorCisKKy8qKgorICogcnRjX2RldmljZV9yZWdpc3RlciAtIHJlZ2lzdGVyIHcvIFJUQyBjbGFzcworICogQGRldjogdGhlIGRldmljZSB0byByZWdpc3RlcgorICoKKyAqIHJ0Y19kZXZpY2VfdW5yZWdpc3RlcigpIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGNsYXNzIGRldmljZSBpcyBubworICogbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgc3RydWN0IGNsYXNzIGRldmljZS4KKyAqLworc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXZpY2VfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyAqb3BzLAorCQkJCQlzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCBydGNfd2thbHJtIGFscm07CisJaW50IGlkLCBlcnI7CisKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZydGNfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWQgPCAwKSB7CisJCWVyciA9IGlkOworCQlnb3RvIGV4aXQ7CisJfQorCisJcnRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ0Y19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAocnRjID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X2lkYTsKKwl9CisKKwlydGMtPmlkID0gaWQ7CisJcnRjLT5vcHMgPSBvcHM7CisJcnRjLT5vd25lciA9IG93bmVyOworCXJ0Yy0+aXJxX2ZyZXEgPSAxOworCXJ0Yy0+bWF4X3VzZXJfZnJlcSA9IDY0OworCXJ0Yy0+ZGV2LnBhcmVudCA9IGRldjsKKwlydGMtPmRldi5jbGFzcyA9IHJ0Y19jbGFzczsKKwlydGMtPmRldi5yZWxlYXNlID0gcnRjX2RldmljZV9yZWxlYXNlOworCisJbXV0ZXhfaW5pdCgmcnRjLT5vcHNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnJ0Yy0+aXJxX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZydGMtPmlycV90YXNrX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0Yy0+aXJxX3F1ZXVlKTsKKworCS8qIEluaXQgdGltZXJxdWV1ZSAqLworCXRpbWVycXVldWVfaW5pdF9oZWFkKCZydGMtPnRpbWVycXVldWUpOworCUlOSVRfV09SSygmcnRjLT5pcnF3b3JrLCBydGNfdGltZXJfZG9fd29yayk7CisJLyogSW5pdCBhaWUgdGltZXIgKi8KKwlydGNfdGltZXJfaW5pdCgmcnRjLT5haWVfdGltZXIsIHJ0Y19haWVfdXBkYXRlX2lycSwgKHZvaWQgKilydGMpOworCS8qIEluaXQgdWllIHRpbWVyICovCisJcnRjX3RpbWVyX2luaXQoJnJ0Yy0+dWllX3J0Y3RpbWVyLCBydGNfdWllX3VwZGF0ZV9pcnEsICh2b2lkICopcnRjKTsKKwkvKiBJbml0IHBpZSB0aW1lciAqLworCWhydGltZXJfaW5pdCgmcnRjLT5waWVfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJcnRjLT5waWVfdGltZXIuZnVuY3Rpb24gPSBydGNfcGllX3VwZGF0ZV9pcnE7CisJcnRjLT5waWVfZW5hYmxlZCA9IDA7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW4gQUxBUk0gYWxyZWFkeSBzZXQgaW4gaHcgKi8KKwllcnIgPSBfX3J0Y19yZWFkX2FsYXJtKHJ0YywgJmFscm0pOworCisJaWYgKCFlcnIgJiYgIXJ0Y192YWxpZF90bSgmYWxybS50aW1lKSkKKwkJcnRjX2luaXRpYWxpemVfYWxhcm0ocnRjLCAmYWxybSk7CisKKwlzdHJsY3B5KHJ0Yy0+bmFtZSwgbmFtZSwgUlRDX0RFVklDRV9OQU1FX1NJWkUpOworCWRldl9zZXRfbmFtZSgmcnRjLT5kZXYsICJydGMlZCIsIGlkKTsKKworCXJ0Y19kZXZfcHJlcGFyZShydGMpOworCisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZydGMtPmRldik7CisJaWYgKGVycikgeworCQlwdXRfZGV2aWNlKCZydGMtPmRldik7CisJCWdvdG8gZXhpdF9rZnJlZTsKKwl9CisKKwlydGNfZGV2X2FkZF9kZXZpY2UocnRjKTsKKwlydGNfc3lzZnNfYWRkX2RldmljZShydGMpOworCXJ0Y19wcm9jX2FkZF9kZXZpY2UocnRjKTsKKworCWRldl9pbmZvKGRldiwgInJ0YyBjb3JlOiByZWdpc3RlcmVkICVzIGFzICVzXG4iLAorCQkJcnRjLT5uYW1lLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKKworCXJldHVybiBydGM7CisKK2V4aXRfa2ZyZWU6CisJa2ZyZWUocnRjKTsKKworZXhpdF9pZGE6CisJaWRhX3NpbXBsZV9yZW1vdmUoJnJ0Y19pZGEsIGlkKTsKKworZXhpdDoKKwlkZXZfZXJyKGRldiwgInJ0YyBjb3JlOiB1bmFibGUgdG8gcmVnaXN0ZXIgJXMsIGVyciA9ICVkXG4iLAorCQkJbmFtZSwgZXJyKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnRjX2RldmljZV9yZWdpc3Rlcik7CisKKworLyoqCisgKiBydGNfZGV2aWNlX3VucmVnaXN0ZXIgLSByZW1vdmVzIHRoZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgUlRDIGNsYXNzIGRldmljZQorICoKKyAqIEBydGM6IHRoZSBSVEMgY2xhc3MgZGV2aWNlIHRvIGRlc3Ryb3kKKyAqLwordm9pZCBydGNfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKK3sKKwlpZiAoZ2V0X2RldmljZSgmcnRjLT5kZXYpICE9IE5VTEwpIHsKKwkJbXV0ZXhfbG9jaygmcnRjLT5vcHNfbG9jayk7CisJCS8qIHJlbW92ZSBpbm5hcmRzIG9mIHRoaXMgUlRDLCB0aGVuIGRpc2FibGUgaXQsIGJlZm9yZQorCQkgKiBsZXR0aW5nIGFueSBydGNfY2xhc3Nfb3BlbigpIHVzZXJzIGFjY2VzcyBpdCBhZ2FpbgorCQkgKi8KKwkJcnRjX3N5c2ZzX2RlbF9kZXZpY2UocnRjKTsKKwkJcnRjX2Rldl9kZWxfZGV2aWNlKHJ0Yyk7CisJCXJ0Y19wcm9jX2RlbF9kZXZpY2UocnRjKTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJnJ0Yy0+ZGV2KTsKKwkJcnRjLT5vcHMgPSBOVUxMOworCQltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCQlwdXRfZGV2aWNlKCZydGMtPmRldik7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwocnRjX2RldmljZV91bnJlZ2lzdGVyKTsKKworc3RhdGljIGludCBfX2luaXQgcnRjX2luaXQodm9pZCkKK3sKKwlydGNfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJydGMiKTsKKwlpZiAoSVNfRVJSKHJ0Y19jbGFzcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgY3JlYXRlIGNsYXNzXG4iLCBfX0ZJTEVfXyk7CisJCXJldHVybiBQVFJfRVJSKHJ0Y19jbGFzcyk7CisJfQorCXJ0Y19jbGFzcy0+c3VzcGVuZCA9IHJ0Y19zdXNwZW5kOworCXJ0Y19jbGFzcy0+cmVzdW1lID0gcnRjX3Jlc3VtZTsKKwlydGNfZGV2X2luaXQoKTsKKwlydGNfc3lzZnNfaW5pdChydGNfY2xhc3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRjX2V4aXQodm9pZCkKK3sKKwlydGNfZGV2X2V4aXQoKTsKKwljbGFzc19kZXN0cm95KHJ0Y19jbGFzcyk7CisJaWRhX2Rlc3Ryb3koJnJ0Y19pZGEpOworfQorCitzdWJzeXNfaW5pdGNhbGwocnRjX2luaXQpOworbW9kdWxlX2V4aXQocnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUlRDIGNsYXNzIHN1cHBvcnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL2hjdG9zeXMuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL2hjdG9zeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzkwYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvaGN0b3N5cy5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBSVEMgc3Vic3lzdGVtLCBpbml0aWFsaXplIHN5c3RlbSB0aW1lIG9uIHN0YXJ0dXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVG93ZXIgVGVjaG5vbG9naWVzCisgKiBBdXRob3I6IEFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKy8qIElNUE9SVEFOVDogdGhlIFJUQyBvbmx5IHN0b3JlcyB3aG9sZSBzZWNvbmRzLiBJdCBpcyBhcmJpdHJhcnkKKyAqIHdoZXRoZXIgaXQgc3RvcmVzIHRoZSBtb3N0IGNsb3NlIHZhbHVlIG9yIHRoZSB2YWx1ZSB3aXRoIHBhcnRpYWwKKyAqIHNlY29uZHMgdHJ1bmNhdGVkLiBIb3dldmVyLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSB1c2UgaXQgdG8gc3RvcmUKKyAqIHRoZSB0cnVuY2F0ZWQgdmFsdWUuIFRoaXMgaXMgYmVjYXVzZSBvdGhlcndpc2UgaXQgaXMgbmVjZXNzYXJ5LAorICogaW4gYW4gcnRjIHN5bmMgZnVuY3Rpb24sIHRvIHJlYWQgYm90aCB4dGltZS50dl9zZWMgYW5kCisgKiB4dGltZS50dl9uc2VjLiBPbiBzb21lIHByb2Nlc3NvcnMgKGkuZS4gQVJNKSwgYW4gYXRvbWljIHJlYWQKKyAqIG9mID4zMmJpdHMgaXMgbm90IHBvc3NpYmxlLiBTbyBzdG9yaW5nIHRoZSBtb3N0IGNsb3NlIHZhbHVlIHdvdWxkCisgKiBzbG93IGRvd24gdGhlIHN5bmMgQVBJLiBTbyBoZXJlIHdlIGhhdmUgdGhlIHRydW5jYXRlZCB2YWx1ZSBhbmQKKyAqIHRoZSBiZXN0IGd1ZXNzIGlzIHRvIGFkZCAwLjVzLgorICovCisKK2ludCBydGNfaGN0b3N5c19yZXQgPSAtRU5PREVWOworCitzdGF0aWMgaW50IF9faW5pdCBydGNfaGN0b3N5cyh2b2lkKQoreworCWludCBlcnIgPSAtRU5PREVWOworCXN0cnVjdCBydGNfdGltZSB0bTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHYgPSB7CisJCS50dl9uc2VjID0gTlNFQ19QRVJfU0VDID4+IDEsCisJfTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcnRjX2NsYXNzX29wZW4oQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSk7CisKKwlpZiAocnRjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIG9wZW4gcnRjIGRldmljZSAoJXMpXG4iLAorCQkJX19GSUxFX18sIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpOworCQlnb3RvIGVycl9vcGVuOworCX0KKworCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihydGMtPmRldi5wYXJlbnQsCisJCQkiaGN0b3N5czogdW5hYmxlIHRvIHJlYWQgdGhlIGhhcmR3YXJlIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfcmVhZDsKKworCX0KKworCWVyciA9IHJ0Y192YWxpZF90bSgmdG0pOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihydGMtPmRldi5wYXJlbnQsCisJCQkiaGN0b3N5czogaW52YWxpZCBkYXRlL3RpbWVcbiIpOworCQlnb3RvIGVycl9pbnZhbGlkOworCX0KKworCXJ0Y190bV90b190aW1lKCZ0bSwgJnR2LnR2X3NlYyk7CisKKwlkb19zZXR0aW1lb2ZkYXkoJnR2KTsKKworCWRldl9pbmZvKHJ0Yy0+ZGV2LnBhcmVudCwKKwkJInNldHRpbmcgc3lzdGVtIGNsb2NrIHRvICIKKwkJIiVkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCBVVEMgKCV1KVxuIiwKKwkJdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksCisJCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjLAorCQkodW5zaWduZWQgaW50KSB0di50dl9zZWMpOworCitlcnJfaW52YWxpZDoKK2Vycl9yZWFkOgorCXJ0Y19jbGFzc19jbG9zZShydGMpOworCitlcnJfb3BlbjoKKwlydGNfaGN0b3N5c19yZXQgPSBlcnI7CisKKwlyZXR1cm4gZXJyOworfQorCitsYXRlX2luaXRjYWxsKHJ0Y19oY3Rvc3lzKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0MTViZAotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsOTQxIEBACisvKgorICogUlRDIHN1YnN5c3RlbSwgaW50ZXJmYWNlIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUb3dlciBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+CisgKgorICogYmFzZWQgb24gYXJjaC9hcm0vY29tbW9uL3J0Y3RpbWUuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKK3N0YXRpYyBpbnQgcnRjX3RpbWVyX2VucXVldWUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lciAqdGltZXIpOworc3RhdGljIHZvaWQgcnRjX3RpbWVyX3JlbW92ZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lcik7CisKK3N0YXRpYyBpbnQgX19ydGNfcmVhZF90aW1lKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IGVycjsKKwlpZiAoIXJ0Yy0+b3BzKQorCQllcnIgPSAtRU5PREVWOworCWVsc2UgaWYgKCFydGMtPm9wcy0+cmVhZF90aW1lKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UgeworCQltZW1zZXQodG0sIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKKwkJZXJyID0gcnRjLT5vcHMtPnJlYWRfdGltZShydGMtPmRldi5wYXJlbnQsIHRtKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IHJ0Y19yZWFkX3RpbWUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZydGMtPm9wc19sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gX19ydGNfcmVhZF90aW1lKHJ0YywgdG0pOworCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19yZWFkX3RpbWUpOworCitpbnQgcnRjX3NldF90aW1lKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IGVycjsKKworCWVyciA9IHJ0Y192YWxpZF90bSh0bSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZydGMtPm9wc19sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFydGMtPm9wcykKKwkJZXJyID0gLUVOT0RFVjsKKwllbHNlIGlmIChydGMtPm9wcy0+c2V0X3RpbWUpCisJCWVyciA9IHJ0Yy0+b3BzLT5zZXRfdGltZShydGMtPmRldi5wYXJlbnQsIHRtKTsKKwllbHNlIGlmIChydGMtPm9wcy0+c2V0X21tc3MpIHsKKwkJdW5zaWduZWQgbG9uZyBzZWNzOworCQllcnIgPSBydGNfdG1fdG9fdGltZSh0bSwgJnNlY3MpOworCQlpZiAoZXJyID09IDApCisJCQllcnIgPSBydGMtPm9wcy0+c2V0X21tc3MocnRjLT5kZXYucGFyZW50LCBzZWNzKTsKKwl9IGVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKworCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJLyogQSB0aW1lciBtaWdodCBoYXZlIGp1c3QgZXhwaXJlZCAqLworCXNjaGVkdWxlX3dvcmsoJnJ0Yy0+aXJxd29yayk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19zZXRfdGltZSk7CisKK2ludCBydGNfc2V0X21tc3Moc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YywgdW5zaWduZWQgbG9uZyBzZWNzKQoreworCWludCBlcnI7CisKKwllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJ0Yy0+b3BzX2xvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoIXJ0Yy0+b3BzKQorCQllcnIgPSAtRU5PREVWOworCWVsc2UgaWYgKHJ0Yy0+b3BzLT5zZXRfbW1zcykKKwkJZXJyID0gcnRjLT5vcHMtPnNldF9tbXNzKHJ0Yy0+ZGV2LnBhcmVudCwgc2Vjcyk7CisJZWxzZSBpZiAocnRjLT5vcHMtPnJlYWRfdGltZSAmJiBydGMtPm9wcy0+c2V0X3RpbWUpIHsKKwkJc3RydWN0IHJ0Y190aW1lIG5ldywgb2xkOworCisJCWVyciA9IHJ0Yy0+b3BzLT5yZWFkX3RpbWUocnRjLT5kZXYucGFyZW50LCAmb2xkKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQlydGNfdGltZV90b190bShzZWNzLCAmbmV3KTsKKworCQkJLyoKKwkJCSAqIGF2b2lkIHdyaXRpbmcgd2hlbiB3ZSdyZSBnb2luZyB0byBjaGFuZ2UgdGhlIGRheSBvZgorCQkJICogdGhlIG1vbnRoLiBXZSB3aWxsIHJldHJ5IGluIHRoZSBuZXh0IG1pbnV0ZS4gVGhpcworCQkJICogYmFzaWNhbGx5IG1lYW5zIHRoYXQgaWYgdGhlIFJUQyBtdXN0IG5vdCBkcmlmdAorCQkJICogYnkgbW9yZSB0aGFuIDEgbWludXRlIGluIDExIG1pbnV0ZXMuCisJCQkgKi8KKwkJCWlmICghKChvbGQudG1faG91ciA9PSAyMyAmJiBvbGQudG1fbWluID09IDU5KSB8fAorCQkJCShuZXcudG1faG91ciA9PSAyMyAmJiBuZXcudG1fbWluID09IDU5KSkpCisJCQkJZXJyID0gcnRjLT5vcHMtPnNldF90aW1lKHJ0Yy0+ZGV2LnBhcmVudCwKKwkJCQkJCSZuZXcpOworCQl9CisJfQorCWVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKworCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJLyogQSB0aW1lciBtaWdodCBoYXZlIGp1c3QgZXhwaXJlZCAqLworCXNjaGVkdWxlX3dvcmsoJnJ0Yy0+aXJxd29yayk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnRjX3NldF9tbXNzKTsKKworc3RhdGljIGludCBydGNfcmVhZF9hbGFybV9pbnRlcm5hbChzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJaW50IGVycjsKKworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcnRjLT5vcHNfbG9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChydGMtPm9wcyA9PSBOVUxMKQorCQllcnIgPSAtRU5PREVWOworCWVsc2UgaWYgKCFydGMtPm9wcy0+cmVhZF9hbGFybSkKKwkJZXJyID0gLUVJTlZBTDsKKwllbHNlIHsKKwkJbWVtc2V0KGFsYXJtLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y193a2Fscm0pKTsKKwkJZXJyID0gcnRjLT5vcHMtPnJlYWRfYWxhcm0ocnRjLT5kZXYucGFyZW50LCBhbGFybSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgX19ydGNfcmVhZF9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcnRjX3RpbWUgYmVmb3JlLCBub3c7CisJaW50IGZpcnN0X3RpbWUgPSAxOworCXVuc2lnbmVkIGxvbmcgdF9ub3csIHRfYWxtOworCWVudW0geyBub25lLCBkYXksIG1vbnRoLCB5ZWFyIH0gbWlzc2luZyA9IG5vbmU7CisJdW5zaWduZWQgZGF5czsKKworCS8qIFRoZSBsb3dlciBsZXZlbCBSVEMgZHJpdmVyIG1heSByZXR1cm4gLTEgaW4gc29tZSBmaWVsZHMsCisJICogY3JlYXRpbmcgaW52YWxpZCBhbGFybS0+dGltZSB2YWx1ZXMsIGZvciByZWFzb25zIGxpa2U6CisJICoKKwkgKiAgIC0gVGhlIGhhcmR3YXJlIG1heSBub3QgYmUgY2FwYWJsZSBvZiBmaWxsaW5nIHRoZW0gaW47CisJICogICAgIG1hbnkgYWxhcm1zIG1hdGNoIG9ubHkgb24gdGltZS1vZi1kYXkgZmllbGRzLCBub3QKKwkgKiAgICAgZGF5L21vbnRoL3llYXIgY2FsZW5kYXIgZGF0YS4KKwkgKgorCSAqICAgLSBTb21lIGhhcmR3YXJlIHVzZXMgaWxsZWdhbCB2YWx1ZXMgYXMgIndpbGRjYXJkIiBtYXRjaAorCSAqICAgICB2YWx1ZXMsIHdoaWNoIG5vbi1MaW51eCBmaXJtd2FyZSAobGlrZSBhIEJJT1MpIG1heSB0cnkKKwkgKiAgICAgdG8gc2V0IHVwIGFzIGUuZy4gImFsYXJtIDE1IG1pbnV0ZXMgYWZ0ZXIgZWFjaCBob3VyIi4KKwkgKiAgICAgTGludXggdXNlcyBvbmx5IG9uZXNob3QgYWxhcm1zLgorCSAqCisJICogV2hlbiB3ZSBzZWUgdGhhdCBoZXJlLCB3ZSBkZWFsIHdpdGggaXQgYnkgdXNpbmcgdmFsdWVzIGZyb20KKwkgKiBhIGN1cnJlbnQgUlRDIHRpbWVzdGFtcCBmb3IgYW55IG1pc3NpbmcgKC0xKSB2YWx1ZXMuICBUaGUKKwkgKiBSVEMgZHJpdmVyIHByZXZlbnRzICJwZXJpb2RpYyBhbGFybSIgbW9kZXMuCisJICoKKwkgKiBCdXQgdGhpcyBjYW4gYmUgcmFjZXksIGJlY2F1c2Ugc29tZSBmaWVsZHMgb2YgdGhlIFJUQyB0aW1lc3RhbXAKKwkgKiBtYXkgaGF2ZSB3cmFwcGVkIGluIHRoZSBpbnRlcnZhbCBzaW5jZSB3ZSByZWFkIHRoZSBSVEMgYWxhcm0sCisJICogd2hpY2ggd291bGQgbGVhZCB0byB1cyBpbnNlcnRpbmcgaW5jb25zaXN0ZW50IHZhbHVlcyBpbiBwbGFjZQorCSAqIG9mIHRoZSAtMSBmaWVsZHMuCisJICoKKwkgKiBSZWFkaW5nIHRoZSBhbGFybSBhbmQgdGltZXN0YW1wIGluIHRoZSByZXZlcnNlIHNlcXVlbmNlCisJICogd291bGQgaGF2ZSB0aGUgc2FtZSByYWNlIGNvbmRpdGlvbiwgYW5kIG5vdCBzb2x2ZSB0aGUgaXNzdWUuCisJICoKKwkgKiBTbywgd2UgbXVzdCBmaXJzdCByZWFkIHRoZSBSVEMgdGltZXN0YW1wLAorCSAqIHRoZW4gcmVhZCB0aGUgUlRDIGFsYXJtIHZhbHVlLAorCSAqIGFuZCB0aGVuIHJlYWQgYSBzZWNvbmQgUlRDIHRpbWVzdGFtcC4KKwkgKgorCSAqIElmIGFueSBmaWVsZHMgb2YgdGhlIHNlY29uZCB0aW1lc3RhbXAgaGF2ZSBjaGFuZ2VkCisJICogd2hlbiBjb21wYXJlZCB3aXRoIHRoZSBmaXJzdCB0aW1lc3RhbXAsIHRoZW4gd2Uga25vdworCSAqIG91ciB0aW1lc3RhbXAgbWF5IGJlIGluY29uc2lzdGVudCB3aXRoIHRoYXQgdXNlZCBieQorCSAqIHRoZSBsb3ctbGV2ZWwgcnRjX3JlYWRfYWxhcm1faW50ZXJuYWwoKSBmdW5jdGlvbi4KKwkgKgorCSAqIFNvLCB3aGVuIHRoZSB0d28gdGltZXN0YW1wcyBkaXNhZ3JlZSwgd2UganVzdCBsb29wIGFuZCBkbworCSAqIHRoZSBwcm9jZXNzIGFnYWluIHRvIGdldCBhIGZ1bGx5IGNvbnNpc3RlbnQgc2V0IG9mIHZhbHVlcy4KKwkgKgorCSAqIFRoaXMgY291bGQgYWxsIGluc3RlYWQgYmUgZG9uZSBpbiB0aGUgbG93ZXIgbGV2ZWwgZHJpdmVyLAorCSAqIGJ1dCBzaW5jZSBtb3JlIHRoYW4gb25lIGxvd2VyIGxldmVsIFJUQyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBpdCwKKwkgKiB0aGVuIGl0J3MgcHJvYmFibHkgYmVzdCBiZXN0IHRvIGRvIGl0IGhlcmUgaW5zdGVhZCBvZiB0aGVyZS4uCisJICovCisKKwkvKiBHZXQgdGhlICJiZWZvcmUiIHRpbWVzdGFtcCAqLworCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmYmVmb3JlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlkbyB7CisJCWlmICghZmlyc3RfdGltZSkKKwkJCW1lbWNweSgmYmVmb3JlLCAmbm93LCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CisJCWZpcnN0X3RpbWUgPSAwOworCisJCS8qIGdldCB0aGUgUlRDIGFsYXJtIHZhbHVlcywgd2hpY2ggbWF5IGJlIGluY29tcGxldGUgKi8KKwkJZXJyID0gcnRjX3JlYWRfYWxhcm1faW50ZXJuYWwocnRjLCBhbGFybSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCS8qIGZ1bGwtZnVuY3Rpb24gUlRDcyB3b24ndCBoYXZlIHN1Y2ggbWlzc2luZyBmaWVsZHMgKi8KKwkJaWYgKHJ0Y192YWxpZF90bSgmYWxhcm0tPnRpbWUpID09IDApCisJCQlyZXR1cm4gMDsKKworCQkvKiBnZXQgdGhlICJhZnRlciIgdGltZXN0YW1wLCB0byBkZXRlY3Qgd3JhcHBlZCBmaWVsZHMgKi8KKwkJZXJyID0gcnRjX3JlYWRfdGltZShydGMsICZub3cpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJLyogbm90ZSB0aGF0IHRtX3NlYyBpcyBhICJkb24ndCBjYXJlIiB2YWx1ZSBoZXJlOiAqLworCX0gd2hpbGUgKCAgIGJlZm9yZS50bV9taW4gICAhPSBub3cudG1fbWluCisJCSB8fCBiZWZvcmUudG1faG91ciAgIT0gbm93LnRtX2hvdXIKKwkJIHx8IGJlZm9yZS50bV9tb24gICAhPSBub3cudG1fbW9uCisJCSB8fCBiZWZvcmUudG1feWVhciAgIT0gbm93LnRtX3llYXIpOworCisJLyogRmlsbCBpbiB0aGUgbWlzc2luZyBhbGFybSBmaWVsZHMgdXNpbmcgdGhlIHRpbWVzdGFtcDsgd2UKKwkgKiBrbm93IHRoZXJlJ3MgYXQgbGVhc3Qgb25lIHNpbmNlIGFsYXJtLT50aW1lIGlzIGludmFsaWQuCisJICovCisJaWYgKGFsYXJtLT50aW1lLnRtX3NlYyA9PSAtMSkKKwkJYWxhcm0tPnRpbWUudG1fc2VjID0gbm93LnRtX3NlYzsKKwlpZiAoYWxhcm0tPnRpbWUudG1fbWluID09IC0xKQorCQlhbGFybS0+dGltZS50bV9taW4gPSBub3cudG1fbWluOworCWlmIChhbGFybS0+dGltZS50bV9ob3VyID09IC0xKQorCQlhbGFybS0+dGltZS50bV9ob3VyID0gbm93LnRtX2hvdXI7CisKKwkvKiBGb3Igc2ltcGxpY2l0eSwgb25seSBzdXBwb3J0IGRhdGUgcm9sbG92ZXIgZm9yIG5vdyAqLworCWlmIChhbGFybS0+dGltZS50bV9tZGF5IDwgMSB8fCBhbGFybS0+dGltZS50bV9tZGF5ID4gMzEpIHsKKwkJYWxhcm0tPnRpbWUudG1fbWRheSA9IG5vdy50bV9tZGF5OworCQltaXNzaW5nID0gZGF5OworCX0KKwlpZiAoKHVuc2lnbmVkKWFsYXJtLT50aW1lLnRtX21vbiA+PSAxMikgeworCQlhbGFybS0+dGltZS50bV9tb24gPSBub3cudG1fbW9uOworCQlpZiAobWlzc2luZyA9PSBub25lKQorCQkJbWlzc2luZyA9IG1vbnRoOworCX0KKwlpZiAoYWxhcm0tPnRpbWUudG1feWVhciA9PSAtMSkgeworCQlhbGFybS0+dGltZS50bV95ZWFyID0gbm93LnRtX3llYXI7CisJCWlmIChtaXNzaW5nID09IG5vbmUpCisJCQltaXNzaW5nID0geWVhcjsKKwl9CisKKwkvKiB3aXRoIGx1Y2ssIG5vIHJvbGxvdmVyIGlzIG5lZWRlZCAqLworCXJ0Y190bV90b190aW1lKCZub3csICZ0X25vdyk7CisJcnRjX3RtX3RvX3RpbWUoJmFsYXJtLT50aW1lLCAmdF9hbG0pOworCWlmICh0X25vdyA8IHRfYWxtKQorCQlnb3RvIGRvbmU7CisKKwlzd2l0Y2ggKG1pc3NpbmcpIHsKKworCS8qIDI0IGhvdXIgcm9sbG92ZXIgLi4uIGlmIGl0J3Mgbm93IDEwYW0gTW9uZGF5LCBhbiBhbGFybSB0aGF0CisJICogdGhhdCB3aWxsIHRyaWdnZXIgYXQgNWFtIHdpbGwgZG8gc28gYXQgNWFtIFR1ZXNkYXksIHdoaWNoCisJICogY291bGQgYWxzbyBiZSBpbiB0aGUgbmV4dCBtb250aCBvciB5ZWFyLiAgVGhpcyBpcyBhIGNvbW1vbgorCSAqIGNhc2UsIGVzcGVjaWFsbHkgZm9yIFBDcy4KKwkgKi8KKwljYXNlIGRheToKKwkJZGV2X2RiZygmcnRjLT5kZXYsICJhbGFybSByb2xsb3ZlcjogJXNcbiIsICJkYXkiKTsKKwkJdF9hbG0gKz0gMjQgKiA2MCAqIDYwOworCQlydGNfdGltZV90b190bSh0X2FsbSwgJmFsYXJtLT50aW1lKTsKKwkJYnJlYWs7CisKKwkvKiBNb250aCByb2xsb3ZlciAuLi4gaWYgaXQncyB0aGUgMzF0aCwgYW4gYWxhcm0gb24gdGhlIDNyZCB3aWxsCisJICogYmUgbmV4dCBtb250aC4gIEFuIGFsYXJtIG1hdGNoaW5nIG9uIHRoZSAzMHRoLCAyOXRoLCBvciAyOHRoCisJICogbWF5IGVuZCB1cCBpbiB0aGUgbW9udGggYWZ0ZXIgdGhhdCEgIE1hbnkgbmV3ZXIgUENzIHN1cHBvcnQKKwkgKiB0aGlzIHR5cGUgb2YgYWxhcm0uCisJICovCisJY2FzZSBtb250aDoKKwkJZGV2X2RiZygmcnRjLT5kZXYsICJhbGFybSByb2xsb3ZlcjogJXNcbiIsICJtb250aCIpOworCQlkbyB7CisJCQlpZiAoYWxhcm0tPnRpbWUudG1fbW9uIDwgMTEpCisJCQkJYWxhcm0tPnRpbWUudG1fbW9uKys7CisJCQllbHNlIHsKKwkJCQlhbGFybS0+dGltZS50bV9tb24gPSAwOworCQkJCWFsYXJtLT50aW1lLnRtX3llYXIrKzsKKwkJCX0KKwkJCWRheXMgPSBydGNfbW9udGhfZGF5cyhhbGFybS0+dGltZS50bV9tb24sCisJCQkJCWFsYXJtLT50aW1lLnRtX3llYXIpOworCQl9IHdoaWxlIChkYXlzIDwgYWxhcm0tPnRpbWUudG1fbWRheSk7CisJCWJyZWFrOworCisJLyogWWVhciByb2xsb3ZlciAuLi4gZWFzeSBleGNlcHQgZm9yIGxlYXAgeWVhcnMhICovCisJY2FzZSB5ZWFyOgorCQlkZXZfZGJnKCZydGMtPmRldiwgImFsYXJtIHJvbGxvdmVyOiAlc1xuIiwgInllYXIiKTsKKwkJZG8geworCQkJYWxhcm0tPnRpbWUudG1feWVhcisrOworCQl9IHdoaWxlIChydGNfdmFsaWRfdG0oJmFsYXJtLT50aW1lKSAhPSAwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmcnRjLT5kZXYsICJhbGFybSByb2xsb3ZlciBub3QgaGFuZGxlZFxuIik7CisJfQorCitkb25lOgorCXJldHVybiAwOworfQorCitpbnQgcnRjX3JlYWRfYWxhcm0oc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCWludCBlcnI7CisKKwllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJ0Yy0+b3BzX2xvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKHJ0Yy0+b3BzID09IE5VTEwpCisJCWVyciA9IC1FTk9ERVY7CisJZWxzZSBpZiAoIXJ0Yy0+b3BzLT5yZWFkX2FsYXJtKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UgeworCQltZW1zZXQoYWxhcm0sIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3drYWxybSkpOworCQlhbGFybS0+ZW5hYmxlZCA9IHJ0Yy0+YWllX3RpbWVyLmVuYWJsZWQ7CisJCWFsYXJtLT50aW1lID0gcnRjX2t0aW1lX3RvX3RtKHJ0Yy0+YWllX3RpbWVyLm5vZGUuZXhwaXJlcyk7CisJfQorCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnRjX3JlYWRfYWxhcm0pOworCitzdGF0aWMgaW50IF9fcnRjX3NldF9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCWxvbmcgbm93LCBzY2hlZHVsZWQ7CisJaW50IGVycjsKKworCWVyciA9IHJ0Y192YWxpZF90bSgmYWxhcm0tPnRpbWUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcnRjX3RtX3RvX3RpbWUoJmFsYXJtLT50aW1lLCAmc2NoZWR1bGVkKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSdyZSBub3Qgc2V0dGluZyBhbGFybXMgaW4gdGhlIHBhc3QgKi8KKwllcnIgPSBfX3J0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCXJ0Y190bV90b190aW1lKCZ0bSwgJm5vdyk7CisJaWYgKHNjaGVkdWxlZCA8PSBub3cpCisJCXJldHVybiAtRVRJTUU7CisJLyoKKwkgKiBYWFggLSBXZSBqdXN0IGNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoZSBhbGFybSB0aW1lIGlzIG5vdAorCSAqIGluIHRoZSBwYXN0LCBidXQgdGhlcmUgaXMgc3RpbGwgYSByYWNlIHdpbmRvdyB3aGVyZSBpZgorCSAqIHRoZSBpcyBhbGFybSBzZXQgZm9yIHRoZSBuZXh0IHNlY29uZCBhbmQgdGhlIHNlY29uZCB0aWNrcworCSAqIG92ZXIgcmlnaHQgaGVyZSwgYmVmb3JlIHdlIHNldCB0aGUgYWxhcm0uCisJICovCisKKwlpZiAoIXJ0Yy0+b3BzKQorCQllcnIgPSAtRU5PREVWOworCWVsc2UgaWYgKCFydGMtPm9wcy0+c2V0X2FsYXJtKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UKKwkJZXJyID0gcnRjLT5vcHMtPnNldF9hbGFybShydGMtPmRldi5wYXJlbnQsIGFsYXJtKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBydGNfc2V0X2FsYXJtKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcnRjX3ZhbGlkX3RtKCZhbGFybS0+dGltZSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZydGMtPm9wc19sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmIChydGMtPmFpZV90aW1lci5lbmFibGVkKSB7CisJCXJ0Y190aW1lcl9yZW1vdmUocnRjLCAmcnRjLT5haWVfdGltZXIpOworCX0KKwlydGMtPmFpZV90aW1lci5ub2RlLmV4cGlyZXMgPSBydGNfdG1fdG9fa3RpbWUoYWxhcm0tPnRpbWUpOworCXJ0Yy0+YWllX3RpbWVyLnBlcmlvZCA9IGt0aW1lX3NldCgwLCAwKTsKKwlpZiAoYWxhcm0tPmVuYWJsZWQpIHsKKwkJZXJyID0gcnRjX3RpbWVyX2VucXVldWUocnRjLCAmcnRjLT5haWVfdGltZXIpOworCX0KKwltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfc2V0X2FsYXJtKTsKKworLyogQ2FsbGVkIG9uY2UgcGVyIGRldmljZSBmcm9tIHJ0Y19kZXZpY2VfcmVnaXN0ZXIgKi8KK2ludCBydGNfaW5pdGlhbGl6ZV9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcnRjX3RpbWUgbm93OworCisJZXJyID0gcnRjX3ZhbGlkX3RtKCZhbGFybS0+dGltZSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcnRjX3JlYWRfdGltZShydGMsICZub3cpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJ0Yy0+b3BzX2xvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlydGMtPmFpZV90aW1lci5ub2RlLmV4cGlyZXMgPSBydGNfdG1fdG9fa3RpbWUoYWxhcm0tPnRpbWUpOworCXJ0Yy0+YWllX3RpbWVyLnBlcmlvZCA9IGt0aW1lX3NldCgwLCAwKTsKKworCS8qIEFsYXJtIGhhcyB0byBiZSBlbmFibGVkICYgaW4gdGhlIGZ1dHJ1cmUgZm9yIHVzIHRvIGVucXVldWUgaXQgKi8KKwlpZiAoYWxhcm0tPmVuYWJsZWQgJiYgKHJ0Y190bV90b19rdGltZShub3cpLnR2NjQgPAorCQkJIHJ0Yy0+YWllX3RpbWVyLm5vZGUuZXhwaXJlcy50djY0KSkgeworCisJCXJ0Yy0+YWllX3RpbWVyLmVuYWJsZWQgPSAxOworCQl0aW1lcnF1ZXVlX2FkZCgmcnRjLT50aW1lcnF1ZXVlLCAmcnRjLT5haWVfdGltZXIubm9kZSk7CisJfQorCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19pbml0aWFsaXplX2FsYXJtKTsKKworCisKK2ludCBydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlpbnQgZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZydGMtPm9wc19sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHJ0Yy0+YWllX3RpbWVyLmVuYWJsZWQgIT0gZW5hYmxlZCkgeworCQlpZiAoZW5hYmxlZCkKKwkJCWVyciA9IHJ0Y190aW1lcl9lbnF1ZXVlKHJ0YywgJnJ0Yy0+YWllX3RpbWVyKTsKKwkJZWxzZQorCQkJcnRjX3RpbWVyX3JlbW92ZShydGMsICZydGMtPmFpZV90aW1lcik7CisJfQorCisJaWYgKGVycikKKwkJLyogbm90aGluZyAqLzsKKwllbHNlIGlmICghcnRjLT5vcHMpCisJCWVyciA9IC1FTk9ERVY7CisJZWxzZSBpZiAoIXJ0Yy0+b3BzLT5hbGFybV9pcnFfZW5hYmxlKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UKKwkJZXJyID0gcnRjLT5vcHMtPmFsYXJtX2lycV9lbmFibGUocnRjLT5kZXYucGFyZW50LCBlbmFibGVkKTsKKworCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19hbGFybV9pcnFfZW5hYmxlKTsKKworaW50IHJ0Y191cGRhdGVfaXJxX2VuYWJsZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlpbnQgZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZydGMtPm9wc19sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisjaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTAorCWlmIChlbmFibGVkID09IDAgJiYgcnRjLT51aWVfaXJxX2FjdGl2ZSkgeworCQltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCQlyZXR1cm4gcnRjX2Rldl91cGRhdGVfaXJxX2VuYWJsZV9lbXVsKHJ0YywgMCk7CisJfQorI2VuZGlmCisJLyogbWFrZSBzdXJlIHdlJ3JlIGNoYW5naW5nIHN0YXRlICovCisJaWYgKHJ0Yy0+dWllX3J0Y3RpbWVyLmVuYWJsZWQgPT0gZW5hYmxlZCkKKwkJZ290byBvdXQ7CisKKwlpZiAocnRjLT51aWVfdW5zdXBwb3J0ZWQpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGVuYWJsZWQpIHsKKwkJc3RydWN0IHJ0Y190aW1lIHRtOworCQlrdGltZV90IG5vdywgb25lc2VjOworCisJCV9fcnRjX3JlYWRfdGltZShydGMsICZ0bSk7CisJCW9uZXNlYyA9IGt0aW1lX3NldCgxLCAwKTsKKwkJbm93ID0gcnRjX3RtX3RvX2t0aW1lKHRtKTsKKwkJcnRjLT51aWVfcnRjdGltZXIubm9kZS5leHBpcmVzID0ga3RpbWVfYWRkKG5vdywgb25lc2VjKTsKKwkJcnRjLT51aWVfcnRjdGltZXIucGVyaW9kID0ga3RpbWVfc2V0KDEsIDApOworCQllcnIgPSBydGNfdGltZXJfZW5xdWV1ZShydGMsICZydGMtPnVpZV9ydGN0aW1lcik7CisJfSBlbHNlCisJCXJ0Y190aW1lcl9yZW1vdmUocnRjLCAmcnRjLT51aWVfcnRjdGltZXIpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCisJLyoKKwkgKiBFbmFibGUgZW11bGF0aW9uIGlmIHRoZSBkcml2ZXIgZGlkIG5vdCBwcm92aWRlCisJICogdGhlIHVwZGF0ZV9pcnFfZW5hYmxlIGZ1bmN0aW9uIHBvaW50ZXIgb3IgaWYgcmV0dXJuZWQKKwkgKiAtRUlOVkFMIHRvIHNpZ25hbCB0aGF0IGl0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aG91dAorCSAqIGludGVycnVwdHMgb3IgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LgorCSAqLworCWlmIChlcnIgPT0gLUVJTlZBTCkKKwkJZXJyID0gcnRjX2Rldl91cGRhdGVfaXJxX2VuYWJsZV9lbXVsKHJ0YywgZW5hYmxlZCk7CisjZW5kaWYKKwlyZXR1cm4gZXJyOworCit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfdXBkYXRlX2lycV9lbmFibGUpOworCisKKy8qKgorICogcnRjX2hhbmRsZV9sZWdhY3lfaXJxIC0gQUlFLCBVSUUgYW5kIFBJRSBldmVudCBob29rCisgKiBAcnRjOiBwb2ludGVyIHRvIHRoZSBydGMgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBBSUUsIFVJRSBvciBQSUUgbW9kZSBpbnRlcnJ1cHQKKyAqIGhhcyBvY2N1cnJlZCAob3IgYmVlbiBlbXVsYXRlZCkuCisgKgorICogVHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgaXJxX3Rhc2sgZnVuY3Rpb24gY2FsbGJhY2suCisgKi8KK3ZvaWQgcnRjX2hhbmRsZV9sZWdhY3lfaXJxKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIGludCBudW0sIGludCBtb2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBtYXJrIG9uZSBpcnEgb2YgdGhlIGFwcHJvcHJpYXRlIG1vZGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfbG9jaywgZmxhZ3MpOworCXJ0Yy0+aXJxX2RhdGEgPSAocnRjLT5pcnFfZGF0YSArIChudW0gPDwgOCkpIHwgKFJUQ19JUlFGfG1vZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+aXJxX2xvY2ssIGZsYWdzKTsKKworCS8qIGNhbGwgdGhlIHRhc2sgZnVuYyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKKwlpZiAocnRjLT5pcnFfdGFzaykKKwkJcnRjLT5pcnFfdGFzay0+ZnVuYyhydGMtPmlycV90YXNrLT5wcml2YXRlX2RhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGMtPmlycV9xdWV1ZSk7CisJa2lsbF9mYXN5bmMoJnJ0Yy0+YXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKK30KKworCisvKioKKyAqIHJ0Y19haWVfdXBkYXRlX2lycSAtIEFJRSBtb2RlIHJ0Y3RpbWVyIGhvb2sKKyAqIEBwcml2YXRlOiBwb2ludGVyIHRvIHRoZSBydGNfZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbnMgaXMgY2FsbGVkIHdoZW4gdGhlIGFpZV90aW1lciBleHBpcmVzLgorICovCit2b2lkIHJ0Y19haWVfdXBkYXRlX2lycSh2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSAoc3RydWN0IHJ0Y19kZXZpY2UgKilwcml2YXRlOworCXJ0Y19oYW5kbGVfbGVnYWN5X2lycShydGMsIDEsIFJUQ19BRik7Cit9CisKKworLyoqCisgKiBydGNfdWllX3VwZGF0ZV9pcnEgLSBVSUUgbW9kZSBydGN0aW1lciBob29rCisgKiBAcHJpdmF0ZTogcG9pbnRlciB0byB0aGUgcnRjX2RldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb25zIGlzIGNhbGxlZCB3aGVuIHRoZSB1aWVfdGltZXIgZXhwaXJlcy4KKyAqLwordm9pZCBydGNfdWllX3VwZGF0ZV9pcnEodm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gKHN0cnVjdCBydGNfZGV2aWNlICopcHJpdmF0ZTsKKwlydGNfaGFuZGxlX2xlZ2FjeV9pcnEocnRjLCAxLCAgUlRDX1VGKTsKK30KKworCisvKioKKyAqIHJ0Y19waWVfdXBkYXRlX2lycSAtIFBJRSBtb2RlIGhydGltZXIgaG9vaworICogQHRpbWVyOiBwb2ludGVyIHRvIHRoZSBwaWUgbW9kZSBocnRpbWVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGVtdWxhdGUgUElFIG1vZGUgaW50ZXJydXB0cworICogdXNpbmcgYW4gaHJ0aW1lci4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgcGVyaW9kaWMKKyAqIGhydGltZXIgZXhwaXJlcy4KKyAqLworZW51bSBocnRpbWVyX3Jlc3RhcnQgcnRjX3BpZV91cGRhdGVfaXJxKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWt0aW1lX3QgcGVyaW9kOworCWludCBjb3VudDsKKwlydGMgPSBjb250YWluZXJfb2YodGltZXIsIHN0cnVjdCBydGNfZGV2aWNlLCBwaWVfdGltZXIpOworCisJcGVyaW9kID0ga3RpbWVfc2V0KDAsIE5TRUNfUEVSX1NFQy9ydGMtPmlycV9mcmVxKTsKKwljb3VudCA9IGhydGltZXJfZm9yd2FyZF9ub3codGltZXIsIHBlcmlvZCk7CisKKwlydGNfaGFuZGxlX2xlZ2FjeV9pcnEocnRjLCBjb3VudCwgUlRDX1BGKTsKKworCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7Cit9CisKKy8qKgorICogcnRjX3VwZGF0ZV9pcnEgLSBUcmlnZ2VyZWQgd2hlbiBhIFJUQyBpbnRlcnJ1cHQgb2NjdXJzLgorICogQHJ0YzogdGhlIHJ0YyBkZXZpY2UKKyAqIEBudW06IGhvdyBtYW55IGlycXMgYXJlIGJlaW5nIHJlcG9ydGVkICh1c3VhbGx5IG9uZSkKKyAqIEBldmVudHM6IG1hc2sgb2YgUlRDX0lSUUYgd2l0aCBvbmUgb3IgbW9yZSBvZiBSVENfUEYsIFJUQ19BRiwgUlRDX1VGCisgKiBDb250ZXh0OiBhbnkKKyAqLwordm9pZCBydGNfdXBkYXRlX2lycShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLAorCQl1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgbG9uZyBldmVudHMpCit7CisJc2NoZWR1bGVfd29yaygmcnRjLT5pcnF3b3JrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y191cGRhdGVfaXJxKTsKKworc3RhdGljIGludCBfX3J0Y19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqbmFtZSA9IChjaGFyICopZGF0YTsKKworCWlmIChzdHJjbXAoZGV2X25hbWUoZGV2KSwgbmFtZSkgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBydGNfZGV2aWNlICpydGNfY2xhc3Nfb3BlbihjaGFyICpuYW1lKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gTlVMTDsKKworCWRldiA9IGNsYXNzX2ZpbmRfZGV2aWNlKHJ0Y19jbGFzcywgTlVMTCwgbmFtZSwgX19ydGNfbWF0Y2gpOworCWlmIChkZXYpCisJCXJ0YyA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKKworCWlmIChydGMpIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChydGMtPm93bmVyKSkgeworCQkJcHV0X2RldmljZShkZXYpOworCQkJcnRjID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBydGM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfY2xhc3Nfb3Blbik7CisKK3ZvaWQgcnRjX2NsYXNzX2Nsb3NlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7CisJbW9kdWxlX3B1dChydGMtPm93bmVyKTsKKwlwdXRfZGV2aWNlKCZydGMtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfY2xhc3NfY2xvc2UpOworCitpbnQgcnRjX2lycV9yZWdpc3RlcihzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3Rhc2sgKnRhc2spCit7CisJaW50IHJldHZhbCA9IC1FQlVTWTsKKworCWlmICh0YXNrID09IE5VTEwgfHwgdGFzay0+ZnVuYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENhbm5vdCByZWdpc3RlciB3aGlsZSB0aGUgY2hhciBkZXYgaXMgaW4gdXNlICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXRfbG9jayhSVENfREVWX0JVU1ksICZydGMtPmZsYWdzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CisJaWYgKHJ0Yy0+aXJxX3Rhc2sgPT0gTlVMTCkgeworCQlydGMtPmlycV90YXNrID0gdGFzazsKKwkJcmV0dmFsID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV90YXNrX2xvY2spOworCisJY2xlYXJfYml0X3VubG9jayhSVENfREVWX0JVU1ksICZydGMtPmZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfaXJxX3JlZ2lzdGVyKTsKKwordm9pZCBydGNfaXJxX3VucmVnaXN0ZXIoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190YXNrICp0YXNrKQoreworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CisJaWYgKHJ0Yy0+aXJxX3Rhc2sgPT0gdGFzaykKKwkJcnRjLT5pcnFfdGFzayA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV90YXNrX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnRjX2lycV91bnJlZ2lzdGVyKTsKKworc3RhdGljIGludCBydGNfdXBkYXRlX2hydGltZXIoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YywgaW50IGVuYWJsZWQpCit7CisJLyoKKwkgKiBXZSBhbHdheXMgY2FuY2VsIHRoZSB0aW1lciBoZXJlIGZpcnN0LCBiZWNhdXNlIG90aGVyd2lzZQorCSAqIHdlIGNvdWxkIHJ1biBpbnRvIEJVR19PTih0aW1lci0+c3RhdGUgIT0gSFJUSU1FUl9TVEFURV9DQUxMQkFDSyk7CisJICogd2hlbiB3ZSBtYW5hZ2UgdG8gc3RhcnQgdGhlIHRpbWVyIGJlZm9yZSB0aGUgY2FsbGJhY2sKKwkgKiByZXR1cm5zIEhSVElNRVJfUkVTVEFSVC4KKwkgKgorCSAqIFdlIGNhbm5vdCB1c2UgaHJ0aW1lcl9jYW5jZWwoKSBoZXJlIGFzIGEgcnVubmluZyBjYWxsYmFjaworCSAqIGNvdWxkIGJlIGJsb2NrZWQgb24gcnRjLT5pcnFfdGFza19sb2NrIGFuZCBocnRpbWVyX2NhbmNlbCgpCisJICogd291bGQgc3BpbiBmb3JldmVyLgorCSAqLworCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJnJ0Yy0+cGllX3RpbWVyKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChlbmFibGVkKSB7CisJCWt0aW1lX3QgcGVyaW9kID0ga3RpbWVfc2V0KDAsIE5TRUNfUEVSX1NFQyAvIHJ0Yy0+aXJxX2ZyZXEpOworCisJCWhydGltZXJfc3RhcnQoJnJ0Yy0+cGllX3RpbWVyLCBwZXJpb2QsIEhSVElNRVJfTU9ERV9SRUwpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBydGNfaXJxX3NldF9zdGF0ZSAtIGVuYWJsZS9kaXNhYmxlIDJeTiBIeiBwZXJpb2RpYyBJUlFzCisgKiBAcnRjOiB0aGUgcnRjIGRldmljZQorICogQHRhc2s6IGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggcnRjX2lycV9yZWdpc3RlcigpCisgKiBAZW5hYmxlZDogdHJ1ZSB0byBlbmFibGUgcGVyaW9kaWMgSVJRcworICogQ29udGV4dDogYW55CisgKgorICogTm90ZSB0aGF0IHJ0Y19pcnFfc2V0X2ZyZXEoKSBzaG91bGQgcHJldmlvdXNseSBoYXZlIGJlZW4gdXNlZCB0bworICogc3BlY2lmeSB0aGUgZGVzaXJlZCBmcmVxdWVuY3kgb2YgcGVyaW9kaWMgSVJRIHRhc2stPmZ1bmMoKSBjYWxsYmFja3MuCisgKi8KK2ludCBydGNfaXJxX3NldF9zdGF0ZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3Rhc2sgKnRhc2ssIGludCBlbmFibGVkKQoreworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKK3JldHJ5OgorCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKKwlpZiAocnRjLT5pcnFfdGFzayAhPSBOVUxMICYmIHRhc2sgPT0gTlVMTCkKKwkJZXJyID0gLUVCVVNZOworCWlmIChydGMtPmlycV90YXNrICE9IHRhc2spCisJCWVyciA9IC1FQUNDRVM7CisJaWYgKCFlcnIpIHsKKwkJaWYgKHJ0Y191cGRhdGVfaHJ0aW1lcihydGMsIGVuYWJsZWQpIDwgMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CisJCQljcHVfcmVsYXgoKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJcnRjLT5waWVfZW5hYmxlZCA9IGVuYWJsZWQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfaXJxX3NldF9zdGF0ZSk7CisKKy8qKgorICogcnRjX2lycV9zZXRfZnJlcSAtIHNldCAyXk4gSHogcGVyaW9kaWMgSVJRIGZyZXF1ZW5jeSBmb3IgSVJRCisgKiBAcnRjOiB0aGUgcnRjIGRldmljZQorICogQHRhc2s6IGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggcnRjX2lycV9yZWdpc3RlcigpCisgKiBAZnJlcTogcG9zaXRpdmUgZnJlcXVlbmN5IHdpdGggd2hpY2ggdGFzay0+ZnVuYygpIHdpbGwgYmUgY2FsbGVkCisgKiBDb250ZXh0OiBhbnkKKyAqCisgKiBOb3RlIHRoYXQgcnRjX2lycV9zZXRfc3RhdGUoKSBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZQorICogcGVyaW9kaWMgSVJRcy4KKyAqLworaW50IHJ0Y19pcnFfc2V0X2ZyZXEoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190YXNrICp0YXNrLCBpbnQgZnJlcSkKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGZyZXEgPD0gMCB8fCBmcmVxID4gUlRDX01BWF9GUkVRKQorCQlyZXR1cm4gLUVJTlZBTDsKK3JldHJ5OgorCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKKwlpZiAocnRjLT5pcnFfdGFzayAhPSBOVUxMICYmIHRhc2sgPT0gTlVMTCkKKwkJZXJyID0gLUVCVVNZOworCWlmIChydGMtPmlycV90YXNrICE9IHRhc2spCisJCWVyciA9IC1FQUNDRVM7CisJaWYgKCFlcnIpIHsKKwkJcnRjLT5pcnFfZnJlcSA9IGZyZXE7CisJCWlmIChydGMtPnBpZV9lbmFibGVkICYmIHJ0Y191cGRhdGVfaHJ0aW1lcihydGMsIDEpIDwgMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CisJCQljcHVfcmVsYXgoKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19pcnFfc2V0X2ZyZXEpOworCisvKioKKyAqIHJ0Y190aW1lcl9lbnF1ZXVlIC0gQWRkcyBhIHJ0Y190aW1lciB0byB0aGUgcnRjX2RldmljZSB0aW1lcnF1ZXVlCisgKiBAcnRjIHJ0YyBkZXZpY2UKKyAqIEB0aW1lciB0aW1lciBiZWluZyBhZGRlZC4KKyAqCisgKiBFbnF1ZXVlcyBhIHRpbWVyIG9udG8gdGhlIHJ0YyBkZXZpY2VzIHRpbWVycXVldWUgYW5kIHNldHMKKyAqIHRoZSBuZXh0IGFsYXJtIGV2ZW50IGFwcHJvcHJpYXRlbHkuCisgKgorICogU2V0cyB0aGUgZW5hYmxlZCBiaXQgb24gdGhlIGFkZGVkIHRpbWVyLgorICoKKyAqIE11c3QgaG9sZCBvcHNfbG9jayBmb3IgcHJvcGVyIHNlcmlhbGl6YXRpb24gb2YgdGltZXJxdWV1ZQorICovCitzdGF0aWMgaW50IHJ0Y190aW1lcl9lbnF1ZXVlKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZXIgKnRpbWVyKQoreworCXRpbWVyLT5lbmFibGVkID0gMTsKKwl0aW1lcnF1ZXVlX2FkZCgmcnRjLT50aW1lcnF1ZXVlLCAmdGltZXItPm5vZGUpOworCWlmICgmdGltZXItPm5vZGUgPT0gdGltZXJxdWV1ZV9nZXRuZXh0KCZydGMtPnRpbWVycXVldWUpKSB7CisJCXN0cnVjdCBydGNfd2thbHJtIGFsYXJtOworCQlpbnQgZXJyOworCQlhbGFybS50aW1lID0gcnRjX2t0aW1lX3RvX3RtKHRpbWVyLT5ub2RlLmV4cGlyZXMpOworCQlhbGFybS5lbmFibGVkID0gMTsKKwkJZXJyID0gX19ydGNfc2V0X2FsYXJtKHJ0YywgJmFsYXJtKTsKKwkJaWYgKGVyciA9PSAtRVRJTUUpCisJCQlzY2hlZHVsZV93b3JrKCZydGMtPmlycXdvcmspOworCQllbHNlIGlmIChlcnIpIHsKKwkJCXRpbWVycXVldWVfZGVsKCZydGMtPnRpbWVycXVldWUsICZ0aW1lci0+bm9kZSk7CisJCQl0aW1lci0+ZW5hYmxlZCA9IDA7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBydGNfYWxhcm1fZGlzYWJsZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQoreworCWlmICghcnRjLT5vcHMgfHwgIXJ0Yy0+b3BzLT5hbGFybV9pcnFfZW5hYmxlKQorCQlyZXR1cm47CisKKwlydGMtPm9wcy0+YWxhcm1faXJxX2VuYWJsZShydGMtPmRldi5wYXJlbnQsIGZhbHNlKTsKK30KKworLyoqCisgKiBydGNfdGltZXJfcmVtb3ZlIC0gUmVtb3ZlcyBhIHJ0Y190aW1lciBmcm9tIHRoZSBydGNfZGV2aWNlIHRpbWVycXVldWUKKyAqIEBydGMgcnRjIGRldmljZQorICogQHRpbWVyIHRpbWVyIGJlaW5nIHJlbW92ZWQuCisgKgorICogUmVtb3ZlcyBhIHRpbWVyIG9udG8gdGhlIHJ0YyBkZXZpY2VzIHRpbWVycXVldWUgYW5kIHNldHMKKyAqIHRoZSBuZXh0IGFsYXJtIGV2ZW50IGFwcHJvcHJpYXRlbHkuCisgKgorICogQ2xlYXJzIHRoZSBlbmFibGVkIGJpdCBvbiB0aGUgcmVtb3ZlZCB0aW1lci4KKyAqCisgKiBNdXN0IGhvbGQgb3BzX2xvY2sgZm9yIHByb3BlciBzZXJpYWxpemF0aW9uIG9mIHRpbWVycXVldWUKKyAqLworc3RhdGljIHZvaWQgcnRjX3RpbWVyX3JlbW92ZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgdGltZXJxdWV1ZV9ub2RlICpuZXh0ID0gdGltZXJxdWV1ZV9nZXRuZXh0KCZydGMtPnRpbWVycXVldWUpOworCXRpbWVycXVldWVfZGVsKCZydGMtPnRpbWVycXVldWUsICZ0aW1lci0+bm9kZSk7CisJdGltZXItPmVuYWJsZWQgPSAwOworCWlmIChuZXh0ID09ICZ0aW1lci0+bm9kZSkgeworCQlzdHJ1Y3QgcnRjX3drYWxybSBhbGFybTsKKwkJaW50IGVycjsKKwkJbmV4dCA9IHRpbWVycXVldWVfZ2V0bmV4dCgmcnRjLT50aW1lcnF1ZXVlKTsKKwkJaWYgKCFuZXh0KSB7CisJCQlydGNfYWxhcm1fZGlzYWJsZShydGMpOworCQkJcmV0dXJuOworCQl9CisJCWFsYXJtLnRpbWUgPSBydGNfa3RpbWVfdG9fdG0obmV4dC0+ZXhwaXJlcyk7CisJCWFsYXJtLmVuYWJsZWQgPSAxOworCQllcnIgPSBfX3J0Y19zZXRfYWxhcm0ocnRjLCAmYWxhcm0pOworCQlpZiAoZXJyID09IC1FVElNRSkKKwkJCXNjaGVkdWxlX3dvcmsoJnJ0Yy0+aXJxd29yayk7CisJfQorfQorCisvKioKKyAqIHJ0Y190aW1lcl9kb193b3JrIC0gRXhwaXJlcyBydGMgdGltZXJzCisgKiBAcnRjIHJ0YyBkZXZpY2UKKyAqIEB0aW1lciB0aW1lciBiZWluZyByZW1vdmVkLgorICoKKyAqIEV4cGlyZXMgcnRjIHRpbWVycy4gUmVwcm9ncmFtcyBuZXh0IGFsYXJtIGV2ZW50IGlmIG5lZWRlZC4KKyAqIENhbGxlZCB2aWEgd29ya3Rhc2suCisgKgorICogU2VyaWFsaXplcyBhY2Nlc3MgdG8gdGltZXJxdWV1ZSB2aWEgb3BzX2xvY2sgbXV0ZXgKKyAqLwordm9pZCBydGNfdGltZXJfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ0Y190aW1lciAqdGltZXI7CisJc3RydWN0IHRpbWVycXVldWVfbm9kZSAqbmV4dDsKKwlrdGltZV90IG5vdzsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGNfZGV2aWNlLCBpcnF3b3JrKTsKKworCW11dGV4X2xvY2soJnJ0Yy0+b3BzX2xvY2spOworYWdhaW46CisJX19ydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKKwlub3cgPSBydGNfdG1fdG9fa3RpbWUodG0pOworCXdoaWxlICgobmV4dCA9IHRpbWVycXVldWVfZ2V0bmV4dCgmcnRjLT50aW1lcnF1ZXVlKSkpIHsKKwkJaWYgKG5leHQtPmV4cGlyZXMudHY2NCA+IG5vdy50djY0KQorCQkJYnJlYWs7CisKKwkJLyogZXhwaXJlIHRpbWVyICovCisJCXRpbWVyID0gY29udGFpbmVyX29mKG5leHQsIHN0cnVjdCBydGNfdGltZXIsIG5vZGUpOworCQl0aW1lcnF1ZXVlX2RlbCgmcnRjLT50aW1lcnF1ZXVlLCAmdGltZXItPm5vZGUpOworCQl0aW1lci0+ZW5hYmxlZCA9IDA7CisJCWlmICh0aW1lci0+dGFzay5mdW5jKQorCQkJdGltZXItPnRhc2suZnVuYyh0aW1lci0+dGFzay5wcml2YXRlX2RhdGEpOworCisJCS8qIFJlLWFkZC9md2QgcGVyaW9kaWMgdGltZXJzICovCisJCWlmIChrdGltZV90b19ucyh0aW1lci0+cGVyaW9kKSkgeworCQkJdGltZXItPm5vZGUuZXhwaXJlcyA9IGt0aW1lX2FkZCh0aW1lci0+bm9kZS5leHBpcmVzLAorCQkJCQkJCXRpbWVyLT5wZXJpb2QpOworCQkJdGltZXItPmVuYWJsZWQgPSAxOworCQkJdGltZXJxdWV1ZV9hZGQoJnJ0Yy0+dGltZXJxdWV1ZSwgJnRpbWVyLT5ub2RlKTsKKwkJfQorCX0KKworCS8qIFNldCBuZXh0IGFsYXJtICovCisJaWYgKG5leHQpIHsKKwkJc3RydWN0IHJ0Y193a2Fscm0gYWxhcm07CisJCWludCBlcnI7CisJCWFsYXJtLnRpbWUgPSBydGNfa3RpbWVfdG9fdG0obmV4dC0+ZXhwaXJlcyk7CisJCWFsYXJtLmVuYWJsZWQgPSAxOworCQllcnIgPSBfX3J0Y19zZXRfYWxhcm0ocnRjLCAmYWxhcm0pOworCQlpZiAoZXJyID09IC1FVElNRSkKKwkJCWdvdG8gYWdhaW47CisJfSBlbHNlCisJCXJ0Y19hbGFybV9kaXNhYmxlKHJ0Yyk7CisKKwltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworfQorCisKKy8qIHJ0Y190aW1lcl9pbml0IC0gSW5pdGlhbGl6ZXMgYW4gcnRjX3RpbWVyCisgKiBAdGltZXI6IHRpbWVyIHRvIGJlIGludGlpYWxpemVkCisgKiBAZjogZnVuY3Rpb24gcG9pbnRlciB0byBiZSBjYWxsZWQgd2hlbiB0aW1lciBmaXJlcworICogQGRhdGE6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24gcG9pbnRlcgorICoKKyAqIEtlcm5lbCBpbnRlcmZhY2UgdG8gaW5pdGlhbGl6aW5nIGFuIHJ0Y190aW1lci4KKyAqLwordm9pZCBydGNfdGltZXJfaW5pdChzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lciwgdm9pZCAoKmYpKHZvaWQqIHApLCB2b2lkKiBkYXRhKQoreworCXRpbWVycXVldWVfaW5pdCgmdGltZXItPm5vZGUpOworCXRpbWVyLT5lbmFibGVkID0gMDsKKwl0aW1lci0+dGFzay5mdW5jID0gZjsKKwl0aW1lci0+dGFzay5wcml2YXRlX2RhdGEgPSBkYXRhOworfQorCisvKiBydGNfdGltZXJfc3RhcnQgLSBTZXRzIGFuIHJ0Y190aW1lciB0byBmaXJlIGluIHRoZSBmdXR1cmUKKyAqIEAgcnRjOiBydGMgZGV2aWNlIHRvIGJlIHVzZWQKKyAqIEAgdGltZXI6IHRpbWVyIGJlaW5nIHNldAorICogQCBleHBpcmVzOiB0aW1lIGF0IHdoaWNoIHRvIGV4cGlyZSB0aGUgdGltZXIKKyAqIEAgcGVyaW9kOiBwZXJpb2QgdGhhdCB0aGUgdGltZXIgd2lsbCByZWN1cgorICoKKyAqIEtlcm5lbCBpbnRlcmZhY2UgdG8gc2V0IGFuIHJ0Y190aW1lcgorICovCitpbnQgcnRjX3RpbWVyX3N0YXJ0KHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZXIqIHRpbWVyLAorCQkJa3RpbWVfdCBleHBpcmVzLCBrdGltZV90IHBlcmlvZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwltdXRleF9sb2NrKCZydGMtPm9wc19sb2NrKTsKKwlpZiAodGltZXItPmVuYWJsZWQpCisJCXJ0Y190aW1lcl9yZW1vdmUocnRjLCB0aW1lcik7CisKKwl0aW1lci0+bm9kZS5leHBpcmVzID0gZXhwaXJlczsKKwl0aW1lci0+cGVyaW9kID0gcGVyaW9kOworCisJcmV0ID0gcnRjX3RpbWVyX2VucXVldWUocnRjLCB0aW1lcik7CisKKwltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIHJ0Y190aW1lcl9jYW5jZWwgLSBTdG9wcyBhbiBydGNfdGltZXIKKyAqIEAgcnRjOiBydGMgZGV2aWNlIHRvIGJlIHVzZWQKKyAqIEAgdGltZXI6IHRpbWVyIGJlaW5nIHNldAorICoKKyAqIEtlcm5lbCBpbnRlcmZhY2UgdG8gY2FuY2VsIGFuIHJ0Y190aW1lcgorICovCitpbnQgcnRjX3RpbWVyX2NhbmNlbChzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWVyKiB0aW1lcikKK3sKKwlpbnQgcmV0ID0gMDsKKwltdXRleF9sb2NrKCZydGMtPm9wc19sb2NrKTsKKwlpZiAodGltZXItPmVuYWJsZWQpCisJCXJ0Y190aW1lcl9yZW1vdmUocnRjLCB0aW1lcik7CisJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy04OHBtODYweC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLTg4cG04NjB4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkZGVmYwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy04OHBtODYweC5jCkBAIC0wLDAgKzEsNDQ0IEBACisvKgorICogUmVhbCBUaW1lIENsb2NrIGRyaXZlciBmb3IgTWFydmVsbCA4OFBNODYweCBQTUlDCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgKiBBdXRob3I6CUhhb2ppYW4gWmh1YW5nIDxoYW9qaWFuLnpodWFuZ0BtYXJ2ZWxsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkLzg4cG04NjB4Lmg+CisKKyNkZWZpbmUgVlJUQ19DQUxJQlJBVElPTgorCitzdHJ1Y3QgcG04NjB4X3J0Y19pbmZvIHsKKwlzdHJ1Y3QgcG04NjB4X2NoaXAJKmNoaXA7CisJc3RydWN0IGkyY19jbGllbnQJKmkyYzsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjX2RldjsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBkZWxheWVkX3dvcmsJY2FsaWJfd29yazsKKworCWludAkJCWlycTsKKwlpbnQJCQl2cnRjOworCWludAkJCSgqc3luYykodW5zaWduZWQgaW50IHRpY2tzKTsKK307CisKKyNkZWZpbmUgUkVHX1ZSVENfTUVBUzEJCTB4N0QKKworI2RlZmluZSBSRUcwX0FERFIJCTB4QjAKKyNkZWZpbmUgUkVHMV9BRERSCQkweEIyCisjZGVmaW5lIFJFRzJfQUREUgkJMHhCNAorI2RlZmluZSBSRUczX0FERFIJCTB4QjYKKworI2RlZmluZSBSRUcwX0RBVEEJCTB4QjEKKyNkZWZpbmUgUkVHMV9EQVRBCQkweEIzCisjZGVmaW5lIFJFRzJfREFUQQkJMHhCNQorI2RlZmluZSBSRUczX0RBVEEJCTB4QjcKKworLyogYml0IGRlZmluaXRpb25zIG9mIE1lYXN1cmVtZW50IEVuYWJsZSBSZWdpc3RlciAyICgweDUxKSAqLworI2RlZmluZSBNRUFTMl9WUlRDCQkoMSA8PCAwKQorCisvKiBiaXQgZGVmaW5pdGlvbnMgb2YgUlRDIFJlZ2lzdGVyIDEgKDB4QTApICovCisjZGVmaW5lIEFMQVJNX0VOCQkoMSA8PCAzKQorI2RlZmluZSBBTEFSTV9XQUtFVVAJCSgxIDw8IDQpCisjZGVmaW5lIEFMQVJNCQkJKDEgPDwgNSkKKyNkZWZpbmUgUlRDMV9VU0VfWE8JCSgxIDw8IDcpCisKKyNkZWZpbmUgVlJUQ19DQUxJQl9JTlRFUlZBTAkoSFogKiA2MCAqIDEwKQkJLyogMTAgbWludXRlcyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgcnRjX3VwZGF0ZV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBtODYweF9ydGNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcG04NjB4X3J0Y19pbmZvICopZGF0YTsKKwlpbnQgbWFzazsKKworCW1hc2sgPSBBTEFSTSB8IEFMQVJNX1dBS0VVUDsKKwlwbTg2MHhfc2V0X2JpdHMoaW5mby0+aTJjLCBQTTg2MDdfUlRDMSwgbWFzayB8IEFMQVJNX0VOLCBtYXNrKTsKKwlydGNfdXBkYXRlX2lycShpbmZvLT5ydGNfZGV2LCAxLCBSVENfQUYpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBwbTg2MHhfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgcG04NjB4X3J0Y19pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZW5hYmxlZCkKKwkJcG04NjB4X3NldF9iaXRzKGluZm8tPmkyYywgUE04NjA3X1JUQzEsIEFMQVJNX0VOLCBBTEFSTV9FTik7CisJZWxzZQorCQlwbTg2MHhfc2V0X2JpdHMoaW5mby0+aTJjLCBQTTg2MDdfUlRDMSwgQUxBUk1fRU4sIDApOworCXJldHVybiAwOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBuZXh0IGFsYXJtIHRpbWUgZ2l2ZW4gdGhlIHJlcXVlc3RlZCBhbGFybSB0aW1lIG1hc2sKKyAqIGFuZCB0aGUgY3VycmVudCB0aW1lLgorICovCitzdGF0aWMgdm9pZCBydGNfbmV4dF9hbGFybV90aW1lKHN0cnVjdCBydGNfdGltZSAqbmV4dCwgc3RydWN0IHJ0Y190aW1lICpub3csCisJCQkJc3RydWN0IHJ0Y190aW1lICphbHJtKQoreworCXVuc2lnbmVkIGxvbmcgbmV4dF90aW1lOworCXVuc2lnbmVkIGxvbmcgbm93X3RpbWU7CisKKwluZXh0LT50bV95ZWFyID0gbm93LT50bV95ZWFyOworCW5leHQtPnRtX21vbiA9IG5vdy0+dG1fbW9uOworCW5leHQtPnRtX21kYXkgPSBub3ctPnRtX21kYXk7CisJbmV4dC0+dG1faG91ciA9IGFscm0tPnRtX2hvdXI7CisJbmV4dC0+dG1fbWluID0gYWxybS0+dG1fbWluOworCW5leHQtPnRtX3NlYyA9IGFscm0tPnRtX3NlYzsKKworCXJ0Y190bV90b190aW1lKG5vdywgJm5vd190aW1lKTsKKwlydGNfdG1fdG9fdGltZShuZXh0LCAmbmV4dF90aW1lKTsKKworCWlmIChuZXh0X3RpbWUgPCBub3dfdGltZSkgeworCQkvKiBBZHZhbmNlIG9uZSBkYXkgKi8KKwkJbmV4dF90aW1lICs9IDYwICogNjAgKiAyNDsKKwkJcnRjX3RpbWVfdG9fdG0obmV4dF90aW1lLCBuZXh0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcG04NjB4X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbTg2MHhfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwl1bnNpZ25lZCBsb25nIHRpY2tzLCBiYXNlLCBkYXRhOworCisJcG04NjB4X3BhZ2VfYnVsa19yZWFkKGluZm8tPmkyYywgUkVHMF9BRERSLCA4LCBidWYpOworCWRldl9kYmcoaW5mby0+ZGV2LCAiJXgtJXgtJXgtJXgtJXgtJXgtJXgtJXhcbiIsIGJ1ZlswXSwgYnVmWzFdLAorCQlidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0sIGJ1Zls2XSwgYnVmWzddKTsKKwliYXNlID0gKGJ1ZlsxXSA8PCAyNCkgfCAoYnVmWzNdIDw8IDE2KSB8IChidWZbNV0gPDwgOCkgfCBidWZbN107CisKKwkvKiBsb2FkIDMyLWJpdCByZWFkLW9ubHkgY291bnRlciAqLworCXBtODYweF9idWxrX3JlYWQoaW5mby0+aTJjLCBQTTg2MDdfUlRDX0NPVU5URVIxLCA0LCBidWYpOworCWRhdGEgPSAoYnVmWzNdIDw8IDI0KSB8IChidWZbMl0gPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlswXTsKKwl0aWNrcyA9IGJhc2UgKyBkYXRhOworCWRldl9kYmcoaW5mby0+ZGV2LCAiZ2V0IGJhc2U6MHglbHgsIFJPIGNvdW50OjB4JWx4LCB0aWNrczoweCVseFxuIiwKKwkJYmFzZSwgZGF0YSwgdGlja3MpOworCisJcnRjX3RpbWVfdG9fdG0odGlja3MsIHRtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtODYweF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbTg2MHhfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKwl1bnNpZ25lZCBsb25nIHRpY2tzLCBiYXNlLCBkYXRhOworCisJaWYgKCh0bS0+dG1feWVhciA8IDcwKSB8fCAodG0tPnRtX3llYXIgPiAxMzgpKSB7CisJCWRldl9kYmcoaW5mby0+ZGV2LCAiU2V0IHRpbWUgJWQgb3V0IG9mIHJhbmdlLiAiCisJCQkiUGxlYXNlIHNldCB0aW1lIGJldHdlZW4gMTk3MCB0byAyMDM4LlxuIiwKKwkJCTE5MDAgKyB0bS0+dG1feWVhcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlydGNfdG1fdG9fdGltZSh0bSwgJnRpY2tzKTsKKworCS8qIGxvYWQgMzItYml0IHJlYWQtb25seSBjb3VudGVyICovCisJcG04NjB4X2J1bGtfcmVhZChpbmZvLT5pMmMsIFBNODYwN19SVENfQ09VTlRFUjEsIDQsIGJ1Zik7CisJZGF0YSA9IChidWZbM10gPDwgMjQpIHwgKGJ1ZlsyXSA8PCAxNikgfCAoYnVmWzFdIDw8IDgpIHwgYnVmWzBdOworCWJhc2UgPSB0aWNrcyAtIGRhdGE7CisJZGV2X2RiZyhpbmZvLT5kZXYsICJzZXQgYmFzZToweCVseCwgUk8gY291bnQ6MHglbHgsIHRpY2tzOjB4JWx4XG4iLAorCQliYXNlLCBkYXRhLCB0aWNrcyk7CisKKwlwbTg2MHhfcGFnZV9yZWdfd3JpdGUoaW5mby0+aTJjLCBSRUcwX0RBVEEsIChiYXNlID4+IDI0KSAmIDB4RkYpOworCXBtODYweF9wYWdlX3JlZ193cml0ZShpbmZvLT5pMmMsIFJFRzFfREFUQSwgKGJhc2UgPj4gMTYpICYgMHhGRik7CisJcG04NjB4X3BhZ2VfcmVnX3dyaXRlKGluZm8tPmkyYywgUkVHMl9EQVRBLCAoYmFzZSA+PiA4KSAmIDB4RkYpOworCXBtODYweF9wYWdlX3JlZ193cml0ZShpbmZvLT5pMmMsIFJFRzNfREFUQSwgYmFzZSAmIDB4RkYpOworCisJaWYgKGluZm8tPnN5bmMpCisJCWluZm8tPnN5bmModGlja3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtODYweF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbTg2MHhfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwl1bnNpZ25lZCBsb25nIHRpY2tzLCBiYXNlLCBkYXRhOworCWludCByZXQ7CisKKwlwbTg2MHhfcGFnZV9idWxrX3JlYWQoaW5mby0+aTJjLCBSRUcwX0FERFIsIDgsIGJ1Zik7CisJZGV2X2RiZyhpbmZvLT5kZXYsICIleC0leC0leC0leC0leC0leC0leC0leFxuIiwgYnVmWzBdLCBidWZbMV0sCisJCWJ1ZlsyXSwgYnVmWzNdLCBidWZbNF0sIGJ1Zls1XSwgYnVmWzZdLCBidWZbN10pOworCWJhc2UgPSAoYnVmWzFdIDw8IDI0KSB8IChidWZbM10gPDwgMTYpIHwgKGJ1Zls1XSA8PCA4KSB8IGJ1Zls3XTsKKworCXBtODYweF9idWxrX3JlYWQoaW5mby0+aTJjLCBQTTg2MDdfUlRDX0VYUElSRTEsIDQsIGJ1Zik7CisJZGF0YSA9IChidWZbM10gPDwgMjQpIHwgKGJ1ZlsyXSA8PCAxNikgfCAoYnVmWzFdIDw8IDgpIHwgYnVmWzBdOworCXRpY2tzID0gYmFzZSArIGRhdGE7CisJZGV2X2RiZyhpbmZvLT5kZXYsICJnZXQgYmFzZToweCVseCwgUk8gY291bnQ6MHglbHgsIHRpY2tzOjB4JWx4XG4iLAorCQliYXNlLCBkYXRhLCB0aWNrcyk7CisKKwlydGNfdGltZV90b190bSh0aWNrcywgJmFscm0tPnRpbWUpOworCXJldCA9IHBtODYweF9yZWdfcmVhZChpbmZvLT5pMmMsIFBNODYwN19SVEMxKTsKKwlhbHJtLT5lbmFibGVkID0gKHJldCAmIEFMQVJNX0VOKSA/IDEgOiAwOworCWFscm0tPnBlbmRpbmcgPSAocmV0ICYgKEFMQVJNIHwgQUxBUk1fV0FLRVVQKSkgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTg2MHhfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbTg2MHhfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcnRjX3RpbWUgbm93X3RtLCBhbGFybV90bTsKKwl1bnNpZ25lZCBsb25nIHRpY2tzLCBiYXNlLCBkYXRhOworCXVuc2lnbmVkIGNoYXIgYnVmWzhdOworCWludCBtYXNrOworCisJcG04NjB4X3NldF9iaXRzKGluZm8tPmkyYywgUE04NjA3X1JUQzEsIEFMQVJNX0VOLCAwKTsKKworCXBtODYweF9wYWdlX2J1bGtfcmVhZChpbmZvLT5pMmMsIFJFRzBfQUREUiwgOCwgYnVmKTsKKwlkZXZfZGJnKGluZm8tPmRldiwgIiV4LSV4LSV4LSV4LSV4LSV4LSV4LSV4XG4iLCBidWZbMF0sIGJ1ZlsxXSwKKwkJYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdLCBidWZbNl0sIGJ1Zls3XSk7CisJYmFzZSA9IChidWZbMV0gPDwgMjQpIHwgKGJ1ZlszXSA8PCAxNikgfCAoYnVmWzVdIDw8IDgpIHwgYnVmWzddOworCisJLyogbG9hZCAzMi1iaXQgcmVhZC1vbmx5IGNvdW50ZXIgKi8KKwlwbTg2MHhfYnVsa19yZWFkKGluZm8tPmkyYywgUE04NjA3X1JUQ19DT1VOVEVSMSwgNCwgYnVmKTsKKwlkYXRhID0gKGJ1ZlszXSA8PCAyNCkgfCAoYnVmWzJdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMF07CisJdGlja3MgPSBiYXNlICsgZGF0YTsKKwlkZXZfZGJnKGluZm8tPmRldiwgImdldCBiYXNlOjB4JWx4LCBSTyBjb3VudDoweCVseCwgdGlja3M6MHglbHhcbiIsCisJCWJhc2UsIGRhdGEsIHRpY2tzKTsKKworCXJ0Y190aW1lX3RvX3RtKHRpY2tzLCAmbm93X3RtKTsKKwlydGNfbmV4dF9hbGFybV90aW1lKCZhbGFybV90bSwgJm5vd190bSwgJmFscm0tPnRpbWUpOworCS8qIGdldCBuZXcgdGlja3MgZm9yIGFsYXJtIGluIDI0IGhvdXJzICovCisJcnRjX3RtX3RvX3RpbWUoJmFsYXJtX3RtLCAmdGlja3MpOworCWRhdGEgPSB0aWNrcyAtIGJhc2U7CisKKwlidWZbMF0gPSBkYXRhICYgMHhmZjsKKwlidWZbMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CisJYnVmWzJdID0gKGRhdGEgPj4gMTYpICYgMHhmZjsKKwlidWZbM10gPSAoZGF0YSA+PiAyNCkgJiAweGZmOworCXBtODYweF9idWxrX3dyaXRlKGluZm8tPmkyYywgUE04NjA3X1JUQ19FWFBJUkUxLCA0LCBidWYpOworCWlmIChhbHJtLT5lbmFibGVkKSB7CisJCW1hc2sgPSBBTEFSTSB8IEFMQVJNX1dBS0VVUCB8IEFMQVJNX0VOOworCQlwbTg2MHhfc2V0X2JpdHMoaW5mby0+aTJjLCBQTTg2MDdfUlRDMSwgbWFzaywgbWFzayk7CisJfSBlbHNlIHsKKwkJbWFzayA9IEFMQVJNIHwgQUxBUk1fV0FLRVVQIHwgQUxBUk1fRU47CisJCXBtODYweF9zZXRfYml0cyhpbmZvLT5pMmMsIFBNODYwN19SVEMxLCBtYXNrLAorCQkJCUFMQVJNIHwgQUxBUk1fV0FLRVVQKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBwbTg2MHhfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gcG04NjB4X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gcG04NjB4X3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IHBtODYweF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gcG04NjB4X3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBwbTg2MHhfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCisjaWZkZWYgVlJUQ19DQUxJQlJBVElPTgorc3RhdGljIHZvaWQgY2FsaWJyYXRlX3ZydGNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHBtODYweF9ydGNfaW5mbyAqaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgcG04NjB4X3J0Y19pbmZvLCBjYWxpYl93b3JrLndvcmspOworCXVuc2lnbmVkIGNoYXIgYnVmWzJdOworCXVuc2lnbmVkIGludCBzdW0sIGRhdGEsIG1lYW4sIHZydGNfc2V0OworCWludCBpOworCisJZm9yIChpID0gMCwgc3VtID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJbXNsZWVwKDEwMCk7CisJCXBtODYweF9idWxrX3JlYWQoaW5mby0+aTJjLCBSRUdfVlJUQ19NRUFTMSwgMiwgYnVmKTsKKwkJZGF0YSA9IChidWZbMF0gPDwgNCkgfCBidWZbMV07CisJCWRhdGEgPSAoZGF0YSAqIDU0MDApID4+IDEyOwkvKiBjb252ZXJ0IHRvIG12ICovCisJCXN1bSArPSBkYXRhOworCX0KKwltZWFuID0gc3VtID4+IDQ7CisJdnJ0Y19zZXQgPSAyNzAwICsgKGluZm8tPnZydGMgJiAweDMpICogMjAwOworCWRldl9kYmcoaW5mby0+ZGV2LCAibWVhbjolZCwgdnJ0Y19zZXQ6JWRcbiIsIG1lYW4sIHZydGNfc2V0KTsKKworCXN1bSA9IHBtODYweF9yZWdfcmVhZChpbmZvLT5pMmMsIFBNODYwN19SVENfTUlTQzEpOworCWRhdGEgPSBzdW0gJiAweDM7CisJaWYgKChtZWFuICsgMjAwKSA8IHZydGNfc2V0KSB7CisJCS8qIHRyeSBoaWdoZXIgdm9sdGFnZSAqLworCQlpZiAoKytkYXRhID09IDQpCisJCQlnb3RvIG91dDsKKwkJZGF0YSA9IChzdW0gJiAweGY4KSB8IChkYXRhICYgMHgzKTsKKwkJcG04NjB4X3JlZ193cml0ZShpbmZvLT5pMmMsIFBNODYwN19SVENfTUlTQzEsIGRhdGEpOworCX0gZWxzZSBpZiAoKG1lYW4gLSAyMDApID4gdnJ0Y19zZXQpIHsKKwkJLyogdHJ5IGxvd2VyIHZvbHRhZ2UgKi8KKwkJaWYgKGRhdGEtLSA9PSAwKQorCQkJZ290byBvdXQ7CisJCWRhdGEgPSAoc3VtICYgMHhmOCkgfCAoZGF0YSAmIDB4Myk7CisJCXBtODYweF9yZWdfd3JpdGUoaW5mby0+aTJjLCBQTTg2MDdfUlRDX01JU0MxLCBkYXRhKTsKKwl9IGVsc2UKKwkJZ290byBvdXQ7CisJZGV2X2RiZyhpbmZvLT5kZXYsICJzZXQgMHgleCB0byBSVENfTUlTQzFcbiIsIGRhdGEpOworCS8qIHRyaWdnZXIgbmV4dCBjYWxpYnJhdGlvbiBzaW5jZSBWUlRDIGlzIHVwZGF0ZWQgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmluZm8tPmNhbGliX3dvcmssIFZSVENfQ0FMSUJfSU5URVJWQUwpOworCXJldHVybjsKK291dDoKKwkvKiBkaXNhYmxlIG1lYXN1cmVtZW50ICovCisJcG04NjB4X3NldF9iaXRzKGluZm8tPmkyYywgUE04NjA3X01FQVNfRU4yLCBNRUFTMl9WUlRDLCAwKTsKKwlkZXZfZGJnKGluZm8tPmRldiwgImZpbmlzaCBWUlRDIGNhbGlicmF0aW9uXG4iKTsKKwlyZXR1cm47Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgcG04NjB4X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbTg2MHhfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgcG04NjB4X3J0Y19wZGF0YSAqcGRhdGEgPSBOVUxMOworCXN0cnVjdCBwbTg2MHhfcnRjX2luZm8gKmluZm87CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXVuc2lnbmVkIGxvbmcgdGlja3MgPSAwOworCWludCByZXQ7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSA9PSBOVUxMKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSFcbiIpOworCisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbTg2MHhfcnRjX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCWluZm8tPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGluZm8tPmlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gSVJRIHJlc291cmNlIVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWluZm8tPmNoaXAgPSBjaGlwOworCWluZm8tPmkyYyA9IChjaGlwLT5pZCA9PSBDSElQX1BNODYwNykgPyBjaGlwLT5jbGllbnQgOiBjaGlwLT5jb21wYW5pb247CisJaW5mby0+ZGV2ID0gJnBkZXYtPmRldjsKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgaW5mbyk7CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpbmZvLT5pcnEsIE5VTEwsIHJ0Y191cGRhdGVfaGFuZGxlciwKKwkJCQkgICBJUlFGX09ORVNIT1QsICJydGMiLCBpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNoaXAtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUTogIyVkOiAlZFxuIiwKKwkJCWluZm8tPmlycSwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogc2V0IGFkZHJlc3NlcyBvZiAzMi1iaXQgYmFzZSB2YWx1ZSBmb3IgUlRDIHRpbWUgKi8KKwlwbTg2MHhfcGFnZV9yZWdfd3JpdGUoaW5mby0+aTJjLCBSRUcwX0FERFIsIFJFRzBfREFUQSk7CisJcG04NjB4X3BhZ2VfcmVnX3dyaXRlKGluZm8tPmkyYywgUkVHMV9BRERSLCBSRUcxX0RBVEEpOworCXBtODYweF9wYWdlX3JlZ193cml0ZShpbmZvLT5pMmMsIFJFRzJfQUREUiwgUkVHMl9EQVRBKTsKKwlwbTg2MHhfcGFnZV9yZWdfd3JpdGUoaW5mby0+aTJjLCBSRUczX0FERFIsIFJFRzNfREFUQSk7CisKKwlyZXQgPSBwbTg2MHhfcnRjX3JlYWRfdGltZSgmcGRldi0+ZGV2LCAmdG0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWFkIGluaXRpYWwgdGltZS5cbiIpOworCQlnb3RvIG91dF9ydGM7CisJfQorCWlmICgodG0udG1feWVhciA8IDcwKSB8fCAodG0udG1feWVhciA+IDEzOCkpIHsKKwkJdG0udG1feWVhciA9IDcwOworCQl0bS50bV9tb24gPSAwOworCQl0bS50bV9tZGF5ID0gMTsKKwkJdG0udG1faG91ciA9IDA7CisJCXRtLnRtX21pbiA9IDA7CisJCXRtLnRtX3NlYyA9IDA7CisJCXJldCA9IHBtODYweF9ydGNfc2V0X3RpbWUoJnBkZXYtPmRldiwgJnRtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzZXQgaW5pdGlhbCB0aW1lLlxuIik7CisJCQlnb3RvIG91dF9ydGM7CisJCX0KKwl9CisJcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGlja3MpOworCWlmIChwZGF0YSAmJiBwZGF0YS0+c3luYykgeworCQlwZGF0YS0+c3luYyh0aWNrcyk7CisJCWluZm8tPnN5bmMgPSBwZGF0YS0+c3luYzsKKwl9CisKKwlpbmZvLT5ydGNfZGV2ID0gcnRjX2RldmljZV9yZWdpc3RlcigiODhwbTg2MHgtcnRjIiwgJnBkZXYtPmRldiwKKwkJCQkJICAgICZwbTg2MHhfcnRjX29wcywgVEhJU19NT0RVTEUpOworCXJldCA9IFBUUl9FUlIoaW5mby0+cnRjX2Rldik7CisJaWYgKElTX0VSUihpbmZvLT5ydGNfZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlRDIGRldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X3J0YzsKKwl9CisKKwkvKgorCSAqIGVuYWJsZSBpbnRlcm5hbCBYTyBpbnN0ZWFkIG9mIGludGVybmFsIDMuMjVNSHogY2xvY2sgc2luY2UgaXQgY2FuCisJICogZnJlZSBydW5uaW5nIGluIFBNSUMgcG93ZXItZG93biBzdGF0ZS4KKwkgKi8KKwlwbTg2MHhfc2V0X2JpdHMoaW5mby0+aTJjLCBQTTg2MDdfUlRDMSwgUlRDMV9VU0VfWE8sIFJUQzFfVVNFX1hPKTsKKworI2lmZGVmIFZSVENfQ0FMSUJSQVRJT04KKwkvKiA8MDA+IC0tIDIuN1YsIDwwMT4gLS0gMi45ViwgPDEwPiAtLSAzLjFWLCA8MTE+IC0tIDMuM1YgKi8KKwlpZiAocGRhdGEgJiYgcGRhdGEtPnZydGMpCisJCWluZm8tPnZydGMgPSBwZGF0YS0+dnJ0YyAmIDB4MzsKKwllbHNlCisJCWluZm8tPnZydGMgPSAxOworCXBtODYweF9zZXRfYml0cyhpbmZvLT5pMmMsIFBNODYwN19NRUFTX0VOMiwgTUVBUzJfVlJUQywgTUVBUzJfVlJUQyk7CisKKwkvKiBjYWxpYnJhdGUgVlJUQyAqLworCUlOSVRfREVMQVlFRF9XT1JLKCZpbmZvLT5jYWxpYl93b3JrLCBjYWxpYnJhdGVfdnJ0Y193b3JrKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmluZm8tPmNhbGliX3dvcmssIFZSVENfQ0FMSUJfSU5URVJWQUwpOworI2VuZGlmCS8qIFZSVENfQ0FMSUJSQVRJT04gKi8KKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKworCXJldHVybiAwOworb3V0X3J0YzoKKwlmcmVlX2lycShpbmZvLT5pcnEsIGluZm8pOworb3V0OgorCWtmcmVlKGluZm8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBtODYweF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBtODYweF9ydGNfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisjaWZkZWYgVlJUQ19DQUxJQlJBVElPTgorCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJLyogZGlzYWJsZSBtZWFzdXJlbWVudCAqLworCXBtODYweF9zZXRfYml0cyhpbmZvLT5pMmMsIFBNODYwN19NRUFTX0VOMiwgTUVBUzJfVlJUQywgMCk7CisjZW5kaWYJLyogVlJUQ19DQUxJQlJBVElPTiAqLworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPnJ0Y19kZXYpOworCWZyZWVfaXJxKGluZm8tPmlycSwgaW5mbyk7CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgcG04NjB4X3J0Y19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWNoaXAtPndha2V1cF9mbGFnIHw9IDEgPDwgUE04NjA3X0lSUV9SVEM7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHBtODYweF9ydGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWNoaXAtPndha2V1cF9mbGFnICY9IH4oMSA8PCBQTTg2MDdfSVJRX1JUQyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHBtODYweF9ydGNfcG1fb3BzLCBwbTg2MHhfcnRjX3N1c3BlbmQsIHBtODYweF9ydGNfcmVzdW1lKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcG04NjB4X3J0Y19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIjg4cG04NjB4LXJ0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmcG04NjB4X3J0Y19wbV9vcHMsCisJfSwKKwkucHJvYmUJCT0gcG04NjB4X3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBtODYweF9ydGNfcmVtb3ZlKSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocG04NjB4X3J0Y19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgODhQTTg2MHggUlRDIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSGFvamlhbiBaaHVhbmcgPGhhb2ppYW4uemh1YW5nQG1hcnZlbGwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWFiMzEwMC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWFiMzEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MWEwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYWIzMTAwLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBTVC1Fcmljc3NvbiBBQgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKiBSVEMgY2xvY2sgZHJpdmVyIGZvciB0aGUgQUIzMTAwIEFuYWxvZyBCYXNlYmFuZCBDaGlwCisgKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgorCisvKiBDbG9jayByYXRlIGluIEh6ICovCisjZGVmaW5lIEFCMzEwMF9SVENfQ0xPQ0tfUkFURQkzMjc2OAorCisvKgorICogVGhlIEFCMzEwMCBSVEMgcmVnaXN0ZXJzLiBUaGVzZSBhcmUgdGhlIHNhbWUgZm9yCisgKiBBQjMwMDAgYW5kIEFCMzEwMC4KKyAqIENvbnRyb2wgcmVnaXN0ZXI6CisgKiBCaXQgMDogUlRDIE1vbml0b3IgY2xlYXJlZD0wLCBhY3RpdmU9MSwgaWYgeW91IHNldCBpdAorICogICAgICAgIHRvIDEgaXQgcmVtYWlucyBhY3RpdmUgdW50aWwgUlRDIHBvd2VyIGlzIGxvc3QuCisgKiBCaXQgMTogMzIga0h6IE9zY2lsbGF0b3IsIDAgPSBvbiwgMSA9IGJ5cGFzcworICogQml0IDI6IEFsYXJtIG9uLCAwID0gb2ZmLCAxID0gb24KKyAqIEJpdCAzOiAzMiBrSHogYnVmZmVyIGRpc2FibGluZywgMCA9IGVuYWJsZWQsIDEgPSBkaXNhYmxlZAorICovCisjZGVmaW5lIEFCMzEwMF9SVEMJCTB4NTMKKy8qIGRlZmF1bHQgc2V0dGluZywgYnVmZmVyIGRpc2FibGVkLCBhbGFybSBvbiAqLworI2RlZmluZSBSVENfU0VUVElORwkJMHgzMAorLyogQWxhcm0gd2hlbiBBTDAtQUwzID09IFRJMC1USTMgICovCisjZGVmaW5lIEFCMzEwMF9BTDAJCTB4NTYKKyNkZWZpbmUgQUIzMTAwX0FMMQkJMHg1NworI2RlZmluZSBBQjMxMDBfQUwyCQkweDU4CisjZGVmaW5lIEFCMzEwMF9BTDMJCTB4NTkKKy8qIFRoaXMgNDgtYml0IHJlZ2lzdGVyIHRoYXQgY291bnRzIHVwIGF0IDMyNzY4IEh6ICovCisjZGVmaW5lIEFCMzEwMF9USTAJCTB4NWEKKyNkZWZpbmUgQUIzMTAwX1RJMQkJMHg1YgorI2RlZmluZSBBQjMxMDBfVEkyCQkweDVjCisjZGVmaW5lIEFCMzEwMF9USTMJCTB4NWQKKyNkZWZpbmUgQUIzMTAwX1RJNAkJMHg1ZQorI2RlZmluZSBBQjMxMDBfVEk1CQkweDVmCisKKy8qCisgKiBSVEMgY2xvY2sgZnVuY3Rpb25zIGFuZCBkZXZpY2Ugc3RydWN0IGRlY2xhcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgYWIzMTAwX3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwl1OCByZWdzW10gPSB7QUIzMTAwX1RJMCwgQUIzMTAwX1RJMSwgQUIzMTAwX1RJMiwKKwkJICAgICBBQjMxMDBfVEkzLCBBQjMxMDBfVEk0LCBBQjMxMDBfVEk1fTsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKwl1NjQgZmF0X3RpbWUgPSAodTY0KSBzZWNzICogQUIzMTAwX1JUQ19DTE9DS19SQVRFICogMjsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaTsKKworCWJ1ZlswXSA9IChmYXRfdGltZSkgJiAweEZGOworCWJ1ZlsxXSA9IChmYXRfdGltZSA+PiA4KSAmIDB4RkY7CisJYnVmWzJdID0gKGZhdF90aW1lID4+IDE2KSAmIDB4RkY7CisJYnVmWzNdID0gKGZhdF90aW1lID4+IDI0KSAmIDB4RkY7CisJYnVmWzRdID0gKGZhdF90aW1lID4+IDMyKSAmIDB4RkY7CisJYnVmWzVdID0gKGZhdF90aW1lID4+IDQwKSAmIDB4RkY7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWVyciA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIDAsCisJCQkJCQkJcmVnc1tpXSwgYnVmW2ldKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IHRoZSBmbGFnIHRvIG1hcmsgdGhhdCB0aGUgY2xvY2sgaXMgbm93IHNldCAqLworCXJldHVybiBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGV2LCAwLAorCQkJCQkJCSAgQUIzMTAwX1JUQywKKwkJCQkJCQkgIDB4MDEsIDB4MDEpOworCit9CisKK3N0YXRpYyBpbnQgYWIzMTAwX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKwl1OCBydGN2YWw7CisJaW50IGVycjsKKworCWVyciA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIDAsCisJCQkJCQlBQjMxMDBfUlRDLCAmcnRjdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCEocnRjdmFsICYgMHgwMSkpIHsKKwkJZGV2X2luZm8oZGV2LCAiY2xvY2sgbm90IHNldCAobG9zdCBwb3dlcikiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJdTY0IGZhdF90aW1lOworCQl1OCBidWZbNl07CisKKwkJLyogUmVhZCBvdXQgdGltZSByZWdpc3RlcnMgKi8KKwkJZXJyID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9wYWdlX2ludGVycnVwdGlibGUoZGV2LCAwLAorCQkJCQkJCSAgICAgQUIzMTAwX1RJMCwKKwkJCQkJCQkgICAgIGJ1ZiwgNik7CisJCWlmIChlcnIgIT0gMCkKKwkJCXJldHVybiBlcnI7CisKKwkJZmF0X3RpbWUgPSAoKHU2NCkgYnVmWzVdIDw8IDQwKSB8ICgodTY0KSBidWZbNF0gPDwgMzIpIHwKKwkJCSgodTY0KSBidWZbM10gPDwgMjQpIHwgKCh1NjQpIGJ1ZlsyXSA8PCAxNikgfAorCQkJKCh1NjQpIGJ1ZlsxXSA8PCA4KSB8ICh1NjQpIGJ1ZlswXTsKKwkJdGltZSA9ICh1bnNpZ25lZCBsb25nKSAoZmF0X3RpbWUgLworCQkJCQkodTY0KSAoQUIzMTAwX1JUQ19DTE9DS19SQVRFICogMikpOworCX0KKworCXJ0Y190aW1lX3RvX3RtKHRpbWUsIHRtKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IGFiMzEwMF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisJdTY0IGZhdF90aW1lOworCXU4IGJ1Zls2XTsKKwl1OCBydGN2YWw7CisJaW50IGVycjsKKworCS8qIEZpZ3VyZSBvdXQgaWYgYWxhcm0gaXMgZW5hYmxlZCBvciBub3QgKi8KKwllcnIgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGV2LCAwLAorCQkJCQkJQUIzMTAwX1JUQywgJnJ0Y3ZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAocnRjdmFsICYgMHgwNCkKKwkJYWxhcm0tPmVuYWJsZWQgPSAxOworCWVsc2UKKwkJYWxhcm0tPmVuYWJsZWQgPSAwOworCS8qIE5vIGlkZWEgaG93IHRoaXMgY291bGQgYmUgcmVwcmVzZW50ZWQgKi8KKwlhbGFybS0+cGVuZGluZyA9IDA7CisJLyogUmVhZCBvdXQgYWxhcm0gcmVnaXN0ZXJzLCBvbmx5IDQgYnl0ZXMgKi8KKwllcnIgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX3BhZ2VfaW50ZXJydXB0aWJsZShkZXYsIDAsCisJCQkJCQkgICAgIEFCMzEwMF9BTDAsIGJ1ZiwgNCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlmYXRfdGltZSA9ICgodTY0KSBidWZbM10gPDwgNDApIHwgKCh1NjQpIGJ1ZlsyXSA8PCAzMikgfAorCQkoKHU2NCkgYnVmWzFdIDw8IDI0KSB8ICgodTY0KSBidWZbMF0gPDwgMTYpOworCXRpbWUgPSAodW5zaWduZWQgbG9uZykgKGZhdF90aW1lIC8gKHU2NCkgKEFCMzEwMF9SVENfQ0xPQ0tfUkFURSAqIDIpKTsKKworCXJ0Y190aW1lX3RvX3RtKHRpbWUsICZhbGFybS0+dGltZSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKCZhbGFybS0+dGltZSk7Cit9CisKK3N0YXRpYyBpbnQgYWIzMTAwX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJdTggcmVnc1tdID0ge0FCMzEwMF9BTDAsIEFCMzEwMF9BTDEsIEFCMzEwMF9BTDIsIEFCMzEwMF9BTDN9OworCXVuc2lnbmVkIGNoYXIgYnVmWzRdOworCXVuc2lnbmVkIGxvbmcgc2VjczsKKwl1NjQgZmF0X3RpbWU7CisJaW50IGVycjsKKwlpbnQgaTsKKworCXJ0Y190bV90b190aW1lKCZhbGFybS0+dGltZSwgJnNlY3MpOworCWZhdF90aW1lID0gKHU2NCkgc2VjcyAqIEFCMzEwMF9SVENfQ0xPQ0tfUkFURSAqIDI7CisJYnVmWzBdID0gKGZhdF90aW1lID4+IDE2KSAmIDB4RkY7CisJYnVmWzFdID0gKGZhdF90aW1lID4+IDI0KSAmIDB4RkY7CisJYnVmWzJdID0gKGZhdF90aW1lID4+IDMyKSAmIDB4RkY7CisJYnVmWzNdID0gKGZhdF90aW1lID4+IDQwKSAmIDB4RkY7CisKKwkvKiBTZXQgdGhlIGFsYXJtICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQllcnIgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGV2LCAwLAorCQkJCQkJCXJlZ3NbaV0sIGJ1ZltpXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwkvKiBUaGVuIGVuYWJsZSB0aGUgYWxhcm0gKi8KKwlyZXR1cm4gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwgMCwKKwkJCQkJCQkgIEFCMzEwMF9SVEMsICgxIDw8IDIpLAorCQkJCQkJCSAgYWxhcm0tPmVuYWJsZWQgPDwgMik7Cit9CisKK3N0YXRpYyBpbnQgYWIzMTAwX3J0Y19pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJLyoKKwkgKiBJdCdzIG5vdCBwb3NzaWJsZSB0byBlbmFibGUvZGlzYWJsZSB0aGUgYWxhcm0gSVJRIGZvciB0aGlzIFJUQy4KKwkgKiBJdCBkb2VzIG5vdCBhY3R1YWxseSB0cmlnZ2VyIGFueSBJUlE6IGluc3RlYWQgaXRzIG9ubHkgZnVuY3Rpb24gaXMKKwkgKiB0byBwb3dlciB1cCB0aGUgc3lzdGVtLCBpZiBpdCB3YXNuJ3Qgb24uIFRoaXMgd2lsbCBtYW5pZmVzdCBhcworCSAqIGEgInBvd2VyIHVwIGNhdXNlIiBpbiB0aGUgQUIzMTAwIHBvd2VyIGRyaXZlciAoYmF0dGVyeSBjaGFyZ2luZyBldGMpCisJICogYW5kIG5lZWQgdG8gYmUgaGFuZGxlZCB0aGVyZSBpbnN0ZWFkLgorCSAqLworCWlmIChlbmFibGVkKQorCQlyZXR1cm4gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwgMCwKKwkJCQkJCSAgICBBQjMxMDBfUlRDLCAoMSA8PCAyKSwKKwkJCQkJCSAgICAxIDw8IDIpOworCWVsc2UKKwkJcmV0dXJuIGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIDAsCisJCQkJCQkgICAgQUIzMTAwX1JUQywgKDEgPDwgMiksCisJCQkJCQkgICAgMCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhYjMxMDBfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gYWIzMTAwX3J0Y19yZWFkX3RpbWUsCisJLnNldF9tbXNzCT0gYWIzMTAwX3J0Y19zZXRfbW1zcywKKwkucmVhZF9hbGFybQk9IGFiMzEwMF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gYWIzMTAwX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBhYjMxMDBfcnRjX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhYjMxMDBfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGVycjsKKwl1OCByZWd2YWw7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKworCS8qIFRoZSBmaXJzdCBSVEMgcmVnaXN0ZXIgbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQgKi8KKwllcnIgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoJnBkZXYtPmRldiwgMCwKKwkJCQkJCUFCMzEwMF9SVEMsICZyZWd2YWwpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlYWQgUlRDIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKChyZWd2YWwgJiAweEZFKSAhPSBSVENfU0VUVElORykgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAibm90IGRlZmF1bHQgdmFsdWUgaW4gUlRDIHJlZyAweCV4XG4iLAorCQkJIHJlZ3ZhbCk7CisJfQorCisJaWYgKChyZWd2YWwgJiAxKSA9PSAwKSB7CisJCS8qCisJCSAqIFNldCBiaXQgdG8gZGV0ZWN0IHBvd2VyIGxvc3MuCisJCSAqIFRoaXMgYml0IHJlbWFpbnMgdW50aWwgUlRDIHBvd2VyIGlzIGxvc3QuCisJCSAqLworCQlyZWd2YWwgPSAxIHwgUlRDX1NFVFRJTkc7CisJCWVyciA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSgmcGRldi0+ZGV2LCAwLAorCQkJCQkJCUFCMzEwMF9SVEMsIHJlZ3ZhbCk7CisJCS8qIElnbm9yZSBhbnkgZXJyb3Igb24gdGhpcyB3cml0ZSAqLworCX0KKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImFiMzEwMC1ydGMiLCAmcGRldi0+ZGV2LCAmYWIzMTAwX3J0Y19vcHMsCisJCQkJICBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCWVyciA9IFBUUl9FUlIocnRjKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhYjMxMDBfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhYjMxMDBfcnRjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhYjMxMDAtcnRjIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCSA9IF9fZXhpdF9wKGFiMzEwMF9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFiMzEwMF9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmFiMzEwMF9ydGNfZHJpdmVyLAorCQkJCSAgICAgYWIzMTAwX3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhYjMxMDBfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWIzMTAwX3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhYjMxMDBfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoYWIzMTAwX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUIzMTAwIFJUQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1hYjg1MDAuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1hYjg1MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTFhMmVjCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWFiODUwMC5jCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEwCisgKgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKiBBdXRob3I6IFZpcnVwYXggU2FkYXNoaXZwZXRpbWF0aCA8dmlydXBheC5zYWRhc2hpdnBldGltYXRoQHN0ZXJpY3Nzb24uY29tPgorICoKKyAqIFJUQyBjbG9jayBkcml2ZXIgZm9yIHRoZSBSVEMgcGFydCBvZiB0aGUgQUI4NTAwIFBvd2VyIG1hbmFnZW1lbnQgY2hpcC4KKyAqIEJhc2VkIG9uIFJUQyBjbG9jayBkcml2ZXIgZm9yIHRoZSBBQjMxMDAgQW5hbG9nIEJhc2ViYW5kIENoaXAgYnkKKyAqIExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC9hYjg1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjZGVmaW5lIEFCODUwMF9SVENfU09GRl9TVEFUX1JFRwkweDAwCisjZGVmaW5lIEFCODUwMF9SVENfQ0NfQ09ORl9SRUcJCTB4MDEKKyNkZWZpbmUgQUI4NTAwX1JUQ19SRUFEX1JFUV9SRUcJCTB4MDIKKyNkZWZpbmUgQUI4NTAwX1JUQ19XQVRDSF9UU0VDTUlEX1JFRwkweDAzCisjZGVmaW5lIEFCODUwMF9SVENfV0FUQ0hfVFNFQ0hJX1JFRwkweDA0CisjZGVmaW5lIEFCODUwMF9SVENfV0FUQ0hfVE1JTl9MT1dfUkVHCTB4MDUKKyNkZWZpbmUgQUI4NTAwX1JUQ19XQVRDSF9UTUlOX01JRF9SRUcJMHgwNgorI2RlZmluZSBBQjg1MDBfUlRDX1dBVENIX1RNSU5fSElfUkVHCTB4MDcKKyNkZWZpbmUgQUI4NTAwX1JUQ19BTFJNX01JTl9MT1dfUkVHCTB4MDgKKyNkZWZpbmUgQUI4NTAwX1JUQ19BTFJNX01JTl9NSURfUkVHCTB4MDkKKyNkZWZpbmUgQUI4NTAwX1JUQ19BTFJNX01JTl9ISV9SRUcJMHgwQQorI2RlZmluZSBBQjg1MDBfUlRDX1NUQVRfUkVHCQkweDBCCisjZGVmaW5lIEFCODUwMF9SVENfQktVUF9DSEdfUkVHCQkweDBDCisjZGVmaW5lIEFCODUwMF9SVENfRk9SQ0VfQktVUF9SRUcJMHgwRAorI2RlZmluZSBBQjg1MDBfUlRDX0NBTElCX1JFRwkJMHgwRQorI2RlZmluZSBBQjg1MDBfUlRDX1NXSVRDSF9TVEFUX1JFRwkweDBGCisKKy8qIFJ0Y1JlYWRSZXF1ZXN0IGJpdHMgKi8KKyNkZWZpbmUgUlRDX1JFQURfUkVRVUVTVAkJMHgwMQorI2RlZmluZSBSVENfV1JJVEVfUkVRVUVTVAkJMHgwMgorCisvKiBSdGNDdHJsIGJpdHMgKi8KKyNkZWZpbmUgUlRDX0FMQVJNX0VOQQkJCTB4MDQKKyNkZWZpbmUgUlRDX1NUQVRVU19EQVRBCQkJMHgwMQorCisjZGVmaW5lIENPVU5UU19QRVJfU0VDCQkJKDB4RjAwMCAvIDYwKQorI2RlZmluZSBBQjg1MDBfUlRDX0VQT0NICQkyMDAwCisKK3N0YXRpYyBjb25zdCB1OCBhYjg1MDBfcnRjX3RpbWVfcmVnc1tdID0geworCUFCODUwMF9SVENfV0FUQ0hfVE1JTl9ISV9SRUcsIEFCODUwMF9SVENfV0FUQ0hfVE1JTl9NSURfUkVHLAorCUFCODUwMF9SVENfV0FUQ0hfVE1JTl9MT1dfUkVHLCBBQjg1MDBfUlRDX1dBVENIX1RTRUNISV9SRUcsCisJQUI4NTAwX1JUQ19XQVRDSF9UU0VDTUlEX1JFRworfTsKKworc3RhdGljIGNvbnN0IHU4IGFiODUwMF9ydGNfYWxhcm1fcmVnc1tdID0geworCUFCODUwMF9SVENfQUxSTV9NSU5fSElfUkVHLCBBQjg1MDBfUlRDX0FMUk1fTUlOX01JRF9SRUcsCisJQUI4NTAwX1JUQ19BTFJNX01JTl9MT1dfUkVHCit9OworCisvKiBDYWxjdWxhdGUgdGhlIHNlY29uZHMgZnJvbSAxOTcwIHRvIDAxLTAxLTIwMDAgMDA6MDA6MDAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9lbGFwc2VkX3NlY29uZHMoaW50IHllYXIpCit7CisJdW5zaWduZWQgbG9uZyBzZWNzOworCXN0cnVjdCBydGNfdGltZSB0bSA9IHsKKwkJLnRtX3llYXIgPSB5ZWFyIC0gMTkwMCwKKwkJLnRtX21kYXkgPSAxLAorCX07CisKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBzZWNzIGZyb20gMTk3MCBhbmQgbm90IGZyb20KKwkgKiAxOTAwLCBldmVuIGlmIHdlIHN1cHBseSB0aGUgb2Zmc2V0IGZyb20geWVhciAxOTAwLgorCSAqLworCXJ0Y190bV90b190aW1lKCZ0bSwgJnNlY3MpOworCXJldHVybiBzZWNzOworfQorCitzdGF0aWMgaW50IGFiODUwMF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJaW50IHJldHZhbCwgaTsKKwl1bnNpZ25lZCBsb25nIG1pbnMsIHNlY3M7CisJdW5zaWduZWQgY2hhciBidWZbQVJSQVlfU0laRShhYjg1MDBfcnRjX3RpbWVfcmVncyldOworCXU4IHZhbHVlOworCisJLyogUmVxdWVzdCBhIGRhdGEgcmVhZCAqLworCXJldHZhbCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsCisJCUFCODUwMF9SVEMsIEFCODUwMF9SVENfUkVBRF9SRVFfUkVHLCBSVENfUkVBRF9SRVFVRVNUKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIEVhcmx5IEFCODUwMCBjaGlwcyB3aWxsIG5vdCBjbGVhciB0aGUgcnRjIHJlYWQgcmVxdWVzdCBiaXQgKi8KKwlpZiAoYWJ4NTAwX2dldF9jaGlwX2lkKGRldikgPT0gMCkgeworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CisJfSBlbHNlIHsKKwkJLyogV2FpdCBmb3Igc29tZSBjeWNsZXMgYWZ0ZXIgZW5hYmxpbmcgdGhlIHJ0YyByZWFkIGluIGFiODUwMCAqLworCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXJldHZhbCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsCisJCQkJQUI4NTAwX1JUQywgQUI4NTAwX1JUQ19SRUFEX1JFUV9SRUcsICZ2YWx1ZSk7CisJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQlpZiAoISh2YWx1ZSAmIFJUQ19SRUFEX1JFUVVFU1QpKQorCQkJCWJyZWFrOworCisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgNTAwMCk7CisJCX0KKwl9CisKKwkvKiBSZWFkIHRoZSBXYXRjaHRpbWUgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWI4NTAwX3J0Y190aW1lX3JlZ3MpOyBpKyspIHsKKwkJcmV0dmFsID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwKKwkJCUFCODUwMF9SVEMsIGFiODUwMF9ydGNfdGltZV9yZWdzW2ldLCAmdmFsdWUpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJ1ZltpXSA9IHZhbHVlOworCX0KKworCW1pbnMgPSAoYnVmWzBdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMl07CisKKwlzZWNzID0JKGJ1ZlszXSA8PCA4KSB8IGJ1Zls0XTsKKwlzZWNzID0Jc2VjcyAvIENPVU5UU19QRVJfU0VDOworCXNlY3MgPQlzZWNzICsgKG1pbnMgKiA2MCk7CisKKwkvKiBBZGQgYmFjayB0aGUgaW5pdGlhbGx5IHN1YnRyYWN0ZWQgbnVtYmVyIG9mIHNlY29uZHMgKi8KKwlzZWNzICs9IGdldF9lbGFwc2VkX3NlY29uZHMoQUI4NTAwX1JUQ19FUE9DSCk7CisKKwlydGNfdGltZV90b190bShzZWNzLCB0bSk7CisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IHJldHZhbCwgaTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltBUlJBWV9TSVpFKGFiODUwMF9ydGNfdGltZV9yZWdzKV07CisJdW5zaWduZWQgbG9uZyBub19zZWNzLCBub19taW5zLCBzZWNzID0gMDsKKworCWlmICh0bS0+dG1feWVhciA8IChBQjg1MDBfUlRDX0VQT0NIIC0gMTkwMCkpIHsKKwkJZGV2X2RiZyhkZXYsICJ5ZWFyIHNob3VsZCBiZSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gJWRcbiIsCisJCQkJQUI4NTAwX1JUQ19FUE9DSCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEdldCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgMTk3MCAqLworCXJ0Y190bV90b190aW1lKHRtLCAmc2Vjcyk7CisKKwkvKgorCSAqIENvbnZlcnQgaXQgdG8gdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDAxLTAxLTIwMDAgMDA6MDA6MDAsIHNpbmNlCisJICogd2Ugb25seSBoYXZlIGEgc21hbGwgY291bnRlciBpbiB0aGUgUlRDLgorCSAqLworCXNlY3MgLT0gZ2V0X2VsYXBzZWRfc2Vjb25kcyhBQjg1MDBfUlRDX0VQT0NIKTsKKworCW5vX21pbnMgPSBzZWNzIC8gNjA7CisKKwlub19zZWNzID0gc2VjcyAlIDYwOworCS8qIE1ha2UgdGhlIHNlY29uZHMgY291bnQgYXMgcGVyIHRoZSBSVEMgcmVzb2x1dGlvbiAqLworCW5vX3NlY3MgPSBub19zZWNzICogQ09VTlRTX1BFUl9TRUM7CisKKwlidWZbNF0gPSBub19zZWNzICYgMHhGRjsKKwlidWZbM10gPSAobm9fc2VjcyA+PiA4KSAmIDB4RkY7CisKKwlidWZbMl0gPSBub19taW5zICYgMHhGRjsKKwlidWZbMV0gPSAobm9fbWlucyA+PiA4KSAmIDB4RkY7CisJYnVmWzBdID0gKG5vX21pbnMgPj4gMTYpICYgMHhGRjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9ydGNfdGltZV9yZWdzKTsgaSsrKSB7CisJCXJldHZhbCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIEFCODUwMF9SVEMsCisJCQlhYjg1MDBfcnRjX3RpbWVfcmVnc1tpXSwgYnVmW2ldKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qIFJlcXVlc3QgYSBkYXRhIHdyaXRlICovCisJcmV0dXJuIGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIEFCODUwMF9SVEMsCisJCUFCODUwMF9SVENfUkVBRF9SRVFfUkVHLCBSVENfV1JJVEVfUkVRVUVTVCk7Cit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCWludCByZXR2YWwsIGk7CisJdTggcnRjX2N0cmwsIHZhbHVlOworCXVuc2lnbmVkIGNoYXIgYnVmW0FSUkFZX1NJWkUoYWI4NTAwX3J0Y19hbGFybV9yZWdzKV07CisJdW5zaWduZWQgbG9uZyBzZWNzLCBtaW5zOworCisJLyogQ2hlY2sgaWYgdGhlIGFsYXJtIGlzIGVuYWJsZWQgb3Igbm90ICovCisJcmV0dmFsID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwgQUI4NTAwX1JUQywKKwkJQUI4NTAwX1JUQ19TVEFUX1JFRywgJnJ0Y19jdHJsKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChydGNfY3RybCAmIFJUQ19BTEFSTV9FTkEpCisJCWFsYXJtLT5lbmFibGVkID0gMTsKKwllbHNlCisJCWFsYXJtLT5lbmFibGVkID0gMDsKKworCWFsYXJtLT5wZW5kaW5nID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9ydGNfYWxhcm1fcmVncyk7IGkrKykgeworCQlyZXR2YWwgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGV2LCBBQjg1MDBfUlRDLAorCQkJYWI4NTAwX3J0Y19hbGFybV9yZWdzW2ldLCAmdmFsdWUpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJ1ZltpXSA9IHZhbHVlOworCX0KKworCW1pbnMgPSAoYnVmWzBdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCAoYnVmWzJdKTsKKwlzZWNzID0gbWlucyAqIDYwOworCisJLyogQWRkIGJhY2sgdGhlIGluaXRpYWxseSBzdWJ0cmFjdGVkIG51bWJlciBvZiBzZWNvbmRzICovCisJc2VjcyArPSBnZXRfZWxhcHNlZF9zZWNvbmRzKEFCODUwMF9SVENfRVBPQ0gpOworCisJcnRjX3RpbWVfdG9fdG0oc2VjcywgJmFsYXJtLT50aW1lKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0oJmFsYXJtLT50aW1lKTsKK30KKworc3RhdGljIGludCBhYjg1MDBfcnRjX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlyZXR1cm4gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwgQUI4NTAwX1JUQywKKwkJQUI4NTAwX1JUQ19TVEFUX1JFRywgUlRDX0FMQVJNX0VOQSwKKwkJZW5hYmxlZCA/IFJUQ19BTEFSTV9FTkEgOiAwKTsKK30KKworc3RhdGljIGludCBhYjg1MDBfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlpbnQgcmV0dmFsLCBpOworCXVuc2lnbmVkIGNoYXIgYnVmW0FSUkFZX1NJWkUoYWI4NTAwX3J0Y19hbGFybV9yZWdzKV07CisJdW5zaWduZWQgbG9uZyBtaW5zLCBzZWNzID0gMDsKKworCWlmIChhbGFybS0+dGltZS50bV95ZWFyIDwgKEFCODUwMF9SVENfRVBPQ0ggLSAxOTAwKSkgeworCQlkZXZfZGJnKGRldiwgInllYXIgc2hvdWxkIGJlIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAlZFxuIiwKKwkJCQlBQjg1MDBfUlRDX0VQT0NIKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2V0IHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwICovCisJcnRjX3RtX3RvX3RpbWUoJmFsYXJtLT50aW1lLCAmc2Vjcyk7CisKKwkvKgorCSAqIENvbnZlcnQgaXQgdG8gdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDAxLTAxLTIwMDAgMDA6MDA6MDAsIHNpbmNlCisJICogd2Ugb25seSBoYXZlIGEgc21hbGwgY291bnRlciBpbiB0aGUgUlRDLgorCSAqLworCXNlY3MgLT0gZ2V0X2VsYXBzZWRfc2Vjb25kcyhBQjg1MDBfUlRDX0VQT0NIKTsKKworCW1pbnMgPSBzZWNzIC8gNjA7CisKKwlidWZbMl0gPSBtaW5zICYgMHhGRjsKKwlidWZbMV0gPSAobWlucyA+PiA4KSAmIDB4RkY7CisJYnVmWzBdID0gKG1pbnMgPj4gMTYpICYgMHhGRjsKKworCS8qIFNldCB0aGUgYWxhcm0gdGltZSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9ydGNfYWxhcm1fcmVncyk7IGkrKykgeworCQlyZXR2YWwgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGV2LCBBQjg1MDBfUlRDLAorCQkJYWI4NTAwX3J0Y19hbGFybV9yZWdzW2ldLCBidWZbaV0pOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dXJuIGFiODUwMF9ydGNfaXJxX2VuYWJsZShkZXYsIGFsYXJtLT5lbmFibGVkKTsKK30KKworCitzdGF0aWMgaW50IGFiODUwMF9ydGNfc2V0X2NhbGlicmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGNhbGlicmF0aW9uKQoreworCWludCByZXR2YWw7CisJdTggIHJ0Y2NhbCA9IDA7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIGNhbGlicmF0aW9uIHZhbHVlICh3aGljaCBpcyBpbiB1bml0cyBvZiAwLjUKKwkgKiBwYXJ0cy1wZXItbWlsbGlvbikgaXMgaW4gdGhlIEFCODUwMCdzIHJhbmdlIGZvciBSdGNDYWxpYnJhdGlvbgorCSAqIHJlZ2lzdGVyLiAtMTI4ICgweDgwKSBpcyBub3QgcGVybWl0dGVkIGJlY2F1c2UgdGhlIEFCODUwMCB1c2VzCisJICogYSBzaWduLWJpdCByYXRoZXIgdGhhbiB0d28ncyBjb21wbGVtZW50LCBzbyAweDgwIGlzIGp1c3QgYW5vdGhlcgorCSAqIHJlcHJlc2VudGF0aW9uIG9mIHplcm8uCisJICovCisJaWYgKChjYWxpYnJhdGlvbiA8IC0xMjcpIHx8IChjYWxpYnJhdGlvbiA+IDEyNykpIHsKKwkJZGV2X2VycihkZXYsICJSdGNDYWxpYnJhdGlvbiB2YWx1ZSBvdXRzaWRlIHBlcm1pdHRlZCByYW5nZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogVGhlIEFCODUwMCB1c2VzIHNpZ24gKGluIGJpdDcpIGFuZCBtYWduaXR1ZGUgKGluIGJpdHMwLTcpCisJICogc28gbmVlZCB0byBjb252ZXJ0IHRvIHRoaXMgc29ydCBvZiByZXByZXNlbnRhdGlvbiBiZWZvcmUgd3JpdGluZworCSAqIGludG8gUnRjQ2FsaWJyYXRpb24gcmVnaXN0ZXIuLi4KKwkgKi8KKwlpZiAoY2FsaWJyYXRpb24gPj0gMCkKKwkJcnRjY2FsID0gMHg3RiAmIGNhbGlicmF0aW9uOworCWVsc2UKKwkJcnRjY2FsID0gfihjYWxpYnJhdGlvbiAtIDEpIHwgMHg4MDsKKworCXJldHZhbCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIEFCODUwMF9SVEMsCisJCQlBQjg1MDBfUlRDX0NBTElCX1JFRywgcnRjY2FsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX3J0Y19nZXRfY2FsaWJyYXRpb24oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgKmNhbGlicmF0aW9uKQoreworCWludCByZXR2YWw7CisJdTggIHJ0Y2NhbCA9IDA7CisKKwlyZXR2YWwgPSAgYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwgQUI4NTAwX1JUQywKKwkJCUFCODUwMF9SVENfQ0FMSUJfUkVHLCAmcnRjY2FsKTsKKwlpZiAocmV0dmFsID49IDApIHsKKwkJLyoKKwkJICogVGhlIEFCODUwMCB1c2VzIHNpZ24gKGluIGJpdDcpIGFuZCBtYWduaXR1ZGUgKGluIGJpdHMwLTcpCisJCSAqIHNvIG5lZWQgdG8gY29udmVydCB2YWx1ZSBmcm9tIFJ0Y0NhbGlicmF0aW9uIHJlZ2lzdGVyIGludG8KKwkJICogYSB0d28ncyBjb21wbGVtZW50IHNpZ25lZCB2YWx1ZS4uLgorCQkgKi8KKwkJaWYgKHJ0Y2NhbCAmIDB4ODApCisJCQkqY2FsaWJyYXRpb24gPSAwIC0gKHJ0Y2NhbCAmIDB4N0YpOworCQllbHNlCisJCQkqY2FsaWJyYXRpb24gPSAweDdGICYgcnRjY2FsOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFiODUwMF9zeXNmc19zdG9yZV9ydGNfY2FsaWJyYXRpb24oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXR2YWw7CisJaW50IGNhbGlicmF0aW9uID0gMDsKKworCWlmIChzc2NhbmYoYnVmLCAiICVpICIsICZjYWxpYnJhdGlvbikgIT0gMSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzdG9yZSBSVEMgY2FsaWJyYXRpb24gYXR0cmlidXRlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dmFsID0gYWI4NTAwX3J0Y19zZXRfY2FsaWJyYXRpb24oZGV2LCBjYWxpYnJhdGlvbik7CisKKwlyZXR1cm4gcmV0dmFsID8gcmV0dmFsIDogY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFiODUwMF9zeXNmc19zaG93X3J0Y19jYWxpYnJhdGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgIHJldHZhbCA9IDA7CisJaW50ICBjYWxpYnJhdGlvbiA9IDA7CisKKwlyZXR2YWwgPSBhYjg1MDBfcnRjX2dldF9jYWxpYnJhdGlvbihkZXYsICZjYWxpYnJhdGlvbik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBSVEMgY2FsaWJyYXRpb24gYXR0cmlidXRlXG4iKTsKKwkJc3ByaW50ZihidWYsICIwXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2FsaWJyYXRpb24pOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocnRjX2NhbGlicmF0aW9uLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgYWI4NTAwX3N5c2ZzX3Nob3dfcnRjX2NhbGlicmF0aW9uLAorCQkgICBhYjg1MDBfc3lzZnNfc3RvcmVfcnRjX2NhbGlicmF0aW9uKTsKKworc3RhdGljIGludCBhYjg1MDBfc3lzZnNfcnRjX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3J0Y19jYWxpYnJhdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGFiODUwMF9zeXNmc19ydGNfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3J0Y19jYWxpYnJhdGlvbik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBydGNfYWxhcm1faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBkYXRhOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gUlRDX0lSUUYgfCBSVENfQUY7CisKKwlkZXZfZGJnKCZydGMtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJcnRjX3VwZGF0ZV9pcnEocnRjLCAxLCBldmVudHMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgYWI4NTAwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQkJPSBhYjg1MDBfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJCT0gYWI4NTAwX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQkJPSBhYjg1MDBfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQkJPSBhYjg1MDBfcnRjX3NldF9hbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZQk9IGFiODUwMF9ydGNfaXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFiODUwMF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdTggcnRjX2N0cmw7CisJaW50IGlycTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJBTEFSTSIpOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gaXJxOworCisJLyogRm9yIFJUQyBzdXBwbHkgdGVzdCAqLworCWVyciA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSgmcGRldi0+ZGV2LCBBQjg1MDBfUlRDLAorCQlBQjg1MDBfUlRDX1NUQVRfUkVHLCBSVENfU1RBVFVTX0RBVEEsIFJUQ19TVEFUVVNfREFUQSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBXYWl0IGZvciByZXNldCBieSB0aGUgUG9yUnRjICovCisJdXNsZWVwX3JhbmdlKDEwMDAsIDUwMDApOworCisJZXJyID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKCZwZGV2LT5kZXYsIEFCODUwMF9SVEMsCisJCUFCODUwMF9SVENfU1RBVF9SRUcsICZydGNfY3RybCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBDaGVjayBpZiB0aGUgUlRDIFN1cHBseSBmYWlscyAqLworCWlmICghKHJ0Y19jdHJsICYgUlRDX1NUQVRVU19EQVRBKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJSVEMgc3VwcGx5IGZhaWx1cmVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgdHJ1ZSk7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJhYjg1MDAtcnRjIiwgJnBkZXYtPmRldiwgJmFiODUwMF9ydGNfb3BzLAorCQkJVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJSZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZXJyID0gUFRSX0VSUihydGMpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycSwgTlVMTCwgcnRjX2FsYXJtX2hhbmRsZXIsCisJCUlSUUZfTk9fU1VTUEVORCB8IElSUUZfT05FU0hPVCwgImFiODUwMC1ydGMiLCBydGMpOworCWlmIChlcnIgPCAwKSB7CisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisKKworCWVyciA9IGFiODUwMF9zeXNmc19ydGNfcmVnaXN0ZXIoJnBkZXYtPmRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzeXNmcyBSVEMgZmFpbGVkIHRvIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWI4NTAwX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJBTEFSTSIpOworCisJYWI4NTAwX3N5c2ZzX3J0Y191bnJlZ2lzdGVyKCZwZGV2LT5kZXYpOworCisJZnJlZV9pcnEoaXJxLCBydGMpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFiODUwMF9ydGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFiODUwMC1ydGMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IGFiODUwMF9ydGNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFiODUwMF9ydGNfcmVtb3ZlKSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWI4NTAwX3J0Y19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJWaXJ1cGF4IFNhZGFzaGl2cGV0aW1hdGggPHZpcnVwYXguc2FkYXNoaXZwZXRpbWF0aEBzdGVyaWNzc29uLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUI4NTAwIFJUQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDA4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogQW4gUlRDIGRyaXZlciBmb3IgdGhlIEFWUjMyIEFUMzJBUDcwMHggcHJvY2Vzc29yIHNlcmllcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworLyoKKyAqIFRoaXMgaXMgYSBiYXJlLWJvbmVzIFJUQy4gSXQgcnVucyBkdXJpbmcgbW9zdCBzeXN0ZW0gc2xlZXAgc3RhdGVzLCBidXQgaGFzCisgKiBubyBiYXR0ZXJ5IGJhY2t1cCBhbmQgZ2V0cyByZXNldCBkdXJpbmcgc3lzdGVtIHJlc3RhcnQuICBJdCBtdXN0IGJlCisgKiBpbml0aWFsaXplZCBmcm9tIGFuIGV4dGVybmFsIGNsb2NrIChuZXR3b3JrLCBJMkMsIGV0YykgYmVmb3JlIGl0IGNhbiBiZSBvZgorICogbXVjaCB1c2UuCisgKgorICogVGhlIGFsYXJtIGZ1bmN0aW9uYWxpdHkgaXMgbGltaXRlZCBieSB0aGUgaGFyZHdhcmUsIG5vdCBzdXBwb3J0aW5nCisgKiBwZXJpb2RpYyBpbnRlcnJ1cHRzLgorICovCisKKyNkZWZpbmUgUlRDX0NUUkwJCTB4MDAKKyNkZWZpbmUgUlRDX0NUUkxfRU4JCSAgIDAKKyNkZWZpbmUgUlRDX0NUUkxfUENMUgkJICAgMQorI2RlZmluZSBSVENfQ1RSTF9UT1BFTgkJICAgMgorI2RlZmluZSBSVENfQ1RSTF9QU0VMCQkgICA4CisKKyNkZWZpbmUgUlRDX1ZBTAkJCTB4MDQKKworI2RlZmluZSBSVENfVE9QCQkJMHgwOAorCisjZGVmaW5lIFJUQ19JRVIJCQkweDEwCisjZGVmaW5lIFJUQ19JRVJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JRFIJCQkweDE0CisjZGVmaW5lIFJUQ19JRFJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JTVIJCQkweDE4CisjZGVmaW5lIFJUQ19JTVJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JU1IJCQkweDFjCisjZGVmaW5lIFJUQ19JU1JfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JQ1IJCQkweDIwCisjZGVmaW5lIFJUQ19JQ1JfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19CSVQobmFtZSkJCSgxIDw8IFJUQ18jI25hbWUpCisjZGVmaW5lIFJUQ19CRihuYW1lLCB2YWx1ZSkJKCh2YWx1ZSkgPDwgUlRDXyMjbmFtZSkKKworI2RlZmluZSBydGNfcmVhZGwoZGV2LCByZWcpCQkJCVwKKwlfX3Jhd19yZWFkbCgoZGV2KS0+cmVncyArIFJUQ18jI3JlZykKKyNkZWZpbmUgcnRjX3dyaXRlbChkZXYsIHJlZywgdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAoZGV2KS0+cmVncyArIFJUQ18jI3JlZykKKworc3RydWN0IHJ0Y19hdDMyYXA3MDB4IHsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJdW5zaWduZWQgbG9uZwkJYWxhcm1fdGltZTsKKwl1bnNpZ25lZCBsb25nCQlpcnE7CisJLyogUHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgcmVnaXN0ZXIgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QJCWxvY2s7Cit9OworCitzdGF0aWMgaW50IGF0MzJfcnRjX3JlYWR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgbm93OworCisJbm93ID0gcnRjX3JlYWRsKHJ0YywgVkFMKTsKKwlydGNfdGltZV90b190bShub3csIHRtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX3NldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBub3c7CisJaW50IHJldDsKKworCXJldCA9IHJ0Y190bV90b190aW1lKHRtLCAmbm93KTsKKwlpZiAocmV0ID09IDApCisJCXJ0Y193cml0ZWwocnRjLCBWQUwsIG5vdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX3JlYWRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCXJ0Y190aW1lX3RvX3RtKHJ0Yy0+YWxhcm1fdGltZSwgJmFscm0tPnRpbWUpOworCWFscm0tPmVuYWJsZWQgPSBydGNfcmVhZGwocnRjLCBJTVIpICYgUlRDX0JJVChJTVJfVE9QSSkgPyAxIDogMDsKKwlhbHJtLT5wZW5kaW5nID0gcnRjX3JlYWRsKHJ0YywgSVNSKSAmIFJUQ19CSVQoSVNSX1RPUEkpID8gMSA6IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQzMl9ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgcnRjX3VuaXhfdGltZTsKKwl1bnNpZ25lZCBsb25nIGFsYXJtX3VuaXhfdGltZTsKKwlpbnQgcmV0OworCisJcnRjX3VuaXhfdGltZSA9IHJ0Y19yZWFkbChydGMsIFZBTCk7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSgmYWxybS0+dGltZSwgJmFsYXJtX3VuaXhfdGltZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhbGFybV91bml4X3RpbWUgPCBydGNfdW5peF90aW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisJcnRjLT5hbGFybV90aW1lID0gYWxhcm1fdW5peF90aW1lOworCXJ0Y193cml0ZWwocnRjLCBUT1AsIHJ0Yy0+YWxhcm1fdGltZSk7CisJaWYgKGFscm0tPmVuYWJsZWQpCisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCXwgUlRDX0JJVChDVFJMX1RPUEVOKSk7CisJZWxzZQorCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgcnRjX3JlYWRsKHJ0YywgQ1RSTCkKKwkJCQkmIH5SVENfQklUKENUUkxfVE9QRU4pKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCWlmKGVuYWJsZWQpIHsKKwkJaWYgKHJ0Y19yZWFkbChydGMsIFZBTCkgPiBydGMtPmFsYXJtX3RpbWUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgcnRjX3JlYWRsKHJ0YywgQ1RSTCkKKwkJCQl8IFJUQ19CSVQoQ1RSTF9UT1BFTikpOworCQlydGNfd3JpdGVsKHJ0YywgSUNSLCBSVENfQklUKElDUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJRVIsIFJUQ19CSVQoSUVSX1RPUEkpKTsKKwl9IGVsc2UgeworCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgcnRjX3JlYWRsKHJ0YywgQ1RSTCkKKwkJCQkmIH5SVENfQklUKENUUkxfVE9QRU4pKTsKKwkJcnRjX3dyaXRlbChydGMsIElEUiwgUlRDX0JJVChJRFJfVE9QSSkpOworCQlydGNfd3JpdGVsKHJ0YywgSUNSLCBSVENfQklUKElDUl9UT1BJKSk7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdDMyX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gKHN0cnVjdCBydGNfYXQzMmFwNzAweCAqKWRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGlzciA9IHJ0Y19yZWFkbChydGMsIElTUik7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCWludCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmcnRjLT5sb2NrKTsKKworCWlmIChpc3IgJiBSVENfQklUKElTUl9UT1BJKSkgeworCQlydGNfd3JpdGVsKHJ0YywgSUNSLCBSVENfQklUKElDUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJRFIsIFJUQ19CSVQoSURSX1RPUEkpKTsKKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJJiB+UlRDX0JJVChDVFJMX1RPUEVOKSk7CisJCXJ0Y193cml0ZWwocnRjLCBWQUwsIHJ0Yy0+YWxhcm1fdGltZSk7CisJCWV2ZW50cyA9IFJUQ19BRiB8IFJUQ19JUlFGOworCQlydGNfdXBkYXRlX2lycShydGMtPnJ0YywgMSwgZXZlbnRzKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJc3Bpbl91bmxvY2soJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgYXQzMl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBhdDMyX3J0Y19yZWFkdGltZSwKKwkuc2V0X3RpbWUJPSBhdDMyX3J0Y19zZXR0aW1lLAorCS5yZWFkX2FsYXJtCT0gYXQzMl9ydGNfcmVhZGFsYXJtLAorCS5zZXRfYWxhcm0JPSBhdDMyX3J0Y19zZXRhbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZSA9IGF0MzJfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDMyX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZQkqcmVnczsKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YzsKKwlpbnQgaXJxOworCWludCByZXQ7CisKKwlydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRjX2F0MzJhcDcwMHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ0YykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm5vIG1taW8gcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IGdldCBpcnFcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCXJ0Yy0+aXJxID0gaXJxOworCXJ0Yy0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOworCWlmICghcnRjLT5yZWdzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBtYXAgSS9PIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX2xvY2tfaW5pdCgmcnRjLT5sb2NrKTsKKworCS8qCisJICogTWF5YmUgaW5pdCBSVEM6IGNvdW50IGZyb20gemVybyBhdCAxIEh6LCBkaXNhYmxlIHdyYXAgaXJxLgorCSAqCisJICogRG8gbm90IHJlc2V0IFZBTCByZWdpc3RlciwgYXMgaXQgY2FuIGhvbGQgYW4gb2xkIHRpbWUKKwkgKiBmcm9tIGxhc3QgSlRBRyByZXNldC4KKwkgKi8KKwlpZiAoIShydGNfcmVhZGwocnRjLCBDVFJMKSAmIFJUQ19CSVQoQ1RSTF9FTikpKSB7CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBSVENfQklUKENUUkxfUENMUikpOworCQlydGNfd3JpdGVsKHJ0YywgSURSLCBSVENfQklUKElEUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBSVENfQkYoQ1RSTF9QU0VMLCAweGUpCisJCQkJfCBSVENfQklUKENUUkxfRU4pKTsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGF0MzJfcnRjX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJydGMiLCBydGMpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlcXVlc3QgaXJxICVkXG4iLCBpcnEpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisKKwlydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkmYXQzMl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMtPnJ0YykpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIHJ0YyBkZXZpY2VcbiIpOworCQlyZXQgPSBQVFJfRVJSKHJ0Yy0+cnRjKTsKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJfQorCisJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkF0bWVsIFJUQyBmb3IgQVQzMkFQNzAweCBhdCAlMDhseCBpcnEgJWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpcnRjLT5yZWdzLCBydGMtPmlycSk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfaXJxOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfaXJxKGlycSwgcnRjKTsKK291dF9pb3VubWFwOgorCWlvdW5tYXAocnRjLT5yZWdzKTsKK291dDoKKwlrZnJlZShydGMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGF0MzJfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CisKKwlmcmVlX2lycShydGMtPmlycSwgcnRjKTsKKwlpb3VubWFwKHJ0Yy0+cmVncyk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yy0+cnRjKTsKKwlrZnJlZShydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06YXQzMmFwNzAweF9ydGMiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXQzMl9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AoYXQzMl9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXQzMmFwNzAweF9ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQzMl9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF0MzJfcnRjX2RyaXZlciwgYXQzMl9ydGNfcHJvYmUpOworfQorbW9kdWxlX2luaXQoYXQzMl9ydGNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdDMyX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0MzJfcnRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhdDMyX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGNlZ3R2ZWR0QGF0bWVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVhbCB0aW1lIGNsb2NrIGZvciBBVlIzMiBBVDMyQVA3MDB4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYXQ5MXJtOTIwMC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWF0OTFybTkyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDI5YzgwCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWF0OTFybTkyMDAuYwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqCVJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UgZm9yIExpbnV4IG9uIEF0bWVsIEFUOTFSTTkyMDAKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDIgUmljayBCcm9uc29uCisgKgorICoJQ29udmVydGVkIHRvIFJUQyBjbGFzcyBtb2RlbCBieSBBbmRyZXcgVmljdG9yCisgKgorICoJUG9ydGVkIHRvIExpbnV4IDIuNiBieSBTdGV2ZW4gU2Nob2x6CisgKglCYXNlZCBvbiBzM2MyNDEwLXJ0Yy5jIFNpbXRlYyBFbGVjdHJvbmljcworICoKKyAqCUJhc2VkIG9uIHNhMTEwMC1ydGMuYyBieSBOaWxzIEZhZXJiZXIKKyAqCUJhc2VkIG9uIHJ0Yy5jIGJ5IFBhdWwgR29ydG1ha2VyCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxtYWNoL2F0OTFfcnRjLmg+CisKKyNkZWZpbmUgYXQ5MV9ydGNfcmVhZChmaWVsZCkgXAorCV9fcmF3X3JlYWRsKGF0OTFfcnRjX3JlZ3MgKyBmaWVsZCkKKyNkZWZpbmUgYXQ5MV9ydGNfd3JpdGUoZmllbGQsIHZhbCkgXAorCV9fcmF3X3dyaXRlbCgodmFsKSwgYXQ5MV9ydGNfcmVncyArIGZpZWxkKQorCisjZGVmaW5lIEFUOTFfUlRDX0VQT0NICQkxOTAwVUwJLyoganVzdCBsaWtlIGFyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMgKi8KKworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihhdDkxX3J0Y191cGRhdGVkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXQ5MV9hbGFybV95ZWFyID0gQVQ5MV9SVENfRVBPQ0g7CitzdGF0aWMgdm9pZCBfX2lvbWVtICphdDkxX3J0Y19yZWdzOworc3RhdGljIGludCBpcnE7CisKKy8qCisgKiBEZWNvZGUgdGltZS9kYXRlIGludG8gcnRjX3RpbWUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfcnRjX2RlY29kZXRpbWUodW5zaWduZWQgaW50IHRpbWVyZWcsIHVuc2lnbmVkIGludCBjYWxyZWcsCisJCQkJc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBpbnQgdGltZSwgZGF0ZTsKKworCS8qIG11c3QgcmVhZCB0d2ljZSBpbiBjYXNlIGl0IGNoYW5nZXMgKi8KKwlkbyB7CisJCXRpbWUgPSBhdDkxX3J0Y19yZWFkKHRpbWVyZWcpOworCQlkYXRlID0gYXQ5MV9ydGNfcmVhZChjYWxyZWcpOworCX0gd2hpbGUgKCh0aW1lICE9IGF0OTFfcnRjX3JlYWQodGltZXJlZykpIHx8CisJCQkoZGF0ZSAhPSBhdDkxX3J0Y19yZWFkKGNhbHJlZykpKTsKKworCXRtLT50bV9zZWMgID0gYmNkMmJpbigodGltZSAmIEFUOTFfUlRDX1NFQykgPj4gMCk7CisJdG0tPnRtX21pbiAgPSBiY2QyYmluKCh0aW1lICYgQVQ5MV9SVENfTUlOKSA+PiA4KTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oKHRpbWUgJiBBVDkxX1JUQ19IT1VSKSA+PiAxNik7CisKKwkvKgorCSAqIFRoZSBDYWxlbmRhciBBbGFybSByZWdpc3RlciBkb2VzIG5vdCBoYXZlIGEgZmllbGQgZm9yCisJICogdGhlIHllYXIgLSBzbyB0aGVzZSB3aWxsIHJldHVybiBhbiBpbnZhbGlkIHZhbHVlLiAgV2hlbiBhbgorCSAqIGFsYXJtIGlzIHNldCwgYXQ5MV9hbGFybV95ZWFyIHdpbGwgc3RvcmUgdGhlIGN1cnJlbnQgeWVhci4KKwkgKi8KKwl0bS0+dG1feWVhciAgPSBiY2QyYmluKGRhdGUgJiBBVDkxX1JUQ19DRU5UKSAqIDEwMDsJLyogY2VudHVyeSAqLworCXRtLT50bV95ZWFyICs9IGJjZDJiaW4oKGRhdGUgJiBBVDkxX1JUQ19ZRUFSKSA+PiA4KTsJLyogeWVhciAqLworCisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKChkYXRlICYgQVQ5MV9SVENfREFZKSA+PiAyMSkgLSAxOwkvKiBkYXkgb2YgdGhlIHdlZWsgWzAtNl0sIFN1bmRheT0wICovCisJdG0tPnRtX21vbiAgPSBiY2QyYmluKChkYXRlICYgQVQ5MV9SVENfTU9OVEgpID4+IDE2KSAtIDE7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKChkYXRlICYgQVQ5MV9SVENfREFURSkgPj4gMjQpOworfQorCisvKgorICogUmVhZCBjdXJyZW50IHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcmVhZHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWF0OTFfcnRjX2RlY29kZXRpbWUoQVQ5MV9SVENfVElNUiwgQVQ5MV9SVENfQ0FMUiwgdG0pOworCXRtLT50bV95ZGF5ID0gcnRjX3llYXJfZGF5cyh0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIpOworCXRtLT50bV95ZWFyID0gdG0tPnRtX3llYXIgLSAxOTAwOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fZnVuY19fLAorCQkxOTAwICsgdG0tPnRtX3llYXIsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCBjdXJyZW50IHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfc2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyBjcjsKKworCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX2Z1bmNfXywKKwkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJLyogU3RvcCBUaW1lL0NhbGVuZGFyIGZyb20gY291bnRpbmcgKi8KKwljciA9IGF0OTFfcnRjX3JlYWQoQVQ5MV9SVENfQ1IpOworCWF0OTFfcnRjX3dyaXRlKEFUOTFfUlRDX0NSLCBjciB8IEFUOTFfUlRDX1VQRENBTCB8IEFUOTFfUlRDX1VQRFRJTSk7CisKKwlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19JRVIsIEFUOTFfUlRDX0FDS1VQRCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYXQ5MV9ydGNfdXBkYXRlZCk7CS8qIHdhaXQgZm9yIEFDS1VQRCBpbnRlcnJ1cHQgKi8KKwlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCk7CisKKwlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19USU1SLAorCQkJICBiaW4yYmNkKHRtLT50bV9zZWMpIDw8IDAKKwkJCXwgYmluMmJjZCh0bS0+dG1fbWluKSA8PCA4CisJCQl8IGJpbjJiY2QodG0tPnRtX2hvdXIpIDw8IDE2KTsKKworCWF0OTFfcnRjX3dyaXRlKEFUOTFfUlRDX0NBTFIsCisJCQkgIGJpbjJiY2QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApCS8qIGNlbnR1cnkgKi8KKwkJCXwgYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCkgPDwgOAkvKiB5ZWFyICovCisJCQl8IGJpbjJiY2QodG0tPnRtX21vbiArIDEpIDw8IDE2CQkvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwkJCXwgYmluMmJjZCh0bS0+dG1fd2RheSArIDEpIDw8IDIxCS8qIGRheSBvZiB0aGUgd2VlayBbMC02XSwgU3VuZGF5PTAgKi8KKwkJCXwgYmluMmJjZCh0bS0+dG1fbWRheSkgPDwgMjQpOworCisJLyogUmVzdGFydCBUaW1lL0NhbGVuZGFyICovCisJY3IgPSBhdDkxX3J0Y19yZWFkKEFUOTFfUlRDX0NSKTsKKwlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19DUiwgY3IgJiB+KEFUOTFfUlRDX1VQRENBTCB8IEFUOTFfUlRDX1VQRFRJTSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcmVhZGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCisJYXQ5MV9ydGNfZGVjb2RldGltZShBVDkxX1JUQ19USU1BTFIsIEFUOTFfUlRDX0NBTEFMUiwgdG0pOworCXRtLT50bV95ZGF5ID0gcnRjX3llYXJfZGF5cyh0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIpOworCXRtLT50bV95ZWFyID0gYXQ5MV9hbGFybV95ZWFyIC0gMTkwMDsKKworCWFscm0tPmVuYWJsZWQgPSAoYXQ5MV9ydGNfcmVhZChBVDkxX1JUQ19JTVIpICYgQVQ5MV9SVENfQUxBUk0pCisJCQk/IDEgOiAwOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fZnVuY19fLAorCQkxOTAwICsgdG0tPnRtX3llYXIsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCBhbGFybSB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IGF0OTFfcnRjX3NldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCisJYXQ5MV9ydGNfZGVjb2RldGltZShBVDkxX1JUQ19USU1SLCBBVDkxX1JUQ19DQUxSLCAmdG0pOworCisJYXQ5MV9hbGFybV95ZWFyID0gdG0udG1feWVhcjsKKworCXRtLnRtX21vbiA9IGFscm0tPnRpbWUudG1fbW9uOworCXRtLnRtX21kYXkgPSBhbHJtLT50aW1lLnRtX21kYXk7CisJdG0udG1faG91ciA9IGFscm0tPnRpbWUudG1faG91cjsKKwl0bS50bV9taW4gPSBhbHJtLT50aW1lLnRtX21pbjsKKwl0bS50bV9zZWMgPSBhbHJtLT50aW1lLnRtX3NlYzsKKworCWF0OTFfcnRjX3dyaXRlKEFUOTFfUlRDX0lEUiwgQVQ5MV9SVENfQUxBUk0pOworCWF0OTFfcnRjX3dyaXRlKEFUOTFfUlRDX1RJTUFMUiwKKwkJICBiaW4yYmNkKHRtLnRtX3NlYykgPDwgMAorCQl8IGJpbjJiY2QodG0udG1fbWluKSA8PCA4CisJCXwgYmluMmJjZCh0bS50bV9ob3VyKSA8PCAxNgorCQl8IEFUOTFfUlRDX0hPVVJFTiB8IEFUOTFfUlRDX01JTkVOIHwgQVQ5MV9SVENfU0VDRU4pOworCWF0OTFfcnRjX3dyaXRlKEFUOTFfUlRDX0NBTEFMUiwKKwkJICBiaW4yYmNkKHRtLnRtX21vbiArIDEpIDw8IDE2CQkvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwkJfCBiaW4yYmNkKHRtLnRtX21kYXkpIDw8IDI0CisJCXwgQVQ5MV9SVENfREFURUVOIHwgQVQ5MV9SVENfTVRIRU4pOworCisJaWYgKGFscm0tPmVuYWJsZWQpIHsKKwkJYXQ5MV9ydGNfd3JpdGUoQVQ5MV9SVENfU0NDUiwgQVQ5MV9SVENfQUxBUk0pOworCQlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19JRVIsIEFUOTFfUlRDX0FMQVJNKTsKKwl9CisKKwlwcl9kZWJ1ZygiJXMoKTogJTRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwgX19mdW5jX18sCisJCWF0OTFfYWxhcm1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LCB0bS50bV9ob3VyLAorCQl0bS50bV9taW4sIHRtLnRtX3NlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDkxX3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJcHJfZGVidWcoIiVzKCk6IGNtZD0lMDh4XG4iLCBfX2Z1bmNfXywgZW5hYmxlZCk7CisKKwlpZiAoZW5hYmxlZCkgeworCQlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19TQ0NSLCBBVDkxX1JUQ19BTEFSTSk7CisJCWF0OTFfcnRjX3dyaXRlKEFUOTFfUlRDX0lFUiwgQVQ5MV9SVENfQUxBUk0pOworCX0gZWxzZQorCQlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FMQVJNKTsKKworCXJldHVybiAwOworfQorLyoKKyAqIFByb3ZpZGUgYWRkaXRpb25hbCBSVEMgaW5mb3JtYXRpb24gaW4gL3Byb2MvZHJpdmVyL3J0YworICovCitzdGF0aWMgaW50IGF0OTFfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGltciA9IGF0OTFfcnRjX3JlYWQoQVQ5MV9SVENfSU1SKTsKKworCXNlcV9wcmludGYoc2VxLCAidXBkYXRlX0lSUVx0OiAlc1xuIiwKKwkJCShpbXIgJiBBVDkxX1JUQ19BQ0tVUEQpID8gInllcyIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKKwkJCShpbXIgJiBBVDkxX1JUQ19TRUNFVikgPyAieWVzIiA6ICJubyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIFJUQworICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2lkOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgcnRzcjsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwlydHNyID0gYXQ5MV9ydGNfcmVhZChBVDkxX1JUQ19TUikgJiBhdDkxX3J0Y19yZWFkKEFUOTFfUlRDX0lNUik7CisJaWYgKHJ0c3IpIHsJCS8qIHRoaXMgaW50ZXJydXB0IGlzIHNoYXJlZCEgIElzIGl0IG91cnM/ICovCisJCWlmIChydHNyICYgQVQ5MV9SVENfQUxBUk0pCisJCQlldmVudHMgfD0gKFJUQ19BRiB8IFJUQ19JUlFGKTsKKwkJaWYgKHJ0c3IgJiBBVDkxX1JUQ19TRUNFVikKKwkJCWV2ZW50cyB8PSAoUlRDX1VGIHwgUlRDX0lSUUYpOworCQlpZiAocnRzciAmIEFUOTFfUlRDX0FDS1VQRCkKKwkJCWNvbXBsZXRlKCZhdDkxX3J0Y191cGRhdGVkKTsKKworCQlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19TQ0NSLCBydHNyKTsJLyogY2xlYXIgc3RhdHVzIHJlZyAqLworCisJCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgZXZlbnRzKTsKKworCQlwcl9kZWJ1ZygiJXMoKTogbnVtPSVsZCwgZXZlbnRzPTB4JTAybHhcbiIsIF9fZnVuY19fLAorCQkJZXZlbnRzID4+IDgsIGV2ZW50cyAmIDB4MDAwMDAwRkYpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIElSUV9OT05FOwkJLyogbm90IGhhbmRsZWQgKi8KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGF0OTFfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gYXQ5MV9ydGNfcmVhZHRpbWUsCisJLnNldF90aW1lCT0gYXQ5MV9ydGNfc2V0dGltZSwKKwkucmVhZF9hbGFybQk9IGF0OTFfcnRjX3JlYWRhbGFybSwKKwkuc2V0X2FsYXJtCT0gYXQ5MV9ydGNfc2V0YWxhcm0sCisJLnByb2MJCT0gYXQ5MV9ydGNfcHJvYywKKwkuYWxhcm1faXJxX2VuYWJsZSA9IGF0OTFfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCisvKgorICogSW5pdGlhbGl6ZSBhbmQgaW5zdGFsbCBSVEMgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGF0OTFfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CisJaW50IHJldCA9IDA7CisKKwlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gbW1pbyByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlhdDkxX3J0Y19yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7CisJaWYgKCFhdDkxX3J0Y19yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgcmVnaXN0ZXJzLCBhYm9ydGluZy5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19DUiwgMCk7CisJYXQ5MV9ydGNfd3JpdGUoQVQ5MV9SVENfTVIsIDApOwkJLyogMjQgaG91ciBtb2RlICovCisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJYXQ5MV9ydGNfd3JpdGUoQVQ5MV9SVENfSURSLCBBVDkxX1JUQ19BQ0tVUEQgfCBBVDkxX1JUQ19BTEFSTSB8CisJCQkJCUFUOTFfUlRDX1NFQ0VWIHwgQVQ5MV9SVENfVElNRVYgfAorCQkJCQlBVDkxX1JUQ19DQUxFVik7CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGF0OTFfcnRjX2ludGVycnVwdCwKKwkJCQlJUlFGX1NIQVJFRCwKKwkJCQkiYXQ5MV9ydGMiLCBwZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXQ5MV9ydGM6IElSUSAlZCBhbHJlYWR5IGluIHVzZS5cbiIsCisJCQkJaXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBjcHUgaW5pdCBjb2RlIHNob3VsZCByZWFsbHkgaGF2ZSBmbGFnZ2VkIHRoaXMgZGV2aWNlIGFzCisJICogYmVpbmcgd2FrZS1jYXBhYmxlOyBpZiBpdCBkaWRuJ3QsIGRvIHRoYXQgaGVyZS4KKwkgKi8KKwlpZiAoIWRldmljZV9jYW5fd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJJmF0OTFfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlmcmVlX2lycShpcnEsIHBkZXYpOworCQlyZXR1cm4gUFRSX0VSUihydGMpOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQVQ5MSBSZWFsIFRpbWUgQ2xvY2sgZHJpdmVyLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEaXNhYmxlIGFuZCByZW1vdmUgdGhlIFJUQyBkcml2ZXIKKyAqLworc3RhdGljIGludCBfX2V4aXQgYXQ5MV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWF0OTFfcnRjX3dyaXRlKEFUOTFfUlRDX0lEUiwgQVQ5MV9SVENfQUNLVVBEIHwgQVQ5MV9SVENfQUxBUk0gfAorCQkJCQlBVDkxX1JUQ19TRUNFViB8IEFUOTFfUlRDX1RJTUVWIHwKKwkJCQkJQVQ5MV9SVENfQ0FMRVYpOworCWZyZWVfaXJxKGlycSwgcGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIEFUOTFSTTkyMDAgUlRDIFBvd2VyIG1hbmFnZW1lbnQgY29udHJvbCAqLworCitzdGF0aWMgdTMyIGF0OTFfcnRjX2ltcjsKKworc3RhdGljIGludCBhdDkxX3J0Y19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiB0aGlzIElSUSBpcyBzaGFyZWQgd2l0aCBEQkdVIGFuZCBvdGhlciBoYXJkd2FyZSB3aGljaCBpc24ndAorCSAqIG5lY2Vzc2FyaWx5IGRvaW5nIFBNIGxpa2Ugd2UgYXJlLi4uCisJICovCisJYXQ5MV9ydGNfaW1yID0gYXQ5MV9ydGNfcmVhZChBVDkxX1JUQ19JTVIpCisJCQkmIChBVDkxX1JUQ19BTEFSTXxBVDkxX1JUQ19TRUNFVik7CisJaWYgKGF0OTFfcnRjX2ltcikgeworCQlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJCWVuYWJsZV9pcnFfd2FrZShpcnEpOworCQllbHNlCisJCQlhdDkxX3J0Y193cml0ZShBVDkxX1JUQ19JRFIsIGF0OTFfcnRjX2ltcik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGF0OTFfcnRjX2ltcikgeworCQlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJCWRpc2FibGVfaXJxX3dha2UoaXJxKTsKKwkJZWxzZQorCQkJYXQ5MV9ydGNfd3JpdGUoQVQ5MV9SVENfSUVSLCBhdDkxX3J0Y19pbXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGF0OTFfcnRjX3BtID0geworCS5zdXNwZW5kID0JYXQ5MV9ydGNfc3VzcGVuZCwKKwkucmVzdW1lID0JYXQ5MV9ydGNfcmVzdW1lLAorfTsKKworI2RlZmluZSBhdDkxX3J0Y19wbV9wdHIJJmF0OTFfcnRjX3BtCisKKyNlbHNlCisjZGVmaW5lIGF0OTFfcnRjX3BtX3B0cglOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXQ5MV9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AoYXQ5MV9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXQ5MV9ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gYXQ5MV9ydGNfcG1fcHRyLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYXQ5MV9ydGNfZHJpdmVyLCBhdDkxX3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdDkxX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0OTFfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF0OTFfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoYXQ5MV9ydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJpY2sgQnJvbnNvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgZHJpdmVyIGZvciBBdG1lbCBBVDkxUk05MjAwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmF0OTFfcnRjIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYXQ5MXNhbTkuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1hdDkxc2FtOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTg2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYXQ5MXNhbTkuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqICJSVFQgYXMgUmVhbCBUaW1lIENsb2NrIiBkcml2ZXIgZm9yIEFUOTFTQU05IFNvQyBmYW1pbHkKKyAqCisgKiAoQykgMjAwNyBNaWNoZWwgQmVub2l0CisgKgorICogQmFzZWQgb24gcnRjLWF0OTFybTkyMDAuYyBieSBSaWNrIEJyb25zb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxX3J0dC5oPgorI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CisKKworLyoKKyAqIFRoaXMgZHJpdmVyIHVzZXMgdHdvIGNvbmZpZ3VyYWJsZSBoYXJkd2FyZSByZXNvdXJjZXMgdGhhdCBsaXZlIGluIHRoZQorICogQVQ5MVNBTTkgYmFja3VwIHBvd2VyIGRvbWFpbiAoaW50ZW5kZWQgdG8gYmUgcG93ZXJlZCBhdCBhbGwgdGltZXMpCisgKiB0byBpbXBsZW1lbnQgdGhlIFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2VzCisgKgorICogIC0gQSAiUmVhbC10aW1lIFRpbWVyIiAoUlRUKSBjb3VudHMgdXAgaW4gc2Vjb25kcyBmcm9tIGEgYmFzZSB0aW1lLgorICogICAgV2UgY2FuJ3QgYXNzaWduIHRoZSBjb3VudGVyIHZhbHVlIChDUlRWKSAuLi4gYnV0IHdlIGNhbiByZXNldCBpdC4KKyAqCisgKiAgLSBPbmUgb2YgdGhlICJHZW5lcmFsIFB1cnBvc2UgQmFja3VwIFJlZ2lzdGVycyIgKEdQQlJzKSBob2xkcyB0aGUKKyAqICAgIGJhc2UgdGltZSwgbm9ybWFsbHkgYW4gb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgUE9TSVgKKyAqICAgIGVwb2NoICgxOTcwLUphbi0xIDAwOjAwOjAwIFVUQykuICBTb21lIHN5c3RlbXMgYWxzbyBpbmNsdWRlIHRoZQorICogICAgbG9jYWwgdGltZXpvbmUncyBvZmZzZXQuCisgKgorICogVGhlIFJUQydzIHZhbHVlIGlzIHRoZSBSVFQgY291bnRlciBwbHVzIHRoYXQgb2Zmc2V0LiAgVGhlIFJUQydzIGFsYXJtCisgKiBpcyBsaWtld2lzZSBhIGJhc2UgKEFMTVYpIHBsdXMgdGhhdCBvZmZzZXQuCisgKgorICogTm90IGFsbCBSVFRzIHdpbGwgYmUgdXNlZCBhcyBSVENzOyBzb21lIHN5c3RlbXMgaGF2ZSBtdWx0aXBsZSBSVFRzIHRvCisgKiBjaG9vc2UgZnJvbSwgb3IgYSAicmVhbCIgUlRDIG1vZHVsZS4gIEFsbCBzeXN0ZW1zIGhhdmUgbXVsdGlwbGUgR1BCUgorICogcmVnaXN0ZXJzIGF2YWlsYWJsZSwgbGlrZXdpc2UgdXNhYmxlIGZvciBtb3JlIHRoYW4gIlJUQyIgc3VwcG9ydC4KKyAqLworCisvKgorICogV2Ugc3RvcmUgQUxBUk1fRElTQUJMRUQgaW4gQUxNViB0byByZWNvcmQgdGhhdCBubyBhbGFybSBpcyBzZXQuCisgKiBJdCdzIGFsc28gdGhlIHJlc2V0IHZhbHVlIGZvciB0aGF0IGZpZWxkLgorICovCisjZGVmaW5lIEFMQVJNX0RJU0FCTEVECSgodTMyKX4wKQorCisKK3N0cnVjdCBzYW05X3J0YyB7CisJdm9pZCBfX2lvbWVtCQkqcnR0OworCXN0cnVjdCBydGNfZGV2aWNlCSpydGNkZXY7CisJdTMyCQkJaW1yOworCXZvaWQgX19pb21lbQkJKmdwYnI7Cit9OworCisjZGVmaW5lIHJ0dF9yZWFkbChydGMsIGZpZWxkKSBcCisJX19yYXdfcmVhZGwoKHJ0YyktPnJ0dCArIEFUOTFfUlRUXyAjIyBmaWVsZCkKKyNkZWZpbmUgcnR0X3dyaXRlbChydGMsIGZpZWxkLCB2YWwpIFwKKwlfX3Jhd193cml0ZWwoKHZhbCksIChydGMpLT5ydHQgKyBBVDkxX1JUVF8gIyMgZmllbGQpCisKKyNkZWZpbmUgZ3Bicl9yZWFkbChydGMpIFwKKwlfX3Jhd19yZWFkbCgocnRjKS0+Z3BicikKKyNkZWZpbmUgZ3Bicl93cml0ZWwocnRjLCB2YWwpIFwKKwlfX3Jhd193cml0ZWwoKHZhbCksIChydGMpLT5ncGJyKQorCisvKgorICogUmVhZCBjdXJyZW50IHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcmVhZHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBzYW05X3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHNlY3MsIHNlY3MyOworCXUzMiBvZmZzZXQ7CisKKwkvKiByZWFkIGN1cnJlbnQgdGltZSBvZmZzZXQgKi8KKwlvZmZzZXQgPSBncGJyX3JlYWRsKHJ0Yyk7CisJaWYgKG9mZnNldCA9PSAwKQorCQlyZXR1cm4gLUVJTFNFUTsKKworCS8qIHJlcmVhZCB0aGUgY291bnRlciB0byBoZWxwIHN5bmMgdGhlIHR3byBjbG9jayBkb21haW5zICovCisJc2VjcyA9IHJ0dF9yZWFkbChydGMsIFZSKTsKKwlzZWNzMiA9IHJ0dF9yZWFkbChydGMsIFZSKTsKKwlpZiAoc2VjcyAhPSBzZWNzMikKKwkJc2VjcyA9IHJ0dF9yZWFkbChydGMsIFZSKTsKKworCXJ0Y190aW1lX3RvX3RtKG9mZnNldCArIHNlY3MsIHRtKTsKKworCWRldl9kYmcoZGV2LCAiJXM6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsICJyZWFkdGltZSIsCisJCTE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGN1cnJlbnQgdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBhdDkxX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3Qgc2FtOV9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnI7CisJdTMyIG9mZnNldCwgYWxhcm0sIG1yOworCXVuc2lnbmVkIGxvbmcgc2VjczsKKworCWRldl9kYmcoZGV2LCAiJXM6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsICJzZXR0aW1lIiwKKwkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJZXJyID0gcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiBlcnI7CisKKwltciA9IHJ0dF9yZWFkbChydGMsIE1SKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXJ0dF93cml0ZWwocnRjLCBNUiwgbXIgJiB+KEFUOTFfUlRUX0FMTUlFTiB8IEFUOTFfUlRUX1JUVElOQ0lFTikpOworCisJLyogcmVhZCBjdXJyZW50IHRpbWUgb2Zmc2V0ICovCisJb2Zmc2V0ID0gZ3Bicl9yZWFkbChydGMpOworCisJLyogc3RvcmUgdGhlIG5ldyBiYXNlIHRpbWUgaW4gYSBiYXR0ZXJ5IGJhY2t1cCByZWdpc3RlciAqLworCXNlY3MgKz0gMTsKKwlncGJyX3dyaXRlbChydGMsIHNlY3MpOworCisJLyogYWRqdXN0IHRoZSBhbGFybSB0aW1lIGZvciB0aGUgbmV3IGJhc2UgKi8KKwlhbGFybSA9IHJ0dF9yZWFkbChydGMsIEFSKTsKKwlpZiAoYWxhcm0gIT0gQUxBUk1fRElTQUJMRUQpIHsKKwkJaWYgKG9mZnNldCA+IHNlY3MpIHsKKwkJCS8qIHRpbWUganVtcGVkIGJhY2t3YXJkcywgaW5jcmVhc2UgdGltZSB1bnRpbCBhbGFybSAqLworCQkJYWxhcm0gKz0gKG9mZnNldCAtIHNlY3MpOworCQl9IGVsc2UgaWYgKChhbGFybSArIG9mZnNldCkgPiBzZWNzKSB7CisJCQkvKiB0aW1lIGp1bXBlZCBmb3J3YXJkcywgZGVjcmVhc2UgdGltZSB1bnRpbCBhbGFybSAqLworCQkJYWxhcm0gLT0gKHNlY3MgLSBvZmZzZXQpOworCQl9IGVsc2UgeworCQkJLyogdGltZSBqdW1wZWQgcGFzdCB0aGUgYWxhcm0sIGRpc2FibGUgYWxhcm0gKi8KKwkJCWFsYXJtID0gQUxBUk1fRElTQUJMRUQ7CisJCQltciAmPSB+QVQ5MV9SVFRfQUxNSUVOOworCQl9CisJCXJ0dF93cml0ZWwocnRjLCBBUiwgYWxhcm0pOworCX0KKworCS8qIHJlc2V0IHRoZSB0aW1lciwgYW5kIHJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisJcnR0X3dyaXRlbChydGMsIE1SLCBtciB8IEFUOTFfUlRUX1JUVFJTVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDkxX3J0Y19yZWFkYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3Qgc2FtOV9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1MzIgYWxhcm0gPSBydHRfcmVhZGwocnRjLCBBUik7CisJdTMyIG9mZnNldDsKKworCW9mZnNldCA9IGdwYnJfcmVhZGwocnRjKTsKKwlpZiAob2Zmc2V0ID09IDApCisJCXJldHVybiAtRUlMU0VROworCisJbWVtc2V0KGFscm0sIDAsIHNpemVvZigqYWxybSkpOworCWlmIChhbGFybSAhPSBBTEFSTV9ESVNBQkxFRCAmJiBvZmZzZXQgIT0gMCkgeworCQlydGNfdGltZV90b190bShvZmZzZXQgKyBhbGFybSwgdG0pOworCisJCWRldl9kYmcoZGV2LCAiJXM6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsICJyZWFkYWxhcm0iLAorCQkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCQlpZiAocnR0X3JlYWRsKHJ0YywgTVIpICYgQVQ5MV9SVFRfQUxNSUVOKQorCQkJYWxybS0+ZW5hYmxlZCA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3Qgc2FtOV9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1bnNpZ25lZCBsb25nIHNlY3M7CisJdTMyIG9mZnNldDsKKwl1MzIgbXI7CisJaW50IGVycjsKKworCWVyciA9IHJ0Y190bV90b190aW1lKHRtLCAmc2Vjcyk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOworCisJb2Zmc2V0ID0gZ3Bicl9yZWFkbChydGMpOworCWlmIChvZmZzZXQgPT0gMCkgeworCQkvKiB0aW1lIGlzIG5vdCBzZXQgKi8KKwkJcmV0dXJuIC1FSUxTRVE7CisJfQorCW1yID0gcnR0X3JlYWRsKHJ0YywgTVIpOworCXJ0dF93cml0ZWwocnRjLCBNUiwgbXIgJiB+QVQ5MV9SVFRfQUxNSUVOKTsKKworCS8qIGFsYXJtIGluIHRoZSBwYXN0PyBmaW5pc2ggYW5kIGxlYXZlIGRpc2FibGVkICovCisJaWYgKHNlY3MgPD0gb2Zmc2V0KSB7CisJCXJ0dF93cml0ZWwocnRjLCBBUiwgQUxBUk1fRElTQUJMRUQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBlbHNlIHNldCBhbGFybSBhbmQgbWF5YmUgZW5hYmxlIGl0ICovCisJcnR0X3dyaXRlbChydGMsIEFSLCBzZWNzIC0gb2Zmc2V0KTsKKwlpZiAoYWxybS0+ZW5hYmxlZCkKKwkJcnR0X3dyaXRlbChydGMsIE1SLCBtciB8IEFUOTFfUlRUX0FMTUlFTik7CisKKwlkZXZfZGJnKGRldiwgIiVzOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCAic2V0YWxhcm0iLAorCQl0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksIHRtLT50bV9ob3VyLAorCQl0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3Qgc2FtOV9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiBtciA9IHJ0dF9yZWFkbChydGMsIE1SKTsKKworCWRldl9kYmcoZGV2LCAiYWxhcm1faXJxX2VuYWJsZTogZW5hYmxlZD0lMDh4LCBtciAlMDh4XG4iLCBlbmFibGVkLCBtcik7CisJaWYgKGVuYWJsZWQpCisJCXJ0dF93cml0ZWwocnRjLCBNUiwgbXIgfCBBVDkxX1JUVF9BTE1JRU4pOworCWVsc2UKKwkJcnR0X3dyaXRlbChydGMsIE1SLCBtciAmIH5BVDkxX1JUVF9BTE1JRU4pOworCXJldHVybiAwOworfQorCisvKgorICogUHJvdmlkZSBhZGRpdGlvbmFsIFJUQyBpbmZvcm1hdGlvbiBpbiAvcHJvYy9kcml2ZXIvcnRjCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBzYW05X3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIG1yID0gbXIgPSBydHRfcmVhZGwocnRjLCBNUik7CisKKwlzZXFfcHJpbnRmKHNlcSwgInVwZGF0ZV9JUlFcdDogJXNcbiIsCisJCQkobXIgJiBBVDkxX1JUVF9SVFRJTkNJRU4pID8gInllcyIgOiAibm8iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElSUSBoYW5kbGVyIGZvciB0aGUgUlRDCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhdDkxX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqX3J0YykKK3sKKwlzdHJ1Y3Qgc2FtOV9ydGMgKnJ0YyA9IF9ydGM7CisJdTMyIHNyLCBtcjsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwkvKiBTaGFyZWQgaW50ZXJydXB0IG1heSBiZSBmb3IgYW5vdGhlciBkZXZpY2UuICBOb3RlOiByZWFkaW5nCisJICogU1IgY2xlYXJzIGl0LCBzbyB3ZSBtdXN0IG9ubHkgcmVhZCBpdCBpbiB0aGlzIGlycSBoYW5kbGVyIQorCSAqLworCW1yID0gcnR0X3JlYWRsKHJ0YywgTVIpICYgKEFUOTFfUlRUX0FMTUlFTiB8IEFUOTFfUlRUX1JUVElOQ0lFTik7CisJc3IgPSBydHRfcmVhZGwocnRjLCBTUikgJiAobXIgPj4gMTYpOworCWlmICghc3IpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIGFsYXJtIHN0YXR1cyAqLworCWlmIChzciAmIEFUOTFfUlRUX0FMTVMpCisJCWV2ZW50cyB8PSAoUlRDX0FGIHwgUlRDX0lSUUYpOworCisJLyogdGltZXIgdXBkYXRlL2luY3JlbWVudCAqLworCWlmIChzciAmIEFUOTFfUlRUX1JUVElOQykKKwkJZXZlbnRzIHw9IChSVENfVUYgfCBSVENfSVJRRik7CisKKwlydGNfdXBkYXRlX2lycShydGMtPnJ0Y2RldiwgMSwgZXZlbnRzKTsKKworCXByX2RlYnVnKCIlczogbnVtPSVsZCwgZXZlbnRzPTB4JTAybHhcbiIsIF9fZnVuY19fLAorCQlldmVudHMgPj4gOCwgZXZlbnRzICYgMHgwMDAwMDBGRik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhdDkxX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGF0OTFfcnRjX3JlYWR0aW1lLAorCS5zZXRfdGltZQk9IGF0OTFfcnRjX3NldHRpbWUsCisJLnJlYWRfYWxhcm0JPSBhdDkxX3J0Y19yZWFkYWxhcm0sCisJLnNldF9hbGFybQk9IGF0OTFfcnRjX3NldGFsYXJtLAorCS5wcm9jCQk9IGF0OTFfcnRjX3Byb2MsCisJLmFsYXJtX2lycV9lbmFibGUgPSBhdDkxX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgYW5kIGluc3RhbGwgUlRDIGRyaXZlcgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdDkxX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZQkqciwgKnJfZ3BicjsKKwlzdHJ1Y3Qgc2FtOV9ydGMJKnJ0YzsKKwlpbnQJCXJldDsKKwl1MzIJCW1yOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcl9ncGJyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAoIXIgfHwgIXJfZ3BicikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJuZWVkIDIgcmVzc291cmNlc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mICpydGMsIEdGUF9LRVJORUwpOworCWlmICghcnRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHBsYXRmb3JtIHNldHVwIGNvZGUgc2hvdWxkIGhhdmUgaGFuZGxlZCB0aGlzOyBzaWdoICovCisJaWYgKCFkZXZpY2VfY2FuX3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKwlydGMtPnJ0dCA9IGlvcmVtYXAoci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCWlmICghcnRjLT5ydHQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCByZWdpc3RlcnMsIGFib3J0aW5nLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlydGMtPmdwYnIgPSBpb3JlbWFwKHJfZ3Bici0+c3RhcnQsIHJlc291cmNlX3NpemUocl9ncGJyKSk7CisJaWYgKCFydGMtPmdwYnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCBncGJyIHJlZ2lzdGVycywgYWJvcnRpbmcuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2dwYnI7CisJfQorCisJbXIgPSBydHRfcmVhZGwocnRjLCBNUik7CisKKwkvKiB1bmxlc3MgUlRUIGlzIGNvdW50aW5nIGF0IDEgSHosIHJlLWluaXRpYWxpemUgaXQgKi8KKwlpZiAoKG1yICYgQVQ5MV9SVFRfUlRQUkVTKSAhPSBBVDkxX1NMT1dfQ0xPQ0spIHsKKwkJbXIgPSBBVDkxX1JUVF9SVFRSU1QgfCAoQVQ5MV9TTE9XX0NMT0NLICYgQVQ5MV9SVFRfUlRQUkVTKTsKKwkJZ3Bicl93cml0ZWwocnRjLCAwKTsKKwl9CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIChzYW1lIGFzIG9uIHNodXRkb3duIHBhdGgpICovCisJbXIgJj0gfihBVDkxX1JUVF9BTE1JRU4gfCBBVDkxX1JUVF9SVFRJTkNJRU4pOworCXJ0dF93cml0ZWwocnRjLCBNUiwgbXIpOworCisJcnRjLT5ydGNkZXYgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJJmF0OTFfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjLT5ydGNkZXYpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjLT5ydGNkZXYpOworCQlnb3RvIGZhaWxfcmVnaXN0ZXI7CisJfQorCisJLyogcmVnaXN0ZXIgaXJxIGhhbmRsZXIgYWZ0ZXIgd2Uga25vdyB3aGF0IG5hbWUgd2UnbGwgdXNlICovCisJcmV0ID0gcmVxdWVzdF9pcnEoQVQ5MV9JRF9TWVMsIGF0OTFfcnRjX2ludGVycnVwdCwKKwkJCQlJUlFGX1NIQVJFRCwKKwkJCQlkZXZfbmFtZSgmcnRjLT5ydGNkZXYtPmRldiksIHJ0Yyk7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBzaGFyZSBJUlEgJWQ/XG4iLCBBVDkxX0lEX1NZUyk7CisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Y2Rldik7CisJCWdvdG8gZmFpbF9yZWdpc3RlcjsKKwl9CisKKwkvKiBOT1RFOiAgc2FtOTI2MCByZXYgQSBzaWxpY29uIGhhcyBhIFJPTSBidWcgd2hpY2ggcmVzZXRzIHRoZQorCSAqIFJUVCBvbiBhdCBsZWFzdCBzb21lIHJlYm9vdHMuICBJZiB5b3UgaGF2ZSB0aGF0IGNoaXAsIHlvdSBtdXN0CisJICogaW5pdGlhbGl6ZSB0aGUgdGltZSBmcm9tIHNvbWUgZXh0ZXJuYWwgc291cmNlIGxpa2UgYSBHUFMsIHdhbGwKKwkgKiBjbG9jaywgZGlzY3JldGUgUlRDLCBldGMKKwkgKi8KKworCWlmIChncGJyX3JlYWRsKHJ0YykgPT0gMCkKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIiVzOiBTRVQgVElNRSFcbiIsCisJCQkJZGV2X25hbWUoJnJ0Yy0+cnRjZGV2LT5kZXYpKTsKKworCXJldHVybiAwOworCitmYWlsX3JlZ2lzdGVyOgorCWlvdW5tYXAocnRjLT5ncGJyKTsKK2ZhaWxfZ3BicjoKKwlpb3VubWFwKHJ0Yy0+cnR0KTsKK2ZhaWw6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUocnRjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRGlzYWJsZSBhbmQgcmVtb3ZlIHRoZSBSVEMgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IGF0OTFfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzYW05X3J0YwkqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTMyCQltciA9IHJ0dF9yZWFkbChydGMsIE1SKTsKKworCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlydHRfd3JpdGVsKHJ0YywgTVIsIG1yICYgfihBVDkxX1JUVF9BTE1JRU4gfCBBVDkxX1JUVF9SVFRJTkNJRU4pKTsKKwlmcmVlX2lycShBVDkxX0lEX1NZUywgcnRjKTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Y2Rldik7CisKKwlpb3VubWFwKHJ0Yy0+Z3Bicik7CisJaW91bm1hcChydGMtPnJ0dCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUocnRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQ5MV9ydGNfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2FtOV9ydGMJKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXUzMgkJbXIgPSBydHRfcmVhZGwocnRjLCBNUik7CisKKwlydGMtPmltciA9IG1yICYgKEFUOTFfUlRUX0FMTUlFTiB8IEFUOTFfUlRUX1JUVElOQ0lFTik7CisJcnR0X3dyaXRlbChydGMsIE1SLCBtciAmIH5ydGMtPmltcik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyogQVQ5MVNBTTkgUlRDIFBvd2VyIG1hbmFnZW1lbnQgY29udHJvbCAqLworCitzdGF0aWMgaW50IGF0OTFfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzYW05X3J0YwkqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTMyCQltciA9IHJ0dF9yZWFkbChydGMsIE1SKTsKKworCS8qCisJICogVGhpcyBJUlEgaXMgc2hhcmVkIHdpdGggREJHVSBhbmQgb3RoZXIgaGFyZHdhcmUgd2hpY2ggaXNuJ3QKKwkgKiBuZWNlc3NhcmlseSBhIHdha2V1cCBldmVudCBzb3VyY2UuCisJICovCisJcnRjLT5pbXIgPSBtciAmIChBVDkxX1JUVF9BTE1JRU4gfCBBVDkxX1JUVF9SVFRJTkNJRU4pOworCWlmIChydGMtPmltcikgeworCQlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikgJiYgKG1yICYgQVQ5MV9SVFRfQUxNSUVOKSkgeworCQkJZW5hYmxlX2lycV93YWtlKEFUOTFfSURfU1lTKTsKKwkJCS8qIGRvbid0IGxldCBSVFRJTkMgY2F1c2Ugd2FrZXVwcyAqLworCQkJaWYgKG1yICYgQVQ5MV9SVFRfUlRUSU5DSUVOKQorCQkJCXJ0dF93cml0ZWwocnRjLCBNUiwgbXIgJiB+QVQ5MV9SVFRfUlRUSU5DSUVOKTsKKwkJfSBlbHNlCisJCQlydHRfd3JpdGVsKHJ0YywgTVIsIG1yICYgfnJ0Yy0+aW1yKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDkxX3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2FtOV9ydGMJKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXUzMgkJbXI7CisKKwlpZiAocnRjLT5pbXIpIHsKKwkJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQkJZGlzYWJsZV9pcnFfd2FrZShBVDkxX0lEX1NZUyk7CisJCW1yID0gcnR0X3JlYWRsKHJ0YywgTVIpOworCQlydHRfd3JpdGVsKHJ0YywgTVIsIG1yIHwgcnRjLT5pbXIpOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYXQ5MV9ydGNfc3VzcGVuZAlOVUxMCisjZGVmaW5lIGF0OTFfcnRjX3Jlc3VtZQkJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0OTFfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYXQ5MV9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhdDkxX3J0Y19yZW1vdmUpLAorCS5zaHV0ZG93bgk9IGF0OTFfcnRjX3NodXRkb3duLAorCS5zdXNwZW5kCT0gYXQ5MV9ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGF0OTFfcnRjX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLWF0OTFzYW05IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0OTFfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdDkxX3J0Y19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYXQ5MV9ydGNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdDkxX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0OTFfcnRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhdDkxX3J0Y19leGl0KTsKKworCitNT0RVTEVfQVVUSE9SKCJNaWNoZWwgQmVub2l0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBkcml2ZXIgZm9yIEF0bWVsIEFUOTFTQU05eCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWF1MXh4eC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWF1MXh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OWVkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYXUxeHh4LmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBBdTF4eHggY291bnRlcjAgKGFrYSBUaW1lLU9mLVllYXIgY291bnRlcikgUlRDIGludGVyZmFjZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hbnVlbCBMYXVzcyA8bWFub0Byb2FyaW5lbGsuaG9tZWxpbnV4Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBBbGwgY3VycmVudCBBdTF4eHggU29DcyBoYXZlIDIgY291bnRlcnMgZmVkIGJ5IGFuIGV4dGVybmFsIDMyLjc2OCBrSHoKKyAqIGNyeXN0YWwuIENvdW50ZXIgMCwgd2hpY2gga2VlcHMgY291bnRpbmcgZHVyaW5nIHNsZWVwL3Bvd2VyZG93biwgaXMKKyAqIHVzZWQgdG8gY291bnQgc2Vjb25kcyBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bml4IGVwb2NoLgorICoKKyAqIFRoZSBjb3VudGVycyBtdXN0IGJlIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQgYnkgYm9vdGxvYWRlci9ib2FyZCBjb2RlOworICogbm8gY2hlY2tzIGFzIHRvIHdoZXRoZXIgdGhleSByZWFsbHkgZ2V0IGEgcHJvcGVyIDMyLjc2OGtIeiBjbG9jayBhcmUKKyAqIG1hZGUgYXMgdGhpcyB3b3VsZCB0YWtlIGZhciB0b28gbG9uZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisvKiAzMmtIeiBjbG9jayBlbmFibGVkIGFuZCBkZXRlY3RlZCAqLworI2RlZmluZSBDTlRSX09LIChTWVNfQ05UUkxfRTAgfCBTWVNfQ05UUkxfMzJTKQorCitzdGF0aWMgaW50IGF1MXh0b3lfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyB0OworCisJdCA9IGF1X3JlYWRsKFNZU19UT1lSRUFEKTsKKworCXJ0Y190aW1lX3RvX3RtKHQsIHRtKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IGF1MXh0b3lfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwlydGNfdG1fdG9fdGltZSh0bSwgJnQpOworCisJYXVfd3JpdGVsKHQsIFNZU19UT1lXUklURSk7CisJYXVfc3luYygpOworCisJLyogd2FpdCBmb3IgdGhlIHBlbmRpbmcgcmVnaXN0ZXIgd3JpdGUgdG8gc3VjY2VlZC4gIFRoaXMgY2FuCisJICogdGFrZSB1cCB0byA2IHNlY29uZHMuLi4KKwkgKi8KKwl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX0MwUykKKwkJbXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhdTF4dG95X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGF1MXh0b3lfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBhdTF4dG95X3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF1MXh0b3lfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y2RldjsKKwl1bnNpZ25lZCBsb25nIHQ7CisJaW50IHJldDsKKworCXQgPSBhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCk7CisJaWYgKCEodCAmIENOVFJfT0spKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdW50ZXJzIG5vdCB3b3JraW5nOyBhYm9ydGluZy5cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcmV0ID0gLUVUSU1FRE9VVDsKKworCS8qIHNldCBjb3VudGVyMCB0aWNrcmF0ZSB0byAxSHogaWYgbmVjZXNzYXJ5ICovCisJaWYgKGF1X3JlYWRsKFNZU19UT1lUUklNKSAhPSAzMjc2NykgeworCQkvKiB3YWl0IHVudGlsIGhhcmR3YXJlIGdpdmVzIGFjY2VzcyB0byBUUklNIHJlZ2lzdGVyICovCisJCXQgPSAweDAwMTAwMDAwOworCQl3aGlsZSAoKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9UMFMpICYmIC0tdCkKKwkJCW1zbGVlcCgxKTsKKworCQlpZiAoIXQpIHsKKwkJCS8qIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZWdpc3RlciBhY2Nlc3M7IGFzc3VtZQorCQkJICogY291bnRlcnMgYXJlIHVudXNhYmxlLgorCQkJICovCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGFjY2Vzc1xuIik7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQkvKiBzZXQgMUh6IFRPWSB0aWNrIHJhdGUgKi8KKwkJYXVfd3JpdGVsKDMyNzY3LCBTWVNfVE9ZVFJJTSk7CisJCWF1X3N5bmMoKTsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHRoZSBoYXJkd2FyZSBhbGxvd3Mgd3JpdGVzIHRvIHRoZSBjb3VudGVyIHJlZyAqLworCXdoaWxlIChhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfQzBTKQorCQltc2xlZXAoMSk7CisKKwlydGNkZXYgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJydGMtYXUxeHh4IiwgJnBkZXYtPmRldiwKKwkJCQkgICAgICZhdTF4dG95X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0Y2RldikpIHsKKwkJcmV0ID0gUFRSX0VSUihydGNkZXYpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjZGV2KTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGF1MXh0b3lfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGNkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGNkZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1MXhydGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtYXUxeHh4IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF1MXh0b3lfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdTF4dG95X3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYXUxeHJ0Y19kcml2ZXIsIGF1MXh0b3lfcnRjX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MXh0b3lfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXUxeHJ0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhdTF4dG95X3J0Y19pbml0KTsKK21vZHVsZV9leGl0KGF1MXh0b3lfcnRjX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkF1MXh4eCBUT1ktY291bnRlci1iYXNlZCBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYW51ZWwgTGF1c3MgPG1hbnVlbC5sYXVzc0BnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1hdTF4eHgiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1iZmluLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYmZpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmMxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYmZpbi5jCkBAIC0wLDAgKzEsNDY0IEBACisvKgorICogQmxhY2tmaW4gT24tQ2hpcCBSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyCisgKiAgU3VwcG9ydHMgQkY1MXgvQkY1MngvQkY1M1sxMjNdL0JGNTNbNDY3XS9CRjU0eAorICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisvKiBUaGUgYmlnZ2VzdCBpc3N1ZSB3ZSBkZWFsIHdpdGggaW4gdGhpcyBkcml2ZXIgaXMgdGhhdCByZWdpc3RlciB3cml0ZXMgYXJlCisgKiBzeW5jZWQgdG8gdGhlIFJUQyBmcmVxdWVuY3kgb2YgMUh6LiAgU28gaWYgeW91IHdyaXRlIHRvIGEgcmVnaXN0ZXIgYW5kCisgKiBhdHRlbXB0IHRvIHdyaXRlIGFnYWluIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgaGFzIGNvbXBsZXRlZCwgdGhlIG5ldyB3cml0ZQorICogaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFRoaXMgY2FuIGVhc2lseSBiZSB0cm91Ymxlc29tZSBpZiB1c2Vyc3BhY2UgZGlzYWJsZXMKKyAqIG9uZSBldmVudCAoc2F5IHBlcmlvZGljKSBhbmQgdGhlbiByaWdodCBhZnRlciBlbmFibGVzIGFuIGV2ZW50IChzYXkgYWxhcm0pLgorICogU2luY2UgYWxsIGV2ZW50cyBhcmUgbWFpbnRhaW5lZCBpbiB0aGUgc2FtZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciwgaWYKKyAqIHdlIHdyb3RlIHRvIGl0IHRvIGRpc2FibGUgdGhlIGZpcnN0IGV2ZW50IGFuZCB0aGVuIHdyb3RlIHRvIGl0IGFnYWluIHRvCisgKiBlbmFibGUgdGhlIHNlY29uZCBldmVudCwgdGhhdCBzZWNvbmQgZXZlbnQgd291bGQgbm90IGJlIGVuYWJsZWQgYXMgdGhlCisgKiB3cml0ZSB3b3VsZCBiZSBkaXNjYXJkZWQgYW5kIHRoaW5ncyBxdWlja2x5IGZhbGwgYXBhcnQuCisgKgorICogVG8ga2VlcCB0aGlzIGRlbGF5IGZyb20gc2lnbmlmaWNhbnRseSBkZWdyYWRpbmcgcGVyZm9ybWFuY2UgKHdlLCBpbiB0aGVvcnksCisgKiB3b3VsZCBoYXZlIHRvIHNsZWVwIGZvciB1cCB0byAxIHNlY29uZCBldmVyeSB0aW1lIHdlIHdhbnRlZCB0byB3cml0ZSBhCisgKiByZWdpc3RlciksIHdlIG9ubHkgY2hlY2sgdGhlIHdyaXRlIHBlbmRpbmcgc3RhdHVzIGJlZm9yZSB3ZSBzdGFydCB0byBpc3N1ZQorICogYSBuZXcgd3JpdGUuICBXZSBiYW5rIG9uIHRoZSBpZGVhIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgd2hlbiB0aGUgc3luYworICogaGFwcGVucyBzbyBsb25nIGFzIHdlIGRvbid0IGF0dGVtcHQgYW5vdGhlciB3cml0ZSBiZWZvcmUgaXQgZG9lcy4gIFRoZSBvbmx5CisgKiB0aW1lIHVzZXJzcGFjZSB3b3VsZCB0YWtlIHRoaXMgcGVuYWx0eSBpcyB3aGVuIHRoZXkgdHJ5IGFuZCBkbyBtdWx0aXBsZQorICogb3BlcmF0aW9ucyByaWdodCBhZnRlciBhbm90aGVyIC4uLiBidXQgaW4gdGhpcyBjYXNlLCB0aGV5IG5lZWQgdG8gdGFrZSB0aGUKKyAqIHN5bmMgcGVuYWx0eSwgc28gd2Ugc2hvdWxkIGJlIE9LLgorICoKKyAqIEFsc28gbm90ZSB0aGF0IHRoZSBSVENfSVNUQVQgcmVnaXN0ZXIgZG9lcyBub3Qgc3VmZmVyIHRoaXMgcGVuYWx0eTsgaXRzCisgKiB3cml0ZXMgdG8gY2xlYXIgc3RhdHVzIHJlZ2lzdGVycyBjb21wbGV0ZSBpbW1lZGlhdGVseS4KKyAqLworCisvKiBJdCBtYXkgc2VlbSBvZGQgdGhhdCB0aGVyZSBpcyBubyBTV0NOVCBjb2RlIGluIGhlcmUgKHdoaWNoIHdvdWxkIGJlIGV4cG9zZWQKKyAqIHZpYSB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGV2ZW50LCBvciBQSUUpLiAgU2luY2UgdGhlIEJsYWNrZmluIFJUQyBwZXJpcGhlcmFsCisgKiBydW5zIGluIHVuaXRzIG9mIHNlY29uZHMgKE4vSFopIGJ1dCB0aGUgTGludXggZnJhbWV3b3JrIHJ1bnMgaW4gdW5pdHMgb2YgSFoKKyAqICgyXk4gSFopLCB0aGVyZSBpcyBubyBwb2ludCBpbiBrZWVwaW5nIGNvZGUgdGhhdCBvbmx5IHByb3ZpZGVzIDEgSFogUElFcy4KKyAqIFRoZSBzYW1lIGV4YWN0IGJlaGF2aW9yIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIHVwZGF0ZSBpbnRlcnJ1cHQKKyAqIGV2ZW50IChVSUUpLiAgTWF5YmUgZG93biB0aGUgbGluZSB0aGUgUlRDIHBlcmlwaGVyYWwgd2lsbCBzdWNrIGxlc3MgaW4gd2hpY2gKKyAqIGNhc2Ugd2UgY2FuIHJlLWludHJvZHVjZSBQSUUgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKKyNkZWZpbmUgZGV2X2RiZ19zdGFtcChkZXYpIGRldl9kYmcoZGV2LCAiJXM6JWk6IGhlcmUgaSBhbVxuIiwgX19mdW5jX18sIF9fTElORV9fKQorCitzdHJ1Y3QgYmZpbl9ydGMgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGNfZGV2OworCXN0cnVjdCBydGNfdGltZSBydGNfYWxhcm07CisJdTE2IHJ0Y193cm90ZV9yZWdzOworfTsKKworLyogQml0IHZhbHVlcyBmb3IgdGhlIElTVEFUIC8gSUNUTCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUlRDX0lTVEFUX1dSSVRFX0NPTVBMRVRFICAweDgwMDAKKyNkZWZpbmUgUlRDX0lTVEFUX1dSSVRFX1BFTkRJTkcgICAweDQwMDAKKyNkZWZpbmUgUlRDX0lTVEFUX0FMQVJNX0RBWSAgICAgICAweDAwNDAKKyNkZWZpbmUgUlRDX0lTVEFUXzI0SFIgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgUlRDX0lTVEFUX0hPVVIgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgUlRDX0lTVEFUX01JTiAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUlRDX0lTVEFUX1NFQyAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUlRDX0lTVEFUX0FMQVJNICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUlRDX0lTVEFUX1NUT1BXQVRDSCAgICAgICAweDAwMDEKKworLyogU2hpZnQgdmFsdWVzIGZvciBSVENfU1RBVCByZWdpc3RlciAqLworI2RlZmluZSBEQVlfQklUU19PRkYgICAgMTcKKyNkZWZpbmUgSE9VUl9CSVRTX09GRiAgIDEyCisjZGVmaW5lIE1JTl9CSVRTX09GRiAgICA2CisjZGVmaW5lIFNFQ19CSVRTX09GRiAgICAwCisKKy8qIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byBjb252ZXJ0IGJldHdlZW4gdGhlIGNvbW1vbiBSVEMgbm90aW9uIG9mIHRpbWUKKyAqIGFuZCB0aGUgaW50ZXJuYWwgQmxhY2tmaW4gbm90aW9uIHRoYXQgaXMgZW5jb2RlZCBpbiAzMmJpdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ0Y190aW1lX3RvX2JmaW4odW5zaWduZWQgbG9uZyBub3cpCit7CisJdTMyIHNlYyAgPSAobm93ICUgNjApOworCXUzMiBtaW4gID0gKG5vdyAlICg2MCAqIDYwKSkgLyA2MDsKKwl1MzIgaG91ciA9IChub3cgJSAoNjAgKiA2MCAqIDI0KSkgLyAoNjAgKiA2MCk7CisJdTMyIGRheXMgPSAobm93IC8gKDYwICogNjAgKiAyNCkpOworCXJldHVybiAoc2VjICA8PCBTRUNfQklUU19PRkYpICsKKwkgICAgICAgKG1pbiAgPDwgTUlOX0JJVFNfT0ZGKSArCisJICAgICAgIChob3VyIDw8IEhPVVJfQklUU19PRkYpICsKKwkgICAgICAgKGRheXMgPDwgREFZX0JJVFNfT0ZGKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBydGNfYmZpbl90b190aW1lKHUzMiBydGNfYmZpbikKK3sKKwlyZXR1cm4gKCgocnRjX2JmaW4gPj4gU0VDX0JJVFNfT0ZGKSAgJiAweDAwM0YpKSArCisJICAgICAgICgoKHJ0Y19iZmluID4+IE1JTl9CSVRTX09GRikgICYgMHgwMDNGKSAqIDYwKSArCisJICAgICAgICgoKHJ0Y19iZmluID4+IEhPVVJfQklUU19PRkYpICYgMHgwMDFGKSAqIDYwICogNjApICsKKwkgICAgICAgKCgocnRjX2JmaW4gPj4gREFZX0JJVFNfT0ZGKSAgJiAweDdGRkYpICogNjAgKiA2MCAqIDI0KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBydGNfYmZpbl90b190bSh1MzIgcnRjX2JmaW4sIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcnRjX3RpbWVfdG9fdG0ocnRjX2JmaW5fdG9fdGltZShydGNfYmZpbiksIHRtKTsKK30KKworLyoqCisgKgliZmluX3J0Y19zeW5jX3BlbmRpbmcgLSBtYWtlIHN1cmUgcGVuZGluZyB3cml0ZXMgaGF2ZSBjb21wbGV0ZQorICoKKyAqIFdhaXQgZm9yIHRoZSBwcmV2aW91cyB3cml0ZSB0byBhIFJUQyByZWdpc3RlciB0byBjb21wbGV0ZS4KKyAqIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IHNsZWVwIGhlcmUgYXMgdGhhdCBpbnRyb2R1Y2VzIGEgcmFjZSBjb25kaXRpb24gd2hlbgorICogdHVybmluZyBvbiBpbnRlcnJ1cHQgZXZlbnRzLiAgQ29uc2lkZXIgdGhpczoKKyAqICAtIHByb2Nlc3Mgc2V0cyBhbGFybQorICogIC0gcHJvY2VzcyBlbmFibGVzIGFsYXJtCisgKiAgLSBwcm9jZXNzIHNsZWVwcyB3aGlsZSB3YWl0aW5nIGZvciBydGMgd3JpdGUgdG8gc3luYworICogIC0gaW50ZXJydXB0IGZpcmVzIHdoaWxlIHByb2Nlc3MgaXMgc2xlZXBpbmcKKyAqICAtIGludGVycnVwdCBhY2tzIHRoZSBldmVudCBieSB3cml0aW5nIHRvIElTVEFUCisgKiAgLSBpbnRlcnJ1cHQgc2V0cyB0aGUgV1JJVEUgUEVORElORyBiaXQKKyAqICAtIGludGVycnVwdCBoYW5kbGVyIGZpbmlzaGVzCisgKiAgLSBwcm9jZXNzIHdha2VzIHVwLCBzZWVzIFdSSVRFIFBFTkRJTkcgYml0IHNldCwgZ29lcyB0byBzbGVlcAorICogIC0gaW50ZXJydXB0IGZpcmVzIHdoaWxlIHByb2Nlc3MgaXMgc2xlZXBpbmcKKyAqIElmIGFueW9uZSBjYW4gcG9pbnQgb3V0IHRoZSBvYnZpb3VzIHNvbHV0aW9uIGhlcmUsIGknbSBsaXN0ZW5pbmcgOikuICBUaGlzCisgKiBzaG91bGRuJ3QgYmUgYW4gaXNzdWUgb24gYW4gU01QIG9yIHByZWVtcHQgc3lzdGVtIGFzIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKiBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoZSBydGMgbG9jayBoZWxkLgorICoKKyAqIE90aGVyIG9wdGlvbnM6CisgKiAgLSBkaXNhYmxlIFBSRU4gc28gdGhlIHN5bmMgaGFwcGVucyBhdCAzMi43NjhrSFogLi4uIGJ1dCB0aGlzIGNoYW5nZXMgdGhlCisgKiAgICBpbmMgcmF0ZSBmb3IgYWxsIFJUQyByZWdpc3RlcnMgZnJvbSAxSFogdG8gMzIuNzY4a0haIC4uLgorICogIC0gdXNlIHRoZSB3cml0ZSBjb21wbGV0ZSBJUlEKKyAqLworLyoKK3N0YXRpYyB2b2lkIGJmaW5fcnRjX3N5bmNfcGVuZGluZ19wb2xsZWQodm9pZCkKK3sKKwl3aGlsZSAoIShiZmluX3JlYWRfUlRDX0lTVEFUKCkgJiBSVENfSVNUQVRfV1JJVEVfQ09NUExFVEUpKQorCQlpZiAoIShiZmluX3JlYWRfUlRDX0lTVEFUKCkgJiBSVENfSVNUQVRfV1JJVEVfUEVORElORykpCisJCQlicmVhazsKKwliZmluX3dyaXRlX1JUQ19JU1RBVChSVENfSVNUQVRfV1JJVEVfQ09NUExFVEUpOworfQorKi8KK3N0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oYmZpbl93cml0ZV9jb21wbGV0ZSk7CitzdGF0aWMgdm9pZCBiZmluX3J0Y19zeW5jX3BlbmRpbmcoc3RydWN0IGRldmljZSAqZGV2KQoreworCWRldl9kYmdfc3RhbXAoZGV2KTsKKwl3aGlsZSAoYmZpbl9yZWFkX1JUQ19JU1RBVCgpICYgUlRDX0lTVEFUX1dSSVRFX1BFTkRJTkcpCisJCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYmZpbl93cml0ZV9jb21wbGV0ZSwgSFogKiA1KTsKKwlkZXZfZGJnX3N0YW1wKGRldik7Cit9CisKKy8qKgorICoJYmZpbl9ydGNfcmVzZXQgLSBzZXQgUlRDIHRvIHNhbmUva25vd24gc3RhdGUKKyAqCisgKiBJbml0aWFsaXplIHRoZSBSVEMuICBFbmFibGUgcHJlLXNjYWxlciB0byBzY2FsZSBSVEMgY2xvY2sKKyAqIHRvIDFIeiBhbmQgY2xlYXIgaW50ZXJydXB0L3N0YXR1cyByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGJmaW5fcnRjX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTE2IHJ0Y19pY3RsKQoreworCXN0cnVjdCBiZmluX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJZGV2X2RiZ19zdGFtcChkZXYpOworCWJmaW5fcnRjX3N5bmNfcGVuZGluZyhkZXYpOworCWJmaW5fd3JpdGVfUlRDX1BSRU4oMHgxKTsKKwliZmluX3dyaXRlX1JUQ19JQ1RMKHJ0Y19pY3RsKTsKKwliZmluX3dyaXRlX1JUQ19BTEFSTSgwKTsKKwliZmluX3dyaXRlX1JUQ19JU1RBVCgweEZGRkYpOworCXJ0Yy0+cnRjX3dyb3RlX3JlZ3MgPSAwOworfQorCisvKioKKyAqCWJmaW5fcnRjX2ludGVycnVwdCAtIGhhbmRsZSBpbnRlcnJ1cHQgZnJvbSBSVEMKKyAqCisgKiBTaW5jZSB3ZSBoYW5kbGUgYWxsIFJUQyBldmVudHMgaGVyZSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIHJlcXVlc3RlZAorICogaW50ZXJydXB0IGlzIGVuYWJsZWQgKGluIFJUQ19JQ1RMKSBhcyB0aGUgZXZlbnQgc3RhdHVzIHJlZ2lzdGVyIChSVENfSVNUQVQpCisgKiBhbHdheXMgZ2V0cyB1cGRhdGVkIHJlZ2FyZGxlc3Mgb2YgdGhlIGludGVycnVwdCBiZWluZyBlbmFibGVkLiAgU28gd2hlbiBvbmUKKyAqIGV2ZW4gd2UgY2FyZSBhYm91dCAoZS5nLiBzdG9wd2F0Y2gpIGdvZXMgb2ZmLCB3ZSBkb24ndCB3YW50IHRvIHR1cm4gYXJvdW5kCisgKiBhbmQgc2F5IHRoYXQgb3RoZXIgZXZlbnRzIGhhdmUgaGFwcGVuZWQgYXMgd2VsbCAoZS5nLiBzZWNvbmQpLiAgV2UgZG8gbm90CisgKiBoYXZlIHRvIHdvcnJ5IGFib3V0IHBlbmRpbmcgd3JpdGVzIHRvIHRoZSBSVENfSUNUTCByZWdpc3RlciBhcyBpbnRlcnJ1cHRzCisgKiBvbmx5IGZpcmUgaWYgdGhleSBhcmUgZW5hYmxlZCBpbiB0aGUgUlRDX0lDVEwgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBiZmluX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgYmZpbl9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKKwlib29sIHdyaXRlX2NvbXBsZXRlID0gZmFsc2U7CisJdTE2IHJ0Y19pc3RhdCwgcnRjX2lzdGF0X2NsZWFyLCBydGNfaWN0bCwgYml0czsKKworCWRldl9kYmdfc3RhbXAoZGV2KTsKKworCXJ0Y19pc3RhdCA9IGJmaW5fcmVhZF9SVENfSVNUQVQoKTsKKwlydGNfaWN0bCA9IGJmaW5fcmVhZF9SVENfSUNUTCgpOworCXJ0Y19pc3RhdF9jbGVhciA9IDA7CisKKwliaXRzID0gUlRDX0lTVEFUX1dSSVRFX0NPTVBMRVRFOworCWlmIChydGNfaXN0YXQgJiBiaXRzKSB7CisJCXJ0Y19pc3RhdF9jbGVhciB8PSBiaXRzOworCQl3cml0ZV9jb21wbGV0ZSA9IHRydWU7CisJCWNvbXBsZXRlKCZiZmluX3dyaXRlX2NvbXBsZXRlKTsKKwl9CisKKwliaXRzID0gKFJUQ19JU1RBVF9BTEFSTSB8IFJUQ19JU1RBVF9BTEFSTV9EQVkpOworCWlmIChydGNfaWN0bCAmIGJpdHMpIHsKKwkJaWYgKHJ0Y19pc3RhdCAmIGJpdHMpIHsKKwkJCXJ0Y19pc3RhdF9jbGVhciB8PSBiaXRzOworCQkJZXZlbnRzIHw9IFJUQ19BRiB8IFJUQ19JUlFGOworCQl9CisJfQorCisJYml0cyA9IFJUQ19JU1RBVF9TRUM7CisJaWYgKHJ0Y19pY3RsICYgYml0cykgeworCQlpZiAocnRjX2lzdGF0ICYgYml0cykgeworCQkJcnRjX2lzdGF0X2NsZWFyIHw9IGJpdHM7CisJCQlldmVudHMgfD0gUlRDX1VGIHwgUlRDX0lSUUY7CisJCX0KKwl9CisKKwlpZiAoZXZlbnRzKQorCQlydGNfdXBkYXRlX2lycShydGMtPnJ0Y19kZXYsIDEsIGV2ZW50cyk7CisKKwlpZiAod3JpdGVfY29tcGxldGUgfHwgZXZlbnRzKSB7CisJCWJmaW5fd3JpdGVfUlRDX0lTVEFUKHJ0Y19pc3RhdF9jbGVhcik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UKKwkJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgdm9pZCBiZmluX3J0Y19pbnRfc2V0KHUxNiBydGNfaW50KQoreworCWJmaW5fd3JpdGVfUlRDX0lTVEFUKHJ0Y19pbnQpOworCWJmaW5fd3JpdGVfUlRDX0lDVEwoYmZpbl9yZWFkX1JUQ19JQ1RMKCkgfCBydGNfaW50KTsKK30KK3N0YXRpYyB2b2lkIGJmaW5fcnRjX2ludF9jbGVhcih1MTYgcnRjX2ludCkKK3sKKwliZmluX3dyaXRlX1JUQ19JQ1RMKGJmaW5fcmVhZF9SVENfSUNUTCgpICYgcnRjX2ludCk7Cit9CitzdGF0aWMgdm9pZCBiZmluX3J0Y19pbnRfc2V0X2FsYXJtKHN0cnVjdCBiZmluX3J0YyAqcnRjKQoreworCS8qIEJsYWNrZmluIGhhcyBkaWZmZXJlbnQgYml0cyBmb3Igd2hldGhlciB0aGUgYWxhcm0gaXMKKwkgKiBtb3JlIHRoYW4gMjQgaG91cnMgYXdheS4KKwkgKi8KKwliZmluX3J0Y19pbnRfc2V0KHJ0Yy0+cnRjX2FsYXJtLnRtX3lkYXkgPT0gLTEgPyBSVENfSVNUQVRfQUxBUk0gOiBSVENfSVNUQVRfQUxBUk1fREFZKTsKK30KKworc3RhdGljIGludCBiZmluX3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IGJmaW5fcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWRldl9kYmdfc3RhbXAoZGV2KTsKKwlpZiAoZW5hYmxlZCkKKwkJYmZpbl9ydGNfaW50X3NldF9hbGFybShydGMpOworCWVsc2UKKwkJYmZpbl9ydGNfaW50X2NsZWFyKH4oUlRDX0lTVEFUX0FMQVJNIHwgUlRDX0lTVEFUX0FMQVJNX0RBWSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgYmZpbl9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGV2X2RiZ19zdGFtcChkZXYpOworCisJaWYgKHJ0Yy0+cnRjX3dyb3RlX3JlZ3MgJiAweDEpCisJCWJmaW5fcnRjX3N5bmNfcGVuZGluZyhkZXYpOworCisJcnRjX2JmaW5fdG9fdG0oYmZpbl9yZWFkX1JUQ19TVEFUKCksIHRtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJmaW5fcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgYmZpbl9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBub3c7CisKKwlkZXZfZGJnX3N0YW1wKGRldik7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSh0bSwgJm5vdyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChydGMtPnJ0Y193cm90ZV9yZWdzICYgMHgxKQorCQkJYmZpbl9ydGNfc3luY19wZW5kaW5nKGRldik7CisJCWJmaW5fd3JpdGVfUlRDX1NUQVQocnRjX3RpbWVfdG9fYmZpbihub3cpKTsKKwkJcnRjLT5ydGNfd3JvdGVfcmVncyA9IDB4MTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJmaW5fcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgYmZpbl9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWRldl9kYmdfc3RhbXAoZGV2KTsKKwlhbHJtLT50aW1lID0gcnRjLT5ydGNfYWxhcm07CisJYmZpbl9ydGNfc3luY19wZW5kaW5nKGRldik7CisJYWxybS0+ZW5hYmxlZCA9ICEhKGJmaW5fcmVhZF9SVENfSUNUTCgpICYgKFJUQ19JU1RBVF9BTEFSTSB8IFJUQ19JU1RBVF9BTEFSTV9EQVkpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZmluX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgYmZpbl9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgcnRjX2FsYXJtOworCisJZGV2X2RiZ19zdGFtcChkZXYpOworCisJaWYgKHJ0Y190bV90b190aW1lKCZhbHJtLT50aW1lLCAmcnRjX2FsYXJtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydGMtPnJ0Y19hbGFybSA9IGFscm0tPnRpbWU7CisKKwliZmluX3J0Y19zeW5jX3BlbmRpbmcoZGV2KTsKKwliZmluX3dyaXRlX1JUQ19BTEFSTShydGNfdGltZV90b19iZmluKHJ0Y19hbGFybSkpOworCWlmIChhbHJtLT5lbmFibGVkKQorCQliZmluX3J0Y19pbnRfc2V0X2FsYXJtKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZmluX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisjZGVmaW5lIHllc25vKHgpICgoeCkgPyAieWVzIiA6ICJubyIpCisJdTE2IGljdGwgPSBiZmluX3JlYWRfUlRDX0lDVEwoKTsKKwlkZXZfZGJnX3N0YW1wKGRldik7CisJc2VxX3ByaW50ZihzZXEsCisJCSJhbGFybV9JUlFcdDogJXNcbiIKKwkJIndrYWxhcm1fSVJRXHQ6ICVzXG4iCisJCSJzZWNvbmRzX0lSUVx0OiAlc1xuIiwKKwkJeWVzbm8oaWN0bCAmIFJUQ19JU1RBVF9BTEFSTSksCisJCXllc25vKGljdGwgJiBSVENfSVNUQVRfQUxBUk1fREFZKSwKKwkJeWVzbm8oaWN0bCAmIFJUQ19JU1RBVF9TRUMpKTsKKwlyZXR1cm4gMDsKKyN1bmRlZiB5ZXNubworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgYmZpbl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgICAgID0gYmZpbl9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSAgICAgID0gYmZpbl9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gICAgPSBiZmluX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gICAgID0gYmZpbl9ydGNfc2V0X2FsYXJtLAorCS5wcm9jICAgICAgICAgID0gYmZpbl9ydGNfcHJvYywKKwkuYWxhcm1faXJxX2VuYWJsZSA9IGJmaW5fcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBiZmluX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiZmluX3J0YyAqcnRjOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOworCisJZGV2X2RiZ19zdGFtcChkZXYpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgUlRDIHN0cnVjdCAqLworCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKCpydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXJ0YykpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisKKwkvKiBSZWdpc3RlciBvdXIgUlRDIHdpdGggdGhlIFJUQyBmcmFtZXdvcmsgKi8KKwlydGMtPnJ0Y19kZXYgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsIGRldiwgJmJmaW5fcnRjX29wcywKKwkJCQkJCVRISVNfTU9EVUxFKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHJ0Yy0+cnRjX2RldikpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjLT5ydGNfZGV2KTsKKwkJZ290byBlcnI7CisJfQorCisJLyogR3JhYiB0aGUgSVJRIGFuZCBpbml0IHRoZSBoYXJkd2FyZSAqLworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9SVEMsIGJmaW5fcnRjX2ludGVycnVwdCwgMCwgcGRldi0+bmFtZSwgZGV2KTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBlcnJfcmVnOworCS8qIHNvbWV0aW1lcyB0aGUgYm9vdGxvYWRlciB0b3VjaGVkIHRoaW5ncywgYnV0IHRoZSB3cml0ZSBjb21wbGV0ZSB3YXMgbm90CisJICogZW5hYmxlZCwgc28gbGV0J3MganVzdCBkbyBhIHF1aWNrIHRpbWVvdXQgaGVyZSBzaW5jZSB0aGUgSVJRIHdpbGwgbm90IGZpcmUgLi4uCisJICovCisJd2hpbGUgKGJmaW5fcmVhZF9SVENfSVNUQVQoKSAmIFJUQ19JU1RBVF9XUklURV9QRU5ESU5HKQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWJyZWFrOworCWJmaW5fcnRjX3Jlc2V0KGRldiwgUlRDX0lTVEFUX1dSSVRFX0NPTVBMRVRFKTsKKwliZmluX3dyaXRlX1JUQ19TV0NOVCgwKTsKKworCXJldHVybiAwOworCitlcnJfcmVnOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Y19kZXYpOworZXJyOgorCWtmcmVlKHJ0Yyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYmZpbl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJmaW5fcnRjICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJYmZpbl9ydGNfcmVzZXQoZGV2LCAwKTsKKwlmcmVlX2lycShJUlFfUlRDLCBkZXYpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Y19kZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBiZmluX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJZGV2X2RiZ19zdGFtcChkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpIHsKKwkJZW5hYmxlX2lycV93YWtlKElSUV9SVEMpOworCQliZmluX3J0Y19zeW5jX3BlbmRpbmcoZGV2KTsKKwl9IGVsc2UKKwkJYmZpbl9ydGNfaW50X2NsZWFyKDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWRldl9kYmdfc3RhbXAoZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKElSUV9SVEMpOworCisJLyoKKwkgKiBTaW5jZSBvbmx5IHNvbWUgb2YgdGhlIFJUQyBiaXRzIGFyZSBtYWludGFpbmVkIGV4dGVybmFsbHkgaW4gdGhlCisJICogVmJhdCBkb21haW4sIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIFJUQyBNTVJzIHRvIGJlIHN5bmNlZCBpbnRvCisJICogdGhlIGNvcmUgYWZ0ZXIgd2FraW5nIHVwLiAgVGhpcyBoYXBwZW5zIGV2ZXJ5IFJUQyAxSFouICBPbmNlIHRoYXQKKwkgKiBoYXMgaGFwcGVuZWQsIHdlIGNhbiBnbyBhaGVhZCBhbmQgcmUtZW5hYmxlIHRoZSBpbXBvcnRhbnQgd3JpdGUKKwkgKiBjb21wbGV0ZSBpbnRlcnJ1cHQgZXZlbnQuCisJICovCisJd2hpbGUgKCEoYmZpbl9yZWFkX1JUQ19JU1RBVCgpICYgUlRDX0lTVEFUX1NFQykpCisJCWNvbnRpbnVlOworCWJmaW5fcnRjX2ludF9zZXQoUlRDX0lTVEFUX1dSSVRFX0NPTVBMRVRFKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyMgZGVmaW5lIGJmaW5fcnRjX3N1c3BlbmQgTlVMTAorIyBkZWZpbmUgYmZpbl9ydGNfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmZpbl9ydGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtYmZpbiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGJmaW5fcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYmZpbl9ydGNfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGJmaW5fcnRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBiZmluX3J0Y19yZXN1bWUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJmaW5fcnRjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQmxhY2tmaW4gT24tQ2hpcCBSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1iZmluIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYnEzMmsuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1icTMyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTAxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYnEzMmsuYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIERyaXZlciBmb3IgVEkgQlEzMjAwMCBSVEMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNlbWloYWxmLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjZGVmaW5lIEJRMzJLX1NFQ09ORFMJCTB4MDAJLyogU2Vjb25kcyByZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lIEJRMzJLX1NFQ09ORFNfTUFTSwkweDdGCS8qIE1hc2sgb3ZlciBzZWNvbmRzIHZhbHVlICovCisjZGVmaW5lIEJRMzJLX1NUT1AJCTB4ODAJLyogT3NjaWxsYXRvciBTdG9wIGZsYXQgKi8KKworI2RlZmluZSBCUTMyS19NSU5VVEVTCQkweDAxCS8qIE1pbnV0ZXMgcmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZSBCUTMyS19NSU5VVEVTX01BU0sJMHg3RgkvKiBNYXNrIG92ZXIgbWludXRlcyB2YWx1ZSAqLworI2RlZmluZSBCUTMyS19PRgkJMHg4MAkvKiBPc2NpbGxhdG9yIEZhaWx1cmUgZmxhZyAqLworCisjZGVmaW5lIEJRMzJLX0hPVVJTX01BU0sJMHgzRgkvKiBNYXNrIG92ZXIgaG91cnMgdmFsdWUgKi8KKyNkZWZpbmUgQlEzMktfQ0VOVAkJMHg0MAkvKiBDZW50dXJ5IGZsYWcgKi8KKyNkZWZpbmUgQlEzMktfQ0VOVF9FTgkJMHg4MAkvKiBDZW50dXJ5IGZsYWcgZW5hYmxlIGJpdCAqLworCitzdHJ1Y3QgYnEzMmtfcmVncyB7CisJdWludDhfdAkJc2Vjb25kczsKKwl1aW50OF90CQltaW51dGVzOworCXVpbnQ4X3QJCWNlbnRfaG91cnM7CisJdWludDhfdAkJZGF5OworCXVpbnQ4X3QJCWRhdGU7CisJdWludDhfdAkJbW9udGg7CisJdWludDhfdAkJeWVhcnM7Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYnEzMmtfZHJpdmVyOworCitzdGF0aWMgaW50IGJxMzJrX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhLCB1aW50OF90IG9mZiwgdWludDhfdCBsZW4pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9ICZvZmYsCisJCX0sIHsKKwkJCS5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuID0gbGVuLAorCQkJLmJ1ZiA9IGRhdGEsCisJCX0KKwl9OworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgYnEzMmtfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhLCB1aW50OF90IG9mZiwgdWludDhfdCBsZW4pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1aW50OF90IGJ1ZmZlcltsZW4gKyAxXTsKKworCWJ1ZmZlclswXSA9IG9mZjsKKwltZW1jcHkoJmJ1ZmZlclsxXSwgZGF0YSwgbGVuKTsKKworCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWZmZXIsIGxlbiArIDEpID09IGxlbiArIDEpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgYnEzMmtfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IGJxMzJrX3JlZ3MgcmVnczsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGJxMzJrX3JlYWQoZGV2LCAmcmVncywgMCwgc2l6ZW9mKHJlZ3MpKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHJlZ3Muc2Vjb25kcyAmIEJRMzJLX1NFQ09ORFNfTUFTSyk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4ocmVncy5taW51dGVzICYgQlEzMktfU0VDT05EU19NQVNLKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4ocmVncy5jZW50X2hvdXJzICYgQlEzMktfSE9VUlNfTUFTSyk7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHJlZ3MuZGF0ZSk7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHJlZ3MuZGF5KSAtIDE7CisJdG0tPnRtX21vbiA9IGJjZDJiaW4ocmVncy5tb250aCkgLSAxOworCXRtLT50bV95ZWFyID0gYmNkMmJpbihyZWdzLnllYXJzKSArCisJCQkJKChyZWdzLmNlbnRfaG91cnMgJiBCUTMyS19DRU5UKSA/IDEwMCA6IDApOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgYnEzMmtfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgYnEzMmtfcmVncyByZWdzOworCisJcmVncy5zZWNvbmRzID0gYmluMmJjZCh0bS0+dG1fc2VjKTsKKwlyZWdzLm1pbnV0ZXMgPSBiaW4yYmNkKHRtLT50bV9taW4pOworCXJlZ3MuY2VudF9ob3VycyA9IGJpbjJiY2QodG0tPnRtX2hvdXIpIHwgQlEzMktfQ0VOVF9FTjsKKwlyZWdzLmRheSA9IGJpbjJiY2QodG0tPnRtX3dkYXkgKyAxKTsKKwlyZWdzLmRhdGUgPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlyZWdzLm1vbnRoID0gYmluMmJjZCh0bS0+dG1fbW9uICsgMSk7CisKKwlpZiAodG0tPnRtX3llYXIgPj0gMTAwKSB7CisJCXJlZ3MuY2VudF9ob3VycyB8PSBCUTMyS19DRU5UOworCQlyZWdzLnllYXJzID0gYmluMmJjZCh0bS0+dG1feWVhciAtIDEwMCk7CisJfSBlbHNlCisJCXJlZ3MueWVhcnMgPSBiaW4yYmNkKHRtLT50bV95ZWFyKTsKKworCXJldHVybiBicTMya193cml0ZShkZXYsICZyZWdzLCAwLCBzaXplb2YocmVncykpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgYnEzMmtfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gYnEzMmtfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBicTMya19ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IGJxMzJrX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXVpbnQ4X3QgcmVnOworCWludCBlcnJvcjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIE9zY2lsbGF0b3IgU3RvcCBmbGFnICovCisJZXJyb3IgPSBicTMya19yZWFkKGRldiwgJnJlZywgQlEzMktfU0VDT05EUywgMSk7CisJaWYgKCFlcnJvciAmJiAocmVnICYgQlEzMktfU1RPUCkpIHsKKwkJZGV2X3dhcm4oZGV2LCAiT3NjaWxsYXRvciB3YXMgaGFsdGVkLiBSZXN0YXJ0aW5nLi4uXG4iKTsKKwkJcmVnICY9IH5CUTMyS19TVE9QOworCQllcnJvciA9IGJxMzJrX3dyaXRlKGRldiwgJnJlZywgQlEzMktfU0VDT05EUywgMSk7CisJfQorCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyogQ2hlY2sgT3NjaWxsYXRvciBGYWlsdXJlIGZsYWcgKi8KKwllcnJvciA9IGJxMzJrX3JlYWQoZGV2LCAmcmVnLCBCUTMyS19NSU5VVEVTLCAxKTsKKwlpZiAoIWVycm9yICYmIChyZWcgJiBCUTMyS19PRikpIHsKKwkJZGV2X3dhcm4oZGV2LCAiT3NjaWxsYXRvciBGYWlsdXJlLiBDaGVjayBSVEMgYmF0dGVyeS5cbiIpOworCQlyZWcgJj0gfkJRMzJLX09GOworCQllcnJvciA9IGJxMzJrX3dyaXRlKGRldiwgJnJlZywgQlEzMktfTUlOVVRFUywgMSk7CisJfQorCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihicTMya19kcml2ZXIuZHJpdmVyLm5hbWUsICZjbGllbnQtPmRldiwKKwkJCQkJCSZicTMya19ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBicTMya19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJxMzJrX2lkW10gPSB7CisJeyAiYnEzMjAwMCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYnEzMmtfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYnEzMmtfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImJxMzJrIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYnEzMmtfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChicTMya19yZW1vdmUpLAorCS5pZF90YWJsZQk9IGJxMzJrX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoYnEzMmtfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiU2VtaWhhbGYsIFBpb3RyIFppZWNpayA8a29zbW9Ac2VtaWhhbGYuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBCUTMyMDAwIEkyQyBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYnE0ODAyLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtYnE0ODAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2MTJlZgotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1icTQ4MDIuYwpAQCAtMCwwICsxLDIyMSBAQAorLyogcnRjLWJxNDgwMi5jOiBUSSBCUTQ4MDIgUlRDIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVEkgQlE0ODAyIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IGJxNDgwMiB7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwl1bnNpZ25lZCBsb25nCQlpb3BvcnQ7CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCByZXNvdXJjZQkJKnI7CisJdTggKCpyZWFkKShzdHJ1Y3QgYnE0ODAyICosIGludCk7CisJdm9pZCAoKndyaXRlKShzdHJ1Y3QgYnE0ODAyICosIGludCwgdTgpOworfTsKKworc3RhdGljIHU4IGJxNDgwMl9yZWFkX2lvKHN0cnVjdCBicTQ4MDIgKnAsIGludCBvZmYpCit7CisJcmV0dXJuIGluYihwLT5pb3BvcnQgKyBvZmYpOworfQorCitzdGF0aWMgdm9pZCBicTQ4MDJfd3JpdGVfaW8oc3RydWN0IGJxNDgwMiAqcCwgaW50IG9mZiwgdTggdmFsKQoreworCW91dGIodmFsLCBwLT5pb3BvcnQgKyBvZmYpOworfQorCitzdGF0aWMgdTggYnE0ODAyX3JlYWRfbWVtKHN0cnVjdCBicTQ4MDIgKnAsIGludCBvZmYpCit7CisJcmV0dXJuIHJlYWRiKHAtPnJlZ3MgKyBvZmYpOworfQorCitzdGF0aWMgdm9pZCBicTQ4MDJfd3JpdGVfbWVtKHN0cnVjdCBicTQ4MDIgKnAsIGludCBvZmYsIHU4IHZhbCkKK3sKKwl3cml0ZWIodmFsLCBwLT5yZWdzICsgb2ZmKTsKK30KKworc3RhdGljIGludCBicTQ4MDJfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGJxNDgwMiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNlbnR1cnk7CisJdTggdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHAtPnJlYWQocCwgMHgwZSk7CisJcC0+d3JpdGUocCwgMHhlLCB2YWwgfCAweDA4KTsKKworCXRtLT50bV9zZWMgPSBwLT5yZWFkKHAsIDB4MDApOworCXRtLT50bV9taW4gPSBwLT5yZWFkKHAsIDB4MDIpOworCXRtLT50bV9ob3VyID0gcC0+cmVhZChwLCAweDA0KTsKKwl0bS0+dG1fbWRheSA9IHAtPnJlYWQocCwgMHgwNik7CisJdG0tPnRtX21vbiA9IHAtPnJlYWQocCwgMHgwOSk7CisJdG0tPnRtX3llYXIgPSBwLT5yZWFkKHAsIDB4MGEpOworCXRtLT50bV93ZGF5ID0gcC0+cmVhZChwLCAweDA4KTsKKwljZW50dXJ5ID0gcC0+cmVhZChwLCAweDBmKTsKKworCXAtPndyaXRlKHAsIDB4MGUsIHZhbCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5sb2NrLCBmbGFncyk7CisKKwl0bS0+dG1fc2VjID0gYmNkMmJpbih0bS0+dG1fc2VjKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbih0bS0+dG1fbWluKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4odG0tPnRtX2hvdXIpOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbih0bS0+dG1fbWRheSk7CisJdG0tPnRtX21vbiA9IGJjZDJiaW4odG0tPnRtX21vbik7CisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHRtLT50bV95ZWFyKTsKKwl0bS0+dG1fd2RheSA9IGJjZDJiaW4odG0tPnRtX3dkYXkpOworCWNlbnR1cnkgPSBiY2QyYmluKGNlbnR1cnkpOworCisJdG0tPnRtX3llYXIgKz0gKGNlbnR1cnkgKiAxMDApOworCXRtLT50bV95ZWFyIC09IDE5MDA7CisKKwl0bS0+dG1fbW9uLS07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicTQ4MDJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYnE0ODAyICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTggc2VjLCBtaW4sIGhycywgZGF5LCBtb24sIHlycywgY2VudHVyeSwgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHllYXI7CisKKwl5ZWFyID0gdG0tPnRtX3llYXIgKyAxOTAwOworCWNlbnR1cnkgPSB5ZWFyIC8gMTAwOworCXlycyA9IHllYXIgJSAxMDA7CisKKwltb24gPSB0bS0+dG1fbW9uICsgMTsgICAvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwlkYXkgPSB0bS0+dG1fbWRheTsKKwlocnMgPSB0bS0+dG1faG91cjsKKwltaW4gPSB0bS0+dG1fbWluOworCXNlYyA9IHRtLT50bV9zZWM7CisKKwlzZWMgPSBiaW4yYmNkKHNlYyk7CisJbWluID0gYmluMmJjZChtaW4pOworCWhycyA9IGJpbjJiY2QoaHJzKTsKKwlkYXkgPSBiaW4yYmNkKGRheSk7CisJbW9uID0gYmluMmJjZChtb24pOworCXlycyA9IGJpbjJiY2QoeXJzKTsKKwljZW50dXJ5ID0gYmluMmJjZChjZW50dXJ5KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5sb2NrLCBmbGFncyk7CisKKwl2YWwgPSBwLT5yZWFkKHAsIDB4MGUpOworCXAtPndyaXRlKHAsIDB4MGUsIHZhbCB8IDB4MDgpOworCisJcC0+d3JpdGUocCwgMHgwMCwgc2VjKTsKKwlwLT53cml0ZShwLCAweDAyLCBtaW4pOworCXAtPndyaXRlKHAsIDB4MDQsIGhycyk7CisJcC0+d3JpdGUocCwgMHgwNiwgZGF5KTsKKwlwLT53cml0ZShwLCAweDA5LCBtb24pOworCXAtPndyaXRlKHAsIDB4MGEsIHlycyk7CisJcC0+d3JpdGUocCwgMHgwZiwgY2VudHVyeSk7CisKKwlwLT53cml0ZShwLCAweDBlLCB2YWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBicTQ4MDJfb3BzID0geworCS5yZWFkX3RpbWUJPSBicTQ4MDJfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGJxNDgwMl9zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJxNDgwMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBicTQ4MDIgKnAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWludCBlcnIgPSAtRU5PTUVNOworCisJaWYgKCFwKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9ja19pbml0KCZwLT5sb2NrKTsKKworCXAtPnIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcC0+cikgeworCQlwLT5yID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOworCQllcnIgPSAtRUlOVkFMOworCQlpZiAoIXAtPnIpCisJCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAocC0+ci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCXAtPmlvcG9ydCA9IHAtPnItPnN0YXJ0OworCQlwLT5yZWFkID0gYnE0ODAyX3JlYWRfaW87CisJCXAtPndyaXRlID0gYnE0ODAyX3dyaXRlX2lvOworCX0gZWxzZSBpZiAocC0+ci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlwLT5yZWdzID0gaW9yZW1hcChwLT5yLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShwLT5yKSk7CisJCXAtPnJlYWQgPSBicTQ4MDJfcmVhZF9tZW07CisJCXAtPndyaXRlID0gYnE0ODAyX3dyaXRlX21lbTsKKwl9IGVsc2UgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHApOworCisJcC0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiYnE0ODAyIiwgJnBkZXYtPmRldiwKKwkJCQkgICAgICZicTQ4MDJfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihwLT5ydGMpKSB7CisJCWVyciA9IFBUUl9FUlIocC0+cnRjKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9pb3VubWFwOgorCWlmIChwLT5yLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlpb3VubWFwKHAtPnJlZ3MpOworb3V0X2ZyZWU6CisJa2ZyZWUocCk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGJxNDgwMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYnE0ODAyICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocC0+cnRjKTsKKwlpZiAocC0+ci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJaW91bm1hcChwLT5yZWdzKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJa2ZyZWUocCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1icTQ4MDIiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYnE0ODAyX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLWJxNDgwMiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGJxNDgwMl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGJxNDgwMl9yZW1vdmUpLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihicTQ4MDJfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmVkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCkBAIC0wLDAgKzEsMTI0NCBAQAorLyoKKyAqIFJUQyBjbGFzcyBkcml2ZXIgZm9yICJDTU9TIFJUQyI6ICBQQ3MsIEFDUEksIGV0YworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIEdvcnRtYWtlciAoZHJpdmVycy9jaGFyL3J0Yy5jKQorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIEJyb3duZWxsIChjb252ZXJ0IHRvIG5ldyBmcmFtZXdvcmspCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICogVGhlIG9yaWdpbmFsICJjbW9zIGNsb2NrIiBjaGlwIHdhcyBhbiBNQzE0NjgxOCBjaGlwLCBub3cgb2Jzb2xldGUuCisgKiBUaGF0IGRlZmluZWQgdGhlIHJlZ2lzdGVyIGludGVyZmFjZSBub3cgcHJvdmlkZWQgYnkgYWxsIFBDcywgc29tZQorICogbm9uLVBDIHN5c3RlbXMsIGFuZCBpbmNvcnBvcmF0ZWQgaW50byBBQ1BJLiAgTW9kZXJuIFBDIGNoaXBzZXRzCisgKiBpbnRlZ3JhdGUgYW4gTUMxNDY4MTggY2xvbmUgaW4gdGhlaXIgc291dGhicmlkZ2UsIGFuZCBib2FyZHMgdXNlCisgKiB0aGF0IGluc3RlYWQgb2YgZGlzY3JldGUgY2xvbmVzIGxpa2UgdGhlIERTMTI4ODcgb3IgTTQ4VDg2LiAgVGhlcmUKKyAqIGFyZSBhbHNvIGNsb25lcyB0aGF0IGNvbm5lY3QgdXNpbmcgdGhlIExQQyBidXMuCisgKgorICogVGhhdCByZWdpc3RlciBBUEkgaXMgYWxzbyB1c2VkIGRpcmVjdGx5IGJ5IHZhcmlvdXMgb3RoZXIgZHJpdmVycworICogKG5vdGFibHkgZm9yIGludGVncmF0ZWQgTlZSQU0pLCBpbmZyYXN0cnVjdHVyZSAoeDg2IGhhcyBjb2RlIHRvCisgKiBieXBhc3MgdGhlIFJUQyBmcmFtZXdvcmssIGRpcmVjdGx5IHJlYWRpbmcgdGhlIFJUQyBkdXJpbmcgYm9vdAorICogYW5kIHVwZGF0aW5nIG1pbnV0ZXMvc2Vjb25kcyBmb3Igc3lzdGVtcyB1c2luZyBOVFAgc3luY2gpIGFuZAorICogdXRpbGl0aWVzIChsaWtlIHVzZXJzcGFjZSAnaHdjbG9jaycsIGlmIG5vIC9kZXYgbm9kZSBleGlzdHMpLgorICoKKyAqIFNvICoqQUxMKiogY2FsbHMgdG8gQ01PU19SRUFEIGFuZCBDTU9TX1dSSVRFIG11c3QgYmUgZG9uZSB3aXRoCisgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLCBob2xkaW5nIHRoZSBnbG9iYWwgcnRjX2xvY2ssIHRvIGV4Y2x1ZGUgdGhvc2UKKyAqIG90aGVyIGRyaXZlcnMgYW5kIHV0aWxpdGllcyBvbiBjb3JyZWN0bHkgY29uZmlndXJlZCBzeXN0ZW1zLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorCisvKiB0aGlzIGlzIGZvciAiZ2VuZXJpYyBhY2Nlc3MgdG8gUEMtc3R5bGUgUlRDIiB1c2luZyBDTU9TX1JFQUQvQ01PU19XUklURSAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3J0Yy5oPgorCitzdHJ1Y3QgY21vc19ydGMgeworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlpbnQJCQlpcnE7CisJc3RydWN0IHJlc291cmNlCQkqaW9tZW07CisKKwl2b2lkCQkJKCp3YWtlX29uKShzdHJ1Y3QgZGV2aWNlICopOworCXZvaWQJCQkoKndha2Vfb2ZmKShzdHJ1Y3QgZGV2aWNlICopOworCisJdTgJCQllbmFibGVkX3dha2U7CisJdTgJCQlzdXNwZW5kX2N0cmw7CisKKwkvKiBuZXdlciBoYXJkd2FyZSBleHRlbmRzIHRoZSBvcmlnaW5hbCByZWdpc3RlciBzZXQgKi8KKwl1OAkJCWRheV9hbHJtOworCXU4CQkJbW9uX2Fscm07CisJdTgJCQljZW50dXJ5OworfTsKKworLyogYm90aCBwbGF0Zm9ybSBhbmQgcG5wIGJ1c3NlcyB1c2UgbmVnYXRpdmUgbnVtYmVycyBmb3IgaW52YWxpZCBpcnFzICovCisjZGVmaW5lIGlzX3ZhbGlkX2lycShuKQkJKChuKSA+IDApCisKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAicnRjX2Ntb3MiOworCisvKiBUaGUgUlRDX0lOVFIgcmVnaXN0ZXIgbWF5IGhhdmUgZS5nLiBSVENfUEYgc2V0IGV2ZW4gaWYgUlRDX1BJRSBpcyBjbGVhcjsKKyAqIGFsd2F5cyBtYXNrIGl0IGFnYWluc3QgdGhlIGlycSBlbmFibGUgYml0cyBpbiBSVENfQ09OVFJPTC4gIEJpdCB2YWx1ZXMKKyAqIGFyZSB0aGUgc2FtZTogUEY9PVBJRSwgQUY9QUlFLCBVRj1VSUU7IHNvIFJUQ19JUlFNQVNLIHdvcmtzIHdpdGggYm90aC4KKyAqLworI2RlZmluZQlSVENfSVJRTUFTSwkoUlRDX1BGIHwgUlRDX0FGIHwgUlRDX1VGKQorCitzdGF0aWMgaW5saW5lIGludCBpc19pbnRyKHU4IHJ0Y19pbnRyKQoreworCWlmICghKHJ0Y19pbnRyICYgUlRDX0lSUUYpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcnRjX2ludHIgJiBSVENfSVJRTUFTSzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTXVjaCBtb2Rlcm4geDg2IGhhcmR3YXJlIGhhcyBIUEVUcyAoMTArIE1IeiB0aW1lcnMpIHdoaWNoLCBiZWNhdXNlCisgKiBtYW55IEJJT1MgcHJvZ3JhbW1lcnMgZG9uJ3Qgc2V0IHVwICJzYW5lIG1vZGUiIElSUSByb3V0aW5nLCBhcmUgbW9zdGx5CisgKiB1c2VkIGluIGEgYnJva2VuICJsZWdhY3kgcmVwbGFjZW1lbnQiIG1vZGUuICBUaGUgYnJlYWthZ2UgaW5jbHVkZXMKKyAqIEhQRVQgIzEgaGlqYWNraW5nIHRoZSBJUlEgZm9yIHRoaXMgUlRDLCBhbmQgYmVpbmcgdW5hdmFpbGFibGUgZm9yCisgKiBvdGhlciAoYmV0dGVyKSB1c2UuCisgKgorICogV2hlbiB0aGF0IGJyb2tlbiBtb2RlIGlzIGluIHVzZSwgcGxhdGZvcm0gZ2x1ZSBwcm92aWRlcyBhIHBhcnRpYWwKKyAqIGVtdWxhdGlvbiBvZiBoYXJkd2FyZSBSVEMgSVJRIGZhY2lsaXRpZXMgdXNpbmcgSFBFVCAjMS4gIFdlIGRvbid0CisgKiB3YW50IHRvIHVzZSBIUEVUIGZvciBhbnl0aGluZyBleGNlcHQgdGhvc2UgSVJRcyB0aG91Z2guLi4KKyAqLworI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBocGV0X21hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBtYXNrKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBocGV0X3NldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIG1hc2spCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwgdW5zaWduZWQgY2hhciBzZWMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhwZXRfc2V0X3BlcmlvZGljX2ZyZXEodW5zaWduZWQgbG9uZyBmcmVxKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBocGV0X3J0Y19kcm9wcGVkX2lycSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBocGV0X3J0Y190aW1lcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpcnFfaGFuZGxlcl90IGhwZXRfcnRjX2ludGVycnVwdDsKKworc3RhdGljIGlubGluZSBpbnQgaHBldF9yZWdpc3Rlcl9pcnFfaGFuZGxlcihpcnFfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhwZXRfdW5yZWdpc3Rlcl9pcnFfaGFuZGxlcihpcnFfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgUlRDX1BPUlQKKworLyogTW9zdCBuZXdlciB4ODYgc3lzdGVtcyBoYXZlIHR3byByZWdpc3RlciBiYW5rcywgdGhlIGZpcnN0IHVzZWQKKyAqIGZvciBSVEMgYW5kIE5WUkFNIGFuZCB0aGUgc2Vjb25kIG9ubHkgZm9yIE5WUkFNLiAgQ2FsbGVyIG11c3QKKyAqIG93biBydGNfbG9jayAuLi4gYW5kIHdlIHdvbid0IHdvcnJ5IGFib3V0IGFjY2VzcyBkdXJpbmcgTk1JLgorICovCisjZGVmaW5lIGNhbl9iYW5rMgl0cnVlCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBjbW9zX3JlYWRfYmFuazIodW5zaWduZWQgY2hhciBhZGRyKQoreworCW91dGIoYWRkciwgUlRDX1BPUlQoMikpOworCXJldHVybiBpbmIoUlRDX1BPUlQoMykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY21vc193cml0ZV9iYW5rMih1bnNpZ25lZCBjaGFyIHZhbCwgdW5zaWduZWQgY2hhciBhZGRyKQoreworCW91dGIoYWRkciwgUlRDX1BPUlQoMikpOworCW91dGIodmFsLCBSVENfUE9SVCgzKSk7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgY2FuX2JhbmsyCWZhbHNlCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBjbW9zX3JlYWRfYmFuazIodW5zaWduZWQgY2hhciBhZGRyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY21vc193cml0ZV9iYW5rMih1bnNpZ25lZCBjaGFyIHZhbCwgdW5zaWduZWQgY2hhciBhZGRyKQoreworfQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBjbW9zX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdCkKK3sKKwkvKiBSRVZJU0lUOiAgaWYgdGhlIGNsb2NrIGhhcyBhICJjZW50dXJ5IiByZWdpc3RlciwgdXNlCisJICogdGhhdCBpbnN0ZWFkIG9mIHRoZSBoZXVyaXN0aWMgaW4gZ2V0X3J0Y190aW1lKCkuCisJICogVGhhdCdsbCBtYWtlIFkzSyBjb21wYXRpbGl0eSAoeWVhciA+IDIwNzApIGVhc3khCisJICovCisJZ2V0X3J0Y190aW1lKHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtb3Nfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCit7CisJLyogUkVWSVNJVDogIHNldCB0aGUgImNlbnR1cnkiIHJlZ2lzdGVyIGlmIGF2YWlsYWJsZQorCSAqCisJICogTk9URTogdGhpcyBpZ25vcmVzIHRoZSBpc3N1ZSB3aGVyZWJ5IHVwZGF0aW5nIHRoZSBzZWNvbmRzCisJICogdGFrZXMgZWZmZWN0IGV4YWN0bHkgNTAwbXMgYWZ0ZXIgd2Ugd3JpdGUgdGhlIHJlZ2lzdGVyLgorCSAqIChBbHNvIHF1ZXVlaW5nIGFuZCBvdGhlciBkZWxheXMgYmVmb3JlIHdlIGdldCB0aGlzIGZhci4pCisJICovCisJcmV0dXJuIHNldF9ydGNfdGltZSh0KTsKK30KKworc3RhdGljIGludCBjbW9zX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3sKKwlzdHJ1Y3QgY21vc19ydGMJKmNtb3MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyCXJ0Y19jb250cm9sOworCisJaWYgKCFpc192YWxpZF9pcnEoY21vcy0+aXJxKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBCYXNpYyBhbGFybXMgb25seSBzdXBwb3J0IGhvdXIsIG1pbnV0ZSwgYW5kIHNlY29uZHMgZmllbGRzLgorCSAqIFNvbWUgYWxzbyBzdXBwb3J0IGRheSBhbmQgbW9udGgsIGZvciBhbGFybXMgdXAgdG8gYSB5ZWFyIGluCisJICogdGhlIGZ1dHVyZS4KKwkgKi8KKwl0LT50aW1lLnRtX21kYXkgPSAtMTsKKwl0LT50aW1lLnRtX21vbiA9IC0xOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCXQtPnRpbWUudG1fc2VjID0gQ01PU19SRUFEKFJUQ19TRUNPTkRTX0FMQVJNKTsKKwl0LT50aW1lLnRtX21pbiA9IENNT1NfUkVBRChSVENfTUlOVVRFU19BTEFSTSk7CisJdC0+dGltZS50bV9ob3VyID0gQ01PU19SRUFEKFJUQ19IT1VSU19BTEFSTSk7CisKKwlpZiAoY21vcy0+ZGF5X2Fscm0pIHsKKwkJLyogaWdub3JlIHVwcGVyIGJpdHMgb24gcmVhZGJhY2sgcGVyIEFDUEkgc3BlYyAqLworCQl0LT50aW1lLnRtX21kYXkgPSBDTU9TX1JFQUQoY21vcy0+ZGF5X2Fscm0pICYgMHgzZjsKKwkJaWYgKCF0LT50aW1lLnRtX21kYXkpCisJCQl0LT50aW1lLnRtX21kYXkgPSAtMTsKKworCQlpZiAoY21vcy0+bW9uX2Fscm0pIHsKKwkJCXQtPnRpbWUudG1fbW9uID0gQ01PU19SRUFEKGNtb3MtPm1vbl9hbHJtKTsKKwkJCWlmICghdC0+dGltZS50bV9tb24pCisJCQkJdC0+dGltZS50bV9tb24gPSAtMTsKKwkJfQorCX0KKworCXJ0Y19jb250cm9sID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmICghKHJ0Y19jb250cm9sICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpIHsKKwkJaWYgKCgodW5zaWduZWQpdC0+dGltZS50bV9zZWMpIDwgMHg2MCkKKwkJCXQtPnRpbWUudG1fc2VjID0gYmNkMmJpbih0LT50aW1lLnRtX3NlYyk7CisJCWVsc2UKKwkJCXQtPnRpbWUudG1fc2VjID0gLTE7CisJCWlmICgoKHVuc2lnbmVkKXQtPnRpbWUudG1fbWluKSA8IDB4NjApCisJCQl0LT50aW1lLnRtX21pbiA9IGJjZDJiaW4odC0+dGltZS50bV9taW4pOworCQllbHNlCisJCQl0LT50aW1lLnRtX21pbiA9IC0xOworCQlpZiAoKCh1bnNpZ25lZCl0LT50aW1lLnRtX2hvdXIpIDwgMHgyNCkKKwkJCXQtPnRpbWUudG1faG91ciA9IGJjZDJiaW4odC0+dGltZS50bV9ob3VyKTsKKwkJZWxzZQorCQkJdC0+dGltZS50bV9ob3VyID0gLTE7CisKKwkJaWYgKGNtb3MtPmRheV9hbHJtKSB7CisJCQlpZiAoKCh1bnNpZ25lZCl0LT50aW1lLnRtX21kYXkpIDw9IDB4MzEpCisJCQkJdC0+dGltZS50bV9tZGF5ID0gYmNkMmJpbih0LT50aW1lLnRtX21kYXkpOworCQkJZWxzZQorCQkJCXQtPnRpbWUudG1fbWRheSA9IC0xOworCisJCQlpZiAoY21vcy0+bW9uX2Fscm0pIHsKKwkJCQlpZiAoKCh1bnNpZ25lZCl0LT50aW1lLnRtX21vbikgPD0gMHgxMikKKwkJCQkJdC0+dGltZS50bV9tb24gPSBiY2QyYmluKHQtPnRpbWUudG1fbW9uKS0xOworCQkJCWVsc2UKKwkJCQkJdC0+dGltZS50bV9tb24gPSAtMTsKKwkJCX0KKwkJfQorCX0KKwl0LT50aW1lLnRtX3llYXIgPSAtMTsKKworCXQtPmVuYWJsZWQgPSAhIShydGNfY29udHJvbCAmIFJUQ19BSUUpOworCXQtPnBlbmRpbmcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNtb3NfY2hlY2tpbnRyKHN0cnVjdCBjbW9zX3J0YyAqY21vcywgdW5zaWduZWQgY2hhciBydGNfY29udHJvbCkKK3sKKwl1bnNpZ25lZCBjaGFyCXJ0Y19pbnRyOworCisJLyogTk9URSBhZnRlciBjaGFuZ2luZyBSVENfeElFIGJpdHMgd2UgYWx3YXlzIHJlYWQgSU5UUl9GTEFHUzsKKwkgKiBhbGxlZ2VkbHkgc29tZSBvbGRlciBydGNzIG5lZWQgdGhhdCB0byBoYW5kbGUgaXJxcyBwcm9wZXJseQorCSAqLworCXJ0Y19pbnRyID0gQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKKworCWlmIChpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCisJcnRjX2ludHIgJj0gKHJ0Y19jb250cm9sICYgUlRDX0lSUU1BU0spIHwgUlRDX0lSUUY7CisJaWYgKGlzX2ludHIocnRjX2ludHIpKQorCQlydGNfdXBkYXRlX2lycShjbW9zLT5ydGMsIDEsIHJ0Y19pbnRyKTsKK30KKworc3RhdGljIHZvaWQgY21vc19pcnFfZW5hYmxlKHN0cnVjdCBjbW9zX3J0YyAqY21vcywgdW5zaWduZWQgY2hhciBtYXNrKQoreworCXVuc2lnbmVkIGNoYXIJcnRjX2NvbnRyb2w7CisKKwkvKiBmbHVzaCBhbnkgcGVuZGluZyBJUlEgc3RhdHVzLCBub3RhYmx5IGZvciB1cGRhdGUgaXJxcywKKwkgKiBiZWZvcmUgd2UgZW5hYmxlIG5ldyBJUlFzCisJICovCisJcnRjX2NvbnRyb2wgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCWNtb3NfY2hlY2tpbnRyKGNtb3MsIHJ0Y19jb250cm9sKTsKKworCXJ0Y19jb250cm9sIHw9IG1hc2s7CisJQ01PU19XUklURShydGNfY29udHJvbCwgUlRDX0NPTlRST0wpOworCWhwZXRfc2V0X3J0Y19pcnFfYml0KG1hc2spOworCisJY21vc19jaGVja2ludHIoY21vcywgcnRjX2NvbnRyb2wpOworfQorCitzdGF0aWMgdm9pZCBjbW9zX2lycV9kaXNhYmxlKHN0cnVjdCBjbW9zX3J0YyAqY21vcywgdW5zaWduZWQgY2hhciBtYXNrKQoreworCXVuc2lnbmVkIGNoYXIJcnRjX2NvbnRyb2w7CisKKwlydGNfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJcnRjX2NvbnRyb2wgJj0gfm1hc2s7CisJQ01PU19XUklURShydGNfY29udHJvbCwgUlRDX0NPTlRST0wpOworCWhwZXRfbWFza19ydGNfaXJxX2JpdChtYXNrKTsKKworCWNtb3NfY2hlY2tpbnRyKGNtb3MsIHJ0Y19jb250cm9sKTsKK30KKworc3RhdGljIGludCBjbW9zX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQoreworCXN0cnVjdCBjbW9zX3J0YwkqY21vcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworICAgICAgIHVuc2lnbmVkIGNoYXIgICBtb24sIG1kYXksIGhycywgbWluLCBzZWMsIHJ0Y19jb250cm9sOworCisJaWYgKCFpc192YWxpZF9pcnEoY21vcy0+aXJxKSkKKwkJcmV0dXJuIC1FSU87CisKKwltb24gPSB0LT50aW1lLnRtX21vbiArIDE7CisJbWRheSA9IHQtPnRpbWUudG1fbWRheTsKKwlocnMgPSB0LT50aW1lLnRtX2hvdXI7CisJbWluID0gdC0+dGltZS50bV9taW47CisJc2VjID0gdC0+dGltZS50bV9zZWM7CisKKwlydGNfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJaWYgKCEocnRjX2NvbnRyb2wgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkgeworCQkvKiBXcml0aW5nIDB4ZmYgbWVhbnMgImRvbid0IGNhcmUiIG9yICJtYXRjaCBhbGwiLiAgKi8KKwkJbW9uID0gKG1vbiA8PSAxMikgPyBiaW4yYmNkKG1vbikgOiAweGZmOworCQltZGF5ID0gKG1kYXkgPj0gMSAmJiBtZGF5IDw9IDMxKSA/IGJpbjJiY2QobWRheSkgOiAweGZmOworCQlocnMgPSAoaHJzIDwgMjQpID8gYmluMmJjZChocnMpIDogMHhmZjsKKwkJbWluID0gKG1pbiA8IDYwKSA/IGJpbjJiY2QobWluKSA6IDB4ZmY7CisJCXNlYyA9IChzZWMgPCA2MCkgPyBiaW4yYmNkKHNlYykgOiAweGZmOworCX0KKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCS8qIG5leHQgcnRjIGlycSBtdXN0IG5vdCBiZSBmcm9tIHByZXZpb3VzIGFsYXJtIHNldHRpbmcgKi8KKwljbW9zX2lycV9kaXNhYmxlKGNtb3MsIFJUQ19BSUUpOworCisJLyogdXBkYXRlIGFsYXJtICovCisJQ01PU19XUklURShocnMsIFJUQ19IT1VSU19BTEFSTSk7CisJQ01PU19XUklURShtaW4sIFJUQ19NSU5VVEVTX0FMQVJNKTsKKwlDTU9TX1dSSVRFKHNlYywgUlRDX1NFQ09ORFNfQUxBUk0pOworCisJLyogdGhlIHN5c3RlbSBtYXkgc3VwcG9ydCBhbiAiZW5oYW5jZWQiIGFsYXJtICovCisJaWYgKGNtb3MtPmRheV9hbHJtKSB7CisJCUNNT1NfV1JJVEUobWRheSwgY21vcy0+ZGF5X2Fscm0pOworCQlpZiAoY21vcy0+bW9uX2Fscm0pCisJCQlDTU9TX1dSSVRFKG1vbiwgY21vcy0+bW9uX2Fscm0pOworCX0KKworCS8qIEZJWE1FIHRoZSBIUEVUIGFsYXJtIGdsdWUgY3VycmVudGx5IGlnbm9yZXMgZGF5X2Fscm0KKwkgKiBhbmQgbW9uX2Fscm0gLi4uCisJICovCisJaHBldF9zZXRfYWxhcm1fdGltZSh0LT50aW1lLnRtX2hvdXIsIHQtPnRpbWUudG1fbWluLCB0LT50aW1lLnRtX3NlYyk7CisKKwlpZiAodC0+ZW5hYmxlZCkKKwkJY21vc19pcnFfZW5hYmxlKGNtb3MsIFJUQ19BSUUpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERvIG5vdCBkaXNhYmxlIFJUQyBhbGFybSBvbiBzaHV0ZG93biAtIHdvcmthcm91bmQgZm9yIGIwcmtlZCBCSU9TZXMuCisgKi8KK3N0YXRpYyBib29sIGFsYXJtX2Rpc2FibGVfcXVpcms7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldF9hbGFybV9kaXNhYmxlX3F1aXJrKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlhbGFybV9kaXNhYmxlX3F1aXJrID0gdHJ1ZTsKKwlwcl9pbmZvKCJydGMtY21vczogQklPUyBoYXMgYWxhcm0tZGlzYWJsZSBxdWlyay4gIik7CisJcHJfaW5mbygiUlRDIGFsYXJtcyBkaXNhYmxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBydGNfcXVpcmtzW10gX19pbml0Y29uc3QgPSB7CisJLyogaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tL3Nob3dfYnVnLmNnaT9pZD04MDU3NDAgKi8KKwl7CisJCS5jYWxsYmFjayA9IHNldF9hbGFybV9kaXNhYmxlX3F1aXJrLAorCQkuaWRlbnQgICAgPSAiSUJNIFRydW1hbiIsCisJCS5tYXRjaGVzICA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiNDg1MjU3MCIpLAorCQl9LAorCX0sCisJLyogaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tL3Nob3dfYnVnLmNnaT9pZD04MTI1OTIgKi8KKwl7CisJCS5jYWxsYmFjayA9IHNldF9hbGFybV9kaXNhYmxlX3F1aXJrLAorCQkuaWRlbnQgICAgPSAiR2lnYWJ5dGUgR0EtOTkwWEEtVUQzIiwKKwkJLm1hdGNoZXMgID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLAorCQkJCQkiR2lnYWJ5dGUgVGVjaG5vbG9neSBDby4sIEx0ZC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiR0EtOTkwWEEtVUQzIiksCisJCX0sCisJfSwKKwkvKiBodHRwOi8vcGVybWFsaW5rLmdtYW5lLm9yZy9nbWFuZS5saW51eC5rZXJuZWwvMTYwNDQ3NCAqLworCXsKKwkJLmNhbGxiYWNrID0gc2V0X2FsYXJtX2Rpc2FibGVfcXVpcmssCisJCS5pZGVudCAgICA9ICJUb3NoaWJhIFNhdGVsbGl0ZSBMMzAwIiwKKwkJLm1hdGNoZXMgID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiVE9TSElCQSIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJTYXRlbGxpdGUgTDMwMCIpLAorCQl9LAorCX0sCisJe30KK307CisKK3N0YXRpYyBpbnQgY21vc19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IGNtb3NfcnRjCSpjbW9zID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmICghaXNfdmFsaWRfaXJxKGNtb3MtPmlycSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFsYXJtX2Rpc2FibGVfcXVpcmspCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisKKwlpZiAoZW5hYmxlZCkKKwkJY21vc19pcnFfZW5hYmxlKGNtb3MsIFJUQ19BSUUpOworCWVsc2UKKwkJY21vc19pcnFfZGlzYWJsZShjbW9zLCBSVENfQUlFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DX01PRFVMRSkKKworc3RhdGljIGludCBjbW9zX3Byb2NmcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBjbW9zX3J0YwkqY21vcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIJcnRjX2NvbnRyb2wsIHZhbGlkOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCXJ0Y19jb250cm9sID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwl2YWxpZCA9IENNT1NfUkVBRChSVENfVkFMSUQpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJLyogTk9URTogIGF0IGxlYXN0IElDSDYgcmVwb3J0cyBiYXR0ZXJ5IHN0YXR1cyB1c2luZyBhIGRpZmZlcmVudAorCSAqIChub24tUlRDKSBiaXQ7IGFuZCBTUVdFIGlzIGlnbm9yZWQgb24gbWFueSBjdXJyZW50IHN5c3RlbXMuCisJICovCisJcmV0dXJuIHNlcV9wcmludGYoc2VxLAorCQkJInBlcmlvZGljX0lSUVx0OiAlc1xuIgorCQkJInVwZGF0ZV9JUlFcdDogJXNcbiIKKwkJCSJIUEVUX2VtdWxhdGVkXHQ6ICVzXG4iCisJCQkvLyAic3F1YXJlX3dhdmVcdDogJXNcbiIKKwkJCSJCQ0RcdFx0OiAlc1xuIgorCQkJIkRTVF9lbmFibGVcdDogJXNcbiIKKwkJCSJwZXJpb2RpY19mcmVxXHQ6ICVkXG4iCisJCQkiYmF0dF9zdGF0dXNcdDogJXNcbiIsCisJCQkocnRjX2NvbnRyb2wgJiBSVENfUElFKSA/ICJ5ZXMiIDogIm5vIiwKKwkJCShydGNfY29udHJvbCAmIFJUQ19VSUUpID8gInllcyIgOiAibm8iLAorCQkJaXNfaHBldF9lbmFibGVkKCkgPyAieWVzIiA6ICJubyIsCisJCQkvLyAocnRjX2NvbnRyb2wgJiBSVENfU1FXRSkgPyAieWVzIiA6ICJubyIsCisJCQkocnRjX2NvbnRyb2wgJiBSVENfRE1fQklOQVJZKSA/ICJubyIgOiAieWVzIiwKKwkJCShydGNfY29udHJvbCAmIFJUQ19EU1RfRU4pID8gInllcyIgOiAibm8iLAorCQkJY21vcy0+cnRjLT5pcnFfZnJlcSwKKwkJCSh2YWxpZCAmIFJUQ19WUlQpID8gIm9rYXkiIDogImRlYWQiKTsKK30KKworI2Vsc2UKKyNkZWZpbmUJY21vc19wcm9jZnMJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBjbW9zX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQkJPSBjbW9zX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJCT0gY21vc19zZXRfdGltZSwKKwkucmVhZF9hbGFybQkJPSBjbW9zX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQkJPSBjbW9zX3NldF9hbGFybSwKKwkucHJvYwkJCT0gY21vc19wcm9jZnMsCisJLmFsYXJtX2lycV9lbmFibGUJPSBjbW9zX2FsYXJtX2lycV9lbmFibGUsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQWxsIHRoZXNlIGNoaXBzIGhhdmUgYXQgbGVhc3QgNjQgYnl0ZXMgb2YgYWRkcmVzcyBzcGFjZSwgc2hhcmVkIGJ5CisgKiBSVEMgcmVnaXN0ZXJzIGFuZCBOVlJBTS4gIE1vc3Qgb2YgdGhvc2UgYnl0ZXMgb2YgTlZSQU0gYXJlIHVzZWQKKyAqIGJ5IGJvb3QgZmlybXdhcmUuICBNb2Rlcm4gY2hpcHMgaGF2ZSAxMjggb3IgMjU2IGJ5dGVzLgorICovCisKKyNkZWZpbmUgTlZSQU1fT0ZGU0VUCShSVENfUkVHX0QgKyAxKQorCitzdGF0aWMgc3NpemVfdAorY21vc19udnJhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCWludAlyZXR2YWw7CisKKwlpZiAodW5saWtlbHkob2ZmID49IGF0dHItPnNpemUpKQorCQlyZXR1cm4gMDsKKwlpZiAodW5saWtlbHkob2ZmIDwgMCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgob2ZmICsgY291bnQpID4gYXR0ci0+c2l6ZSkKKwkJY291bnQgPSBhdHRyLT5zaXplIC0gb2ZmOworCisJb2ZmICs9IE5WUkFNX09GRlNFVDsKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJZm9yIChyZXR2YWwgPSAwOyBjb3VudDsgY291bnQtLSwgb2ZmKyssIHJldHZhbCsrKSB7CisJCWlmIChvZmYgPCAxMjgpCisJCQkqYnVmKysgPSBDTU9TX1JFQUQob2ZmKTsKKwkJZWxzZSBpZiAoY2FuX2JhbmsyKQorCQkJKmJ1ZisrID0gY21vc19yZWFkX2JhbmsyKG9mZik7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitjbW9zX252cmFtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBjbW9zX3J0YwkqY21vczsKKwlpbnQJCXJldHZhbDsKKworCWNtb3MgPSBkZXZfZ2V0X2RydmRhdGEoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKKwlpZiAodW5saWtlbHkob2ZmID49IGF0dHItPnNpemUpKQorCQlyZXR1cm4gLUVGQklHOworCWlmICh1bmxpa2VseShvZmYgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChvZmYgKyBjb3VudCkgPiBhdHRyLT5zaXplKQorCQljb3VudCA9IGF0dHItPnNpemUgLSBvZmY7CisKKwkvKiBOT1RFOiAgb24gYXQgbGVhc3QgUENzIGFuZCBBdGFyaXMsIHRoZSBib290IGZpcm13YXJlIHVzZXMgYQorCSAqIGNoZWNrc3VtIG9uIHBhcnQgb2YgdGhlIE5WUkFNIGRhdGEuICBUaGF0J3MgY3VycmVudGx5IGlnbm9yZWQKKwkgKiBoZXJlLiAgSWYgdXNlcnNwYWNlIGlzIHNtYXJ0IGVub3VnaCB0byBrbm93IHdoYXQgZmllbGRzIG9mCisJICogTlZSQU0gdG8gdXBkYXRlLCB1cGRhdGluZyBjaGVja3N1bXMgaXMgYWxzbyBwYXJ0IG9mIGl0cyBqb2IuCisJICovCisJb2ZmICs9IE5WUkFNX09GRlNFVDsKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJZm9yIChyZXR2YWwgPSAwOyBjb3VudDsgY291bnQtLSwgb2ZmKyssIHJldHZhbCsrKSB7CisJCS8qIGRvbid0IHRyYXNoIFJUQyByZWdpc3RlcnMgKi8KKwkJaWYgKG9mZiA9PSBjbW9zLT5kYXlfYWxybQorCQkJCXx8IG9mZiA9PSBjbW9zLT5tb25fYWxybQorCQkJCXx8IG9mZiA9PSBjbW9zLT5jZW50dXJ5KQorCQkJYnVmKys7CisJCWVsc2UgaWYgKG9mZiA8IDEyOCkKKwkJCUNNT1NfV1JJVEUoKmJ1ZisrLCBvZmYpOworCQllbHNlIGlmIChjYW5fYmFuazIpCisJCQljbW9zX3dyaXRlX2JhbmsyKCpidWYrKywgb2ZmKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIG52cmFtID0geworCS5hdHRyID0geworCQkubmFtZQk9ICJudnJhbSIsCisJCS5tb2RlCT0gU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKworCS5yZWFkCT0gY21vc19udnJhbV9yZWFkLAorCS53cml0ZQk9IGNtb3NfbnZyYW1fd3JpdGUsCisJLyogc2l6ZSBnZXRzIHNldCB1cCBsYXRlciAqLworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHN0cnVjdCBjbW9zX3J0YwljbW9zX3J0YzsKKworc3RhdGljIGlycXJldHVybl90IGNtb3NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnApCit7CisJdTgJCWlycXN0YXQ7CisJdTgJCXJ0Y19jb250cm9sOworCisJc3Bpbl9sb2NrKCZydGNfbG9jayk7CisKKwkvKiBXaGVuIHRoZSBIUEVUIGludGVycnVwdCBoYW5kbGVyIGNhbGxzIHVzLCB0aGUgaW50ZXJydXB0CisJICogc3RhdHVzIGlzIHBhc3NlZCBhcyBhcmcxIGluc3RlYWQgb2YgdGhlIGlycSBudW1iZXIuICBCdXQKKwkgKiBhbHdheXMgY2xlYXIgaXJxIHN0YXR1cywgZXZlbiB3aGVuIEhQRVQgaXMgaW4gdGhlIHdheS4KKwkgKgorCSAqIE5vdGUgdGhhdCBIUEVUIGFuZCBSVEMgYXJlIGFsbW9zdCBjZXJ0YWlubHkgb3V0IG9mIHBoYXNlLAorCSAqIGdpdmluZyBkaWZmZXJlbnQgSVJRIHN0YXR1cyAuLi4KKwkgKi8KKwlpcnFzdGF0ID0gQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKKwlydGNfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJaWYgKGlzX2hwZXRfZW5hYmxlZCgpKQorCQlpcnFzdGF0ID0gKHVuc2lnbmVkIGxvbmcpaXJxICYgMHhGMDsKKwlpcnFzdGF0ICY9IChydGNfY29udHJvbCAmIFJUQ19JUlFNQVNLKSB8IFJUQ19JUlFGOworCisJLyogQWxsIExpbnV4IFJUQyBhbGFybXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIG9uZXNob3QuCisJICogU2ltaWxhciBjb2RlIG1heSBiZSBuZWVkZWQgaW4gc3lzdGVtIHdha2V1cCBwYXRocywgaW4gY2FzZSB0aGUKKwkgKiBhbGFybSB3b2tlIHRoZSBzeXN0ZW0uCisJICovCisJaWYgKGlycXN0YXQgJiBSVENfQUlFKSB7CisJCXJ0Y19jb250cm9sICY9IH5SVENfQUlFOworCQlDTU9TX1dSSVRFKHJ0Y19jb250cm9sLCBSVENfQ09OVFJPTCk7CisJCWhwZXRfbWFza19ydGNfaXJxX2JpdChSVENfQUlFKTsKKworCQlDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpOworCX0KKwlzcGluX3VubG9jaygmcnRjX2xvY2spOworCisJaWYgKGlzX2ludHIoaXJxc3RhdCkpIHsKKwkJcnRjX3VwZGF0ZV9pcnEocCwgMSwgaXJxc3RhdCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UKKwkJcmV0dXJuIElSUV9OT05FOworfQorCisjaWZkZWYJQ09ORklHX1BOUAorI2RlZmluZQlJTklUU0VDVElPTgorCisjZWxzZQorI2RlZmluZQlJTklUU0VDVElPTglfX2luaXQKKyNlbmRpZgorCitzdGF0aWMgaW50IElOSVRTRUNUSU9OCitjbW9zX2RvX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICpwb3J0cywgaW50IHJ0Y19pcnEpCit7CisJc3RydWN0IGNtb3NfcnRjX2JvYXJkX2luZm8JKmluZm8gPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJaW50CQkJCXJldHZhbCA9IDA7CisJdW5zaWduZWQgY2hhcgkJCXJ0Y19jb250cm9sOworCXVuc2lnbmVkCQkJYWRkcmVzc19zcGFjZTsKKworCS8qIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSAuLi4gKi8KKwlpZiAoY21vc19ydGMuZGV2KQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFwb3J0cykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDbGFpbSBJL08gcG9ydHMgQVNBUCwgbWluaW1pemluZyBjb25mbGljdCB3aXRoIGxlZ2FjeSBkcml2ZXIuCisJICoKKwkgKiBSRVZJU0lUIG5vbi14ODYgc3lzdGVtcyBtYXkgaW5zdGVhZCB1c2UgbWVtb3J5IHNwYWNlIHJlc291cmNlcworCSAqIChuZWVkaW5nIGlvcmVtYXAgZXRjKSwgbm90IGkvbyBzcGFjZSByZXNvdXJjZXMgbGlrZSB0aGlzIC4uLgorCSAqLworCXBvcnRzID0gcmVxdWVzdF9yZWdpb24ocG9ydHMtPnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZShwb3J0cyksCisJCQlkcml2ZXJfbmFtZSk7CisJaWYgKCFwb3J0cykgeworCQlkZXZfZGJnKGRldiwgImkvbyByZWdpc3RlcnMgYWxyZWFkeSBpbiB1c2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNtb3NfcnRjLmlycSA9IHJ0Y19pcnE7CisJY21vc19ydGMuaW9tZW0gPSBwb3J0czsKKworCS8qIEhldXJpc3RpYyB0byBkZWR1Y2UgTlZSQU0gc2l6ZSAuLi4gZG8gd2hhdCB0aGUgbGVnYWN5IE5WUkFNCisJICogZHJpdmVyIGRpZCwgYnV0IGRvbid0IHJlamVjdCB1bmtub3duIGNvbmZpZ3MuICAgT2xkIGhhcmR3YXJlCisJICogd29uJ3QgYWRkcmVzcyAxMjggYnl0ZXMuICBOZXdlciBjaGlwcyBoYXZlIG11bHRpcGxlIGJhbmtzLAorCSAqIHRob3VnaCB0aGV5IG1heSBub3QgYmUgbGlzdGVkIGluIG9uZSBJL08gcmVzb3VyY2UuCisJICovCisjaWYJZGVmaW5lZChDT05GSUdfQVRBUkkpCisJYWRkcmVzc19zcGFjZSA9IDY0OworI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fYXJtX18pIFwKKwkJCXx8IGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSBcCisJCQl8fCBkZWZpbmVkKF9fcG93ZXJwY19fKQorCWFkZHJlc3Nfc3BhY2UgPSAxMjg7CisjZWxzZQorI3dhcm5pbmcgQXNzdW1pbmcgMTI4IGJ5dGVzIG9mIFJUQytOVlJBTSBhZGRyZXNzIHNwYWNlLCBub3QgNjQgYnl0ZXMuCisJYWRkcmVzc19zcGFjZSA9IDEyODsKKyNlbmRpZgorCWlmIChjYW5fYmFuazIgJiYgcG9ydHMtPmVuZCA+IChwb3J0cy0+c3RhcnQgKyAxKSkKKwkJYWRkcmVzc19zcGFjZSA9IDI1NjsKKworCS8qIEZvciBBQ1BJIHN5c3RlbXMgZXh0ZW5zaW9uIGluZm8gY29tZXMgZnJvbSB0aGUgRkFEVC4gIE9uIG90aGVycywKKwkgKiBib2FyZCBzcGVjaWZpYyBzZXR1cCBwcm92aWRlcyBpdCBhcyBhcHByb3ByaWF0ZS4gIFN5c3RlbXMgd2hlcmUKKwkgKiB0aGUgYWxhcm0gSVJRIGlzbid0IGF1dG9tYXRpY2FsbHkgYSB3YWtldXAgSVJRIChsaWtlIEFDUEksIGFuZAorCSAqIHNvbWUgYWxtb3N0LWNsb25lcykgY2FuIHByb3ZpZGUgaG9va3MgdG8gbWFrZSB0aGF0IGJlaGF2ZS4KKwkgKgorCSAqIE5vdGUgdGhhdCBBQ1BJIGRvZXNuJ3QgcHJlY2x1ZGUgcHV0dGluZyB0aGVzZSByZWdpc3RlcnMgaW50bworCSAqICJleHRlbmRlZCIgYXJlYXMgb2YgdGhlIGNoaXAsIGluY2x1ZGluZyBzb21lIHRoYXQgd2Ugd29uJ3QgeWV0CisJICogZXhwZWN0IENNT1NfUkVBRCBhbmQgZnJpZW5kcyB0byBoYW5kbGUuCisJICovCisJaWYgKGluZm8pIHsKKwkJaWYgKGluZm8tPnJ0Y19kYXlfYWxhcm0gJiYgaW5mby0+cnRjX2RheV9hbGFybSA8IDEyOCkKKwkJCWNtb3NfcnRjLmRheV9hbHJtID0gaW5mby0+cnRjX2RheV9hbGFybTsKKwkJaWYgKGluZm8tPnJ0Y19tb25fYWxhcm0gJiYgaW5mby0+cnRjX21vbl9hbGFybSA8IDEyOCkKKwkJCWNtb3NfcnRjLm1vbl9hbHJtID0gaW5mby0+cnRjX21vbl9hbGFybTsKKwkJaWYgKGluZm8tPnJ0Y19jZW50dXJ5ICYmIGluZm8tPnJ0Y19jZW50dXJ5IDwgMTI4KQorCQkJY21vc19ydGMuY2VudHVyeSA9IGluZm8tPnJ0Y19jZW50dXJ5OworCisJCWlmIChpbmZvLT53YWtlX29uICYmIGluZm8tPndha2Vfb2ZmKSB7CisJCQljbW9zX3J0Yy53YWtlX29uID0gaW5mby0+d2FrZV9vbjsKKwkJCWNtb3NfcnRjLndha2Vfb2ZmID0gaW5mby0+d2FrZV9vZmY7CisJCX0KKwl9CisKKwljbW9zX3J0Yy5kZXYgPSBkZXY7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgJmNtb3NfcnRjKTsKKworCWNtb3NfcnRjLnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoZHJpdmVyX25hbWUsIGRldiwKKwkJCQkmY21vc19ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihjbW9zX3J0Yy5ydGMpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoY21vc19ydGMucnRjKTsKKwkJZ290byBjbGVhbnVwMDsKKwl9CisKKwlyZW5hbWVfcmVnaW9uKHBvcnRzLCBkZXZfbmFtZSgmY21vc19ydGMucnRjLT5kZXYpKTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCS8qIGZvcmNlIHBlcmlvZGljIGlycSB0byBDTU9TIHJlc2V0IGRlZmF1bHQgb2YgMTAyNEh6OworCSAqCisJICogUkVWSVNJVCBpdCdzIGJlZW4gcmVwb3J0ZWQgdGhhdCBhdCBsZWFzdCBvbmUgeDg2XzY0IEFMSSBtb2JvCisJICogZG9lc24ndCB1c2UgMzJLSHogaGVyZSAuLi4gZm9yIHBvcnRhYmlsaXR5IHdlIG1pZ2h0IG5lZWQgdG8KKwkgKiBkbyBzb21ldGhpbmcgYWJvdXQgb3RoZXIgY2xvY2sgZnJlcXVlbmNpZXMuCisJICovCisJY21vc19ydGMucnRjLT5pcnFfZnJlcSA9IDEwMjQ7CisJaHBldF9zZXRfcGVyaW9kaWNfZnJlcShjbW9zX3J0Yy5ydGMtPmlycV9mcmVxKTsKKwlDTU9TX1dSSVRFKFJUQ19SRUZfQ0xDS18zMktIWiB8IDB4MDYsIFJUQ19GUkVRX1NFTEVDVCk7CisKKwkvKiBkaXNhYmxlIGlycXMgKi8KKwljbW9zX2lycV9kaXNhYmxlKCZjbW9zX3J0YywgUlRDX1BJRSB8IFJUQ19BSUUgfCBSVENfVUlFKTsKKworCXJ0Y19jb250cm9sID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJLyogRklYTUU6CisJICogPGFzbS1nZW5lcmljL3J0Yy5oPiBkb2Vzbid0IGtub3cgMTItaG91ciBtb2RlIGVpdGhlci4KKwkgKi8KKyAgICAgICBpZiAoaXNfdmFsaWRfaXJxKHJ0Y19pcnEpICYmICEocnRjX2NvbnRyb2wgJiBSVENfMjRIKSkgeworCQlkZXZfd2FybihkZXYsICJvbmx5IDI0LWhyIHN1cHBvcnRlZFxuIik7CisJCXJldHZhbCA9IC1FTlhJTzsKKwkJZ290byBjbGVhbnVwMTsKKwl9CisKKwlpZiAoaXNfdmFsaWRfaXJxKHJ0Y19pcnEpKSB7CisJCWlycV9oYW5kbGVyX3QgcnRjX2Ntb3NfaW50X2hhbmRsZXI7CisKKwkJaWYgKGlzX2hwZXRfZW5hYmxlZCgpKSB7CisJCQlpbnQgZXJyOworCisJCQlydGNfY21vc19pbnRfaGFuZGxlciA9IGhwZXRfcnRjX2ludGVycnVwdDsKKwkJCWVyciA9IGhwZXRfcmVnaXN0ZXJfaXJxX2hhbmRsZXIoY21vc19pbnRlcnJ1cHQpOworCQkJaWYgKGVyciAhPSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHBldF9yZWdpc3Rlcl9pcnFfaGFuZGxlciAiCisJCQkJCQkiIGZhaWxlZCBpbiBydGNfaW5pdCgpLiIpOworCQkJCWdvdG8gY2xlYW51cDE7CisJCQl9CisJCX0gZWxzZQorCQkJcnRjX2Ntb3NfaW50X2hhbmRsZXIgPSBjbW9zX2ludGVycnVwdDsKKworCQlyZXR2YWwgPSByZXF1ZXN0X2lycShydGNfaXJxLCBydGNfY21vc19pbnRfaGFuZGxlciwKKwkJCQkwLCBkZXZfbmFtZSgmY21vc19ydGMucnRjLT5kZXYpLAorCQkJCWNtb3NfcnRjLnJ0Yyk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlkZXZfZGJnKGRldiwgIklSUSAlZCBpcyBhbHJlYWR5IGluIHVzZVxuIiwgcnRjX2lycSk7CisJCQlnb3RvIGNsZWFudXAxOworCQl9CisJfQorCWhwZXRfcnRjX3RpbWVyX2luaXQoKTsKKworCS8qIGV4cG9ydCBhdCBsZWFzdCB0aGUgZmlyc3QgYmxvY2sgb2YgTlZSQU0gKi8KKwludnJhbS5zaXplID0gYWRkcmVzc19zcGFjZSAtIE5WUkFNX09GRlNFVDsKKwlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmRldi0+a29iaiwgJm52cmFtKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkZXZfZGJnKGRldiwgImNhbid0IGNyZWF0ZSBudnJhbSBmaWxlPyAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byBjbGVhbnVwMjsKKwl9CisKKwlwcl9pbmZvKCIlczogJXMlcywgJXpkIGJ5dGVzIG52cmFtJXNcbiIsCisJCWRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldiksCisJCSFpc192YWxpZF9pcnEocnRjX2lycSkgPyAibm8gYWxhcm1zIiA6CisJCQljbW9zX3J0Yy5tb25fYWxybSA/ICJhbGFybXMgdXAgdG8gb25lIHllYXIiIDoKKwkJCWNtb3NfcnRjLmRheV9hbHJtID8gImFsYXJtcyB1cCB0byBvbmUgbW9udGgiIDoKKwkJCSJhbGFybXMgdXAgdG8gb25lIGRheSIsCisJCWNtb3NfcnRjLmNlbnR1cnkgPyAiLCB5M2siIDogIiIsCisJCW52cmFtLnNpemUsCisJCWlzX2hwZXRfZW5hYmxlZCgpID8gIiwgaHBldCBpcnFzIiA6ICIiKTsKKworCXJldHVybiAwOworCitjbGVhbnVwMjoKKwlpZiAoaXNfdmFsaWRfaXJxKHJ0Y19pcnEpKQorCQlmcmVlX2lycShydGNfaXJxLCBjbW9zX3J0Yy5ydGMpOworY2xlYW51cDE6CisJY21vc19ydGMuZGV2ID0gTlVMTDsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoY21vc19ydGMucnRjKTsKK2NsZWFudXAwOgorCXJlbGVhc2VfcmVnaW9uKHBvcnRzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShwb3J0cykpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGNtb3NfZG9fc2h1dGRvd24odm9pZCkKK3sKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJY21vc19pcnFfZGlzYWJsZSgmY21vc19ydGMsIFJUQ19JUlFNQVNLKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNtb3NfZG9fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY21vc19ydGMJKmNtb3MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCisJY21vc19kb19zaHV0ZG93bigpOworCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXYtPmtvYmosICZudnJhbSk7CisKKwlpZiAoaXNfdmFsaWRfaXJxKGNtb3MtPmlycSkpIHsKKwkJZnJlZV9pcnEoY21vcy0+aXJxLCBjbW9zLT5ydGMpOworCQlocGV0X3VucmVnaXN0ZXJfaXJxX2hhbmRsZXIoY21vc19pbnRlcnJ1cHQpOworCX0KKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihjbW9zLT5ydGMpOworCWNtb3MtPnJ0YyA9IE5VTEw7CisKKwlwb3J0cyA9IGNtb3MtPmlvbWVtOworCXJlbGVhc2VfcmVnaW9uKHBvcnRzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShwb3J0cykpOworCWNtb3MtPmlvbWVtID0gTlVMTDsKKworCWNtb3MtPmRldiA9IE5VTEw7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZglDT05GSUdfUE0KKworc3RhdGljIGludCBjbW9zX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBjbW9zX3J0YwkqY21vcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIJdG1wOworCisJLyogb25seSB0aGUgYWxhcm0gbWlnaHQgYmUgYSB3YWtldXAgZXZlbnQgc291cmNlICovCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWNtb3MtPnN1c3BlbmRfY3RybCA9IHRtcCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJaWYgKHRtcCAmIChSVENfUElFfFJUQ19BSUV8UlRDX1VJRSkpIHsKKwkJdW5zaWduZWQgY2hhcgltYXNrOworCisJCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQkJbWFzayA9IFJUQ19JUlFNQVNLICYgflJUQ19BSUU7CisJCWVsc2UKKwkJCW1hc2sgPSBSVENfSVJRTUFTSzsKKwkJdG1wICY9IH5tYXNrOworCQlDTU9TX1dSSVRFKHRtcCwgUlRDX0NPTlRST0wpOworCQlocGV0X21hc2tfcnRjX2lycV9iaXQobWFzayk7CisKKwkJY21vc19jaGVja2ludHIoY21vcywgdG1wKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAodG1wICYgUlRDX0FJRSkgeworCQljbW9zLT5lbmFibGVkX3dha2UgPSAxOworCQlpZiAoY21vcy0+d2FrZV9vbikKKwkJCWNtb3MtPndha2Vfb24oZGV2KTsKKwkJZWxzZQorCQkJZW5hYmxlX2lycV93YWtlKGNtb3MtPmlycSk7CisJfQorCisJcHJfZGVidWcoIiVzOiBzdXNwZW5kJXMsIGN0cmwgJTAyeFxuIiwKKwkJCWRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldiksCisJCQkodG1wICYgUlRDX0FJRSkgPyAiLCBhbGFybSBtYXkgd2FrZSIgOiAiIiwKKwkJCXRtcCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogV2Ugd2FudCBSVEMgYWxhcm1zIHRvIHdha2UgdXMgZnJvbSBlLmcuIEFDUEkgRzIvUzUgInNvZnQgb2ZmIiwgZXZlbgorICogYWZ0ZXIgYSBkZXRvdXIgdGhyb3VnaCBHMyAibWVjaGFuaWNhbCBvZmYiLCBhbHRob3VnaCB0aGUgQUNQSSBzcGVjCisgKiBzYXlzIHdha2V1cCBzaG91bGQgb25seSB3b3JrIGZyb20gRzEvUzQgImhpYmVybmF0ZSIuICBUbyBtb3N0IHVzZXJzLAorICogZGlzdGluY3Rpb25zIGJldHdlZW4gUzQgYW5kIFM1IGFyZSBwb2ludGxlc3MuICBTbyB3aGVuIHRoZSBoYXJkd2FyZQorICogYWxsb3dzLCBkb24ndCBkcmF3IHRoYXQgZGlzdGluY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNtb3NfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjbW9zX3N1c3BlbmQoZGV2KTsKK30KKworc3RhdGljIGludCBjbW9zX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNtb3NfcnRjCSpjbW9zID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgY2hhcgl0bXAgPSBjbW9zLT5zdXNwZW5kX2N0cmw7CisKKwkvKiByZS1lbmFibGUgYW55IGlycXMgcHJldmlvdXNseSBhY3RpdmUgKi8KKwlpZiAodG1wICYgUlRDX0lSUU1BU0spIHsKKwkJdW5zaWduZWQgY2hhcgltYXNrOworCisJCWlmIChjbW9zLT5lbmFibGVkX3dha2UpIHsKKwkJCWlmIChjbW9zLT53YWtlX29mZikKKwkJCQljbW9zLT53YWtlX29mZihkZXYpOworCQkJZWxzZQorCQkJCWRpc2FibGVfaXJxX3dha2UoY21vcy0+aXJxKTsKKwkJCWNtb3MtPmVuYWJsZWRfd2FrZSA9IDA7CisJCX0KKworCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJCWRvIHsKKwkJCUNNT1NfV1JJVEUodG1wLCBSVENfQ09OVFJPTCk7CisJCQlocGV0X3NldF9ydGNfaXJxX2JpdCh0bXAgJiBSVENfSVJRTUFTSyk7CisKKwkJCW1hc2sgPSBDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpOworCQkJbWFzayAmPSAodG1wICYgUlRDX0lSUU1BU0spIHwgUlRDX0lSUUY7CisJCQlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpIHx8ICFpc19pbnRyKG1hc2spKQorCQkJCWJyZWFrOworCisJCQkvKiBmb3JjZSBvbmUtc2hvdCBiZWhhdmlvciBpZiBIUEVUIGJsb2NrZWQKKwkJCSAqIHRoZSB3YWtlIGFsYXJtJ3MgaXJxCisJCQkgKi8KKwkJCXJ0Y191cGRhdGVfaXJxKGNtb3MtPnJ0YywgMSwgbWFzayk7CisJCQl0bXAgJj0gflJUQ19BSUU7CisJCQlocGV0X21hc2tfcnRjX2lycV9iaXQoUlRDX0FJRSk7CisJCQlocGV0X3J0Y190aW1lcl9pbml0KCk7CisJCX0gd2hpbGUgKG1hc2sgJiBSVENfQUlFKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJfQorCisJcHJfZGVidWcoIiVzOiByZXN1bWUsIGN0cmwgJTAyeFxuIiwKKwkJCWRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldiksCisJCQl0bXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhjbW9zX3BtX29wcywgY21vc19zdXNwZW5kLCBjbW9zX3Jlc3VtZSk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGNtb3NfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAtRU5PU1lTOworfQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogT24gbm9uLXg4NiBzeXN0ZW1zLCBhICJDTU9TIiBSVEMgbGl2ZXMgbW9zdCBuYXR1cmFsbHkgb24gcGxhdGZvcm1fYnVzLgorICogQUNQSSBzeXN0ZW1zIGFsd2F5cyBsaXN0IHRoZXNlIGFzIFBOUEFDUEkgZGV2aWNlcywgYW5kIHByZS1BQ1BJIFBDcworICogcHJvYmFibHkgbGlzdCB0aGVtIGluIHNpbWlsYXIgUE5QQklPUyB0YWJsZXM7IHNvIFBOUCBpcyBtb3JlIGNvbW1vbi4KKyAqCisgKiBXZSBkb24ndCB1c2UgbGVnYWN5ICJwb2tlIGF0IHRoZSBoYXJkd2FyZSIgcHJvYmluZy4gIEFuY2llbnQgUENzIHRoYXQKKyAqIHByZWRhdGUgZXZlbiBQTlBCSU9TIHNob3VsZCBzZXQgdXAgcGxhdGZvcm1fYnVzIGRldmljZXMuCisgKi8KKworI2lmZGVmCUNPTkZJR19BQ1BJCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisKK3N0YXRpYyB1MzIgcnRjX2hhbmRsZXIodm9pZCAqY29udGV4dCkKK3sKKwlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUlRDKTsKKwlhY3BpX2Rpc2FibGVfZXZlbnQoQUNQSV9FVkVOVF9SVEMsIDApOworCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRjX3dha2Vfc2V0dXAodm9pZCkKK3sKKwlhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX1JUQywgcnRjX2hhbmRsZXIsIE5VTEwpOworCS8qCisJICogQWZ0ZXIgdGhlIFJUQyBoYW5kbGVyIGlzIGluc3RhbGxlZCwgdGhlIEZpeGVkX1JUQyBldmVudCBzaG91bGQKKwkgKiBiZSBkaXNhYmxlZC4gT25seSB3aGVuIHRoZSBSVEMgYWxhcm0gaXMgc2V0IHdpbGwgaXQgYmUgZW5hYmxlZC4KKwkgKi8KKwlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUlRDKTsKKwlhY3BpX2Rpc2FibGVfZXZlbnQoQUNQSV9FVkVOVF9SVEMsIDApOworfQorCitzdGF0aWMgdm9pZCBydGNfd2FrZV9vbihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYWNwaV9jbGVhcl9ldmVudChBQ1BJX0VWRU5UX1JUQyk7CisJYWNwaV9lbmFibGVfZXZlbnQoQUNQSV9FVkVOVF9SVEMsIDApOworfQorCitzdGF0aWMgdm9pZCBydGNfd2FrZV9vZmYoc3RydWN0IGRldmljZSAqZGV2KQoreworCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Cit9CisKKy8qIEV2ZXJ5IEFDUEkgcGxhdGZvcm0gaGFzIGEgbWMxNDY4MTggY29tcGF0aWJsZSAiY21vcyBydGMiLiAgSGVyZSB3ZSBmaW5kCisgKiBpdHMgZGV2aWNlIG5vZGUgYW5kIHBhc3MgZXh0cmEgY29uZmlnIGRhdGEuICBUaGlzIGhlbHBzIGl0cyBkcml2ZXIgdXNlCisgKiBjYXBhYmlsaXRpZXMgdGhhdCB0aGUgbm93LW9ic29sZXRlIG1jMTQ2ODE4IGRpZG4ndCBoYXZlLCBhbmQgaW5mb3JtcyBpdAorICogdGhhdCB0aGlzIGJvYXJkJ3MgUlRDIGlzIHdha2V1cC1jYXBhYmxlIChwZXIgQUNQSSBzcGVjKS4KKyAqLworc3RhdGljIHN0cnVjdCBjbW9zX3J0Y19ib2FyZF9pbmZvIGFjcGlfcnRjX2luZm87CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorY21vc193YWtlX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuOworCisJcnRjX3dha2Vfc2V0dXAoKTsKKwlhY3BpX3J0Y19pbmZvLndha2Vfb24gPSBydGNfd2FrZV9vbjsKKwlhY3BpX3J0Y19pbmZvLndha2Vfb2ZmID0gcnRjX3dha2Vfb2ZmOworCisJLyogd29ya2Fyb3VuZCBidWcgaW4gc29tZSBBQ1BJIHRhYmxlcyAqLworCWlmIChhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtICYmICFhY3BpX2dibF9GQURULmRheV9hbGFybSkgeworCQlkZXZfZGJnKGRldiwgImJvZ3VzIEZBRFQgbW9udGhfYWxhcm0gKCVkKVxuIiwKKwkJCWFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm0pOworCQlhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtID0gMDsKKwl9CisKKwlhY3BpX3J0Y19pbmZvLnJ0Y19kYXlfYWxhcm0gPSBhY3BpX2dibF9GQURULmRheV9hbGFybTsKKwlhY3BpX3J0Y19pbmZvLnJ0Y19tb25fYWxhcm0gPSBhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtOworCWFjcGlfcnRjX2luZm8ucnRjX2NlbnR1cnkgPSBhY3BpX2dibF9GQURULmNlbnR1cnk7CisKKwkvKiBOT1RFOiAgUzRfUlRDX1dBS0UgaXMgTk9UIGN1cnJlbnRseSB1c2VmdWwgdG8gTGludXggKi8KKwlpZiAoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9TNF9SVENfV0FLRSkKKwkJZGV2X2luZm8oZGV2LCAiUlRDIGNhbiB3YWtlIGZyb20gUzRcbiIpOworCisJZGV2LT5wbGF0Zm9ybV9kYXRhID0gJmFjcGlfcnRjX2luZm87CisKKwkvKiBSVEMgYWx3YXlzIHdha2VzIGZyb20gUzEvUzIvUzMsIGFuZCBvZnRlbiBTNC9TVEQgKi8KKwlkZXZpY2VfaW5pdF93YWtldXAoZGV2LCAxKTsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgX19kZXZpbml0CitjbW9zX3dha2Vfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQoreworfQorCisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19QTlAKKworI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorY21vc19wbnBfcHJvYmUoc3RydWN0IHBucF9kZXYgKnBucCwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkKQoreworCWNtb3Nfd2FrZV9zZXR1cCgmcG5wLT5kZXYpOworCisJaWYgKHBucF9wb3J0X3N0YXJ0KHBucCwwKSA9PSAweDcwICYmICFwbnBfaXJxX3ZhbGlkKHBucCwwKSkKKwkJLyogU29tZSBtYWNoaW5lcyBjb250YWluIGEgUE5QIGVudHJ5IGZvciB0aGUgUlRDLCBidXQKKwkJICogZG9uJ3QgZGVmaW5lIHRoZSBJUlEuIEl0IHNob3VsZCBhbHdheXMgYmUgc2FmZSB0bworCQkgKiBoYXJkY29kZSBpdCBpbiB0aGVzZSBjYXNlcworCQkgKi8KKwkJcmV0dXJuIGNtb3NfZG9fcHJvYmUoJnBucC0+ZGV2LAorCQkJCXBucF9nZXRfcmVzb3VyY2UocG5wLCBJT1JFU09VUkNFX0lPLCAwKSwgOCk7CisJZWxzZQorCQlyZXR1cm4gY21vc19kb19wcm9iZSgmcG5wLT5kZXYsCisJCQkJcG5wX2dldF9yZXNvdXJjZShwbnAsIElPUkVTT1VSQ0VfSU8sIDApLAorCQkJCXBucF9pcnEocG5wLCAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbW9zX3BucF9yZW1vdmUoc3RydWN0IHBucF9kZXYgKnBucCkKK3sKKwljbW9zX2RvX3JlbW92ZSgmcG5wLT5kZXYpOworfQorCisjaWZkZWYJQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgY21vc19wbnBfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqcG5wLCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gY21vc19zdXNwZW5kKCZwbnAtPmRldik7Cit9CisKK3N0YXRpYyBpbnQgY21vc19wbnBfcmVzdW1lKHN0cnVjdCBwbnBfZGV2ICpwbnApCit7CisJcmV0dXJuIGNtb3NfcmVzdW1lKCZwbnAtPmRldik7Cit9CisKKyNlbHNlCisjZGVmaW5lCWNtb3NfcG5wX3N1c3BlbmQJTlVMTAorI2RlZmluZQljbW9zX3BucF9yZXN1bWUJCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjbW9zX3BucF9zaHV0ZG93bihzdHJ1Y3QgcG5wX2RldiAqcG5wKQoreworCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1BPV0VSX09GRiAmJiAhY21vc19wb3dlcm9mZigmcG5wLT5kZXYpKQorCQlyZXR1cm47CisKKwljbW9zX2RvX3NodXRkb3duKCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBydGNfaWRzW10gPSB7CisJeyAuaWQgPSAiUE5QMGIwMCIsIH0sCisJeyAuaWQgPSAiUE5QMGIwMSIsIH0sCisJeyAuaWQgPSAiUE5QMGIwMiIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCBydGNfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIGNtb3NfcG5wX2RyaXZlciA9IHsKKwkubmFtZQkJPSAoY2hhciAqKSBkcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUJPSBydGNfaWRzLAorCS5wcm9iZQkJPSBjbW9zX3BucF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGNtb3NfcG5wX3JlbW92ZSksCisJLnNodXRkb3duCT0gY21vc19wbnBfc2h1dGRvd24sCisKKwkvKiBmbGFnIGVuc3VyZXMgcmVzdW1lKCkgZ2V0cyBjYWxsZWQsIGFuZCBzdG9wcyBzeXNsb2cgc3BhbSAqLworCS5mbGFncwkJPSBQTlBfRFJJVkVSX1JFU19ET19OT1RfQ0hBTkdFLAorCS5zdXNwZW5kCT0gY21vc19wbnBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGNtb3NfcG5wX3Jlc3VtZSwKK307CisKKyNlbmRpZgkvKiBDT05GSUdfUE5QICovCisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2Ntb3NfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gIm1vdG9yb2xhLG1jMTQ2ODE4IiwKKwl9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9jbW9zX21hdGNoKTsKKworc3RhdGljIF9faW5pdCB2b2lkIGNtb3Nfb2ZfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBydGNfdGltZSB0aW1lOworCWludCByZXQ7CisJY29uc3QgX19iZTMyICp2YWw7CisKKwlpZiAoIW5vZGUpCisJCXJldHVybjsKKworCXZhbCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiY3RybC1yZWciLCBOVUxMKTsKKwlpZiAodmFsKQorCQlDTU9TX1dSSVRFKGJlMzJfdG9fY3B1cCh2YWwpLCBSVENfQ09OVFJPTCk7CisKKwl2YWwgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImZyZXEtcmVnIiwgTlVMTCk7CisJaWYgKHZhbCkKKwkJQ01PU19XUklURShiZTMyX3RvX2NwdXAodmFsKSwgUlRDX0ZSRVFfU0VMRUNUKTsKKworCWdldF9ydGNfdGltZSgmdGltZSk7CisJcmV0ID0gcnRjX3ZhbGlkX3RtKCZ0aW1lKTsKKwlpZiAocmV0KSB7CisJCXN0cnVjdCBydGNfdGltZSBkZWZfdGltZSA9IHsKKwkJCS50bV95ZWFyID0gMSwKKwkJCS50bV9tZGF5ID0gMSwKKwkJfTsKKwkJc2V0X3J0Y190aW1lKCZkZWZfdGltZSk7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbW9zX29mX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikge30KKyNkZWZpbmUgb2ZfY21vc19tYXRjaCBOVUxMCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFBsYXRmb3JtIHNldHVwIHNob3VsZCBoYXZlIHNldCB1cCBhbiBSVEMgZGV2aWNlLCB3aGVuIFBOUCBpcworICogdW5hdmFpbGFibGUgLi4uIHRoaXMgY291bGQgaGFwcGVuIGV2ZW4gb24gKG9sZGVyKSBQQ3MuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgY21vc19wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNtb3Nfb2ZfaW5pdChwZGV2KTsKKwljbW9zX3dha2Vfc2V0dXAoJnBkZXYtPmRldik7CisJcmV0dXJuIGNtb3NfZG9fcHJvYmUoJnBkZXYtPmRldiwKKwkJCXBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKSwKKwkJCXBsYXRmb3JtX2dldF9pcnEocGRldiwgMCkpOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBjbW9zX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNtb3NfZG9fcmVtb3ZlKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbW9zX3BsYXRmb3JtX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUE9XRVJfT0ZGICYmICFjbW9zX3Bvd2Vyb2ZmKCZwZGV2LT5kZXYpKQorCQlyZXR1cm47CisKKwljbW9zX2RvX3NodXRkb3duKCk7Cit9CisKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGNfY21vcyIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbW9zX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGNtb3NfcGxhdGZvcm1fcmVtb3ZlKSwKKwkuc2h1dGRvd24JPSBjbW9zX3BsYXRmb3JtX3NodXRkb3duLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9IChjaGFyICopIGRyaXZlcl9uYW1lLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JCT0gJmNtb3NfcG1fb3BzLAorI2VuZGlmCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX2Ntb3NfbWF0Y2gsCisJfQorfTsKKworI2lmZGVmIENPTkZJR19QTlAKK3N0YXRpYyBib29sIHBucF9kcml2ZXJfcmVnaXN0ZXJlZDsKKyNlbmRpZgorc3RhdGljIGJvb2wgcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyZWQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGNtb3NfaW5pdCh2b2lkKQoreworCWludCByZXR2YWwgPSAwOworCisjaWZkZWYJQ09ORklHX1BOUAorCXJldHZhbCA9IHBucF9yZWdpc3Rlcl9kcml2ZXIoJmNtb3NfcG5wX2RyaXZlcik7CisJaWYgKHJldHZhbCA9PSAwKQorCQlwbnBfZHJpdmVyX3JlZ2lzdGVyZWQgPSB0cnVlOworI2VuZGlmCisKKwlpZiAoIWNtb3NfcnRjLmRldikgeworCQlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmNtb3NfcGxhdGZvcm1fZHJpdmVyLAorCQkJCQkgICAgICAgY21vc19wbGF0Zm9ybV9wcm9iZSk7CisJCWlmIChyZXR2YWwgPT0gMCkKKwkJCXBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcmVkID0gdHJ1ZTsKKwl9CisKKwlkbWlfY2hlY2tfc3lzdGVtKHJ0Y19xdWlya3MpOworCisJaWYgKHJldHZhbCA9PSAwKQorCQlyZXR1cm4gMDsKKworI2lmZGVmCUNPTkZJR19QTlAKKwlpZiAocG5wX2RyaXZlcl9yZWdpc3RlcmVkKQorCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJmNtb3NfcG5wX2RyaXZlcik7CisjZW5kaWYKKwlyZXR1cm4gcmV0dmFsOworfQorbW9kdWxlX2luaXQoY21vc19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGNtb3NfZXhpdCh2b2lkKQoreworI2lmZGVmCUNPTkZJR19QTlAKKwlpZiAocG5wX2RyaXZlcl9yZWdpc3RlcmVkKQorCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJmNtb3NfcG5wX2RyaXZlcik7CisjZW5kaWYKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyZWQpCisJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjbW9zX3BsYXRmb3JtX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChjbW9zX2V4aXQpOworCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEJyb3duZWxsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgUEMtc3R5bGUgJ0NNT1MnIFJUQ3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1jb2g5MDEzMzEuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1jb2g5MDEzMzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWI4YTBjCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWNvaDkwMTMzMS5jCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU1QtRXJpY3Nzb24gQUIKKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICogUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgU1QtRXJpY3Nzb24gQUIgQ09IIDkwMSAzMzEgUlRDLgorICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgorICogQmFzZWQgb24gcnRjLXBsMDMxLmMgYnkgRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqIENvcHlyaWdodCAyMDA2IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyoKKyAqIFJlZ2lzdGVycyBpbiB0aGUgQ09IIDkwMSAzMzEKKyAqLworLyogQWxhcm0gdmFsdWUgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgQ09IOTAxMzMxX0FMQVJNCQkweDAwVQorLyogVXNlZCB0byBzZXQgY3VycmVudCB0aW1lIDMyYml0IChSL1cpICovCisjZGVmaW5lIENPSDkwMTMzMV9TRVRfVElNRQkweDA0VQorLyogSW5kaWNhdGlvbiBpZiBjdXJyZW50IHRpbWUgaXMgdmFsaWQgMzJiaXQgKFIvLSkgKi8KKyNkZWZpbmUgQ09IOTAxMzMxX1ZBTElECQkweDA4VQorLyogUmVhZCB0aGUgY3VycmVudCB0aW1lIDMyYml0IChSLy0pICovCisjZGVmaW5lIENPSDkwMTMzMV9DVVJfVElNRQkweDBjVQorLyogRXZlbnQgcmVnaXN0ZXIgZm9yIHRoZSAiYWxhcm0iIGludGVycnVwdCAqLworI2RlZmluZSBDT0g5MDEzMzFfSVJRX0VWRU5UCTB4MTBVCisvKiBNYXNrIHJlZ2lzdGVyIGZvciB0aGUgImFsYXJtIiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQ09IOTAxMzMxX0lSUV9NQVNLCTB4MTRVCisvKiBGb3JjZSByZWdpc3RlciBmb3IgdGhlICJhbGFybSIgaW50ZXJydXB0ICovCisjZGVmaW5lIENPSDkwMTMzMV9JUlFfRk9SQ0UJMHgxOFUKKworLyoKKyAqIFJlZmVyZW5jZSB0byBSVEMgYmxvY2sgY2xvY2sKKyAqIE5vdGljZSB0aGF0IHRoZSBmcmVxdWVudCBjbGtfZW5hYmxlKCkvY2xrX2Rpc2FibGUoKSBvbiB0aGlzCisgKiBjbG9jayBpcyBtYWlubHkgdG8gYmUgYWJsZSB0byB0dXJuIG9uL29mZiBvdGhlciBjbG9ja3MgaW4gdGhlCisgKiBoaWVyYXJjaHkgYXMgbmVlZGVkLCB0aGUgUlRDIGNsb2NrIGlzIGFsd2F5cyBvbiBhbnl3YXkuCisgKi8KK3N0cnVjdCBjb2g5MDEzMzFfcG9ydCB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdTMyIHBoeWJhc2U7CisJdTMyIHBoeXNpemU7CisJdm9pZCBfX2lvbWVtICp2aXJ0YmFzZTsKKwlpbnQgaXJxOworI2lmZGVmIENPTkZJR19QTQorCXUzMiBpcnFtYXNrc3RvcmU7CisjZW5kaWYKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjb2g5MDEzMzFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNvaDkwMTMzMV9wb3J0ICpydGFwID0gZGF0YTsKKworCWNsa19lbmFibGUocnRhcC0+Y2xrKTsKKwkvKiBBY2sgSVJRICovCisJd3JpdGVsKDEsIHJ0YXAtPnZpcnRiYXNlICsgQ09IOTAxMzMxX0lSUV9FVkVOVCk7CisJLyoKKwkgKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKKwkgKiB0aGUgUlRDIGxpdmVzIG9uIGEgbG93ZXItY2xvY2tlZCBsaW5lIGFuZCB3aWxsCisJICogbm90IHJlbGVhc2UgdGhlIElSUSBsaW5lIHVudGlsIGFmdGVyIGEgZmV3IChzbG93ZXIpCisJICogY2xvY2sgY3ljbGVzLiBUaGUgaW50ZXJydXB0IHdpbGwgYmUgcmUtZW5hYmxlZCB3aGVuCisJICogYSBuZXcgYWxhcm0gaXMgc2V0IGFueXdheS4KKwkgKi8KKwl3cml0ZWwoMCwgcnRhcC0+dmlydGJhc2UgKyBDT0g5MDEzMzFfSVJRX01BU0spOworCWNsa19kaXNhYmxlKHJ0YXAtPmNsayk7CisKKwkvKiBTZXQgYWxhcm0gZmxhZyAqLworCXJ0Y191cGRhdGVfaXJxKHJ0YXAtPnJ0YywgMSwgUlRDX0FGKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBjb2g5MDEzMzFfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgY29oOTAxMzMxX3BvcnQgKnJ0YXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsa19lbmFibGUocnRhcC0+Y2xrKTsKKwkvKiBDaGVjayBpZiB0aGUgdGltZSBpcyB2YWxpZCAqLworCWlmIChyZWFkbChydGFwLT52aXJ0YmFzZSArIENPSDkwMTMzMV9WQUxJRCkpIHsKKwkJcnRjX3RpbWVfdG9fdG0ocmVhZGwocnRhcC0+dmlydGJhc2UgKyBDT0g5MDEzMzFfQ1VSX1RJTUUpLCB0bSk7CisJCWNsa19kaXNhYmxlKHJ0YXAtPmNsayk7CisJCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworCX0KKwljbGtfZGlzYWJsZShydGFwLT5jbGspOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGNvaDkwMTMzMV9zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwlzdHJ1Y3QgY29oOTAxMzMxX3BvcnQgKnJ0YXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsa19lbmFibGUocnRhcC0+Y2xrKTsKKwl3cml0ZWwoc2VjcywgcnRhcC0+dmlydGJhc2UgKyBDT0g5MDEzMzFfU0VUX1RJTUUpOworCWNsa19kaXNhYmxlKHJ0YXAtPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2g5MDEzMzFfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlzdHJ1Y3QgY29oOTAxMzMxX3BvcnQgKnJ0YXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsa19lbmFibGUocnRhcC0+Y2xrKTsKKwlydGNfdGltZV90b190bShyZWFkbChydGFwLT52aXJ0YmFzZSArIENPSDkwMTMzMV9BTEFSTSksICZhbGFybS0+dGltZSk7CisJYWxhcm0tPnBlbmRpbmcgPSByZWFkbChydGFwLT52aXJ0YmFzZSArIENPSDkwMTMzMV9JUlFfRVZFTlQpICYgMVU7CisJYWxhcm0tPmVuYWJsZWQgPSByZWFkbChydGFwLT52aXJ0YmFzZSArIENPSDkwMTMzMV9JUlFfTUFTSykgJiAxVTsKKwljbGtfZGlzYWJsZShydGFwLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29oOTAxMzMxX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlzdHJ1Y3QgY29oOTAxMzMxX3BvcnQgKnJ0YXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisKKwlydGNfdG1fdG9fdGltZSgmYWxhcm0tPnRpbWUsICZ0aW1lKTsKKwljbGtfZW5hYmxlKHJ0YXAtPmNsayk7CisJd3JpdGVsKHRpbWUsIHJ0YXAtPnZpcnRiYXNlICsgQ09IOTAxMzMxX0FMQVJNKTsKKwl3cml0ZWwoYWxhcm0tPmVuYWJsZWQsIHJ0YXAtPnZpcnRiYXNlICsgQ09IOTAxMzMxX0lSUV9NQVNLKTsKKwljbGtfZGlzYWJsZShydGFwLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29oOTAxMzMxX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgY29oOTAxMzMxX3BvcnQgKnJ0YXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsa19lbmFibGUocnRhcC0+Y2xrKTsKKwlpZiAoZW5hYmxlZCkKKwkJd3JpdGVsKDEsIHJ0YXAtPnZpcnRiYXNlICsgQ09IOTAxMzMxX0lSUV9NQVNLKTsKKwllbHNlCisJCXdyaXRlbCgwLCBydGFwLT52aXJ0YmFzZSArIENPSDkwMTMzMV9JUlFfTUFTSyk7CisJY2xrX2Rpc2FibGUocnRhcC0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgY29oOTAxMzMxX29wcyA9IHsKKwkucmVhZF90aW1lID0gY29oOTAxMzMxX3JlYWRfdGltZSwKKwkuc2V0X21tc3MgPSBjb2g5MDEzMzFfc2V0X21tc3MsCisJLnJlYWRfYWxhcm0gPSBjb2g5MDEzMzFfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gY29oOTAxMzMxX3NldF9hbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZSA9IGNvaDkwMTMzMV9hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGludCBfX2V4aXQgY29oOTAxMzMxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjb2g5MDEzMzFfcG9ydCAqcnRhcCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKworCWlmIChydGFwKSB7CisJCWZyZWVfaXJxKHJ0YXAtPmlycSwgcnRhcCk7CisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGFwLT5ydGMpOworCQljbGtfcHV0KHJ0YXAtPmNsayk7CisJCWlvdW5tYXAocnRhcC0+dmlydGJhc2UpOworCQlyZWxlYXNlX21lbV9yZWdpb24ocnRhcC0+cGh5YmFzZSwgcnRhcC0+cGh5c2l6ZSk7CisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCQlrZnJlZShydGFwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBjb2g5MDEzMzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjb2g5MDEzMzFfcG9ydCAqcnRhcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJ0YXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29oOTAxMzMxX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ0YXApCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dF9ub19yZXNvdXJjZTsKKwl9CisJcnRhcC0+cGh5YmFzZSA9IHJlcy0+c3RhcnQ7CisJcnRhcC0+cGh5c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24ocnRhcC0+cGh5YmFzZSwgcnRhcC0+cGh5c2l6ZSwKKwkJCSAgICAgICAicnRjLWNvaDkwMTMzMSIpID09IE5VTEwpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF9ub19tZW1yZWdpb247CisJfQorCisJcnRhcC0+dmlydGJhc2UgPSBpb3JlbWFwKHJ0YXAtPnBoeWJhc2UsIHJ0YXAtPnBoeXNpemUpOworCWlmICghcnRhcC0+dmlydGJhc2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fcmVtYXA7CisJfQorCisJcnRhcC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocmVxdWVzdF9pcnEocnRhcC0+aXJxLCBjb2g5MDEzMzFfaW50ZXJydXB0LCAwLAorCQkJIlJUQyBDT0ggOTAxIDMzMSBBbGFybSIsIHJ0YXApKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X25vX2lycTsKKwl9CisKKwlydGFwLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIocnRhcC0+Y2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0YXAtPmNsayk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgY2xvY2tcbiIpOworCQlnb3RvIG91dF9ub19jbGs7CisJfQorCisJLyogV2UgZW5hYmxlL2Rpc2FibGUgdGhlIGNsb2NrIG9ubHkgdG8gYXNzdXJlIGl0IHdvcmtzICovCisJcmV0ID0gY2xrX2VuYWJsZShydGFwLT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGVuYWJsZSBjbG9ja1xuIik7CisJCWdvdG8gb3V0X25vX2Nsa19lbmFibGU7CisJfQorCWNsa19kaXNhYmxlKHJ0YXAtPmNsayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGFwKTsKKwlydGFwLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJjb2g5MDEzMzEiLCAmcGRldi0+ZGV2LCAmY29oOTAxMzMxX29wcywKKwkJCQkJIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YXAtPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGFwLT5ydGMpOworCQlnb3RvIG91dF9ub19ydGM7CisJfQorCisJcmV0dXJuIDA7CisKKyBvdXRfbm9fcnRjOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworIG91dF9ub19jbGtfZW5hYmxlOgorCWNsa19wdXQocnRhcC0+Y2xrKTsKKyBvdXRfbm9fY2xrOgorCWZyZWVfaXJxKHJ0YXAtPmlycSwgcnRhcCk7Cisgb3V0X25vX2lycToKKwlpb3VubWFwKHJ0YXAtPnZpcnRiYXNlKTsKKyBvdXRfbm9fcmVtYXA6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cisgb3V0X25vX21lbXJlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocnRhcC0+cGh5YmFzZSwgU1pfNEspOworIG91dF9ub19yZXNvdXJjZToKKwlrZnJlZShydGFwKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGNvaDkwMTMzMV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgY29oOTAxMzMxX3BvcnQgKnJ0YXAgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisKKwkvKgorCSAqIElmIHRoaXMgUlRDIGFsYXJtIHdpbGwgYmUgdXNlZCBmb3Igd2FraW5nIHRoZSBzeXN0ZW0gdXAsCisJICogZG9uJ3QgZGlzYWJsZSBpdCBvZiBjb3Vyc2UuIEVsc2Ugd2UganVzdCBkaXNhYmxlIHRoZSBhbGFybQorCSAqIGFuZCBhd2FpdCBzdXNwZW5zaW9uLgorCSAqLworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkgeworCQllbmFibGVfaXJxX3dha2UocnRhcC0+aXJxKTsKKwl9IGVsc2UgeworCQljbGtfZW5hYmxlKHJ0YXAtPmNsayk7CisJCXJ0YXAtPmlycW1hc2tzdG9yZSA9IHJlYWRsKHJ0YXAtPnZpcnRiYXNlICsgQ09IOTAxMzMxX0lSUV9NQVNLKTsKKwkJd3JpdGVsKDAsIHJ0YXAtPnZpcnRiYXNlICsgQ09IOTAxMzMxX0lSUV9NQVNLKTsKKwkJY2xrX2Rpc2FibGUocnRhcC0+Y2xrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29oOTAxMzMxX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjb2g5MDEzMzFfcG9ydCAqcnRhcCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkgeworCQlkaXNhYmxlX2lycV93YWtlKHJ0YXAtPmlycSk7CisJfSBlbHNlIHsKKwkJY2xrX2VuYWJsZShydGFwLT5jbGspOworCQl3cml0ZWwocnRhcC0+aXJxbWFza3N0b3JlLCBydGFwLT52aXJ0YmFzZSArIENPSDkwMTMzMV9JUlFfTUFTSyk7CisJCWNsa19kaXNhYmxlKHJ0YXAtPmNsayk7CisJfQorCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgY29oOTAxMzMxX3N1c3BlbmQgTlVMTAorI2RlZmluZSBjb2g5MDEzMzFfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb2g5MDEzMzFfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY29oOTAxMzMxX3BvcnQgKnJ0YXAgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisKKwljbGtfZW5hYmxlKHJ0YXAtPmNsayk7CisJd3JpdGVsKDAsIHJ0YXAtPnZpcnRiYXNlICsgQ09IOTAxMzMxX0lSUV9NQVNLKTsKKwljbGtfZGlzYWJsZShydGFwLT5jbGspOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjb2g5MDEzMzFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInJ0Yy1jb2g5MDEzMzEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUgPSBfX2V4aXRfcChjb2g5MDEzMzFfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGNvaDkwMTMzMV9zdXNwZW5kLAorCS5yZXN1bWUgPSBjb2g5MDEzMzFfcmVzdW1lLAorCS5zaHV0ZG93biA9IGNvaDkwMTMzMV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNvaDkwMTMzMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmY29oOTAxMzMxX2RyaXZlciwgY29oOTAxMzMxX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvaDkwMTMzMV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNvaDkwMTMzMV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjb2g5MDEzMzFfaW5pdCk7Cittb2R1bGVfZXhpdChjb2g5MDEzMzFfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNULUVyaWNzc29uIEFCIENPSCA5MDEgMzMxIFJUQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1jb3JlLmggYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOWRmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtY29yZS5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWCisKK2V4dGVybiB2b2lkIF9faW5pdCBydGNfZGV2X2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBfX2V4aXQgcnRjX2Rldl9leGl0KHZvaWQpOworZXh0ZXJuIHZvaWQgcnRjX2Rldl9wcmVwYXJlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpOworZXh0ZXJuIHZvaWQgcnRjX2Rldl9hZGRfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpOworZXh0ZXJuIHZvaWQgcnRjX2Rldl9kZWxfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRjX2Rldl9pbml0KHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGNfZGV2X2V4aXQodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0Y19kZXZfcHJlcGFyZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRjX2Rldl9hZGRfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGNfZGV2X2RlbF9kZXZpY2Uoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKK3sKK30KKworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfUFJPQworCitleHRlcm4gdm9pZCBydGNfcHJvY19hZGRfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpOworZXh0ZXJuIHZvaWQgcnRjX3Byb2NfZGVsX2RldmljZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIHJ0Y19wcm9jX2FkZF9kZXZpY2Uoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0Y19wcm9jX2RlbF9kZXZpY2Uoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKK3sKK30KKworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfU1lTRlMKKworZXh0ZXJuIHZvaWQgX19pbml0IHJ0Y19zeXNmc19pbml0KHN0cnVjdCBjbGFzcyAqKTsKK2V4dGVybiB2b2lkIHJ0Y19zeXNmc19hZGRfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpOworZXh0ZXJuIHZvaWQgcnRjX3N5c2ZzX2RlbF9kZXZpY2Uoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yyk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGNfc3lzZnNfaW5pdChzdHJ1Y3QgY2xhc3MgKnJ0YykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0Y19zeXNmc19hZGRfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGNfc3lzZnNfZGVsX2RldmljZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kYTkwNTIuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kYTkwNTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTZhYjUyCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRhOTA1Mi5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogUmVhbCB0aW1lIGNsb2NrIGRyaXZlciBmb3IgREE5MDUyCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTIgRGlhbG9nIFNlbWljb25kdWN0b3IgTHRkLgorICoKKyAqIEF1dGhvcjogRGFqdW4gRGFqdW4gQ2hlbiA8ZGFqdW4uY2hlbkBkaWFzZW1pLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MDUyL2RhOTA1Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNTIvcmVnLmg+CisKKyNkZWZpbmUgcnRjX2VycihkYTkwNTIsIGZtdCwgLi4uKSBcCisJCWRldl9lcnIoZGE5MDUyLT5kZXYsICIlczogIiBmbXQsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQorCitzdHJ1Y3QgZGE5MDUyX3J0YyB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgZGE5MDUyICpkYTkwNTI7CisJaW50IGlycTsKK307CisKK3N0YXRpYyBpbnQgZGE5MDUyX3J0Y19lbmFibGVfYWxhcm0oc3RydWN0IGRhOTA1MiAqZGE5MDUyLCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCWlmIChlbmFibGUpIHsKKwkJcmV0ID0gZGE5MDUyX3JlZ191cGRhdGUoZGE5MDUyLCBEQTkwNTJfQUxBUk1fWV9SRUcsCisJCQkJCURBOTA1Ml9BTEFSTV9ZX0FMQVJNX09OLAorCQkJCQlEQTkwNTJfQUxBUk1fWV9BTEFSTV9PTik7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJ0Y19lcnIoZGE5MDUyLCAiRmFpbGVkIHRvIGVuYWJsZSBBTE06ICVkXG4iLCByZXQpOworCX0gZWxzZSB7CisJCXJldCA9IGRhOTA1Ml9yZWdfdXBkYXRlKGRhOTA1MiwgREE5MDUyX0FMQVJNX1lfUkVHLAorCQkJCQlEQTkwNTJfQUxBUk1fWV9BTEFSTV9PTiwgMCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJ0Y19lcnIoZGE5MDUyLCAiV3JpdGUgZXJyb3I6ICVkXG4iLCByZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZGE5MDUyX3J0Y19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGE5MDUyX3J0YyAqcnRjID0gZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gZGE5MDUyX3JlZ19yZWFkKHJ0Yy0+ZGE5MDUyLCBEQTkwNTJfQUxBUk1fTUlfUkVHKTsKKwlpZiAocmV0IDwgMCkgeworCQlydGNfZXJyKHJ0Yy0+ZGE5MDUyLCAiUmVhZCBlcnJvcjogJWRcbiIsIHJldCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAocmV0ICYgREE5MDUyX0FMQVJNTUlfQUxBUk1UWVBFKSB7CisJCWRhOTA1Ml9ydGNfZW5hYmxlX2FsYXJtKHJ0Yy0+ZGE5MDUyLCAwKTsKKwkJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX0FGKTsKKwl9IGVsc2UKKwkJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX1BGKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBkYTkwNTJfcmVhZF9hbGFybShzdHJ1Y3QgZGE5MDUyICpkYTkwNTIsIHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCWludCByZXQ7CisJdWludDhfdCB2WzVdOworCisJcmV0ID0gZGE5MDUyX2dyb3VwX3JlYWQoZGE5MDUyLCBEQTkwNTJfQUxBUk1fTUlfUkVHLCA1LCB2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcnRjX2VycihkYTkwNTIsICJGYWlsZWQgdG8gZ3JvdXAgcmVhZCBBTE06ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJ0Y190bS0+dG1feWVhciA9ICh2WzRdICYgREE5MDUyX1JUQ19ZRUFSKSArIDEwMDsKKwlydGNfdG0tPnRtX21vbiAgPSAodlszXSAmIERBOTA1Ml9SVENfTU9OVEgpIC0gMTsKKwlydGNfdG0tPnRtX21kYXkgPSB2WzJdICYgREE5MDUyX1JUQ19EQVk7CisJcnRjX3RtLT50bV9ob3VyID0gdlsxXSAmIERBOTA1Ml9SVENfSE9VUjsKKwlydGNfdG0tPnRtX21pbiAgPSB2WzBdICYgREE5MDUyX1JUQ19NSU47CisKKwlyZXQgPSBydGNfdmFsaWRfdG0ocnRjX3RtKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkYTkwNTJfc2V0X2FsYXJtKHN0cnVjdCBkYTkwNTIgKmRhOTA1Miwgc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJaW50IHJldDsKKwl1aW50OF90IHZbM107CisKKwlydGNfdG0tPnRtX3llYXIgLT0gMTAwOworCXJ0Y190bS0+dG1fbW9uICs9IDE7CisKKwlyZXQgPSBkYTkwNTJfcmVnX3VwZGF0ZShkYTkwNTIsIERBOTA1Ml9BTEFSTV9NSV9SRUcsCisJCQkJREE5MDUyX1JUQ19NSU4sIHJ0Y190bS0+dG1fbWluKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcnRjX2VycihkYTkwNTIsICJGYWlsZWQgdG8gd3JpdGUgQUxSTSBNSU46ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZbMF0gPSBydGNfdG0tPnRtX2hvdXI7CisJdlsxXSA9IHJ0Y190bS0+dG1fbWRheTsKKwl2WzJdID0gcnRjX3RtLT50bV9tb247CisKKwlyZXQgPSBkYTkwNTJfZ3JvdXBfd3JpdGUoZGE5MDUyLCBEQTkwNTJfQUxBUk1fSF9SRUcsIDMsIHYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZGE5MDUyX3JlZ191cGRhdGUoZGE5MDUyLCBEQTkwNTJfQUxBUk1fWV9SRUcsCisJCQkJREE5MDUyX1JUQ19ZRUFSLCBydGNfdG0tPnRtX3llYXIpOworCWlmIChyZXQgIT0gMCkKKwkJcnRjX2VycihkYTkwNTIsICJGYWlsZWQgdG8gd3JpdGUgQUxSTSBZRUFSOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDUyX3J0Y19nZXRfYWxhcm1fc3RhdHVzKHN0cnVjdCBkYTkwNTIgKmRhOTA1MikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZGE5MDUyX3JlZ19yZWFkKGRhOTA1MiwgREE5MDUyX0FMQVJNX1lfUkVHKTsKKwlpZiAocmV0IDwgMCkgeworCQlydGNfZXJyKGRhOTA1MiwgIkZhaWxlZCB0byByZWFkIEFMTTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCAmPSBEQTkwNTJfQUxBUk1fWV9BTEFSTV9PTjsKKwlyZXR1cm4gKHJldCA+IDApID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDUyX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwlzdHJ1Y3QgZGE5MDUyX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdWludDhfdCB2WzZdOworCWludCByZXQ7CisKKwlyZXQgPSBkYTkwNTJfZ3JvdXBfcmVhZChydGMtPmRhOTA1MiwgREE5MDUyX0NPVU5UX1NfUkVHLCA2LCB2KTsKKwlpZiAocmV0IDwgMCkgeworCQlydGNfZXJyKHJ0Yy0+ZGE5MDUyLCAiRmFpbGVkIHRvIHJlYWQgUlRDIHRpbWUgOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlydGNfdG0tPnRtX3llYXIgPSAodls1XSAmIERBOTA1Ml9SVENfWUVBUikgKyAxMDA7CisJcnRjX3RtLT50bV9tb24gID0gKHZbNF0gJiBEQTkwNTJfUlRDX01PTlRIKSAtIDE7CisJcnRjX3RtLT50bV9tZGF5ID0gdlszXSAmIERBOTA1Ml9SVENfREFZOworCXJ0Y190bS0+dG1faG91ciA9IHZbMl0gJiBEQTkwNTJfUlRDX0hPVVI7CisJcnRjX3RtLT50bV9taW4gID0gdlsxXSAmIERBOTA1Ml9SVENfTUlOOworCXJ0Y190bS0+dG1fc2VjICA9IHZbMF0gJiBEQTkwNTJfUlRDX1NFQzsKKworCXJldCA9IHJ0Y192YWxpZF90bShydGNfdG0pOworCWlmIChyZXQgIT0gMCkgeworCQlydGNfZXJyKHJ0Yy0+ZGE5MDUyLCAicnRjX3ZhbGlkX3RtIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDUyX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IGRhOTA1Ml9ydGMgKnJ0YzsKKwl1aW50OF90IHZbNl07CisKKwlydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXZbMF0gPSB0bS0+dG1fc2VjOworCXZbMV0gPSB0bS0+dG1fbWluOworCXZbMl0gPSB0bS0+dG1faG91cjsKKwl2WzNdID0gdG0tPnRtX21kYXk7CisJdls0XSA9IHRtLT50bV9tb24gKyAxOworCXZbNV0gPSB0bS0+dG1feWVhciAtIDEwMDsKKworCXJldHVybiBkYTkwNTJfZ3JvdXBfd3JpdGUocnRjLT5kYTkwNTIsIERBOTA1Ml9DT1VOVF9TX1JFRywgNiwgdik7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDUyX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJc3RydWN0IGRhOTA1Ml9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0ID0gZGE5MDUyX3JlYWRfYWxhcm0ocnRjLT5kYTkwNTIsIHRtKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhbHJtLT5lbmFibGVkID0gZGE5MDUyX3J0Y19nZXRfYWxhcm1fc3RhdHVzKHJ0Yy0+ZGE5MDUyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhOTA1Ml9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJc3RydWN0IGRhOTA1Ml9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0ID0gZGE5MDUyX3J0Y19lbmFibGVfYWxhcm0ocnRjLT5kYTkwNTIsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZGE5MDUyX3NldF9hbGFybShydGMtPmRhOTA1MiwgdG0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkYTkwNTJfcnRjX2VuYWJsZV9hbGFybShydGMtPmRhOTA1MiwgMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRhOTA1Ml9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBkYTkwNTJfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBkYTkwNTJfcnRjX2VuYWJsZV9hbGFybShydGMtPmRhOTA1MiwgZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkYTkwNTJfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gZGE5MDUyX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gZGE5MDUyX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IGRhOTA1Ml9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gZGE5MDUyX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBkYTkwNTJfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYTkwNTJfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRhOTA1Ml9ydGMgKnJ0YzsKKwlpbnQgcmV0OworCisJcnRjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZGE5MDUyX3J0YyksIEdGUF9LRVJORUwpOworCWlmICghcnRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJ0Yy0+ZGE5MDUyID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisJcnRjLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiQUxNIik7CisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocnRjLT5pcnEsIE5VTEwsIGRhOTA1Ml9ydGNfaXJxLAorCQkJCSAgIElSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsCisJCQkJICAgIkFMTSIsIHJ0Yyk7CisJaWYgKHJldCAhPSAwKSB7CisJCXJ0Y19lcnIocnRjLT5kYTkwNTIsICJpcnEgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwlydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkgICAgICAgJmRhOTA1Ml9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMtPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMtPnJ0Yyk7CisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCX0KKworCXJldHVybiAwOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEocnRjLT5pcnEsIHJ0Yyk7CitlcnJfbWVtOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgcnRjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkYTkwNTJfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYTkwNTJfcnRjICpydGMgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Yyk7CisJZnJlZV9pcnEocnRjLT5pcnEsIHJ0Yyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhOTA1Ml9ydGNfZHJpdmVyID0geworCS5wcm9iZQk9IGRhOTA1Ml9ydGNfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGRhOTA1Ml9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJkYTkwNTItcnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZGE5MDUyX3J0Y19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBEYWp1biBDaGVuIDxkY2hlbkBkaWFzZW1pLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUlRDIGRyaXZlciBmb3IgRGlhbG9nIERBOTA1MiBQTUlDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmRhOTA1Mi1ydGMiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kYXZpbmNpLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZGF2aW5jaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YzIxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZGF2aW5jaS5jCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogRGFWaW5jaSBQb3dlciBNYW5hZ2VtZW50IGFuZCBSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIGZvciBUSSBwbGF0Zm9ybXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYworICoKKyAqIEF1dGhvcjogTWlndWVsIEFndWlsYXIgPG1pZ3VlbC5hZ3VpbGFyQHJpZGdlcnVuLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKgorICogVGhlIERhVmluY2kgUlRDIGlzIGEgc2ltcGxlIFJUQyB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIFNlYzogMCAtIDU5IDogQkNEIGNvdW50CisgKiBNaW46IDAgLSA1OSA6IEJDRCBjb3VudAorICogSG91cjogMCAtIDIzIDogQkNEIGNvdW50CisgKiBEYXk6IDAgLSAweDdGRkYoMzI3NjcpIDogQmluYXJ5IGNvdW50ICggT3ZlciA4OSB5ZWFycyApCisgKi8KKworLyogUFJUQyBpbnRlcmZhY2UgcmVnaXN0ZXJzICovCisjZGVmaW5lIERBVklOQ0lfUFJUQ0lGX1BJRAkJMHgwMAorI2RlZmluZSBQUlRDSUZfQ1RMUgkJCTB4MDQKKyNkZWZpbmUgUFJUQ0lGX0xEQVRBCQkJMHgwOAorI2RlZmluZSBQUlRDSUZfVURBVEEJCQkweDBDCisjZGVmaW5lIFBSVENJRl9JTlRFTgkJCTB4MTAKKyNkZWZpbmUgUFJUQ0lGX0lOVEZMRwkJCTB4MTQKKworLyogUFJUQ0lGX0NUTFIgYml0IGZpZWxkcyAqLworI2RlZmluZSBQUlRDSUZfQ1RMUl9CVVNZCQlCSVQoMzEpCisjZGVmaW5lIFBSVENJRl9DVExSX1NJWkUJCUJJVCgyNSkKKyNkZWZpbmUgUFJUQ0lGX0NUTFJfRElSCQkJQklUKDI0KQorI2RlZmluZSBQUlRDSUZfQ1RMUl9CRU5VX01TQgkJQklUKDIzKQorI2RlZmluZSBQUlRDSUZfQ1RMUl9CRU5VXzNSRF9CWVRFCUJJVCgyMikKKyNkZWZpbmUgUFJUQ0lGX0NUTFJfQkVOVV8yTkRfQllURQlCSVQoMjEpCisjZGVmaW5lIFBSVENJRl9DVExSX0JFTlVfTFNCCQlCSVQoMjApCisjZGVmaW5lIFBSVENJRl9DVExSX0JFTlVfTUFTSwkJKDB4MDBGMDAwMDApCisjZGVmaW5lIFBSVENJRl9DVExSX0JFTkxfTVNCCQlCSVQoMTkpCisjZGVmaW5lIFBSVENJRl9DVExSX0JFTkxfM1JEX0JZVEUJQklUKDE4KQorI2RlZmluZSBQUlRDSUZfQ1RMUl9CRU5MXzJORF9CWVRFCUJJVCgxNykKKyNkZWZpbmUgUFJUQ0lGX0NUTFJfQkVOTF9MU0IJCUJJVCgxNikKKyNkZWZpbmUgUFJUQ0lGX0NUTFJfQkVOTF9NQVNLCQkoMHgwMDBGMDAwMCkKKworLyogUFJUQ0lGX0lOVEVOIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgUFJUQ0lGX0lOVEVOX1JUQ1NTCQlCSVQoMSkKKyNkZWZpbmUgUFJUQ0lGX0lOVEVOX1JUQ0lGCQlCSVQoMCkKKyNkZWZpbmUgUFJUQ0lGX0lOVEVOX01BU0sJCShQUlRDSUZfSU5URU5fUlRDU1MgXAorCQkJCQl8IFBSVENJRl9JTlRFTl9SVENJRikKKworLyogUFJUQ0lGX0lOVEZMRyBiaXQgZmllbGRzICovCisjZGVmaW5lIFBSVENJRl9JTlRGTEdfUlRDU1MJCUJJVCgxKQorI2RlZmluZSBQUlRDSUZfSU5URkxHX1JUQ0lGCQlCSVQoMCkKKyNkZWZpbmUgUFJUQ0lGX0lOVEZMR19NQVNLCQkoUFJUQ0lGX0lOVEZMR19SVENTUyBcCisJCQkJCXwgUFJUQ0lGX0lOVEZMR19SVENJRikKKworLyogUFJUQyBzdWJzeXN0ZW0gcmVnaXN0ZXJzICovCisjZGVmaW5lIFBSVENTU19SVENfSU5UQ19FWFRFTkExCQkoMHgwQykKKyNkZWZpbmUgUFJUQ1NTX1JUQ19DVFJMCQkJKDB4MTApCisjZGVmaW5lIFBSVENTU19SVENfV0RUCQkJKDB4MTEpCisjZGVmaW5lIFBSVENTU19SVENfVE1SMAkJCSgweDEyKQorI2RlZmluZSBQUlRDU1NfUlRDX1RNUjEJCQkoMHgxMykKKyNkZWZpbmUgUFJUQ1NTX1JUQ19DQ1RSTAkJKDB4MTQpCisjZGVmaW5lIFBSVENTU19SVENfU0VDCQkJKDB4MTUpCisjZGVmaW5lIFBSVENTU19SVENfTUlOCQkJKDB4MTYpCisjZGVmaW5lIFBSVENTU19SVENfSE9VUgkJCSgweDE3KQorI2RlZmluZSBQUlRDU1NfUlRDX0RBWTAJCQkoMHgxOCkKKyNkZWZpbmUgUFJUQ1NTX1JUQ19EQVkxCQkJKDB4MTkpCisjZGVmaW5lIFBSVENTU19SVENfQU1JTgkJCSgweDFBKQorI2RlZmluZSBQUlRDU1NfUlRDX0FIT1VSCQkoMHgxQikKKyNkZWZpbmUgUFJUQ1NTX1JUQ19BREFZMAkJKDB4MUMpCisjZGVmaW5lIFBSVENTU19SVENfQURBWTEJCSgweDFEKQorI2RlZmluZSBQUlRDU1NfUlRDX0NMS0NfQ05UCQkoMHgyMCkKKworLyogUFJUQ1NTX1JUQ19JTlRDX0VYVEVOQTEgKi8KKyNkZWZpbmUgUFJUQ1NTX1JUQ19JTlRDX0VYVEVOQTFfTUFTSwkoMHgwNykKKworLyogUFJUQ1NTX1JUQ19DVFJMIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgUFJUQ1NTX1JUQ19DVFJMX1dEVEJVUwkJQklUKDcpCisjZGVmaW5lIFBSVENTU19SVENfQ1RSTF9XRU4JCUJJVCg2KQorI2RlZmluZSBQUlRDU1NfUlRDX0NUUkxfV0RSVAkJQklUKDUpCisjZGVmaW5lIFBSVENTU19SVENfQ1RSTF9XRFRGTEcJCUJJVCg0KQorI2RlZmluZSBQUlRDU1NfUlRDX0NUUkxfVEUJCUJJVCgzKQorI2RlZmluZSBQUlRDU1NfUlRDX0NUUkxfVElFTgkJQklUKDIpCisjZGVmaW5lIFBSVENTU19SVENfQ1RSTF9UTVJGTEcJCUJJVCgxKQorI2RlZmluZSBQUlRDU1NfUlRDX0NUUkxfVE1NRAkJQklUKDApCisKKy8qIFBSVENTU19SVENfQ0NUUkwgYml0IGZpZWxkcyAqLworI2RlZmluZSBQUlRDU1NfUlRDX0NDVFJMX0NBTEJVU1kJQklUKDcpCisjZGVmaW5lIFBSVENTU19SVENfQ0NUUkxfREFFTgkJQklUKDUpCisjZGVmaW5lIFBSVENTU19SVENfQ0NUUkxfSEFFTgkJQklUKDQpCisjZGVmaW5lIFBSVENTU19SVENfQ0NUUkxfTUFFTgkJQklUKDMpCisjZGVmaW5lIFBSVENTU19SVENfQ0NUUkxfQUxNRkxHCQlCSVQoMikKKyNkZWZpbmUgUFJUQ1NTX1JUQ19DQ1RSTF9BSUVOCQlCSVQoMSkKKyNkZWZpbmUgUFJUQ1NTX1JUQ19DQ1RSTF9DQUVOCQlCSVQoMCkKKworc3RhdGljIERFRklORV9TUElOTE9DSyhkYXZpbmNpX3J0Y19sb2NrKTsKKworc3RydWN0IGRhdmluY2lfcnRjIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAJCSpydGM7CisJdm9pZCBfX2lvbWVtCQkJKmJhc2U7CisJcmVzb3VyY2Vfc2l6ZV90CQkJcGJhc2U7CisJc2l6ZV90CQkJCWJhc2Vfc2l6ZTsKKwlpbnQJCQkJaXJxOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHJ0Y2lmX3dyaXRlKHN0cnVjdCBkYXZpbmNpX3J0YyAqZGF2aW5jaV9ydGMsCisJCQkgICAgICAgdTMyIHZhbCwgdTMyIGFkZHIpCit7CisJd3JpdGVsKHZhbCwgZGF2aW5jaV9ydGMtPmJhc2UgKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcnRjaWZfcmVhZChzdHJ1Y3QgZGF2aW5jaV9ydGMgKmRhdmluY2lfcnRjLCB1MzIgYWRkcikKK3sKKwlyZXR1cm4gcmVhZGwoZGF2aW5jaV9ydGMtPmJhc2UgKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0Y2lmX3dhaXQoc3RydWN0IGRhdmluY2lfcnRjICpkYXZpbmNpX3J0YykKK3sKKwl3aGlsZSAocnRjaWZfcmVhZChkYXZpbmNpX3J0YywgUFJUQ0lGX0NUTFIpICYgUFJUQ0lGX0NUTFJfQlVTWSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGNzc193cml0ZShzdHJ1Y3QgZGF2aW5jaV9ydGMgKmRhdmluY2lfcnRjLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB1OCBhZGRyKQoreworCXJ0Y2lmX3dhaXQoZGF2aW5jaV9ydGMpOworCisJcnRjaWZfd3JpdGUoZGF2aW5jaV9ydGMsIFBSVENJRl9DVExSX0JFTkxfTFNCIHwgYWRkciwgUFJUQ0lGX0NUTFIpOworCXJ0Y2lmX3dyaXRlKGRhdmluY2lfcnRjLCB2YWwsIFBSVENJRl9MREFUQSk7CisKKwlydGNpZl93YWl0KGRhdmluY2lfcnRjKTsKK30KKworc3RhdGljIGlubGluZSB1OCBydGNzc19yZWFkKHN0cnVjdCBkYXZpbmNpX3J0YyAqZGF2aW5jaV9ydGMsIHU4IGFkZHIpCit7CisJcnRjaWZfd2FpdChkYXZpbmNpX3J0Yyk7CisKKwlydGNpZl93cml0ZShkYXZpbmNpX3J0YywgUFJUQ0lGX0NUTFJfRElSIHwgUFJUQ0lGX0NUTFJfQkVOTF9MU0IgfCBhZGRyLAorCQkgICAgUFJUQ0lGX0NUTFIpOworCisJcnRjaWZfd2FpdChkYXZpbmNpX3J0Yyk7CisKKwlyZXR1cm4gcnRjaWZfcmVhZChkYXZpbmNpX3J0YywgUFJUQ0lGX0xEQVRBKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRhdmluY2lfcnRjc3NfY2FsZW5kYXJfd2FpdChzdHJ1Y3QgZGF2aW5jaV9ydGMgKmRhdmluY2lfcnRjKQoreworCXdoaWxlIChydGNzc19yZWFkKGRhdmluY2lfcnRjLCBQUlRDU1NfUlRDX0NDVFJMKSAmCisJICAgICAgIFBSVENTU19SVENfQ0NUUkxfQ0FMQlVTWSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkYXZpbmNpX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqY2xhc3NfZGV2KQoreworCXN0cnVjdCBkYXZpbmNpX3J0YyAqZGF2aW5jaV9ydGMgPSBjbGFzc19kZXY7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCXUzMiBpcnFfZmxnOworCXU4IGFsbV9pcnEsIHRtcl9pcnE7CisJdTggcnRjX2N0cmwsIHJ0Y19jY3RybDsKKwlpbnQgcmV0ID0gSVJRX05PTkU7CisKKwlpcnFfZmxnID0gcnRjaWZfcmVhZChkYXZpbmNpX3J0YywgUFJUQ0lGX0lOVEZMRykgJgorCQkgIFBSVENJRl9JTlRGTEdfUlRDU1M7CisKKwlhbG1faXJxID0gcnRjc3NfcmVhZChkYXZpbmNpX3J0YywgUFJUQ1NTX1JUQ19DQ1RSTCkgJgorCQkgIFBSVENTU19SVENfQ0NUUkxfQUxNRkxHOworCisJdG1yX2lycSA9IHJ0Y3NzX3JlYWQoZGF2aW5jaV9ydGMsIFBSVENTU19SVENfQ1RSTCkgJgorCQkgIFBSVENTU19SVENfQ1RSTF9UTVJGTEc7CisKKwlpZiAoaXJxX2ZsZykgeworCQlpZiAoYWxtX2lycSkgeworCQkJZXZlbnRzIHw9IFJUQ19JUlFGIHwgUlRDX0FGOworCQkJcnRjX2NjdHJsID0gcnRjc3NfcmVhZChkYXZpbmNpX3J0YywgUFJUQ1NTX1JUQ19DQ1RSTCk7CisJCQlydGNfY2N0cmwgfD0gIFBSVENTU19SVENfQ0NUUkxfQUxNRkxHOworCQkJcnRjc3Nfd3JpdGUoZGF2aW5jaV9ydGMsIHJ0Y19jY3RybCwgUFJUQ1NTX1JUQ19DQ1RSTCk7CisJCX0gZWxzZSBpZiAodG1yX2lycSkgeworCQkJZXZlbnRzIHw9IFJUQ19JUlFGIHwgUlRDX1BGOworCQkJcnRjX2N0cmwgPSBydGNzc19yZWFkKGRhdmluY2lfcnRjLCBQUlRDU1NfUlRDX0NUUkwpOworCQkJcnRjX2N0cmwgfD0gIFBSVENTU19SVENfQ1RSTF9UTVJGTEc7CisJCQlydGNzc193cml0ZShkYXZpbmNpX3J0YywgcnRjX2N0cmwsIFBSVENTU19SVENfQ1RSTCk7CisJCX0KKworCQlydGNpZl93cml0ZShkYXZpbmNpX3J0YywgUFJUQ0lGX0lOVEZMR19SVENTUywKKwkJCQkgICAgUFJUQ0lGX0lOVEZMRyk7CisJCXJ0Y191cGRhdGVfaXJxKGRhdmluY2lfcnRjLT5ydGMsIDEsIGV2ZW50cyk7CisKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZGF2aW5jaV9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ydGMgKmRhdmluY2lfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggcnRjX2N0cmw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYXZpbmNpX3J0Y19sb2NrLCBmbGFncyk7CisKKwlydGNfY3RybCA9IHJ0Y3NzX3JlYWQoZGF2aW5jaV9ydGMsIFBSVENTU19SVENfQ1RSTCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX1dJRV9PTjoKKwkJcnRjX2N0cmwgfD0gUFJUQ1NTX1JUQ19DVFJMX1dFTiB8IFBSVENTU19SVENfQ1RSTF9XRFRGTEc7CisJCWJyZWFrOworCWNhc2UgUlRDX1dJRV9PRkY6CisJCXJ0Y19jdHJsICY9IH5QUlRDU1NfUlRDX0NUUkxfV0VOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJfQorCisJcnRjc3Nfd3JpdGUoZGF2aW5jaV9ydGMsIHJ0Y19jdHJsLCBQUlRDU1NfUlRDX0NUUkwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF2aW5jaV9ydGNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb252ZXJ0ZnJvbWRheXModTE2IGRheXMsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IHRtcF9kYXlzLCB5ZWFyLCBtb247CisKKwlmb3IgKHllYXIgPSAyMDAwOzsgeWVhcisrKSB7CisJCXRtcF9kYXlzID0gcnRjX3llYXJfZGF5cygxLCAxMiwgeWVhcik7CisJCWlmIChkYXlzID49IHRtcF9kYXlzKQorCQkJZGF5cyAtPSB0bXBfZGF5czsKKwkJZWxzZSB7CisJCQlmb3IgKG1vbiA9IDA7OyBtb24rKykgeworCQkJCXRtcF9kYXlzID0gcnRjX21vbnRoX2RheXMobW9uLCB5ZWFyKTsKKwkJCQlpZiAoZGF5cyA+PSB0bXBfZGF5cykgeworCQkJCQlkYXlzIC09IHRtcF9kYXlzOworCQkJCX0gZWxzZSB7CisJCQkJCXRtLT50bV95ZWFyID0geWVhciAtIDE5MDA7CisJCQkJCXRtLT50bV9tb24gPSBtb247CisJCQkJCXRtLT50bV9tZGF5ID0gZGF5cyArIDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbnZlcnQyZGF5cyh1MTYgKmRheXMsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IGk7CisJKmRheXMgPSAwOworCisJLyogZXBvY2ggPT0gMTkwMCAqLworCWlmICh0bS0+dG1feWVhciA8IDEwMCB8fCB0bS0+dG1feWVhciA+IDE5OSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAyMDAwOyBpIDwgMTkwMCArIHRtLT50bV95ZWFyOyBpKyspCisJCSpkYXlzICs9IHJ0Y195ZWFyX2RheXMoMSwgMTIsIGkpOworCisJKmRheXMgKz0gcnRjX3llYXJfZGF5cyh0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgMTkwMCArIHRtLT50bV95ZWFyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhdmluY2lfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IGRhdmluY2lfcnRjICpkYXZpbmNpX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUxNiBkYXlzID0gMDsKKwl1OCBkYXkwLCBkYXkxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF2aW5jaV9ydGNfbG9jaywgZmxhZ3MpOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihydGNzc19yZWFkKGRhdmluY2lfcnRjLCBQUlRDU1NfUlRDX1NFQykpOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbihydGNzc19yZWFkKGRhdmluY2lfcnRjLCBQUlRDU1NfUlRDX01JTikpOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4ocnRjc3NfcmVhZChkYXZpbmNpX3J0YywgUFJUQ1NTX1JUQ19IT1VSKSk7CisKKwlkYXZpbmNpX3J0Y3NzX2NhbGVuZGFyX3dhaXQoZGF2aW5jaV9ydGMpOworCWRheTAgPSBydGNzc19yZWFkKGRhdmluY2lfcnRjLCBQUlRDU1NfUlRDX0RBWTApOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwlkYXkxID0gcnRjc3NfcmVhZChkYXZpbmNpX3J0YywgUFJUQ1NTX1JUQ19EQVkxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdmluY2lfcnRjX2xvY2ssIGZsYWdzKTsKKworCWRheXMgfD0gZGF5MTsKKwlkYXlzIDw8PSA4OworCWRheXMgfD0gZGF5MDsKKworCWlmIChjb252ZXJ0ZnJvbWRheXMoZGF5cywgdG0pIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXZpbmNpX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IGRhdmluY2lfcnRjICpkYXZpbmNpX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUxNiBkYXlzOworCXU4IHJ0Y19jY3RybDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNvbnZlcnQyZGF5cygmZGF5cywgdG0pIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF2aW5jaV9ydGNfbG9jaywgZmxhZ3MpOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwlydGNzc193cml0ZShkYXZpbmNpX3J0YywgYmluMmJjZCh0bS0+dG1fc2VjKSwgUFJUQ1NTX1JUQ19TRUMpOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwlydGNzc193cml0ZShkYXZpbmNpX3J0YywgYmluMmJjZCh0bS0+dG1fbWluKSwgUFJUQ1NTX1JUQ19NSU4pOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwlydGNzc193cml0ZShkYXZpbmNpX3J0YywgYmluMmJjZCh0bS0+dG1faG91ciksIFBSVENTU19SVENfSE9VUik7CisKKwlkYXZpbmNpX3J0Y3NzX2NhbGVuZGFyX3dhaXQoZGF2aW5jaV9ydGMpOworCXJ0Y3NzX3dyaXRlKGRhdmluY2lfcnRjLCBkYXlzICYgMHhGRiwgUFJUQ1NTX1JUQ19EQVkwKTsKKworCWRhdmluY2lfcnRjc3NfY2FsZW5kYXJfd2FpdChkYXZpbmNpX3J0Yyk7CisJcnRjc3Nfd3JpdGUoZGF2aW5jaV9ydGMsIChkYXlzICYgMHhGRjAwKSA+PiA4LCBQUlRDU1NfUlRDX0RBWTEpOworCisJcnRjX2NjdHJsID0gcnRjc3NfcmVhZChkYXZpbmNpX3J0YywgUFJUQ1NTX1JUQ19DQ1RSTCk7CisJcnRjX2NjdHJsIHw9IFBSVENTU19SVENfQ0NUUkxfQ0FFTjsKKwlydGNzc193cml0ZShkYXZpbmNpX3J0YywgcnRjX2NjdHJsLCBQUlRDU1NfUlRDX0NDVFJMKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdmluY2lfcnRjX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhdmluY2lfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQl1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ydGMgKmRhdmluY2lfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBydGNfY2N0cmwgPSBydGNzc19yZWFkKGRhdmluY2lfcnRjLCBQUlRDU1NfUlRDX0NDVFJMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYXZpbmNpX3J0Y19sb2NrLCBmbGFncyk7CisKKwlpZiAoZW5hYmxlZCkKKwkJcnRjX2NjdHJsIHw9IFBSVENTU19SVENfQ0NUUkxfREFFTiB8CisJCQkgICAgIFBSVENTU19SVENfQ0NUUkxfSEFFTiB8CisJCQkgICAgIFBSVENTU19SVENfQ0NUUkxfTUFFTiB8CisJCQkgICAgIFBSVENTU19SVENfQ0NUUkxfQUxNRkxHIHwKKwkJCSAgICAgUFJUQ1NTX1JUQ19DQ1RSTF9BSUVOOworCWVsc2UKKwkJcnRjX2NjdHJsICY9IH5QUlRDU1NfUlRDX0NDVFJMX0FJRU47CisKKwlkYXZpbmNpX3J0Y3NzX2NhbGVuZGFyX3dhaXQoZGF2aW5jaV9ydGMpOworCXJ0Y3NzX3dyaXRlKGRhdmluY2lfcnRjLCBydGNfY2N0cmwsIFBSVENTU19SVENfQ0NUUkwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF2aW5jaV9ydGNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF2aW5jaV9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJc3RydWN0IGRhdmluY2lfcnRjICpkYXZpbmNpX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUxNiBkYXlzID0gMDsKKwl1OCBkYXkwLCBkYXkxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF2aW5jaV9ydGNfbG9jaywgZmxhZ3MpOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwlhbG0tPnRpbWUudG1fbWluID0gYmNkMmJpbihydGNzc19yZWFkKGRhdmluY2lfcnRjLCBQUlRDU1NfUlRDX0FNSU4pKTsKKworCWRhdmluY2lfcnRjc3NfY2FsZW5kYXJfd2FpdChkYXZpbmNpX3J0Yyk7CisJYWxtLT50aW1lLnRtX2hvdXIgPSBiY2QyYmluKHJ0Y3NzX3JlYWQoZGF2aW5jaV9ydGMsIFBSVENTU19SVENfQUhPVVIpKTsKKworCWRhdmluY2lfcnRjc3NfY2FsZW5kYXJfd2FpdChkYXZpbmNpX3J0Yyk7CisJZGF5MCA9IHJ0Y3NzX3JlYWQoZGF2aW5jaV9ydGMsIFBSVENTU19SVENfQURBWTApOworCisJZGF2aW5jaV9ydGNzc19jYWxlbmRhcl93YWl0KGRhdmluY2lfcnRjKTsKKwlkYXkxID0gcnRjc3NfcmVhZChkYXZpbmNpX3J0YywgUFJUQ1NTX1JUQ19BREFZMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXZpbmNpX3J0Y19sb2NrLCBmbGFncyk7CisJZGF5cyB8PSBkYXkxOworCWRheXMgPDw9IDg7CisJZGF5cyB8PSBkYXkwOworCisJaWYgKGNvbnZlcnRmcm9tZGF5cyhkYXlzLCAmYWxtLT50aW1lKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYWxtLT5wZW5kaW5nID0gISEocnRjc3NfcmVhZChkYXZpbmNpX3J0YywKKwkJCSAgUFJUQ1NTX1JUQ19DQ1RSTCkgJgorCQkJUFJUQ1NTX1JUQ19DQ1RSTF9BSUVOKTsKKwlhbG0tPmVuYWJsZWQgPSBhbG0tPnBlbmRpbmcgJiYgZGV2aWNlX21heV93YWtldXAoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhdmluY2lfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJc3RydWN0IGRhdmluY2lfcnRjICpkYXZpbmNpX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IGRheXM7CisKKwlpZiAoYWxtLT50aW1lLnRtX21kYXkgPD0gMCAmJiBhbG0tPnRpbWUudG1fbW9uIDwgMAorCSAgICAmJiBhbG0tPnRpbWUudG1feWVhciA8IDApIHsKKwkJc3RydWN0IHJ0Y190aW1lIHRtOworCQl1bnNpZ25lZCBsb25nIG5vdywgdGhlbjsKKworCQlkYXZpbmNpX3J0Y19yZWFkX3RpbWUoZGV2LCAmdG0pOworCQlydGNfdG1fdG9fdGltZSgmdG0sICZub3cpOworCisJCWFsbS0+dGltZS50bV9tZGF5ID0gdG0udG1fbWRheTsKKwkJYWxtLT50aW1lLnRtX21vbiA9IHRtLnRtX21vbjsKKwkJYWxtLT50aW1lLnRtX3llYXIgPSB0bS50bV95ZWFyOworCQlydGNfdG1fdG9fdGltZSgmYWxtLT50aW1lLCAmdGhlbik7CisKKwkJaWYgKHRoZW4gPCBub3cpIHsKKwkJCXJ0Y190aW1lX3RvX3RtKG5vdyArIDI0ICogNjAgKiA2MCwgJnRtKTsKKwkJCWFsbS0+dGltZS50bV9tZGF5ID0gdG0udG1fbWRheTsKKwkJCWFsbS0+dGltZS50bV9tb24gPSB0bS50bV9tb247CisJCQlhbG0tPnRpbWUudG1feWVhciA9IHRtLnRtX3llYXI7CisJCX0KKwl9CisKKwlpZiAoY29udmVydDJkYXlzKCZkYXlzLCAmYWxtLT50aW1lKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdmluY2lfcnRjX2xvY2ssIGZsYWdzKTsKKworCWRhdmluY2lfcnRjc3NfY2FsZW5kYXJfd2FpdChkYXZpbmNpX3J0Yyk7CisJcnRjc3Nfd3JpdGUoZGF2aW5jaV9ydGMsIGJpbjJiY2QoYWxtLT50aW1lLnRtX21pbiksIFBSVENTU19SVENfQU1JTik7CisKKwlkYXZpbmNpX3J0Y3NzX2NhbGVuZGFyX3dhaXQoZGF2aW5jaV9ydGMpOworCXJ0Y3NzX3dyaXRlKGRhdmluY2lfcnRjLCBiaW4yYmNkKGFsbS0+dGltZS50bV9ob3VyKSwgUFJUQ1NTX1JUQ19BSE9VUik7CisKKwlkYXZpbmNpX3J0Y3NzX2NhbGVuZGFyX3dhaXQoZGF2aW5jaV9ydGMpOworCXJ0Y3NzX3dyaXRlKGRhdmluY2lfcnRjLCBkYXlzICYgMHhGRiwgUFJUQ1NTX1JUQ19BREFZMCk7CisKKwlkYXZpbmNpX3J0Y3NzX2NhbGVuZGFyX3dhaXQoZGF2aW5jaV9ydGMpOworCXJ0Y3NzX3dyaXRlKGRhdmluY2lfcnRjLCAoZGF5cyAmIDB4RkYwMCkgPj4gOCwgUFJUQ1NTX1JUQ19BREFZMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXZpbmNpX3J0Y19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRhdmluY2lfcnRjX29wcyA9IHsKKwkuaW9jdGwJCQk9IGRhdmluY2lfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUJCT0gZGF2aW5jaV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQkJPSBkYXZpbmNpX3J0Y19zZXRfdGltZSwKKwkuYWxhcm1faXJxX2VuYWJsZQk9IGRhdmluY2lfcnRjX2FsYXJtX2lycV9lbmFibGUsCisJLnJlYWRfYWxhcm0JCT0gZGF2aW5jaV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCQk9IGRhdmluY2lfcnRjX3NldF9hbGFybSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGF2aW5jaV9ydGMgKmRhdmluY2lfcnRjOworCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqbWVtOworCWludCByZXQgPSAwOworCisJZGF2aW5jaV9ydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGF2aW5jaV9ydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdmluY2lfcnRjKSB7CisJCWRldl9kYmcoZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcHJpdmF0ZSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGF2aW5jaV9ydGMtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGRhdmluY2lfcnRjLT5pcnEgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gUlRDIGlycVxuIik7CisJCXJldCA9IGRhdmluY2lfcnRjLT5pcnE7CisJCWdvdG8gZmFpbDE7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKGRldiwgIm5vIG1lbSByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDE7CisJfQorCisJZGF2aW5jaV9ydGMtPnBiYXNlID0gcmVzLT5zdGFydDsKKwlkYXZpbmNpX3J0Yy0+YmFzZV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCisJbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKGRhdmluY2lfcnRjLT5wYmFzZSwgZGF2aW5jaV9ydGMtPmJhc2Vfc2l6ZSwKKwkJCQkgcGRldi0+bmFtZSk7CisJaWYgKCFtZW0pIHsKKwkJZGV2X2VycihkZXYsICJSVEMgcmVnaXN0ZXJzIGF0ICUwOHggYXJlIG5vdCBmcmVlXG4iLAorCQkJZGF2aW5jaV9ydGMtPnBiYXNlKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGZhaWwxOworCX0KKworCWRhdmluY2lfcnRjLT5iYXNlID0gaW9yZW1hcChkYXZpbmNpX3J0Yy0+cGJhc2UsIGRhdmluY2lfcnRjLT5iYXNlX3NpemUpOworCWlmICghZGF2aW5jaV9ydGMtPmJhc2UpIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gaW9yZW1hcCBNRU0gcmVzb3VyY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWwyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdmluY2lfcnRjKTsKKworCWRhdmluY2lfcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJICAgICZkYXZpbmNpX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKGRhdmluY2lfcnRjLT5ydGMpKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIFJUQyBkZXZpY2UsIGVyciAlbGRcbiIsCisJCQkJUFRSX0VSUihkYXZpbmNpX3J0Yy0+cnRjKSk7CisJCWdvdG8gZmFpbDM7CisJfQorCisJcnRjaWZfd3JpdGUoZGF2aW5jaV9ydGMsIFBSVENJRl9JTlRGTEdfUlRDU1MsIFBSVENJRl9JTlRGTEcpOworCXJ0Y2lmX3dyaXRlKGRhdmluY2lfcnRjLCAwLCBQUlRDSUZfSU5URU4pOworCXJ0Y3NzX3dyaXRlKGRhdmluY2lfcnRjLCAwLCBQUlRDU1NfUlRDX0lOVENfRVhURU5BMSk7CisKKwlydGNzc193cml0ZShkYXZpbmNpX3J0YywgMCwgUFJUQ1NTX1JUQ19DVFJMKTsKKwlydGNzc193cml0ZShkYXZpbmNpX3J0YywgMCwgUFJUQ1NTX1JUQ19DQ1RSTCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkYXZpbmNpX3J0Yy0+aXJxLCBkYXZpbmNpX3J0Y19pbnRlcnJ1cHQsCisJCQkgIDAsICJkYXZpbmNpX3J0YyIsIGRhdmluY2lfcnRjKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byByZWdpc3RlciBkYXZpbmNpIFJUQyBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGZhaWw0OworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJcnRjaWZfd3JpdGUoZGF2aW5jaV9ydGMsIFBSVENJRl9JTlRFTl9SVENTUywgUFJUQ0lGX0lOVEVOKTsKKwlydGNzc193cml0ZShkYXZpbmNpX3J0YywgUFJUQ1NTX1JUQ19JTlRDX0VYVEVOQTFfTUFTSywKKwkJCSAgICBQUlRDU1NfUlRDX0lOVENfRVhURU5BMSk7CisKKwlydGNzc193cml0ZShkYXZpbmNpX3J0YywgUFJUQ1NTX1JUQ19DQ1RSTF9DQUVOLCBQUlRDU1NfUlRDX0NDVFJMKTsKKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKKworCXJldHVybiAwOworCitmYWlsNDoKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZGF2aW5jaV9ydGMtPnJ0Yyk7CitmYWlsMzoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpb3VubWFwKGRhdmluY2lfcnRjLT5iYXNlKTsKK2ZhaWwyOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihkYXZpbmNpX3J0Yy0+cGJhc2UsIGRhdmluY2lfcnRjLT5iYXNlX3NpemUpOworZmFpbDE6CisJa2ZyZWUoZGF2aW5jaV9ydGMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGF2aW5jaV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRhdmluY2lfcnRjICpkYXZpbmNpX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDApOworCisJcnRjaWZfd3JpdGUoZGF2aW5jaV9ydGMsIDAsIFBSVENJRl9JTlRFTik7CisKKwlmcmVlX2lycShkYXZpbmNpX3J0Yy0+aXJxLCBkYXZpbmNpX3J0Yyk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZGF2aW5jaV9ydGMtPnJ0Yyk7CisKKwlpb3VubWFwKGRhdmluY2lfcnRjLT5iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oZGF2aW5jaV9ydGMtPnBiYXNlLCBkYXZpbmNpX3J0Yy0+YmFzZV9zaXplKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJa2ZyZWUoZGF2aW5jaV9ydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhdmluY2lfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZGF2aW5jaV9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkYXZpbmNpX3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZSA9ICJydGNfZGF2aW5jaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmRhdmluY2lfcnRjX2RyaXZlciwgZGF2aW5jaV9ydGNfcHJvYmUpOworfQorbW9kdWxlX2luaXQocnRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGF2aW5jaV9ydGNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHJ0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWlndWVsIEFndWlsYXIgPG1pZ3VlbC5hZ3VpbGFyQHJpZGdlcnVuLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGV4YXMgSW5zdHJ1bWVudHMgRGFWaW5jaSBQUlRDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRldi5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTM2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBSVEMgc3Vic3lzdGVtLCBkZXYgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRvd2VyIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4KKyAqCisgKiBiYXNlZCBvbiBhcmNoL2FybS9jb21tb24vcnRjdGltZS5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgInJ0Yy1jb3JlLmgiCisKK3N0YXRpYyBkZXZfdCBydGNfZGV2dDsKKworI2RlZmluZSBSVENfREVWX01BWCAxNiAvKiAxNiBSVENzIHNob3VsZCBiZSBlbm91Z2ggZm9yIGV2ZXJ5b25lLi4uICovCisKK3N0YXRpYyBpbnQgcnRjX2Rldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBlcnI7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LAorCQkJCQlzdHJ1Y3QgcnRjX2RldmljZSwgY2hhcl9kZXYpOworCWNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzICpvcHMgPSBydGMtPm9wczsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0X2xvY2soUlRDX0RFVl9CVVNZLCAmcnRjLT5mbGFncykpCisJCXJldHVybiAtRUJVU1k7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBydGM7CisKKwllcnIgPSBvcHMtPm9wZW4gPyBvcHMtPm9wZW4ocnRjLT5kZXYucGFyZW50KSA6IDA7CisJaWYgKGVyciA9PSAwKSB7CisJCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCQlydGMtPmlycV9kYXRhID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcgKi8KKwljbGVhcl9iaXRfdW5sb2NrKFJUQ19ERVZfQlVTWSwgJnJ0Yy0+ZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCisvKgorICogUm91dGluZSB0byBwb2xsIFJUQyBzZWNvbmRzIGZpZWxkIGZvciBjaGFuZ2UgYXMgb2Z0ZW4gYXMgcG9zc2libGUsCisgKiBhZnRlciBmaXJzdCBSVENfVUlFIHVzZSB0aW1lciB0byByZWR1Y2UgcG9sbGluZworICovCitzdGF0aWMgdm9pZCBydGNfdWllX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ0Y19kZXZpY2UsIHVpZV90YXNrKTsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJaW50IG51bSA9IDA7CisJaW50IGVycjsKKworCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJaWYgKHJ0Yy0+c3RvcF91aWVfcG9sbGluZyB8fCBlcnIpIHsKKwkJcnRjLT51aWVfdGFza19hY3RpdmUgPSAwOworCX0gZWxzZSBpZiAocnRjLT5vbGRzZWNzICE9IHRtLnRtX3NlYykgeworCQludW0gPSAodG0udG1fc2VjICsgNjAgLSBydGMtPm9sZHNlY3MpICUgNjA7CisJCXJ0Yy0+b2xkc2VjcyA9IHRtLnRtX3NlYzsKKwkJcnRjLT51aWVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAtIChIWi8xMCk7CisJCXJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSA9IDE7CisJCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKKwkJYWRkX3RpbWVyKCZydGMtPnVpZV90aW1lcik7CisJfSBlbHNlIGlmIChzY2hlZHVsZV93b3JrKCZydGMtPnVpZV90YXNrKSA9PSAwKSB7CisJCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwlpZiAobnVtKQorCQlydGNfaGFuZGxlX2xlZ2FjeV9pcnEocnRjLCBudW0sIFJUQ19VRik7Cit9CitzdGF0aWMgdm9pZCBydGNfdWllX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gKHN0cnVjdCBydGNfZGV2aWNlICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Yy0+aXJxX2xvY2ssIGZsYWdzKTsKKwlydGMtPnVpZV90aW1lcl9hY3RpdmUgPSAwOworCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMTsKKwlpZiAoKHNjaGVkdWxlX3dvcmsoJnJ0Yy0+dWllX3Rhc2spID09IDApKQorCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGNsZWFyX3VpZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQoreworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCWlmIChydGMtPnVpZV9pcnFfYWN0aXZlKSB7CisJCXJ0Yy0+c3RvcF91aWVfcG9sbGluZyA9IDE7CisJCWlmIChydGMtPnVpZV90aW1lcl9hY3RpdmUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJCQlkZWxfdGltZXJfc3luYygmcnRjLT51aWVfdGltZXIpOworCQkJc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJCQlydGMtPnVpZV90aW1lcl9hY3RpdmUgPSAwOworCQl9CisJCWlmIChydGMtPnVpZV90YXNrX2FjdGl2ZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwkJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJCQlzcGluX2xvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwkJfQorCQlydGMtPnVpZV9pcnFfYWN0aXZlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfdWllKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCWludCBlcnI7CisKKwllcnIgPSBydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCWlmICghcnRjLT51aWVfaXJxX2FjdGl2ZSkgeworCQlydGMtPnVpZV9pcnFfYWN0aXZlID0gMTsKKwkJcnRjLT5zdG9wX3VpZV9wb2xsaW5nID0gMDsKKwkJcnRjLT5vbGRzZWNzID0gdG0udG1fc2VjOworCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDE7CisJCWlmIChzY2hlZHVsZV93b3JrKCZydGMtPnVpZV90YXNrKSA9PSAwKQorCQkJcnRjLT51aWVfdGFza19hY3RpdmUgPSAwOworCX0KKwlydGMtPmlycV9kYXRhID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCXJldHVybiAwOworfQorCitpbnQgcnRjX2Rldl91cGRhdGVfaXJxX2VuYWJsZV9lbXVsKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCWlmIChlbmFibGVkKQorCQlyZXR1cm4gc2V0X3VpZShydGMpOworCWVsc2UKKwkJcmV0dXJuIGNsZWFyX3VpZShydGMpOworfQorRVhQT1JUX1NZTUJPTChydGNfZGV2X3VwZGF0ZV9pcnFfZW5hYmxlX2VtdWwpOworCisjZW5kaWYgLyogQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCAqLworCitzdGF0aWMgc3NpemVfdAorcnRjX2Rldl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXNzaXplX3QgcmV0OworCisJaWYgKGNvdW50ICE9IHNpemVvZih1bnNpZ25lZCBpbnQpICYmIGNvdW50IDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZF93YWl0X3F1ZXVlKCZydGMtPmlycV9xdWV1ZSwgJndhaXQpOworCWRvIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCQlkYXRhID0gcnRjLT5pcnFfZGF0YTsKKwkJcnRjLT5pcnFfZGF0YSA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisKKwkJaWYgKGRhdGEgIT0gMCkgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9IHdoaWxlICgxKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZydGMtPmlycV9xdWV1ZSwgJndhaXQpOworCisJaWYgKHJldCA9PSAwKSB7CisJCS8qIENoZWNrIGZvciBhbnkgZGF0YSB1cGRhdGVzICovCisJCWlmIChydGMtPm9wcy0+cmVhZF9jYWxsYmFjaykKKwkJCWRhdGEgPSBydGMtPm9wcy0+cmVhZF9jYWxsYmFjayhydGMtPmRldi5wYXJlbnQsCisJCQkJCQkgICAgICAgZGF0YSk7CisKKwkJaWYgKHNpemVvZihpbnQpICE9IHNpemVvZihsb25nKSAmJgorCQkgICAgY291bnQgPT0gc2l6ZW9mKHVuc2lnbmVkIGludCkpCisJCQlyZXQgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWJ1ZikgPzoKKwkJCQlzaXplb2YodW5zaWduZWQgaW50KTsKKwkJZWxzZQorCQkJcmV0ID0gcHV0X3VzZXIoZGF0YSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYnVmKSA/OgorCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBydGNfZGV2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnJ0Yy0+aXJxX3F1ZXVlLCB3YWl0KTsKKworCWRhdGEgPSBydGMtPmlycV9kYXRhOworCisJcmV0dXJuIChkYXRhICE9IDApID8gKFBPTExJTiB8IFBPTExSRE5PUk0pIDogMDsKK30KKworc3RhdGljIGxvbmcgcnRjX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyAqb3BzID0gcnRjLT5vcHM7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXN0cnVjdCBydGNfd2thbHJtIGFsYXJtOworCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKKworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcnRjLT5vcHNfbG9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIGNoZWNrIHRoYXQgdGhlIGNhbGxpbmcgdGFzayBoYXMgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMKKwkgKiBmb3IgY2VydGFpbiBpb2N0bHMuIGRvaW5nIHRoaXMgY2hlY2sgaGVyZSBpcyB1c2VmdWwKKwkgKiB0byBhdm9pZCBkdXBsaWNhdGUgY29kZSBpbiBlYWNoIGRyaXZlci4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0VQT0NIX1NFVDoKKwljYXNlIFJUQ19TRVRfVElNRToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQllcnIgPSAtRUFDQ0VTOworCQlicmVhazsKKworCWNhc2UgUlRDX0lSUVBfU0VUOgorCQlpZiAoYXJnID4gcnRjLT5tYXhfdXNlcl9mcmVxICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQorCQkJZXJyID0gLUVBQ0NFUzsKKwkJYnJlYWs7CisKKwljYXNlIFJUQ19QSUVfT046CisJCWlmIChydGMtPmlycV9mcmVxID4gcnRjLT5tYXhfdXNlcl9mcmVxICYmCisJCQkJIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCQllcnIgPSAtRUFDQ0VTOworCQlicmVhazsKKwl9CisKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwkvKgorCSAqIERyaXZlcnMgKlNIT1VMRCBOT1QqIHByb3ZpZGUgaW9jdGwgaW1wbGVtZW50YXRpb25zCisJICogZm9yIHRoZXNlIHJlcXVlc3RzLiAgSW5zdGVhZCwgcHJvdmlkZSBtZXRob2RzIHRvCisJICogc3VwcG9ydCB0aGUgZm9sbG93aW5nIGNvZGUsIHNvIHRoYXQgdGhlIFJUQydzIG1haW4KKwkgKiBmZWF0dXJlcyBhcmUgYWNjZXNzaWJsZSB3aXRob3V0IHVzaW5nIGlvY3Rscy4KKwkgKgorCSAqIFJUQyBhbmQgYWxhcm0gdGltZXMgd2lsbCBiZSBpbiBVVEMsIGJ5IHByZWZlcmVuY2UsCisJICogYnV0IGR1YWwtYm9vdGluZyB3aXRoIE1TLVdpbmRvd3MgaW1wbGllcyBSVENzIG11c3QKKwkgKiB1c2UgdGhlIGxvY2FsIHdhbGwgY2xvY2sgdGltZS4KKwkgKi8KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUxNX1JFQUQ6CisJCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisKKwkJZXJyID0gcnRjX3JlYWRfYWxhcm0ocnRjLCAmYWxhcm0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKGNvcHlfdG9fdXNlcih1YXJnLCAmYWxhcm0udGltZSwgc2l6ZW9mKHRtKSkpCisJCQllcnIgPSAtRUZBVUxUOworCQlyZXR1cm4gZXJyOworCisJY2FzZSBSVENfQUxNX1NFVDoKKwkJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsYXJtLnRpbWUsIHVhcmcsIHNpemVvZih0bSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYWxhcm0uZW5hYmxlZCA9IDA7CisJCWFsYXJtLnBlbmRpbmcgPSAwOworCQlhbGFybS50aW1lLnRtX3dkYXkgPSAtMTsKKwkJYWxhcm0udGltZS50bV95ZGF5ID0gLTE7CisJCWFsYXJtLnRpbWUudG1faXNkc3QgPSAtMTsKKworCQkvKiBSVENfQUxNX1NFVCBhbGFybXMgbWF5IGJlIHVwIHRvIDI0IGhvdXJzIGluIHRoZSBmdXR1cmUuCisJCSAqIFJhdGhlciB0aGFuIGV4cGVjdGluZyBldmVyeSBSVEMgdG8gaW1wbGVtZW50ICJkb24ndCBjYXJlIgorCQkgKiBmb3IgZGF5L21vbnRoL3llYXIgZmllbGRzLCBqdXN0IGZvcmNlIHRoZSBhbGFybSB0byBoYXZlCisJCSAqIHRoZSByaWdodCB2YWx1ZXMgZm9yIHRob3NlIGZpZWxkcy4KKwkJICoKKwkJICogUlRDX1dLQUxNX1NFVCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLiAgTm90IG9ubHkgZG9lcyBpdAorCQkgKiBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUgUlRDX0FJRV9PTiBjYWxsLCBpdAorCQkgKiBkb2Vzbid0IGhhdmUgdGhlICJhbGFybSAyMzo1OTo1OSBpbiB0aGUgZnV0dXJlIiByYWNlLgorCQkgKgorCQkgKiBOT1RFOiAgc29tZSBsZWdhY3kgY29kZSBtYXkgaGF2ZSB1c2VkIGludmFsaWQgZmllbGRzIGFzCisJCSAqIHdpbGRjYXJkcywgZXhwb3NpbmcgaGFyZHdhcmUgInBlcmlvZGljIGFsYXJtIiBjYXBhYmlsaXRpZXMuCisJCSAqIE5vdCBzdXBwb3J0ZWQgaGVyZS4KKwkJICovCisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgbm93LCB0aGVuOworCisJCQllcnIgPSBydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlydGNfdG1fdG9fdGltZSgmdG0sICZub3cpOworCisJCQlhbGFybS50aW1lLnRtX21kYXkgPSB0bS50bV9tZGF5OworCQkJYWxhcm0udGltZS50bV9tb24gPSB0bS50bV9tb247CisJCQlhbGFybS50aW1lLnRtX3llYXIgPSB0bS50bV95ZWFyOworCQkJZXJyICA9IHJ0Y192YWxpZF90bSgmYWxhcm0udGltZSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJcnRjX3RtX3RvX3RpbWUoJmFsYXJtLnRpbWUsICZ0aGVuKTsKKworCQkJLyogYWxhcm0gbWF5IG5lZWQgdG8gd3JhcCBpbnRvIHRvbW9ycm93ICovCisJCQlpZiAodGhlbiA8IG5vdykgeworCQkJCXJ0Y190aW1lX3RvX3RtKG5vdyArIDI0ICogNjAgKiA2MCwgJnRtKTsKKwkJCQlhbGFybS50aW1lLnRtX21kYXkgPSB0bS50bV9tZGF5OworCQkJCWFsYXJtLnRpbWUudG1fbW9uID0gdG0udG1fbW9uOworCQkJCWFsYXJtLnRpbWUudG1feWVhciA9IHRtLnRtX3llYXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcnRjX3NldF9hbGFybShydGMsICZhbGFybSk7CisKKwljYXNlIFJUQ19SRF9USU1FOgorCQltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCisJCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKGNvcHlfdG9fdXNlcih1YXJnLCAmdG0sIHNpemVvZih0bSkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJcmV0dXJuIGVycjsKKworCWNhc2UgUlRDX1NFVF9USU1FOgorCQltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdG0sIHVhcmcsIHNpemVvZih0bSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIHJ0Y19zZXRfdGltZShydGMsICZ0bSk7CisKKwljYXNlIFJUQ19QSUVfT046CisJCWVyciA9IHJ0Y19pcnFfc2V0X3N0YXRlKHJ0YywgTlVMTCwgMSk7CisJCWJyZWFrOworCisJY2FzZSBSVENfUElFX09GRjoKKwkJZXJyID0gcnRjX2lycV9zZXRfc3RhdGUocnRjLCBOVUxMLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIFJUQ19BSUVfT046CisJCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJCXJldHVybiBydGNfYWxhcm1faXJxX2VuYWJsZShydGMsIDEpOworCisJY2FzZSBSVENfQUlFX09GRjoKKwkJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKKwkJcmV0dXJuIHJ0Y19hbGFybV9pcnFfZW5hYmxlKHJ0YywgMCk7CisKKwljYXNlIFJUQ19VSUVfT046CisJCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJCXJldHVybiBydGNfdXBkYXRlX2lycV9lbmFibGUocnRjLCAxKTsKKworCWNhc2UgUlRDX1VJRV9PRkY6CisJCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJCXJldHVybiBydGNfdXBkYXRlX2lycV9lbmFibGUocnRjLCAwKTsKKworCWNhc2UgUlRDX0lSUVBfU0VUOgorCQllcnIgPSBydGNfaXJxX3NldF9mcmVxKHJ0YywgTlVMTCwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFJUQ19JUlFQX1JFQUQ6CisJCWVyciA9IHB1dF91c2VyKHJ0Yy0+aXJxX2ZyZXEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKXVhcmcpOworCQlicmVhazsKKworI2lmIDAKKwljYXNlIFJUQ19FUE9DSF9TRVQ6CisjaWZuZGVmIHJ0Y19lcG9jaAorCQkvKgorCQkgKiBUaGVyZSB3ZXJlIG5vIFJUQyBjbG9ja3MgYmVmb3JlIDE5MDAuCisJCSAqLworCQlpZiAoYXJnIDwgMTkwMCkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJ0Y19lcG9jaCA9IGFyZzsKKwkJZXJyID0gMDsKKyNlbmRpZgorCQlicmVhazsKKworCWNhc2UgUlRDX0VQT0NIX1JFQUQ6CisJCWVyciA9IHB1dF91c2VyKHJ0Y19lcG9jaCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopdWFyZyk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBSVENfV0tBTE1fU0VUOgorCQltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsYXJtLCB1YXJnLCBzaXplb2YoYWxhcm0pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBydGNfc2V0X2FsYXJtKHJ0YywgJmFsYXJtKTsKKworCWNhc2UgUlRDX1dLQUxNX1JEOgorCQltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCQllcnIgPSBydGNfcmVhZF9hbGFybShydGMsICZhbGFybSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoY29weV90b191c2VyKHVhcmcsICZhbGFybSwgc2l6ZW9mKGFsYXJtKSkpCisJCQllcnIgPSAtRUZBVUxUOworCQlyZXR1cm4gZXJyOworCisJZGVmYXVsdDoKKwkJLyogRmluYWxseSB0cnkgdGhlIGRyaXZlcidzIGlvY3RsIGludGVyZmFjZSAqLworICAgICAgICBtdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCQlpZiAob3BzLT5pb2N0bCkgeworCQkJZXJyID0gb3BzLT5pb2N0bChydGMtPmRldi5wYXJlbnQsIGNtZCwgYXJnKTsKKwkJCWlmIChlcnIgPT0gLUVOT0lPQ1RMQ01EKQorCQkJCWVyciA9IC1FTk9UVFk7CisJCX0gZWxzZQorCQkJZXJyID0gLUVOT1RUWTsKKwkJLy9icmVhazsKKwkJcmV0dXJuIGVycjsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJ0Y19kZXZfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJnJ0Yy0+YXN5bmNfcXVldWUpOworfQorCitzdGF0aWMgaW50IHJ0Y19kZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogV2Ugc2h1dCBkb3duIHRoZSByZXBlYXRpbmcgSVJRcyB0aGF0IHVzZXJzcGFjZSBlbmFibGVkLAorCSAqIHNpbmNlIG5vdGhpbmcgaXMgbGlzdGVuaW5nIHRvIHRoZW0uCisJICogIC0gVXBkYXRlIChVSUUpIC4uLiBjdXJyZW50bHkgb25seSBtYW5hZ2VkIHRocm91Z2ggaW9jdGxzCisJICogIC0gUGVyaW9kaWMgKFBJRSkgLi4uIGFsc28gdXNlZCB0aHJvdWdoIHJ0Y18qKCkgaW50ZXJmYWNlIGNhbGxzCisJICoKKwkgKiBMZWF2ZSB0aGUgYWxhcm0gYWxvbmU7IGl0IG1heSBiZSBzZXQgdG8gdHJpZ2dlciBhIHN5c3RlbSB3YWtldXAKKwkgKiBsYXRlciwgb3IgYmUgdXNlZCBieSBrZXJuZWwgY29kZSwgYW5kIGlzIGEgb25lLXNob3QgZXZlbnQgYW55d2F5LgorCSAqLworCisJLyogS2VlcCBpb2N0bCB1bnRpbCBhbGwgZHJpdmVycyBhcmUgY29udmVydGVkICovCisJcnRjX2Rldl9pb2N0bChmaWxlLCBSVENfVUlFX09GRiwgMCk7CisJcnRjX3VwZGF0ZV9pcnFfZW5hYmxlKHJ0YywgMCk7CisJcnRjX2lycV9zZXRfc3RhdGUocnRjLCBOVUxMLCAwKTsKKworCWlmIChydGMtPm9wcy0+cmVsZWFzZSkKKwkJcnRjLT5vcHMtPnJlbGVhc2UocnRjLT5kZXYucGFyZW50KTsKKworCWNsZWFyX2JpdF91bmxvY2soUlRDX0RFVl9CVVNZLCAmcnRjLT5mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0Y19kZXZfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcnRjX2Rldl9yZWFkLAorCS5wb2xsCQk9IHJ0Y19kZXZfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwJPSBydGNfZGV2X2lvY3RsLAorCS5vcGVuCQk9IHJ0Y19kZXZfb3BlbiwKKwkucmVsZWFzZQk9IHJ0Y19kZXZfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHJ0Y19kZXZfZmFzeW5jLAorfTsKKworLyogaW5zZXJ0aW9uL3JlbW92YWwgaG9va3MgKi8KKwordm9pZCBydGNfZGV2X3ByZXBhcmUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKK3sKKwlpZiAoIXJ0Y19kZXZ0KQorCQlyZXR1cm47CisKKwlpZiAocnRjLT5pZCA+PSBSVENfREVWX01BWCkgeworCQlwcl9kZWJ1ZygiJXM6IHRvbyBtYW55IFJUQyBkZXZpY2VzXG4iLCBydGMtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcnRjLT5kZXYuZGV2dCA9IE1LREVWKE1BSk9SKHJ0Y19kZXZ0KSwgcnRjLT5pZCk7CisKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCisJSU5JVF9XT1JLKCZydGMtPnVpZV90YXNrLCBydGNfdWllX3Rhc2spOworCXNldHVwX3RpbWVyKCZydGMtPnVpZV90aW1lciwgcnRjX3VpZV90aW1lciwgKHVuc2lnbmVkIGxvbmcpcnRjKTsKKyNlbmRpZgorCisJY2Rldl9pbml0KCZydGMtPmNoYXJfZGV2LCAmcnRjX2Rldl9mb3BzKTsKKwlydGMtPmNoYXJfZGV2Lm93bmVyID0gcnRjLT5vd25lcjsKK30KKwordm9pZCBydGNfZGV2X2FkZF9kZXZpY2Uoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKK3sKKwlpZiAoY2Rldl9hZGQoJnJ0Yy0+Y2hhcl9kZXYsIHJ0Yy0+ZGV2LmRldnQsIDEpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIGFkZCBjaGFyIGRldmljZSAlZDolZFxuIiwKKwkJCXJ0Yy0+bmFtZSwgTUFKT1IocnRjX2RldnQpLCBydGMtPmlkKTsKKwllbHNlCisJCXByX2RlYnVnKCIlczogZGV2ICglZDolZClcbiIsIHJ0Yy0+bmFtZSwKKwkJCU1BSk9SKHJ0Y19kZXZ0KSwgcnRjLT5pZCk7Cit9CisKK3ZvaWQgcnRjX2Rldl9kZWxfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7CisJaWYgKHJ0Yy0+ZGV2LmRldnQpCisJCWNkZXZfZGVsKCZydGMtPmNoYXJfZGV2KTsKK30KKwordm9pZCBfX2luaXQgcnRjX2Rldl9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGFsbG9jX2NocmRldl9yZWdpb24oJnJ0Y19kZXZ0LCAwLCBSVENfREVWX01BWCwgInJ0YyIpOworCWlmIChlcnIgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgY2hhciBkZXYgcmVnaW9uXG4iLAorCQkJX19GSUxFX18pOworfQorCit2b2lkIF9fZXhpdCBydGNfZGV2X2V4aXQodm9pZCkKK3sKKwlpZiAocnRjX2RldnQpCisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihydGNfZGV2dCwgUlRDX0RFVl9NQVgpOworfQpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRtMzU1ZXZtLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZG0zNTVldm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ1N2FmCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRtMzU1ZXZtLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBydGMtZG0zNTVldm0uYyAtIGFjY2VzcyBiYXR0ZXJ5LWJhY2tlZCBjb3VudGVyIGluIE1TUDQzMCBmaXJtd2FyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBieSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pMmMvZG0zNTVldm1fbXNwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKworLyoKKyAqIFRoZSBNU1A0MzAgZmlybXdhcmUgb24gdGhlIERNMzU1IEVWTSB1c2VzIGEgd2F0Y2ggY3J5c3RhbCB0byBmZWVkCisgKiBhIDEgSHogY291bnRlci4gIFdoZW4gYSBiYWNrdXAgYmF0dGVyeSBpcyBzdXBwbGllZCwgdGhhdCBtYWtlcyBhCisgKiByZWFzb25hYmxlIFJUQyBmb3IgYXBwbGljYXRpb25zIHdoZXJlIGFsYXJtcyBhbmQgbm9uLU5UUCBkcmlmdAorICogY29tcGVuc2F0aW9uIGFyZW4ndCBpbXBvcnRhbnQuCisgKgorICogVGhlIG9ubHkgcmVhbCBnbGl0Y2ggaXMgdGhlIGluYWJpbGl0eSB0byByZWFkIG9yIHdyaXRlIGFsbCBmb3VyCisgKiBjb3VudGVyIGJ5dGVzIGF0b21pY2FsbHk6ICB0aGUgY291bnQgbWF5IGluY3JlbWVudCBpbiB0aGUgbWlkZGxlCisgKiBvZiBhbiBvcGVyYXRpb24sIGNhdXNpbmcgdHJvdWJsZSB3aGVuIHRoZSBMU0Igcm9sbHMgb3Zlci4KKyAqCisgKiBUaGlzIGRyaXZlciB3YXMgdGVzdGVkIHdpdGggZmlybXdhcmUgcmV2aXNpb24gQTQuCisgKi8KK3VuaW9uIGV2bV90aW1lIHsKKwl1OAlieXRlc1s0XTsKKwl1MzIJdmFsdWU7Cit9OworCitzdGF0aWMgaW50IGRtMzU1ZXZtX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuaW9uIGV2bV90aW1lCXRpbWU7CisJaW50CQlzdGF0dXM7CisJaW50CQl0cmllcyA9IDA7CisKKwlkbyB7CisJCS8qCisJCSAqIFJlYWQgTFNCKDApIHRvIE1TQigzKSBieXRlcy4gIERlZmVuZCBhZ2FpbnN0IHRoZSBjb3VudGVyCisJCSAqIHJvbGxpbmcgb3ZlciBieSByZS1yZWFkaW5nIHVudGlsIHRoZSB2YWx1ZSBpcyBzdGFibGUsCisJCSAqIGFuZCBhc3N1bWluZyB0aGUgZm91ciByZWFkcyB0YWtlIGF0IG1vc3QgYSBmZXcgc2Vjb25kcy4KKwkJICovCisJCXN0YXR1cyA9IGRtMzU1ZXZtX21zcF9yZWFkKERNMzU1RVZNX01TUF9SVENfMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJaWYgKHRyaWVzICYmIHRpbWUuYnl0ZXNbMF0gPT0gc3RhdHVzKQorCQkJYnJlYWs7CisJCXRpbWUuYnl0ZXNbMF0gPSBzdGF0dXM7CisKKwkJc3RhdHVzID0gZG0zNTVldm1fbXNwX3JlYWQoRE0zNTVFVk1fTVNQX1JUQ18xKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlpZiAodHJpZXMgJiYgdGltZS5ieXRlc1sxXSA9PSBzdGF0dXMpCisJCQlicmVhazsKKwkJdGltZS5ieXRlc1sxXSA9IHN0YXR1czsKKworCQlzdGF0dXMgPSBkbTM1NWV2bV9tc3BfcmVhZChETTM1NUVWTV9NU1BfUlRDXzIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCWlmICh0cmllcyAmJiB0aW1lLmJ5dGVzWzJdID09IHN0YXR1cykKKwkJCWJyZWFrOworCQl0aW1lLmJ5dGVzWzJdID0gc3RhdHVzOworCisJCXN0YXR1cyA9IGRtMzU1ZXZtX21zcF9yZWFkKERNMzU1RVZNX01TUF9SVENfMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJaWYgKHRyaWVzICYmIHRpbWUuYnl0ZXNbM10gPT0gc3RhdHVzKQorCQkJYnJlYWs7CisJCXRpbWUuYnl0ZXNbM10gPSBzdGF0dXM7CisKKwl9IHdoaWxlICgrK3RyaWVzIDwgNSk7CisKKwlkZXZfZGJnKGRldiwgInJlYWQgdGltZXN0YW1wICUwOHhcbiIsIHRpbWUudmFsdWUpOworCisJcnRjX3RpbWVfdG9fdG0obGUzMl90b19jcHUodGltZS52YWx1ZSksIHRtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbTM1NWV2bV9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuaW9uIGV2bV90aW1lCXRpbWU7CisJdW5zaWduZWQgbG9uZwl2YWx1ZTsKKwlpbnQJCXN0YXR1czsKKworCXJ0Y190bV90b190aW1lKHRtLCAmdmFsdWUpOworCXRpbWUudmFsdWUgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisKKwlkZXZfZGJnKGRldiwgIndyaXRlIHRpbWVzdGFtcCAlMDh4XG4iLCB0aW1lLnZhbHVlKTsKKworCS8qCisJICogUkVWSVNJVCBoYW5kbGUgbm9uLWF0b21pYyB3cml0ZXMgLi4uIG1heWJlIGp1c3QgcmV0cnkgdW50aWwKKwkgKiBieXRlWzFdIHN0aWNrcyAobm8gcm9sbG92ZXIpPworCSAqLworCXN0YXR1cyA9IGRtMzU1ZXZtX21zcF93cml0ZSh0aW1lLmJ5dGVzWzBdLCBETTM1NUVWTV9NU1BfUlRDXzApOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJc3RhdHVzID0gZG0zNTVldm1fbXNwX3dyaXRlKHRpbWUuYnl0ZXNbMV0sIERNMzU1RVZNX01TUF9SVENfMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSBkbTM1NWV2bV9tc3Bfd3JpdGUodGltZS5ieXRlc1syXSwgRE0zNTVFVk1fTVNQX1JUQ18yKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXN0YXR1cyA9IGRtMzU1ZXZtX21zcF93cml0ZSh0aW1lLmJ5dGVzWzNdLCBETTM1NUVWTV9NU1BfUlRDXzMpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkbTM1NWV2bV9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBkbTM1NWV2bV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGRtMzU1ZXZtX3J0Y19zZXRfdGltZSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRtMzU1ZXZtX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsCisJCQkJICAmcGRldi0+ZGV2LCAmZG0zNTVldm1fcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZWdpc3RlciBSVEMgZGV2aWNlLCBlcnIgJWxkXG4iLAorCQkJUFRSX0VSUihydGMpKTsKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkbTM1NWV2bV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJMkMgaXMgdXNlZCB0byB0YWxrIHRvIHRoZSBNU1A0MzAsIGJ1dCB0aGlzIHBsYXRmb3JtIGRldmljZSBpcworICogZXhwb3NlZCBieSBhbiBNRkQgZHJpdmVyIHRoYXQgbWFuYWdlcyBJMkMgY29tbXVuaWNhdGlvbnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJ0Y19kbTM1NWV2bV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGRtMzU1ZXZtX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRtMzU1ZXZtX3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSAicnRjLWRtMzU1ZXZtIiwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihydGNfZG0zNTVldm1fZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Y2Q4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBEYWxsYXMgRFMxMjE2IFJUQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIEJvZ2VuZG9lcmZlcgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIiCisKK3N0cnVjdCBkczEyMTZfcmVncyB7CisJdTggdHNlYzsKKwl1OCBzZWM7CisJdTggbWluOworCXU4IGhvdXI7CisJdTggd2RheTsKKwl1OCBtZGF5OworCXU4IG1vbnRoOworCXU4IHllYXI7Cit9OworCisjZGVmaW5lIERTMTIxNl9IT1VSXzEyMjQJKDEgPDwgNykKKyNkZWZpbmUgRFMxMjE2X0hPVVJfQU1QTQkoMSA8PCA1KQorCitzdHJ1Y3QgZHMxMjE2X3ByaXYgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKK307CisKK3N0YXRpYyBjb25zdCB1OCBtYWdpY1tdID0geworCTB4YzUsIDB4M2EsIDB4YTMsIDB4NWMsIDB4YzUsIDB4M2EsIDB4YTMsIDB4NWMKK307CisKKy8qCisgKiBSZWFkIHRoZSA2NCBiaXQgd2UnZCBsaWtlIHRvIGhhdmUgLSBJdCBhIHNlcmllcworICogb2YgNjQgYml0cyBzaG93aW5nIHVwIGluIHRoZSBMU0Igb2YgdGhlIGJhc2UgcmVnaXN0ZXIuCisgKgorICovCitzdGF0aWMgdm9pZCBkczEyMTZfcmVhZCh1OCBfX2lvbWVtICppb2FkZHIsIHU4ICpidWYpCit7CisJdW5zaWduZWQgY2hhciBjOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQljID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWMgfD0gKHJlYWRiKGlvYWRkcikgJiAweDEpIDw8IGo7CisJCWJ1ZltpXSA9IGM7CisJfQorfQorCitzdGF0aWMgdm9pZCBkczEyMTZfd3JpdGUodTggX19pb21lbSAqaW9hZGRyLCBjb25zdCB1OCAqYnVmKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYyA9IGJ1ZltpXTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJd3JpdGViKGMsIGlvYWRkcik7CisJCQljID0gYyA+PiAxOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHU4IF9faW9tZW0gKmlvYWRkcikKK3sKKwkvKiBSZXNldCBtYWdpYyBwb2ludGVyICovCisJcmVhZGIoaW9hZGRyKTsKKwkvKiBXcml0ZSA2NCBiaXQgbWFnaWMgdG8gRFMxMjE2ICovCisJZHMxMjE2X3dyaXRlKGlvYWRkciwgbWFnaWMpOworfQorCitzdGF0aWMgaW50IGRzMTIxNl9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRzMTIxNl9yZWdzIHJlZ3M7CisKKwlkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHByaXYtPmlvYWRkcik7CisJZHMxMjE2X3JlYWQocHJpdi0+aW9hZGRyLCAodTggKikmcmVncyk7CisKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihyZWdzLnNlYyk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4ocmVncy5taW4pOworCWlmIChyZWdzLmhvdXIgJiBEUzEyMTZfSE9VUl8xMjI0KSB7CisJCS8qIEFNL1BNIG1vZGUgKi8KKwkJdG0tPnRtX2hvdXIgPSBiY2QyYmluKHJlZ3MuaG91ciAmIDB4MWYpOworCQlpZiAocmVncy5ob3VyICYgRFMxMjE2X0hPVVJfQU1QTSkKKwkJCXRtLT50bV9ob3VyICs9IDEyOworCX0gZWxzZQorCQl0bS0+dG1faG91ciA9IGJjZDJiaW4ocmVncy5ob3VyICYgMHgzZik7CisJdG0tPnRtX3dkYXkgPSAocmVncy53ZGF5ICYgNykgLSAxOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihyZWdzLm1kYXkgJiAweDNmKTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihyZWdzLm1vbnRoICYgMHgxZik7CisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHJlZ3MueWVhcik7CisJaWYgKHRtLT50bV95ZWFyIDwgNzApCisJCXRtLT50bV95ZWFyICs9IDEwMDsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IGRzMTIxNl9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZHMxMjE2X3JlZ3MgcmVnczsKKworCWRzMTIxNl9zd2l0Y2hfZHNfdG9fY2xvY2socHJpdi0+aW9hZGRyKTsKKwlkczEyMTZfcmVhZChwcml2LT5pb2FkZHIsICh1OCAqKSZyZWdzKTsKKworCXJlZ3MudHNlYyA9IDA7IC8qIGNsZWFyIDAuMSBhbmQgMC4wMSBzZWNvbmRzICovCisJcmVncy5zZWMgPSBiaW4yYmNkKHRtLT50bV9zZWMpOworCXJlZ3MubWluID0gYmluMmJjZCh0bS0+dG1fbWluKTsKKwlyZWdzLmhvdXIgJj0gRFMxMjE2X0hPVVJfMTIyNDsKKwlpZiAocmVncy5ob3VyICYmIHRtLT50bV9ob3VyID4gMTIpIHsKKwkJcmVncy5ob3VyIHw9IERTMTIxNl9IT1VSX0FNUE07CisJCXRtLT50bV9ob3VyIC09IDEyOworCX0KKwlyZWdzLmhvdXIgfD0gYmluMmJjZCh0bS0+dG1faG91cik7CisJcmVncy53ZGF5ICY9IH43OworCXJlZ3Mud2RheSB8PSB0bS0+dG1fd2RheTsKKwlyZWdzLm1kYXkgPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlyZWdzLm1vbnRoID0gYmluMmJjZCh0bS0+dG1fbW9uKTsKKwlyZWdzLnllYXIgPSBiaW4yYmNkKHRtLT50bV95ZWFyICUgMTAwKTsKKworCWRzMTIxNl9zd2l0Y2hfZHNfdG9fY2xvY2socHJpdi0+aW9hZGRyKTsKKwlkczEyMTZfd3JpdGUocHJpdi0+aW9hZGRyLCAodTggKikmcmVncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEyMTZfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gZHMxMjE2X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gZHMxMjE2X3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTIxNl9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXY7CisJaW50IHJldCA9IDA7CisJdTggZHVtbXlbOF07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwcml2ID0ga3phbGxvYyhzaXplb2YgKnByaXYsIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCXByaXYtPnNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcHJpdi0+c2l6ZSwgcGRldi0+bmFtZSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJcHJpdi0+YmFzZWFkZHIgPSByZXMtPnN0YXJ0OworCXByaXYtPmlvYWRkciA9IGlvcmVtYXAocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWlmICghcHJpdi0+aW9hZGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlwcml2LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEyMTYiLCAmcGRldi0+ZGV2LAorCQkJCSAgJmRzMTIxNl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihwcml2LT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+cnRjKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZHVtbXkgcmVhZCB0byBnZXQgY2xvY2sgaW50byBhIGtub3duIHN0YXRlICovCisJZHMxMjE2X3JlYWQocHJpdi0+aW9hZGRyLCBkdW1teSk7CisJcmV0dXJuIDA7CisKK291dDoKKwlpZiAocHJpdi0+aW9hZGRyKQorCQlpb3VubWFwKHByaXYtPmlvYWRkcik7CisJaWYgKHByaXYtPmJhc2VhZGRyKQorCQlyZWxlYXNlX21lbV9yZWdpb24ocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWtmcmVlKHByaXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGRzMTIxNl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+cnRjKTsKKwlpb3VubWFwKHByaXYtPmlvYWRkcik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHMxMjE2X3J0Y19wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1kczEyMTYiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJCT0gX19leGl0X3AoZHMxMjE2X3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHMxMjE2X3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZHMxMjE2X3J0Y19wbGF0Zm9ybV9kcml2ZXIsIGRzMTIxNl9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHMxMjE2X3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzMTIxNl9ydGNfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIEJvZ2VuZG9lcmZlciA8dHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRFMxMjE2IFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLWRzMTIxNiIpOworCittb2R1bGVfaW5pdChkczEyMTZfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoZHMxMjE2X3J0Y19leGl0KTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczEyODYuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczEyODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTBjM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTI4Ni5jCkBAIC0wLDAgKzEsNDA1IEBACisvKgorICogRFMxMjg2IFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwIFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAyMDA4IFRob21hcyBCb2dlbmRvZXJmZXIKKyAqCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF1bCBHb3J0bWFrZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvZHMxMjg2Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjAiCisKK3N0cnVjdCBkczEyODZfcHJpdiB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl1MzIgX19pb21lbSAqcnRjcmVnczsKKwlzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJhc2VhZGRyOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBpbmxpbmUgdTggZHMxMjg2X3J0Y19yZWFkKHN0cnVjdCBkczEyODZfcHJpdiAqcHJpdiwgaW50IHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoJnByaXYtPnJ0Y3JlZ3NbcmVnXSkgJiAweGZmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHMxMjg2X3J0Y193cml0ZShzdHJ1Y3QgZHMxMjg2X3ByaXYgKnByaXYsIHU4IGRhdGEsIGludCByZWcpCit7CisJX19yYXdfd3JpdGVsKGRhdGEsICZwcml2LT5ydGNyZWdzW3JlZ10pOworfQorCisKK3N0YXRpYyBpbnQgZHMxMjg2X2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgZHMxMjg2X3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJLyogQWxsb3cgb3IgbWFzayBhbGFybSBpbnRlcnJ1cHRzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl2YWwgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0NNRCk7CisJaWYgKGVuYWJsZWQpCisJCXZhbCAmPSAgflJUQ19URE07CisJZWxzZQorCQl2YWwgfD0gIFJUQ19URE07CisJZHMxMjg2X3J0Y193cml0ZShwcml2LCB2YWwsIFJUQ19DTUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVgorCitzdGF0aWMgaW50IGRzMTI4Nl9pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBkczEyODZfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX1dJRV9PRkY6CisJCS8qIE1hc2sgd2F0Y2hkb2cgaW50LiBlbmFiLiBiaXQJKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19DTUQpOworCQl2YWwgfD0gUlRDX1dBTTsKKwkJZHMxMjg2X3J0Y193cml0ZShwcml2LCB2YWwsIFJUQ19DTUQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgUlRDX1dJRV9PTjoKKwkJLyogQWxsb3cgd2F0Y2hkb2cgaW50ZXJydXB0cy4JKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19DTUQpOworCQl2YWwgJj0gflJUQ19XQU07CisJCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgdmFsLCBSVENfQ01EKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgZHMxMjg2X2lvY3RsICAgIE5VTEwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIGludCBkczEyODZfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBkczEyODZfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgbW9udGgsIGNtZCwgYW1vZGU7CisJY29uc3QgY2hhciAqczsKKworCW1vbnRoID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19NT05USCk7CisJc2VxX3ByaW50ZihzZXEsCisJCSAgICJvc2NpbGxhdG9yXHQ6ICVzXG4iCisJCSAgICJzcXVhcmVfd2F2ZVx0OiAlc1xuIiwKKwkJICAgKG1vbnRoICYgUlRDX0VPU0MpID8gImRpc2FibGVkIiA6ICJlbmFibGVkIiwKKwkJICAgKG1vbnRoICYgUlRDX0VTUVcpID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7CisKKwlhbW9kZSA9ICgoZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19NSU5VVEVTX0FMQVJNKSAmIDB4ODApID4+IDUpIHwKKwkJKChkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0hPVVJTX0FMQVJNKSAmIDB4ODApID4+IDYpIHwKKwkJKChkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0RBWV9BTEFSTSkgJiAweDgwKSA+PiA3KTsKKwlzd2l0Y2ggKGFtb2RlKSB7CisJY2FzZSA3OgorCQlzID0gImVhY2ggbWludXRlIjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzID0gIm1pbnV0ZXMgbWF0Y2giOworCQlicmVhazsKKwljYXNlIDE6CisJCXMgPSAiaG91cnMgYW5kIG1pbnV0ZXMgbWF0Y2giOworCQlicmVhazsKKwljYXNlIDA6CisJCXMgPSAiZGF5cywgaG91cnMgYW5kIG1pbnV0ZXMgbWF0Y2giOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzID0gImludmFsaWQiOworCQlicmVhazsKKwl9CisJc2VxX3ByaW50ZihzZXEsICJhbGFybV9tb2RlXHQ6ICVzXG4iLCBzKTsKKworCWNtZCA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfQ01EKTsKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgImFsYXJtX2VuYWJsZVx0OiAlc1xuIgorCQkgICAid2RvZ19hbGFybVx0OiAlc1xuIgorCQkgICAiYWxhcm1fbWFza1x0OiAlc1xuIgorCQkgICAid2RvZ19hbGFybV9tYXNrXHQ6ICVzXG4iCisJCSAgICJpbnRlcnJ1cHRfbW9kZVx0OiAlc1xuIgorCQkgICAiSU5UQl9tb2RlXHQ6ICVzX2FjdGl2ZVxuIgorCQkgICAiaW50ZXJydXB0X3BpbnNcdDogJXNcbiIsCisJCSAgIChjbWQgJiBSVENfVERGKSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgKGNtZCAmIFJUQ19XQUYpID8gInllcyIgOiAibm8iLAorCQkgICAoY21kICYgUlRDX1RETSkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAorCQkgICAoY21kICYgUlRDX1dBTSkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAorCQkgICAoY21kICYgUlRDX1BVX0xWTCkgPyAicHVsc2UiIDogImxldmVsIiwKKwkJICAgKGNtZCAmIFJUQ19JQkhfTE8pID8gImxvdyIgOiAiaGlnaCIsCisJCSAgIChjbWQgJiBSVENfSVBTVykgPyAidW5zd2FwcGVkIiA6ICJzd2FwcGVkIik7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIGRzMTI4Nl9wcm9jICAgICBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBkczEyODZfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgZHMxMjg2X3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdWlwX3dhdGNoZG9nID0gamlmZmllczsKKworCS8qCisJICogcmVhZCBSVEMgb25jZSBhbnkgdXBkYXRlIGluIHByb2dyZXNzIGlzIGRvbmUuIFRoZSB1cGRhdGUKKwkgKiBjYW4gdGFrZSBqdXN0IG92ZXIgMm1zLiBXZSB3YWl0IDEwIHRvIDIwbXMuIFRoZXJlIGlzIG5vIG5lZWQgdG8KKwkgKiB0byBwb2xsLXdhaXQgKHVwIHRvIDFzIC0gZWVjY2NoKSBmb3IgdGhlIGZhbGxpbmcgZWRnZSBvZiBSVENfVUlQLgorCSAqIElmIHlvdSBuZWVkIHRvIGtub3cgKmV4YWN0bHkqIHdoZW4gYSBzZWNvbmQgaGFzIHN0YXJ0ZWQsIGVuYWJsZQorCSAqIHBlcmlvZGljIHVwZGF0ZSBjb21wbGV0ZSBpbnRlcnJ1cHRzLCAodmlhIGlvY3RsKSBhbmQgdGhlbgorCSAqIGltbWVkaWF0ZWx5IHJlYWQgL2Rldi9ydGMgd2hpY2ggd2lsbCBibG9jayB1bnRpbCB5b3UgZ2V0IHRoZSBJUlEuCisJICogT25jZSB0aGUgcmVhZCBjbGVhcnMsIHJlYWQgdGhlIFJUQyB0aW1lIChhZ2FpbiB2aWEgaW9jdGwpLiBFYXN5LgorCSAqLworCisJaWYgKGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfQ01EKSAmIFJUQ19URSkKKwkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHVpcF93YXRjaGRvZyArIDIqSFovMTAwKSkKKwkJCWJhcnJpZXIoKTsKKworCS8qCisJICogT25seSB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBmcm9tIHRoZSBSVEMgYXJlIHNldC4gV2UgbGVhdmUKKwkgKiB0bV93ZGF5LCB0bV95ZGF5IGFuZCB0bV9pc2RzdCB1bnRvdWNoZWQuIEV2ZW4gdGhvdWdoIHRoZQorCSAqIFJUQyBoYXMgUlRDX0RBWV9PRl9XRUVLLCB3ZSBpZ25vcmUgaXQsIGFzIGl0IGlzIG9ubHkgdXBkYXRlZAorCSAqIGJ5IHRoZSBSVEMgd2hlbiBpbml0aWFsbHkgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzYXZlX2NvbnRyb2wgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0NNRCk7CisJZHMxMjg2X3J0Y193cml0ZShwcml2LCAoc2F2ZV9jb250cm9sfFJUQ19URSksIFJUQ19DTUQpOworCisJdG0tPnRtX3NlYyA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfU0VDT05EUyk7CisJdG0tPnRtX21pbiA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfTUlOVVRFUyk7CisJdG0tPnRtX2hvdXIgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0hPVVJTKSAmIDB4M2Y7CisJdG0tPnRtX21kYXkgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0RBVEUpOworCXRtLT50bV9tb24gPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX01PTlRIKSAmIDB4MWY7CisJdG0tPnRtX3llYXIgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX1lFQVIpOworCisJZHMxMjg2X3J0Y193cml0ZShwcml2LCBzYXZlX2NvbnRyb2wsIFJUQ19DTUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHRtLT50bV9zZWMpOworCXRtLT50bV9taW4gPSBiY2QyYmluKHRtLT50bV9taW4pOworCXRtLT50bV9ob3VyID0gYmNkMmJpbih0bS0+dG1faG91cik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHRtLT50bV9tZGF5KTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbih0bS0+dG1fbW9uKTsKKwl0bS0+dG1feWVhciA9IGJjZDJiaW4odG0tPnRtX3llYXIpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKwlpZiAodG0tPnRtX3llYXIgPCA0NSkKKwkJdG0tPnRtX3llYXIgKz0gMzA7CisJdG0tPnRtX3llYXIgKz0gNDA7CisJaWYgKHRtLT50bV95ZWFyIDwgNzApCisJCXRtLT50bV95ZWFyICs9IDEwMDsKKworCXRtLT50bV9tb24tLTsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IGRzMTI4Nl9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IGRzMTI4Nl9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgY2hhciBtb24sIGRheSwgaHJzLCBtaW4sIHNlYzsKKwl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbDsKKwl1bnNpZ25lZCBpbnQgeXJzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl5cnMgPSB0bS0+dG1feWVhciArIDE5MDA7CisJbW9uID0gdG0tPnRtX21vbiArIDE7ICAgLyogdG1fbW9uIHN0YXJ0cyBhdCB6ZXJvICovCisJZGF5ID0gdG0tPnRtX21kYXk7CisJaHJzID0gdG0tPnRtX2hvdXI7CisJbWluID0gdG0tPnRtX21pbjsKKwlzZWMgPSB0bS0+dG1fc2VjOworCisJaWYgKHlycyA8IDE5NzApCisJCXJldHVybiAtRUlOVkFMOworCisJeXJzIC09IDE5NDA7CisJaWYgKHlycyA+IDI1NSkgICAgLyogVGhleSBhcmUgdW5zaWduZWQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoeXJzID49IDEwMCkKKwkJeXJzIC09IDEwMDsKKworCXNlYyA9IGJpbjJiY2Qoc2VjKTsKKwltaW4gPSBiaW4yYmNkKG1pbik7CisJaHJzID0gYmluMmJjZChocnMpOworCWRheSA9IGJpbjJiY2QoZGF5KTsKKwltb24gPSBiaW4yYmNkKG1vbik7CisJeXJzID0gYmluMmJjZCh5cnMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzYXZlX2NvbnRyb2wgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0NNRCk7CisJZHMxMjg2X3J0Y193cml0ZShwcml2LCAoc2F2ZV9jb250cm9sfFJUQ19URSksIFJUQ19DTUQpOworCisJZHMxMjg2X3J0Y193cml0ZShwcml2LCB5cnMsIFJUQ19ZRUFSKTsKKwlkczEyODZfcnRjX3dyaXRlKHByaXYsIG1vbiwgUlRDX01PTlRIKTsKKwlkczEyODZfcnRjX3dyaXRlKHByaXYsIGRheSwgUlRDX0RBVEUpOworCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgaHJzLCBSVENfSE9VUlMpOworCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgbWluLCBSVENfTUlOVVRFUyk7CisJZHMxMjg2X3J0Y193cml0ZShwcml2LCBzZWMsIFJUQ19TRUNPTkRTKTsKKwlkczEyODZfcnRjX3dyaXRlKHByaXYsIDAsIFJUQ19IVU5EUkVEVEhfU0VDT05EKTsKKworCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgc2F2ZV9jb250cm9sLCBSVENfQ01EKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxMjg2X3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxtKQoreworCXN0cnVjdCBkczEyODZfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFRoYXQKKwkgKiBtZWFucyBvbmx5IHRtX3dkYXksIHRtX2hvdXIsIHRtX21pbi4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWFsbS0+dGltZS50bV9taW4gPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX01JTlVURVNfQUxBUk0pICYgMHg3ZjsKKwlhbG0tPnRpbWUudG1faG91ciA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfSE9VUlNfQUxBUk0pICAmIDB4MWY7CisJYWxtLT50aW1lLnRtX3dkYXkgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0RBWV9BTEFSTSkgICAgJiAweDA3OworCWNtZCA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfQ01EKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlhbG0tPnRpbWUudG1fbWluID0gYmNkMmJpbihhbG0tPnRpbWUudG1fbWluKTsKKwlhbG0tPnRpbWUudG1faG91ciA9IGJjZDJiaW4oYWxtLT50aW1lLnRtX2hvdXIpOworCWFsbS0+dGltZS50bV9zZWMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTI4Nl9zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxtKQoreworCXN0cnVjdCBkczEyODZfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgaHJzLCBtaW4sIHNlYzsKKworCWhycyA9IGFsbS0+dGltZS50bV9ob3VyOworCW1pbiA9IGFsbS0+dGltZS50bV9taW47CisJc2VjID0gYWxtLT50aW1lLnRtX3NlYzsKKworCWlmIChocnMgPj0gMjQpCisJCWhycyA9IDB4ZmY7CisKKwlpZiAobWluID49IDYwKQorCQltaW4gPSAweGZmOworCisJaWYgKHNlYyAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1pbiA9IGJpbjJiY2QobWluKTsKKwlocnMgPSBiaW4yYmNkKGhycyk7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgaHJzLCBSVENfSE9VUlNfQUxBUk0pOworCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgbWluLCBSVENfTUlOVVRFU19BTEFSTSk7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEyODZfb3BzID0geworCS5pb2N0bAkJPSBkczEyODZfaW9jdGwsCisJLnByb2MJCT0gZHMxMjg2X3Byb2MsCisJLnJlYWRfdGltZQk9IGRzMTI4Nl9yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gZHMxMjg2X3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gZHMxMjg2X3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IGRzMTI4Nl9zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBkczEyODZfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRzMTI4Nl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGRzMTI4Nl9wcml2ICpwcml2OworCWludCByZXQgPSAwOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEyODZfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHByaXYtPnNpemUsIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCXByaXYtPmJhc2VhZGRyID0gcmVzLT5zdGFydDsKKwlwcml2LT5ydGNyZWdzID0gaW9yZW1hcChwcml2LT5iYXNlYWRkciwgcHJpdi0+c2l6ZSk7CisJaWYgKCFwcml2LT5ydGNyZWdzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMjg2IiwgJnBkZXYtPmRldiwKKwkJCQkgICZkczEyODZfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBvdXQ7CisJfQorCXByaXYtPnJ0YyA9IHJ0YzsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmIChwcml2LT5ydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlmIChwcml2LT5ydGNyZWdzKQorCQlpb3VubWFwKHByaXYtPnJ0Y3JlZ3MpOworCWlmIChwcml2LT5iYXNlYWRkcikKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEyODZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRzMTI4Nl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+cnRjKTsKKwlpb3VubWFwKHByaXYtPnJ0Y3JlZ3MpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwcml2LT5iYXNlYWRkciwgcHJpdi0+c2l6ZSk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRzMTI4Nl9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1kczEyODYiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBkczEyODZfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczEyODZfcmVtb3ZlKSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZHMxMjg2X3BsYXRmb3JtX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBCb2dlbmRvZXJmZXIgPHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRTMTI4NiBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1kczEyODYiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczEzMDIuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczEzMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ2Mzg5Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTMwMi5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogRGFsbGFzIERTMTMwMiBSVEMgU3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgRGF2aWQgTWNDdWxsb3VnaAorICogIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworI2RlZmluZSBEUlZfTkFNRQkicnRjLWRzMTMwMiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMS4xIgorCisjZGVmaW5lCVJUQ19DTURfUkVBRAkweDgxCQkvKiBSZWFkIGNvbW1hbmQgKi8KKyNkZWZpbmUJUlRDX0NNRF9XUklURQkweDgwCQkvKiBXcml0ZSBjb21tYW5kICovCisKKyNkZWZpbmUgUlRDX0FERFJfUkFNMAkweDIwCQkvKiBBZGRyZXNzIG9mIFJBTTAgKi8KKyNkZWZpbmUgUlRDX0FERFJfVENSCTB4MDgJCS8qIEFkZHJlc3Mgb2YgdHJpY2tsZSBjaGFyZ2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0FERFJfWUVBUgkweDA2CQkvKiBBZGRyZXNzIG9mIHllYXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0FERFJfREFZCTB4MDUJCS8qIEFkZHJlc3Mgb2YgZGF5IG9mIHdlZWsgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0FERFJfTU9OCTB4MDQJCS8qIEFkZHJlc3Mgb2YgbW9udGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0FERFJfREFURQkweDAzCQkvKiBBZGRyZXNzIG9mIGRheSBvZiBtb250aCByZWdpc3RlciAqLworI2RlZmluZQlSVENfQUREUl9IT1VSCTB4MDIJCS8qIEFkZHJlc3Mgb2YgaG91ciByZWdpc3RlciAqLworI2RlZmluZQlSVENfQUREUl9NSU4JMHgwMQkJLyogQWRkcmVzcyBvZiBtaW51dGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0FERFJfU0VDCTB4MDAJCS8qIEFkZHJlc3Mgb2Ygc2Vjb25kIHJlZ2lzdGVyICovCisKKyNpZmRlZiBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAKKyNpbmNsdWRlIDxhc20vcnRjLmg+CisjaW5jbHVkZSA8bWFjaC9zZWN1cmVlZGdlNTQxMC5oPgorCisjZGVmaW5lCVJUQ19SRVNFVAkweDEwMDAKKyNkZWZpbmUJUlRDX0lPREFUQQkweDA4MDAKKyNkZWZpbmUJUlRDX1NDTEsJMHgwNDAwCisKKyNkZWZpbmUgc2V0X2RwKHgpCVNFQ1VSRUVER0VfV1JJVEVfSU9QT1JUKHgsIDB4MWMwMCkKKyNkZWZpbmUgZ2V0X2RwKCkJU0VDVVJFRURHRV9SRUFEX0lPUE9SVCgpCisjZGVmaW5lIGRzMTMwMl9zZXRfdHgoKQorI2RlZmluZSBkczEzMDJfc2V0X3J4KCkKKworc3RhdGljIGlubGluZSBpbnQgZHMxMzAyX2h3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRzMTMwMl9yZXNldCh2b2lkKQoreworCXNldF9kcChnZXRfZHAoKSAmIH4oUlRDX1JFU0VUIHwgUlRDX0lPREFUQSB8IFJUQ19TQ0xLKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkczEzMDJfY2xvY2sodm9pZCkKK3sKKwlzZXRfZHAoZ2V0X2RwKCkgfCBSVENfU0NMSyk7CS8qIGNsb2NrIGhpZ2ggKi8KKwlzZXRfZHAoZ2V0X2RwKCkgJiB+UlRDX1NDTEspOwkvKiBjbG9jayBsb3cgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRzMTMwMl9zdGFydCh2b2lkKQoreworCXNldF9kcChnZXRfZHAoKSB8IFJUQ19SRVNFVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkczEzMDJfc3RvcCh2b2lkKQoreworCXNldF9kcChnZXRfZHAoKSAmIH5SVENfUkVTRVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHMxMzAyX3R4Yml0KGludCBiaXQpCit7CisJc2V0X2RwKChnZXRfZHAoKSAmIH5SVENfSU9EQVRBKSB8IChiaXQgPyBSVENfSU9EQVRBIDogMCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkczEzMDJfcnhiaXQodm9pZCkKK3sKKwlyZXR1cm4gISEoZ2V0X2RwKCkgJiBSVENfSU9EQVRBKTsKK30KKworI2Vsc2UKKyNlcnJvciAiQWRkIHN1cHBvcnQgZm9yIHlvdXIgcGxhdGZvcm0iCisjZW5kaWYKKworc3RhdGljIHZvaWQgZHMxMzAyX3NlbmRiaXRzKHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGk7CisKKwlkczEzMDJfc2V0X3R4KCk7CisKKwlmb3IgKGkgPSA4OyAoaSk7IGktLSwgdmFsID4+PSAxKSB7CisJCWRzMTMwMl90eGJpdCh2YWwgJiAweDEpOworCQlkczEzMDJfY2xvY2soKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHMxMzAyX3JlY3ZiaXRzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKKworCWRzMTMwMl9zZXRfcngoKTsKKworCWZvciAoaSA9IDAsIHZhbCA9IDA7IChpIDwgOCk7IGkrKykgeworCQl2YWwgfD0gKGRzMTMwMl9yeGJpdCgpIDw8IGkpOworCQlkczEzMDJfY2xvY2soKTsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRzMTMwMl9yZWFkYnl0ZSh1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJZHMxMzAyX3Jlc2V0KCk7CisKKwlkczEzMDJfc3RhcnQoKTsKKwlkczEzMDJfc2VuZGJpdHMoKChhZGRyICYgMHgzZikgPDwgMSkgfCBSVENfQ01EX1JFQUQpOworCXZhbCA9IGRzMTMwMl9yZWN2Yml0cygpOworCWRzMTMwMl9zdG9wKCk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBkczEzMDJfd3JpdGVieXRlKHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWRzMTMwMl9yZXNldCgpOworCisJZHMxMzAyX3N0YXJ0KCk7CisJZHMxMzAyX3NlbmRiaXRzKCgoYWRkciAmIDB4M2YpIDw8IDEpIHwgUlRDX0NNRF9XUklURSk7CisJZHMxMzAyX3NlbmRiaXRzKHZhbCk7CisJZHMxMzAyX3N0b3AoKTsKK30KKworc3RhdGljIGludCBkczEzMDJfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdG0tPnRtX3NlYwk9IGJjZDJiaW4oZHMxMzAyX3JlYWRieXRlKFJUQ19BRERSX1NFQykpOworCXRtLT50bV9taW4JPSBiY2QyYmluKGRzMTMwMl9yZWFkYnl0ZShSVENfQUREUl9NSU4pKTsKKwl0bS0+dG1faG91cgk9IGJjZDJiaW4oZHMxMzAyX3JlYWRieXRlKFJUQ19BRERSX0hPVVIpKTsKKwl0bS0+dG1fd2RheQk9IGJjZDJiaW4oZHMxMzAyX3JlYWRieXRlKFJUQ19BRERSX0RBWSkpOworCXRtLT50bV9tZGF5CT0gYmNkMmJpbihkczEzMDJfcmVhZGJ5dGUoUlRDX0FERFJfREFURSkpOworCXRtLT50bV9tb24JPSBiY2QyYmluKGRzMTMwMl9yZWFkYnl0ZShSVENfQUREUl9NT04pKSAtIDE7CisJdG0tPnRtX3llYXIJPSBiY2QyYmluKGRzMTMwMl9yZWFkYnl0ZShSVENfQUREUl9ZRUFSKSk7CisKKwlpZiAodG0tPnRtX3llYXIgPCA3MCkKKwkJdG0tPnRtX3llYXIgKz0gMTAwOworCisJZGV2X2RiZyhkZXYsICIlczogdG0gaXMgc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsICIKKwkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJX19mdW5jX18sCisJCXRtLT50bV9zZWMsIHRtLT50bV9taW4sIHRtLT50bV9ob3VyLAorCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiArIDEsIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBkczEzMDJfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwkvKiBTdG9wIFJUQyAqLworCWRzMTMwMl93cml0ZWJ5dGUoUlRDX0FERFJfU0VDLCBkczEzMDJfcmVhZGJ5dGUoUlRDX0FERFJfU0VDKSB8IDB4ODApOworCisJZHMxMzAyX3dyaXRlYnl0ZShSVENfQUREUl9TRUMsIGJpbjJiY2QodG0tPnRtX3NlYykpOworCWRzMTMwMl93cml0ZWJ5dGUoUlRDX0FERFJfTUlOLCBiaW4yYmNkKHRtLT50bV9taW4pKTsKKwlkczEzMDJfd3JpdGVieXRlKFJUQ19BRERSX0hPVVIsIGJpbjJiY2QodG0tPnRtX2hvdXIpKTsKKwlkczEzMDJfd3JpdGVieXRlKFJUQ19BRERSX0RBWSwgYmluMmJjZCh0bS0+dG1fd2RheSkpOworCWRzMTMwMl93cml0ZWJ5dGUoUlRDX0FERFJfREFURSwgYmluMmJjZCh0bS0+dG1fbWRheSkpOworCWRzMTMwMl93cml0ZWJ5dGUoUlRDX0FERFJfTU9OLCBiaW4yYmNkKHRtLT50bV9tb24gKyAxKSk7CisJZHMxMzAyX3dyaXRlYnl0ZShSVENfQUREUl9ZRUFSLCBiaW4yYmNkKHRtLT50bV95ZWFyICUgMTAwKSk7CisKKwkvKiBTdGFydCBSVEMgKi8KKwlkczEzMDJfd3JpdGVieXRlKFJUQ19BRERSX1NFQywgZHMxMzAyX3JlYWRieXRlKFJUQ19BRERSX1NFQykgJiB+MHg4MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczEzMDJfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworI2lmZGVmIFJUQ19TRVRfQ0hBUkdFCisJY2FzZSBSVENfU0VUX0NIQVJHRToKKwl7CisJCWludCB0Y3NfdmFsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdGNzX3ZhbCwgKGludCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWRzMTMwMl93cml0ZWJ5dGUoUlRDX0FERFJfVENSLCAoMHhhMCB8IHRjc192YWwgKiAweGYpKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTMwMl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBkczEzMDJfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBkczEzMDJfcnRjX3NldF90aW1lLAorCS5pb2N0bAkJPSBkczEzMDJfcnRjX2lvY3RsLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHMxMzAyX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisKKwlpZiAoZHMxMzAyX2h3X2luaXQoKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW5pdCBjb21tdW5pY2F0aW9uIGNoYW5uZWwiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVzZXQgKi8KKwlkczEzMDJfcmVzZXQoKTsKKworCS8qIFdyaXRlIGEgbWFnaWMgdmFsdWUgdG8gdGhlIERTMTMwMiBSQU0sIGFuZCBzZWUgaWYgaXQgc3RpY2tzLiAqLworCWRzMTMwMl93cml0ZWJ5dGUoUlRDX0FERFJfUkFNMCwgMHg0Mik7CisJaWYgKGRzMTMwMl9yZWFkYnl0ZShSVENfQUREUl9SQU0wKSAhPSAweDQyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBwcm9iZSIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEzMDIiLCAmcGRldi0+ZGV2LAorCQkJCQkgICAmZHMxMzAyX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMTMwMl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHMxMzAyX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUlZfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRzMTMwMl9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTMwMl9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmRzMTMwMl9wbGF0Zm9ybV9kcml2ZXIsIGRzMTMwMl9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHMxMzAyX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzMTMwMl9wbGF0Zm9ybV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkczEzMDJfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoZHMxMzAyX3J0Y19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYWxsYXMgRFMxMzAyIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQsIERhdmlkIE1jQ3VsbG91Z2giKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczEzMDUuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczEzMDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODZhODY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTMwNS5jCkBAIC0wLDAgKzEsODIxIEBACisvKgorICogcnRjLWRzMTMwNS5jIC0tIGRyaXZlciBmb3IgRFMxMzA1IGFuZCBEUzEzMDYgU1BJIFJUQyBjaGlwcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZHMxMzA1Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKworLyoKKyAqIFJlZ2lzdGVycyAuLi4gbWFzayBEUzEzMDVfV1JJVEUgaW50byByZWdpc3RlciBhZGRyZXNzIHRvIHdyaXRlLAorICogb3RoZXJ3aXNlIHlvdSdyZSByZWFkaW5nIGl0LiAgQWxsIG5vbi1iaXRtYXNrIHZhbHVlcyBhcmUgQkNELgorICovCisjZGVmaW5lIERTMTMwNV9XUklURQkJMHg4MAorCisKKy8qIFJUQyBkYXRlL3RpbWUgLi4uIHRoZSBtYWluIHNwZWNpYWwgY2FzZXMgYXJlIHRoYXQgd2U6CisgKiAgLSBOZWVkIGZhbmN5ICJob3VycyIgZW5jb2RpbmcgaW4gMTJob3VyIG1vZGUKKyAqICAtIERvbid0IHJlbHkgb24gdGhlICJkYXktb2Ytd2VlayIgZmllbGQgKG9yIHRtX3dkYXkpCisgKiAgLSBBcmUgYSAyMXN0LWNlbnR1cnkgY2xvY2sgKDIwMDAgPD0geWVhciA8IDIxMDApCisgKi8KKyNkZWZpbmUgRFMxMzA1X1JUQ19MRU4JCTcJCS8qIGJ5dGVzIGZvciBSVEMgcmVncyAqLworCisjZGVmaW5lIERTMTMwNV9TRUMJCTB4MDAJCS8qIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBEUzEzMDVfTUlOCQkweDAxCisjZGVmaW5lIERTMTMwNV9IT1VSCQkweDAyCisjCWRlZmluZSBEUzEzMDVfSFJfMTIJCTB4NDAJLyogc2V0ID09IDEyIGhyIG1vZGUgKi8KKyMJZGVmaW5lIERTMTMwNV9IUl9QTQkJMHgyMAkvKiBzZXQgPT0gUE0gKDEyaHIgbW9kZSkgKi8KKyNkZWZpbmUgRFMxMzA1X1dEQVkJCTB4MDMKKyNkZWZpbmUgRFMxMzA1X01EQVkJCTB4MDQKKyNkZWZpbmUgRFMxMzA1X01PTgkJMHgwNQorI2RlZmluZSBEUzEzMDVfWUVBUgkJMHgwNgorCisKKy8qIFRoZSB0d28gYWxhcm1zIGhhdmUgb25seSBzZWMvbWluL2hvdXIvd2RheSBmaWVsZHMgKEFMTV9MRU4pLgorICogRFMxMzA1X0FMTV9ESVNBQkxFIGRpc2FibGVzIGEgbWF0Y2ggZmllbGQgKHNvbWUgY29tYm9zIGFyZSBiYWQpLgorICoKKyAqIE5PVEUgdGhhdCBzaW5jZSB3ZSBkb24ndCB1c2UgV0RBWSwgd2UgbGltaXQgb3Vyc2VsdmVzIHRvIGFsYXJtcworICogb25seSBvbmUgZGF5IGludG8gdGhlIGZ1dHVyZSAodnMgcG90ZW50aWFsbHkgdXAgdG8gYSB3ZWVrKS4KKyAqCisgKiBOT1RFIEFMU08gdGhhdCB3aGlsZSB3ZSBjb3VsZCBnZW5lcmF0ZSBvbmNlLWEtc2Vjb25kIElSUXMgKFVJRSksIHdlCisgKiBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGVtLiAgV2UnZCBlaXRoZXIgbmVlZCB0byBkbyBpdCBvbmx5IHdoZW4KKyAqIG5vIGFsYXJtIGlzIHBlbmRpbmcgKG5vdCB0aGUgc3RhbmRhcmQgbW9kZWwpLCBvciB0byB1c2UgdGhlIHNlY29uZAorICogYWxhcm0gKGltcGx5aW5nIHRoYXQgdGhpcyBpcyBhIERTMTMwNSBub3QgRFMxMzA2LCAqYW5kKiB0aGF0IGVpdGhlcgorICogaXQncyB3aXJlZCB1cCBhIHNlY29uZCBJUlEgd2Uga25vdywgb3IgdGhhdCBJTlRDTiBpcyBzZXQpCisgKi8KKyNkZWZpbmUgRFMxMzA1X0FMTV9MRU4JCTQJCS8qIGJ5dGVzIGZvciBBTE0gcmVncyAqLworI2RlZmluZSBEUzEzMDVfQUxNX0RJU0FCTEUJMHg4MAorCisjZGVmaW5lIERTMTMwNV9BTE0wKHIpCQkoMHgwNyArIChyKSkJLyogcmVnaXN0ZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIERTMTMwNV9BTE0xKHIpCQkoMHgwYiArIChyKSkKKworCisvKiB0aHJlZSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBEUzEzMDVfQ09OVFJPTF9MRU4JMwkJLyogYnl0ZXMgb2YgY29udHJvbCByZWdzICovCisKKyNkZWZpbmUgRFMxMzA1X0NPTlRST0wJCTB4MGYJCS8qIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworIwlkZWZpbmUgRFMxMzA1X25FT1NDCQkweDgwCS8qIGxvdyBlbmFibGVzIG9zY2lsbGF0b3IgKi8KKyMJZGVmaW5lIERTMTMwNV9XUAkJMHg0MAkvKiB3cml0ZSBwcm90ZWN0ICovCisjCWRlZmluZSBEUzEzMDVfSU5UQ04JCTB4MDQJLyogY2xlYXIgPT0gb25seSBpbnQwIHVzZWQgKi8KKyMJZGVmaW5lIERTMTMwNl8xSFoJCTB4MDQJLyogZW5hYmxlIDFIeiBvdXRwdXQgKi8KKyMJZGVmaW5lIERTMTMwNV9BRUkxCQkweDAyCS8qIGVuYWJsZSBBTE0xIElSUSAqLworIwlkZWZpbmUgRFMxMzA1X0FFSTAJCTB4MDEJLyogZW5hYmxlIEFMTTAgSVJRICovCisjZGVmaW5lIERTMTMwNV9TVEFUVVMJCTB4MTAKKy8qIHN0YXR1cyBoYXMganVzdCBBRUl4IGJpdHMsIG1pcnJvcmVkIGFzIElSUUZ4ICovCisjZGVmaW5lIERTMTMwNV9UUklDS0xFCQkweDExCisvKiB0cmlja2xlIGJpdHMgYXJlIGRlZmluZWQgaW4gPGxpbnV4L3NwaS9kczEzMDUuaD4gKi8KKworLyogYSBidW5jaCBvZiBOVlJBTSAqLworI2RlZmluZSBEUzEzMDVfTlZSQU1fTEVOCTk2CQkvKiBieXRlcyBvZiBOVlJBTSAqLworCisjZGVmaW5lIERTMTMwNV9OVlJBTQkJMHgyMAkJLyogcmVnaXN0ZXIgYWRkcmVzc2VzICovCisKKworc3RydWN0IGRzMTMwNSB7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKyNkZWZpbmUgRkxBR19FWElUSU5HCTAKKworCWJvb2wJCQlocjEyOworCXU4CQkJY3RybFtEUzEzMDVfQ09OVFJPTF9MRU5dOworfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVXRpbGl0aWVzIC4uLiAgdG9sZXJhdGUgMTItaG91ciBBTS9QTSBub3RhdGlvbiBpbiBjYXNlIG9mIG5vbi1MaW51eAorICogc29mdHdhcmUgKGxpa2UgYSBib290bG9hZGVyKSB3aGljaCBtYXkgcmVxdWlyZSBpdC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgYmNkMmhvdXIodTggYmNkKQoreworCWlmIChiY2QgJiBEUzEzMDVfSFJfMTIpIHsKKwkJdW5zaWduZWQJaG91ciA9IDA7CisKKwkJYmNkICY9IH5EUzEzMDVfSFJfMTI7CisJCWlmIChiY2QgJiBEUzEzMDVfSFJfUE0pIHsKKwkJCWhvdXIgPSAxMjsKKwkJCWJjZCAmPSB+RFMxMzA1X0hSX1BNOworCQl9CisJCWhvdXIgKz0gYmNkMmJpbihiY2QpOworCQlyZXR1cm4gaG91ciAtIDE7CisJfQorCXJldHVybiBiY2QyYmluKGJjZCk7Cit9CisKK3N0YXRpYyB1OCBob3VyMmJjZChib29sIGhyMTIsIGludCBob3VyKQoreworCWlmIChocjEyKSB7CisJCWhvdXIrKzsKKwkJaWYgKGhvdXIgPD0gMTIpCisJCQlyZXR1cm4gRFMxMzA1X0hSXzEyIHwgYmluMmJjZChob3VyKTsKKwkJaG91ciAtPSAxMjsKKwkJcmV0dXJuIERTMTMwNV9IUl8xMiB8IERTMTMwNV9IUl9QTSB8IGJpbjJiY2QoaG91cik7CisJfQorCXJldHVybiBiaW4yYmNkKGhvdXIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogSW50ZXJmYWNlIHRvIFJUQyBmcmFtZXdvcmsKKyAqLworCitzdGF0aWMgaW50IGRzMTMwNV9hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IGRzMTMwNQkqZHMxMzA1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTgJCWJ1ZlsyXTsKKwlsb25nCQllcnIgPSAtRUlOVkFMOworCisJYnVmWzBdID0gRFMxMzA1X1dSSVRFIHwgRFMxMzA1X0NPTlRST0w7CisJYnVmWzFdID0gZHMxMzA1LT5jdHJsWzBdOworCisJaWYgKGVuYWJsZWQpIHsKKwkJaWYgKGRzMTMwNS0+Y3RybFswXSAmIERTMTMwNV9BRUkwKQorCQkJZ290byBkb25lOworCQlidWZbMV0gfD0gRFMxMzA1X0FFSTA7CisJfSBlbHNlIHsKKwkJaWYgKCEoYnVmWzFdICYgRFMxMzA1X0FFSTApKQorCQkJZ290byBkb25lOworCQlidWZbMV0gJj0gfkRTMTMwNV9BRUkwOworCX0KKwllcnIgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKGRzMTMwNS0+c3BpLCBidWYsIHNpemVvZiBidWYsIE5VTEwsIDApOworCWlmIChlcnIgPj0gMCkKKwkJZHMxMzA1LT5jdHJsWzBdID0gYnVmWzFdOworZG9uZToKKwlyZXR1cm4gZXJyOworCit9CisKKworLyoKKyAqIEdldC9zZXQgb2YgZGF0ZSBhbmQgdGltZSBpcyBwcmV0dHkgbm9ybWFsLgorICovCisKK3N0YXRpYyBpbnQgZHMxMzA1X2dldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXN0cnVjdCBkczEzMDUJKmRzMTMwNSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4CQlhZGRyID0gRFMxMzA1X1NFQzsKKwl1OAkJYnVmW0RTMTMwNV9SVENfTEVOXTsKKwlpbnQJCXN0YXR1czsKKworCS8qIFVzZSB3cml0ZS10aGVuLXJlYWQgdG8gZ2V0IGFsbCB0aGUgZGF0ZS90aW1lIHJlZ2lzdGVycworCSAqIHNpbmNlIGRtYSBmcm9tIHN0YWNrIGlzIG5vbnBvcnRhYmxlCisJICovCisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChkczEzMDUtPnNwaSwgJmFkZHIsIHNpemVvZiBhZGRyLAorCQkJYnVmLCBzaXplb2YgYnVmKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWRldl92ZGJnKGRldiwgIiVzOiAlMDJ4ICUwMnggJTAyeCwgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJInJlYWQiLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJCWJ1Zls0XSwgYnVmWzVdLCBidWZbNl0pOworCisJLyogRGVjb2RlIHRoZSByZWdpc3RlcnMgKi8KKwl0aW1lLT50bV9zZWMgPSBiY2QyYmluKGJ1ZltEUzEzMDVfU0VDXSk7CisJdGltZS0+dG1fbWluID0gYmNkMmJpbihidWZbRFMxMzA1X01JTl0pOworCXRpbWUtPnRtX2hvdXIgPSBiY2QyaG91cihidWZbRFMxMzA1X0hPVVJdKTsKKwl0aW1lLT50bV93ZGF5ID0gYnVmW0RTMTMwNV9XREFZXSAtIDE7CisJdGltZS0+dG1fbWRheSA9IGJjZDJiaW4oYnVmW0RTMTMwNV9NREFZXSk7CisJdGltZS0+dG1fbW9uID0gYmNkMmJpbihidWZbRFMxMzA1X01PTl0pIC0gMTsKKwl0aW1lLT50bV95ZWFyID0gYmNkMmJpbihidWZbRFMxMzA1X1lFQVJdKSArIDEwMDsKKworCWRldl92ZGJnKGRldiwgIiVzIHNlY3M9JWQsIG1pbnM9JWQsICIKKwkJImhvdXJzPSVkLCBtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCSJyZWFkIiwgdGltZS0+dG1fc2VjLCB0aW1lLT50bV9taW4sCisJCXRpbWUtPnRtX2hvdXIsIHRpbWUtPnRtX21kYXksCisJCXRpbWUtPnRtX21vbiwgdGltZS0+dG1feWVhciwgdGltZS0+dG1fd2RheSk7CisKKwkvKiBUaW1lIG1heSBub3QgYmUgc2V0ICovCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0aW1lKTsKK30KKworc3RhdGljIGludCBkczEzMDVfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJc3RydWN0IGRzMTMwNQkqZHMxMzA1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTgJCWJ1ZlsxICsgRFMxMzA1X1JUQ19MRU5dOworCXU4CQkqYnAgPSBidWY7CisKKwlkZXZfdmRiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQkid3JpdGUiLCB0aW1lLT50bV9zZWMsIHRpbWUtPnRtX21pbiwKKwkJdGltZS0+dG1faG91ciwgdGltZS0+dG1fbWRheSwKKwkJdGltZS0+dG1fbW9uLCB0aW1lLT50bV95ZWFyLCB0aW1lLT50bV93ZGF5KTsKKworCS8qIFdyaXRlIHJlZ2lzdGVycyBzdGFydGluZyBhdCB0aGUgZmlyc3QgdGltZS9kYXRlIGFkZHJlc3MuICovCisJKmJwKysgPSBEUzEzMDVfV1JJVEUgfCBEUzEzMDVfU0VDOworCisJKmJwKysgPSBiaW4yYmNkKHRpbWUtPnRtX3NlYyk7CisJKmJwKysgPSBiaW4yYmNkKHRpbWUtPnRtX21pbik7CisJKmJwKysgPSBob3VyMmJjZChkczEzMDUtPmhyMTIsIHRpbWUtPnRtX2hvdXIpOworCSpicCsrID0gKHRpbWUtPnRtX3dkYXkgPCA3KSA/ICh0aW1lLT50bV93ZGF5ICsgMSkgOiAxOworCSpicCsrID0gYmluMmJjZCh0aW1lLT50bV9tZGF5KTsKKwkqYnArKyA9IGJpbjJiY2QodGltZS0+dG1fbW9uICsgMSk7CisJKmJwKysgPSBiaW4yYmNkKHRpbWUtPnRtX3llYXIgLSAxMDApOworCisJZGV2X2RiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMngsICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCSJ3cml0ZSIsIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJCWJ1Zls0XSwgYnVmWzVdLCBidWZbNl0sIGJ1Zls3XSk7CisKKwkvKiB1c2Ugd3JpdGUtdGhlbi1yZWFkIHNpbmNlIGRtYSBmcm9tIHN0YWNrIGlzIG5vbnBvcnRhYmxlICovCisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoZHMxMzA1LT5zcGksIGJ1Ziwgc2l6ZW9mIGJ1ZiwKKwkJCU5VTEwsIDApOworfQorCisvKgorICogR2V0L3NldCBvZiBhbGFybSBpcyBhIGJpdCBmdW5reToKKyAqCisgKiAtIEZpcnN0IHRoZXJlJ3MgdGhlIGluaGVyZW50IHJhY2luZXNzIG9mIGdldHRpbmcgdGhlIChwYXJ0aXRpb25lZCkKKyAqICAgc3RhdHVzIG9mIGFuIGFsYXJtIHRoYXQgY291bGQgdHJpZ2dlciB3aGlsZSB3ZSdyZSByZWFkaW5nIHBhcnRzCisgKiAgIG9mIHRoYXQgc3RhdHVzLgorICoKKyAqIC0gU2Vjb25kIHRoZXJlJ3MgaXRzIGxpbWl0ZWQgcmFuZ2UgKHdlIGNvdWxkIGluY3JlYXNlIGl0IGEgYml0IGJ5CisgKiAgIHJlbHlpbmcgb24gV0RBWSksIHdoaWNoIG1lYW5zIGl0IHdpbGwgZWFzaWx5IHJvbGwgb3Zlci4KKyAqCisgKiAtIFRoaXJkIHRoZXJlJ3MgdGhlIGNob2ljZSBvZiB0d28gYWxhcm1zIGFuZCBhbGFybSBzaWduYWxzLgorICogICBIZXJlIHdlIHVzZSBBTE0wIGFuZCBleHBlY3QgdGhhdCBuSU5UMCAob3BlbiBkcmFpbikgaXMgdXNlZDsKKyAqICAgdGhhdCdzIHRoZSBvbmx5IHJlYWwgb3B0aW9uIGZvciBEUzEzMDYgcnVudGltZSBhbGFybXMsIGFuZCBpcworICogICBuYXR1cmFsIG9uIERTMTMwNS4KKyAqCisgKiAtIEZvdXJ0aCwgdGhlcmUncyBhbHNvIEFMTTEsIGFuZCBhIHNlY29uZCBpbnRlcnJ1cHQgc2lnbmFsOgorICogICAgICsgT24gRFMxMzA1IEFMTTEgdXNlcyBuSU5UMSAod2hlbiBJTlRDTj0xKSBlbHNlIG5JTlQwOworICogICAgICsgT24gRFMxMzA2IEFMTTEgb25seSB1c2VzIElOVDEgKGFuIGFjdGl2ZSBoaWdoIHB1bHNlKQorICogICAgICAgYW5kIGl0IHdvbid0IHdvcmsgd2hlbiBWQ0MxIGlzIGFjdGl2ZS4KKyAqCisgKiAgIFNvIHRvIGJlIG1vc3QgZ2VuZXJhbCwgd2Ugc2hvdWxkIHByb2JhYmx5IHNldCBib3RoIGFsYXJtcyB0byB0aGUKKyAqICAgc2FtZSB2YWx1ZSwgbGV0dGluZyBBTE0xIGJlIHRoZSB3YWtldXAgZXZlbnQgc291cmNlIG9uIERTMTMwNgorICogICBhbmQgaGFuZGxpbmcgc2V2ZXJhbCB3aXJpbmcgb3B0aW9ucyBvbiBEUzEzMDUuCisgKgorICogLSBGaWZ0aCwgd2Ugc3VwcG9ydCB0aGUgcG9sbGVkIG1vZGUgKGFzIHdlbGwgYXMgcG9zc2libGU7IHdoeSBub3Q/KQorICogICBldmVuIHdoZW4gbm8gaW50ZXJydXB0IGxpbmUgaXMgd2lyZWQgdG8gYW4gSVJRLgorICovCisKKy8qCisgKiBDb250ZXh0OiBjYWxsZXIgaG9sZHMgcnRjLT5vcHNfbG9jayAodG8gcHJvdGVjdCBkczEzMDUtPmN0cmwpCisgKi8KK3N0YXRpYyBpbnQgZHMxMzA1X2dldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJc3RydWN0IGRzMTMwNQkqZHMxMzA1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGRzMTMwNS0+c3BpOworCXU4CQlhZGRyOworCWludAkJc3RhdHVzOworCXU4CQlidWZbRFMxMzA1X0FMTV9MRU5dOworCisJLyogUmVmcmVzaCBjb250cm9sIHJlZ2lzdGVyIGNhY2hlIEJFRk9SRSByZWFkaW5nIEFMTTAgcmVnaXN0ZXJzLAorCSAqIHNpbmNlIHJlYWRpbmcgYWxhcm0gcmVnaXN0ZXJzIGFja3MgYW55IHBlbmRpbmcgSVJRLiAgVGhhdAorCSAqIG1ha2VzIHJldHVybmluZyAicGVuZGluZyIgc3RhdHVzIGEgYml0IG9mIGEgbGllLCBidXQgdGhhdCBiaXQKKwkgKiBvZiBFRkkgc3RhdHVzIGlzIGF0IGJlc3QgZnJhZ2lsZSBhbnl3YXkgKGdpdmVuIElSUSBoYW5kbGVycykuCisJICovCisJYWRkciA9IERTMTMwNV9DT05UUk9MOworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmYWRkciwgc2l6ZW9mIGFkZHIsCisJCQlkczEzMDUtPmN0cmwsIHNpemVvZiBkczEzMDUtPmN0cmwpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJYWxtLT5lbmFibGVkID0gISEoZHMxMzA1LT5jdHJsWzBdICYgRFMxMzA1X0FFSTApOworCWFsbS0+cGVuZGluZyA9ICEhKGRzMTMwNS0+Y3RybFsxXSAmIERTMTMwNV9BRUkwKTsKKworCS8qIGdldCBhbmQgY2hlY2sgQUxNMCByZWdpc3RlcnMgKi8KKwlhZGRyID0gRFMxMzA1X0FMTTAoRFMxMzA1X1NFQyk7CisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZhZGRyLCBzaXplb2YgYWRkciwKKwkJCWJ1Ziwgc2l6ZW9mIGJ1Zik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlkZXZfdmRiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJImFsbTAgcmVhZCIsIGJ1ZltEUzEzMDVfU0VDXSwgYnVmW0RTMTMwNV9NSU5dLAorCQlidWZbRFMxMzA1X0hPVVJdLCBidWZbRFMxMzA1X1dEQVldKTsKKworCWlmICgoRFMxMzA1X0FMTV9ESVNBQkxFICYgYnVmW0RTMTMwNV9TRUNdKQorCQkJfHwgKERTMTMwNV9BTE1fRElTQUJMRSAmIGJ1ZltEUzEzMDVfTUlOXSkKKwkJCXx8IChEUzEzMDVfQUxNX0RJU0FCTEUgJiBidWZbRFMxMzA1X0hPVVJdKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBTdHVmZiB0aGVzZSB2YWx1ZXMgaW50byBhbG0tPnRpbWUgYW5kIGxldCBSVEMgZnJhbWV3b3JrIGNvZGUKKwkgKiBmaWxsIGluIHRoZSByZXN0IC4uLiBhbmQgYWxzbyBoYW5kbGUgcm9sbG92ZXIgdG8gdG9tb3Jyb3cgd2hlbgorCSAqIHRoYXQncyBuZWVkZWQuCisJICovCisJYWxtLT50aW1lLnRtX3NlYyA9IGJjZDJiaW4oYnVmW0RTMTMwNV9TRUNdKTsKKwlhbG0tPnRpbWUudG1fbWluID0gYmNkMmJpbihidWZbRFMxMzA1X01JTl0pOworCWFsbS0+dGltZS50bV9ob3VyID0gYmNkMmhvdXIoYnVmW0RTMTMwNV9IT1VSXSk7CisJYWxtLT50aW1lLnRtX21kYXkgPSAtMTsKKwlhbG0tPnRpbWUudG1fbW9uID0gLTE7CisJYWxtLT50aW1lLnRtX3llYXIgPSAtMTsKKwkvKiBuZXh0IHRocmVlIGZpZWxkcyBhcmUgdW51c2VkIGJ5IExpbnV4ICovCisJYWxtLT50aW1lLnRtX3dkYXkgPSAtMTsKKwlhbG0tPnRpbWUudG1fbWRheSA9IC0xOworCWFsbS0+dGltZS50bV9pc2RzdCA9IC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb250ZXh0OiBjYWxsZXIgaG9sZHMgcnRjLT5vcHNfbG9jayAodG8gcHJvdGVjdCBkczEzMDUtPmN0cmwpCisgKi8KK3N0YXRpYyBpbnQgZHMxMzA1X3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJc3RydWN0IGRzMTMwNQkqZHMxMzA1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGRzMTMwNS0+c3BpOworCXVuc2lnbmVkIGxvbmcJbm93LCBsYXRlcjsKKwlzdHJ1Y3QgcnRjX3RpbWUJdG07CisJaW50CQlzdGF0dXM7CisJdTgJCWJ1ZlsxICsgRFMxMzA1X0FMTV9MRU5dOworCisJLyogY29udmVydCBkZXNpcmVkIGFsYXJtIHRvIHRpbWVfdCAqLworCXN0YXR1cyA9IHJ0Y190bV90b190aW1lKCZhbG0tPnRpbWUsICZsYXRlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBSZWFkIGN1cnJlbnQgdGltZSBhcyB0aW1lX3QgKi8KKwlzdGF0dXMgPSBkczEzMDVfZ2V0X3RpbWUoZGV2LCAmdG0pOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IHJ0Y190bV90b190aW1lKCZ0bSwgJm5vdyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBtYWtlIHN1cmUgYWxhcm0gZmlyZXMgd2l0aGluIHRoZSBuZXh0IDI0IGhvdXJzICovCisJaWYgKGxhdGVyIDw9IG5vdykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChsYXRlciAtIG5vdykgPiAyNCAqIDYwICogNjApCisJCXJldHVybiAtRURPTTsKKworCS8qIGRpc2FibGUgYWxhcm0gaWYgbmVlZGVkICovCisJaWYgKGRzMTMwNS0+Y3RybFswXSAmIERTMTMwNV9BRUkwKSB7CisJCWRzMTMwNS0+Y3RybFswXSAmPSB+RFMxMzA1X0FFSTA7CisKKwkJYnVmWzBdID0gRFMxMzA1X1dSSVRFIHwgRFMxMzA1X0NPTlRST0w7CisJCWJ1ZlsxXSA9IGRzMTMwNS0+Y3RybFswXTsKKwkJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChkczEzMDUtPnNwaSwgYnVmLCAyLCBOVUxMLCAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHdyaXRlIGFsYXJtICovCisJYnVmWzBdID0gRFMxMzA1X1dSSVRFIHwgRFMxMzA1X0FMTTAoRFMxMzA1X1NFQyk7CisJYnVmWzEgKyBEUzEzMDVfU0VDXSA9IGJpbjJiY2QoYWxtLT50aW1lLnRtX3NlYyk7CisJYnVmWzEgKyBEUzEzMDVfTUlOXSA9IGJpbjJiY2QoYWxtLT50aW1lLnRtX21pbik7CisJYnVmWzEgKyBEUzEzMDVfSE9VUl0gPSBob3VyMmJjZChkczEzMDUtPmhyMTIsIGFsbS0+dGltZS50bV9ob3VyKTsKKwlidWZbMSArIERTMTMwNV9XREFZXSA9IERTMTMwNV9BTE1fRElTQUJMRTsKKworCWRldl9kYmcoZGV2LCAiJXM6ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCSJhbG0wIHdyaXRlIiwgYnVmWzEgKyBEUzEzMDVfU0VDXSwgYnVmWzEgKyBEUzEzMDVfTUlOXSwKKwkJYnVmWzEgKyBEUzEzMDVfSE9VUl0sIGJ1ZlsxICsgRFMxMzA1X1dEQVldKTsKKworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBidWYsIHNpemVvZiBidWYsIE5VTEwsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogZW5hYmxlIGFsYXJtIGlmIHJlcXVlc3RlZCAqLworCWlmIChhbG0tPmVuYWJsZWQpIHsKKwkJZHMxMzA1LT5jdHJsWzBdIHw9IERTMTMwNV9BRUkwOworCisJCWJ1ZlswXSA9IERTMTMwNV9XUklURSB8IERTMTMwNV9DT05UUk9MOworCQlidWZbMV0gPSBkczEzMDUtPmN0cmxbMF07CisJCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoZHMxMzA1LT5zcGksIGJ1ZiwgMiwgTlVMTCwgMCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBpbnQgZHMxMzA1X3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgZHMxMzA1CSpkczEzMDUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljaGFyCQkqZGlvZGVzID0gIm5vIjsKKwljaGFyCQkqcmVzaXN0b3JzID0gIiI7CisKKwkvKiBjdHJsWzJdIGlzIHRyZWF0ZWQgYXMgcmVhZC1vbmx5OyBubyBsb2NraW5nIG5lZWRlZCAqLworCWlmICgoZHMxMzA1LT5jdHJsWzJdICYgMHhmMCkgPT0gRFMxMzA1X1RSSUNLTEVfTUFHSUMpIHsKKwkJc3dpdGNoIChkczEzMDUtPmN0cmxbMl0gJiAweDBjKSB7CisJCWNhc2UgRFMxMzA1X1RSSUNLTEVfRFMyOgorCQkJZGlvZGVzID0gIjIgZGlvZGVzLCAiOworCQkJYnJlYWs7CisJCWNhc2UgRFMxMzA1X1RSSUNLTEVfRFMxOgorCQkJZGlvZGVzID0gIjEgZGlvZGUsICI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzd2l0Y2ggKGRzMTMwNS0+Y3RybFsyXSAmIDB4MDMpIHsKKwkJY2FzZSBEUzEzMDVfVFJJQ0tMRV8ySzoKKwkJCXJlc2lzdG9ycyA9ICIyayBPaG0iOworCQkJYnJlYWs7CisJCWNhc2UgRFMxMzA1X1RSSUNLTEVfNEs6CisJCQlyZXNpc3RvcnMgPSAiNGsgT2htIjsKKwkJCWJyZWFrOworCQljYXNlIERTMTMwNV9UUklDS0xFXzhLOgorCQkJcmVzaXN0b3JzID0gIjhrIE9obSI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRpb2RlcyA9ICJubyI7CisJCQlicmVhazsKKwkJfQorCX0KKworZG9uZToKKwlyZXR1cm4gc2VxX3ByaW50ZihzZXEsCisJCQkidHJpY2tsZV9jaGFyZ2VcdDogJXMlc1xuIiwKKwkJCWRpb2RlcywgcmVzaXN0b3JzKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgZHMxMzA1X3Byb2MJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEzMDVfb3BzID0geworCS5yZWFkX3RpbWUJPSBkczEzMDVfZ2V0X3RpbWUsCisJLnNldF90aW1lCT0gZHMxMzA1X3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gZHMxMzA1X2dldF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gZHMxMzA1X3NldF9hbGFybSwKKwkucHJvYwkJPSBkczEzMDVfcHJvYywKKwkuYWxhcm1faXJxX2VuYWJsZSA9IGRzMTMwNV9hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIHZvaWQgZHMxMzA1X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkczEzMDUJKmRzMTMwNSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHMxMzA1LCB3b3JrKTsKKwlzdHJ1Y3QgbXV0ZXgJKmxvY2sgPSAmZHMxMzA1LT5ydGMtPm9wc19sb2NrOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBkczEzMDUtPnNwaTsKKwl1OAkJYnVmWzNdOworCWludAkJc3RhdHVzOworCisJLyogbG9jayB0byBwcm90ZWN0IGRzMTMwNS0+Y3RybCAqLworCW11dGV4X2xvY2sobG9jayk7CisKKwkvKiBEaXNhYmxlIHRoZSBJUlEsIGFuZCBjbGVhciBpdHMgc3RhdHVzIC4uLiBmb3Igbm93LCB3ZSAia25vdyIKKwkgKiB0aGF0IGlmIG1vcmUgdGhhbiBvbmUgYWxhcm0gaXMgYWN0aXZlLCB0aGV5J3JlIGluIHN5bmMuCisJICogTm90ZSB0aGF0IHJlYWRpbmcgQUxNIGRhdGEgcmVnaXN0ZXJzIGFsc28gY2xlYXJzIElSUSBzdGF0dXMuCisJICovCisJZHMxMzA1LT5jdHJsWzBdICY9IH4oRFMxMzA1X0FFSTEgfCBEUzEzMDVfQUVJMCk7CisJZHMxMzA1LT5jdHJsWzFdID0gMDsKKworCWJ1ZlswXSA9IERTMTMwNV9XUklURSB8IERTMTMwNV9DT05UUk9MOworCWJ1ZlsxXSA9IGRzMTMwNS0+Y3RybFswXTsKKwlidWZbMl0gPSAwOworCisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1Ziwgc2l6ZW9mIGJ1ZiwKKwkJCU5VTEwsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlkZXZfZGJnKCZzcGktPmRldiwgImNsZWFyIGlycSAtLT4gJWRcbiIsIHN0YXR1cyk7CisKKwltdXRleF91bmxvY2sobG9jayk7CisKKwlpZiAoIXRlc3RfYml0KEZMQUdfRVhJVElORywgJmRzMTMwNS0+ZmxhZ3MpKQorCQllbmFibGVfaXJxKHNwaS0+aXJxKTsKKworCXJ0Y191cGRhdGVfaXJxKGRzMTMwNS0+cnRjLCAxLCBSVENfQUYgfCBSVENfSVJRRik7Cit9CisKKy8qCisgKiBUaGlzICJyZWFsIiBJUlEgaGFuZGxlciBoYW5kcyBvZmYgdG8gYSB3b3JrcXVldWUgbW9zdGx5IHRvIGFsbG93CisgKiBtdXRleCBsb2NraW5nIGZvciBkczEzMDUtPmN0cmwgLi4uIHVubGlrZSBJMkMsIHdlIGNvdWxkIGlzc3VlIGFzeW5jCisgKiBJL08gcmVxdWVzdHMgaW4gSVJRIGNvbnRleHQgKHRvIGNsZWFyIHRoZSBJUlEgc3RhdHVzKS4KKyAqLworc3RhdGljIGlycXJldHVybl90IGRzMTMwNV9pcnEoaW50IGlycSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgZHMxMzA1CQkqZHMxMzA1ID0gcDsKKworCWRpc2FibGVfaXJxKGlycSk7CisJc2NoZWR1bGVfd29yaygmZHMxMzA1LT53b3JrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBJbnRlcmZhY2UgZm9yIE5WUkFNCisgKi8KKworc3RhdGljIHZvaWQgbXNnX2luaXQoc3RydWN0IHNwaV9tZXNzYWdlICptLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4LAorCQl1OCAqYWRkciwgc2l6ZV90IGNvdW50LCBjaGFyICp0eCwgY2hhciAqcngpCit7CisJc3BpX21lc3NhZ2VfaW5pdChtKTsKKwltZW1zZXQoeCwgMCwgMiAqIHNpemVvZigqeCkpOworCisJeC0+dHhfYnVmID0gYWRkcjsKKwl4LT5sZW4gPSAxOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOworCisJeCsrOworCisJeC0+dHhfYnVmID0gdHg7CisJeC0+cnhfYnVmID0gcng7CisJeC0+bGVuID0gY291bnQ7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitkczEzMDVfbnZyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCXU4CQkJYWRkcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhbMl07CisJaW50CQkJc3RhdHVzOworCisJc3BpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBzcGlfZGV2aWNlLCBkZXYua29iaik7CisKKwlpZiAodW5saWtlbHkob2ZmID49IERTMTMwNV9OVlJBTV9MRU4pKQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPj0gRFMxMzA1X05WUkFNX0xFTikKKwkJY291bnQgPSBEUzEzMDVfTlZSQU1fTEVOOworCWlmICgob2ZmICsgY291bnQpID4gRFMxMzA1X05WUkFNX0xFTikKKwkJY291bnQgPSBEUzEzMDVfTlZSQU1fTEVOIC0gb2ZmOworCWlmICh1bmxpa2VseSghY291bnQpKQorCQlyZXR1cm4gY291bnQ7CisKKwlhZGRyID0gRFMxMzA1X05WUkFNICsgb2ZmOworCW1zZ19pbml0KCZtLCB4LCAmYWRkciwgY291bnQsIE5VTEwsIGJ1Zik7CisKKwlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJudnJhbSAlcyBlcnJvciAlZFxuIiwgInJlYWQiLCBzdGF0dXMpOworCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2RzMTMwNV9udnJhbV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCXU4CQkJYWRkcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhbMl07CisJaW50CQkJc3RhdHVzOworCisJc3BpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBzcGlfZGV2aWNlLCBkZXYua29iaik7CisKKwlpZiAodW5saWtlbHkob2ZmID49IERTMTMwNV9OVlJBTV9MRU4pKQorCQlyZXR1cm4gLUVGQklHOworCWlmIChjb3VudCA+PSBEUzEzMDVfTlZSQU1fTEVOKQorCQljb3VudCA9IERTMTMwNV9OVlJBTV9MRU47CisJaWYgKChvZmYgKyBjb3VudCkgPiBEUzEzMDVfTlZSQU1fTEVOKQorCQljb3VudCA9IERTMTMwNV9OVlJBTV9MRU4gLSBvZmY7CisJaWYgKHVubGlrZWx5KCFjb3VudCkpCisJCXJldHVybiBjb3VudDsKKworCWFkZHIgPSAoRFMxMzA1X1dSSVRFIHwgRFMxMzA1X05WUkFNKSArIG9mZjsKKwltc2dfaW5pdCgmbSwgeCwgJmFkZHIsIGNvdW50LCBidWYsIE5VTEwpOworCisJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibnZyYW0gJXMgZXJyb3IgJWRcbiIsICJ3cml0ZSIsIHN0YXR1cyk7CisJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgbnZyYW0gPSB7CisJLmF0dHIubmFtZQk9ICJudnJhbSIsCisJLmF0dHIubW9kZQk9IFNfSVJVR08gfCBTX0lXVVNSLAorCS5yZWFkCQk9IGRzMTMwNV9udnJhbV9yZWFkLAorCS53cml0ZQkJPSBkczEzMDVfbnZyYW1fd3JpdGUsCisJLnNpemUJCT0gRFMxMzA1X05WUkFNX0xFTiwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBJbnRlcmZhY2UgdG8gU1BJIHN0YWNrCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgZHMxMzA1X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGRzMTMwNQkJCSpkczEzMDU7CisJaW50CQkJCXN0YXR1czsKKwl1OAkJCQlhZGRyLCB2YWx1ZTsKKwlzdHJ1Y3QgZHMxMzA1X3BsYXRmb3JtX2RhdGEJKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlib29sCQkJCXdyaXRlX2N0cmwgPSBmYWxzZTsKKworCS8qIFNhbml0eSBjaGVjayBib2FyZCBzZXR1cCBkYXRhLiAgVGhpcyBtYXkgYmUgaG9va2VkIHVwCisJICogaW4gM3dpcmUgbW9kZSwgYnV0IHdlIGRvbid0IGNhcmUuICBOb3RlIHRoYXQgdW5sZXNzCisJICogdGhlcmUncyBhbiBpbnZlcnRlciBpbiBwbGFjZSwgdGhpcyBuZWVkcyBTUElfQ1NfSElHSCEKKwkgKi8KKwlpZiAoKHNwaS0+Yml0c19wZXJfd29yZCAmJiBzcGktPmJpdHNfcGVyX3dvcmQgIT0gOCkKKwkJCXx8IChzcGktPm1heF9zcGVlZF9oeiA+IDIwMDAwMDApCisJCQl8fCAhKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXQgdXAgZHJpdmVyIGRhdGEgKi8KKwlkczEzMDUgPSBremFsbG9jKHNpemVvZiAqZHMxMzA1LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRzMTMwNSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZHMxMzA1LT5zcGkgPSBzcGk7CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgZHMxMzA1KTsKKworCS8qIHJlYWQgYW5kIGNhY2hlIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJYWRkciA9IERTMTMwNV9DT05UUk9MOworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmYWRkciwgc2l6ZW9mIGFkZHIsCisJCQlkczEzMDUtPmN0cmwsIHNpemVvZiBkczEzMDUtPmN0cmwpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiY2FuJ3QgJXMsICVkXG4iLAorCQkJCSJyZWFkIiwgc3RhdHVzKTsKKwkJZ290byBmYWlsMDsKKwl9CisKKwlkZXZfZGJnKCZzcGktPmRldiwgImN0cmwgJXM6ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJInJlYWQiLCBkczEzMDUtPmN0cmxbMF0sCisJCQlkczEzMDUtPmN0cmxbMV0sIGRzMTMwNS0+Y3RybFsyXSk7CisKKwkvKiBTYW5pdHkgY2hlY2sgcmVnaXN0ZXIgdmFsdWVzIC4uLiBwYXJ0aWFsbHkgY29tcGVuc2F0aW5nIGZvciB0aGUKKwkgKiBmYWN0IHRoYXQgU1BJIGhhcyBubyBkZXZpY2UgaGFuZHNoYWtlLiAgQSBwdWxsdXAgb24gTUlTTyB3b3VsZAorCSAqIG1ha2UgdGhlc2UgdGVzdHMgZmFpbDsgYnV0IG5vdCBhbGwgc3lzdGVtcyB3aWxsIGhhdmUgb25lLiAgSWYKKwkgKiBzb21lIHJlZ2lzdGVyIGlzIG5laXRoZXIgMHgwMCBub3IgMHhmZiwgYSBjaGlwIGlzIGxpa2VseSB0aGVyZS4KKwkgKi8KKwlpZiAoKGRzMTMwNS0+Y3RybFswXSAmIDB4MzgpICE9IDAgfHwgKGRzMTMwNS0+Y3RybFsxXSAmIDB4ZmMpICE9IDApIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJSVEMgY2hpcCBpcyBub3QgcHJlc2VudFxuIik7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbDA7CisJfQorCWlmIChkczEzMDUtPmN0cmxbMl0gPT0gMCkKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJjaGlwIG1heSBub3QgYmUgcHJlc2VudFxuIik7CisKKwkvKiBlbmFibGUgd3JpdGVzIGlmIG5lZWRlZCAuLi4gaWYgd2Ugd2VyZSBwYXJhbm9pZCBpdCB3b3VsZAorCSAqIG1ha2Ugc2Vuc2UgdG8gZW5hYmxlIHRoZW0gb25seSB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgorCSAqLworCWlmIChkczEzMDUtPmN0cmxbMF0gJiBEUzEzMDVfV1ApIHsKKwkJdTgJCWJ1ZlsyXTsKKworCQlkczEzMDUtPmN0cmxbMF0gJj0gfkRTMTMwNV9XUDsKKworCQlidWZbMF0gPSBEUzEzMDVfV1JJVEUgfCBEUzEzMDVfQ09OVFJPTDsKKwkJYnVmWzFdID0gZHMxMzA1LT5jdHJsWzBdOworCQlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgYnVmLCBzaXplb2YgYnVmLCBOVUxMLCAwKTsKKworCQlkZXZfZGJnKCZzcGktPmRldiwgImNsZWFyIFdQIC0tPiAlZFxuIiwgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGZhaWwwOworCX0KKworCS8qIG9uIERTMTMwNSwgbWF5YmUgc3RhcnQgb3NjaWxsYXRvcjsgbGlrZSBtb3N0IGxvdyBwb3dlcgorCSAqIG9zY2lsbGF0b3JzLCBpdCBtYXkgdGFrZSBhIHNlY29uZCB0byBzdGFiaWxpemUKKwkgKi8KKwlpZiAoZHMxMzA1LT5jdHJsWzBdICYgRFMxMzA1X25FT1NDKSB7CisJCWRzMTMwNS0+Y3RybFswXSAmPSB+RFMxMzA1X25FT1NDOworCQl3cml0ZV9jdHJsID0gdHJ1ZTsKKwkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKKwl9CisKKwkvKiBhY2sgYW55IHBlbmRpbmcgSVJRcyAqLworCWlmIChkczEzMDUtPmN0cmxbMV0pIHsKKwkJZHMxMzA1LT5jdHJsWzFdID0gMDsKKwkJd3JpdGVfY3RybCA9IHRydWU7CisJfQorCisJLyogdGhpcyBtYXkgbmVlZCBvbmUtdGltZSAocmUpaW5pdCAqLworCWlmIChwZGF0YSkgeworCQkvKiBtYXliZSBlbmFibGUgdHJpY2tsZSBjaGFyZ2UgKi8KKwkJaWYgKCgoZHMxMzA1LT5jdHJsWzJdICYgMHhmMCkgIT0gRFMxMzA1X1RSSUNLTEVfTUFHSUMpKSB7CisJCQlkczEzMDUtPmN0cmxbMl0gPSBEUzEzMDVfVFJJQ0tMRV9NQUdJQworCQkJCQkJfCBwZGF0YS0+dHJpY2tsZTsKKwkJCXdyaXRlX2N0cmwgPSB0cnVlOworCQl9CisKKwkJLyogb24gRFMxMzA2LCBjb25maWd1cmUgMSBIeiBzaWduYWwgKi8KKwkJaWYgKHBkYXRhLT5pc19kczEzMDYpIHsKKwkJCWlmIChwZGF0YS0+ZW5fMWh6KSB7CisJCQkJaWYgKCEoZHMxMzA1LT5jdHJsWzBdICYgRFMxMzA2XzFIWikpIHsKKwkJCQkJZHMxMzA1LT5jdHJsWzBdIHw9IERTMTMwNl8xSFo7CisJCQkJCXdyaXRlX2N0cmwgPSB0cnVlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRzMTMwNS0+Y3RybFswXSAmIERTMTMwNl8xSFopIHsKKwkJCQkJZHMxMzA1LT5jdHJsWzBdICY9IH5EUzEzMDZfMUhaOworCQkJCQl3cml0ZV9jdHJsID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAod3JpdGVfY3RybCkgeworCQl1OAkJYnVmWzRdOworCisJCWJ1ZlswXSA9IERTMTMwNV9XUklURSB8IERTMTMwNV9DT05UUk9MOworCQlidWZbMV0gPSBkczEzMDUtPmN0cmxbMF07CisJCWJ1ZlsyXSA9IGRzMTMwNS0+Y3RybFsxXTsKKwkJYnVmWzNdID0gZHMxMzA1LT5jdHJsWzJdOworCQlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgYnVmLCBzaXplb2YgYnVmLCBOVUxMLCAwKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiY2FuJ3QgJXMsICVkXG4iLAorCQkJCQkid3JpdGUiLCBzdGF0dXMpOworCQkJZ290byBmYWlsMDsKKwkJfQorCisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiY3RybCAlczogJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJIndyaXRlIiwgZHMxMzA1LT5jdHJsWzBdLAorCQkJCWRzMTMwNS0+Y3RybFsxXSwgZHMxMzA1LT5jdHJsWzJdKTsKKwl9CisKKwkvKiBzZWUgaWYgbm9uLUxpbnV4IHNvZnR3YXJlIHNldCB1cCBBTS9QTSBtb2RlICovCisJYWRkciA9IERTMTMwNV9IT1VSOworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmYWRkciwgc2l6ZW9mIGFkZHIsCisJCQkJJnZhbHVlLCBzaXplb2YgdmFsdWUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZCBIT1VSIC0tPiAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBmYWlsMDsKKwl9CisKKwlkczEzMDUtPmhyMTIgPSAoRFMxMzA1X0hSXzEyICYgdmFsdWUpICE9IDA7CisJaWYgKGRzMTMwNS0+aHIxMikKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJBTS9QTVxuIik7CisKKwkvKiByZWdpc3RlciBSVEMgLi4uIGZyb20gaGVyZSBvbiwgZHMxMzA1LT5jdHJsIG5lZWRzIGxvY2tpbmcgKi8KKwlkczEzMDUtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImRzMTMwNSIsICZzcGktPmRldiwKKwkJCSZkczEzMDVfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihkczEzMDUtPnJ0YykpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihkczEzMDUtPnJ0Yyk7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVnaXN0ZXIgcnRjIC0tPiAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBmYWlsMDsKKwl9CisKKwkvKiBNYXliZSBzZXQgdXAgYWxhcm0gSVJROyBiZSByZWFkeSB0byBoYW5kbGUgaXQgdHJpZ2dlcmluZyByaWdodAorCSAqIGF3YXkuICBOT1RFIHRoYXQgd2UgZG9uJ3Qgc2hhcmUgdGhpcy4gIFRoZSBzaWduYWwgaXMgYWN0aXZlIGxvdywKKwkgKiBhbmQgd2UgY2FuJ3QgYWNrIGl0IGJlZm9yZSBhIFNQSSBtZXNzYWdlIGRlbGF5LiAgV2UgdGVtcG9yYXJpbHkKKwkgKiBkaXNhYmxlIHRoZSBJUlEgdW50aWwgaXQncyBhY2tlZCwgd2hpY2ggbGV0cyB1cyB3b3JrIHdpdGggbW9yZQorCSAqIElSUSB0cmlnZ2VyIG1vZGVzIChub3QgYWxsIElSUSBjb250cm9sbGVycyBjYW4gZG8gZmFsbGluZyBlZGdlKS4KKwkgKi8KKwlpZiAoc3BpLT5pcnEpIHsKKwkJSU5JVF9XT1JLKCZkczEzMDUtPndvcmssIGRzMTMwNV93b3JrKTsKKwkJc3RhdHVzID0gcmVxdWVzdF9pcnEoc3BpLT5pcnEsIGRzMTMwNV9pcnEsCisJCQkJMCwgZGV2X25hbWUoJmRzMTMwNS0+cnRjLT5kZXYpLCBkczEzMDUpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICJyZXF1ZXN0X2lycSAlZCAtLT4gJWRcbiIsCisJCQkJCXNwaS0+aXJxLCBzdGF0dXMpOworCQkJZ290byBmYWlsMTsKKwkJfQorCisJCWRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUoJnNwaS0+ZGV2LCAxKTsKKwl9CisKKwkvKiBleHBvcnQgTlZSQU0gKi8KKwlzdGF0dXMgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnNwaS0+ZGV2LmtvYmosICZudnJhbSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJyZWdpc3RlciBudnJhbSAtLT4gJWRcbiIsIHN0YXR1cyk7CisJCWdvdG8gZmFpbDI7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWwyOgorCWZyZWVfaXJxKHNwaS0+aXJxLCBkczEzMDUpOworZmFpbDE6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGRzMTMwNS0+cnRjKTsKK2ZhaWwwOgorCWtmcmVlKGRzMTMwNSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHMxMzA1X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBkczEzMDUgKmRzMTMwNSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzcGktPmRldi5rb2JqLCAmbnZyYW0pOworCisJLyogY2FyZWZ1bGx5IHNodXQgZG93biBpcnEgYW5kIHdvcmtxdWV1ZSwgaWYgcHJlc2VudCAqLworCWlmIChzcGktPmlycSkgeworCQlzZXRfYml0KEZMQUdfRVhJVElORywgJmRzMTMwNS0+ZmxhZ3MpOworCQlmcmVlX2lycShzcGktPmlycSwgZHMxMzA1KTsKKwkJY2FuY2VsX3dvcmtfc3luYygmZHMxMzA1LT53b3JrKTsKKwl9CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZHMxMzA1LT5ydGMpOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIE5VTEwpOworCWtmcmVlKGRzMTMwNSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBkczEzMDVfZHJpdmVyID0geworCS5kcml2ZXIubmFtZQk9ICJydGMtZHMxMzA1IiwKKwkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnByb2JlCQk9IGRzMTMwNV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRzMTMwNV9yZW1vdmUpLAorCS8qIFJFVklTSVQgYWRkIHN1c3BlbmQvcmVzdW1lICovCit9OworCittb2R1bGVfc3BpX2RyaXZlcihkczEzMDVfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgZHJpdmVyIGZvciBEUzEzMDUgYW5kIERTMTMwNiBjaGlwcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJzcGk6cnRjLWRzMTMwNSIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTNkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKQEAgLTAsMCArMSw5NjEgQEAKKy8qCisgKiBydGMtZHMxMzA3LmMgLSBSVEMgZHJpdmVyIGZvciBzb21lIG1vc3RseS1jb21wYXRpYmxlIEkyQyBjaGlwcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IEphbWVzIENoYXBtYW4gKGRzMTMzNyBjb3JlKQorICogIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBCcm93bmVsbAorICogIENvcHlyaWdodCAoQykgMjAwOSBNYXR0aGlhcyBGdWNocyAocng4MDI1IHN1cHBvcnQpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworCisKKy8qCisgKiBXZSBjYW4ndCBkZXRlcm1pbmUgdHlwZSBieSBwcm9iaW5nLCBidXQgaWYgd2UgZXhwZWN0IHByZS1MaW51eCBjb2RlCisgKiB0byBoYXZlIHNldCB0aGUgY2hpcCB1cCBhcyBhIGNsb2NrICh0dXJuaW5nIG9uIHRoZSBvc2NpbGxhdG9yIGFuZAorICogc2V0dGluZyB0aGUgZGF0ZSBhbmQgdGltZSksIExpbnV4IGNhbiBpZ25vcmUgdGhlIG5vbi1jbG9jayBmZWF0dXJlcy4KKyAqIFRoYXQncyBhIG5hdHVyYWwgam9iIGZvciBhIGZhY3Rvcnkgb3IgcmVwYWlyIGJlbmNoLgorICovCitlbnVtIGRzX3R5cGUgeworCWRzXzEzMDcsCisJZHNfMTMzNywKKwlkc18xMzM4LAorCWRzXzEzMzksCisJZHNfMTM0MCwKKwlkc18xMzg4LAorCWRzXzMyMzEsCisJbTQxdDAwLAorCW1jcDc5NDF4LAorCXJ4XzgwMjUsCisJbGFzdF9kc190eXBlIC8qIGFsd2F5cyBsYXN0ICovCisJLyogcnM1YzM3MiB0b28/ICBkaWZmZXJlbnQgYWRkcmVzcy4uLiAqLworfTsKKworCisvKiBSVEMgcmVnaXN0ZXJzIGRvbid0IGRpZmZlciBtdWNoLCBleGNlcHQgZm9yIHRoZSBjZW50dXJ5IGZsYWcgKi8KKyNkZWZpbmUgRFMxMzA3X1JFR19TRUNTCQkweDAwCS8qIDAwLTU5ICovCisjCWRlZmluZSBEUzEzMDdfQklUX0NICQkweDgwCisjCWRlZmluZSBEUzEzNDBfQklUX25FT1NDCQkweDgwCisjCWRlZmluZSBNQ1A3OTQxWF9CSVRfU1QJCTB4ODAKKyNkZWZpbmUgRFMxMzA3X1JFR19NSU4JCTB4MDEJLyogMDAtNTkgKi8KKyNkZWZpbmUgRFMxMzA3X1JFR19IT1VSCQkweDAyCS8qIDAwLTIzLCBvciAxLTEye2FtLHBtfSAqLworIwlkZWZpbmUgRFMxMzA3X0JJVF8xMkhSCQkweDQwCS8qIGluIFJFR19IT1VSICovCisjCWRlZmluZSBEUzEzMDdfQklUX1BNCQkweDIwCS8qIGluIFJFR19IT1VSICovCisjCWRlZmluZSBEUzEzNDBfQklUX0NFTlRVUllfRU4JMHg4MAkvKiBpbiBSRUdfSE9VUiAqLworIwlkZWZpbmUgRFMxMzQwX0JJVF9DRU5UVVJZCTB4NDAJLyogaW4gUkVHX0hPVVIgKi8KKyNkZWZpbmUgRFMxMzA3X1JFR19XREFZCQkweDAzCS8qIDAxLTA3ICovCisjCWRlZmluZSBNQ1A3OTQxWF9CSVRfVkJBVEVOCTB4MDgKKyNkZWZpbmUgRFMxMzA3X1JFR19NREFZCQkweDA0CS8qIDAxLTMxICovCisjZGVmaW5lIERTMTMwN19SRUdfTU9OVEgJMHgwNQkvKiAwMS0xMiAqLworIwlkZWZpbmUgRFMxMzM3X0JJVF9DRU5UVVJZCTB4ODAJLyogaW4gUkVHX01PTlRIICovCisjZGVmaW5lIERTMTMwN19SRUdfWUVBUgkJMHgwNgkvKiAwMC05OSAqLworCisvKgorICogT3RoZXIgcmVnaXN0ZXJzIChjb250cm9sLCBzdGF0dXMsIGFsYXJtcywgdHJpY2tsZSBjaGFyZ2UsIE5WUkFNLCBldGMpCisgKiBzdGFydCBhdCA3LCBhbmQgdGhleSBkaWZmZXIgYSBMT1QuIE9ubHkgY29udHJvbCBhbmQgc3RhdHVzIG1hdHRlciBmb3IKKyAqIGJhc2ljIFJUQyBkYXRlIGFuZCB0aW1lIGZ1bmN0aW9uYWxpdHk7IGJlIGNhcmVmdWwgdXNpbmcgdGhlbS4KKyAqLworI2RlZmluZSBEUzEzMDdfUkVHX0NPTlRST0wJMHgwNwkJLyogb3IgZHMxMzM4ICovCisjCWRlZmluZSBEUzEzMDdfQklUX09VVAkJMHg4MAorIwlkZWZpbmUgRFMxMzM4X0JJVF9PU0YJCTB4MjAKKyMJZGVmaW5lIERTMTMwN19CSVRfU1FXRQkJMHgxMAorIwlkZWZpbmUgRFMxMzA3X0JJVF9SUzEJCTB4MDIKKyMJZGVmaW5lIERTMTMwN19CSVRfUlMwCQkweDAxCisjZGVmaW5lIERTMTMzN19SRUdfQ09OVFJPTAkweDBlCisjCWRlZmluZSBEUzEzMzdfQklUX25FT1NDCQkweDgwCisjCWRlZmluZSBEUzEzMzlfQklUX0JCU1FJCQkweDIwCisjCWRlZmluZSBEUzMyMzFfQklUX0JCU1FXCQkweDQwIC8qIHNhbWUgYXMgQkJTUUkgKi8KKyMJZGVmaW5lIERTMTMzN19CSVRfUlMyCQkweDEwCisjCWRlZmluZSBEUzEzMzdfQklUX1JTMQkJMHgwOAorIwlkZWZpbmUgRFMxMzM3X0JJVF9JTlRDTgkJMHgwNAorIwlkZWZpbmUgRFMxMzM3X0JJVF9BMklFCQkweDAyCisjCWRlZmluZSBEUzEzMzdfQklUX0ExSUUJCTB4MDEKKyNkZWZpbmUgRFMxMzQwX1JFR19DT05UUk9MCTB4MDcKKyMJZGVmaW5lIERTMTM0MF9CSVRfT1VUCQkweDgwCisjCWRlZmluZSBEUzEzNDBfQklUX0ZUCQkweDQwCisjCWRlZmluZSBEUzEzNDBfQklUX0NBTElCX1NJR04JMHgyMAorIwlkZWZpbmUgRFMxMzQwX01fQ0FMSUJSQVRJT04JMHgxZgorI2RlZmluZSBEUzEzNDBfUkVHX0ZMQUcJCTB4MDkKKyMJZGVmaW5lIERTMTM0MF9CSVRfT1NGCQkweDgwCisjZGVmaW5lIERTMTMzN19SRUdfU1RBVFVTCTB4MGYKKyMJZGVmaW5lIERTMTMzN19CSVRfT1NGCQkweDgwCisjCWRlZmluZSBEUzEzMzdfQklUX0EySQkJMHgwMgorIwlkZWZpbmUgRFMxMzM3X0JJVF9BMUkJCTB4MDEKKyNkZWZpbmUgRFMxMzM5X1JFR19BTEFSTTFfU0VDUwkweDA3CisjZGVmaW5lIERTMTMzOV9SRUdfVFJJQ0tMRQkweDEwCisKKyNkZWZpbmUgUlg4MDI1X1JFR19DVFJMMQkweDBlCisjCWRlZmluZSBSWDgwMjVfQklUXzI0MTIJCTB4MjAKKyNkZWZpbmUgUlg4MDI1X1JFR19DVFJMMgkweDBmCisjCWRlZmluZSBSWDgwMjVfQklUX1BPTgkJMHgxMAorIwlkZWZpbmUgUlg4MDI1X0JJVF9WREVUCQkweDQwCisjCWRlZmluZSBSWDgwMjVfQklUX1hTVAkJMHgyMAorCisKK3N0cnVjdCBkczEzMDcgeworCXU4CQkJb2Zmc2V0OyAvKiByZWdpc3RlcidzIG9mZnNldCAqLworCXU4CQkJcmVnc1sxMV07CisJdTE2CQkJbnZyYW1fb2Zmc2V0OworCXN0cnVjdCBiaW5fYXR0cmlidXRlCSpudnJhbTsKKwllbnVtIGRzX3R5cGUJCXR5cGU7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisjZGVmaW5lIEhBU19OVlJBTQkwCQkvKiBiaXQgMCA9PSBzeXNmcyBmaWxlIGFjdGl2ZSAqLworI2RlZmluZSBIQVNfQUxBUk0JMQkJLyogYml0IDEgPT0gaXJxIGNsYWltZWQgKi8KKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJczMyICgqcmVhZF9ibG9ja19kYXRhKShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorCQkJICAgICAgIHU4IGxlbmd0aCwgdTggKnZhbHVlcyk7CisJczMyICgqd3JpdGVfYmxvY2tfZGF0YSkoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKKwkJCQl1OCBsZW5ndGgsIGNvbnN0IHU4ICp2YWx1ZXMpOworfTsKKworc3RydWN0IGNoaXBfZGVzYyB7CisJdW5zaWduZWQJCWFsYXJtOjE7CisJdTE2CQkJbnZyYW1fb2Zmc2V0OworCXUxNgkJCW52cmFtX3NpemU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNoaXBfZGVzYyBjaGlwc1tsYXN0X2RzX3R5cGVdID0geworCVtkc18xMzA3XSA9IHsKKwkJLm52cmFtX29mZnNldAk9IDgsCisJCS5udnJhbV9zaXplCT0gNTYsCisJfSwKKwlbZHNfMTMzN10gPSB7CisJCS5hbGFybQkJPSAxLAorCX0sCisJW2RzXzEzMzhdID0geworCQkubnZyYW1fb2Zmc2V0CT0gOCwKKwkJLm52cmFtX3NpemUJPSA1NiwKKwl9LAorCVtkc18xMzM5XSA9IHsKKwkJLmFsYXJtCQk9IDEsCisJfSwKKwlbZHNfMzIzMV0gPSB7CisJCS5hbGFybQkJPSAxLAorCX0sCisJW21jcDc5NDF4XSA9IHsKKwkJLyogdGhpcyBpcyBiYXR0ZXJ5IGJhY2tlZCBTUkFNICovCisJCS5udnJhbV9vZmZzZXQJPSAweDIwLAorCQkubnZyYW1fc2l6ZQk9IDB4NDAsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBkczEzMDdfaWRbXSA9IHsKKwl7ICJkczEzMDciLCBkc18xMzA3IH0sCisJeyAiZHMxMzM3IiwgZHNfMTMzNyB9LAorCXsgImRzMTMzOCIsIGRzXzEzMzggfSwKKwl7ICJkczEzMzkiLCBkc18xMzM5IH0sCisJeyAiZHMxMzg4IiwgZHNfMTM4OCB9LAorCXsgImRzMTM0MCIsIGRzXzEzNDAgfSwKKwl7ICJkczMyMzEiLCBkc18zMjMxIH0sCisJeyAibTQxdDAwIiwgbTQxdDAwIH0sCisJeyAibWNwNzk0MXgiLCBtY3A3OTQxeCB9LAorCXsgInB0N2M0MzM4IiwgZHNfMTMwNyB9LAorCXsgInJ4ODAyNSIsIHJ4XzgwMjUgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZHMxMzA3X2lkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBCTE9DS19EQVRBX01BWF9UUklFUyAxMAorCitzdGF0aWMgczMyIGRzMTMwN19yZWFkX2Jsb2NrX2RhdGFfb25jZShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICAgICB1OCBjb21tYW5kLCB1OCBsZW5ndGgsIHU4ICp2YWx1ZXMpCit7CisJczMyIGksIGRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJZGF0YSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGNvbW1hbmQgKyBpKTsKKwkJaWYgKGRhdGEgPCAwKQorCQkJcmV0dXJuIGRhdGE7CisJCXZhbHVlc1tpXSA9IGRhdGE7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgczMyIGRzMTMwN19yZWFkX2Jsb2NrX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKKwkJCQkgIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKK3sKKwl1OCBvbGR2YWx1ZXNbSTJDX1NNQlVTX0JMT0NLX01BWF07CisJczMyIHJldDsKKwlpbnQgdHJpZXMgPSAwOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJkczEzMDdfcmVhZF9ibG9ja19kYXRhIChsZW5ndGg9JWQpXG4iLCBsZW5ndGgpOworCXJldCA9IGRzMTMwN19yZWFkX2Jsb2NrX2RhdGFfb25jZShjbGllbnQsIGNvbW1hbmQsIGxlbmd0aCwgdmFsdWVzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlkbyB7CisJCWlmICgrK3RyaWVzID4gQkxPQ0tfREFUQV9NQVhfVFJJRVMpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJkczEzMDdfcmVhZF9ibG9ja19kYXRhIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQltZW1jcHkob2xkdmFsdWVzLCB2YWx1ZXMsIGxlbmd0aCk7CisJCXJldCA9IGRzMTMwN19yZWFkX2Jsb2NrX2RhdGFfb25jZShjbGllbnQsIGNvbW1hbmQsIGxlbmd0aCwKKwkJCQkJCSAgdmFsdWVzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0gd2hpbGUgKG1lbWNtcChvbGR2YWx1ZXMsIHZhbHVlcywgbGVuZ3RoKSk7CisJcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIHMzMiBkczEzMDdfd3JpdGVfYmxvY2tfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorCQkJCSAgIHU4IGxlbmd0aCwgY29uc3QgdTggKnZhbHVlcykKK3sKKwl1OCBjdXJydmFsdWVzW0kyQ19TTUJVU19CTE9DS19NQVhdOworCWludCB0cmllcyA9IDA7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgImRzMTMwN193cml0ZV9ibG9ja19kYXRhIChsZW5ndGg9JWQpXG4iLCBsZW5ndGgpOworCWRvIHsKKwkJczMyIGksIHJldDsKKworCQlpZiAoKyt0cmllcyA+IEJMT0NLX0RBVEFfTUFYX1RSSUVTKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiZHMxMzA3X3dyaXRlX2Jsb2NrX2RhdGEgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIGNvbW1hbmQgKyBpLAorCQkJCQkJCXZhbHVlc1tpXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IGRzMTMwN19yZWFkX2Jsb2NrX2RhdGFfb25jZShjbGllbnQsIGNvbW1hbmQsIGxlbmd0aCwKKwkJCQkJCSAgY3VycnZhbHVlcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IHdoaWxlIChtZW1jbXAoY3VycnZhbHVlcywgdmFsdWVzLCBsZW5ndGgpKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhlIElSUSBsb2dpYyBpbmNsdWRlcyBhICJyZWFsIiBoYW5kbGVyIHJ1bm5pbmcgaW4gSVJRIGNvbnRleHQganVzdAorICogbG9uZyBlbm91Z2ggdG8gc2NoZWR1bGUgdGhpcyB3b3JrcXVldWUgZW50cnkuICAgV2UgbmVlZCBhIHRhc2sgY29udGV4dAorICogdG8gdGFsayB0byB0aGUgUlRDLCBzaW5jZSBJMkMgSS9PIGNhbGxzIHJlcXVpcmUgdGhhdDsgYW5kIGRpc2FibGUgdGhlCisgKiBJUlEgdW50aWwgd2UgY2xlYXIgaXRzIHN0YXR1cyBvbiB0aGUgY2hpcCwgc28gdGhhdCB0aGlzIGhhbmRsZXIgY2FuCisgKiB3b3JrIHdpdGggYW55IHR5cGUgb2YgdHJpZ2dlcmluZyAobm90IGp1c3QgZmFsbGluZyBlZGdlKS4KKyAqCisgKiBUaGUgZHMxMzM3IGFuZCBkczEzMzkgYm90aCBoYXZlIHR3byBhbGFybXMsIGJ1dCB3ZSBvbmx5IHVzZSB0aGUgZmlyc3QKKyAqIG9uZSAod2l0aCBhICJzZWNvbmRzIiBmaWVsZCkuICBGb3IgZHMxMzM3IHdlIGV4cGVjdCBuSU5UQSBpcyBvdXIgYWxhcm0KKyAqIHNpZ25hbDsgZHMxMzM5IGNoaXBzIGhhdmUgb25seSBvbmUgYWxhcm0gc2lnbmFsLgorICovCitzdGF0aWMgdm9pZCBkczEzMDdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRzMTMwNwkJKmRzMTMwNzsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCBtdXRleAkJKmxvY2s7CisJaW50CQkJc3RhdCwgY29udHJvbDsKKworCWRzMTMwNyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHMxMzA3LCB3b3JrKTsKKwljbGllbnQgPSBkczEzMDctPmNsaWVudDsKKwlsb2NrID0gJmRzMTMwNy0+cnRjLT5vcHNfbG9jazsKKworCW11dGV4X2xvY2sobG9jayk7CisJc3RhdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfU1RBVFVTKTsKKwlpZiAoc3RhdCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKHN0YXQgJiBEUzEzMzdfQklUX0ExSSkgeworCQlzdGF0ICY9IH5EUzEzMzdfQklUX0ExSTsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfU1RBVFVTLCBzdGF0KTsKKworCQljb250cm9sID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19DT05UUk9MKTsKKwkJaWYgKGNvbnRyb2wgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJY29udHJvbCAmPSB+RFMxMzM3X0JJVF9BMUlFOworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19DT05UUk9MLCBjb250cm9sKTsKKworCQlydGNfdXBkYXRlX2lycShkczEzMDctPnJ0YywgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCX0KKworb3V0OgorCWlmICh0ZXN0X2JpdChIQVNfQUxBUk0sICZkczEzMDctPmZsYWdzKSkKKwkJZW5hYmxlX2lycShjbGllbnQtPmlycSk7CisJbXV0ZXhfdW5sb2NrKGxvY2spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHMxMzA3X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudCA9IGRldl9pZDsKKwlzdHJ1Y3QgZHMxMzA3CQkqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwlzY2hlZHVsZV93b3JrKCZkczEzMDctPndvcmspOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBkczEzMDdfZ2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCit7CisJc3RydWN0IGRzMTMwNwkqZHMxMzA3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50CQl0bXA7CisKKwkvKiByZWFkIHRoZSBSVEMgZGF0ZSBhbmQgdGltZSByZWdpc3RlcnMgYWxsIGF0IG9uY2UgKi8KKwl0bXAgPSBkczEzMDctPnJlYWRfYmxvY2tfZGF0YShkczEzMDctPmNsaWVudCwKKwkJZHMxMzA3LT5vZmZzZXQsIDcsIGRzMTMwNy0+cmVncyk7CisJaWYgKHRtcCAhPSA3KSB7CisJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJyZWFkIiwgdG1wKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2X2RiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSJyZWFkIiwKKwkJCWRzMTMwNy0+cmVnc1swXSwgZHMxMzA3LT5yZWdzWzFdLAorCQkJZHMxMzA3LT5yZWdzWzJdLCBkczEzMDctPnJlZ3NbM10sCisJCQlkczEzMDctPnJlZ3NbNF0sIGRzMTMwNy0+cmVnc1s1XSwKKwkJCWRzMTMwNy0+cmVnc1s2XSk7CisKKwl0LT50bV9zZWMgPSBiY2QyYmluKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdICYgMHg3Zik7CisJdC0+dG1fbWluID0gYmNkMmJpbihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NSU5dICYgMHg3Zik7CisJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl0gJiAweDNmOworCXQtPnRtX2hvdXIgPSBiY2QyYmluKHRtcCk7CisJdC0+dG1fd2RheSA9IGJjZDJiaW4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfV0RBWV0gJiAweDA3KSAtIDE7CisJdC0+dG1fbWRheSA9IGJjZDJiaW4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTURBWV0gJiAweDNmKTsKKwl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NT05USF0gJiAweDFmOworCXQtPnRtX21vbiA9IGJjZDJiaW4odG1wKSAtIDE7CisKKwkvKiBhc3N1bWUgMjBZWSBub3QgMTlZWSwgYW5kIGlnbm9yZSBEUzEzMzdfQklUX0NFTlRVUlkgKi8KKwl0LT50bV95ZWFyID0gYmNkMmJpbihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19ZRUFSXSkgKyAxMDA7CisKKwlkZXZfZGJnKGRldiwgIiVzIHNlY3M9JWQsIG1pbnM9JWQsICIKKwkJImhvdXJzPSVkLCBtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCSJyZWFkIiwgdC0+dG1fc2VjLCB0LT50bV9taW4sCisJCXQtPnRtX2hvdXIsIHQtPnRtX21kYXksCisJCXQtPnRtX21vbiwgdC0+dG1feWVhciwgdC0+dG1fd2RheSk7CisKKwkvKiBpbml0aWFsIGNsb2NrIHNldHRpbmcgY2FuIGJlIHVuZGVmaW5lZCAqLworCXJldHVybiBydGNfdmFsaWRfdG0odCk7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzA3X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQoreworCXN0cnVjdCBkczEzMDcJKmRzMTMwNyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludAkJcmVzdWx0OworCWludAkJdG1wOworCXU4CQkqYnVmID0gZHMxMzA3LT5yZWdzOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQkid3JpdGUiLCB0LT50bV9zZWMsIHQtPnRtX21pbiwKKwkJdC0+dG1faG91ciwgdC0+dG1fbWRheSwKKwkJdC0+dG1fbW9uLCB0LT50bV95ZWFyLCB0LT50bV93ZGF5KTsKKworCWJ1ZltEUzEzMDdfUkVHX1NFQ1NdID0gYmluMmJjZCh0LT50bV9zZWMpOworCWJ1ZltEUzEzMDdfUkVHX01JTl0gPSBiaW4yYmNkKHQtPnRtX21pbik7CisJYnVmW0RTMTMwN19SRUdfSE9VUl0gPSBiaW4yYmNkKHQtPnRtX2hvdXIpOworCWJ1ZltEUzEzMDdfUkVHX1dEQVldID0gYmluMmJjZCh0LT50bV93ZGF5ICsgMSk7CisJYnVmW0RTMTMwN19SRUdfTURBWV0gPSBiaW4yYmNkKHQtPnRtX21kYXkpOworCWJ1ZltEUzEzMDdfUkVHX01PTlRIXSA9IGJpbjJiY2QodC0+dG1fbW9uICsgMSk7CisKKwkvKiBhc3N1bWUgMjBZWSBub3QgMTlZWSAqLworCXRtcCA9IHQtPnRtX3llYXIgLSAxMDA7CisJYnVmW0RTMTMwN19SRUdfWUVBUl0gPSBiaW4yYmNkKHRtcCk7CisKKwlzd2l0Y2ggKGRzMTMwNy0+dHlwZSkgeworCWNhc2UgZHNfMTMzNzoKKwljYXNlIGRzXzEzMzk6CisJY2FzZSBkc18zMjMxOgorCQlidWZbRFMxMzA3X1JFR19NT05USF0gfD0gRFMxMzM3X0JJVF9DRU5UVVJZOworCQlicmVhazsKKwljYXNlIGRzXzEzNDA6CisJCWJ1ZltEUzEzMDdfUkVHX0hPVVJdIHw9IERTMTM0MF9CSVRfQ0VOVFVSWV9FTgorCQkJCXwgRFMxMzQwX0JJVF9DRU5UVVJZOworCQlicmVhazsKKwljYXNlIG1jcDc5NDF4OgorCQkvKgorCQkgKiB0aGVzZSBiaXRzIHdlcmUgY2xlYXJlZCB3aGVuIHByZXBhcmluZyB0aGUgZGF0ZS90aW1lCisJCSAqIHZhbHVlcyBhbmQgbmVlZCB0byBiZSBzZXQgYWdhaW4gYmVmb3JlIHdyaXRpbmcgdGhlCisJCSAqIGJ1ZmZlciBvdXQgdG8gdGhlIGRldmljZS4KKwkJICovCisJCWJ1ZltEUzEzMDdfUkVHX1NFQ1NdIHw9IE1DUDc5NDFYX0JJVF9TVDsKKwkJYnVmW0RTMTMwN19SRUdfV0RBWV0gfD0gTUNQNzk0MVhfQklUX1ZCQVRFTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZGV2X2RiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJIndyaXRlIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAorCQlidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKKworCXJlc3VsdCA9IGRzMTMwNy0+d3JpdGVfYmxvY2tfZGF0YShkczEzMDctPmNsaWVudCwKKwkJZHMxMzA3LT5vZmZzZXQsIDcsIGJ1Zik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgIndyaXRlIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzM3X3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBkczEzMDcJCSpkczEzMDcgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQJCQlyZXQ7CisKKwlpZiAoIXRlc3RfYml0KEhBU19BTEFSTSwgJmRzMTMwNy0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHJlYWQgYWxsIEFMQVJNMSwgQUxBUk0yLCBhbmQgc3RhdHVzIHJlZ2lzdGVycyBhdCBvbmNlICovCisJcmV0ID0gZHMxMzA3LT5yZWFkX2Jsb2NrX2RhdGEoY2xpZW50LAorCQkJRFMxMzM5X1JFR19BTEFSTTFfU0VDUywgOSwgZHMxMzA3LT5yZWdzKTsKKwlpZiAocmV0ICE9IDkpIHsKKwkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgImFsYXJtIHJlYWQiLCByZXQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkZXZfZGJnKGRldiwgIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4LCAlMDJ4ICUwMnggJTAyeCwgJTAyeCAlMDJ4XG4iLAorCQkJImFsYXJtIHJlYWQiLAorCQkJZHMxMzA3LT5yZWdzWzBdLCBkczEzMDctPnJlZ3NbMV0sCisJCQlkczEzMDctPnJlZ3NbMl0sIGRzMTMwNy0+cmVnc1szXSwKKwkJCWRzMTMwNy0+cmVnc1s0XSwgZHMxMzA3LT5yZWdzWzVdLAorCQkJZHMxMzA3LT5yZWdzWzZdLCBkczEzMDctPnJlZ3NbN10sCisJCQlkczEzMDctPnJlZ3NbOF0pOworCisJLyoKKwkgKiByZXBvcnQgYWxhcm0gdGltZSAoQUxBUk0xKTsgYXNzdW1lIDI0IGhvdXIgYW5kIGRheS1vZi1tb250aCBtb2RlcywKKwkgKiBhbmQgdGhhdCBhbGwgZm91ciBmaWVsZHMgYXJlIGNoZWNrZWQgbWF0Y2hlcworCSAqLworCXQtPnRpbWUudG1fc2VjID0gYmNkMmJpbihkczEzMDctPnJlZ3NbMF0gJiAweDdmKTsKKwl0LT50aW1lLnRtX21pbiA9IGJjZDJiaW4oZHMxMzA3LT5yZWdzWzFdICYgMHg3Zik7CisJdC0+dGltZS50bV9ob3VyID0gYmNkMmJpbihkczEzMDctPnJlZ3NbMl0gJiAweDNmKTsKKwl0LT50aW1lLnRtX21kYXkgPSBiY2QyYmluKGRzMTMwNy0+cmVnc1szXSAmIDB4M2YpOworCXQtPnRpbWUudG1fbW9uID0gLTE7CisJdC0+dGltZS50bV95ZWFyID0gLTE7CisJdC0+dGltZS50bV93ZGF5ID0gLTE7CisJdC0+dGltZS50bV95ZGF5ID0gLTE7CisJdC0+dGltZS50bV9pc2RzdCA9IC0xOworCisJLyogLi4uIGFuZCBzdGF0dXMgKi8KKwl0LT5lbmFibGVkID0gISEoZHMxMzA3LT5yZWdzWzddICYgRFMxMzM3X0JJVF9BMUlFKTsKKwl0LT5wZW5kaW5nID0gISEoZHMxMzA3LT5yZWdzWzhdICYgRFMxMzM3X0JJVF9BMUkpOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgZW5hYmxlZD0lZCwgcGVuZGluZz0lZFxuIiwKKwkJImFsYXJtIHJlYWQiLCB0LT50aW1lLnRtX3NlYywgdC0+dGltZS50bV9taW4sCisJCXQtPnRpbWUudG1faG91ciwgdC0+dGltZS50bV9tZGF5LAorCQl0LT5lbmFibGVkLCB0LT5wZW5kaW5nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTMzN19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBkczEzMDcJCSpkczEzMDcgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBjaGFyCQkqYnVmID0gZHMxMzA3LT5yZWdzOworCXU4CQkJY29udHJvbCwgc3RhdHVzOworCWludAkJCXJldDsKKworCWlmICghdGVzdF9iaXQoSEFTX0FMQVJNLCAmZHMxMzA3LT5mbGFncykpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgZW5hYmxlZD0lZCwgcGVuZGluZz0lZFxuIiwKKwkJImFsYXJtIHNldCIsIHQtPnRpbWUudG1fc2VjLCB0LT50aW1lLnRtX21pbiwKKwkJdC0+dGltZS50bV9ob3VyLCB0LT50aW1lLnRtX21kYXksCisJCXQtPmVuYWJsZWQsIHQtPnBlbmRpbmcpOworCisJLyogcmVhZCBjdXJyZW50IHN0YXR1cyBvZiBib3RoIGFsYXJtcyBhbmQgdGhlIGNoaXAgKi8KKwlyZXQgPSBkczEzMDctPnJlYWRfYmxvY2tfZGF0YShjbGllbnQsCisJCQlEUzEzMzlfUkVHX0FMQVJNMV9TRUNTLCA5LCBidWYpOworCWlmIChyZXQgIT0gOSkgeworCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAiYWxhcm0gd3JpdGUiLCByZXQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJY29udHJvbCA9IGRzMTMwNy0+cmVnc1s3XTsKKwlzdGF0dXMgPSBkczEzMDctPnJlZ3NbOF07CisKKwlkZXZfZGJnKGRldiwgIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4LCAlMDJ4ICUwMnggJTAyeCwgJTAyeCAlMDJ4XG4iLAorCQkJImFsYXJtIHNldCAob2xkIHN0YXR1cykiLAorCQkJZHMxMzA3LT5yZWdzWzBdLCBkczEzMDctPnJlZ3NbMV0sCisJCQlkczEzMDctPnJlZ3NbMl0sIGRzMTMwNy0+cmVnc1szXSwKKwkJCWRzMTMwNy0+cmVnc1s0XSwgZHMxMzA3LT5yZWdzWzVdLAorCQkJZHMxMzA3LT5yZWdzWzZdLCBjb250cm9sLCBzdGF0dXMpOworCisJLyogc2V0IEFMQVJNMSwgdXNpbmcgMjQgaG91ciBhbmQgZGF5LW9mLW1vbnRoIG1vZGVzICovCisJYnVmWzBdID0gYmluMmJjZCh0LT50aW1lLnRtX3NlYyk7CisJYnVmWzFdID0gYmluMmJjZCh0LT50aW1lLnRtX21pbik7CisJYnVmWzJdID0gYmluMmJjZCh0LT50aW1lLnRtX2hvdXIpOworCWJ1ZlszXSA9IGJpbjJiY2QodC0+dGltZS50bV9tZGF5KTsKKworCS8qIHNldCBBTEFSTTIgdG8gbm9uLWdhcmJhZ2UgKi8KKwlidWZbNF0gPSAwOworCWJ1Zls1XSA9IDA7CisJYnVmWzZdID0gMDsKKworCS8qIG9wdGlvbmFsbHkgZW5hYmxlIEFMQVJNMSAqLworCWJ1Zls3XSA9IGNvbnRyb2wgJiB+KERTMTMzN19CSVRfQTFJRSB8IERTMTMzN19CSVRfQTJJRSk7CisJaWYgKHQtPmVuYWJsZWQpIHsKKwkJZGV2X2RiZyhkZXYsICJhbGFybSBJUlEgYXJtZWRcbiIpOworCQlidWZbN10gfD0gRFMxMzM3X0JJVF9BMUlFOwkvKiBvbmx5IEFMQVJNMSBpcyB1c2VkICovCisJfQorCWJ1Zls4XSA9IHN0YXR1cyAmIH4oRFMxMzM3X0JJVF9BMUkgfCBEUzEzMzdfQklUX0EySSk7CisKKwlyZXQgPSBkczEzMDctPndyaXRlX2Jsb2NrX2RhdGEoY2xpZW50LAorCQkJRFMxMzM5X1JFR19BTEFSTTFfU0VDUywgOSwgYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IHNldCBhbGFybSB0aW1lXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczEzMDdfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGRzMTMwNwkJKmRzMTMwNyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludAkJCXJldDsKKworCWlmICghdGVzdF9iaXQoSEFTX0FMQVJNLCAmZHMxMzA3LT5mbGFncykpCisJCXJldHVybiAtRU5PVFRZOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19DT05UUk9MKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChlbmFibGVkKQorCQlyZXQgfD0gRFMxMzM3X0JJVF9BMUlFOworCWVsc2UKKwkJcmV0ICY9IH5EUzEzMzdfQklUX0ExSUU7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19DT05UUk9MLCByZXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEzeHhfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gZHMxMzA3X2dldF90aW1lLAorCS5zZXRfdGltZQk9IGRzMTMwN19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IGRzMTMzN19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBkczEzMzdfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gZHMxMzA3X2FsYXJtX2lycV9lbmFibGUsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3NpemVfdAorZHMxMzA3X252cmFtX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3QgZHMxMzA3CQkqZHMxMzA3OworCWludAkJCXJlc3VsdDsKKworCWNsaWVudCA9IGtvYmpfdG9faTJjX2NsaWVudChrb2JqKTsKKwlkczEzMDcgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmICh1bmxpa2VseShvZmYgPj0gZHMxMzA3LT5udnJhbS0+c2l6ZSkpCisJCXJldHVybiAwOworCWlmICgob2ZmICsgY291bnQpID4gZHMxMzA3LT5udnJhbS0+c2l6ZSkKKwkJY291bnQgPSBkczEzMDctPm52cmFtLT5zaXplIC0gb2ZmOworCWlmICh1bmxpa2VseSghY291bnQpKQorCQlyZXR1cm4gY291bnQ7CisKKwlyZXN1bHQgPSBkczEzMDctPnJlYWRfYmxvY2tfZGF0YShjbGllbnQsIGRzMTMwNy0+bnZyYW1fb2Zmc2V0ICsgb2ZmLAorCQkJCQkJCQljb3VudCwgYnVmKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBlcnJvciAlZFxuIiwgIm52cmFtIHJlYWQiLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitkczEzMDdfbnZyYW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3QgZHMxMzA3CQkqZHMxMzA3OworCWludAkJCXJlc3VsdDsKKworCWNsaWVudCA9IGtvYmpfdG9faTJjX2NsaWVudChrb2JqKTsKKwlkczEzMDcgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmICh1bmxpa2VseShvZmYgPj0gZHMxMzA3LT5udnJhbS0+c2l6ZSkpCisJCXJldHVybiAtRUZCSUc7CisJaWYgKChvZmYgKyBjb3VudCkgPiBkczEzMDctPm52cmFtLT5zaXplKQorCQljb3VudCA9IGRzMTMwNy0+bnZyYW0tPnNpemUgLSBvZmY7CisJaWYgKHVubGlrZWx5KCFjb3VudCkpCisJCXJldHVybiBjb3VudDsKKworCXJlc3VsdCA9IGRzMTMwNy0+d3JpdGVfYmxvY2tfZGF0YShjbGllbnQsIGRzMTMwNy0+bnZyYW1fb2Zmc2V0ICsgb2ZmLAorCQkJCQkJCQljb3VudCwgYnVmKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGVycm9yICVkXG4iLCAibnZyYW0gd3JpdGUiLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRzMTMwN19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkczEzMDcJCSpkczEzMDc7CisJaW50CQkJZXJyID0gLUVOT0RFVjsKKwlpbnQJCQl0bXA7CisJY29uc3Qgc3RydWN0IGNoaXBfZGVzYwkqY2hpcCA9ICZjaGlwc1tpZC0+ZHJpdmVyX2RhdGFdOworCXN0cnVjdCBpMmNfYWRhcHRlcgkqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CisJaW50CQkJd2FudF9pcnEgPSBmYWxzZTsKKwl1bnNpZ25lZCBjaGFyCQkqYnVmOworCXN0YXRpYyBjb25zdCBpbnQJYmJzcWlfYml0cG9zW10gPSB7CisJCVtkc18xMzM3XSA9IDAsCisJCVtkc18xMzM5XSA9IERTMTMzOV9CSVRfQkJTUUksCisJCVtkc18zMjMxXSA9IERTMzIzMV9CSVRfQkJTUVcsCisJfTsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKQorCSAgICAmJiAhaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKSkKKwkJcmV0dXJuIC1FSU87CisKKwlkczEzMDcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMxMzA3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkczEzMDcpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZHMxMzA3KTsKKworCWRzMTMwNy0+Y2xpZW50CT0gY2xpZW50OworCWRzMTMwNy0+dHlwZQk9IGlkLT5kcml2ZXJfZGF0YTsKKwlkczEzMDctPm9mZnNldAk9IDA7CisKKwlidWYgPSBkczEzMDctPnJlZ3M7CisJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSykpIHsKKwkJZHMxMzA3LT5yZWFkX2Jsb2NrX2RhdGEgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YTsKKwkJZHMxMzA3LT53cml0ZV9ibG9ja19kYXRhID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhOworCX0gZWxzZSB7CisJCWRzMTMwNy0+cmVhZF9ibG9ja19kYXRhID0gZHMxMzA3X3JlYWRfYmxvY2tfZGF0YTsKKwkJZHMxMzA3LT53cml0ZV9ibG9ja19kYXRhID0gZHMxMzA3X3dyaXRlX2Jsb2NrX2RhdGE7CisJfQorCisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIGRzXzEzMzc6CisJY2FzZSBkc18xMzM5OgorCWNhc2UgZHNfMzIzMToKKwkJLyogZ2V0IHJlZ2lzdGVycyB0aGF0IHRoZSAicnRjIiByZWFkIGJlbG93IHdvbid0IHJlYWQuLi4gKi8KKwkJdG1wID0gZHMxMzA3LT5yZWFkX2Jsb2NrX2RhdGEoZHMxMzA3LT5jbGllbnQsCisJCQkJRFMxMzM3X1JFR19DT05UUk9MLCAyLCBidWYpOworCQlpZiAodG1wICE9IDIpIHsKKwkJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisKKwkJLyogb3NjaWxsYXRvciBvZmY/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKGRzMTMwNy0+cmVnc1swXSAmIERTMTMzN19CSVRfbkVPU0MpCisJCQlkczEzMDctPnJlZ3NbMF0gJj0gfkRTMTMzN19CSVRfbkVPU0M7CisKKwkJLyoKKwkJICogVXNpbmcgSVJRPyAgRGlzYWJsZSB0aGUgc3F1YXJlIHdhdmUgYW5kIGJvdGggYWxhcm1zLgorCQkgKiBGb3Igc29tZSB2YXJpYW50cywgYmUgc3VyZSBhbGFybXMgY2FuIHRyaWdnZXIgd2hlbiB3ZSdyZQorCQkgKiBydW5uaW5nIG9uIFZiYWNrdXAgKEJCU1FJL0JCU1FXKQorCQkgKi8KKwkJaWYgKGRzMTMwNy0+Y2xpZW50LT5pcnEgPiAwICYmIGNoaXAtPmFsYXJtKSB7CisJCQlJTklUX1dPUksoJmRzMTMwNy0+d29yaywgZHMxMzA3X3dvcmspOworCisJCQlkczEzMDctPnJlZ3NbMF0gfD0gRFMxMzM3X0JJVF9JTlRDTgorCQkJCQl8IGJic3FpX2JpdHBvc1tkczEzMDctPnR5cGVdOworCQkJZHMxMzA3LT5yZWdzWzBdICY9IH4oRFMxMzM3X0JJVF9BMklFIHwgRFMxMzM3X0JJVF9BMUlFKTsKKworCQkJd2FudF9pcnEgPSB0cnVlOworCQl9CisKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfQ09OVFJPTCwKKwkJCQkJCQlkczEzMDctPnJlZ3NbMF0pOworCisJCS8qIG9zY2lsbGF0b3IgZmF1bHQ/ICBjbGVhciBmbGFnLCBhbmQgd2FybiAqLworCQlpZiAoZHMxMzA3LT5yZWdzWzFdICYgRFMxMzM3X0JJVF9PU0YpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMzdfUkVHX1NUQVRVUywKKwkJCQlkczEzMDctPnJlZ3NbMV0gJiB+RFMxMzM3X0JJVF9PU0YpOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgcnhfODAyNToKKwkJdG1wID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZHMxMzA3LT5jbGllbnQsCisJCQkJUlg4MDI1X1JFR19DVFJMMSA8PCA0IHwgMHgwOCwgMiwgYnVmKTsKKwkJaWYgKHRtcCAhPSAyKSB7CisJCQlwcl9kZWJ1ZygicmVhZCBlcnJvciAlZFxuIiwgdG1wKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCisJCS8qIG9zY2lsbGF0b3Igb2ZmPyAgdHVybiBpdCBvbiwgc28gY2xvY2sgY2FuIHRpY2suICovCisJCWlmICghKGRzMTMwNy0+cmVnc1sxXSAmIFJYODAyNV9CSVRfWFNUKSkgeworCQkJZHMxMzA3LT5yZWdzWzFdIHw9IFJYODAyNV9CSVRfWFNUOworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgIFJYODAyNV9SRUdfQ1RSTDIgPDwgNCB8IDB4MDgsCisJCQkJCQkgIGRzMTMwNy0+cmVnc1sxXSk7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsCisJCQkJICJvc2NpbGxhdG9yIHN0b3AgZGV0ZWN0ZWQgLSBTRVQgVElNRSFcbiIpOworCQl9CisKKwkJaWYgKGRzMTMwNy0+cmVnc1sxXSAmIFJYODAyNV9CSVRfUE9OKSB7CisJCQlkczEzMDctPnJlZ3NbMV0gJj0gflJYODAyNV9CSVRfUE9OOworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgIFJYODAyNV9SRUdfQ1RSTDIgPDwgNCB8IDB4MDgsCisJCQkJCQkgIGRzMTMwNy0+cmVnc1sxXSk7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJwb3dlci1vbiBkZXRlY3RlZFxuIik7CisJCX0KKworCQlpZiAoZHMxMzA3LT5yZWdzWzFdICYgUlg4MDI1X0JJVF9WREVUKSB7CisJCQlkczEzMDctPnJlZ3NbMV0gJj0gflJYODAyNV9CSVRfVkRFVDsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICBSWDgwMjVfUkVHX0NUUkwyIDw8IDQgfCAweDA4LAorCQkJCQkJICBkczEzMDctPnJlZ3NbMV0pOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAidm9sdGFnZSBkcm9wIGRldGVjdGVkXG4iKTsKKwkJfQorCisJCS8qIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBpbiAyNGhvdXIgbW9kZSAqLworCQlpZiAoIShkczEzMDctPnJlZ3NbMF0gJiBSWDgwMjVfQklUXzI0MTIpKSB7CisJCQl1OCBob3VyOworCisJCQkvKiBzd2l0Y2ggdG8gMjQgaG91ciBtb2RlICovCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgUlg4MDI1X1JFR19DVFJMMSA8PCA0IHwgMHgwOCwKKwkJCQkJCSAgZHMxMzA3LT5yZWdzWzBdIHwKKwkJCQkJCSAgUlg4MDI1X0JJVF8yNDEyKTsKKworCQkJdG1wID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZHMxMzA3LT5jbGllbnQsCisJCQkJCVJYODAyNV9SRUdfQ1RSTDEgPDwgNCB8IDB4MDgsIDIsIGJ1Zik7CisJCQlpZiAodG1wICE9IDIpIHsKKwkJCQlwcl9kZWJ1ZygicmVhZCBlcnJvciAlZFxuIiwgdG1wKTsKKwkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gZXhpdF9mcmVlOworCQkJfQorCisJCQkvKiBjb3JyZWN0IGhvdXIgKi8KKwkJCWhvdXIgPSBiY2QyYmluKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0hPVVJdKTsKKwkJCWlmIChob3VyID09IDEyKQorCQkJCWhvdXIgPSAwOworCQkJaWYgKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0hPVVJdICYgRFMxMzA3X0JJVF9QTSkKKwkJCQlob3VyICs9IDEyOworCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgRFMxMzA3X1JFR19IT1VSIDw8IDQgfCAweDA4LAorCQkJCQkJICBob3VyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGRzXzEzODg6CisJCWRzMTMwNy0+b2Zmc2V0ID0gMTsgLyogU2Vjb25kcyBzdGFydHMgYXQgMSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKK3JlYWRfcnRjOgorCS8qIHJlYWQgUlRDIHJlZ2lzdGVycyAqLworCXRtcCA9IGRzMTMwNy0+cmVhZF9ibG9ja19kYXRhKGRzMTMwNy0+Y2xpZW50LCBkczEzMDctPm9mZnNldCwgOCwgYnVmKTsKKwlpZiAodG1wICE9IDgpIHsKKwkJcHJfZGVidWcoInJlYWQgZXJyb3IgJWRcbiIsIHRtcCk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCS8qCisJICogbWluaW1hbCBzYW5pdHkgY2hlY2tpbmc7IHNvbWUgY2hpcHMgKGxpa2UgRFMxMzQwKSBkb24ndAorCSAqIHNwZWNpZnkgdGhlIGV4dHJhIGJpdHMgYXMgbXVzdC1iZS16ZXJvLCBidXQgdGhlcmUgYXJlCisJICogc3RpbGwgYSBmZXcgdmFsdWVzIHRoYXQgYXJlIGNsZWFybHkgb3V0LW9mLXJhbmdlLgorCSAqLworCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdOworCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CisJY2FzZSBkc18xMzA3OgorCWNhc2UgbTQxdDAwOgorCQkvKiBjbG9jayBoYWx0ZWQ/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKHRtcCAmIERTMTMwN19CSVRfQ0gpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX1NFQ1MsIDApOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKKwkJCWdvdG8gcmVhZF9ydGM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkc18xMzM4OgorCQkvKiBjbG9jayBoYWx0ZWQ/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKHRtcCAmIERTMTMwN19CSVRfQ0gpCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzA3X1JFR19TRUNTLCAwKTsKKworCQkvKiBvc2NpbGxhdG9yIGZhdWx0PyAgY2xlYXIgZmxhZywgYW5kIHdhcm4gKi8KKwkJaWYgKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0NPTlRST0xdICYgRFMxMzM4X0JJVF9PU0YpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX0NPTlRST0wsCisJCQkJCWRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0NPTlRST0xdCisJCQkJCSYgfkRTMTMzOF9CSVRfT1NGKTsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlNFVCBUSU1FIVxuIik7CisJCQlnb3RvIHJlYWRfcnRjOworCQl9CisJCWJyZWFrOworCWNhc2UgZHNfMTM0MDoKKwkJLyogY2xvY2sgaGFsdGVkPyAgdHVybiBpdCBvbiwgc28gY2xvY2sgY2FuIHRpY2suICovCisJCWlmICh0bXAgJiBEUzEzNDBfQklUX25FT1NDKQorCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMwN19SRUdfU0VDUywgMCk7CisKKwkJdG1wID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzQwX1JFR19GTEFHKTsKKwkJaWYgKHRtcCA8IDApIHsKKwkJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisKKwkJLyogb3NjaWxsYXRvciBmYXVsdD8gIGNsZWFyIGZsYWcsIGFuZCB3YXJuICovCisJCWlmICh0bXAgJiBEUzEzNDBfQklUX09TRikgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTM0MF9SRUdfRkxBRywgMCk7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJTRVQgVElNRSFcbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgbWNwNzk0MXg6CisJCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBiYWNrdXAgYmF0dGVyeSBpcyBlbmFibGVkICovCisJCWlmICghKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1dEQVldICYgTUNQNzk0MVhfQklUX1ZCQVRFTikpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX1dEQVksCisJCQkJCWRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1dEQVldCisJCQkJCXwgTUNQNzk0MVhfQklUX1ZCQVRFTik7CisJCX0KKworCQkvKiBjbG9jayBoYWx0ZWQ/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKCEodG1wICYgTUNQNzk0MVhfQklUX1NUKSkgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMwN19SRUdfU0VDUywKKwkJCQkJTUNQNzk0MVhfQklUX1NUKTsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlNFVCBUSU1FIVxuIik7CisJCQlnb3RvIHJlYWRfcnRjOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl07CisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIGRzXzEzNDA6CisJY2FzZSBtNDF0MDA6CisJCS8qCisJCSAqIE5PVEU6IGlnbm9yZXMgY2VudHVyeSBiaXRzOyBmaXggYmVmb3JlIGRlcGxveWluZworCQkgKiBzeXN0ZW1zIHRoYXQgd2lsbCBydW4gdGhyb3VnaCB5ZWFyIDIxMDAuCisJCSAqLworCQlicmVhazsKKwljYXNlIHJ4XzgwMjU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICghKHRtcCAmIERTMTMwN19CSVRfMTJIUikpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBCZSBzdXJlIHdlJ3JlIGluIDI0IGhvdXIgbW9kZS4gIE11bHRpLW1hc3RlciBzeXN0ZW1zCisJCSAqIHRha2Ugbm90ZS4uLgorCQkgKi8KKwkJdG1wID0gYmNkMmJpbih0bXAgJiAweDFmKTsKKwkJaWYgKHRtcCA9PSAxMikKKwkJCXRtcCA9IDA7CisJCWlmIChkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19IT1VSXSAmIERTMTMwN19CSVRfUE0pCisJCQl0bXAgKz0gMTI7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCWRzMTMwNy0+b2Zmc2V0ICsgRFMxMzA3X1JFR19IT1VSLAorCQkJCWJpbjJiY2QodG1wKSk7CisJfQorCisJZHMxMzA3LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKGNsaWVudC0+bmFtZSwgJmNsaWVudC0+ZGV2LAorCQkJCSZkczEzeHhfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIoZHMxMzA3LT5ydGMpKSB7CisJCWVyciA9IFBUUl9FUlIoZHMxMzA3LT5ydGMpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJ1bmFibGUgdG8gcmVnaXN0ZXIgdGhlIGNsYXNzIGRldmljZVxuIik7CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCWlmICh3YW50X2lycSkgeworCQllcnIgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgZHMxMzA3X2lycSwgSVJRRl9TSEFSRUQsCisJCQkgIGRzMTMwNy0+cnRjLT5uYW1lLCBjbGllbnQpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkidW5hYmxlIHRvIHJlcXVlc3QgSVJRIVxuIik7CisJCQlnb3RvIGV4aXRfaXJxOworCQl9CisKKwkJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmY2xpZW50LT5kZXYsIDEpOworCQlzZXRfYml0KEhBU19BTEFSTSwgJmRzMTMwNy0+ZmxhZ3MpOworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImdvdCBJUlEgJWRcbiIsIGNsaWVudC0+aXJxKTsKKwl9CisKKwlpZiAoY2hpcC0+bnZyYW1fc2l6ZSkgeworCQlkczEzMDctPm52cmFtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJpbl9hdHRyaWJ1dGUpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIWRzMTMwNy0+bnZyYW0pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGV4aXRfbnZyYW07CisJCX0KKwkJZHMxMzA3LT5udnJhbS0+YXR0ci5uYW1lID0gIm52cmFtIjsKKwkJZHMxMzA3LT5udnJhbS0+YXR0ci5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1I7CisJCXN5c2ZzX2Jpbl9hdHRyX2luaXQoZHMxMzA3LT5udnJhbSk7CisJCWRzMTMwNy0+bnZyYW0tPnJlYWQgPSBkczEzMDdfbnZyYW1fcmVhZCwKKwkJZHMxMzA3LT5udnJhbS0+d3JpdGUgPSBkczEzMDdfbnZyYW1fd3JpdGUsCisJCWRzMTMwNy0+bnZyYW0tPnNpemUgPSBjaGlwLT5udnJhbV9zaXplOworCQlkczEzMDctPm52cmFtX29mZnNldCA9IGNoaXAtPm52cmFtX29mZnNldDsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZjbGllbnQtPmRldi5rb2JqLCBkczEzMDctPm52cmFtKTsKKwkJaWYgKGVycikgeworCQkJa2ZyZWUoZHMxMzA3LT5udnJhbSk7CisJCQlnb3RvIGV4aXRfbnZyYW07CisJCX0KKwkJc2V0X2JpdChIQVNfTlZSQU0sICZkczEzMDctPmZsYWdzKTsKKwkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXp1IGJ5dGVzIG52cmFtXG4iLCBkczEzMDctPm52cmFtLT5zaXplKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9udnJhbToKK2V4aXRfaXJxOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihkczEzMDctPnJ0Yyk7CitleGl0X2ZyZWU6CisJa2ZyZWUoZHMxMzA3KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEzMDdfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGRzMTMwNyAqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhBU19BTEFSTSwgJmRzMTMwNy0+ZmxhZ3MpKSB7CisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBjbGllbnQpOworCQljYW5jZWxfd29ya19zeW5jKCZkczEzMDctPndvcmspOworCX0KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSEFTX05WUkFNLCAmZHMxMzA3LT5mbGFncykpIHsKKwkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZjbGllbnQtPmRldi5rb2JqLCBkczEzMDctPm52cmFtKTsKKwkJa2ZyZWUoZHMxMzA3LT5udnJhbSk7CisJfQorCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGRzMTMwNy0+cnRjKTsKKwlrZnJlZShkczEzMDcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHMxMzA3X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJydGMtZHMxMzA3IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gZHMxMzA3X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHMxMzA3X3JlbW92ZSksCisJLmlkX3RhYmxlCT0gZHMxMzA3X2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoZHMxMzA3X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiUlRDIGRyaXZlciBmb3IgRFMxMzA3IGFuZCBzaW1pbGFyIGNoaXBzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxMzc0LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxMzc0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2MzE2MAotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczEzNzQuYwpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIFJUQyBjbGllbnQvZHJpdmVyIGZvciB0aGUgTWF4aW0vRGFsbGFzIERTMTM3NCBSZWFsLVRpbWUgQ2xvY2sgb3ZlciBJMkMKKyAqCisgKiBCYXNlZCBvbiBjb2RlIGJ5IFJhbmR5IFZpbnNvbiA8cnZpbnNvbkBtdmlzdGEuY29tPiwKKyAqIHdoaWNoIHdhcyBiYXNlZCBvbiB0aGUgbTQxdDAwLmMgYnkgTWFyayBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yCisgKgorICogMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworLyoKKyAqIEl0IHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvIHVzZSBpMmMgbXNncy9pMmNfdHJhbnNmZXIgZGlyZWN0bHkgYnV0LCBhcworICogcmVjb21tZW5lZCBpbiAuLi4vRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzIHNlY3Rpb24KKyAqICJTZW5kaW5nIGFuZCByZWNlaXZpbmciLCB1c2luZyBTTUJ1cyBsZXZlbCBjb21tdW5pY2F0aW9uIGlzIHByZWZlcnJlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNkZWZpbmUgRFMxMzc0X1JFR19UT0QwCQkweDAwIC8qIFRpbWUgb2YgRGF5ICovCisjZGVmaW5lIERTMTM3NF9SRUdfVE9EMQkJMHgwMQorI2RlZmluZSBEUzEzNzRfUkVHX1RPRDIJCTB4MDIKKyNkZWZpbmUgRFMxMzc0X1JFR19UT0QzCQkweDAzCisjZGVmaW5lIERTMTM3NF9SRUdfV0RBTE0wCTB4MDQgLyogV2F0Y2hkb2cvQWxhcm0gKi8KKyNkZWZpbmUgRFMxMzc0X1JFR19XREFMTTEJMHgwNQorI2RlZmluZSBEUzEzNzRfUkVHX1dEQUxNMgkweDA2CisjZGVmaW5lIERTMTM3NF9SRUdfQ1IJCTB4MDcgLyogQ29udHJvbCAqLworI2RlZmluZSBEUzEzNzRfUkVHX0NSX0FJRQkweDAxIC8qIEFsYXJtIEludC4gRW5hYmxlICovCisjZGVmaW5lIERTMTM3NF9SRUdfQ1JfV0RBTE0JMHgyMCAvKiAxPVdhdGNoZG9nLCAwPUFsYXJtICovCisjZGVmaW5lIERTMTM3NF9SRUdfQ1JfV0FDRQkweDQwIC8qIFdEL0FsYXJtIGNvdW50ZXIgZW5hYmxlICovCisjZGVmaW5lIERTMTM3NF9SRUdfU1IJCTB4MDggLyogU3RhdHVzICovCisjZGVmaW5lIERTMTM3NF9SRUdfU1JfT1NGCTB4ODAgLyogT3NjaWxsYXRvciBTdG9wIEZsYWcgKi8KKyNkZWZpbmUgRFMxMzc0X1JFR19TUl9BRgkweDAxIC8qIEFsYXJtIEZsYWcgKi8KKyNkZWZpbmUgRFMxMzc0X1JFR19UQ1IJCTB4MDkgLyogVHJpY2tsZSBDaGFyZ2UgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGRzMTM3NF9pZFtdID0geworCXsgImRzMTM3NCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZHMxMzc0X2lkKTsKKworc3RydWN0IGRzMTM3NCB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCisJLyogVGhlIG11dGV4IHByb3RlY3RzIGFsYXJtIG9wZXJhdGlvbnMsIGFuZCBwcmV2ZW50cyBhIHJhY2UKKwkgKiBiZXR3ZWVuIHRoZSBlbmFibGVfaXJxKCkgaW4gdGhlIHdvcmtxdWV1ZSBhbmQgdGhlIGZyZWVfaXJxKCkKKwkgKiBpbiB0aGUgcmVtb3ZlIGZ1bmN0aW9uLgorCSAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlpbnQgZXhpdGluZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczEzNzRfZHJpdmVyOworCitzdGF0aWMgaW50IGRzMTM3NF9yZWFkX3J0YyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MzIgKnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnLCBpbnQgbmJ5dGVzKQoreworCXU4IGJ1Zls0XTsKKwlpbnQgcmV0OworCWludCBpOworCisJaWYgKG5ieXRlcyA+IDQpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCByZWcsIG5ieXRlcywgYnVmKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPCBuYnl0ZXMpCisJCXJldHVybiAtRUlPOworCisJZm9yIChpID0gbmJ5dGVzIC0gMSwgKnRpbWUgPSAwOyBpID49IDA7IGktLSkKKwkJKnRpbWUgPSAoKnRpbWUgPDwgOCkgfCBidWZbaV07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczEzNzRfd3JpdGVfcnRjKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWcsIGludCBuYnl0ZXMpCit7CisJdTggYnVmWzRdOworCWludCBpOworCisJaWYgKG5ieXRlcyA+IDQpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKSB7CisJCWJ1ZltpXSA9IHRpbWUgJiAweGZmOworCQl0aW1lID4+PSA4OworCX0KKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCByZWcsIG5ieXRlcywgYnVmKTsKK30KKworc3RhdGljIGludCBkczEzNzRfY2hlY2tfcnRjX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCByZXQgPSAwOworCWludCBjb250cm9sLCBzdGF0OworCisJc3RhdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERTMTM3NF9SRUdfU1IpOworCWlmIChzdGF0IDwgMCkKKwkJcmV0dXJuIHN0YXQ7CisKKwlpZiAoc3RhdCAmIERTMTM3NF9SRUdfU1JfT1NGKQorCQlkZXZfd2FybigmY2xpZW50LT5kZXYsCisJCSAgICAgICAgICJvc2NpbGxhdG9yIGRpc2NvbnRpbnVpdHkgZmxhZ2dlZCwgIgorCQkgICAgICAgICAidGltZSB1bnJlbGlhYmxlXG4iKTsKKworCXN0YXQgJj0gfihEUzEzNzRfUkVHX1NSX09TRiB8IERTMTM3NF9SRUdfU1JfQUYpOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTM3NF9SRUdfU1IsIHN0YXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgdGhlIGFsYXJtIGlzIHBlbmRpbmcsIGNsZWFyIGl0IGJlZm9yZSByZXF1ZXN0aW5nCisJICogdGhlIGludGVycnVwdCwgc28gYW4gaW50ZXJydXB0IGV2ZW50IGlzbid0IHJlcG9ydGVkCisJICogYmVmb3JlIGV2ZXJ5dGhpbmcgaXMgaW5pdGlhbGl6ZWQuCisJICovCisKKwljb250cm9sID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzc0X1JFR19DUik7CisJaWYgKGNvbnRyb2wgPCAwKQorCQlyZXR1cm4gY29udHJvbDsKKworCWNvbnRyb2wgJj0gfihEUzEzNzRfUkVHX0NSX1dBQ0UgfCBEUzEzNzRfUkVHX0NSX0FJRSk7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzNzRfUkVHX0NSLCBjb250cm9sKTsKK30KKworc3RhdGljIGludCBkczEzNzRfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdTMyIGl0aW1lOworCWludCByZXQ7CisKKwlyZXQgPSBkczEzNzRfcmVhZF9ydGMoY2xpZW50LCAmaXRpbWUsIERTMTM3NF9SRUdfVE9EMCwgNCk7CisJaWYgKCFyZXQpCisJCXJ0Y190aW1lX3RvX3RtKGl0aW1lLCB0aW1lKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzc0X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdW5zaWduZWQgbG9uZyBpdGltZTsKKworCXJ0Y190bV90b190aW1lKHRpbWUsICZpdGltZSk7CisJcmV0dXJuIGRzMTM3NF93cml0ZV9ydGMoY2xpZW50LCBpdGltZSwgRFMxMzc0X1JFR19UT0QwLCA0KTsKK30KKworLyogVGhlIGRzMTM3NCBoYXMgYSBkZWNyZW1lbnRlciBmb3IgYW4gYWxhcm0sIHJhdGhlciB0aGFuIGEgY29tcGFyYXRvci4KKyAqIElmIHRoZSB0aW1lIG9mIGRheSBpcyBjaGFuZ2VkLCB0aGVuIHRoZSBhbGFybSB3aWxsIG5lZWQgdG8gYmUKKyAqIHJlc2V0LgorICovCitzdGF0aWMgaW50IGRzMTM3NF9yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGRzMTM3NCAqZHMxMzc0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIG5vdywgY3VyX2FsYXJtOworCWludCBjciwgc3I7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY2xpZW50LT5pcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkczEzNzQtPm11dGV4KTsKKworCWNyID0gcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzc0X1JFR19DUik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJc3IgPSByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBEUzEzNzRfUkVHX1NSKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBkczEzNzRfcmVhZF9ydGMoY2xpZW50LCAmbm93LCBEUzEzNzRfUkVHX1RPRDAsIDQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gZHMxMzc0X3JlYWRfcnRjKGNsaWVudCwgJmN1cl9hbGFybSwgRFMxMzc0X1JFR19XREFMTTAsIDMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcnRjX3RpbWVfdG9fdG0obm93ICsgY3VyX2FsYXJtLCAmYWxhcm0tPnRpbWUpOworCWFsYXJtLT5lbmFibGVkID0gISEoY3IgJiBEUzEzNzRfUkVHX0NSX1dBQ0UpOworCWFsYXJtLT5wZW5kaW5nID0gISEoc3IgJiBEUzEzNzRfUkVHX1NSX0FGKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZHMxMzc0LT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkczEzNzRfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGRzMTM3NCAqZHMxMzc0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHJ0Y190aW1lIG5vdzsKKwl1bnNpZ25lZCBsb25nIG5ld19hbGFybSwgaXRpbWU7CisJaW50IGNyOworCWludCByZXQgPSAwOworCisJaWYgKGNsaWVudC0+aXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZHMxMzc0X3JlYWRfdGltZShkZXYsICZub3cpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcnRjX3RtX3RvX3RpbWUoJmFsYXJtLT50aW1lLCAmbmV3X2FsYXJtKTsKKwlydGNfdG1fdG9fdGltZSgmbm93LCAmaXRpbWUpOworCisJLyogVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byByYWNlcywgaW4gYWRkaXRpb24gdG8gZGF0ZXMgdGhhdCBhcmUKKwkgKiB0cnVseSBpbiB0aGUgcGFzdC4gIFRvIGF2b2lkIHJlcXVpcmluZyB0aGUgY2FsbGVyIHRvIGNoZWNrIGZvcgorCSAqIHJhY2VzLCBkYXRlcyBpbiB0aGUgcGFzdCBhcmUgYXNzdW1lZCB0byBiZSBpbiB0aGUgcmVjZW50IHBhc3QKKwkgKiAoaS5lLiBub3Qgc29tZXRoaW5nIHRoYXQgd2UnZCByYXRoZXIgdGhlIGNhbGxlciBrbm93IGFib3V0IHZpYQorCSAqIGFuIGVycm9yKSwgYW5kIHRoZSBhbGFybSBpcyBzZXQgdG8gZ28gb2ZmIGFzIHNvb24gYXMgcG9zc2libGUuCisJICovCisJaWYgKHRpbWVfYmVmb3JlX2VxKG5ld19hbGFybSwgaXRpbWUpKQorCQluZXdfYWxhcm0gPSAxOworCWVsc2UKKwkJbmV3X2FsYXJtIC09IGl0aW1lOworCisJbXV0ZXhfbG9jaygmZHMxMzc0LT5tdXRleCk7CisKKwlyZXQgPSBjciA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERTMTM3NF9SRUdfQ1IpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIERpc2FibGUgYW55IGV4aXN0aW5nIGFsYXJtIGJlZm9yZSBzZXR0aW5nIHRoZSBuZXcgb25lCisJICogKG9yIGxhY2sgdGhlcmVvZikuICovCisJY3IgJj0gfkRTMTM3NF9SRUdfQ1JfV0FDRTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzNzRfUkVHX0NSLCBjcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gZHMxMzc0X3dyaXRlX3J0YyhjbGllbnQsIG5ld19hbGFybSwgRFMxMzc0X1JFR19XREFMTTAsIDMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGFsYXJtLT5lbmFibGVkKSB7CisJCWNyIHw9IERTMTM3NF9SRUdfQ1JfV0FDRSB8IERTMTM3NF9SRUdfQ1JfQUlFOworCQljciAmPSB+RFMxMzc0X1JFR19DUl9XREFMTTsKKworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzc0X1JFR19DUiwgY3IpOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmZHMxMzc0LT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRzMTM3NF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkZXZfaWQ7CisJc3RydWN0IGRzMTM3NCAqZHMxMzc0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwlzY2hlZHVsZV93b3JrKCZkczEzNzQtPndvcmspOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZHMxMzc0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkczEzNzQgKmRzMTM3NCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHMxMzc0LCB3b3JrKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHMxMzc0LT5jbGllbnQ7CisJaW50IHN0YXQsIGNvbnRyb2w7CisKKwltdXRleF9sb2NrKCZkczEzNzQtPm11dGV4KTsKKworCXN0YXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBEUzEzNzRfUkVHX1NSKTsKKwlpZiAoc3RhdCA8IDApCisJCWdvdG8gdW5sb2NrOworCisJaWYgKHN0YXQgJiBEUzEzNzRfUkVHX1NSX0FGKSB7CisJCXN0YXQgJj0gfkRTMTM3NF9SRUdfU1JfQUY7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzNzRfUkVHX1NSLCBzdGF0KTsKKworCQljb250cm9sID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzc0X1JFR19DUik7CisJCWlmIChjb250cm9sIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWNvbnRyb2wgJj0gfihEUzEzNzRfUkVHX0NSX1dBQ0UgfCBEUzEzNzRfUkVHX0NSX0FJRSk7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzNzRfUkVHX0NSLCBjb250cm9sKTsKKworCQlydGNfdXBkYXRlX2lycShkczEzNzQtPnJ0YywgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCX0KKworb3V0OgorCWlmICghZHMxMzc0LT5leGl0aW5nKQorCQllbmFibGVfaXJxKGNsaWVudC0+aXJxKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJmRzMTM3NC0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IGRzMTM3NF9hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZHMxMzc0ICpkczEzNzQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZHMxMzc0LT5tdXRleCk7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBEUzEzNzRfUkVHX0NSKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZW5hYmxlZCkgeworCQlyZXQgfD0gRFMxMzc0X1JFR19DUl9XQUNFIHwgRFMxMzc0X1JFR19DUl9BSUU7CisJCXJldCAmPSB+RFMxMzc0X1JFR19DUl9XREFMTTsKKwl9IGVsc2UgeworCQlyZXQgJj0gfkRTMTM3NF9SRUdfQ1JfV0FDRTsKKwl9CisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTM3NF9SRUdfQ1IsIHJldCk7CisKK291dDoKKwltdXRleF91bmxvY2soJmRzMTM3NC0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEzNzRfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gZHMxMzc0X3JlYWRfdGltZSwKKwkuc2V0X3RpbWUgPSBkczEzNzRfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBkczEzNzRfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gZHMxMzc0X3NldF9hbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZSA9IGRzMTM3NF9hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGludCBkczEzNzRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZHMxMzc0ICpkczEzNzQ7CisJaW50IHJldDsKKworCWRzMTM3NCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEzNzQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRzMTM3NCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkczEzNzQtPmNsaWVudCA9IGNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkczEzNzQpOworCisJSU5JVF9XT1JLKCZkczEzNzQtPndvcmssIGRzMTM3NF93b3JrKTsKKwltdXRleF9pbml0KCZkczEzNzQtPm11dGV4KTsKKworCXJldCA9IGRzMTM3NF9jaGVja19ydGNfc3RhdHVzKGNsaWVudCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIGRzMTM3NF9pcnEsIDAsCisJCSAgICAgICAgICAgICAgICAgICJkczEzNzQiLCBjbGllbnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IElSUVxuIik7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisKKwkJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmY2xpZW50LT5kZXYsIDEpOworCX0KKworCWRzMTM3NC0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihjbGllbnQtPm5hbWUsICZjbGllbnQtPmRldiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzMTM3NF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihkczEzNzQtPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihkczEzNzQtPnJ0Yyk7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHRoZSBjbGFzcyBkZXZpY2VcbiIpOworCQlnb3RvIG91dF9pcnE7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9pcnE6CisJaWYgKGNsaWVudC0+aXJxID4gMCkKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGNsaWVudCk7CisKK291dF9mcmVlOgorCWtmcmVlKGRzMTM3NCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHMxMzc0X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBkczEzNzQgKmRzMTM3NCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKGNsaWVudC0+aXJxID4gMCkgeworCQltdXRleF9sb2NrKCZkczEzNzQtPm11dGV4KTsKKwkJZHMxMzc0LT5leGl0aW5nID0gMTsKKwkJbXV0ZXhfdW5sb2NrKCZkczEzNzQtPm11dGV4KTsKKworCQlmcmVlX2lycShjbGllbnQtPmlycSwgY2xpZW50KTsKKwkJY2FuY2VsX3dvcmtfc3luYygmZHMxMzc0LT53b3JrKTsKKwl9CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZHMxMzc0LT5ydGMpOworCWtmcmVlKGRzMTM3NCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZHMxMzc0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisKKwlpZiAoY2xpZW50LT5pcnEgPj0gMCAmJiBkZXZpY2VfbWF5X3dha2V1cCgmY2xpZW50LT5kZXYpKQorCQllbmFibGVfaXJxX3dha2UoY2xpZW50LT5pcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTM3NF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisKKwlpZiAoY2xpZW50LT5pcnEgPj0gMCAmJiBkZXZpY2VfbWF5X3dha2V1cCgmY2xpZW50LT5kZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKGNsaWVudC0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGRzMTM3NF9wbSwgZHMxMzc0X3N1c3BlbmQsIGRzMTM3NF9yZXN1bWUpOworCisjZGVmaW5lIERTMTM3NF9QTSAoJmRzMTM3NF9wbSkKKyNlbHNlCisjZGVmaW5lIERTMTM3NF9QTSBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMTM3NF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicnRjLWRzMTM3NCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSBEUzEzNzRfUE0sCisJfSwKKwkucHJvYmUgPSBkczEzNzRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGRzMTM3NF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGRzMTM3NF9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGRzMTM3NF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJTY290dCBXb29kIDxzY290dHdvb2RAZnJlZXNjYWxlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWF4aW0vRGFsbGFzIERTMTM3NCBSVEMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxMzkwLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxMzkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBhOTllMQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczEzOTAuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIHJ0Yy1kczEzOTAuYyAtLSBkcml2ZXIgZm9yIHRoZSBEYWxsYXMvTWF4aW0gRFMxMzkwLzkzLzk0IFNQSSBSVEMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWVyY3VyeSBJTUMgTHRkCisgKiBXcml0dGVuIGJ5IE1hcmsgSmFja3NvbiA8bXBmakBtaW1jLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk9URTogQ3VycmVudGx5IHRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIGJhcmUgbWluaW11bSBmb3IgcmVhZAorICogYW5kIHdyaXRlIHRoZSBSVEMuIFRoZSBleHRyYSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGUgY2hpcCBmYW1pbHkKKyAqIChhbGFybXMsIHRyaWNrbGUgY2hhcmdlciwgZGlmZmVyZW50IGNvbnRyb2wgcmVnaXN0ZXJzKSBhcmUgdW5hdmFpbGFibGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIERTMTM5MF9SRUdfMTAwVEhTCQkweDAwCisjZGVmaW5lIERTMTM5MF9SRUdfU0VDT05EUwkJMHgwMQorI2RlZmluZSBEUzEzOTBfUkVHX01JTlVURVMJCTB4MDIKKyNkZWZpbmUgRFMxMzkwX1JFR19IT1VSUwkJMHgwMworI2RlZmluZSBEUzEzOTBfUkVHX0RBWQkJCTB4MDQKKyNkZWZpbmUgRFMxMzkwX1JFR19EQVRFCQkJMHgwNQorI2RlZmluZSBEUzEzOTBfUkVHX01PTlRIX0NFTlQJCTB4MDYKKyNkZWZpbmUgRFMxMzkwX1JFR19ZRUFSCQkJMHgwNworCisjZGVmaW5lIERTMTM5MF9SRUdfQUxBUk1fMTAwVEhTCQkweDA4CisjZGVmaW5lIERTMTM5MF9SRUdfQUxBUk1fU0VDT05EUwkweDA5CisjZGVmaW5lIERTMTM5MF9SRUdfQUxBUk1fTUlOVVRFUwkweDBBCisjZGVmaW5lIERTMTM5MF9SRUdfQUxBUk1fSE9VUlMJCTB4MEIKKyNkZWZpbmUgRFMxMzkwX1JFR19BTEFSTV9EQVlfREFURQkweDBDCisKKyNkZWZpbmUgRFMxMzkwX1JFR19DT05UUk9MCQkweDBECisjZGVmaW5lIERTMTM5MF9SRUdfU1RBVFVTCQkweDBFCisjZGVmaW5lIERTMTM5MF9SRUdfVFJJQ0tMRQkJMHgwRgorCitzdHJ1Y3QgZHMxMzkwIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXU4IHR4cnhfYnVmWzldOwkvKiBjbWQgKyA4IHJlZ2lzdGVycyAqLworfTsKKworc3RhdGljIGludCBkczEzOTBfZ2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IGRzMTM5MCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBzdGF0dXM7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2xlYXIgTVNCIHRvIGluZGljYXRlIHJlYWQgKi8KKwljaGlwLT50eHJ4X2J1ZlswXSA9IGFkZHJlc3MgJiAweDdmOworCS8qIGRvIHRoZSBpL28gKi8KKwlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgY2hpcC0+dHhyeF9idWYsIDEsIGNoaXAtPnR4cnhfYnVmLCAxKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisKKwkqZGF0YSA9IGNoaXAtPnR4cnhfYnVmWzFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzkwX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZHMxMzkwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHN0YXR1czsKKworCS8qIGJ1aWxkIHRoZSBtZXNzYWdlICovCisJY2hpcC0+dHhyeF9idWZbMF0gPSBEUzEzOTBfUkVHX1NFQ09ORFM7CisKKwkvKiBkbyB0aGUgaS9vICovCisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGNoaXAtPnR4cnhfYnVmLCAxLCBjaGlwLT50eHJ4X2J1ZiwgOCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogVGhlIGNoaXAgc2VuZHMgZGF0YSBpbiB0aGlzIG9yZGVyOgorCSAqIFNlY29uZHMsIE1pbnV0ZXMsIEhvdXJzLCBEYXksIERhdGUsIE1vbnRoIC8gQ2VudHVyeSwgWWVhciAqLworCWR0LT50bV9zZWMJPSBiY2QyYmluKGNoaXAtPnR4cnhfYnVmWzBdKTsKKwlkdC0+dG1fbWluCT0gYmNkMmJpbihjaGlwLT50eHJ4X2J1ZlsxXSk7CisJZHQtPnRtX2hvdXIJPSBiY2QyYmluKGNoaXAtPnR4cnhfYnVmWzJdKTsKKwlkdC0+dG1fd2RheQk9IGJjZDJiaW4oY2hpcC0+dHhyeF9idWZbM10pOworCWR0LT50bV9tZGF5CT0gYmNkMmJpbihjaGlwLT50eHJ4X2J1Zls0XSk7CisJLyogbWFzayBvZmYgY2VudHVyeSBiaXQgKi8KKwlkdC0+dG1fbW9uCT0gYmNkMmJpbihjaGlwLT50eHJ4X2J1Zls1XSAmIDB4N2YpIC0gMTsKKwkvKiBhZGp1c3QgZm9yIGNlbnR1cnkgYml0ICovCisJZHQtPnRtX3llYXIgPSBiY2QyYmluKGNoaXAtPnR4cnhfYnVmWzZdKSArICgoY2hpcC0+dHhyeF9idWZbNV0gJiAweDgwKSA/IDEwMCA6IDApOworCisJcmV0dXJuIHJ0Y192YWxpZF90bShkdCk7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzkwX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCBkczEzOTAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCS8qIGJ1aWxkIHRoZSBtZXNzYWdlICovCisJY2hpcC0+dHhyeF9idWZbMF0gPSBEUzEzOTBfUkVHX1NFQ09ORFMgfCAweDgwOworCWNoaXAtPnR4cnhfYnVmWzFdID0gYmluMmJjZChkdC0+dG1fc2VjKTsKKwljaGlwLT50eHJ4X2J1ZlsyXSA9IGJpbjJiY2QoZHQtPnRtX21pbik7CisJY2hpcC0+dHhyeF9idWZbM10gPSBiaW4yYmNkKGR0LT50bV9ob3VyKTsKKwljaGlwLT50eHJ4X2J1Zls0XSA9IGJpbjJiY2QoZHQtPnRtX3dkYXkpOworCWNoaXAtPnR4cnhfYnVmWzVdID0gYmluMmJjZChkdC0+dG1fbWRheSk7CisJY2hpcC0+dHhyeF9idWZbNl0gPSBiaW4yYmNkKGR0LT50bV9tb24gKyAxKSB8CisJCQkJKChkdC0+dG1feWVhciA+IDk5KSA/IDB4ODAgOiAweDAwKTsKKwljaGlwLT50eHJ4X2J1Zls3XSA9IGJpbjJiY2QoZHQtPnRtX3llYXIgJSAxMDApOworCisJLyogZG8gdGhlIGkvbyAqLworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgY2hpcC0+dHhyeF9idWYsIDgsIE5VTEwsIDApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxMzkwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGRzMTM5MF9yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gZHMxMzkwX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZHMxMzkwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdW5zaWduZWQgY2hhciB0bXA7CisJc3RydWN0IGRzMTM5MCAqY2hpcDsKKwlpbnQgcmVzOworCisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mICpjaGlwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBjaGlwKTsKKworCXJlcyA9IGRzMTM5MF9nZXRfcmVnKCZzcGktPmRldiwgRFMxMzkwX1JFR19TRUNPTkRTLCAmdG1wKTsKKwlpZiAocmVzICE9IDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bmFibGUgdG8gcmVhZCBkZXZpY2VcbiIpOworCQlrZnJlZShjaGlwKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwljaGlwLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEzOTAiLAorCQkJCSZzcGktPmRldiwgJmRzMTM5MF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihjaGlwLT5ydGMpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZVxuIik7CisJCXJlcyA9IFBUUl9FUlIoY2hpcC0+cnRjKTsKKwkJa2ZyZWUoY2hpcCk7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHMxMzkwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBkczEzOTAgKmNoaXAgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5ydGMpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBkczEzOTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJ0Yy1kczEzOTAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IGRzMTM5MF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoZHMxMzkwX3JlbW92ZSksCit9OworCittb2R1bGVfc3BpX2RyaXZlcihkczEzOTBfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYWxsYXMvTWF4aW0gRFMxMzkwLzkzLzk0IFNQSSBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYXJrIEphY2tzb24gPG1wZmpAbWltYy5jby51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygic3BpOnJ0Yy1kczEzOTAiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjY3NWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCkBAIC0wLDAgKzEsNTg4IEBACisvKgorICogQW4gcnRjIGRyaXZlciBmb3IgdGhlIERhbGxhcyBEUzE1MTEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXRzdXNoaSBOZW1vdG8gPGFuZW1vQG1iYS5vY24ubmUuanA+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW5kcmV3IFNoYXJwIDxhbmR5LnNoYXJwQGxzaS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBSZWFsIHRpbWUgY2xvY2sgZHJpdmVyIGZvciB0aGUgRGFsbGFzIDE1MTEgY2hpcCwgd2hpY2ggYWxzbworICogY29udGFpbnMgYSB3YXRjaGRvZyB0aW1lci4gIFRoZXJlIGlzIGEgdGlueSBhbW91bnQgb2YgY29kZSB0aGF0CisgKiBwbGF0Zm9ybSBjb2RlIGNvdWxkIHVzZSB0byBtZXNzIHdpdGggdGhlIHdhdGNoZG9nIGRldmljZSBhIGxpdHRsZQorICogYml0LCBidXQgbm90IGEgZnVsbCB3YXRjaGRvZyBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNiIKKworZW51bSBkczE1MTFyZWcgeworCURTMTUxMV9TRUMgPSAweDAsCisJRFMxNTExX01JTiA9IDB4MSwKKwlEUzE1MTFfSE9VUiA9IDB4MiwKKwlEUzE1MTFfRE9XID0gMHgzLAorCURTMTUxMV9ET00gPSAweDQsCisJRFMxNTExX01PTlRIID0gMHg1LAorCURTMTUxMV9ZRUFSID0gMHg2LAorCURTMTUxMV9DRU5UVVJZID0gMHg3LAorCURTMTUxMV9BTTFfU0VDID0gMHg4LAorCURTMTUxMV9BTTJfTUlOID0gMHg5LAorCURTMTUxMV9BTTNfSE9VUiA9IDB4YSwKKwlEUzE1MTFfQU00X0RBVEUgPSAweGIsCisJRFMxNTExX1dEX01TRUMgPSAweGMsCisJRFMxNTExX1dEX1NFQyA9IDB4ZCwKKwlEUzE1MTFfQ09OVFJPTF9BID0gMHhlLAorCURTMTUxMV9DT05UUk9MX0IgPSAweGYsCisJRFMxNTExX1JBTUFERFJfTFNCID0gMHgxMCwKKwlEUzE1MTFfUkFNREFUQSA9IDB4MTMKK307CisKKyNkZWZpbmUgRFMxNTExX0JMRjEJMHg4MAorI2RlZmluZSBEUzE1MTFfQkxGMgkweDQwCisjZGVmaW5lIERTMTUxMV9QUlMJMHgyMAorI2RlZmluZSBEUzE1MTFfUEFCCTB4MTAKKyNkZWZpbmUgRFMxNTExX1RERgkweDA4CisjZGVmaW5lIERTMTUxMV9LU0YJMHgwNAorI2RlZmluZSBEUzE1MTFfV0RGCTB4MDIKKyNkZWZpbmUgRFMxNTExX0lSUUYJMHgwMQorI2RlZmluZSBEUzE1MTFfVEUJMHg4MAorI2RlZmluZSBEUzE1MTFfQ1MJMHg0MAorI2RlZmluZSBEUzE1MTFfQk1FCTB4MjAKKyNkZWZpbmUgRFMxNTExX1RQRQkweDEwCisjZGVmaW5lIERTMTUxMV9USUUJMHgwOAorI2RlZmluZSBEUzE1MTFfS0lFCTB4MDQKKyNkZWZpbmUgRFMxNTExX1dERQkweDAyCisjZGVmaW5lIERTMTUxMV9XRFMJMHgwMQorI2RlZmluZSBEUzE1MTFfUkFNX01BWAkweGZmCisKKyNkZWZpbmUgUlRDX0NNRAkJRFMxNTExX0NPTlRST0xfQgorI2RlZmluZSBSVENfQ01EMQlEUzE1MTFfQ09OVFJPTF9BCisKKyNkZWZpbmUgUlRDX0FMQVJNX1NFQwlEUzE1MTFfQU0xX1NFQworI2RlZmluZSBSVENfQUxBUk1fTUlOCURTMTUxMV9BTTJfTUlOCisjZGVmaW5lIFJUQ19BTEFSTV9IT1VSCURTMTUxMV9BTTNfSE9VUgorI2RlZmluZSBSVENfQUxBUk1fREFURQlEUzE1MTFfQU00X0RBVEUKKworI2RlZmluZSBSVENfU0VDCQlEUzE1MTFfU0VDCisjZGVmaW5lIFJUQ19NSU4JCURTMTUxMV9NSU4KKyNkZWZpbmUgUlRDX0hPVVIJRFMxNTExX0hPVVIKKyNkZWZpbmUgUlRDX0RPVwkJRFMxNTExX0RPVworI2RlZmluZSBSVENfRE9NCQlEUzE1MTFfRE9NCisjZGVmaW5lIFJUQ19NT04JCURTMTUxMV9NT05USAorI2RlZmluZSBSVENfWUVBUglEUzE1MTFfWUVBUgorI2RlZmluZSBSVENfQ0VOVFVSWQlEUzE1MTFfQ0VOVFVSWQorCisjZGVmaW5lIFJUQ19USUUJRFMxNTExX1RJRQorI2RlZmluZSBSVENfVEUJRFMxNTExX1RFCisKK3N0cnVjdCBydGNfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOwkJLyogdmlydHVhbCBiYXNlIGFkZHJlc3MgKi8KKwlpbnQgc2l6ZTsJCQkJLyogYW1vdW50IG9mIG1lbW9yeSBtYXBwZWQgKi8KKwlpbnQgaXJxOworCXVuc2lnbmVkIGludCBpcnFlbjsKKwlpbnQgYWxybV9zZWM7CisJaW50IGFscm1fbWluOworCWludCBhbHJtX2hvdXI7CisJaW50IGFscm1fbWRheTsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRzMTUxMV9sb2NrKTsKKworc3RhdGljIF9faW9tZW0gY2hhciAqZHMxNTExX2Jhc2U7CitzdGF0aWMgdTMyIHJlZ19zcGFjaW5nID0gMTsKKworIHN0YXRpYyBub2lubGluZSB2b2lkCitydGNfd3JpdGUodWludDhfdCB2YWwsIHVpbnQzMl90IHJlZykKK3sKKwl3cml0ZWIodmFsLCBkczE1MTFfYmFzZSArIChyZWcgKiByZWdfc3BhY2luZykpOworfQorCisgc3RhdGljIGlubGluZSB2b2lkCitydGNfd3JpdGVfYWxhcm0odWludDhfdCB2YWwsIGVudW0gZHMxNTExcmVnIHJlZykKK3sKKwlydGNfd3JpdGUoKHZhbCB8IDB4ODApLCByZWcpOworfQorCisgc3RhdGljIG5vaW5saW5lIHVpbnQ4X3QKK3J0Y19yZWFkKGVudW0gZHMxNTExcmVnIHJlZykKK3sKKwlyZXR1cm4gcmVhZGIoZHMxNTExX2Jhc2UgKyAocmVnICogcmVnX3NwYWNpbmcpKTsKK30KKworIHN0YXRpYyBpbmxpbmUgdm9pZAorcnRjX2Rpc2FibGVfdXBkYXRlKHZvaWQpCit7CisJcnRjX3dyaXRlKChydGNfcmVhZChSVENfQ01EKSAmIH5SVENfVEUpLCBSVENfQ01EKTsKK30KKworIHN0YXRpYyB2b2lkCitydGNfZW5hYmxlX3VwZGF0ZSh2b2lkKQoreworCXJ0Y193cml0ZSgocnRjX3JlYWQoUlRDX0NNRCkgfCBSVENfVEUpLCBSVENfQ01EKTsKK30KKworLyoKKyAqICNkZWZpbmUgRFMxNTExX1dET0dfUkVTRVRfU1VQUE9SVAorICoKKyAqIFVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHRvIHVzZSB0aGVzZSByb3V0aW5lcyBpbgorICogc29tZSBwbGF0Zm9ybSBjb2RlLgorICovCisjaWZkZWYgRFMxNTExX1dET0dfUkVTRVRfU1VQUE9SVAorLyoKKyAqIGp1c3QgZW5vdWdoIGNvZGUgdG8gc2V0IHRoZSB3YXRjaGRvZyB0aW1lciBzbyB0aGF0IGl0CisgKiB3aWxsIHJlYm9vdCB0aGUgc3lzdGVtCisgKi8KKyB2b2lkCitkczE1MTFfd2RvZ19zZXQodW5zaWduZWQgbG9uZyBkZWNpc2Vjb25kcykKK3sKKwkvKgorCSAqIHRoZSB3ZG9nIHRpbWVyIGNhbiB0YWtlIDk5Ljk5IHNlY29uZHMKKwkgKi8KKwlkZWNpc2Vjb25kcyAlPSAxMDAwMDsKKwkvKgorCSAqIHNldCB0aGUgd2RvZyB2YWx1ZXMgaW4gdGhlIHdkb2cgcmVnaXN0ZXJzCisJICovCisJcnRjX3dyaXRlKGJpbjJiY2QoZGVjaXNlY29uZHMgJSAxMDApLCBEUzE1MTFfV0RfTVNFQyk7CisJcnRjX3dyaXRlKGJpbjJiY2QoZGVjaXNlY29uZHMgLyAxMDApLCBEUzE1MTFfV0RfU0VDKTsKKwkvKgorCSAqIHNldCB3ZG9nIGVuYWJsZSBhbmQgd2RvZyAnc3RlZXJpbmcnIGJpdCB0byBpc3N1ZSBhIHJlc2V0CisJICovCisJcnRjX3dyaXRlKERTMTUxMV9XREUgfCBEUzE1MTFfV0RTLCBSVENfQ01EKTsKK30KKworIHZvaWQKK2RzMTUxMV93ZG9nX2Rpc2FibGUodm9pZCkKK3sKKwkvKgorCSAqIGNsZWFyIHdkb2cgZW5hYmxlIGFuZCB3ZG9nICdzdGVlcmluZycgYml0cworCSAqLworCXJ0Y193cml0ZShydGNfcmVhZChSVENfQ01EKSAmIH4oRFMxNTExX1dERSB8IERTMTUxMV9XRFMpLCBSVENfQ01EKTsKKwkvKgorCSAqIGNsZWFyIHRoZSB3ZG9nIGNvdW50ZXIKKwkgKi8KKwlydGNfd3JpdGUoMCwgRFMxNTExX1dEX01TRUMpOworCXJ0Y193cml0ZSgwLCBEUzE1MTFfV0RfU0VDKTsKK30KKyNlbmRpZgorCisvKgorICogc2V0IHRoZSBydGMgY2hpcCdzIGlkZWEgb2YgdGhlIHRpbWUuCisgKiBzdHVwaWRseSwgc29tZSBjYWxsZXJzIGNhbGwgd2l0aCB5ZWFyIHVubW9sZXN0ZWQ7CisgKiBhbmQgc29tZSBjYWxsIHdpdGggIHllYXIgPSB5ZWFyIC0gMTkwMC4gIHRoYW5rcy4KKyAqLworc3RhdGljIGludCBkczE1MTFfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdTggbW9uLCBkYXksIGRvdywgaHJzLCBtaW4sIHNlYywgeXJzLCBjZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogd29uJ3QgaGF2ZSB0byBjaGFuZ2UgdGhpcyBmb3IgYSB3aGlsZQorCSAqLworCWlmIChydGNfdG0tPnRtX3llYXIgPCAxOTAwKSB7CisJCXJ0Y190bS0+dG1feWVhciArPSAxOTAwOworCX0KKworCWlmIChydGNfdG0tPnRtX3llYXIgPCAxOTcwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl5cnMgPSBydGNfdG0tPnRtX3llYXIgJSAxMDA7CisJY2VuID0gcnRjX3RtLT50bV95ZWFyIC8gMTAwOworCW1vbiA9IHJ0Y190bS0+dG1fbW9uICsgMTsgICAvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwlkYXkgPSBydGNfdG0tPnRtX21kYXk7CisJZG93ID0gcnRjX3RtLT50bV93ZGF5ICYgMHg3OyAvKiBhdXRvbWF0aWMgQkNEICovCisJaHJzID0gcnRjX3RtLT50bV9ob3VyOworCW1pbiA9IHJ0Y190bS0+dG1fbWluOworCXNlYyA9IHJ0Y190bS0+dG1fc2VjOworCisJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGF5ID4gcnRjX21vbnRoX2RheXMocnRjX3RtLT50bV9tb24sIHJ0Y190bS0+dG1feWVhcikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChocnMgPj0gMjQpIHx8IChtaW4gPj0gNjApIHx8IChzZWMgPj0gNjApKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogZWFjaCByZWdpc3RlciBpcyBhIGRpZmZlcmVudCBudW1iZXIgb2YgdmFsaWQgYml0cworCSAqLworCXNlYyA9IGJpbjJiY2Qoc2VjKSAmIDB4N2Y7CisJbWluID0gYmluMmJjZChtaW4pICYgMHg3ZjsKKwlocnMgPSBiaW4yYmNkKGhycykgJiAweDNmOworCWRheSA9IGJpbjJiY2QoZGF5KSAmIDB4M2Y7CisJbW9uID0gYmluMmJjZChtb24pICYgMHgxZjsKKwl5cnMgPSBiaW4yYmNkKHlycykgJiAweGZmOworCWNlbiA9IGJpbjJiY2QoY2VuKSAmIDB4ZmY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHMxNTExX2xvY2ssIGZsYWdzKTsKKwlydGNfZGlzYWJsZV91cGRhdGUoKTsKKwlydGNfd3JpdGUoY2VuLCBSVENfQ0VOVFVSWSk7CisJcnRjX3dyaXRlKHlycywgUlRDX1lFQVIpOworCXJ0Y193cml0ZSgocnRjX3JlYWQoUlRDX01PTikgJiAweGUwKSB8IG1vbiwgUlRDX01PTik7CisJcnRjX3dyaXRlKGRheSwgUlRDX0RPTSk7CisJcnRjX3dyaXRlKGhycywgUlRDX0hPVVIpOworCXJ0Y193cml0ZShtaW4sIFJUQ19NSU4pOworCXJ0Y193cml0ZShzZWMsIFJUQ19TRUMpOworCXJ0Y193cml0ZShkb3csIFJUQ19ET1cpOworCXJ0Y19lbmFibGVfdXBkYXRlKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxNTExX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTUxMV9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgaW50IGNlbnR1cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkczE1MTFfbG9jaywgZmxhZ3MpOworCXJ0Y19kaXNhYmxlX3VwZGF0ZSgpOworCisJcnRjX3RtLT50bV9zZWMgPSBydGNfcmVhZChSVENfU0VDKSAmIDB4N2Y7CisJcnRjX3RtLT50bV9taW4gPSBydGNfcmVhZChSVENfTUlOKSAmIDB4N2Y7CisJcnRjX3RtLT50bV9ob3VyID0gcnRjX3JlYWQoUlRDX0hPVVIpICYgMHgzZjsKKwlydGNfdG0tPnRtX21kYXkgPSBydGNfcmVhZChSVENfRE9NKSAmIDB4M2Y7CisJcnRjX3RtLT50bV93ZGF5ID0gcnRjX3JlYWQoUlRDX0RPVykgJiAweDc7CisJcnRjX3RtLT50bV9tb24gPSBydGNfcmVhZChSVENfTU9OKSAmIDB4MWY7CisJcnRjX3RtLT50bV95ZWFyID0gcnRjX3JlYWQoUlRDX1lFQVIpICYgMHg3ZjsKKwljZW50dXJ5ID0gcnRjX3JlYWQoUlRDX0NFTlRVUlkpOworCisJcnRjX2VuYWJsZV91cGRhdGUoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkczE1MTFfbG9jaywgZmxhZ3MpOworCisJcnRjX3RtLT50bV9zZWMgPSBiY2QyYmluKHJ0Y190bS0+dG1fc2VjKTsKKwlydGNfdG0tPnRtX21pbiA9IGJjZDJiaW4ocnRjX3RtLT50bV9taW4pOworCXJ0Y190bS0+dG1faG91ciA9IGJjZDJiaW4ocnRjX3RtLT50bV9ob3VyKTsKKwlydGNfdG0tPnRtX21kYXkgPSBiY2QyYmluKHJ0Y190bS0+dG1fbWRheSk7CisJcnRjX3RtLT50bV93ZGF5ID0gYmNkMmJpbihydGNfdG0tPnRtX3dkYXkpOworCXJ0Y190bS0+dG1fbW9uID0gYmNkMmJpbihydGNfdG0tPnRtX21vbik7CisJcnRjX3RtLT50bV95ZWFyID0gYmNkMmJpbihydGNfdG0tPnRtX3llYXIpOworCWNlbnR1cnkgPSBiY2QyYmluKGNlbnR1cnkpICogMTAwOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKwljZW50dXJ5ICs9IHJ0Y190bS0+dG1feWVhcjsKKwlydGNfdG0tPnRtX3llYXIgPSBjZW50dXJ5IC0gMTkwMDsKKworCXJ0Y190bS0+dG1fbW9uLS07CisKKwlpZiAocnRjX3ZhbGlkX3RtKHJ0Y190bSkgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicmV0cmlldmVkIGRhdGUvdGltZSBpcyBub3QgdmFsaWQuXG4iKTsKKwkJcnRjX3RpbWVfdG9fdG0oMCwgcnRjX3RtKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB3cml0ZSB0aGUgYWxhcm0gcmVnaXN0ZXIgc2V0dGluZ3MKKyAqCisgKiB3ZSBvbmx5IGhhdmUgdGhlIHVzZSB0byBpbnRlcnJ1cHQgZXZlcnkgc2Vjb25kLCBvdGhlcndpc2UKKyAqIGtub3duIGFzIHRoZSB1cGRhdGUgaW50ZXJydXB0LCBvciB0aGUgaW50ZXJydXB0IGlmIHRoZSB3aG9sZQorICogZGF0ZS9ob3Vycy9taW5zL3NlY3MgbWF0Y2hlcy4gIHRoZSBkczE1MTEgaGFzIG1hbnkgbW9yZQorICogcGVybXV0YXRpb25zLCBidXQgdGhlIGtlcm5lbCBkb2Vzbid0LgorICovCisgc3RhdGljIHZvaWQKK2RzMTUxMV9ydGNfdXBkYXRlX2FsYXJtKHN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRhLT5sb2NrLCBmbGFncyk7CisJcnRjX3dyaXRlKHBkYXRhLT5hbHJtX21kYXkgPCAwIHx8IChwZGF0YS0+aXJxZW4gJiBSVENfVUYpID8KKwkgICAgICAgMHg4MCA6IGJpbjJiY2QocGRhdGEtPmFscm1fbWRheSkgJiAweDNmLAorCSAgICAgICBSVENfQUxBUk1fREFURSk7CisJcnRjX3dyaXRlKHBkYXRhLT5hbHJtX2hvdXIgPCAwIHx8IChwZGF0YS0+aXJxZW4gJiBSVENfVUYpID8KKwkgICAgICAgMHg4MCA6IGJpbjJiY2QocGRhdGEtPmFscm1faG91cikgJiAweDNmLAorCSAgICAgICBSVENfQUxBUk1fSE9VUik7CisJcnRjX3dyaXRlKHBkYXRhLT5hbHJtX21pbiA8IDAgfHwgKHBkYXRhLT5pcnFlbiAmIFJUQ19VRikgPworCSAgICAgICAweDgwIDogYmluMmJjZChwZGF0YS0+YWxybV9taW4pICYgMHg3ZiwKKwkgICAgICAgUlRDX0FMQVJNX01JTik7CisJcnRjX3dyaXRlKHBkYXRhLT5hbHJtX3NlYyA8IDAgfHwgKHBkYXRhLT5pcnFlbiAmIFJUQ19VRikgPworCSAgICAgICAweDgwIDogYmluMmJjZChwZGF0YS0+YWxybV9zZWMpICYgMHg3ZiwKKwkgICAgICAgUlRDX0FMQVJNX1NFQyk7CisJcnRjX3dyaXRlKHJ0Y19yZWFkKFJUQ19DTUQpIHwgKHBkYXRhLT5pcnFlbiA/IFJUQ19USUUgOiAwKSwgUlRDX0NNRCk7CisJcnRjX3JlYWQoUlRDX0NNRDEpOwkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPmxvY2ssIGZsYWdzKTsKK30KKworIHN0YXRpYyBpbnQKK2RzMTUxMV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZGF0YS0+YWxybV9tZGF5ID0gYWxybS0+dGltZS50bV9tZGF5OworCXBkYXRhLT5hbHJtX2hvdXIgPSBhbHJtLT50aW1lLnRtX2hvdXI7CisJcGRhdGEtPmFscm1fbWluID0gYWxybS0+dGltZS50bV9taW47CisJcGRhdGEtPmFscm1fc2VjID0gYWxybS0+dGltZS50bV9zZWM7CisJaWYgKGFscm0tPmVuYWJsZWQpIHsKKwkJcGRhdGEtPmlycWVuIHw9IFJUQ19BRjsKKwl9CisJZHMxNTExX3J0Y191cGRhdGVfYWxhcm0ocGRhdGEpOworCXJldHVybiAwOworfQorCisgc3RhdGljIGludAorZHMxNTExX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhbHJtLT50aW1lLnRtX21kYXkgPSBwZGF0YS0+YWxybV9tZGF5IDwgMCA/IDAgOiBwZGF0YS0+YWxybV9tZGF5OworCWFscm0tPnRpbWUudG1faG91ciA9IHBkYXRhLT5hbHJtX2hvdXIgPCAwID8gMCA6IHBkYXRhLT5hbHJtX2hvdXI7CisJYWxybS0+dGltZS50bV9taW4gPSBwZGF0YS0+YWxybV9taW4gPCAwID8gMCA6IHBkYXRhLT5hbHJtX21pbjsKKwlhbHJtLT50aW1lLnRtX3NlYyA9IHBkYXRhLT5hbHJtX3NlYyA8IDAgPyAwIDogcGRhdGEtPmFscm1fc2VjOworCWFscm0tPmVuYWJsZWQgPSAocGRhdGEtPmlycWVuICYgUlRDX0FGKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCisgc3RhdGljIGlycXJldHVybl90CitkczE1MTFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2lkOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKKworCXNwaW5fbG9jaygmcGRhdGEtPmxvY2spOworCS8qCisJICogcmVhZCBhbmQgY2xlYXIgaW50ZXJydXB0CisJICovCisJaWYgKHJ0Y19yZWFkKFJUQ19DTUQxKSAmIERTMTUxMV9JUlFGKSB7CisJCWV2ZW50cyA9IFJUQ19JUlFGOworCQlpZiAocnRjX3JlYWQoUlRDX0FMQVJNX1NFQykgJiAweDgwKQorCQkJZXZlbnRzIHw9IFJUQ19VRjsKKwkJZWxzZQorCQkJZXZlbnRzIHw9IFJUQ19BRjsKKwkJaWYgKGxpa2VseShwZGF0YS0+cnRjKSkKKwkJCXJ0Y191cGRhdGVfaXJxKHBkYXRhLT5ydGMsIDEsIGV2ZW50cyk7CisJfQorCXNwaW5fdW5sb2NrKCZwZGF0YS0+bG9jayk7CisJcmV0dXJuIGV2ZW50cyA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgZHMxNTExX3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVuYWJsZWQpCisJCXBkYXRhLT5pcnFlbiB8PSBSVENfQUY7CisJZWxzZQorCQlwZGF0YS0+aXJxZW4gJj0gflJUQ19BRjsKKwlkczE1MTFfcnRjX3VwZGF0ZV9hbGFybShwZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczE1MTFfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCQk9IGRzMTUxMV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQkJPSBkczE1MTFfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCQk9IGRzMTUxMV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCQk9IGRzMTUxMV9ydGNfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlCT0gZHMxNTExX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworIHN0YXRpYyBzc2l6ZV90CitkczE1MTFfbnZyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCSAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJhLAorCQkgIGNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3NpemVfdCBjb3VudDsKKworCS8qCisJICogaWYgY291bnQgaXMgbW9yZSB0aGFuIG9uZSwgdHVybiBvbiAiYnVyc3QiIG1vZGUKKwkgKiB0dXJuIGl0IG9mZiB3aGVuIHlvdSdyZSBkb25lCisJICovCisJaWYgKHNpemUgPiAxKSB7CisJCXJ0Y193cml0ZSgocnRjX3JlYWQoUlRDX0NNRCkgfCBEUzE1MTFfQk1FKSwgUlRDX0NNRCk7CisJfQorCWlmIChwb3MgPiBEUzE1MTFfUkFNX01BWCkgeworCQlwb3MgPSBEUzE1MTFfUkFNX01BWDsKKwl9CisJaWYgKHNpemUgKyBwb3MgPiBEUzE1MTFfUkFNX01BWCArIDEpIHsKKwkJc2l6ZSA9IERTMTUxMV9SQU1fTUFYIC0gcG9zICsgMTsKKwl9CisJcnRjX3dyaXRlKHBvcywgRFMxNTExX1JBTUFERFJfTFNCKTsKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDA7IGNvdW50KyssIHNpemUtLSkgeworCQkqYnVmKysgPSBydGNfcmVhZChEUzE1MTFfUkFNREFUQSk7CisJfQorCWlmIChjb3VudCA+IDEpIHsKKwkJcnRjX3dyaXRlKChydGNfcmVhZChSVENfQ01EKSAmIH5EUzE1MTFfQk1FKSwgUlRDX0NNRCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworIHN0YXRpYyBzc2l6ZV90CitkczE1MTFfbnZyYW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCSAgIGNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3NpemVfdCBjb3VudDsKKworCS8qCisJICogaWYgY291bnQgaXMgbW9yZSB0aGFuIG9uZSwgdHVybiBvbiAiYnVyc3QiIG1vZGUKKwkgKiB0dXJuIGl0IG9mZiB3aGVuIHlvdSdyZSBkb25lCisJICovCisJaWYgKHNpemUgPiAxKSB7CisJCXJ0Y193cml0ZSgocnRjX3JlYWQoUlRDX0NNRCkgfCBEUzE1MTFfQk1FKSwgUlRDX0NNRCk7CisJfQorCWlmIChwb3MgPiBEUzE1MTFfUkFNX01BWCkgeworCQlwb3MgPSBEUzE1MTFfUkFNX01BWDsKKwl9CisJaWYgKHNpemUgKyBwb3MgPiBEUzE1MTFfUkFNX01BWCArIDEpIHsKKwkJc2l6ZSA9IERTMTUxMV9SQU1fTUFYIC0gcG9zICsgMTsKKwl9CisJcnRjX3dyaXRlKHBvcywgRFMxNTExX1JBTUFERFJfTFNCKTsKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDA7IGNvdW50KyssIHNpemUtLSkgeworCQlydGNfd3JpdGUoKmJ1ZisrLCBEUzE1MTFfUkFNREFUQSk7CisJfQorCWlmIChjb3VudCA+IDEpIHsKKwkJcnRjX3dyaXRlKChydGNfcmVhZChSVENfQ01EKSAmIH5EUzE1MTFfQk1FKSwgUlRDX0NNRCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGRzMTUxMV9udnJhbV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJudnJhbSIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IERTMTUxMV9SQU1fTUFYLAorCS5yZWFkID0gZHMxNTExX252cmFtX3JlYWQsCisJLndyaXRlID0gZHMxNTExX252cmFtX3dyaXRlLAorfTsKKworIHN0YXRpYyBpbnQgX19kZXZpbml0CitkczE1MTFfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGE7CisJaW50IHJldCA9IDA7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGRhdGEtPnNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCBwZGF0YS0+c2l6ZSwKKwkJCXBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCWRzMTUxMV9iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHBkYXRhLT5zaXplKTsKKwlpZiAoIWRzMTUxMV9iYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwZGF0YS0+aW9hZGRyID0gZHMxNTExX2Jhc2U7CisJcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwkvKgorCSAqIHR1cm4gb24gdGhlIGNsb2NrIGFuZCB0aGUgY3J5c3RhbCwgZXRjLgorCSAqLworCXJ0Y193cml0ZSgwLCBSVENfQ01EKTsKKwlydGNfd3JpdGUoMCwgUlRDX0NNRDEpOworCS8qCisJICogY2xlYXIgdGhlIHdkb2cgY291bnRlcgorCSAqLworCXJ0Y193cml0ZSgwLCBEUzE1MTFfV0RfTVNFQyk7CisJcnRjX3dyaXRlKDAsIERTMTUxMV9XRF9TRUMpOworCS8qCisJICogc3RhcnQgdGhlIGNsb2NrCisJICovCisJcnRjX2VuYWJsZV91cGRhdGUoKTsKKworCS8qCisJICogY2hlY2sgZm9yIGEgZHlpbmcgYmF0LXRyZWUKKwkgKi8KKwlpZiAocnRjX3JlYWQoUlRDX0NNRDEpICYgRFMxNTExX0JMRjEpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInZvbHRhZ2UtbG93IGRldGVjdGVkLlxuIik7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJnBkYXRhLT5sb2NrKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJLyoKKwkgKiBpZiB0aGUgcGxhdGZvcm0gaGFzIGFuIGludGVycnVwdCBpbiBtaW5kIGZvciB0aGlzIGRldmljZSwKKwkgKiB0aGVuIGJ5IGFsbCBtZWFucywgc2V0IGl0CisJICovCisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CisJCXJ0Y19yZWFkKFJUQ19DTUQxKTsKKwkJaWYgKGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcGRhdGEtPmlycSwgZHMxNTExX2ludGVycnVwdCwKKwkJCUlSUUZfU0hBUkVELCBwZGV2LT5uYW1lLCBwZGV2KSA8IDApIHsKKworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImludGVycnVwdCBub3QgYXZhaWxhYmxlLlxuIik7CisJCQlwZGF0YS0+aXJxID0gMDsKKwkJfQorCX0KKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwgJmRzMTUxMV9ydGNfb3BzLAorCQlUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCXBkYXRhLT5ydGMgPSBydGM7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNTExX252cmFtX2F0dHIpOworCWlmIChyZXQpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKKwlyZXR1cm4gcmV0OworfQorCisgc3RhdGljIGludCBfX2RldmV4aXQKK2RzMTUxMV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNTExX252cmFtX2F0dHIpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKKwkJLyoKKwkJICogZGlzYWJsZSB0aGUgYWxhcm0gaW50ZXJydXB0CisJCSAqLworCQlydGNfd3JpdGUocnRjX3JlYWQoUlRDX0NNRCkgJiB+UlRDX1RJRSwgUlRDX0NNRCk7CisJCXJ0Y19yZWFkKFJUQ19DTUQxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpkczE1MTEiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHMxNTExX3J0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGRzMTUxMV9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczE1MTFfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImRzMTUxMSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRzMTUxMV9ydGNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQW5kcmV3IFNoYXJwIDxhbmR5LnNoYXJwQGxzaS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRhbGxhcyBEUzE1MTEgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2VkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBBbiBydGMgZHJpdmVyIGZvciB0aGUgRGFsbGFzIERTMTU1MworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zIgorCisjZGVmaW5lIFJUQ19SRUdfU0laRQkJMHgyMDAwCisjZGVmaW5lIFJUQ19PRkZTRVQJCTB4MWZmMAorCisjZGVmaW5lIFJUQ19GTEFHUwkJKFJUQ19PRkZTRVQgKyAwKQorI2RlZmluZSBSVENfU0VDT05EU19BTEFSTQkoUlRDX09GRlNFVCArIDIpCisjZGVmaW5lIFJUQ19NSU5VVEVTX0FMQVJNCShSVENfT0ZGU0VUICsgMykKKyNkZWZpbmUgUlRDX0hPVVJTX0FMQVJNCQkoUlRDX09GRlNFVCArIDQpCisjZGVmaW5lIFJUQ19EQVRFX0FMQVJNCQkoUlRDX09GRlNFVCArIDUpCisjZGVmaW5lIFJUQ19JTlRFUlJVUFRTCQkoUlRDX09GRlNFVCArIDYpCisjZGVmaW5lIFJUQ19XQVRDSERPRwkJKFJUQ19PRkZTRVQgKyA3KQorI2RlZmluZSBSVENfQ09OVFJPTAkJKFJUQ19PRkZTRVQgKyA4KQorI2RlZmluZSBSVENfQ0VOVFVSWQkJKFJUQ19PRkZTRVQgKyA4KQorI2RlZmluZSBSVENfU0VDT05EUwkJKFJUQ19PRkZTRVQgKyA5KQorI2RlZmluZSBSVENfTUlOVVRFUwkJKFJUQ19PRkZTRVQgKyAxMCkKKyNkZWZpbmUgUlRDX0hPVVJTCQkoUlRDX09GRlNFVCArIDExKQorI2RlZmluZSBSVENfREFZCQkJKFJUQ19PRkZTRVQgKyAxMikKKyNkZWZpbmUgUlRDX0RBVEUJCShSVENfT0ZGU0VUICsgMTMpCisjZGVmaW5lIFJUQ19NT05USAkJKFJUQ19PRkZTRVQgKyAxNCkKKyNkZWZpbmUgUlRDX1lFQVIJCShSVENfT0ZGU0VUICsgMTUpCisKKyNkZWZpbmUgUlRDX0NFTlRVUllfTUFTSwkweDNmCisjZGVmaW5lIFJUQ19TRUNPTkRTX01BU0sJMHg3ZgorI2RlZmluZSBSVENfREFZX01BU0sJCTB4MDcKKworLyogQml0cyBpbiB0aGUgQ29udHJvbC9DZW50dXJ5IHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19XUklURQkJMHg4MAorI2RlZmluZSBSVENfUkVBRAkJMHg0MAorCisvKiBCaXRzIGluIHRoZSBTZWNvbmRzIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19TVE9QCQkweDgwCisKKy8qIEJpdHMgaW4gdGhlIEZsYWdzIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19GTEFHU19BRgkJMHg0MAorI2RlZmluZSBSVENfRkxBR1NfQkxGCQkweDEwCisKKy8qIEJpdHMgaW4gdGhlIEludGVycnVwdHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX0lOVFNfQUUJCTB4ODAKKworc3RydWN0IHJ0Y19wbGF0X2RhdGEgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJaW50IGlycTsKKwl1bnNpZ25lZCBpbnQgaXJxZW47CisJaW50IGFscm1fc2VjOworCWludCBhbHJtX21pbjsKKwlpbnQgYWxybV9ob3VyOworCWludCBhbHJtX21kYXk7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIGludCBkczE1NTNfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXU4IGNlbnR1cnk7CisKKwljZW50dXJ5ID0gYmluMmJjZCgodG0tPnRtX3llYXIgKyAxOTAwKSAvIDEwMCk7CisKKwl3cml0ZWIoUlRDX1dSSVRFLCBwZGF0YS0+aW9hZGRyICsgUlRDX0NPTlRST0wpOworCisJd3JpdGViKGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApLCBpb2FkZHIgKyBSVENfWUVBUik7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX21vbiArIDEpLCBpb2FkZHIgKyBSVENfTU9OVEgpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV93ZGF5KSAmIFJUQ19EQVlfTUFTSywgaW9hZGRyICsgUlRDX0RBWSk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX21kYXkpLCBpb2FkZHIgKyBSVENfREFURSk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX2hvdXIpLCBpb2FkZHIgKyBSVENfSE9VUlMpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9taW4pLCBpb2FkZHIgKyBSVENfTUlOVVRFUyk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX3NlYykgJiBSVENfU0VDT05EU19NQVNLLCBpb2FkZHIgKyBSVENfU0VDT05EUyk7CisKKwkvKiBSVENfQ0VOVFVSWSBhbmQgUlRDX0NPTlRST0wgc2hhcmUgc2FtZSByZWdpc3RlciAqLworCXdyaXRlYihSVENfV1JJVEUgfCAoY2VudHVyeSAmIFJUQ19DRU5UVVJZX01BU0spLCBpb2FkZHIgKyBSVENfQ0VOVFVSWSk7CisJd3JpdGViKGNlbnR1cnkgJiBSVENfQ0VOVFVSWV9NQVNLLCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxNTUzX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdW5zaWduZWQgaW50IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB3ZWVrOworCXVuc2lnbmVkIGludCBjZW50dXJ5OworCisJLyogZ2l2ZSBlbm91Z2ggdGltZSB0byB1cGRhdGUgUlRDIGluIGNhc2Ugb2YgY29udGludW91cyByZWFkICovCisJaWYgKHBkYXRhLT5sYXN0X2ppZmZpZXMgPT0gamlmZmllcykKKwkJbXNsZWVwKDEpOworCXBkYXRhLT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCXdyaXRlYihSVENfUkVBRCwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCXNlY29uZCA9IHJlYWRiKGlvYWRkciArIFJUQ19TRUNPTkRTKSAmIFJUQ19TRUNPTkRTX01BU0s7CisJbWludXRlID0gcmVhZGIoaW9hZGRyICsgUlRDX01JTlVURVMpOworCWhvdXIgPSByZWFkYihpb2FkZHIgKyBSVENfSE9VUlMpOworCWRheSA9IHJlYWRiKGlvYWRkciArIFJUQ19EQVRFKTsKKwl3ZWVrID0gcmVhZGIoaW9hZGRyICsgUlRDX0RBWSkgJiBSVENfREFZX01BU0s7CisJbW9udGggPSByZWFkYihpb2FkZHIgKyBSVENfTU9OVEgpOworCXllYXIgPSByZWFkYihpb2FkZHIgKyBSVENfWUVBUik7CisJY2VudHVyeSA9IHJlYWRiKGlvYWRkciArIFJUQ19DRU5UVVJZKSAmIFJUQ19DRU5UVVJZX01BU0s7CisJd3JpdGViKDAsIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihzZWNvbmQpOworCXRtLT50bV9taW4gPSBiY2QyYmluKG1pbnV0ZSk7CisJdG0tPnRtX2hvdXIgPSBiY2QyYmluKGhvdXIpOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihkYXkpOworCXRtLT50bV93ZGF5ID0gYmNkMmJpbih3ZWVrKTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihtb250aCkgLSAxOworCS8qIHllYXIgaXMgMTkwMCArIHRtLT50bV95ZWFyICovCisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHllYXIpICsgYmNkMmJpbihjZW50dXJ5KSAqIDEwMCAtIDE5MDA7CisKKwlpZiAocnRjX3ZhbGlkX3RtKHRtKSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJyZXRyaWV2ZWQgZGF0ZS90aW1lIGlzIG5vdCB2YWxpZC5cbiIpOworCQlydGNfdGltZV90b190bSgwLCB0bSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkczE1NTNfcnRjX3VwZGF0ZV9hbGFybShzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPmxvY2ssIGZsYWdzKTsKKwl3cml0ZWIocGRhdGEtPmFscm1fbWRheSA8IDAgfHwgKHBkYXRhLT5pcnFlbiAmIFJUQ19VRikgPworCSAgICAgICAweDgwIDogYmluMmJjZChwZGF0YS0+YWxybV9tZGF5KSwKKwkgICAgICAgaW9hZGRyICsgUlRDX0RBVEVfQUxBUk0pOworCXdyaXRlYihwZGF0YS0+YWxybV9ob3VyIDwgMCB8fCAocGRhdGEtPmlycWVuICYgUlRDX1VGKSA/CisJICAgICAgIDB4ODAgOiBiaW4yYmNkKHBkYXRhLT5hbHJtX2hvdXIpLAorCSAgICAgICBpb2FkZHIgKyBSVENfSE9VUlNfQUxBUk0pOworCXdyaXRlYihwZGF0YS0+YWxybV9taW4gPCAwIHx8IChwZGF0YS0+aXJxZW4gJiBSVENfVUYpID8KKwkgICAgICAgMHg4MCA6IGJpbjJiY2QocGRhdGEtPmFscm1fbWluKSwKKwkgICAgICAgaW9hZGRyICsgUlRDX01JTlVURVNfQUxBUk0pOworCXdyaXRlYihwZGF0YS0+YWxybV9zZWMgPCAwIHx8IChwZGF0YS0+aXJxZW4gJiBSVENfVUYpID8KKwkgICAgICAgMHg4MCA6IGJpbjJiY2QocGRhdGEtPmFscm1fc2VjKSwKKwkgICAgICAgaW9hZGRyICsgUlRDX1NFQ09ORFNfQUxBUk0pOworCXdyaXRlYihwZGF0YS0+aXJxZW4gPyBSVENfSU5UU19BRSA6IDAsIGlvYWRkciArIFJUQ19JTlRFUlJVUFRTKTsKKwlyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpOwkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBkczE1NTNfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChwZGF0YS0+aXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCXBkYXRhLT5hbHJtX21kYXkgPSBhbHJtLT50aW1lLnRtX21kYXk7CisJcGRhdGEtPmFscm1faG91ciA9IGFscm0tPnRpbWUudG1faG91cjsKKwlwZGF0YS0+YWxybV9taW4gPSBhbHJtLT50aW1lLnRtX21pbjsKKwlwZGF0YS0+YWxybV9zZWMgPSBhbHJtLT50aW1lLnRtX3NlYzsKKwlpZiAoYWxybS0+ZW5hYmxlZCkKKwkJcGRhdGEtPmlycWVuIHw9IFJUQ19BRjsKKwlkczE1NTNfcnRjX3VwZGF0ZV9hbGFybShwZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxNTUzX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWxybS0+dGltZS50bV9tZGF5ID0gcGRhdGEtPmFscm1fbWRheSA8IDAgPyAwIDogcGRhdGEtPmFscm1fbWRheTsKKwlhbHJtLT50aW1lLnRtX2hvdXIgPSBwZGF0YS0+YWxybV9ob3VyIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9ob3VyOworCWFscm0tPnRpbWUudG1fbWluID0gcGRhdGEtPmFscm1fbWluIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9taW47CisJYWxybS0+dGltZS50bV9zZWMgPSBwZGF0YS0+YWxybV9zZWMgPCAwID8gMCA6IHBkYXRhLT5hbHJtX3NlYzsKKwlhbHJtLT5lbmFibGVkID0gKHBkYXRhLT5pcnFlbiAmIFJUQ19BRikgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRzMTU1M19ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2lkOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwlzcGluX2xvY2soJnBkYXRhLT5sb2NrKTsKKwkvKiByZWFkIGFuZCBjbGVhciBpbnRlcnJ1cHQgKi8KKwlpZiAocmVhZGIoaW9hZGRyICsgUlRDX0ZMQUdTKSAmIFJUQ19GTEFHU19BRikgeworCQlldmVudHMgPSBSVENfSVJRRjsKKwkJaWYgKHJlYWRiKGlvYWRkciArIFJUQ19TRUNPTkRTX0FMQVJNKSAmIDB4ODApCisJCQlldmVudHMgfD0gUlRDX1VGOworCQllbHNlCisJCQlldmVudHMgfD0gUlRDX0FGOworCQlpZiAobGlrZWx5KHBkYXRhLT5ydGMpKQorCQkJcnRjX3VwZGF0ZV9pcnEocGRhdGEtPnJ0YywgMSwgZXZlbnRzKTsKKwl9CisJc3Bpbl91bmxvY2soJnBkYXRhLT5sb2NrKTsKKwlyZXR1cm4gZXZlbnRzID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKK30KKworc3RhdGljIGludCBkczE1NTNfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocGRhdGEtPmlycSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZW5hYmxlZCkKKwkJcGRhdGEtPmlycWVuIHw9IFJUQ19BRjsKKwllbHNlCisJCXBkYXRhLT5pcnFlbiAmPSB+UlRDX0FGOworCWRzMTU1M19ydGNfdXBkYXRlX2FsYXJtKHBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTU1M19ydGNfb3BzID0geworCS5yZWFkX3RpbWUJCT0gZHMxNTUzX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCQk9IGRzMTU1M19ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0JCT0gZHMxNTUzX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JCT0gZHMxNTUzX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUJPSBkczE1NTNfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgc3NpemVfdCBkczE1NTNfbnZyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwlzc2l6ZV90IGNvdW50OworCisJZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IFJUQ19PRkZTRVQ7IGNvdW50KyssIHNpemUtLSkKKwkJKmJ1ZisrID0gcmVhZGIoaW9hZGRyICsgcG9zKyspOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZHMxNTUzX252cmFtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJc3NpemVfdCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBSVENfT0ZGU0VUOyBjb3VudCsrLCBzaXplLS0pCisJCXdyaXRlYigqYnVmKyssIGlvYWRkciArIHBvcysrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBkczE1NTNfbnZyYW1fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAibnZyYW0iLAorCQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSLAorCX0sCisJLnNpemUgPSBSVENfT0ZGU0VULAorCS5yZWFkID0gZHMxNTUzX252cmFtX3JlYWQsCisJLndyaXRlID0gZHMxNTUzX252cmFtX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZHMxNTUzX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgaW50IGNlbiwgc2VjOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PREVWOworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIFJUQ19SRUdfU0laRSwKKwkJCXBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaW9hZGRyID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIFJUQ19SRUdfU0laRSk7CisJaWYgKCFpb2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCXBkYXRhLT5pb2FkZHIgPSBpb2FkZHI7CisJcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwkvKiB0dXJuIFJUQyBvbiBpZiBpdCB3YXMgbm90IG9uICovCisJc2VjID0gcmVhZGIoaW9hZGRyICsgUlRDX1NFQ09ORFMpOworCWlmIChzZWMgJiBSVENfU1RPUCkgeworCQlzZWMgJj0gUlRDX1NFQ09ORFNfTUFTSzsKKwkJY2VuID0gcmVhZGIoaW9hZGRyICsgUlRDX0NFTlRVUlkpICYgUlRDX0NFTlRVUllfTUFTSzsKKwkJd3JpdGViKFJUQ19XUklURSwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCQl3cml0ZWIoc2VjLCBpb2FkZHIgKyBSVENfU0VDT05EUyk7CisJCXdyaXRlYihjZW4gJiBSVENfQ0VOVFVSWV9NQVNLLCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJfQorCWlmIChyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpICYgUlRDX0ZMQUdTX0JMRikKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInZvbHRhZ2UtbG93IGRldGVjdGVkLlxuIik7CisKKwlzcGluX2xvY2tfaW5pdCgmcGRhdGEtPmxvY2spOworCXBkYXRhLT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKKwkJd3JpdGViKDAsIGlvYWRkciArIFJUQ19JTlRFUlJVUFRTKTsKKwkJaWYgKGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcGRhdGEtPmlycSwKKwkJCQlkczE1NTNfcnRjX2ludGVycnVwdCwKKwkJCQkwLCBwZGV2LT5uYW1lLCBwZGV2KSA8IDApIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbm90IGF2YWlsYWJsZS5cbiIpOworCQkJcGRhdGEtPmlycSA9IDA7CisJCX0KKwl9CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJICAmZHMxNTUzX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisJcGRhdGEtPnJ0YyA9IHJ0YzsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkczE1NTNfbnZyYW1fYXR0cik7CisJaWYgKHJldCkKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHMxNTUzX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkczE1NTNfbnZyYW1fYXR0cik7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOworCWlmIChwZGF0YS0+aXJxID4gMCkKKwkJd3JpdGViKDAsIHBkYXRhLT5pb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtZHMxNTUzIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRzMTU1M19ydGNfZHJpdmVyID0geworCS5wcm9iZQkJPSBkczE1NTNfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHMxNTUzX3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtZHMxNTUzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZHMxNTUzX3J0Y19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGFsbGFzIERTMTU1MyBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhNjdkMAotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIEFuIHJ0Yy9pMmMgZHJpdmVyIGZvciB0aGUgRGFsbGFzIERTMTY3MgorICogQ29weXJpZ2h0IDIwMDUtMDYgVG93ZXIgVGVjaG5vbG9naWVzCisgKgorICogQXV0aG9yOiBBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40IgorCisvKiBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBEUzE2NzJfUkVHX0NOVF9CQVNFCTAKKyNkZWZpbmUgRFMxNjcyX1JFR19DT05UUk9MCTQKKyNkZWZpbmUgRFMxNjcyX1JFR19UUklDS0xFCTUKKworI2RlZmluZSBEUzE2NzJfUkVHX0NPTlRST0xfRU9TQwkweDgwCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczE2NzJfZHJpdmVyOworCisvKgorICogSW4gdGhlIHJvdXRpbmVzIHRoYXQgZGVhbCBkaXJlY3RseSB3aXRoIHRoZSBkczE2NzIgaGFyZHdhcmUsIHdlIHVzZQorICogcnRjX3RpbWUgLS0gbW9udGggMC0xMSwgaG91ciAwLTIzLCB5ciA9IGNhbGVuZGFyIHllYXItZXBvY2gKKyAqIEVwb2NoIGlzIGluaXRpYWxpemVkIGFzIDIwMDAuIFRpbWUgaXMgc2V0IHRvIFVUQy4KKyAqLworc3RhdGljIGludCBkczE2NzJfZ2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCXVuc2lnbmVkIGNoYXIgYWRkciA9IERTMTY3Ml9SRUdfQ05UX0JBU0U7CisJdW5zaWduZWQgY2hhciBidWZbNF07CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXtjbGllbnQtPmFkZHIsIDAsIDEsICZhZGRyfSwJLyogc2V0dXAgcmVhZCBwdHIgKi8KKwkJe2NsaWVudC0+YWRkciwgSTJDX01fUkQsIDQsIGJ1Zn0sCS8qIHJlYWQgZGF0ZSAqLworCX07CisKKwkvKiByZWFkIGRhdGUgcmVnaXN0ZXJzICovCisJaWYgKChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnc1swXSwgMikpICE9IDIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZCBlcnJvclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwKKwkJIiVzOiByYXcgcmVhZCBkYXRhIC0gY291bnRlcnM9JTAyeCwlMDJ4LCUwMngsJTAyeFxuIiwKKwkJX19mdW5jX18sIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSk7CisKKwl0aW1lID0gKGJ1ZlszXSA8PCAyNCkgfCAoYnVmWzJdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMF07CisKKwlydGNfdGltZV90b190bSh0aW1lLCB0bSk7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiB0bSBpcyBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCwgIgorCQkibWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQlfX2Z1bmNfXywgdG0tPnRtX3NlYywgdG0tPnRtX21pbiwgdG0tPnRtX2hvdXIsCisJCXRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxNjcyX3NldF9tbXNzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwlpbnQgeGZlcjsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworCWJ1ZlswXSA9IERTMTY3Ml9SRUdfQ05UX0JBU0U7CisJYnVmWzFdID0gc2VjcyAmIDB4MDAwMDAwRkY7CisJYnVmWzJdID0gKHNlY3MgJiAweDAwMDBGRjAwKSA+PiA4OworCWJ1ZlszXSA9IChzZWNzICYgMHgwMEZGMDAwMCkgPj4gMTY7CisJYnVmWzRdID0gKHNlY3MgJiAweEZGMDAwMDAwKSA+PiAyNDsKKwlidWZbNV0gPSAwOwkJLyogc2V0IGNvbnRyb2wgcmVnIHRvIGVuYWJsZSBjb3VudGluZyAqLworCisJeGZlciA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgNik7CisJaWYgKHhmZXIgIT0gNikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBzZW5kOiAlZFxuIiwgX19mdW5jX18sIHhmZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczE2NzJfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIGRzMTY3Ml9nZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKK3N0YXRpYyBpbnQgZHMxNjcyX3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwlyZXR1cm4gZHMxNjcyX3NldF9tbXNzKHRvX2kyY19jbGllbnQoZGV2KSwgc2Vjcyk7Cit9CisKK3N0YXRpYyBpbnQgZHMxNjcyX2dldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4ICpzdGF0dXMpCit7CisJdW5zaWduZWQgY2hhciBhZGRyID0gRFMxNjcyX1JFR19DT05UUk9MOworCisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7Y2xpZW50LT5hZGRyLCAwLCAxLCAmYWRkcn0sCS8qIHNldHVwIHJlYWQgcHRyICovCisJCXtjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAxLCBzdGF0dXN9LAkvKiByZWFkIGNvbnRyb2wgKi8KKwl9OworCisJLyogcmVhZCBjb250cm9sIHJlZ2lzdGVyICovCisJaWYgKChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnc1swXSwgMikpICE9IDIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZCBlcnJvclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2NvbnRyb2woc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1OCBjb250cm9sOworCWludCBlcnI7CisKKwllcnIgPSBkczE2NzJfZ2V0X2NvbnRyb2woY2xpZW50LCAmY29udHJvbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAoY29udHJvbCAmIERTMTY3Ml9SRUdfQ09OVFJPTF9FT1NDKQorCQkgICAgICAgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNvbnRyb2wsIFNfSVJVR08sIHNob3dfY29udHJvbCwgTlVMTCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczE2NzJfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gZHMxNjcyX3J0Y19yZWFkX3RpbWUsCisJLnNldF9tbXNzID0gZHMxNjcyX3J0Y19zZXRfbW1zcywKK307CisKK3N0YXRpYyBpbnQgZHMxNjcyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxNjcyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVyciA9IDA7CisJdTggY29udHJvbDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoZHMxNjcyX2RyaXZlci5kcml2ZXIubmFtZSwgJmNsaWVudC0+ZGV2LAorCQkJCSAgJmRzMTY3Ml9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBydGMpOworCisJLyogcmVhZCBjb250cm9sIHJlZ2lzdGVyICovCisJZXJyID0gZHMxNjcyX2dldF9jb250cm9sKGNsaWVudCwgJmNvbnRyb2wpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9kZXZyZWc7CisKKwlpZiAoY29udHJvbCAmIERTMTY3Ml9SRUdfQ09OVFJPTF9FT1NDKQorCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJPc2NpbGxhdG9yIG5vdCBlbmFibGVkLiAiCisJCQkgIlNldCB0aW1lIHRvIGVuYWJsZS5cbiIpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY29udHJvbCk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2RldnJlZzsKKworCXJldHVybiAwOworCisgZXhpdF9kZXZyZWc6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIGRzMTY3Ml9pZFtdID0geworCXsgImRzMTY3MiIsIDAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczE2NzJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInJ0Yy1kczE2NzIiLAorCQkgICB9LAorCS5wcm9iZSA9ICZkczE2NzJfcHJvYmUsCisJLnJlbW92ZSA9ICZkczE2NzJfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGRzMTY3Ml9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGRzMTY3Ml9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGFsbGFzL01heGltIERTMTY3MiB0aW1la2VlcGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTc0Mi5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMTc0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTEyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBBbiBydGMgZHJpdmVyIGZvciB0aGUgRGFsbGFzIERTMTc0MgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUb3JzdGVuIEVydGJqZXJnIFJhc211c3NlbiA8dHJAbmV3dGVjLmRrPgorICogIC0gbnZyYW0gc2l6ZSBkZXRlcm1pbmVkIGZyb20gcmVzb3VyY2UKKyAqICAtIHRoaXMgZHMxNzQyIGRyaXZlciBub3cgc3VwcG9ydHMgZHMxNzQzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40IgorCisjZGVmaW5lIFJUQ19TSVpFCQk4CisKKyNkZWZpbmUgUlRDX0NPTlRST0wJCTAKKyNkZWZpbmUgUlRDX0NFTlRVUlkJCTAKKyNkZWZpbmUgUlRDX1NFQ09ORFMJCTEKKyNkZWZpbmUgUlRDX01JTlVURVMJCTIKKyNkZWZpbmUgUlRDX0hPVVJTCQkzCisjZGVmaW5lIFJUQ19EQVkJCQk0CisjZGVmaW5lIFJUQ19EQVRFCQk1CisjZGVmaW5lIFJUQ19NT05USAkJNgorI2RlZmluZSBSVENfWUVBUgkJNworCisjZGVmaW5lIFJUQ19DRU5UVVJZX01BU0sJMHgzZgorI2RlZmluZSBSVENfU0VDT05EU19NQVNLCTB4N2YKKyNkZWZpbmUgUlRDX0RBWV9NQVNLCQkweDA3CisKKy8qIEJpdHMgaW4gdGhlIENvbnRyb2wvQ2VudHVyeSByZWdpc3RlciAqLworI2RlZmluZSBSVENfV1JJVEUJCTB4ODAKKyNkZWZpbmUgUlRDX1JFQUQJCTB4NDAKKworLyogQml0cyBpbiB0aGUgU2Vjb25kcyByZWdpc3RlciAqLworI2RlZmluZSBSVENfU1RPUAkJMHg4MAorCisvKiBCaXRzIGluIHRoZSBEYXkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX0JBVFRfRkxBRwkJMHg4MAorCitzdHJ1Y3QgcnRjX3BsYXRfZGF0YSB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcl9udnJhbTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcl9ydGM7CisJc2l6ZV90IHNpemVfbnZyYW07CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgbnZyYW1fYXR0cjsKK307CisKK3N0YXRpYyBpbnQgZHMxNzQyX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcl9ydGM7CisJdTggY2VudHVyeTsKKworCWNlbnR1cnkgPSBiaW4yYmNkKCh0bS0+dG1feWVhciArIDE5MDApIC8gMTAwKTsKKworCXdyaXRlYihSVENfV1JJVEUsIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKworCXdyaXRlYihiaW4yYmNkKHRtLT50bV95ZWFyICUgMTAwKSwgaW9hZGRyICsgUlRDX1lFQVIpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9tb24gKyAxKSwgaW9hZGRyICsgUlRDX01PTlRIKTsKKwl3cml0ZWIoYmluMmJjZCh0bS0+dG1fd2RheSkgJiBSVENfREFZX01BU0ssIGlvYWRkciArIFJUQ19EQVkpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9tZGF5KSwgaW9hZGRyICsgUlRDX0RBVEUpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9ob3VyKSwgaW9hZGRyICsgUlRDX0hPVVJTKTsKKwl3cml0ZWIoYmluMmJjZCh0bS0+dG1fbWluKSwgaW9hZGRyICsgUlRDX01JTlVURVMpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9zZWMpICYgUlRDX1NFQ09ORFNfTUFTSywgaW9hZGRyICsgUlRDX1NFQ09ORFMpOworCisJLyogUlRDX0NFTlRVUlkgYW5kIFJUQ19DT05UUk9MIHNoYXJlIHNhbWUgcmVnaXN0ZXIgKi8KKwl3cml0ZWIoUlRDX1dSSVRFIHwgKGNlbnR1cnkgJiBSVENfQ0VOVFVSWV9NQVNLKSwgaW9hZGRyICsgUlRDX0NFTlRVUlkpOworCXdyaXRlYihjZW50dXJ5ICYgUlRDX0NFTlRVUllfTUFTSywgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTc0Ml9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyX3J0YzsKKwl1bnNpZ25lZCBpbnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIHdlZWs7CisJdW5zaWduZWQgaW50IGNlbnR1cnk7CisKKwkvKiBnaXZlIGVub3VnaCB0aW1lIHRvIHVwZGF0ZSBSVEMgaW4gY2FzZSBvZiBjb250aW51b3VzIHJlYWQgKi8KKwlpZiAocGRhdGEtPmxhc3RfamlmZmllcyA9PSBqaWZmaWVzKQorCQltc2xlZXAoMSk7CisJcGRhdGEtPmxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJd3JpdGViKFJUQ19SRUFELCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJc2Vjb25kID0gcmVhZGIoaW9hZGRyICsgUlRDX1NFQ09ORFMpICYgUlRDX1NFQ09ORFNfTUFTSzsKKwltaW51dGUgPSByZWFkYihpb2FkZHIgKyBSVENfTUlOVVRFUyk7CisJaG91ciA9IHJlYWRiKGlvYWRkciArIFJUQ19IT1VSUyk7CisJZGF5ID0gcmVhZGIoaW9hZGRyICsgUlRDX0RBVEUpOworCXdlZWsgPSByZWFkYihpb2FkZHIgKyBSVENfREFZKSAmIFJUQ19EQVlfTUFTSzsKKwltb250aCA9IHJlYWRiKGlvYWRkciArIFJUQ19NT05USCk7CisJeWVhciA9IHJlYWRiKGlvYWRkciArIFJUQ19ZRUFSKTsKKwljZW50dXJ5ID0gcmVhZGIoaW9hZGRyICsgUlRDX0NFTlRVUlkpICYgUlRDX0NFTlRVUllfTUFTSzsKKwl3cml0ZWIoMCwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCXRtLT50bV9zZWMgPSBiY2QyYmluKHNlY29uZCk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4obWludXRlKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oaG91cik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGRheSk7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHdlZWspOworCXRtLT50bV9tb24gPSBiY2QyYmluKG1vbnRoKSAtIDE7CisJLyogeWVhciBpcyAxOTAwICsgdG0tPnRtX3llYXIgKi8KKwl0bS0+dG1feWVhciA9IGJjZDJiaW4oeWVhcikgKyBiY2QyYmluKGNlbnR1cnkpICogMTAwIC0gMTkwMDsKKworCWlmIChydGNfdmFsaWRfdG0odG0pIDwgMCkgeworCQlkZXZfZXJyKGRldiwgInJldHJpZXZlZCBkYXRlL3RpbWUgaXMgbm90IHZhbGlkLlxuIik7CisJCXJ0Y190aW1lX3RvX3RtKDAsIHRtKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczE3NDJfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gZHMxNzQyX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gZHMxNzQyX3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRzMTc0Ml9udnJhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCSBjaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyX252cmFtOworCXNzaXplX3QgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgcGRhdGEtPnNpemVfbnZyYW07IGNvdW50KyssIHNpemUtLSkKKwkJKmJ1ZisrID0gcmVhZGIoaW9hZGRyICsgcG9zKyspOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZHMxNzQyX252cmFtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHJfbnZyYW07CisJc3NpemVfdCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBwZGF0YS0+c2l6ZV9udnJhbTsgY291bnQrKywgc2l6ZS0tKQorCQl3cml0ZWIoKmJ1ZisrLCBpb2FkZHIgKyBwb3MrKyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkczE3NDJfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBpbnQgY2VuLCBzZWM7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCByZXQgPSAwOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXBkYXRhLT5zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgcGRhdGEtPnNpemUsCisJCXBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCWlvYWRkciA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCBwZGF0YS0+c2l6ZSk7CisJaWYgKCFpb2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJcGRhdGEtPmlvYWRkcl9udnJhbSA9IGlvYWRkcjsKKwlwZGF0YS0+c2l6ZV9udnJhbSA9IHBkYXRhLT5zaXplIC0gUlRDX1NJWkU7CisJcGRhdGEtPmlvYWRkcl9ydGMgPSBpb2FkZHIgKyBwZGF0YS0+c2l6ZV9udnJhbTsKKworCXN5c2ZzX2Jpbl9hdHRyX2luaXQoJnBkYXRhLT5udnJhbV9hdHRyKTsKKwlwZGF0YS0+bnZyYW1fYXR0ci5hdHRyLm5hbWUgPSAibnZyYW0iOworCXBkYXRhLT5udnJhbV9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSOworCXBkYXRhLT5udnJhbV9hdHRyLnJlYWQgPSBkczE3NDJfbnZyYW1fcmVhZDsKKwlwZGF0YS0+bnZyYW1fYXR0ci53cml0ZSA9IGRzMTc0Ml9udnJhbV93cml0ZTsKKwlwZGF0YS0+bnZyYW1fYXR0ci5zaXplID0gcGRhdGEtPnNpemVfbnZyYW07CisKKwkvKiB0dXJuIFJUQyBvbiBpZiBpdCB3YXMgbm90IG9uICovCisJaW9hZGRyID0gcGRhdGEtPmlvYWRkcl9ydGM7CisJc2VjID0gcmVhZGIoaW9hZGRyICsgUlRDX1NFQ09ORFMpOworCWlmIChzZWMgJiBSVENfU1RPUCkgeworCQlzZWMgJj0gUlRDX1NFQ09ORFNfTUFTSzsKKwkJY2VuID0gcmVhZGIoaW9hZGRyICsgUlRDX0NFTlRVUlkpICYgUlRDX0NFTlRVUllfTUFTSzsKKwkJd3JpdGViKFJUQ19XUklURSwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCQl3cml0ZWIoc2VjLCBpb2FkZHIgKyBSVENfU0VDT05EUyk7CisJCXdyaXRlYihjZW4gJiBSVENfQ0VOVFVSWV9NQVNLLCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJfQorCWlmICghKHJlYWRiKGlvYWRkciArIFJUQ19EQVkpICYgUlRDX0JBVFRfRkxBRykpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJ2b2x0YWdlLWxvdyBkZXRlY3RlZC5cbiIpOworCisJcGRhdGEtPmxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkgICZkczE3NDJfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKwlwZGF0YS0+cnRjID0gcnRjOworCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnBkYXRhLT5udnJhbV9hdHRyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNyZWF0aW5nIG52cmFtIGZpbGUgaW4gc3lzZnMgZmFpbGVkXG4iKTsKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMTc0Ml9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmcGRhdGEtPm52cmFtX2F0dHIpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHMxNzQyX3J0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGRzMTc0Ml9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczE3NDJfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1kczE3NDIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihkczE3NDJfcnRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYWxsYXMgRFMxNzQyIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLWRzMTc0MiIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMzIzMi5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMzIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTQ1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZHMzMjMyLmMKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgKiBSVEMgY2xpZW50L2RyaXZlciBmb3IgdGhlIE1heGltL0RhbGxhcyBEUzMyMzIgUmVhbC1UaW1lIENsb2NrIG92ZXIgSTJDCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBBdXRob3I6IEphY2sgTGFuIDxqYWNrLmxhbkBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKy8qCisgKiBJdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgaTJjIG1zZ3MvaTJjX3RyYW5zZmVyIGRpcmVjdGx5IGJ1dCwgYXMKKyAqIHJlY29tbWVuZWQgaW4gLi4uL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cyBzZWN0aW9uCisgKiAiU2VuZGluZyBhbmQgcmVjZWl2aW5nIiwgdXNpbmcgU01CdXMgbGV2ZWwgY29tbXVuaWNhdGlvbiBpcyBwcmVmZXJyZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBEUzMyMzJfUkVHX1NFQ09ORFMJMHgwMAorI2RlZmluZSBEUzMyMzJfUkVHX01JTlVURVMJMHgwMQorI2RlZmluZSBEUzMyMzJfUkVHX0hPVVJTCTB4MDIKKyNkZWZpbmUgRFMzMjMyX1JFR19BTVBNCQkweDAyCisjZGVmaW5lIERTMzIzMl9SRUdfREFZCQkweDAzCisjZGVmaW5lIERTMzIzMl9SRUdfREFURQkJMHgwNAorI2RlZmluZSBEUzMyMzJfUkVHX01PTlRICTB4MDUKKyNkZWZpbmUgRFMzMjMyX1JFR19DRU5UVVJZCTB4MDUKKyNkZWZpbmUgRFMzMjMyX1JFR19ZRUFSCQkweDA2CisjZGVmaW5lIERTMzIzMl9SRUdfQUxBUk0xICAgICAgICAgMHgwNwkvKiBBbGFybSAxIEJBU0UgKi8KKyNkZWZpbmUgRFMzMjMyX1JFR19BTEFSTTIgICAgICAgICAweDBCCS8qIEFsYXJtIDIgQkFTRSAqLworI2RlZmluZSBEUzMyMzJfUkVHX0NSCQkweDBFCS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyMJZGVmaW5lIERTMzIzMl9SRUdfQ1JfbkVPU0MgICAgICAgIDB4ODAKKyMgICAgICAgZGVmaW5lIERTMzIzMl9SRUdfQ1JfSU5UQ04gICAgICAgIDB4MDQKKyMgICAgICAgZGVmaW5lIERTMzIzMl9SRUdfQ1JfQTJJRSAgICAgICAgMHgwMgorIyAgICAgICBkZWZpbmUgRFMzMjMyX1JFR19DUl9BMUlFICAgICAgICAweDAxCisKKyNkZWZpbmUgRFMzMjMyX1JFR19TUgkweDBGCS8qIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCisjCWRlZmluZSBEUzMyMzJfUkVHX1NSX09TRiAgIDB4ODAKKyMgICAgICAgZGVmaW5lIERTMzIzMl9SRUdfU1JfQlNZICAgMHgwNAorIyAgICAgICBkZWZpbmUgRFMzMjMyX1JFR19TUl9BMkYgICAweDAyCisjICAgICAgIGRlZmluZSBEUzMyMzJfUkVHX1NSX0ExRiAgIDB4MDEKKworc3RydWN0IGRzMzIzMiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCisJLyogVGhlIG11dGV4IHByb3RlY3RzIGFsYXJtIG9wZXJhdGlvbnMsIGFuZCBwcmV2ZW50cyBhIHJhY2UKKwkgKiBiZXR3ZWVuIHRoZSBlbmFibGVfaXJxKCkgaW4gdGhlIHdvcmtxdWV1ZSBhbmQgdGhlIGZyZWVfaXJxKCkKKwkgKiBpbiB0aGUgcmVtb3ZlIGZ1bmN0aW9uLgorCSAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlpbnQgZXhpdGluZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczMyMzJfZHJpdmVyOworCitzdGF0aWMgaW50IGRzMzIzMl9jaGVja19ydGNfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNvbnRyb2wsIHN0YXQ7CisKKwlzdGF0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19TUik7CisJaWYgKHN0YXQgPCAwKQorCQlyZXR1cm4gc3RhdDsKKworCWlmIChzdGF0ICYgRFMzMjMyX1JFR19TUl9PU0YpCisJCWRldl93YXJuKCZjbGllbnQtPmRldiwKKwkJCQkib3NjaWxsYXRvciBkaXNjb250aW51aXR5IGZsYWdnZWQsICIKKwkJCQkidGltZSB1bnJlbGlhYmxlXG4iKTsKKworCXN0YXQgJj0gfihEUzMyMzJfUkVHX1NSX09TRiB8IERTMzIzMl9SRUdfU1JfQTFGIHwgRFMzMjMyX1JFR19TUl9BMkYpOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMzIzMl9SRUdfU1IsIHN0YXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgdGhlIGFsYXJtIGlzIHBlbmRpbmcsIGNsZWFyIGl0IGJlZm9yZSByZXF1ZXN0aW5nCisJICogdGhlIGludGVycnVwdCwgc28gYW4gaW50ZXJydXB0IGV2ZW50IGlzbid0IHJlcG9ydGVkCisJICogYmVmb3JlIGV2ZXJ5dGhpbmcgaXMgaW5pdGlhbGl6ZWQuCisJICovCisKKwljb250cm9sID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19DUik7CisJaWYgKGNvbnRyb2wgPCAwKQorCQlyZXR1cm4gY29udHJvbDsKKworCWNvbnRyb2wgJj0gfihEUzMyMzJfUkVHX0NSX0ExSUUgfCBEUzMyMzJfUkVHX0NSX0EySUUpOworCWNvbnRyb2wgfD0gRFMzMjMyX1JFR19DUl9JTlRDTjsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19DUiwgY29udHJvbCk7Cit9CisKK3N0YXRpYyBpbnQgZHMzMjMyX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCByZXQ7CisJdTggYnVmWzddOworCXVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZDsKKwl1bnNpZ25lZCBpbnQgd2VlaywgdHdlbHZlX2hyLCBhbV9wbTsKKwl1bnNpZ25lZCBpbnQgY2VudHVyeSwgYWRkX2NlbnR1cnkgPSAwOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCBEUzMyMzJfUkVHX1NFQ09ORFMsIDcsIGJ1Zik7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0IDwgNykKKwkJcmV0dXJuIC1FSU87CisKKwlzZWNvbmQgPSBidWZbMF07CisJbWludXRlID0gYnVmWzFdOworCWhvdXIgPSBidWZbMl07CisJd2VlayA9IGJ1ZlszXTsKKwlkYXkgPSBidWZbNF07CisJbW9udGggPSBidWZbNV07CisJeWVhciA9IGJ1Zls2XTsKKworCS8qIEV4dHJhY3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgQU0vUE0gYW5kIGNlbnR1cnkgKi8KKworCXR3ZWx2ZV9ociA9IGhvdXIgJiAweDQwOworCWFtX3BtID0gaG91ciAmIDB4MjA7CisJY2VudHVyeSA9IG1vbnRoICYgMHg4MDsKKworCS8qIFdyaXRlIHRvIHJ0Y190aW1lIHN0cnVjdHVyZSAqLworCisJdGltZS0+dG1fc2VjID0gYmNkMmJpbihzZWNvbmQpOworCXRpbWUtPnRtX21pbiA9IGJjZDJiaW4obWludXRlKTsKKwlpZiAodHdlbHZlX2hyKSB7CisJCS8qIENvbnZlcnQgdG8gMjQgaHIgKi8KKwkJaWYgKGFtX3BtKQorCQkJdGltZS0+dG1faG91ciA9IGJjZDJiaW4oaG91ciAmIDB4MUYpICsgMTI7CisJCWVsc2UKKwkJCXRpbWUtPnRtX2hvdXIgPSBiY2QyYmluKGhvdXIgJiAweDFGKTsKKwl9IGVsc2UgeworCQl0aW1lLT50bV9ob3VyID0gYmNkMmJpbihob3VyKTsKKwl9CisKKwkvKiBEYXkgb2YgdGhlIHdlZWsgaW4gbGludXggcmFuZ2UgaXMgMH42IHdoaWxlIDF+NyBpbiBSVEMgY2hpcCAqLworCXRpbWUtPnRtX3dkYXkgPSBiY2QyYmluKHdlZWspIC0gMTsKKwl0aW1lLT50bV9tZGF5ID0gYmNkMmJpbihkYXkpOworCS8qIGxpbnV4IHRtX21vbiByYW5nZTowfjExLCB3aGlsZSBtb250aCByYW5nZSBpcyAxfjEyIGluIFJUQyBjaGlwICovCisJdGltZS0+dG1fbW9uID0gYmNkMmJpbihtb250aCAmIDB4N0YpIC0gMTsKKwlpZiAoY2VudHVyeSkKKwkJYWRkX2NlbnR1cnkgPSAxMDA7CisKKwl0aW1lLT50bV95ZWFyID0gYmNkMmJpbih5ZWFyKSArIGFkZF9jZW50dXJ5OworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0aW1lKTsKK30KKworc3RhdGljIGludCBkczMyMzJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1OCBidWZbN107CisKKwkvKiBFeHRyYWN0IHRpbWUgZnJvbSBydGNfdGltZSBhbmQgbG9hZCBpbnRvIGRzMzIzMiovCisKKwlidWZbMF0gPSBiaW4yYmNkKHRpbWUtPnRtX3NlYyk7CisJYnVmWzFdID0gYmluMmJjZCh0aW1lLT50bV9taW4pOworCWJ1ZlsyXSA9IGJpbjJiY2QodGltZS0+dG1faG91cik7CisJLyogRGF5IG9mIHRoZSB3ZWVrIGluIGxpbnV4IHJhbmdlIGlzIDB+NiB3aGlsZSAxfjcgaW4gUlRDIGNoaXAgKi8KKwlidWZbM10gPSBiaW4yYmNkKHRpbWUtPnRtX3dkYXkgKyAxKTsKKwlidWZbNF0gPSBiaW4yYmNkKHRpbWUtPnRtX21kYXkpOyAvKiBEYXRlICovCisJLyogbGludXggdG1fbW9uIHJhbmdlOjB+MTEsIHdoaWxlIG1vbnRoIHJhbmdlIGlzIDF+MTIgaW4gUlRDIGNoaXAgKi8KKwlidWZbNV0gPSBiaW4yYmNkKHRpbWUtPnRtX21vbiArIDEpOworCWlmICh0aW1lLT50bV95ZWFyID49IDEwMCkgeworCQlidWZbNV0gfD0gMHg4MDsKKwkJYnVmWzZdID0gYmluMmJjZCh0aW1lLT50bV95ZWFyIC0gMTAwKTsKKwl9IGVsc2UgeworCQlidWZbNl0gPSBiaW4yYmNkKHRpbWUtPnRtX3llYXIpOworCX0KKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LAorCQkJCQkgICAgICBEUzMyMzJfUkVHX1NFQ09ORFMsIDcsIGJ1Zik7Cit9CisKKy8qCisgKiBEUzMyMzIgaGFzIHR3byBhbGFybSwgd2Ugb25seSB1c2UgYWxhcm0xCisgKiBBY2NvcmRpbmcgdG8gbGludXggc3BlY2lmaWNhdGlvbiwgb25seSBzdXBwb3J0IG9uZS1zaG90IGFsYXJtCisgKiBubyBwZXJpb2RpYyBhbGFybSBtb2RlCisgKi8KK3N0YXRpYyBpbnQgZHMzMjMyX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZHMzMjMyICpkczMyMzIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgY29udHJvbCwgc3RhdDsKKwlpbnQgcmV0OworCXU4IGJ1Zls0XTsKKworCW11dGV4X2xvY2soJmRzMzIzMi0+bXV0ZXgpOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19TUik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXN0YXQgPSByZXQ7CisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19DUik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWNvbnRyb2wgPSByZXQ7CisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCBEUzMyMzJfUkVHX0FMQVJNMSwgNCwgYnVmKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlhbGFybS0+dGltZS50bV9zZWMgPSBiY2QyYmluKGJ1ZlswXSAmIDB4N0YpOworCWFsYXJtLT50aW1lLnRtX21pbiA9IGJjZDJiaW4oYnVmWzFdICYgMHg3Rik7CisJYWxhcm0tPnRpbWUudG1faG91ciA9IGJjZDJiaW4oYnVmWzJdICYgMHg3Rik7CisJYWxhcm0tPnRpbWUudG1fbWRheSA9IGJjZDJiaW4oYnVmWzNdICYgMHg3Rik7CisKKwlhbGFybS0+dGltZS50bV9tb24gPSAtMTsKKwlhbGFybS0+dGltZS50bV95ZWFyID0gLTE7CisJYWxhcm0tPnRpbWUudG1fd2RheSA9IC0xOworCWFsYXJtLT50aW1lLnRtX3lkYXkgPSAtMTsKKwlhbGFybS0+dGltZS50bV9pc2RzdCA9IC0xOworCisJYWxhcm0tPmVuYWJsZWQgPSAhIShjb250cm9sICYgRFMzMjMyX1JFR19DUl9BMUlFKTsKKwlhbGFybS0+cGVuZGluZyA9ICEhKHN0YXQgJiBEUzMyMzJfUkVHX1NSX0ExRik7CisKKwlyZXQgPSAwOworb3V0OgorCW11dGV4X3VubG9jaygmZHMzMjMyLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGxpbnV4IHJ0Yy1tb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCB3ZGF5IGFsYXJtCisgKiBhbmQgb25seSAyNGggdGltZSBtb2RlIHN1cHBvcnRlZCBpbmRlZWQKKyAqLworc3RhdGljIGludCBkczMyMzJfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGRzMzIzMiAqZHMzMjMyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGNvbnRyb2wsIHN0YXQ7CisJaW50IHJldDsKKwl1OCBidWZbNF07CisKKwlpZiAoY2xpZW50LT5pcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkczMyMzItPm11dGV4KTsKKworCWJ1ZlswXSA9IGJpbjJiY2QoYWxhcm0tPnRpbWUudG1fc2VjKTsKKwlidWZbMV0gPSBiaW4yYmNkKGFsYXJtLT50aW1lLnRtX21pbik7CisJYnVmWzJdID0gYmluMmJjZChhbGFybS0+dGltZS50bV9ob3VyKTsKKwlidWZbM10gPSBiaW4yYmNkKGFsYXJtLT50aW1lLnRtX21kYXkpOworCisJLyogY2xlYXIgYWxhcm0gaW50ZXJydXB0IGVuYWJsZSBiaXQgKi8KKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBEUzMyMzJfUkVHX0NSKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJY29udHJvbCA9IHJldDsKKwljb250cm9sICY9IH4oRFMzMjMyX1JFR19DUl9BMUlFIHwgRFMzMjMyX1JFR19DUl9BMklFKTsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19DUiwgY29udHJvbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyogY2xlYXIgYW55IHBlbmRpbmcgYWxhcm0gZmxhZyAqLworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERTMzIzMl9SRUdfU1IpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlzdGF0ID0gcmV0OworCXN0YXQgJj0gfihEUzMyMzJfUkVHX1NSX0ExRiB8IERTMzIzMl9SRUdfU1JfQTJGKTsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19TUiwgc3RhdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19BTEFSTTEsIDQsIGJ1Zik7CisKKwlpZiAoYWxhcm0tPmVuYWJsZWQpIHsKKwkJY29udHJvbCB8PSBEUzMyMzJfUkVHX0NSX0ExSUU7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzMyMzJfUkVHX0NSLCBjb250cm9sKTsKKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkczMyMzItPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkczMyMzJfdXBkYXRlX2FsYXJtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGRzMzIzMiAqZHMzMjMyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGNvbnRyb2w7CisJaW50IHJldDsKKwl1OCBidWZbNF07CisKKwltdXRleF9sb2NrKCZkczMyMzItPm11dGV4KTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19BTEFSTTEsIDQsIGJ1Zik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdW5sb2NrOworCisJYnVmWzBdID0gYmNkMmJpbihidWZbMF0pIDwgMCB8fCAoZHMzMjMyLT5ydGMtPmlycV9kYXRhICYgUlRDX1VGKSA/CisJCQkJCQkJCTB4ODAgOiBidWZbMF07CisJYnVmWzFdID0gYmNkMmJpbihidWZbMV0pIDwgMCB8fCAoZHMzMjMyLT5ydGMtPmlycV9kYXRhICYgUlRDX1VGKSA/CisJCQkJCQkJCTB4ODAgOiBidWZbMV07CisJYnVmWzJdID0gYmNkMmJpbihidWZbMl0pIDwgMCB8fCAoZHMzMjMyLT5ydGMtPmlycV9kYXRhICYgUlRDX1VGKSA/CisJCQkJCQkJCTB4ODAgOiBidWZbMl07CisJYnVmWzNdID0gYmNkMmJpbihidWZbM10pIDwgMCB8fCAoZHMzMjMyLT5ydGMtPmlycV9kYXRhICYgUlRDX1VGKSA/CisJCQkJCQkJCTB4ODAgOiBidWZbM107CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCBEUzMyMzJfUkVHX0FMQVJNMSwgNCwgYnVmKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwljb250cm9sID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMzMjMyX1JFR19DUik7CisJaWYgKGNvbnRyb2wgPCAwKQorCQlnb3RvIHVubG9jazsKKworCWlmIChkczMyMzItPnJ0Yy0+aXJxX2RhdGEgJiAoUlRDX0FGIHwgUlRDX1VGKSkKKwkJLyogZW5hYmxlIGFsYXJtMSBpbnRlcnJ1cHQgKi8KKwkJY29udHJvbCB8PSBEUzMyMzJfUkVHX0NSX0ExSUU7CisJZWxzZQorCQkvKiBkaXNhYmxlIGFsYXJtMSBpbnRlcnJ1cHQgKi8KKwkJY29udHJvbCAmPSB+KERTMzIzMl9SRUdfQ1JfQTFJRSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMzIzMl9SRUdfQ1IsIGNvbnRyb2wpOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkczMyMzItPm11dGV4KTsKK30KKworc3RhdGljIGludCBkczMyMzJfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGRzMzIzMiAqZHMzMjMyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoY2xpZW50LT5pcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZW5hYmxlZCkKKwkJZHMzMjMyLT5ydGMtPmlycV9kYXRhIHw9IFJUQ19BRjsKKwllbHNlCisJCWRzMzIzMi0+cnRjLT5pcnFfZGF0YSAmPSB+UlRDX0FGOworCisJZHMzMjMyX3VwZGF0ZV9hbGFybShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHMzMjMyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRldl9pZDsKKwlzdHJ1Y3QgZHMzMjMyICpkczMyMzIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCXNjaGVkdWxlX3dvcmsoJmRzMzIzMi0+d29yayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBkczMyMzJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRzMzIzMiAqZHMzMjMyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkczMyMzIsIHdvcmspOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkczMyMzItPmNsaWVudDsKKwlpbnQgc3RhdCwgY29udHJvbDsKKworCW11dGV4X2xvY2soJmRzMzIzMi0+bXV0ZXgpOworCisJc3RhdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERTMzIzMl9SRUdfU1IpOworCWlmIChzdGF0IDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoc3RhdCAmIERTMzIzMl9SRUdfU1JfQTFGKSB7CisJCWNvbnRyb2wgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBEUzMyMzJfUkVHX0NSKTsKKwkJaWYgKGNvbnRyb2wgPCAwKQorCQkJZ290byBvdXQ7CisJCS8qIGRpc2FibGUgYWxhcm0xIGludGVycnVwdCAqLworCQljb250cm9sICY9IH4oRFMzMjMyX1JFR19DUl9BMUlFKTsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMzIzMl9SRUdfQ1IsIGNvbnRyb2wpOworCisJCS8qIGNsZWFyIHRoZSBhbGFybSBwZW5kIGZsYWcgKi8KKwkJc3RhdCAmPSB+RFMzMjMyX1JFR19TUl9BMUY7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzMyMzJfUkVHX1NSLCBzdGF0KTsKKworCQlydGNfdXBkYXRlX2lycShkczMyMzItPnJ0YywgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCX0KKworb3V0OgorCWlmICghZHMzMjMyLT5leGl0aW5nKQorCQllbmFibGVfaXJxKGNsaWVudC0+aXJxKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJmRzMzIzMi0+bXV0ZXgpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMzMjMyX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZSA9IGRzMzIzMl9yZWFkX3RpbWUsCisJLnNldF90aW1lID0gZHMzMjMyX3NldF90aW1lLAorCS5yZWFkX2FsYXJtID0gZHMzMjMyX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IGRzMzIzMl9zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBkczMyMzJfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRzMzIzMl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRzMzIzMiAqZHMzMjMyOworCWludCByZXQ7CisKKwlkczMyMzIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMzMjMyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkczMyMzIpCisJCXJldHVybiAtRU5PTUVNOworCisJZHMzMjMyLT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZHMzMjMyKTsKKworCUlOSVRfV09SSygmZHMzMjMyLT53b3JrLCBkczMyMzJfd29yayk7CisJbXV0ZXhfaW5pdCgmZHMzMjMyLT5tdXRleCk7CisKKwlyZXQgPSBkczMyMzJfY2hlY2tfcnRjX3N0YXR1cyhjbGllbnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlkczMyMzItPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoY2xpZW50LT5uYW1lLCAmY2xpZW50LT5kZXYsCisJCQkJCSAgJmRzMzIzMl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihkczMyMzItPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihkczMyMzItPnJ0Yyk7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHRoZSBjbGFzcyBkZXZpY2VcbiIpOworCQlnb3RvIG91dF9pcnE7CisJfQorCisJaWYgKGNsaWVudC0+aXJxID49IDApIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIGRzMzIzMl9pcnEsIDAsCisJCQkJICJkczMyMzIiLCBjbGllbnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IElSUVxuIik7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK291dF9pcnE6CisJaWYgKGNsaWVudC0+aXJxID49IDApCisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBjbGllbnQpOworCitvdXRfZnJlZToKKwlrZnJlZShkczMyMzIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMzIzMl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZHMzMjMyICpkczMyMzIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChjbGllbnQtPmlycSA+PSAwKSB7CisJCW11dGV4X2xvY2soJmRzMzIzMi0+bXV0ZXgpOworCQlkczMyMzItPmV4aXRpbmcgPSAxOworCQltdXRleF91bmxvY2soJmRzMzIzMi0+bXV0ZXgpOworCisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBjbGllbnQpOworCQljYW5jZWxfd29ya19zeW5jKCZkczMyMzItPndvcmspOworCX0KKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihkczMyMzItPnJ0Yyk7CisJa2ZyZWUoZHMzMjMyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGRzMzIzMl9pZFtdID0geworCXsgImRzMzIzMiIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZHMzMjMyX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMzIzMl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicnRjLWRzMzIzMiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gZHMzMjMyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkczMyMzJfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBkczMyMzJfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihkczMyMzJfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiU3Jpa2FudGggU3Jpbml2YXNhbiA8c3Jpa2FudGguc3Jpbml2YXNhbkBmcmVlc2NhbGUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbS9EYWxsYXMgRFMzMjMyIFJUQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGE3MDc5Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jCkBAIC0wLDAgKzEsMTgxIEBACisvKiBydGMtZHMzMjM0LmMKKyAqCisgKiBEcml2ZXIgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yIChEUzMyMzQpIFNQSSBSVEMgd2l0aCBJbnRlZ3JhdGVkIENyeXN0YWwKKyAqIGFuZCBTUkFNLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNSU1PTWF4IFdpcmVsZXNzIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworI2RlZmluZSBEUzMyMzRfUkVHX1NFQ09ORFMJMHgwMAorI2RlZmluZSBEUzMyMzRfUkVHX01JTlVURVMJMHgwMQorI2RlZmluZSBEUzMyMzRfUkVHX0hPVVJTCTB4MDIKKyNkZWZpbmUgRFMzMjM0X1JFR19EQVkJCTB4MDMKKyNkZWZpbmUgRFMzMjM0X1JFR19EQVRFCQkweDA0CisjZGVmaW5lIERTMzIzNF9SRUdfTU9OVEgJMHgwNQorI2RlZmluZSBEUzMyMzRfUkVHX1lFQVIJCTB4MDYKKyNkZWZpbmUgRFMzMjM0X1JFR19DRU5UVVJZCSgxIDw8IDcpIC8qIEJpdCA3IG9mIHRoZSBNb250aCByZWdpc3RlciAqLworCisjZGVmaW5lIERTMzIzNF9SRUdfQ09OVFJPTAkweDBFCisjZGVmaW5lIERTMzIzNF9SRUdfQ09OVF9TVEFUCTB4MEYKKworc3RhdGljIGludCBkczMyMzRfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKworCS8qIE1TQiBtdXN0IGJlICcxJyB0byBpbmRpY2F0ZSB3cml0ZSAqLworCWJ1ZlswXSA9IGFkZHJlc3MgfCAweDgwOworCWJ1ZlsxXSA9IGRhdGE7CisKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMiwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZHMzMjM0X2dldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJCQkJdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJKmRhdGEgPSBhZGRyZXNzICYgMHg3ZjsKKworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgZGF0YSwgMSwgZGF0YSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZHMzMjM0X3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJYnVmWzBdID0gMHgwMDsgLyogU3RhcnQgYWRkcmVzcyAqLworCisJZXJyID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMSwgYnVmLCA4KTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBTZWNvbmRzLCBNaW51dGVzLCBIb3VycywgRGF5LCBEYXRlLCBNb250aCwgWWVhciAqLworCWR0LT50bV9zZWMJPSBiY2QyYmluKGJ1ZlswXSk7CisJZHQtPnRtX21pbgk9IGJjZDJiaW4oYnVmWzFdKTsKKwlkdC0+dG1faG91cgk9IGJjZDJiaW4oYnVmWzJdICYgMHgzZik7CisJZHQtPnRtX3dkYXkJPSBiY2QyYmluKGJ1ZlszXSkgLSAxOyAvKiAwID0gU3VuICovCisJZHQtPnRtX21kYXkJPSBiY2QyYmluKGJ1Zls0XSk7CisJZHQtPnRtX21vbgk9IGJjZDJiaW4oYnVmWzVdICYgMHgxZikgLSAxOyAvKiAwID0gSmFuICovCisJZHQtPnRtX3llYXIgCT0gYmNkMmJpbihidWZbNl0gJiAweGZmKSArIDEwMDsgLyogQXNzdW1lIDIwWVkgKi8KKworCXJldHVybiBydGNfdmFsaWRfdG0oZHQpOworfQorCitzdGF0aWMgaW50IGRzMzIzNF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJZHMzMjM0X3NldF9yZWcoZGV2LCBEUzMyMzRfUkVHX1NFQ09ORFMsIGJpbjJiY2QoZHQtPnRtX3NlYykpOworCWRzMzIzNF9zZXRfcmVnKGRldiwgRFMzMjM0X1JFR19NSU5VVEVTLCBiaW4yYmNkKGR0LT50bV9taW4pKTsKKwlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfSE9VUlMsIGJpbjJiY2QoZHQtPnRtX2hvdXIpICYgMHgzZik7CisKKwkvKiAwID0gU3VuICovCisJZHMzMjM0X3NldF9yZWcoZGV2LCBEUzMyMzRfUkVHX0RBWSwgYmluMmJjZChkdC0+dG1fd2RheSArIDEpKTsKKwlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfREFURSwgYmluMmJjZChkdC0+dG1fbWRheSkpOworCisJLyogMCA9IEphbiAqLworCWRzMzIzNF9zZXRfcmVnKGRldiwgRFMzMjM0X1JFR19NT05USCwgYmluMmJjZChkdC0+dG1fbW9uICsgMSkpOworCisJLyogQXNzdW1lIDIwWVkgYWx0aG91Z2ggd2UganVzdCB3YW50IHRvIG1ha2Ugc3VyZSBub3QgdG8gZ28gbmVnYXRpdmUuICovCisJaWYgKGR0LT50bV95ZWFyID4gMTAwKQorCQlkdC0+dG1feWVhciAtPSAxMDA7CisKKwlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfWUVBUiwgYmluMmJjZChkdC0+dG1feWVhcikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczMyMzRfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gZHMzMjM0X3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBkczMyMzRfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkczMyMzRfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXVuc2lnbmVkIGNoYXIgdG1wOworCWludCByZXM7CisKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXMgPSBkczMyMzRfZ2V0X3JlZygmc3BpLT5kZXYsIERTMzIzNF9SRUdfU0VDT05EUywgJnRtcCk7CisJaWYgKHJlcyAhPSAwKQorCQlyZXR1cm4gcmVzOworCisJLyogQ29udHJvbCBzZXR0aW5ncworCSAqCisJICogQ09OVFJPTF9SRUcKKwkgKiBCSVQgNwk2CTUJNAkzCTIJMQkwCisJICogICAgIEVPU0MJQkJTUVcJQ09OVglSUzIJUlMxCUlOVENOCUEySUUJQTFJRQorCSAqCisJICogICAgIDAJMAkwCTEJMQkxCTAJMAorCSAqCisJICogQ09OVFJPTF9TVEFUX1JFRworCSAqIEJJVCA3CTYJNQk0CTMJMgkxCTAKKwkgKiAgICAgT1NGCUJCMzJrSHoJQ1JBVEUxCUNSQVRFMAlFTjMya0h6CUJTWQlBMkYJQTFGCisJICoKKwkgKiAgICAgMQkwCTAJMAkxCTAJMAkwCisJICovCisJZHMzMjM0X2dldF9yZWcoJnNwaS0+ZGV2LCBEUzMyMzRfUkVHX0NPTlRST0wsICZ0bXApOworCWRzMzIzNF9zZXRfcmVnKCZzcGktPmRldiwgRFMzMjM0X1JFR19DT05UUk9MLCB0bXAgJiAweDFjKTsKKworCWRzMzIzNF9nZXRfcmVnKCZzcGktPmRldiwgRFMzMjM0X1JFR19DT05UX1NUQVQsICZ0bXApOworCWRzMzIzNF9zZXRfcmVnKCZzcGktPmRldiwgRFMzMjM0X1JFR19DT05UX1NUQVQsIHRtcCAmIDB4ODgpOworCisJLyogUHJpbnQgb3VyIHNldHRpbmdzICovCisJZHMzMjM0X2dldF9yZWcoJnNwaS0+ZGV2LCBEUzMyMzRfUkVHX0NPTlRST0wsICZ0bXApOworCWRldl9pbmZvKCZzcGktPmRldiwgIkNvbnRyb2wgUmVnOiAweCUwMnhcbiIsIHRtcCk7CisKKwlkczMyMzRfZ2V0X3JlZygmc3BpLT5kZXYsIERTMzIzNF9SRUdfQ09OVF9TVEFULCAmdG1wKTsKKwlkZXZfaW5mbygmc3BpLT5kZXYsICJDdHJsL1N0YXQgUmVnOiAweCUwMnhcbiIsIHRtcCk7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczMyMzQiLAorCQkJCSZzcGktPmRldiwgJmRzMzIzNF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczMyMzRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBkczMyMzRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCSA9ICJkczMyMzQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkgPSBkczMyMzRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGRzMzIzNF9yZW1vdmUpLAorfTsKKworbW9kdWxlX3NwaV9kcml2ZXIoZHMzMjM0X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiRFMzMjM0IFNQSSBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJEZW5uaXMgQWJlcmlsbGEgPGRlbnp6emhvbWVAeWFob28uY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJzcGk6ZHMzMjM0Iik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZWZpLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZWZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmODkwYgotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1lZmkuYwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIHJ0Yy1lZmk6IFJUQyBDbGFzcyBEcml2ZXIgZm9yIEVGSS1iYXNlZCBzeXN0ZW1zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKgorICogQXV0aG9yOiBkYW5uIGZyYXppZXIgPGRhbm5mQGhwLmNvbT4KKyAqIEJhc2VkIG9uIGVmaXJ0Yy5jIGJ5IFN0ZXBoYW5lIEVyYW5pYW4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKworI2RlZmluZSBFRklfSVNEU1QgKEVGSV9USU1FX0FESlVTVF9EQVlMSUdIVHxFRklfVElNRV9JTl9EQVlMSUdIVCkKKy8qCisgKiBFRkkgRXBvY2ggaXMgMS8xLzE5OTgKKyAqLworI2RlZmluZSBFRklfUlRDX0VQT0NICQkxOTk4CisKKy8qCisgKiByZXR1cm5zIGRheSBvZiB0aGUgeWVhciBbMC0zNjVdCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb21wdXRlX3lkYXkoZWZpX3RpbWVfdCAqZWZ0KQoreworCS8qIGVmaV90aW1lX3QubW9udGggaXMgaW4gdGhlIFsxLTEyXSBzbywgd2UgbmVlZCAtMSAqLworCXJldHVybiBydGNfeWVhcl9kYXlzKGVmdC0+ZGF5IC0gMSwgZWZ0LT5tb250aCAtIDEsIGVmdC0+eWVhcik7Cit9CisvKgorICogcmV0dXJucyBkYXkgb2YgdGhlIHdlZWsgWzAtNl0gMD1TdW5kYXkKKyAqCisgKiBEb24ndCB0cnkgdG8gcHJvdmlkZSBhIHllYXIgdGhhdCdzIGJlZm9yZSAxOTk4LCBwbGVhc2UgIQorICovCitzdGF0aWMgaW50Citjb21wdXRlX3dkYXkoZWZpX3RpbWVfdCAqZWZ0KQoreworCWludCB5OworCWludCBuZGF5cyA9IDA7CisKKwlpZiAoZWZ0LT55ZWFyIDwgMTk5OCkgeworCQlwcmludGsoS0VSTl9FUlIgImVmaXJ0YzogRUZJIHllYXIgPCAxOTk4LCBpbnZhbGlkIGRhdGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yICh5ID0gRUZJX1JUQ19FUE9DSDsgeSA8IGVmdC0+eWVhcjsgeSsrKQorCQluZGF5cyArPSAzNjUgKyAoaXNfbGVhcF95ZWFyKHkpID8gMSA6IDApOworCisJbmRheXMgKz0gY29tcHV0ZV95ZGF5KGVmdCk7CisKKwkvKgorCSAqIDQ9MS8xLzE5OTggd2FzIGEgVGh1cnNkYXkKKwkgKi8KKwlyZXR1cm4gKG5kYXlzICsgNCkgJSA3OworfQorCitzdGF0aWMgdm9pZAorY29udmVydF90b19lZmlfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnd0aW1lLCBlZmlfdGltZV90ICplZnQpCit7CisJZWZ0LT55ZWFyCT0gd3RpbWUtPnRtX3llYXIgKyAxOTAwOworCWVmdC0+bW9udGgJPSB3dGltZS0+dG1fbW9uICsgMTsKKwllZnQtPmRheQk9IHd0aW1lLT50bV9tZGF5OworCWVmdC0+aG91cgk9IHd0aW1lLT50bV9ob3VyOworCWVmdC0+bWludXRlCT0gd3RpbWUtPnRtX21pbjsKKwllZnQtPnNlY29uZCAJPSB3dGltZS0+dG1fc2VjOworCWVmdC0+bmFub3NlY29uZCA9IDA7CisJZWZ0LT5kYXlsaWdodAk9IHd0aW1lLT50bV9pc2RzdCA/IEVGSV9JU0RTVCA6IDA7CisJZWZ0LT50aW1lem9uZQk9IEVGSV9VTlNQRUNJRklFRF9USU1FWk9ORTsKK30KKworc3RhdGljIHZvaWQKK2NvbnZlcnRfZnJvbV9lZmlfdGltZShlZmlfdGltZV90ICplZnQsIHN0cnVjdCBydGNfdGltZSAqd3RpbWUpCit7CisJbWVtc2V0KHd0aW1lLCAwLCBzaXplb2YoKnd0aW1lKSk7CisJd3RpbWUtPnRtX3NlYyAgPSBlZnQtPnNlY29uZDsKKwl3dGltZS0+dG1fbWluICA9IGVmdC0+bWludXRlOworCXd0aW1lLT50bV9ob3VyID0gZWZ0LT5ob3VyOworCXd0aW1lLT50bV9tZGF5ID0gZWZ0LT5kYXk7CisJd3RpbWUtPnRtX21vbiAgPSBlZnQtPm1vbnRoIC0gMTsKKwl3dGltZS0+dG1feWVhciA9IGVmdC0+eWVhciAtIDE5MDA7CisKKwkvKiBkYXkgb2YgdGhlIHdlZWsgWzAtNl0sIFN1bmRheT0wICovCisJd3RpbWUtPnRtX3dkYXkgPSBjb21wdXRlX3dkYXkoZWZ0KTsKKworCS8qIGRheSBpbiB0aGUgeWVhciBbMS0zNjVdKi8KKwl3dGltZS0+dG1feWRheSA9IGNvbXB1dGVfeWRheShlZnQpOworCisKKwlzd2l0Y2ggKGVmdC0+ZGF5bGlnaHQgJiBFRklfSVNEU1QpIHsKKwljYXNlIEVGSV9JU0RTVDoKKwkJd3RpbWUtPnRtX2lzZHN0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBFRklfVElNRV9BREpVU1RfREFZTElHSFQ6CisJCXd0aW1lLT50bV9pc2RzdCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXd0aW1lLT50bV9pc2RzdCA9IC0xOworCX0KK30KKworc3RhdGljIGludCBlZmlfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp3a2Fscm0pCit7CisJZWZpX3RpbWVfdCBlZnQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKworCS8qCisJICogQXMgb2YgRUZJIHYxLjEwLCB0aGlzIGNhbGwgYWx3YXlzIHJldHVybnMgYW4gdW5zdXBwb3J0ZWQgc3RhdHVzCisJICovCisJc3RhdHVzID0gZWZpLmdldF93YWtldXBfdGltZSgoZWZpX2Jvb2xfdCAqKSZ3a2Fscm0tPmVuYWJsZWQsCisJCQkJICAgICAoZWZpX2Jvb2xfdCAqKSZ3a2Fscm0tPnBlbmRpbmcsICZlZnQpOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb252ZXJ0X2Zyb21fZWZpX3RpbWUoJmVmdCwgJndrYWxybS0+dGltZSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKCZ3a2Fscm0tPnRpbWUpOworfQorCitzdGF0aWMgaW50IGVmaV9zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqd2thbHJtKQoreworCWVmaV90aW1lX3QgZWZ0OworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisKKwljb252ZXJ0X3RvX2VmaV90aW1lKCZ3a2Fscm0tPnRpbWUsICZlZnQpOworCisJLyoKKwkgKiBYWFggRml4bWU6CisJICogQXMgb2YgRUZJIDAuOTIgd2l0aCB0aGUgZmlybXdhcmUgSSBoYXZlIG9uIG15CisJICogbWFjaGluZSB0aGlzIGNhbGwgZG9lcyBub3Qgc2VlbSB0byB3b3JrIHF1aXRlCisJICogcmlnaHQKKwkgKgorCSAqIEFzIG9mIHYxLjEwLCB0aGlzIGNhbGwgYWx3YXlzIHJldHVybnMgYW4gdW5zdXBwb3J0ZWQgc3RhdHVzCisJICovCisJc3RhdHVzID0gZWZpLnNldF93YWtldXBfdGltZSgoZWZpX2Jvb2xfdCl3a2Fscm0tPmVuYWJsZWQsICZlZnQpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAid3JpdGUgc3RhdHVzIGlzICVkXG4iLCAoaW50KXN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzID09IEVGSV9TVUNDRVNTID8gMCA6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZWZpX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfdGltZV90IGVmdDsKKwllZmlfdGltZV9jYXBfdCBjYXA7CisKKwlzdGF0dXMgPSBlZmkuZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJlZml0aW1lOiBjYW4ndCByZWFkIHRpbWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb252ZXJ0X2Zyb21fZWZpX3RpbWUoJmVmdCwgdG0pOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgZWZpX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV90aW1lX3QgZWZ0OworCisJY29udmVydF90b19lZmlfdGltZSh0bSwgJmVmdCk7CisKKwlzdGF0dXMgPSBlZmkuc2V0X3RpbWUoJmVmdCk7CisKKwlyZXR1cm4gc3RhdHVzID09IEVGSV9TVUNDRVNTID8gMCA6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBlZmlfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gZWZpX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUgPSBlZmlfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBlZmlfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gZWZpX3NldF9hbGFybSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVmaV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJydGMtZWZpIiwgJmRldi0+ZGV2LCAmZWZpX3J0Y19vcHMsCisJCQkJCVRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2V4aXQgZWZpX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWZpX3J0Y19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicnRjLWVmaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZSA9IF9fZXhpdF9wKGVmaV9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVmaV9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmVmaV9ydGNfZHJpdmVyLCBlZmlfcnRjX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVmaV9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZlZmlfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGVmaV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChlZmlfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJkYW5uIGZyYXppZXIgPGRhbm5mQGhwLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRUZJIFJUQyBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1lbTMwMjcuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1lbTMwMjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTA0ZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWVtMzAyNy5jCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQW4gcnRjL2kyYyBkcml2ZXIgZm9yIHRoZSBFTSBNaWNyb2VsZWN0cm9uaWMgRU0zMDI3CisgKiBDb3B5cmlnaHQgMjAxMSBDb21wdUxhYiwgTHRkLgorICoKKyAqIEF1dGhvcjogTWlrZSBSYXBvcG9ydCA8bWlrZUBjb21wdWxhYi5jby5pbD4KKyAqCisgKiBCYXNlZCBvbiBydGMtZHMxNjcyLmMgYnkgQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBFTTMwMjdfUkVHX09OX09GRl9DVFJMCTB4MDAKKyNkZWZpbmUgRU0zMDI3X1JFR19JUlFfQ1RSTAkweDAxCisjZGVmaW5lIEVNMzAyN19SRUdfSVJRX0ZMQUdTCTB4MDIKKyNkZWZpbmUgRU0zMDI3X1JFR19TVEFUVVMJMHgwMworI2RlZmluZSBFTTMwMjdfUkVHX1JTVF9DVFJMCTB4MDQKKworI2RlZmluZSBFTTMwMjdfUkVHX1dBVENIX1NFQwkweDA4CisjZGVmaW5lIEVNMzAyN19SRUdfV0FUQ0hfTUlOCTB4MDkKKyNkZWZpbmUgRU0zMDI3X1JFR19XQVRDSF9IT1VSCTB4MGEKKyNkZWZpbmUgRU0zMDI3X1JFR19XQVRDSF9EQVRFCTB4MGIKKyNkZWZpbmUgRU0zMDI3X1JFR19XQVRDSF9EQVkJMHgwYworI2RlZmluZSBFTTMwMjdfUkVHX1dBVENIX01PTgkweDBkCisjZGVmaW5lIEVNMzAyN19SRUdfV0FUQ0hfWUVBUgkweDBlCisKKyNkZWZpbmUgRU0zMDI3X1JFR19BTEFSTV9TRUMJMHgxMAorI2RlZmluZSBFTTMwMjdfUkVHX0FMQVJNX01JTgkweDExCisjZGVmaW5lIEVNMzAyN19SRUdfQUxBUk1fSE9VUgkweDEyCisjZGVmaW5lIEVNMzAyN19SRUdfQUxBUk1fREFURQkweDEzCisjZGVmaW5lIEVNMzAyN19SRUdfQUxBUk1fREFZCTB4MTQKKyNkZWZpbmUgRU0zMDI3X1JFR19BTEFSTV9NT04JMHgxNQorI2RlZmluZSBFTTMwMjdfUkVHX0FMQVJNX1lFQVIJMHgxNgorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZW0zMDI3X2RyaXZlcjsKKworc3RhdGljIGludCBlbTMwMjdfZ2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisKKwl1bnNpZ25lZCBjaGFyIGFkZHIgPSBFTTMwMjdfUkVHX1dBVENIX1NFQzsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls3XTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJe2NsaWVudC0+YWRkciwgMCwgMSwgJmFkZHJ9LAkJLyogc2V0dXAgcmVhZCBhZGRyICovCisJCXtjbGllbnQtPmFkZHIsIEkyQ19NX1JELCA3LCBidWZ9LAkvKiByZWFkIHRpbWUvZGF0ZSAqLworCX07CisKKwkvKiByZWFkIHRpbWUvZGF0ZSByZWdpc3RlcnMgKi8KKwlpZiAoKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZtc2dzWzBdLCAyKSkgIT0gMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXRtLT50bV9zZWMJPSBiY2QyYmluKGJ1ZlswXSk7CisJdG0tPnRtX21pbgk9IGJjZDJiaW4oYnVmWzFdKTsKKwl0bS0+dG1faG91cgk9IGJjZDJiaW4oYnVmWzJdKTsKKwl0bS0+dG1fbWRheQk9IGJjZDJiaW4oYnVmWzNdKTsKKwl0bS0+dG1fd2RheQk9IGJjZDJiaW4oYnVmWzRdKTsKKwl0bS0+dG1fbW9uCT0gYmNkMmJpbihidWZbNV0pOworCXRtLT50bV95ZWFyCT0gYmNkMmJpbihidWZbNl0pICsgMTAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW0zMDI3X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXVuc2lnbmVkIGNoYXIgYnVmWzhdOworCisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQljbGllbnQtPmFkZHIsIDAsIDgsIGJ1ZiwJLyogd3JpdGUgdGltZS9kYXRlICovCisJfTsKKworCWJ1ZlswXSA9IEVNMzAyN19SRUdfV0FUQ0hfU0VDOworCWJ1ZlsxXSA9IGJpbjJiY2QodG0tPnRtX3NlYyk7CisJYnVmWzJdID0gYmluMmJjZCh0bS0+dG1fbWluKTsKKwlidWZbM10gPSBiaW4yYmNkKHRtLT50bV9ob3VyKTsKKwlidWZbNF0gPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlidWZbNV0gPSBiaW4yYmNkKHRtLT50bV93ZGF5KTsKKwlidWZbNl0gPSBiaW4yYmNkKHRtLT50bV9tb24pOworCWJ1Zls3XSA9IGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApOworCisJLyogd3JpdGUgdGltZS9kYXRlIHJlZ2lzdGVycyAqLworCWlmICgoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgJm1zZywgMSkpICE9IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogd3JpdGUgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBlbTMwMjdfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gZW0zMDI3X2dldF90aW1lLAorCS5zZXRfdGltZSA9IGVtMzAyN19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgZW0zMDI3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoZW0zMDI3X2RyaXZlci5kcml2ZXIubmFtZSwgJmNsaWVudC0+ZGV2LAorCQkJCSAgJmVtMzAyN19ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtMzAyN19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgZW0zMDI3X2lkW10gPSB7CisJeyAiZW0zMDI3IiwgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGVtMzAyN19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAicnRjLWVtMzAyNyIsCisJfSwKKwkucHJvYmUgPSAmZW0zMDI3X3Byb2JlLAorCS5yZW1vdmUgPSAmZW0zMDI3X3JlbW92ZSwKKwkuaWRfdGFibGUgPSBlbTMwMjdfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihlbTMwMjdfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTWlrZSBSYXBvcG9ydCA8bWlrZUBjb21wdWxhYi5jby5pbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRU0gTWljcm9lbGVjdHJvbmljIEVNMzAyNyBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZXA5M3h4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZXA5M3h4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhNDJhMQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1lcDkzeHguYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIEEgZHJpdmVyIGZvciB0aGUgUlRDIGVtYmVkZGVkIGluIHRoZSBDaXJydXMgTG9naWMgRVA5M1hYIHByb2Nlc3NvcnMKKyAqIENvcHlyaWdodCAoYykgMjAwNiBUb3dlciBUZWNobm9sb2dpZXMKKyAqCisgKiBBdXRob3I6IEFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisKKyNkZWZpbmUgRVA5M1hYX1JUQ19EQVRBCQkJMHgwMDAKKyNkZWZpbmUgRVA5M1hYX1JUQ19NQVRDSAkJMHgwMDQKKyNkZWZpbmUgRVA5M1hYX1JUQ19TVEFUVVMJCTB4MDA4CisjZGVmaW5lICBFUDkzWFhfUlRDX1NUQVRVU19JTlRSCQkgKDE8PDApCisjZGVmaW5lIEVQOTNYWF9SVENfTE9BRAkJCTB4MDBDCisjZGVmaW5lIEVQOTNYWF9SVENfQ09OVFJPTAkJMHgwMTAKKyNkZWZpbmUgIEVQOTNYWF9SVENfQ09OVFJPTF9NSUUJCSAoMTw8MCkKKyNkZWZpbmUgRVA5M1hYX1JUQ19TV0NPTVAJCTB4MTA4CisjZGVmaW5lICBFUDkzWFhfUlRDX1NXQ09NUF9ERUxfTUFTSwkgMHgwMDFmMDAwMAorI2RlZmluZSAgRVA5M1hYX1JUQ19TV0NPTVBfREVMX1NISUZUCSAxNgorI2RlZmluZSAgRVA5M1hYX1JUQ19TV0NPTVBfSU5UX01BU0sJIDB4MDAwMGZmZmYKKyNkZWZpbmUgIEVQOTNYWF9SVENfU1dDT01QX0lOVF9TSElGVAkgMAorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjMiCisKKy8qCisgKiBzdHJ1Y3QgZGV2aWNlIGRldi5wbGF0Zm9ybV9kYXRhIGlzIHVzZWQgdG8gc3RvcmUgb3VyIHByaXZhdGUgZGF0YQorICogYmVjYXVzZSBzdHJ1Y3QgcnRjX2RldmljZSBkb2VzIG5vdCBoYXZlIGEgdmFyaWFibGUgdG8gaG9sZCBpdC4KKyAqLworc3RydWN0IGVwOTN4eF9ydGMgeworCXZvaWQgX19pb21lbQkqbW1pb19iYXNlOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Cit9OworCitzdGF0aWMgaW50IGVwOTN4eF9ydGNfZ2V0X3N3Y29tcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0ICpwcmVsb2FkLAorCQkJCXVuc2lnbmVkIHNob3J0ICpkZWxldGUpCit7CisJc3RydWN0IGVwOTN4eF9ydGMgKmVwOTN4eF9ydGMgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJdW5zaWduZWQgbG9uZyBjb21wOworCisJY29tcCA9IF9fcmF3X3JlYWRsKGVwOTN4eF9ydGMtPm1taW9fYmFzZSArIEVQOTNYWF9SVENfU1dDT01QKTsKKworCWlmIChwcmVsb2FkKQorCQkqcHJlbG9hZCA9IChjb21wICYgRVA5M1hYX1JUQ19TV0NPTVBfSU5UX01BU0spCisJCQkJPj4gRVA5M1hYX1JUQ19TV0NPTVBfSU5UX1NISUZUOworCisJaWYgKGRlbGV0ZSkKKwkJKmRlbGV0ZSA9IChjb21wICYgRVA5M1hYX1JUQ19TV0NPTVBfREVMX01BU0spCisJCQkJPj4gRVA5M1hYX1JUQ19TV0NPTVBfREVMX1NISUZUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXA5M3h4X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBlcDkzeHhfcnRjICplcDkzeHhfcnRjID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXVuc2lnbmVkIGxvbmcgdGltZTsKKworCSB0aW1lID0gX19yYXdfcmVhZGwoZXA5M3h4X3J0Yy0+bW1pb19iYXNlICsgRVA5M1hYX1JUQ19EQVRBKTsKKworCXJ0Y190aW1lX3RvX3RtKHRpbWUsIHRtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcDkzeHhfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQoreworCXN0cnVjdCBlcDkzeHhfcnRjICplcDkzeHhfcnRjID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJX19yYXdfd3JpdGVsKHNlY3MgKyAxLCBlcDkzeHhfcnRjLT5tbWlvX2Jhc2UgKyBFUDkzWFhfUlRDX0xPQUQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVwOTN4eF9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXVuc2lnbmVkIHNob3J0IHByZWxvYWQsIGRlbGV0ZTsKKworCWVwOTN4eF9ydGNfZ2V0X3N3Y29tcChkZXYsICZwcmVsb2FkLCAmZGVsZXRlKTsKKworCXNlcV9wcmludGYoc2VxLCAicHJlbG9hZFx0XHQ6ICVkXG4iLCBwcmVsb2FkKTsKKwlzZXFfcHJpbnRmKHNlcSwgImRlbGV0ZVx0XHQ6ICVkXG4iLCBkZWxldGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBlcDkzeHhfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gZXA5M3h4X3J0Y19yZWFkX3RpbWUsCisJLnNldF9tbXNzCT0gZXA5M3h4X3J0Y19zZXRfbW1zcywKKwkucHJvYwkJPSBlcDkzeHhfcnRjX3Byb2MsCit9OworCitzdGF0aWMgc3NpemVfdCBlcDkzeHhfcnRjX3Nob3dfY29tcF9wcmVsb2FkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgc2hvcnQgcHJlbG9hZDsKKworCWVwOTN4eF9ydGNfZ2V0X3N3Y29tcChkZXYsICZwcmVsb2FkLCBOVUxMKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwcmVsb2FkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihjb21wX3ByZWxvYWQsIFNfSVJVR08sIGVwOTN4eF9ydGNfc2hvd19jb21wX3ByZWxvYWQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBlcDkzeHhfcnRjX3Nob3dfY29tcF9kZWxldGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBzaG9ydCBkZWxldGU7CisKKwllcDkzeHhfcnRjX2dldF9zd2NvbXAoZGV2LCBOVUxMLCAmZGVsZXRlKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZWxldGUpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNvbXBfZGVsZXRlLCBTX0lSVUdPLCBlcDkzeHhfcnRjX3Nob3dfY29tcF9kZWxldGUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZXA5M3h4X3J0Y19hdHRyc1tdID0geworCSZkZXZfYXR0cl9jb21wX3ByZWxvYWQuYXR0ciwKKwkmZGV2X2F0dHJfY29tcF9kZWxldGUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBlcDkzeHhfcnRjX3N5c2ZzX2ZpbGVzID0geworCS5hdHRycwk9IGVwOTN4eF9ydGNfYXR0cnMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlcDkzeHhfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVwOTN4eF9ydGMgKmVwOTN4eF9ydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVycjsKKworCWVwOTN4eF9ydGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCplcDkzeHhfcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlcDkzeHhfcnRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXA5M3h4X3J0Yy0+bW1pb19iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIWVwOTN4eF9ydGMtPm1taW9fYmFzZSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gZXA5M3h4X3J0YzsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBlcDkzeHhfcnRjKTsKKworCWVwOTN4eF9ydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwKKwkJCQkmcGRldi0+ZGV2LCAmZXA5M3h4X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKGVwOTN4eF9ydGMtPnJ0YykpIHsKKwkJZXJyID0gUFRSX0VSUihlcDkzeHhfcnRjLT5ydGMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmVwOTN4eF9ydGNfc3lzZnNfZmlsZXMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCXJldHVybiAwOworCitmYWlsOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihlcDkzeHhfcnRjLT5ydGMpOworZXhpdDoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IE5VTEw7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2V4aXQgZXA5M3h4X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZXA5M3h4X3J0YyAqZXA5M3h4X3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmVwOTN4eF9ydGNfc3lzZnNfZmlsZXMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihlcDkzeHhfcnRjLT5ydGMpOworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06ZXA5M3h4LXJ0YyIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBlcDkzeHhfcnRjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZXA5M3h4LXJ0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZQkJPSBfX2V4aXRfcChlcDkzeHhfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlcDkzeHhfcnRjX2luaXQodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZXA5M3h4X3J0Y19kcml2ZXIsIGVwOTN4eF9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXA5M3h4X3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmVwOTN4eF9ydGNfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVQOTNYWCBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGVwOTN4eF9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChlcDkzeHhfcnRjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWZtMzEzMC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWZtMzEzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjZlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZm0zMTMwLmMKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBydGMtZm0zMTMwLmMgLSBSVEMgZHJpdmVyIGZvciBSYW10cm9uIEZNMzEzMCBJMkMgY2hpcC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFNlcmdleSBMYXBpbgorICogIEJhc2VkIG9uIGRzMTMwNyBkcml2ZXIgYnkgSmFtZXMgQ2hhcG1hbiBhbmQgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgRk0zMTMwX1JUQ19DT05UUk9MCSgweDApCisjZGVmaW5lIEZNMzEzMF9DQUxfQ09OVFJPTAkoMHgxKQorI2RlZmluZSBGTTMxMzBfUlRDX1NFQ09ORFMJKDB4MikKKyNkZWZpbmUgRk0zMTMwX1JUQ19NSU5VVEVTCSgweDMpCisjZGVmaW5lIEZNMzEzMF9SVENfSE9VUlMJKDB4NCkKKyNkZWZpbmUgRk0zMTMwX1JUQ19EQVkJCSgweDUpCisjZGVmaW5lIEZNMzEzMF9SVENfREFURQkJKDB4NikKKyNkZWZpbmUgRk0zMTMwX1JUQ19NT05USFMJKDB4NykKKyNkZWZpbmUgRk0zMTMwX1JUQ19ZRUFSUwkoMHg4KQorCisjZGVmaW5lIEZNMzEzMF9BTEFSTV9TRUNPTkRTCSgweDkpCisjZGVmaW5lIEZNMzEzMF9BTEFSTV9NSU5VVEVTCSgweGEpCisjZGVmaW5lIEZNMzEzMF9BTEFSTV9IT1VSUwkoMHhiKQorI2RlZmluZSBGTTMxMzBfQUxBUk1fREFURQkoMHhjKQorI2RlZmluZSBGTTMxMzBfQUxBUk1fTU9OVEhTCSgweGQpCisjZGVmaW5lIEZNMzEzMF9BTEFSTV9XUF9DT05UUk9MCSgweGUpCisKKyNkZWZpbmUgRk0zMTMwX0NBTF9DT05UUk9MX0JJVF9uT1NDRU4gKDEgPDwgNykgLyogT3NjaWFsbGF0b3IgZW5hYmxlZCAqLworI2RlZmluZSBGTTMxMzBfUlRDX0NPTlRST0xfQklUX0xCICgxIDw8IDcpIC8qIExvdyBiYXR0ZXJ5ICovCisjZGVmaW5lIEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfQUYgKDEgPDwgNikgLyogQWxhcm0gZmxhZyAqLworI2RlZmluZSBGTTMxMzBfUlRDX0NPTlRST0xfQklUX0NGICgxIDw8IDUpIC8qIENlbnR1cnkgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9QT1IgKDEgPDwgNCkgLyogUG93ZXIgb24gcmVzZXQgKi8KKyNkZWZpbmUgRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9BRU4gKDEgPDwgMykgLyogQWxhcm0gZW5hYmxlICovCisjZGVmaW5lIEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfQ0FMICgxIDw8IDIpIC8qIENhbGlicmF0aW9uIG1vZGUgKi8KKyNkZWZpbmUgRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9XUklURSAoMSA8PCAxKSAvKiBXPTEgLT4gd3JpdGUgbW9kZSBXPTAgbm9ybWFsICovCisjZGVmaW5lIEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfUkVBRCAoMSA8PCAwKSAvKiBSPTEgLT4gcmVhZCBtb2RlIFI9MCBub3JtYWwgKi8KKworI2RlZmluZSBGTTMxMzBfQ0xPQ0tfUkVHUyA3CisjZGVmaW5lIEZNMzEzMF9BTEFSTV9SRUdTIDUKKworc3RydWN0IGZtMzEzMCB7CisJdTgJCQlyZWdfYWRkcl90aW1lOworCXU4IAkJCXJlZ19hZGRyX2FsYXJtOworCXU4CQkJcmVnc1sxNV07CisJc3RydWN0IGkyY19tc2cJCW1zZ1s0XTsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJaW50CQkJYWxhcm1fdmFsaWQ7CisJaW50CQkJZGF0YV92YWxpZDsKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZm0zMTMwX2lkW10gPSB7CisJeyAiZm0zMTMwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBmbTMxMzBfaWQpOworCisjZGVmaW5lIEZNMzEzMF9NT0RFX05PUk1BTAkJMAorI2RlZmluZSBGTTMxMzBfTU9ERV9XUklURQkJMQorI2RlZmluZSBGTTMxMzBfTU9ERV9SRUFECQkyCisKK3N0YXRpYyB2b2lkIGZtMzEzMF9ydGNfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQoreworCXN0cnVjdCBmbTMxMzAgKmZtMzEzMCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfQ09OVFJPTF0gPQorCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZm0zMTMwLT5jbGllbnQsIEZNMzEzMF9SVENfQ09OVFJPTCk7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBGTTMxMzBfTU9ERV9OT1JNQUw6CisJCWZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdICY9CisJCQl+KEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfV1JJVEUgfAorCQkJRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9SRUFEKTsKKwkJYnJlYWs7CisJY2FzZSBGTTMxMzBfTU9ERV9XUklURToKKwkJZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfQ09OVFJPTF0gfD0gRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9XUklURTsKKwkJYnJlYWs7CisJY2FzZSBGTTMxMzBfTU9ERV9SRUFEOgorCQlmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSB8PSBGTTMxMzBfUlRDX0NPTlRST0xfQklUX1JFQUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoZGV2LCAiaW52YWxpZCBtb2RlICVkXG4iLCBtb2RlKTsKKwkJYnJlYWs7CisJfQorCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShmbTMxMzAtPmNsaWVudCwKKwkJIEZNMzEzMF9SVENfQ09OVFJPTCwgZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfQ09OVFJPTF0pOworfQorCitzdGF0aWMgaW50IGZtMzEzMF9nZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdCkKK3sKKwlzdHJ1Y3QgZm0zMTMwICpmbTMxMzAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQJCXRtcDsKKworCWlmICghZm0zMTMwLT5kYXRhX3ZhbGlkKSB7CisJCS8qIFdlIGhhdmUgaW52YWxpZCBkYXRhIGluIFJUQywgcHJvYmFibHkgZHVlCisJCXRvIGJhdHRlcnkgZmF1bHRzIG9yIG90aGVyIHByb2JsZW1zLiBSZXR1cm4gRUlPCisJCWZvciBub3csIGl0IHdpbGwgYWxsb3cgdXMgdG8gc2V0IGRhdGEgbGF0ZXIgaW5zdGVhZAorCQlvZiBlcnJvciBkdXJpbmcgcHJvYmluZyB3aGljaCBkaXNhYmxlcyBkZXZpY2UgKi8KKwkJcmV0dXJuIC1FSU87CisJfQorCWZtMzEzMF9ydGNfbW9kZShkZXYsIEZNMzEzMF9NT0RFX1JFQUQpOworCisJLyogcmVhZCB0aGUgUlRDIGRhdGUgYW5kIHRpbWUgcmVnaXN0ZXJzIGFsbCBhdCBvbmNlICovCisJdG1wID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGZtMzEzMC0+Y2xpZW50LT5kZXYucGFyZW50KSwKKwkJCWZtMzEzMC0+bXNnLCAyKTsKKwlpZiAodG1wICE9IDIpIHsKKwkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgInJlYWQiLCB0bXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmbTMxMzBfcnRjX21vZGUoZGV2LCBGTTMxMzBfTU9ERV9OT1JNQUwpOworCisJZGV2X2RiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IgorCQkJIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkicmVhZCIsCisJCQlmbTMxMzAtPnJlZ3NbMF0sIGZtMzEzMC0+cmVnc1sxXSwKKwkJCWZtMzEzMC0+cmVnc1syXSwgZm0zMTMwLT5yZWdzWzNdLAorCQkJZm0zMTMwLT5yZWdzWzRdLCBmbTMxMzAtPnJlZ3NbNV0sCisJCQlmbTMxMzAtPnJlZ3NbNl0sIGZtMzEzMC0+cmVnc1s3XSwKKwkJCWZtMzEzMC0+cmVnc1s4XSwgZm0zMTMwLT5yZWdzWzldLAorCQkJZm0zMTMwLT5yZWdzWzB4YV0sIGZtMzEzMC0+cmVnc1sweGJdLAorCQkJZm0zMTMwLT5yZWdzWzB4Y10sIGZtMzEzMC0+cmVnc1sweGRdLAorCQkJZm0zMTMwLT5yZWdzWzB4ZV0pOworCisJdC0+dG1fc2VjID0gYmNkMmJpbihmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19TRUNPTkRTXSAmIDB4N2YpOworCXQtPnRtX21pbiA9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfTUlOVVRFU10gJiAweDdmKTsKKwl0bXAgPSBmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19IT1VSU10gJiAweDNmOworCXQtPnRtX2hvdXIgPSBiY2QyYmluKHRtcCk7CisJdC0+dG1fd2RheSA9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfREFZXSAmIDB4MDcpIC0gMTsKKwl0LT50bV9tZGF5ID0gYmNkMmJpbihmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19EQVRFXSAmIDB4M2YpOworCXRtcCA9IGZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX01PTlRIU10gJiAweDFmOworCXQtPnRtX21vbiA9IGJjZDJiaW4odG1wKSAtIDE7CisKKwkvKiBhc3N1bWUgMjBZWSBub3QgMTlZWSwgYW5kIGlnbm9yZSBDRiBiaXQgKi8KKwl0LT50bV95ZWFyID0gYmNkMmJpbihmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19ZRUFSU10pICsgMTAwOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQkicmVhZCIsIHQtPnRtX3NlYywgdC0+dG1fbWluLAorCQl0LT50bV9ob3VyLCB0LT50bV9tZGF5LAorCQl0LT50bV9tb24sIHQtPnRtX3llYXIsIHQtPnRtX3dkYXkpOworCisJLyogaW5pdGlhbCBjbG9jayBzZXR0aW5nIGNhbiBiZSB1bmRlZmluZWQgKi8KKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHQpOworfQorCisKK3N0YXRpYyBpbnQgZm0zMTMwX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQoreworCXN0cnVjdCBmbTMxMzAgKmZtMzEzMCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludAkJdG1wLCBpOworCXU4CQkqYnVmID0gZm0zMTMwLT5yZWdzOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQkid3JpdGUiLCB0LT50bV9zZWMsIHQtPnRtX21pbiwKKwkJdC0+dG1faG91ciwgdC0+dG1fbWRheSwKKwkJdC0+dG1fbW9uLCB0LT50bV95ZWFyLCB0LT50bV93ZGF5KTsKKworCS8qIGZpcnN0IHJlZ2lzdGVyIGFkZHIgKi8KKwlidWZbRk0zMTMwX1JUQ19TRUNPTkRTXSA9IGJpbjJiY2QodC0+dG1fc2VjKTsKKwlidWZbRk0zMTMwX1JUQ19NSU5VVEVTXSA9IGJpbjJiY2QodC0+dG1fbWluKTsKKwlidWZbRk0zMTMwX1JUQ19IT1VSU10gPSBiaW4yYmNkKHQtPnRtX2hvdXIpOworCWJ1ZltGTTMxMzBfUlRDX0RBWV0gPSBiaW4yYmNkKHQtPnRtX3dkYXkgKyAxKTsKKwlidWZbRk0zMTMwX1JUQ19EQVRFXSA9IGJpbjJiY2QodC0+dG1fbWRheSk7CisJYnVmW0ZNMzEzMF9SVENfTU9OVEhTXSA9IGJpbjJiY2QodC0+dG1fbW9uICsgMSk7CisKKwkvKiBhc3N1bWUgMjBZWSBub3QgMTlZWSAqLworCXRtcCA9IHQtPnRtX3llYXIgLSAxMDA7CisJYnVmW0ZNMzEzMF9SVENfWUVBUlNdID0gYmluMmJjZCh0bXApOworCisJZGV2X2RiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCIKKwkJIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJIndyaXRlIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAorCQlidWZbNF0sIGJ1Zls1XSwgYnVmWzZdLCBidWZbN10sCisJCWJ1Zls4XSwgYnVmWzldLCBidWZbMHhhXSwgYnVmWzB4Yl0sCisJCWJ1ZlsweGNdLCBidWZbMHhkXSwgYnVmWzB4ZV0pOworCisJZm0zMTMwX3J0Y19tb2RlKGRldiwgRk0zMTMwX01PREVfV1JJVEUpOworCisJLyogV3JpdGluZyB0aW1lIHJlZ2lzdGVycywgd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aWJ5dGUgdHJhbnNmZXJzICovCisJZm9yIChpID0gMDsgaSA8IEZNMzEzMF9DTE9DS19SRUdTOyBpKyspIHsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShmbTMxMzAtPmNsaWVudCwKKwkJCQkJRk0zMTMwX1JUQ19TRUNPTkRTICsgaSwKKwkJCQkJZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfU0VDT05EUyArIGldKTsKKwl9CisKKwlmbTMxMzBfcnRjX21vZGUoZGV2LCBGTTMxMzBfTU9ERV9OT1JNQUwpOworCisJLyogV2UgYXNzdW1lIGhlcmUgdGhhdCBkYXRhIGFyZSB2YWxpZCBvbmNlIHdyaXR0ZW4gKi8KKwlpZiAoIWZtMzEzMC0+ZGF0YV92YWxpZCkKKwkJZm0zMTMwLT5kYXRhX3ZhbGlkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbTMxMzBfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBmbTMxMzAgKmZtMzEzMCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCB0bXA7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCisJaWYgKCFmbTMxMzAtPmFsYXJtX3ZhbGlkKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgaW52YWxpZCBhbGFybSBpbiBSVEMsIHByb2JhYmx5IGR1ZSB0byBiYXR0ZXJ5IGZhdWx0cworCQkgKiBvciBvdGhlciBwcm9ibGVtcy4gUmV0dXJuIEVJTyBmb3Igbm93LCBpdCB3aWxsIGFsbG93IHVzIHRvCisJCSAqIHNldCBhbGFybSB2YWx1ZSBsYXRlciBpbnN0ZWFkIG9mIGVycm9yIGR1cmluZyBwcm9iaW5nIHdoaWNoCisJCSAqIGRpc2FibGVzIGRldmljZQorCQkgKi8KKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogcmVhZCB0aGUgUlRDIGFsYXJtIHJlZ2lzdGVycyBhbGwgYXQgb25jZSAqLworCXRtcCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihmbTMxMzAtPmNsaWVudC0+ZGV2LnBhcmVudCksCisJCQkmZm0zMTMwLT5tc2dbMl0sIDIpOworCWlmICh0bXAgIT0gMikgeworCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAicmVhZCIsIHRtcCk7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXZfZGJnKGRldiwgImFsYXJtIHJlYWQgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9TRUNPTkRTXSwKKwkJCWZtMzEzMC0+cmVnc1tGTTMxMzBfQUxBUk1fTUlOVVRFU10sCisJCQlmbTMxMzAtPnJlZ3NbRk0zMTMwX0FMQVJNX0hPVVJTXSwKKwkJCWZtMzEzMC0+cmVnc1tGTTMxMzBfQUxBUk1fREFURV0sCisJCQlmbTMxMzAtPnJlZ3NbRk0zMTMwX0FMQVJNX01PTlRIU10pOworCisJdG0tPnRtX3NlYwk9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9TRUNPTkRTXSAmIDB4N0YpOworCXRtLT50bV9taW4JPSBiY2QyYmluKGZtMzEzMC0+cmVnc1tGTTMxMzBfQUxBUk1fTUlOVVRFU10gJiAweDdGKTsKKwl0bS0+dG1faG91cgk9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9IT1VSU10gJiAweDNGKTsKKwl0bS0+dG1fbWRheQk9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9EQVRFXSAmIDB4M0YpOworCXRtLT50bV9tb24JPSBiY2QyYmluKGZtMzEzMC0+cmVnc1tGTTMxMzBfQUxBUk1fTU9OVEhTXSAmIDB4MUYpOworCisJaWYgKHRtLT50bV9tb24gPiAwKQorCQl0bS0+dG1fbW9uIC09IDE7IC8qIFJUQyBpcyAxLTEyLCB0bV9tb24gaXMgMC0xMSAqLworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQkicmVhZCBhbGFybSIsIHRtLT50bV9zZWMsIHRtLT50bV9taW4sCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKKworCS8qIGNoZWNrIGlmIGFsYXJtIGVuYWJsZWQgKi8KKwlmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSA9CisJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShmbTMxMzAtPmNsaWVudCwgRk0zMTMwX1JUQ19DT05UUk9MKTsKKworCWlmICgoZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfQ09OVFJPTF0gJiBGTTMxMzBfUlRDX0NPTlRST0xfQklUX0FFTikgJiYKKwkJKH5mbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSAmCisJCQlGTTMxMzBfUlRDX0NPTlRST0xfQklUX0NBTCkpIHsKKwkJYWxybS0+ZW5hYmxlZCA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm0zMTMwX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBmbTMxMzAgKmZtMzEzMCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwlpbnQgaTsKKworCWRldl9kYmcoZGV2LCAiJXMgc2Vjcz0lZCwgbWlucz0lZCwgIgorCQkiaG91cnM9JWQsIG1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJIndyaXRlIGFsYXJtIiwgdG0tPnRtX3NlYywgdG0tPnRtX21pbiwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9tZGF5LAorCQl0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOworCisJZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9TRUNPTkRTXSA9CisJCSh0bS0+dG1fc2VjICE9IC0xKSA/IGJpbjJiY2QodG0tPnRtX3NlYykgOiAweDgwOworCisJZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9NSU5VVEVTXSA9CisJCSh0bS0+dG1fbWluICE9IC0xKSA/IGJpbjJiY2QodG0tPnRtX21pbikgOiAweDgwOworCisJZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9IT1VSU10gPQorCQkodG0tPnRtX2hvdXIgIT0gLTEpID8gYmluMmJjZCh0bS0+dG1faG91cikgOiAweDgwOworCisJZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9EQVRFXSA9CisJCSh0bS0+dG1fbWRheSAhPSAtMSkgPyBiaW4yYmNkKHRtLT50bV9tZGF5KSA6IDB4ODA7CisKKwlmbTMxMzAtPnJlZ3NbRk0zMTMwX0FMQVJNX01PTlRIU10gPQorCQkodG0tPnRtX21vbiAhPSAtMSkgPyBiaW4yYmNkKHRtLT50bV9tb24gKyAxKSA6IDB4ODA7CisKKwlkZXZfZGJnKGRldiwgImFsYXJtIHdyaXRlICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCWZtMzEzMC0+cmVnc1tGTTMxMzBfQUxBUk1fU0VDT05EU10sCisJCQlmbTMxMzAtPnJlZ3NbRk0zMTMwX0FMQVJNX01JTlVURVNdLAorCQkJZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9IT1VSU10sCisJCQlmbTMxMzAtPnJlZ3NbRk0zMTMwX0FMQVJNX0RBVEVdLAorCQkJZm0zMTMwLT5yZWdzW0ZNMzEzMF9BTEFSTV9NT05USFNdKTsKKwkvKiBXcml0aW5nIHRpbWUgcmVnaXN0ZXJzLCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpYnl0ZSB0cmFuc2ZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRk0zMTMwX0FMQVJNX1JFR1M7IGkrKykgeworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGZtMzEzMC0+Y2xpZW50LAorCQkJCQlGTTMxMzBfQUxBUk1fU0VDT05EUyArIGksCisJCQkJCWZtMzEzMC0+cmVnc1tGTTMxMzBfQUxBUk1fU0VDT05EUyArIGldKTsKKwl9CisJZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfQ09OVFJPTF0gPQorCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZm0zMTMwLT5jbGllbnQsIEZNMzEzMF9SVENfQ09OVFJPTCk7CisKKwkvKiBlbmFibGUgb3IgZGlzYWJsZSBhbGFybSAqLworCWlmIChhbHJtLT5lbmFibGVkKSB7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZm0zMTMwLT5jbGllbnQsIEZNMzEzMF9SVENfQ09OVFJPTCwKKwkJCShmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSAmCisJCQkJfihGTTMxMzBfUlRDX0NPTlRST0xfQklUX0NBTCkpIHwKKwkJCQkJRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9BRU4pOworCX0gZWxzZSB7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZm0zMTMwLT5jbGllbnQsIEZNMzEzMF9SVENfQ09OVFJPTCwKKwkJCWZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdICYKKwkJCQl+KEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfQ0FMKSAmCisJCQkJCX4oRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9BRU4pKTsKKwl9CisKKwkvKiBXZSBhc3N1bWUgaGVyZSB0aGF0IGRhdGEgaXMgdmFsaWQgb25jZSB3cml0dGVuICovCisJaWYgKCFmbTMxMzAtPmFsYXJtX3ZhbGlkKQorCQlmbTMxMzAtPmFsYXJtX3ZhbGlkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZtMzEzMF9hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IGZtMzEzMCAqZm0zMTMwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSA9CisJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShmbTMxMzAtPmNsaWVudCwgRk0zMTMwX1JUQ19DT05UUk9MKTsKKworCWRldl9kYmcoZGV2LCAiYWxhcm1faXJxX2VuYWJsZTogZW5hYmxlPSVkLCBGTTMxMzBfUlRDX0NPTlRST0w9JTAyeFxuIiwKKwkJZW5hYmxlZCwgZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfQ09OVFJPTF0pOworCisJc3dpdGNoIChlbmFibGVkKSB7CisJY2FzZSAwOgkJLyogYWxhcm0gb2ZmICovCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZm0zMTMwLT5jbGllbnQsCisJCQlGTTMxMzBfUlRDX0NPTlRST0wsIGZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdICYKKwkJCQl+KEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfQ0FMKSAmCisJCQkJCX4oRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9BRU4pKTsKKwkJYnJlYWs7CisJY2FzZSAxOgkJLyogYWxhcm0gb24gKi8KKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShmbTMxMzAtPmNsaWVudCwKKwkJCUZNMzEzMF9SVENfQ09OVFJPTCwgKGZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdICYKKwkJCQl+KEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfQ0FMKSkgfAorCQkJCQlGTTMxMzBfUlRDX0NPTlRST0xfQklUX0FFTik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBmbTMxMzBfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gZm0zMTMwX2dldF90aW1lLAorCS5zZXRfdGltZQk9IGZtMzEzMF9zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IGZtMzEzMF9yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBmbTMxMzBfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gZm0zMTMwX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZm0zMTMwX2RyaXZlcjsKKworc3RhdGljIGludCBfX2RldmluaXQgZm0zMTMwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGZtMzEzMAkJKmZtMzEzMDsKKwlpbnQJCQllcnIgPSAtRU5PREVWOworCWludAkJCXRtcDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLAorCQkJSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBKSkKKwkJcmV0dXJuIC1FSU87CisKKwlmbTMxMzAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZm0zMTMwKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWZtMzEzMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmbTMxMzAtPmNsaWVudCA9IGNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBmbTMxMzApOworCWZtMzEzMC0+cmVnX2FkZHJfdGltZSA9IEZNMzEzMF9SVENfU0VDT05EUzsKKwlmbTMxMzAtPnJlZ19hZGRyX2FsYXJtID0gRk0zMTMwX0FMQVJNX1NFQ09ORFM7CisKKwkvKiBNZXNzYWdlcyB0byByZWFkIHRpbWUgKi8KKwlmbTMxMzAtPm1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOworCWZtMzEzMC0+bXNnWzBdLmZsYWdzID0gMDsKKwlmbTMxMzAtPm1zZ1swXS5sZW4gPSAxOworCWZtMzEzMC0+bXNnWzBdLmJ1ZiA9ICZmbTMxMzAtPnJlZ19hZGRyX3RpbWU7CisKKwlmbTMxMzAtPm1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworCWZtMzEzMC0+bXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJZm0zMTMwLT5tc2dbMV0ubGVuID0gRk0zMTMwX0NMT0NLX1JFR1M7CisJZm0zMTMwLT5tc2dbMV0uYnVmID0gJmZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX1NFQ09ORFNdOworCisJLyogTWVzc2FnZXMgdG8gcmVhZCBhbGFybSAqLworCWZtMzEzMC0+bXNnWzJdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJZm0zMTMwLT5tc2dbMl0uZmxhZ3MgPSAwOworCWZtMzEzMC0+bXNnWzJdLmxlbiA9IDE7CisJZm0zMTMwLT5tc2dbMl0uYnVmID0gJmZtMzEzMC0+cmVnX2FkZHJfYWxhcm07CisKKwlmbTMxMzAtPm1zZ1szXS5hZGRyID0gY2xpZW50LT5hZGRyOworCWZtMzEzMC0+bXNnWzNdLmZsYWdzID0gSTJDX01fUkQ7CisJZm0zMTMwLT5tc2dbM10ubGVuID0gRk0zMTMwX0FMQVJNX1JFR1M7CisJZm0zMTMwLT5tc2dbM10uYnVmID0gJmZtMzEzMC0+cmVnc1tGTTMxMzBfQUxBUk1fU0VDT05EU107CisKKwlmbTMxMzAtPmFsYXJtX3ZhbGlkID0gMDsKKwlmbTMxMzAtPmRhdGFfdmFsaWQgPSAwOworCisJdG1wID0gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIGZtMzEzMC0+bXNnLCA0KTsKKwlpZiAodG1wICE9IDQpIHsKKwkJcHJfZGVidWcoInJlYWQgZXJyb3IgJWRcbiIsIHRtcCk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCWZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdID0KKwkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRk0zMTMwX1JUQ19DT05UUk9MKTsKKwlmbTMxMzAtPnJlZ3NbRk0zMTMwX0NBTF9DT05UUk9MXSA9CisJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEZNMzEzMF9DQUxfQ09OVFJPTCk7CisKKwkvKiBEaXNhYmxpbmcgY2FsaWJyYXRpb24gbW9kZSAqLworCWlmIChmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSAmIEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfQ0FMKSB7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBGTTMxMzBfUlRDX0NPTlRST0wsCisJCQlmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSAmCisJCQkJfihGTTMxMzBfUlRDX0NPTlRST0xfQklUX0NBTCkpOworCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJEaXNhYmxpbmcgY2FsaWJyYXRpb24gbW9kZSFcbiIpOworCX0KKworCS8qIERpc2FibGluZyByZWFkIGFuZCB3cml0ZSBtb2RlcyAqLworCWlmIChmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSAmIEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfV1JJVEUgfHwKKwkgICAgZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfQ09OVFJPTF0gJiBGTTMxMzBfUlRDX0NPTlRST0xfQklUX1JFQUQpIHsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEZNMzEzMF9SVENfQ09OVFJPTCwKKwkJCWZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdICYKKwkJCQl+KEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfUkVBRCB8CisJCQkJCUZNMzEzMF9SVENfQ09OVFJPTF9CSVRfV1JJVEUpKTsKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiRGlzYWJsaW5nIFJFQUQgb3IgV1JJVEUgbW9kZSFcbiIpOworCX0KKworCS8qIG9zY2lsbGF0b3Igb2ZmPyAgdHVybiBpdCBvbiwgc28gY2xvY2sgY2FuIHRpY2suICovCisJaWYgKGZtMzEzMC0+cmVnc1tGTTMxMzBfQ0FMX0NPTlRST0xdICYgRk0zMTMwX0NBTF9DT05UUk9MX0JJVF9uT1NDRU4pCisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBGTTMxMzBfQ0FMX0NPTlRST0wsCisJCQlmbTMxMzAtPnJlZ3NbRk0zMTMwX0NBTF9DT05UUk9MXSAmCisJCQkJfihGTTMxMzBfQ0FMX0NPTlRST0xfQklUX25PU0NFTikpOworCisJLyogbG93IGJhdHRlcnk/ICBjbGVhciBmbGFnLCBhbmQgd2FybiAqLworCWlmIChmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19DT05UUk9MXSAmIEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfTEIpIHsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEZNMzEzMF9SVENfQ09OVFJPTCwKKwkJCWZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdICYKKwkJCQl+KEZNMzEzMF9SVENfQ09OVFJPTF9CSVRfTEIpKTsKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiTG93IGJhdHRlcnkhXG4iKTsKKwl9CisKKwkvKiBjaGVjayBpZiBQb3dlciBPbiBSZXNldCBiaXQgaXMgc2V0ICovCisJaWYgKGZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdICYgRk0zMTMwX1JUQ19DT05UUk9MX0JJVF9QT1IpIHsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEZNMzEzMF9SVENfQ09OVFJPTCwKKwkJCWZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0NPTlRST0xdICYKKwkJCQl+Rk0zMTMwX1JUQ19DT05UUk9MX0JJVF9QT1IpOworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlBPUiBiaXQgaXMgc2V0XG4iKTsKKwl9CisJLyogQUNTIGlzIGNvbnRyb2xsZWQgYnkgYWxhcm0gKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRk0zMTMwX0FMQVJNX1dQX0NPTlRST0wsIDB4ODApOworCisJLyogYWxhcm0gcmVnaXN0ZXJzIHNhbml0eSBjaGVjayAqLworCXRtcCA9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfU0VDT05EU10gJiAweDdmKTsKKwlpZiAodG1wID4gNTkpCisJCWdvdG8gYmFkX2FsYXJtOworCisJdG1wID0gYmNkMmJpbihmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19NSU5VVEVTXSAmIDB4N2YpOworCWlmICh0bXAgPiA1OSkKKwkJZ290byBiYWRfYWxhcm07CisKKwl0bXAgPSBiY2QyYmluKGZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0hPVVJTXSAmIDB4M2YpOworCWlmICh0bXAgPiAyMykKKwkJZ290byBiYWRfYWxhcm07CisKKwl0bXAgPSBiY2QyYmluKGZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX0RBVEVdICYgMHgzZik7CisJaWYgKHRtcCA9PSAwIHx8IHRtcCA+IDMxKQorCQlnb3RvIGJhZF9hbGFybTsKKworCXRtcCA9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfTU9OVEhTXSAmIDB4MWYpOworCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAxMikKKwkJZ290byBiYWRfYWxhcm07CisKKwlmbTMxMzAtPmFsYXJtX3ZhbGlkID0gMTsKKworYmFkX2FsYXJtOgorCisJLyogY2xvY2sgcmVnaXN0ZXJzIHNhbml0eSBjaGVrICovCisJdG1wID0gYmNkMmJpbihmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19TRUNPTkRTXSAmIDB4N2YpOworCWlmICh0bXAgPiA1OSkKKwkJZ290byBiYWRfY2xvY2s7CisKKwl0bXAgPSBiY2QyYmluKGZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX01JTlVURVNdICYgMHg3Zik7CisJaWYgKHRtcCA+IDU5KQorCQlnb3RvIGJhZF9jbG9jazsKKworCXRtcCA9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfSE9VUlNdICYgMHgzZik7CisJaWYgKHRtcCA+IDIzKQorCQlnb3RvIGJhZF9jbG9jazsKKworCXRtcCA9IGJjZDJiaW4oZm0zMTMwLT5yZWdzW0ZNMzEzMF9SVENfREFZXSAmIDB4Nyk7CisJaWYgKHRtcCA9PSAwIHx8IHRtcCA+IDcpCisJCWdvdG8gYmFkX2Nsb2NrOworCisJdG1wID0gYmNkMmJpbihmbTMxMzAtPnJlZ3NbRk0zMTMwX1JUQ19EQVRFXSAmIDB4M2YpOworCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAzMSkKKwkJZ290byBiYWRfY2xvY2s7CisKKwl0bXAgPSBiY2QyYmluKGZtMzEzMC0+cmVnc1tGTTMxMzBfUlRDX01PTlRIU10gJiAweDFmKTsKKwlpZiAodG1wID09IDAgfHwgdG1wID4gMTIpCisJCWdvdG8gYmFkX2Nsb2NrOworCisJZm0zMTMwLT5kYXRhX3ZhbGlkID0gMTsKKworYmFkX2Nsb2NrOgorCisJaWYgKCFmbTMxMzAtPmRhdGFfdmFsaWQgfHwgIWZtMzEzMC0+YWxhcm1fdmFsaWQpCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkJCSIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IgorCQkJCSIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJImJvZ3VzIHJlZ2lzdGVycyIsCisJCQlmbTMxMzAtPnJlZ3NbMF0sIGZtMzEzMC0+cmVnc1sxXSwKKwkJCWZtMzEzMC0+cmVnc1syXSwgZm0zMTMwLT5yZWdzWzNdLAorCQkJZm0zMTMwLT5yZWdzWzRdLCBmbTMxMzAtPnJlZ3NbNV0sCisJCQlmbTMxMzAtPnJlZ3NbNl0sIGZtMzEzMC0+cmVnc1s3XSwKKwkJCWZtMzEzMC0+cmVnc1s4XSwgZm0zMTMwLT5yZWdzWzldLAorCQkJZm0zMTMwLT5yZWdzWzB4YV0sIGZtMzEzMC0+cmVnc1sweGJdLAorCQkJZm0zMTMwLT5yZWdzWzB4Y10sIGZtMzEzMC0+cmVnc1sweGRdLAorCQkJZm0zMTMwLT5yZWdzWzB4ZV0pOworCisJLyogV2Ugd29uJ3QgYmFpbCBvdXQgaGVyZSBiZWNhdXNlIHdlIGp1c3QgZ290IGludmFsaWQgZGF0YS4KKwkgICBUaW1lIHNldHRpbmcgZnJvbSB1LWJvb3QgZG9lc24ndCB3b3JrIGFueXdheSAqLworCWZtMzEzMC0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihjbGllbnQtPm5hbWUsICZjbGllbnQtPmRldiwKKwkJCQkmZm0zMTMwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKGZtMzEzMC0+cnRjKSkgeworCQllcnIgPSBQVFJfRVJSKGZtMzEzMC0+cnRjKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkidW5hYmxlIHRvIHJlZ2lzdGVyIHRoZSBjbGFzcyBkZXZpY2VcbiIpOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisJcmV0dXJuIDA7CitleGl0X2ZyZWU6CisJa2ZyZWUoZm0zMTMwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBmbTMxMzBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGZtMzEzMCAqZm0zMTMwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZm0zMTMwLT5ydGMpOworCWtmcmVlKGZtMzEzMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBmbTMxMzBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJ0Yy1mbTMxMzAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBmbTMxMzBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChmbTMxMzBfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBmbTMxMzBfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihmbTMxMzBfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgZHJpdmVyIGZvciBGTTMxMzAiKTsKK01PRFVMRV9BVVRIT1IoIlNlcmdleSBMYXBpbiA8c2xhcGluQG9zc2ZhbnMub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtZ2VuZXJpYy5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWdlbmVyaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODMyMjAwCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWdlbmVyaWMuYwpAQCAtMCwwICsxLDg0IEBACisvKiBydGMtZ2VuZXJpYzogUlRDIGRyaXZlciB1c2luZyB0aGUgZ2VuZXJpYyBSVEMgYWJzdHJhY3Rpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggS3lsZSBNY01hcnRpbiA8a3lsZUBtY21hcnRpbi5jYT4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCitzdGF0aWMgaW50IGdlbmVyaWNfZ2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGludCByZXQgPSBnZXRfcnRjX3RpbWUodG0pOworCisJaWYgKHJldCAmIFJUQ19CQVRUX0JBRCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaWYgKHNldF9ydGNfdGltZSh0bSkgPCAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGdlbmVyaWNfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gZ2VuZXJpY19nZXRfdGltZSwKKwkuc2V0X3RpbWUgPSBnZW5lcmljX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2VuZXJpY19ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJydGMtZ2VuZXJpYyIsICZkZXYtPmRldiwgJmdlbmVyaWNfcnRjX29wcywKKwkJCQkgIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2V4aXQgZ2VuZXJpY19ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdlbmVyaWNfcnRjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJydGMtZ2VuZXJpYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZSA9IF9fZXhpdF9wKGdlbmVyaWNfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnZW5lcmljX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZ2VuZXJpY19ydGNfZHJpdmVyLCBnZW5lcmljX3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnZW5lcmljX3J0Y19maW5pKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdlbmVyaWNfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGdlbmVyaWNfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoZ2VuZXJpY19ydGNfZmluaSk7CisKK01PRFVMRV9BVVRIT1IoIkt5bGUgTWNNYXJ0aW4gPGt5bGVAbWNtYXJ0aW4uY2E+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgUlRDIGRyaXZlciIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtZ2VuZXJpYyIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWlteGRpLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtaW14ZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc0NGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWlteGRpLmMKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMCBPcmV4IENvbXB1dGVkIFJhZGlvZ3JhcGh5CisgKi8KKworLyoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworLyogYmFzZWQgb24gcnRjLW1jMTM4OTIuYyAqLworCisvKgorICogVGhpcyBkcml2ZXIgdXNlcyB0aGUgNDctYml0IDMyIGtIeiBjb3VudGVyIGluIHRoZSBGcmVlc2NhbGUgRHJ5SWNlIGJsb2NrCisgKiB0byBpbXBsZW1lbnQgYSBMaW51eCBSVEMuIFRpbWVzIGFuZCBhbGFybXMgYXJlIHRydW5jYXRlZCB0byBzZWNvbmRzLgorICogU2luY2UgdGhlIFJUQyBmcmFtZXdvcmsgcGVyZm9ybXMgQVBJIGxvY2tpbmcgdmlhIHJ0Yy0+b3BzX2xvY2sgdGhlCisgKiBvbmx5IHNpbXVsdGFuZW91cyBhY2Nlc3NlcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aCBpcyB1cGRhdGluZyBEcnlJY2UKKyAqIHJlZ2lzdGVycyB3aGlsZSBzZXJ2aWNpbmcgYW4gYWxhcm0uCisgKgorICogTm90ZSB0aGF0IHJlYWRpbmcgdGhlIERTUiAoRHJ5SWNlIFN0YXR1cyBSZWdpc3RlcikgYXV0b21hdGljYWxseSBjbGVhcnMKKyAqIHRoZSBXQ0YgKFdyaXRlIENvbXBsZXRlIEZsYWcpLiBBbGwgRHJ5SWNlIHdyaXRlcyBhcmUgc3luY2hyb25pemVkIHRvIHRoZQorICogTFAgKExvdyBQb3dlcikgZG9tYWluIGFuZCBzZXQgdGhlIFdDRiB1cG9uIGNvbXBsZXRpb24uIFdyaXRlcyB0byB0aGUKKyAqIERJRVIgKERyeUljZSBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyKSBhcmUgdGhlIG9ubHkgZXhjZXB0aW9uLiBUaGVzZQorICogb2NjdXIgYXQgbm9ybWFsIGJ1cyBzcGVlZHMgYW5kIGRvIG5vdCBzZXQgV0NGLiAgUGVyaW9kaWMgaW50ZXJydXB0cyBhcmUKKyAqIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworLyogRHJ5SWNlIFJlZ2lzdGVyIERlZmluaXRpb25zICovCisKKyNkZWZpbmUgRFRDTVIgICAgIDB4MDAgICAgICAgICAgIC8qIFRpbWUgQ291bnRlciBNU0IgUmVnICovCisjZGVmaW5lIERUQ0xSICAgICAweDA0ICAgICAgICAgICAvKiBUaW1lIENvdW50ZXIgTFNCIFJlZyAqLworCisjZGVmaW5lIERDQU1SICAgICAweDA4ICAgICAgICAgICAvKiBDbG9jayBBbGFybSBNU0IgUmVnICovCisjZGVmaW5lIERDQUxSICAgICAweDBjICAgICAgICAgICAvKiBDbG9jayBBbGFybSBMU0IgUmVnICovCisjZGVmaW5lIERDQU1SX1VOU0VUICAweEZGRkZGRkZGICAvKiBkb29tc2RheSAtIDEgc2VjICovCisKKyNkZWZpbmUgRENSICAgICAgIDB4MTAgICAgICAgICAgIC8qIENvbnRyb2wgUmVnICovCisjZGVmaW5lIERDUl9UQ0UgICAoMSA8PCAzKSAgICAgICAvKiBUaW1lIENvdW50ZXIgRW5hYmxlICovCisKKyNkZWZpbmUgRFNSICAgICAgIDB4MTQgICAgICAgICAgIC8qIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgRFNSX1dCRiAgICgxIDw8IDEwKSAgICAgIC8qIFdyaXRlIEJ1c3kgRmxhZyAqLworI2RlZmluZSBEU1JfV05GICAgKDEgPDwgOSkgICAgICAgLyogV3JpdGUgTmV4dCBGbGFnICovCisjZGVmaW5lIERTUl9XQ0YgICAoMSA8PCA4KSAgICAgICAvKiBXcml0ZSBDb21wbGV0ZSBGbGFnICovCisjZGVmaW5lIERTUl9XRUYgICAoMSA8PCA3KSAgICAgICAvKiBXcml0ZSBFcnJvciBGbGFnICovCisjZGVmaW5lIERTUl9DQUYgICAoMSA8PCA0KSAgICAgICAvKiBDbG9jayBBbGFybSBGbGFnICovCisjZGVmaW5lIERTUl9OVkYgICAoMSA8PCAxKSAgICAgICAvKiBOb24tVmFsaWQgRmxhZyAqLworI2RlZmluZSBEU1JfU1ZGICAgKDEgPDwgMCkgICAgICAgLyogU2VjdXJpdHkgVmlvbGF0aW9uIEZsYWcgKi8KKworI2RlZmluZSBESUVSICAgICAgMHgxOCAgICAgICAgICAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWcgKi8KKyNkZWZpbmUgRElFUl9XTklFICgxIDw8IDkpICAgICAgIC8qIFdyaXRlIE5leHQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBESUVSX1dDSUUgKDEgPDwgOCkgICAgICAgLyogV3JpdGUgQ29tcGxldGUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBESUVSX1dFSUUgKDEgPDwgNykgICAgICAgLyogV3JpdGUgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBESUVSX0NBSUUgKDEgPDwgNCkgICAgICAgLyogQ2xvY2sgQWxhcm0gSW50ZXJydXB0IEVuYWJsZSAqLworCisvKioKKyAqIHN0cnVjdCBpbXhkaV9kZXYgLSBwcml2YXRlIGlteGRpIHJ0YyBkYXRhCisgKiBAcGRldjogcGlvbnRlciB0byBwbGF0Zm9ybSBkZXYKKyAqIEBydGM6IHBvaW50ZXIgdG8gcnRjIHN0cnVjdAorICogQGlvYWRkcjogSU8gcmVnaXN0ZXJzIHBvaW50ZXIKKyAqIEBpcnE6IGRyeWljZSBub3JtYWwgaW50ZXJydXB0CisgKiBAY2xrOiBpbnB1dCByZWZlcmVuY2UgY2xvY2sKKyAqIEBkc3I6IGNvcHkgb2YgdGhlIERTUiByZWdpc3RlcgorICogQGlycV9sb2NrOiBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyIChESUVSKSBsb2NrCisgKiBAd3JpdGVfd2FpdDogcmVnaXN0ZXJzIHdyaXRlIGNvbXBsZXRlIHF1ZXVlCisgKiBAd3JpdGVfbXV0ZXg6IHNlcmlhbGl6ZSByZWdpc3RlcnMgd3JpdGUKKyAqIEB3b3JrOiBzY2hlZHVsZSBhbGFybSB3b3JrCisgKi8KK3N0cnVjdCBpbXhkaV9kZXYgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgaXJxOworCXN0cnVjdCBjbGsgKmNsazsKKwl1MzIgZHNyOworCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKKwlzdHJ1Y3QgbXV0ZXggd3JpdGVfbXV0ZXg7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Cit9OworCisvKgorICogZW5hYmxlIGEgZHJ5aWNlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZCBkaV9pbnRfZW5hYmxlKHN0cnVjdCBpbXhkaV9kZXYgKmlteGRpLCB1MzIgaW50cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlteGRpLT5pcnFfbG9jaywgZmxhZ3MpOworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChpbXhkaS0+aW9hZGRyICsgRElFUikgfCBpbnRyLAorCQkJaW14ZGktPmlvYWRkciArIERJRVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlteGRpLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogZGlzYWJsZSBhIGRyeWljZSBpbnRlcnJ1cHQKKyAqLworc3RhdGljIHZvaWQgZGlfaW50X2Rpc2FibGUoc3RydWN0IGlteGRpX2RldiAqaW14ZGksIHUzMiBpbnRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW14ZGktPmlycV9sb2NrLCBmbGFncyk7CisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKGlteGRpLT5pb2FkZHIgKyBESUVSKSAmIH5pbnRyLAorCQkJaW14ZGktPmlvYWRkciArIERJRVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlteGRpLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBjbGVhciB0aGUgZHJ5aWNlIHdyaXRlLWVycm9yIGZsYWcuCisgKgorICogQSBkcnlpY2Ugd3JpdGUgZXJyb3IgaXMgc2ltaWxhciB0byBhIGJ1cyBmYXVsdCBhbmQgc2hvdWxkIG5vdCBvY2N1ciBpbgorICogbm9ybWFsIG9wZXJhdGlvbi4gIENsZWFyaW5nIHRoZSBmbGFnIHJlcXVpcmVzIGFub3RoZXIgd3JpdGUsIHNvIHRoZSByb290CisgKiBjYXVzZSBvZiB0aGUgcHJvYmxlbSBtYXkgbmVlZCB0byBiZSBmaXhlZCBiZWZvcmUgdGhlIGZsYWcgY2FuIGJlIGNsZWFyZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFyX3dyaXRlX2Vycm9yKHN0cnVjdCBpbXhkaV9kZXYgKmlteGRpKQoreworCWludCBjbnQ7CisKKwlkZXZfd2FybigmaW14ZGktPnBkZXYtPmRldiwgIldBUk5JTkc6IFJlZ2lzdGVyIHdyaXRlIGVycm9yIVxuIik7CisKKwkvKiBjbGVhciB0aGUgd3JpdGUgZXJyb3IgZmxhZyAqLworCV9fcmF3X3dyaXRlbChEU1JfV0VGLCBpbXhkaS0+aW9hZGRyICsgRFNSKTsKKworCS8qIHdhaXQgZm9yIGl0IHRvIHRha2UgZWZmZWN0ICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCAxMDAwOyBjbnQrKykgeworCQlpZiAoKF9fcmF3X3JlYWRsKGlteGRpLT5pb2FkZHIgKyBEU1IpICYgRFNSX1dFRikgPT0gMCkKKwkJCXJldHVybjsKKwkJdWRlbGF5KDEwKTsKKwl9CisJZGV2X2VycigmaW14ZGktPnBkZXYtPmRldiwKKwkJCSJFUlJPUjogQ2Fubm90IGNsZWFyIHdyaXRlLWVycm9yIGZsYWchXG4iKTsKK30KKworLyoKKyAqIFdyaXRlIGEgZHJ5aWNlIHJlZ2lzdGVyIGFuZCB3YWl0IHVudGlsIGl0IGNvbXBsZXRlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaW50ZXJydXB0cyB0byBkZXRlcm1pbmUgd2hlbiB0aGUKKyAqIHdyaXRlIGhhcyBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBpbnQgZGlfd3JpdGVfd2FpdChzdHJ1Y3QgaW14ZGlfZGV2ICppbXhkaSwgdTMyIHZhbCwgaW50IHJlZykKK3sKKwlpbnQgcmV0OworCWludCByYyA9IDA7CisKKwkvKiBzZXJpYWxpemUgcmVnaXN0ZXIgd3JpdGVzICovCisJbXV0ZXhfbG9jaygmaW14ZGktPndyaXRlX211dGV4KTsKKworCS8qIGVuYWJsZSB0aGUgd3JpdGUtY29tcGxldGUgaW50ZXJydXB0ICovCisJZGlfaW50X2VuYWJsZShpbXhkaSwgRElFUl9XQ0lFKTsKKworCWlteGRpLT5kc3IgPSAwOworCisJLyogZG8gdGhlIHJlZ2lzdGVyIHdyaXRlICovCisJX19yYXdfd3JpdGVsKHZhbCwgaW14ZGktPmlvYWRkciArIHJlZyk7CisKKwkvKiB3YWl0IGZvciB0aGUgd3JpdGUgdG8gZmluaXNoICovCisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW14ZGktPndyaXRlX3dhaXQsCisJCQlpbXhkaS0+ZHNyICYgKERTUl9XQ0YgfCBEU1JfV0VGKSwgbXNlY3NfdG9famlmZmllcygxKSk7CisJaWYgKHJldCA8IDApIHsKKwkJcmMgPSByZXQ7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJZGV2X3dhcm4oJmlteGRpLT5wZGV2LT5kZXYsCisJCQkJIldyaXRlLXdhaXQgdGltZW91dCAiCisJCQkJInZhbCA9IDB4JTA4eCByZWcgPSAweCUwOHhcbiIsIHZhbCwgcmVnKTsKKwl9CisKKwkvKiBjaGVjayBmb3Igd3JpdGUgZXJyb3IgKi8KKwlpZiAoaW14ZGktPmRzciAmIERTUl9XRUYpIHsKKwkJY2xlYXJfd3JpdGVfZXJyb3IoaW14ZGkpOworCQlyYyA9IC1FSU87CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbXhkaS0+d3JpdGVfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogcmVhZCB0aGUgc2Vjb25kcyBwb3J0aW9uIG9mIHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGUgZHJ5aWNlIHRpbWUgY291bnRlcgorICovCitzdGF0aWMgaW50IGRyeWljZV9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgaW14ZGlfZGV2ICppbXhkaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgbm93OworCisJbm93ID0gX19yYXdfcmVhZGwoaW14ZGktPmlvYWRkciArIERUQ01SKTsKKwlydGNfdGltZV90b190bShub3csIHRtKTsKKworCXJldHVybiAwOworfQorCisvKgorICogc2V0IHRoZSBzZWNvbmRzIHBvcnRpb24gb2YgZHJ5aWNlIHRpbWUgY291bnRlciBhbmQgY2xlYXIgdGhlCisgKiBmcmFjdGlvbmFsIHBhcnQuCisgKi8KK3N0YXRpYyBpbnQgZHJ5aWNlX3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwlzdHJ1Y3QgaW14ZGlfZGV2ICppbXhkaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByYzsKKworCS8qIHplcm8gdGhlIGZyYWN0aW9uYWwgcGFydCBmaXJzdCAqLworCXJjID0gZGlfd3JpdGVfd2FpdChpbXhkaSwgMCwgRFRDTFIpOworCWlmIChyYyA9PSAwKQorCQlyYyA9IGRpX3dyaXRlX3dhaXQoaW14ZGksIHNlY3MsIERUQ01SKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkcnlpY2VfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQl1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgaW14ZGlfZGV2ICppbXhkaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGVuYWJsZWQpCisJCWRpX2ludF9lbmFibGUoaW14ZGksIERJRVJfQ0FJRSk7CisJZWxzZQorCQlkaV9pbnRfZGlzYWJsZShpbXhkaSwgRElFUl9DQUlFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogcmVhZCB0aGUgc2Vjb25kcyBwb3J0aW9uIG9mIHRoZSBhbGFybSByZWdpc3Rlci4KKyAqIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIGFsYXJtIHJlZ2lzdGVyIGlzIGFsd2F5cyB6ZXJvLgorICovCitzdGF0aWMgaW50IGRyeWljZV9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlzdHJ1Y3QgaW14ZGlfZGV2ICppbXhkaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiBkY2FtcjsKKworCWRjYW1yID0gX19yYXdfcmVhZGwoaW14ZGktPmlvYWRkciArIERDQU1SKTsKKwlydGNfdGltZV90b190bShkY2FtciwgJmFsYXJtLT50aW1lKTsKKworCS8qIGFsYXJtIGlzIGVuYWJsZWQgaWYgdGhlIGludGVycnVwdCBpcyBlbmFibGVkICovCisJYWxhcm0tPmVuYWJsZWQgPSAoX19yYXdfcmVhZGwoaW14ZGktPmlvYWRkciArIERJRVIpICYgRElFUl9DQUlFKSAhPSAwOworCisJLyogZG9uJ3QgYWxsb3cgdGhlIERTUiByZWFkIHRvIG1lc3MgdXAgRFNSX1dDRiAqLworCW11dGV4X2xvY2soJmlteGRpLT53cml0ZV9tdXRleCk7CisKKwkvKiBhbGFybSBpcyBwZW5kaW5nIGlmIHRoZSBhbGFybSBmbGFnIGlzIHNldCAqLworCWFsYXJtLT5wZW5kaW5nID0gKF9fcmF3X3JlYWRsKGlteGRpLT5pb2FkZHIgKyBEU1IpICYgRFNSX0NBRikgIT0gMDsKKworCW11dGV4X3VubG9jaygmaW14ZGktPndyaXRlX211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogc2V0IHRoZSBzZWNvbmRzIHBvcnRpb24gb2YgZHJ5aWNlIGFsYXJtIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbnQgZHJ5aWNlX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IGlteGRpX2RldiAqaW14ZGkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKwl1bnNpZ25lZCBsb25nIGFsYXJtX3RpbWU7CisJaW50IHJjOworCisJcmMgPSBydGNfdG1fdG9fdGltZSgmYWxhcm0tPnRpbWUsICZhbGFybV90aW1lKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIGRvbid0IGFsbG93IHNldHRpbmcgYWxhcm0gaW4gdGhlIHBhc3QgKi8KKwlub3cgPSBfX3Jhd19yZWFkbChpbXhkaS0+aW9hZGRyICsgRFRDTVIpOworCWlmIChhbGFybV90aW1lIDwgbm93KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHdyaXRlIHRoZSBuZXcgYWxhcm0gdGltZSAqLworCXJjID0gZGlfd3JpdGVfd2FpdChpbXhkaSwgKHUzMilhbGFybV90aW1lLCBEQ0FNUik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoYWxhcm0tPmVuYWJsZWQpCisJCWRpX2ludF9lbmFibGUoaW14ZGksIERJRVJfQ0FJRSk7ICAvKiBlbmFibGUgYWxhcm0gaW50ciAqLworCWVsc2UKKwkJZGlfaW50X2Rpc2FibGUoaW14ZGksIERJRVJfQ0FJRSk7IC8qIGRpc2FibGUgYWxhcm0gaW50ciAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkcnlpY2VfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCQk9IGRyeWljZV9ydGNfcmVhZF90aW1lLAorCS5zZXRfbW1zcwkJPSBkcnlpY2VfcnRjX3NldF9tbXNzLAorCS5hbGFybV9pcnFfZW5hYmxlCT0gZHJ5aWNlX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorCS5yZWFkX2FsYXJtCQk9IGRyeWljZV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCQk9IGRyeWljZV9ydGNfc2V0X2FsYXJtLAorfTsKKworLyoKKyAqIGRyeWljZSAibm9ybWFsIiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZHJ5aWNlX25vcm1faXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaW14ZGlfZGV2ICppbXhkaSA9IGRldl9pZDsKKwl1MzIgZHNyLCBkaWVyOworCWlycXJldHVybl90IHJjID0gSVJRX05PTkU7CisKKwlkaWVyID0gX19yYXdfcmVhZGwoaW14ZGktPmlvYWRkciArIERJRVIpOworCisJLyogaGFuZGxlIHdyaXRlIGNvbXBsZXRlIGFuZCB3cml0ZSBlcnJvciBjYXNlcyAqLworCWlmICgoZGllciAmIERJRVJfV0NJRSkpIHsKKwkJLypJZiB0aGUgd3JpdGUgd2FpdCBxdWV1ZSBpcyBlbXB0eSB0aGVuIHRoZXJlIGlzIG5vIHBlbmRpbmcKKwkJICBvcGVyYXRpb25zLiBJdCBtZWFucyB0aGUgaW50ZXJydXB0IGlzIGZvciBEcnlJY2UgLVNlY3VyaXR5LgorCQkgIElSUSBtdXN0IGJlIHJldHVybmVkIGFzIG5vbmUuKi8KKwkJaWYgKGxpc3RfZW1wdHlfY2FyZWZ1bCgmaW14ZGktPndyaXRlX3dhaXQudGFza19saXN0KSkKKwkJCXJldHVybiByYzsKKworCQkvKiBEU1JfV0NGIGNsZWFycyBpdHNlbGYgb24gRFNSIHJlYWQgKi8KKwkJZHNyID0gX19yYXdfcmVhZGwoaW14ZGktPmlvYWRkciArIERTUik7CisJCWlmICgoZHNyICYgKERTUl9XQ0YgfCBEU1JfV0VGKSkpIHsKKwkJCS8qIG1hc2sgdGhlIGludGVycnVwdCAqLworCQkJZGlfaW50X2Rpc2FibGUoaW14ZGksIERJRVJfV0NJRSk7CisKKwkJCS8qIHNhdmUgdGhlIGRzciB2YWx1ZSBmb3IgdGhlIHdhaXQgcXVldWUgKi8KKwkJCWlteGRpLT5kc3IgfD0gZHNyOworCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlteGRpLT53cml0ZV93YWl0KTsKKwkJCXJjID0gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisKKwkvKiBoYW5kbGUgdGhlIGFsYXJtIGNhc2UgKi8KKwlpZiAoKGRpZXIgJiBESUVSX0NBSUUpKSB7CisJCS8qIERTUl9XQ0YgY2xlYXJzIGl0c2VsZiBvbiBEU1IgcmVhZCAqLworCQlkc3IgPSBfX3Jhd19yZWFkbChpbXhkaS0+aW9hZGRyICsgRFNSKTsKKwkJaWYgKGRzciAmIERTUl9DQUYpIHsKKwkJCS8qIG1hc2sgdGhlIGludGVycnVwdCAqLworCQkJZGlfaW50X2Rpc2FibGUoaW14ZGksIERJRVJfQ0FJRSk7CisKKwkJCS8qIGZpbmlzaCBhbGFybSBpbiB1c2VyIGNvbnRleHQgKi8KKwkJCXNjaGVkdWxlX3dvcmsoJmlteGRpLT53b3JrKTsKKwkJCXJjID0gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKgorICogcG9zdCB0aGUgYWxhcm0gZXZlbnQgZnJvbSB1c2VyIGNvbnRleHQgc28gaXQgY2FuIHNsZWVwCisgKiBvbiB0aGUgd3JpdGUgY29tcGxldGlvbi4KKyAqLworc3RhdGljIHZvaWQgZHJ5aWNlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbXhkaV9kZXYgKmlteGRpID0gY29udGFpbmVyX29mKHdvcmssCisJCQlzdHJ1Y3QgaW14ZGlfZGV2LCB3b3JrKTsKKworCS8qIGRpc21pc3MgdGhlIGludGVycnVwdCAoaWdub3JlIGVycm9yKSAqLworCWRpX3dyaXRlX3dhaXQoaW14ZGksIERTUl9DQUYsIERTUik7CisKKwkvKiBwYXNzIHRoZSBhbGFybSBldmVudCB0byB0aGUgcnRjIGZyYW1ld29yay4gKi8KKwlydGNfdXBkYXRlX2lycShpbXhkaS0+cnRjLCAxLCBSVENfQUYgfCBSVENfSVJRRik7Cit9CisKKy8qCisgKiBwcm9iZSBmb3IgZHJ5aWNlIHJ0YyBkZXZpY2UKKyAqLworc3RhdGljIGludCBkcnlpY2VfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGlteGRpX2RldiAqaW14ZGk7CisJaW50IHJjOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbXhkaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmlteGRpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbXhkaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbXhkaS0+cGRldiA9IHBkZXY7CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQlwZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlteGRpLT5pb2FkZHIgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCXJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKGlteGRpLT5pb2FkZHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmaW14ZGktPmlycV9sb2NrKTsKKworCWlteGRpLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpbXhkaS0+aXJxIDwgMCkKKwkJcmV0dXJuIGlteGRpLT5pcnE7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbXhkaS0+d3JpdGVfd2FpdCk7CisKKwlJTklUX1dPUksoJmlteGRpLT53b3JrLCBkcnlpY2Vfd29yayk7CisKKwltdXRleF9pbml0KCZpbXhkaS0+d3JpdGVfbXV0ZXgpOworCisJaW14ZGktPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihpbXhkaS0+Y2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW14ZGktPmNsayk7CisJY2xrX2VuYWJsZShpbXhkaS0+Y2xrKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBkcnlpY2UgaGFyZHdhcmUKKwkgKi8KKworCS8qIG1hc2sgYWxsIGludGVycnVwdHMgKi8KKwlfX3Jhd193cml0ZWwoMCwgaW14ZGktPmlvYWRkciArIERJRVIpOworCisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlteGRpLT5pcnEsIGRyeWljZV9ub3JtX2lycSwKKwkJCUlSUUZfU0hBUkVELCBwZGV2LT5uYW1lLCBpbXhkaSk7CisJaWYgKHJjKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbm90IGF2YWlsYWJsZS5cbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBwdXQgZHJ5aWNlIGludG8gdmFsaWQgc3RhdGUgKi8KKwlpZiAoX19yYXdfcmVhZGwoaW14ZGktPmlvYWRkciArIERTUikgJiBEU1JfTlZGKSB7CisJCXJjID0gZGlfd3JpdGVfd2FpdChpbXhkaSwgRFNSX05WRiB8IERTUl9TVkYsIERTUik7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIGluaXRpYWxpemUgYWxhcm0gKi8KKwlyYyA9IGRpX3dyaXRlX3dhaXQoaW14ZGksIERDQU1SX1VOU0VULCBEQ0FNUik7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKwlyYyA9IGRpX3dyaXRlX3dhaXQoaW14ZGksIDAsIERDQUxSKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJLyogY2xlYXIgYWxhcm0gZmxhZyAqLworCWlmIChfX3Jhd19yZWFkbChpbXhkaS0+aW9hZGRyICsgRFNSKSAmIERTUl9DQUYpIHsKKwkJcmMgPSBkaV93cml0ZV93YWl0KGlteGRpLCBEU1JfQ0FGLCBEU1IpOworCQlpZiAocmMpCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKiB0aGUgdGltZXIgd29uJ3QgY291bnQgaWYgaXQgaGFzIG5ldmVyIGJlZW4gd3JpdHRlbiB0byAqLworCWlmIChfX3Jhd19yZWFkbChpbXhkaS0+aW9hZGRyICsgRFRDTVIpID09IDApIHsKKwkJcmMgPSBkaV93cml0ZV93YWl0KGlteGRpLCAwLCBEVENNUik7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIHN0YXJ0IGtlZXBpbmcgdGltZSAqLworCWlmICghKF9fcmF3X3JlYWRsKGlteGRpLT5pb2FkZHIgKyBEQ1IpICYgRENSX1RDRSkpIHsKKwkJcmMgPSBkaV93cml0ZV93YWl0KGlteGRpLAorCQkJCV9fcmF3X3JlYWRsKGlteGRpLT5pb2FkZHIgKyBEQ1IpIHwgRENSX1RDRSwKKwkJCQlEQ1IpOworCQlpZiAocmMpCisJCQlnb3RvIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbXhkaSk7CisJaW14ZGktPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkgICZkcnlpY2VfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIoaW14ZGktPnJ0YykpIHsKKwkJcmMgPSBQVFJfRVJSKGlteGRpLT5ydGMpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWNsa19kaXNhYmxlKGlteGRpLT5jbGspOworCWNsa19wdXQoaW14ZGktPmNsayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRyeWljZV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGlteGRpX2RldiAqaW14ZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZsdXNoX3dvcmsoJmlteGRpLT53b3JrKTsKKworCS8qIG1hc2sgYWxsIGludGVycnVwdHMgKi8KKwlfX3Jhd193cml0ZWwoMCwgaW14ZGktPmlvYWRkciArIERJRVIpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGlteGRpLT5ydGMpOworCisJY2xrX2Rpc2FibGUoaW14ZGktPmNsayk7CisJY2xrX3B1dChpbXhkaS0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkcnlpY2VfcnRjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJpbXhkaV9ydGMiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoZHJ5aWNlX3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJ5aWNlX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZHJ5aWNlX3J0Y19kcml2ZXIsIGRyeWljZV9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJ5aWNlX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRyeWljZV9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZHJ5aWNlX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KGRyeWljZV9ydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIik7CitNT0RVTEVfQVVUSE9SKCJCYXJ1Y2ggU2lhY2ggPGJhcnVjaEB0a29zLmNvLmlsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJTVggRHJ5SWNlIFJlYWx0aW1lIENsb2NrIERyaXZlciAoUlRDKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWlzbDEyMDIyLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtaXNsMTIwMjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODUwMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWlzbDEyMDIyLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBBbiBJMkMgZHJpdmVyIGZvciB0aGUgSW50ZXJzaWwgSVNMIDEyMDIyCisgKgorICogQXV0aG9yOiBSb21hbiBGaWV0emUgPHJvbWFuLmZpZXR6ZUB0ZWxlbW90aXZlLmRlPgorICoKKyAqIEJhc2VkIG9uIHRoZSBQaGlsaXBzIFBDRjg1NjMgUlRDCisgKiBieSBBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEiCisKKy8qIElTTCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIElTTDEyMDIyX1JFR19TQwkJMHgwMAorI2RlZmluZSBJU0wxMjAyMl9SRUdfTU4JCTB4MDEKKyNkZWZpbmUgSVNMMTIwMjJfUkVHX0hSCQkweDAyCisjZGVmaW5lIElTTDEyMDIyX1JFR19EVAkJMHgwMworI2RlZmluZSBJU0wxMjAyMl9SRUdfTU8JCTB4MDQKKyNkZWZpbmUgSVNMMTIwMjJfUkVHX1lSCQkweDA1CisjZGVmaW5lIElTTDEyMDIyX1JFR19EVwkJMHgwNgorCisjZGVmaW5lIElTTDEyMDIyX1JFR19TUgkJMHgwNworI2RlZmluZSBJU0wxMjAyMl9SRUdfSU5UCTB4MDgKKworLyogSVNMIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgSVNMMTIwMjJfSFJfTUlMCQkoMSA8PCA3KQkvKiBtaWxpdGFyeSBvciAyNCBob3VyIHRpbWUgKi8KKworI2RlZmluZSBJU0wxMjAyMl9TUl9MQkFUODUJKDEgPDwgMikKKyNkZWZpbmUgSVNMMTIwMjJfU1JfTEJBVDc1CSgxIDw8IDEpCisKKyNkZWZpbmUgSVNMMTIwMjJfSU5UX1dSVEMJKDEgPDwgNikKKworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXNsMTIwMjJfZHJpdmVyOworCitzdHJ1Y3QgaXNsMTIwMjIgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisKKwlib29sIHdyaXRlX2VuYWJsZWQ7CS8qIHRydWUgaWYgd3JpdGUgZW5hYmxlIGlzIHNldCAqLworfTsKKworCitzdGF0aWMgaW50IGlzbDEyMDIyX3JlYWRfcmVncyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1aW50OF90IHJlZywKKwkJCSAgICAgIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBuKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gZGF0YQorCQl9LAkJLyogc2V0dXAgcmVhZCBwdHIgKi8KKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSBuLAorCQkJLmJ1Zgk9IGRhdGEKKwkJfQorCX07CisKKwlpbnQgcmV0OworCisJZGF0YVswXSA9IHJlZzsKKwlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCBBUlJBWV9TSVpFKG1zZ3MpKTsKKwlpZiAocmV0ICE9IEFSUkFZX1NJWkUobXNncykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZCBlcnJvciwgcmV0PSVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXNsMTIwMjJfd3JpdGVfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICB1aW50OF90IHJlZywgdWludDhfdCB2YWwpCit7CisJdWludDhfdCBkYXRhWzJdID0geyByZWcsIHZhbCB9OworCWludCBlcnI7CisKKwllcnIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkYXRhLCBzaXplb2YoZGF0YSkpOworCWlmIChlcnIgIT0gc2l6ZW9mKGRhdGEpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIiVzOiBlcnI9JWQgYWRkcj0lMDJ4LCBkYXRhPSUwMnhcbiIsCisJCQlfX2Z1bmNfXywgZXJyLCBkYXRhWzBdLCBkYXRhWzFdKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEluIHRoZSByb3V0aW5lcyB0aGF0IGRlYWwgZGlyZWN0bHkgd2l0aCB0aGUgaXNsMTIwMjIgaGFyZHdhcmUsIHdlIHVzZQorICogcnRjX3RpbWUgLS0gbW9udGggMC0xMSwgaG91ciAwLTIzLCB5ciA9IGNhbGVuZGFyIHllYXItZXBvY2guCisgKi8KK3N0YXRpYyBpbnQgaXNsMTIwMjJfZ2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdWludDhfdCBidWZbSVNMMTIwMjJfUkVHX0lOVCArIDFdOworCWludCByZXQ7CisKKwlyZXQgPSBpc2wxMjAyMl9yZWFkX3JlZ3MoY2xpZW50LCBJU0wxMjAyMl9SRUdfU0MsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnVmW0lTTDEyMDIyX1JFR19TUl0gJiAoSVNMMTIwMjJfU1JfTEJBVDg1IHwgSVNMMTIwMjJfU1JfTEJBVDc1KSkgeworCQlkZXZfd2FybigmY2xpZW50LT5kZXYsCisJCQkgInZvbHRhZ2UgZHJvcHBlZCBiZWxvdyAldSUlLCAiCisJCQkgImRhdGUgYW5kIHRpbWUgaXMgbm90IHJlbGlhYmxlLlxuIiwKKwkJCSBidWZbSVNMMTIwMjJfUkVHX1NSXSAmIElTTDEyMDIyX1NSX0xCQVQ4NSA/IDg1IDogNzUpOworCX0KKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkiJXM6IHJhdyBkYXRhIGlzIHNlYz0lMDJ4LCBtaW49JTAyeCwgaHI9JTAyeCwgIgorCQkibWRheT0lMDJ4LCBtb249JTAyeCwgeWVhcj0lMDJ4LCB3ZGF5PSUwMngsICIKKwkJInNyPSUwMngsIGludD0lMDJ4IiwKKwkJX19mdW5jX18sCisJCWJ1ZltJU0wxMjAyMl9SRUdfU0NdLAorCQlidWZbSVNMMTIwMjJfUkVHX01OXSwKKwkJYnVmW0lTTDEyMDIyX1JFR19IUl0sCisJCWJ1ZltJU0wxMjAyMl9SRUdfRFRdLAorCQlidWZbSVNMMTIwMjJfUkVHX01PXSwKKwkJYnVmW0lTTDEyMDIyX1JFR19ZUl0sCisJCWJ1ZltJU0wxMjAyMl9SRUdfRFddLAorCQlidWZbSVNMMTIwMjJfUkVHX1NSXSwKKwkJYnVmW0lTTDEyMDIyX1JFR19JTlRdKTsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKGJ1ZltJU0wxMjAyMl9SRUdfU0NdICYgMHg3Rik7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4oYnVmW0lTTDEyMDIyX1JFR19NTl0gJiAweDdGKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oYnVmW0lTTDEyMDIyX1JFR19IUl0gJiAweDNGKTsKKwl0bS0+dG1fbWRheSA9IGJjZDJiaW4oYnVmW0lTTDEyMDIyX1JFR19EVF0gJiAweDNGKTsKKwl0bS0+dG1fd2RheSA9IGJ1ZltJU0wxMjAyMl9SRUdfRFddICYgMHgwNzsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihidWZbSVNMMTIwMjJfUkVHX01PXSAmIDB4MUYpIC0gMTsKKwl0bS0+dG1feWVhciA9IGJjZDJiaW4oYnVmW0lTTDEyMDIyX1JFR19ZUl0pICsgMTAwOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsICIKKwkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJX19mdW5jX18sCisJCXRtLT50bV9zZWMsIHRtLT50bV9taW4sIHRtLT50bV9ob3VyLAorCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKKworCS8qIFRoZSBjbG9jayBjYW4gZ2l2ZSBvdXQgaW52YWxpZCBkYXRldGltZSwgYnV0IHdlIGNhbm5vdCByZXR1cm4KKwkgKiAtRUlOVkFMIG90aGVyd2lzZSBod2Nsb2NrIHdpbGwgcmVmdXNlIHRvIHNldCB0aGUgdGltZSBvbiBib290dXAuICovCisJaWYgKHJ0Y192YWxpZF90bSh0bSkgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJldHJpZXZlZCBkYXRlIGFuZCB0aW1lIGlzIGludmFsaWQuXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzbDEyMDIyX3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBpc2wxMjAyMiAqaXNsMTIwMjIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzaXplX3QgaTsKKwlpbnQgcmV0OworCXVpbnQ4X3QgYnVmW0lTTDEyMDIyX1JFR19EVyArIDFdOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsICIKKwkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJX19mdW5jX18sCisJCXRtLT50bV9zZWMsIHRtLT50bV9taW4sIHRtLT50bV9ob3VyLAorCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKKworCWlmICghaXNsMTIwMjItPndyaXRlX2VuYWJsZWQpIHsKKworCQlyZXQgPSBpc2wxMjAyMl9yZWFkX3JlZ3MoY2xpZW50LCBJU0wxMjAyMl9SRUdfSU5ULCBidWYsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiBDaGVjayBpZiBXUlRDICh3cml0ZSBydGMgZW5hYmxlKSBpcyBzZXQgZmFjdG9yeSBkZWZhdWx0IGlzCisJCSAqIDAgKG5vdCBzZXQpICovCisJCWlmICghKGJ1ZlswXSAmIElTTDEyMDIyX0lOVF9XUlRDKSkgeworCQkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LAorCQkJCSAiaW5pdCB3cml0ZSBlbmFibGUgYW5kIDI0IGhvdXIgZm9ybWF0XG4iKTsKKworCQkJLyogU2V0IHRoZSB3cml0ZSBlbmFibGUgYml0LiAqLworCQkJcmV0ID0gaXNsMTIwMjJfd3JpdGVfcmVnKGNsaWVudCwKKwkJCQkJCSBJU0wxMjAyMl9SRUdfSU5ULAorCQkJCQkJIGJ1ZlswXSB8IElTTDEyMDIyX0lOVF9XUlRDKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJLyogV3JpdGUgdG8gYW55IFJUQyByZWdpc3RlciB0byBzdGFydCBSVEMsIHdlIHVzZSB0aGUKKwkJCSAqIEhSIHJlZ2lzdGVyLCBzZXR0aW5nIHRoZSBNSUwgYml0IHRvIHVzZSB0aGUgMjQgaG91cgorCQkJICogZm9ybWF0LiAqLworCQkJcmV0ID0gaXNsMTIwMjJfcmVhZF9yZWdzKGNsaWVudCwgSVNMMTIwMjJfUkVHX0hSLAorCQkJCQkJIGJ1ZiwgMSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCXJldCA9IGlzbDEyMDIyX3dyaXRlX3JlZyhjbGllbnQsCisJCQkJCQkgSVNMMTIwMjJfUkVHX0hSLAorCQkJCQkJIGJ1ZlswXSB8IElTTDEyMDIyX0hSX01JTCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlpc2wxMjAyMi0+d3JpdGVfZW5hYmxlZCA9IDE7CisJfQorCisJLyogaG91cnMsIG1pbnV0ZXMgYW5kIHNlY29uZHMgKi8KKwlidWZbSVNMMTIwMjJfUkVHX1NDXSA9IGJpbjJiY2QodG0tPnRtX3NlYyk7CisJYnVmW0lTTDEyMDIyX1JFR19NTl0gPSBiaW4yYmNkKHRtLT50bV9taW4pOworCWJ1ZltJU0wxMjAyMl9SRUdfSFJdID0gYmluMmJjZCh0bS0+dG1faG91cikgfCBJU0wxMjAyMl9IUl9NSUw7CisKKwlidWZbSVNMMTIwMjJfUkVHX0RUXSA9IGJpbjJiY2QodG0tPnRtX21kYXkpOworCisJLyogbW9udGgsIDEgLSAxMiAqLworCWJ1ZltJU0wxMjAyMl9SRUdfTU9dID0gYmluMmJjZCh0bS0+dG1fbW9uICsgMSk7CisKKwkvKiB5ZWFyIGFuZCBjZW50dXJ5ICovCisJYnVmW0lTTDEyMDIyX1JFR19ZUl0gPSBiaW4yYmNkKHRtLT50bV95ZWFyICUgMTAwKTsKKworCWJ1ZltJU0wxMjAyMl9SRUdfRFddID0gdG0tPnRtX3dkYXkgJiAweDA3OworCisJLyogd3JpdGUgcmVnaXN0ZXIncyBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVmKTsgaSsrKSB7CisJCXJldCA9IGlzbDEyMDIyX3dyaXRlX3JlZyhjbGllbnQsIElTTDEyMDIyX1JFR19TQyArIGksCisJCQkJCSBidWZbSVNMMTIwMjJfUkVHX1NDICsgaV0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzbDEyMDIyX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiBpc2wxMjAyMl9nZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKK3N0YXRpYyBpbnQgaXNsMTIwMjJfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gaXNsMTIwMjJfc2V0X2RhdGV0aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgaXNsMTIwMjJfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gaXNsMTIwMjJfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBpc2wxMjAyMl9ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IGlzbDEyMDIyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaXNsMTIwMjIgKmlzbDEyMDIyOworCisJaW50IHJldCA9IDA7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpc2wxMjAyMiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpc2wxMjAyMiksIEdGUF9LRVJORUwpOworCWlmICghaXNsMTIwMjIpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJjaGlwIGZvdW5kLCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaXNsMTIwMjIpOworCisJaXNsMTIwMjItPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoaXNsMTIwMjJfZHJpdmVyLmRyaXZlci5uYW1lLAorCQkJCQkgICAgJmNsaWVudC0+ZGV2LAorCQkJCQkgICAgJmlzbDEyMDIyX3J0Y19vcHMsCisJCQkJCSAgICBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKGlzbDEyMDIyLT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIoaXNsMTIwMjItPnJ0Yyk7CisJCWdvdG8gZXhpdF9rZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9rZnJlZToKKwlrZnJlZShpc2wxMjAyMik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzbDEyMDIyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBpc2wxMjAyMiAqaXNsMTIwMjIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihpc2wxMjAyMi0+cnRjKTsKKwlrZnJlZShpc2wxMjAyMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlzbDEyMDIyX2lkW10gPSB7CisJeyAiaXNsMTIwMjIiLCAwIH0sCisJeyAicnRjODU2NCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgaXNsMTIwMjJfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXNsMTIwMjJfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtaXNsMTIwMjIiLAorCX0sCisJLnByb2JlCQk9IGlzbDEyMDIyX3Byb2JlLAorCS5yZW1vdmUJCT0gaXNsMTIwMjJfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGlzbDEyMDIyX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoaXNsMTIwMjJfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigicm9tYW4uZmlldHplQHRlbGVtb3RpdmUuZGUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVNMIDEyMDIyIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1pc2wxMjA4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtaXNsMTIwOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOGM4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtaXNsMTIwOC5jCkBAIC0wLDAgKzEsNzIxIEBACisvKgorICogSW50ZXJzaWwgSVNMMTIwOCBydGMgY2xhc3MgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDUsMjAwNiBIZWJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMyIKKworLyogUmVnaXN0ZXIgbWFwICovCisvKiBydGMgc2VjdGlvbiAqLworI2RlZmluZSBJU0wxMjA4X1JFR19TQyAgMHgwMAorI2RlZmluZSBJU0wxMjA4X1JFR19NTiAgMHgwMQorI2RlZmluZSBJU0wxMjA4X1JFR19IUiAgMHgwMgorI2RlZmluZSBJU0wxMjA4X1JFR19IUl9NSUwgICAgICgxPDw3KQkvKiAyNGgvMTJoIG1vZGUgKi8KKyNkZWZpbmUgSVNMMTIwOF9SRUdfSFJfUE0gICAgICAoMTw8NSkJLyogUE0vQU0gYml0IGluIDEyaCBtb2RlICovCisjZGVmaW5lIElTTDEyMDhfUkVHX0RUICAweDAzCisjZGVmaW5lIElTTDEyMDhfUkVHX01PICAweDA0CisjZGVmaW5lIElTTDEyMDhfUkVHX1lSICAweDA1CisjZGVmaW5lIElTTDEyMDhfUkVHX0RXICAweDA2CisjZGVmaW5lIElTTDEyMDhfUlRDX1NFQ1RJT05fTEVOIDcKKworLyogY29udHJvbC9zdGF0dXMgc2VjdGlvbiAqLworI2RlZmluZSBJU0wxMjA4X1JFR19TUiAgMHgwNworI2RlZmluZSBJU0wxMjA4X1JFR19TUl9BUlNUICAgICgxPDw3KQkvKiBhdXRvIHJlc2V0ICovCisjZGVmaW5lIElTTDEyMDhfUkVHX1NSX1hUT1NDQiAgKDE8PDYpCS8qIGNyeXN0YWwgb3NjaWxsYXRvciAqLworI2RlZmluZSBJU0wxMjA4X1JFR19TUl9XUlRDICAgICgxPDw0KQkvKiB3cml0ZSBydGMgKi8KKyNkZWZpbmUgSVNMMTIwOF9SRUdfU1JfQUxNICAgICAoMTw8MikJLyogYWxhcm0gKi8KKyNkZWZpbmUgSVNMMTIwOF9SRUdfU1JfQkFUICAgICAoMTw8MSkJLyogYmF0dGVyeSAqLworI2RlZmluZSBJU0wxMjA4X1JFR19TUl9SVENGICAgICgxPDwwKQkvKiBydGMgZmFpbCAqLworI2RlZmluZSBJU0wxMjA4X1JFR19JTlQgMHgwOAorI2RlZmluZSBJU0wxMjA4X1JFR19JTlRfQUxNRSAgICgxPDw2KSAgIC8qIGFsYXJtIGVuYWJsZSAqLworI2RlZmluZSBJU0wxMjA4X1JFR19JTlRfSU0gICAgICgxPDw3KSAgIC8qIGludGVycnVwdC9hbGFybSBtb2RlICovCisjZGVmaW5lIElTTDEyMDhfUkVHXzA5ICAweDA5CS8qIHJlc2VydmVkICovCisjZGVmaW5lIElTTDEyMDhfUkVHX0FUUiAweDBhCisjZGVmaW5lIElTTDEyMDhfUkVHX0RUUiAweDBiCisKKy8qIGFsYXJtIHNlY3Rpb24gKi8KKyNkZWZpbmUgSVNMMTIwOF9SRUdfU0NBIDB4MGMKKyNkZWZpbmUgSVNMMTIwOF9SRUdfTU5BIDB4MGQKKyNkZWZpbmUgSVNMMTIwOF9SRUdfSFJBIDB4MGUKKyNkZWZpbmUgSVNMMTIwOF9SRUdfRFRBIDB4MGYKKyNkZWZpbmUgSVNMMTIwOF9SRUdfTU9BIDB4MTAKKyNkZWZpbmUgSVNMMTIwOF9SRUdfRFdBIDB4MTEKKyNkZWZpbmUgSVNMMTIwOF9BTEFSTV9TRUNUSU9OX0xFTiA2CisKKy8qIHVzZXIgc2VjdGlvbiAqLworI2RlZmluZSBJU0wxMjA4X1JFR19VU1IxIDB4MTIKKyNkZWZpbmUgSVNMMTIwOF9SRUdfVVNSMiAweDEzCisjZGVmaW5lIElTTDEyMDhfVVNSX1NFQ1RJT05fTEVOIDIKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzbDEyMDhfZHJpdmVyOworCisvKiBibG9jayByZWFkICovCitzdGF0aWMgaW50Citpc2wxMjA4X2kyY19yZWFkX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCBidWZbXSwKKwkJICAgICAgdW5zaWduZWQgbGVuKQoreworCXU4IHJlZ19hZGRyWzFdID0geyByZWcgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0geworCQl7Y2xpZW50LT5hZGRyLCAwLCBzaXplb2YocmVnX2FkZHIpLCByZWdfYWRkcn0KKwkJLAorCQl7Y2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgbGVuLCBidWZ9CisJfTsKKwlpbnQgcmV0OworCisJQlVHX09OKHJlZyA+IElTTDEyMDhfUkVHX1VTUjIpOworCUJVR19PTihyZWcgKyBsZW4gPiBJU0wxMjA4X1JFR19VU1IyICsgMSk7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0ID0gMDsKKwlyZXR1cm4gcmV0OworfQorCisvKiBibG9jayB3cml0ZSAqLworc3RhdGljIGludAoraXNsMTIwOF9pMmNfc2V0X3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCBjb25zdCBidWZbXSwKKwkJICAgICB1bnNpZ25lZCBsZW4pCit7CisJdTggaTJjX2J1ZltJU0wxMjA4X1JFR19VU1IyICsgMl07CisJc3RydWN0IGkyY19tc2cgbXNnc1sxXSA9IHsKKwkJe2NsaWVudC0+YWRkciwgMCwgbGVuICsgMSwgaTJjX2J1Zn0KKwl9OworCWludCByZXQ7CisKKwlCVUdfT04ocmVnID4gSVNMMTIwOF9SRUdfVVNSMik7CisJQlVHX09OKHJlZyArIGxlbiA+IElTTDEyMDhfUkVHX1VTUjIgKyAxKTsKKworCWkyY19idWZbMF0gPSByZWc7CisJbWVtY3B5KCZpMmNfYnVmWzFdLCAmYnVmWzBdLCBsZW4pOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMSk7CisJaWYgKHJldCA+IDApCisJCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworLyogc2ltcGxlIGNoZWNrIHRvIHNlZSB3ZXRoZXIgd2UgaGF2ZSBhIGlzbDEyMDggKi8KK3N0YXRpYyBpbnQKK2lzbDEyMDhfaTJjX3ZhbGlkYXRlX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXU4IHJlZ3NbSVNMMTIwOF9SVENfU0VDVElPTl9MRU5dID0geyAwLCB9OworCXU4IHplcm9fbWFza1tJU0wxMjA4X1JUQ19TRUNUSU9OX0xFTl0gPSB7CisJCTB4ODAsIDB4ODAsIDB4NDAsIDB4YzAsIDB4ZTAsIDB4MDAsIDB4ZjgKKwl9OworCWludCBpOworCWludCByZXQ7CisKKwlyZXQgPSBpc2wxMjA4X2kyY19yZWFkX3JlZ3MoY2xpZW50LCAwLCByZWdzLCBJU0wxMjA4X1JUQ19TRUNUSU9OX0xFTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVNMMTIwOF9SVENfU0VDVElPTl9MRU47ICsraSkgeworCQlpZiAocmVnc1tpXSAmIHplcm9fbWFza1tpXSkJLyogY2hlY2sgaWYgYml0cyBhcmUgY2xlYXJlZCAqLworCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzbDEyMDhfaTJjX2dldF9zcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBzciA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIElTTDEyMDhfUkVHX1NSKTsKKwlpZiAoc3IgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcjsKK30KKworc3RhdGljIGludAoraXNsMTIwOF9pMmNfZ2V0X2F0cihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBhdHIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBJU0wxMjA4X1JFR19BVFIpOworCWlmIChhdHIgPCAwKQorCQlyZXR1cm4gYXRyOworCisJLyogVGhlIDZiaXQgdmFsdWUgaW4gdGhlIEFUUiByZWdpc3RlciBjb250cm9scyB0aGUgbG9hZAorCSAqIGNhcGFjaXRhbmNlIENfbG9hZCAqIGluIHN0ZXBzIG9mIDAuMjVwRgorCSAqCisJICogYml0ICgxPDw1KSBvZiB0aGUgQVRSIHJlZ2lzdGVyIGlzIGludmVydGVkCisJICoKKwkgKiBDX2xvYWQoQVRSPTB4MjApID0gIDQuNTBwRgorCSAqIENfbG9hZChBVFI9MHgwMCkgPSAxMi41MHBGCisJICogQ19sb2FkKEFUUj0weDFmKSA9IDIwLjI1cEYKKwkgKgorCSAqLworCisJYXRyICY9IDB4M2Y7CQkvKiBtYXNrIG91dCBsc2IgKi8KKwlhdHIgXj0gMSA8PCA1OwkJLyogaW52ZXJ0IDZ0aCBiaXQgKi8KKwlhdHIgKz0gMiAqIDk7CQkvKiBhZGQgb2Zmc2V0IG9mIDQuNXBGOyB1bml0W2F0cl0gPSAwLjI1cEYgKi8KKworCXJldHVybiBhdHI7Cit9CisKK3N0YXRpYyBpbnQKK2lzbDEyMDhfaTJjX2dldF9kdHIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZHRyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgSVNMMTIwOF9SRUdfRFRSKTsKKwlpZiAoZHRyIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBkdHIgZW5jb2RlcyBhZGp1c3RtZW50cyBvZiB7LTYwLC00MCwtMjAsMCwyMCw0MCw2MH0gcHBtICovCisJZHRyID0gKChkdHIgJiAweDMpICogMjApICogKGR0ciAmICgxIDw8IDIpID8gLTEgOiAxKTsKKworCXJldHVybiBkdHI7Cit9CisKK3N0YXRpYyBpbnQKK2lzbDEyMDhfaTJjX2dldF91c3Ioc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1OCBidWZbSVNMMTIwOF9VU1JfU0VDVElPTl9MRU5dID0geyAwLCB9OworCWludCByZXQ7CisKKwlyZXQgPSBpc2wxMjA4X2kyY19yZWFkX3JlZ3MoY2xpZW50LCBJU0wxMjA4X1JFR19VU1IxLCBidWYsCisJCQkJICAgIElTTDEyMDhfVVNSX1NFQ1RJT05fTEVOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAoYnVmWzFdIDw8IDgpIHwgYnVmWzBdOworfQorCitzdGF0aWMgaW50Citpc2wxMjA4X2kyY19zZXRfdXNyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiB1c3IpCit7CisJdTggYnVmW0lTTDEyMDhfVVNSX1NFQ1RJT05fTEVOXTsKKworCWJ1ZlswXSA9IHVzciAmIDB4ZmY7CisJYnVmWzFdID0gKHVzciA+PiA4KSAmIDB4ZmY7CisKKwlyZXR1cm4gaXNsMTIwOF9pMmNfc2V0X3JlZ3MoY2xpZW50LCBJU0wxMjA4X1JFR19VU1IxLCBidWYsCisJCQkJICAgIElTTDEyMDhfVVNSX1NFQ1RJT05fTEVOKTsKK30KKworc3RhdGljIGludAoraXNsMTIwOF9ydGNfdG9nZ2xlX2FsYXJtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBlbmFibGUpCit7CisJaW50IGljciA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIElTTDEyMDhfUkVHX0lOVCk7CisKKwlpZiAoaWNyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIElOVCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGljcjsKKwl9CisKKwlpZiAoZW5hYmxlKQorCQlpY3IgfD0gSVNMMTIwOF9SRUdfSU5UX0FMTUUgfCBJU0wxMjA4X1JFR19JTlRfSU07CisJZWxzZQorCQlpY3IgJj0gfihJU0wxMjA4X1JFR19JTlRfQUxNRSB8IElTTDEyMDhfUkVHX0lOVF9JTSk7CisKKwlpY3IgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSVNMMTIwOF9SRUdfSU5ULCBpY3IpOworCWlmIChpY3IgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHdyaXRpbmcgSU5UIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gaWNyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc2wxMjA4X3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNvbnN0IGNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlpbnQgc3IsIGR0ciwgYXRyLCB1c3I7CisKKwlzciA9IGlzbDEyMDhfaTJjX2dldF9zcihjbGllbnQpOworCWlmIChzciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZGluZyBTUiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHNyOworCX0KKworCXNlcV9wcmludGYoc2VxLCAic3RhdHVzX3JlZ1x0OiVzJXMlcyVzJXMlcyAoMHglLjJ4KVxuIiwKKwkJICAgKHNyICYgSVNMMTIwOF9SRUdfU1JfUlRDRikgPyAiIFJUQ0YiIDogIiIsCisJCSAgIChzciAmIElTTDEyMDhfUkVHX1NSX0JBVCkgPyAiIEJBVCIgOiAiIiwKKwkJICAgKHNyICYgSVNMMTIwOF9SRUdfU1JfQUxNKSA/ICIgQUxNIiA6ICIiLAorCQkgICAoc3IgJiBJU0wxMjA4X1JFR19TUl9XUlRDKSA/ICIgV1JUQyIgOiAiIiwKKwkJICAgKHNyICYgSVNMMTIwOF9SRUdfU1JfWFRPU0NCKSA/ICIgWFRPU0NCIiA6ICIiLAorCQkgICAoc3IgJiBJU0wxMjA4X1JFR19TUl9BUlNUKSA/ICIgQVJTVCIgOiAiIiwgc3IpOworCisJc2VxX3ByaW50ZihzZXEsICJiYXR0X3N0YXR1c1x0OiAlc1xuIiwKKwkJICAgKHNyICYgSVNMMTIwOF9SRUdfU1JfUlRDRikgPyAiYmFkIiA6ICJva2F5Iik7CisKKwlkdHIgPSBpc2wxMjA4X2kyY19nZXRfZHRyKGNsaWVudCk7CisJaWYgKGR0ciA+PSAwIC0gMSkKKwkJc2VxX3ByaW50ZihzZXEsICJkaWdpdGFsX3RyaW1cdDogJWQgcHBtXG4iLCBkdHIpOworCisJYXRyID0gaXNsMTIwOF9pMmNfZ2V0X2F0cihjbGllbnQpOworCWlmIChhdHIgPj0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICJhbmFsb2dfdHJpbVx0OiAlZC4lLjJkIHBGXG4iLAorCQkJICAgYXRyID4+IDIsIChhdHIgJiAweDMpICogMjUpOworCisJdXNyID0gaXNsMTIwOF9pMmNfZ2V0X3VzcihjbGllbnQpOworCWlmICh1c3IgPj0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICJ1c2VyX2RhdGFcdDogMHglLjR4XG4iLCB1c3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzbDEyMDhfaTJjX3JlYWRfdGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWludCBzcjsKKwl1OCByZWdzW0lTTDEyMDhfUlRDX1NFQ1RJT05fTEVOXSA9IHsgMCwgfTsKKworCXNyID0gaXNsMTIwOF9pMmNfZ2V0X3NyKGNsaWVudCk7CisJaWYgKHNyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIFNSIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzciA9IGlzbDEyMDhfaTJjX3JlYWRfcmVncyhjbGllbnQsIDAsIHJlZ3MsIElTTDEyMDhfUlRDX1NFQ1RJT05fTEVOKTsKKwlpZiAoc3IgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHJlYWRpbmcgUlRDIHNlY3Rpb24gZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gc3I7CisJfQorCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4ocmVnc1tJU0wxMjA4X1JFR19TQ10pOworCXRtLT50bV9taW4gPSBiY2QyYmluKHJlZ3NbSVNMMTIwOF9SRUdfTU5dKTsKKworCS8qIEhSIGZpZWxkIGhhcyBhIG1vcmUgY29tcGxleCBpbnRlcnByZXRhdGlvbiAqLworCXsKKwkJY29uc3QgdTggX2hyID0gcmVnc1tJU0wxMjA4X1JFR19IUl07CisJCWlmIChfaHIgJiBJU0wxMjA4X1JFR19IUl9NSUwpCS8qIDI0aCBmb3JtYXQgKi8KKwkJCXRtLT50bV9ob3VyID0gYmNkMmJpbihfaHIgJiAweDNmKTsKKwkJZWxzZSB7CisJCQkvKiAxMmggZm9ybWF0ICovCisJCQl0bS0+dG1faG91ciA9IGJjZDJiaW4oX2hyICYgMHgxZik7CisJCQlpZiAoX2hyICYgSVNMMTIwOF9SRUdfSFJfUE0pCS8qIFBNIGZsYWcgc2V0ICovCisJCQkJdG0tPnRtX2hvdXIgKz0gMTI7CisJCX0KKwl9CisKKwl0bS0+dG1fbWRheSA9IGJjZDJiaW4ocmVnc1tJU0wxMjA4X1JFR19EVF0pOworCXRtLT50bV9tb24gPSBiY2QyYmluKHJlZ3NbSVNMMTIwOF9SRUdfTU9dKSAtIDE7CS8qIHJ0YyBzdGFydHMgYXQgMSAqLworCXRtLT50bV95ZWFyID0gYmNkMmJpbihyZWdzW0lTTDEyMDhfUkVHX1lSXSkgKyAxMDA7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHJlZ3NbSVNMMTIwOF9SRUdfRFddKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc2wxMjA4X2kyY19yZWFkX2FsYXJtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKmNvbnN0IHRtID0gJmFsYXJtLT50aW1lOworCXU4IHJlZ3NbSVNMMTIwOF9BTEFSTV9TRUNUSU9OX0xFTl0gPSB7IDAsIH07CisJaW50IGljciwgeXIsIHNyID0gaXNsMTIwOF9pMmNfZ2V0X3NyKGNsaWVudCk7CisKKwlpZiAoc3IgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHJlYWRpbmcgU1IgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBzcjsKKwl9CisKKwlzciA9IGlzbDEyMDhfaTJjX3JlYWRfcmVncyhjbGllbnQsIElTTDEyMDhfUkVHX1NDQSwgcmVncywKKwkJCQkgICBJU0wxMjA4X0FMQVJNX1NFQ1RJT05fTEVOKTsKKwlpZiAoc3IgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHJlYWRpbmcgYWxhcm0gc2VjdGlvbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBzcjsKKwl9CisKKwkvKiBNU0Igb2YgZWFjaCBhbGFybSByZWdpc3RlciBpcyBhbiBlbmFibGUgYml0ICovCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4ocmVnc1tJU0wxMjA4X1JFR19TQ0EgLSBJU0wxMjA4X1JFR19TQ0FdICYgMHg3Zik7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4ocmVnc1tJU0wxMjA4X1JFR19NTkEgLSBJU0wxMjA4X1JFR19TQ0FdICYgMHg3Zik7CisJdG0tPnRtX2hvdXIgPSBiY2QyYmluKHJlZ3NbSVNMMTIwOF9SRUdfSFJBIC0gSVNMMTIwOF9SRUdfU0NBXSAmIDB4M2YpOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihyZWdzW0lTTDEyMDhfUkVHX0RUQSAtIElTTDEyMDhfUkVHX1NDQV0gJiAweDNmKTsKKwl0bS0+dG1fbW9uID0KKwkJYmNkMmJpbihyZWdzW0lTTDEyMDhfUkVHX01PQSAtIElTTDEyMDhfUkVHX1NDQV0gJiAweDFmKSAtIDE7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHJlZ3NbSVNMMTIwOF9SRUdfRFdBIC0gSVNMMTIwOF9SRUdfU0NBXSAmIDB4MDMpOworCisJLyogVGhlIGFsYXJtIGRvZXNuJ3Qgc3RvcmUgdGhlIHllYXIgc28gZ2V0IGl0IGZyb20gdGhlIHJ0YyBzZWN0aW9uICovCisJeXIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBJU0wxMjA4X1JFR19ZUik7CisJaWYgKHlyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIFJUQyBZUiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHlyOworCX0KKwl0bS0+dG1feWVhciA9IGJjZDJiaW4oeXIpICsgMTAwOworCisJaWNyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgSVNMMTIwOF9SRUdfSU5UKTsKKwlpZiAoaWNyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIElOVCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGljcjsKKwl9CisJYWxhcm0tPmVuYWJsZWQgPSAhIShpY3IgJiBJU0wxMjA4X1JFR19JTlRfQUxNRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNsMTIwOF9pMmNfc2V0X2FsYXJtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKmFsYXJtX3RtID0gJmFsYXJtLT50aW1lOworCXU4IHJlZ3NbSVNMMTIwOF9BTEFSTV9TRUNUSU9OX0xFTl0gPSB7IDAsIH07CisJY29uc3QgaW50IG9mZnMgPSBJU0wxMjA4X1JFR19TQ0E7CisJdW5zaWduZWQgbG9uZyBydGNfc2VjcywgYWxhcm1fc2VjczsKKwlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCWludCBlcnIsIGVuYWJsZTsKKworCWVyciA9IGlzbDEyMDhfaTJjX3JlYWRfdGltZShjbGllbnQsICZydGNfdG0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gcnRjX3RtX3RvX3RpbWUoJnJ0Y190bSwgJnJ0Y19zZWNzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHJ0Y190bV90b190aW1lKGFsYXJtX3RtLCAmYWxhcm1fc2Vjcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIElmIHRoZSBhbGFybSB0aW1lIGlzIGJlZm9yZSB0aGUgY3VycmVudCB0aW1lIGRpc2FibGUgdGhlIGFsYXJtICovCisJaWYgKCFhbGFybS0+ZW5hYmxlZCB8fCBhbGFybV9zZWNzIDw9IHJ0Y19zZWNzKQorCQllbmFibGUgPSAweDAwOworCWVsc2UKKwkJZW5hYmxlID0gMHg4MDsKKworCS8qIFByb2dyYW0gdGhlIGFsYXJtIGFuZCBlbmFibGUgaXQgZm9yIGVhY2ggc2V0dGluZyAqLworCXJlZ3NbSVNMMTIwOF9SRUdfU0NBIC0gb2Zmc10gPSBiaW4yYmNkKGFsYXJtX3RtLT50bV9zZWMpIHwgZW5hYmxlOworCXJlZ3NbSVNMMTIwOF9SRUdfTU5BIC0gb2Zmc10gPSBiaW4yYmNkKGFsYXJtX3RtLT50bV9taW4pIHwgZW5hYmxlOworCXJlZ3NbSVNMMTIwOF9SRUdfSFJBIC0gb2Zmc10gPSBiaW4yYmNkKGFsYXJtX3RtLT50bV9ob3VyKSB8CisJCUlTTDEyMDhfUkVHX0hSX01JTCB8IGVuYWJsZTsKKworCXJlZ3NbSVNMMTIwOF9SRUdfRFRBIC0gb2Zmc10gPSBiaW4yYmNkKGFsYXJtX3RtLT50bV9tZGF5KSB8IGVuYWJsZTsKKwlyZWdzW0lTTDEyMDhfUkVHX01PQSAtIG9mZnNdID0gYmluMmJjZChhbGFybV90bS0+dG1fbW9uICsgMSkgfCBlbmFibGU7CisJcmVnc1tJU0wxMjA4X1JFR19EV0EgLSBvZmZzXSA9IGJpbjJiY2QoYWxhcm1fdG0tPnRtX3dkYXkgJiA3KSB8IGVuYWJsZTsKKworCS8qIHdyaXRlIEFMQVJNIHJlZ2lzdGVycyAqLworCWVyciA9IGlzbDEyMDhfaTJjX3NldF9yZWdzKGNsaWVudCwgb2ZmcywgcmVncywKKwkJCQkgIElTTDEyMDhfQUxBUk1fU0VDVElPTl9MRU4pOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHdyaXRpbmcgQUxBUk0gc2VjdGlvbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gaXNsMTIwOF9ydGNfdG9nZ2xlX2FsYXJtKGNsaWVudCwgZW5hYmxlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzbDEyMDhfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIGlzbDEyMDhfaTJjX3JlYWRfdGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludAoraXNsMTIwOF9pMmNfc2V0X3RpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lIGNvbnN0ICp0bSkKK3sKKwlpbnQgc3I7CisJdTggcmVnc1tJU0wxMjA4X1JUQ19TRUNUSU9OX0xFTl0gPSB7IDAsIH07CisKKwkvKiBUaGUgY2xvY2sgaGFzIGFuIDggYml0IHdpZGUgYmNkLWNvZGVkIHJlZ2lzdGVyICh0aGV5IG5ldmVyIGxlYXJuKQorCSAqIGZvciB0aGUgeWVhci4gdG1feWVhciBpcyBhbiBvZmZzZXQgZnJvbSAxOTAwIGFuZCB3ZSBhcmUgaW50ZXJlc3RlZAorCSAqIGluIHRoZSAyMDAwLTIwOTkgcmFuZ2UsIHNvIGFueSB2YWx1ZSBsZXNzIHRoYW4gMTAwIGlzIGludmFsaWQuCisJICovCisJaWYgKHRtLT50bV95ZWFyIDwgMTAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ3NbSVNMMTIwOF9SRUdfU0NdID0gYmluMmJjZCh0bS0+dG1fc2VjKTsKKwlyZWdzW0lTTDEyMDhfUkVHX01OXSA9IGJpbjJiY2QodG0tPnRtX21pbik7CisJcmVnc1tJU0wxMjA4X1JFR19IUl0gPSBiaW4yYmNkKHRtLT50bV9ob3VyKSB8IElTTDEyMDhfUkVHX0hSX01JTDsKKworCXJlZ3NbSVNMMTIwOF9SRUdfRFRdID0gYmluMmJjZCh0bS0+dG1fbWRheSk7CisJcmVnc1tJU0wxMjA4X1JFR19NT10gPSBiaW4yYmNkKHRtLT50bV9tb24gKyAxKTsKKwlyZWdzW0lTTDEyMDhfUkVHX1lSXSA9IGJpbjJiY2QodG0tPnRtX3llYXIgLSAxMDApOworCisJcmVnc1tJU0wxMjA4X1JFR19EV10gPSBiaW4yYmNkKHRtLT50bV93ZGF5ICYgNyk7CisKKwlzciA9IGlzbDEyMDhfaTJjX2dldF9zcihjbGllbnQpOworCWlmIChzciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZGluZyBTUiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHNyOworCX0KKworCS8qIHNldCBXUlRDICovCisJc3IgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSVNMMTIwOF9SRUdfU1IsCisJCQkJICAgICAgIHNyIHwgSVNMMTIwOF9SRUdfU1JfV1JUQyk7CisJaWYgKHNyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiB3cml0aW5nIFNSIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gc3I7CisJfQorCisJLyogd3JpdGUgUlRDIHJlZ2lzdGVycyAqLworCXNyID0gaXNsMTIwOF9pMmNfc2V0X3JlZ3MoY2xpZW50LCAwLCByZWdzLCBJU0wxMjA4X1JUQ19TRUNUSU9OX0xFTik7CisJaWYgKHNyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiB3cml0aW5nIFJUQyBzZWN0aW9uIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIHNyOworCX0KKworCS8qIGNsZWFyIFdSVEMgYWdhaW4gKi8KKwlzciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBJU0wxMjA4X1JFR19TUiwKKwkJCQkgICAgICAgc3IgJiB+SVNMMTIwOF9SRUdfU1JfV1JUQyk7CisJaWYgKHNyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiB3cml0aW5nIFNSIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gc3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAoraXNsMTIwOF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiBpc2wxMjA4X2kyY19zZXRfdGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludAoraXNsMTIwOF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlyZXR1cm4gaXNsMTIwOF9pMmNfcmVhZF9hbGFybSh0b19pMmNfY2xpZW50KGRldiksIGFsYXJtKTsKK30KKworc3RhdGljIGludAoraXNsMTIwOF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXJldHVybiBpc2wxMjA4X2kyY19zZXRfYWxhcm0odG9faTJjX2NsaWVudChkZXYpLCBhbGFybSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAoraXNsMTIwOF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGE7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBoYW5kbGVkID0gMCwgc3IsIGVycjsKKworCS8qCisJICogSTJDIHJlYWRzIGdldCBOQUsnZWQgaWYgd2UgcmVhZCBzdHJhaWdodCBhd2F5IGFmdGVyIGFuIGludGVycnVwdD8KKwkgKiBVc2luZyBhIG1kZWxheS9tc2xlZXAgZGlkbid0IHNlZW0gdG8gaGVscCBlaXRoZXIsIHNvIHdlIHdvcmsgYXJvdW5kCisJICogdGhpcyBieSBjb250aW51YWxseSB0cnlpbmcgdG8gcmVhZCB0aGUgcmVnaXN0ZXIgZm9yIGEgc2hvcnQgdGltZS4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlzciA9IGlzbDEyMDhfaTJjX2dldF9zcihjbGllbnQpOworCQlpZiAoc3IgPj0gMCkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIFNSIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gc3I7CisJCX0KKwl9CisKKwlpZiAoc3IgJiBJU0wxMjA4X1JFR19TUl9BTE0pIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJhbGFybSFcbiIpOworCisJCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgUlRDX0lSUUYgfCBSVENfQUYpOworCisJCS8qIENsZWFyIHRoZSBhbGFybSAqLworCQlzciAmPSB+SVNMMTIwOF9SRUdfU1JfQUxNOworCQlzciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBJU0wxMjA4X1JFR19TUiwgc3IpOworCQlpZiAoc3IgPCAwKQorCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogd3JpdGluZyBTUiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQllbHNlCisJCQloYW5kbGVkID0gMTsKKworCQkvKiBEaXNhYmxlIHRoZSBhbGFybSAqLworCQllcnIgPSBpc2wxMjA4X3J0Y190b2dnbGVfYWxhcm0oY2xpZW50LCAwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIGhhbmRsZWQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgaXNsMTIwOF9ydGNfb3BzID0geworCS5wcm9jID0gaXNsMTIwOF9ydGNfcHJvYywKKwkucmVhZF90aW1lID0gaXNsMTIwOF9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IGlzbDEyMDhfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtID0gaXNsMTIwOF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gaXNsMTIwOF9ydGNfc2V0X2FsYXJtLAorfTsKKworLyogc3lzZnMgaW50ZXJmYWNlICovCisKK3N0YXRpYyBzc2l6ZV90Citpc2wxMjA4X3N5c2ZzX3Nob3dfYXRyaW0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGF0ciA9IGlzbDEyMDhfaTJjX2dldF9hdHIodG9faTJjX2NsaWVudChkZXYpKTsKKwlpZiAoYXRyIDwgMCkKKwkJcmV0dXJuIGF0cjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUuMmQgcEZcbiIsIGF0ciA+PiAyLCAoYXRyICYgMHgzKSAqIDI1KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGF0cmltLCBTX0lSVUdPLCBpc2wxMjA4X3N5c2ZzX3Nob3dfYXRyaW0sIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAoraXNsMTIwOF9zeXNmc19zaG93X2R0cmltKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBkdHIgPSBpc2wxMjA4X2kyY19nZXRfZHRyKHRvX2kyY19jbGllbnQoZGV2KSk7CisJaWYgKGR0ciA8IDApCisJCXJldHVybiBkdHI7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZCBwcG1cbiIsIGR0cik7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkdHJpbSwgU19JUlVHTywgaXNsMTIwOF9zeXNmc19zaG93X2R0cmltLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK2lzbDEyMDhfc3lzZnNfc2hvd191c3Ioc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgdXNyID0gaXNsMTIwOF9pMmNfZ2V0X3Vzcih0b19pMmNfY2xpZW50KGRldikpOworCWlmICh1c3IgPCAwKQorCQlyZXR1cm4gdXNyOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglLjR4XG4iLCB1c3IpOworfQorCitzdGF0aWMgc3NpemVfdAoraXNsMTIwOF9zeXNmc19zdG9yZV91c3Ioc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgdXNyID0gLTE7CisKKwlpZiAoYnVmWzBdID09ICcwJyAmJiAoYnVmWzFdID09ICd4JyB8fCBidWZbMV0gPT0gJ1gnKSkgeworCQlpZiAoc3NjYW5mKGJ1ZiwgIiV4IiwgJnVzcikgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdXNyKSAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHVzciA8IDAgfHwgdXNyID4gMHhmZmZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBpc2wxMjA4X2kyY19zZXRfdXNyKHRvX2kyY19jbGllbnQoZGV2KSwgdXNyKSA/IC1FSU8gOiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHVzciwgU19JUlVHTyB8IFNfSVdVU1IsIGlzbDEyMDhfc3lzZnNfc2hvd191c3IsCisJCSAgIGlzbDEyMDhfc3lzZnNfc3RvcmVfdXNyKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlzbDEyMDhfcnRjX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2F0cmltLmF0dHIsCisJJmRldl9hdHRyX2R0cmltLmF0dHIsCisJJmRldl9hdHRyX3Vzci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlzbDEyMDhfcnRjX3N5c2ZzX2ZpbGVzID0geworCS5hdHRycwk9IGlzbDEyMDhfcnRjX2F0dHJzLAorfTsKKworc3RhdGljIGludAoraXNsMTIwOF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGlzbDEyMDhfaTJjX3ZhbGlkYXRlX2NsaWVudChjbGllbnQpIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsCisJCSAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJcmMgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwgTlVMTCwKKwkJCQkJICBpc2wxMjA4X3J0Y19pbnRlcnJ1cHQsCisJCQkJCSAgSVJRRl9TSEFSRUQsCisJCQkJCSAgaXNsMTIwOF9kcml2ZXIuZHJpdmVyLm5hbWUsIGNsaWVudCk7CisJCWlmICghcmMpIHsKKwkJCWRldmljZV9pbml0X3dha2V1cCgmY2xpZW50LT5kZXYsIDEpOworCQkJZW5hYmxlX2lycV93YWtlKGNsaWVudC0+aXJxKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJVbmFibGUgdG8gcmVxdWVzdCBpcnEgJWQsIG5vIGFsYXJtIHN1cHBvcnRcbiIsCisJCQkJY2xpZW50LT5pcnEpOworCQkJY2xpZW50LT5pcnEgPSAwOworCQl9CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3Rlcihpc2wxMjA4X2RyaXZlci5kcml2ZXIubmFtZSwKKwkJCQkgICZjbGllbnQtPmRldiwgJmlzbDEyMDhfcnRjX29wcywKKwkJCQkgIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmMgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gZXhpdF9mcmVlX2lycTsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBydGMpOworCisJcmMgPSBpc2wxMjA4X2kyY19nZXRfc3IoY2xpZW50KTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZGluZyBzdGF0dXMgZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X3VucmVnaXN0ZXI7CisJfQorCisJaWYgKHJjICYgSVNMMTIwOF9SRUdfU1JfUlRDRikKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAicnRjIHBvd2VyIGZhaWx1cmUgZGV0ZWN0ZWQsICIKKwkJCSAicGxlYXNlIHNldCBjbG9jay5cbiIpOworCisJcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZpc2wxMjA4X3J0Y19zeXNmc19maWxlcyk7CisJaWYgKHJjKQorCQlnb3RvIGV4aXRfdW5yZWdpc3RlcjsKKworCXJldHVybiAwOworCitleGl0X3VucmVnaXN0ZXI6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CitleGl0X2ZyZWVfaXJxOgorCWlmIChjbGllbnQtPmlycSkKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGNsaWVudCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2lzbDEyMDhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmaXNsMTIwOF9ydGNfc3lzZnNfZmlsZXMpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWlmIChjbGllbnQtPmlycSkKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlzbDEyMDhfaWRbXSA9IHsKKwl7ICJpc2wxMjA4IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBpc2wxMjA4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzbDEyMDhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInJ0Yy1pc2wxMjA4IiwKKwkJICAgfSwKKwkucHJvYmUgPSBpc2wxMjA4X3Byb2JlLAorCS5yZW1vdmUgPSBpc2wxMjA4X3JlbW92ZSwKKwkuaWRfdGFibGUgPSBpc2wxMjA4X2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoaXNsMTIwOF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZXJzaWwgSVNMMTIwOCBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtano0NzQwLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtano0NzQwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhYjIyNwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1qejQ3NDAuYwpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLCBQYXVsIENlcmN1ZWlsIDxwYXVsQGNyYXBvdWlsbG91Lm5ldD4KKyAqCSBKWjQ3NDAgU29DIFJUQyBkcml2ZXIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgSlpfUkVHX1JUQ19DVFJMCQkweDAwCisjZGVmaW5lIEpaX1JFR19SVENfU0VDCQkweDA0CisjZGVmaW5lIEpaX1JFR19SVENfU0VDX0FMQVJNCTB4MDgKKyNkZWZpbmUgSlpfUkVHX1JUQ19SRUdVTEFUT1IJMHgwQworI2RlZmluZSBKWl9SRUdfUlRDX0hJQkVSTkFURQkweDIwCisjZGVmaW5lIEpaX1JFR19SVENfU0NSQVRDSFBBRAkweDM0CisKKyNkZWZpbmUgSlpfUlRDX0NUUkxfV1JEWQlCSVQoNykKKyNkZWZpbmUgSlpfUlRDX0NUUkxfMUhaCQlCSVQoNikKKyNkZWZpbmUgSlpfUlRDX0NUUkxfMUhaX0lSUQlCSVQoNSkKKyNkZWZpbmUgSlpfUlRDX0NUUkxfQUYJCUJJVCg0KQorI2RlZmluZSBKWl9SVENfQ1RSTF9BRl9JUlEJQklUKDMpCisjZGVmaW5lIEpaX1JUQ19DVFJMX0FFCQlCSVQoMikKKyNkZWZpbmUgSlpfUlRDX0NUUkxfRU5BQkxFCUJJVCgwKQorCitzdHJ1Y3Qgano0NzQwX3J0YyB7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKworCXVuc2lnbmVkIGludCBpcnE7CisKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGp6NDc0MF9ydGNfcmVnX3JlYWQoc3RydWN0IGp6NDc0MF9ydGMgKnJ0Yywgc2l6ZV90IHJlZykKK3sKKwlyZXR1cm4gcmVhZGwocnRjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3dhaXRfd3JpdGVfcmVhZHkoc3RydWN0IGp6NDc0MF9ydGMgKnJ0YykKK3sKKwl1aW50MzJfdCBjdHJsOworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCWRvIHsKKwkJY3RybCA9IGp6NDc0MF9ydGNfcmVnX3JlYWQocnRjLCBKWl9SRUdfUlRDX0NUUkwpOworCX0gd2hpbGUgKCEoY3RybCAmIEpaX1JUQ19DVFJMX1dSRFkpICYmIC0tdGltZW91dCk7CisKKwlyZXR1cm4gdGltZW91dCA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgaW5saW5lIGludCBqejQ3NDBfcnRjX3JlZ193cml0ZShzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjLCBzaXplX3QgcmVnLAorCXVpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0OworCXJldCA9IGp6NDc0MF9ydGNfd2FpdF93cml0ZV9yZWFkeShydGMpOworCWlmIChyZXQgPT0gMCkKKwkJd3JpdGVsKHZhbCwgcnRjLT5iYXNlICsgcmVnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgano0NzQwX3J0Y19jdHJsX3NldF9iaXRzKHN0cnVjdCBqejQ3NDBfcnRjICpydGMsIHVpbnQzMl90IG1hc2ssCisJYm9vbCBzZXQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQzMl90IGN0cmw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5sb2NrLCBmbGFncyk7CisKKwljdHJsID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfQ1RSTCk7CisKKwkvKiBEb24ndCBjbGVhciBpbnRlcnJ1cHQgZmxhZ3MgYnkgYWNjaWRlbnQgKi8KKwljdHJsIHw9IEpaX1JUQ19DVFJMXzFIWiB8IEpaX1JUQ19DVFJMX0FGOworCisJaWYgKHNldCkKKwkJY3RybCB8PSBtYXNrOworCWVsc2UKKwkJY3RybCAmPSB+bWFzazsKKworCXJldCA9IGp6NDc0MF9ydGNfcmVnX3dyaXRlKHJ0YywgSlpfUkVHX1JUQ19DVFJMLCBjdHJsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3sKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdWludDMyX3Qgc2Vjcywgc2VjczI7CisJaW50IHRpbWVvdXQgPSA1OworCisJLyogSWYgdGhlIHNlY29uZHMgcmVnaXN0ZXIgaXMgcmVhZCB3aGlsZSBpdCBpcyB1cGRhdGVkLCBpdCBjYW4gY29udGFpbiBhCisJICogYm9ndXMgdmFsdWUuIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIHN1cmUgdGhhdCB0d28gY29uc2VjdXRpdmUKKwkgKiByZWFkcyBoYXZlIHRoZSBzYW1lIHZhbHVlLgorCSAqLworCXNlY3MgPSBqejQ3NDBfcnRjX3JlZ19yZWFkKHJ0YywgSlpfUkVHX1JUQ19TRUMpOworCXNlY3MyID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfU0VDKTsKKworCXdoaWxlIChzZWNzICE9IHNlY3MyICYmIC0tdGltZW91dCkgeworCQlzZWNzID0gc2VjczI7CisJCXNlY3MyID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfU0VDKTsKKwl9CisKKwlpZiAodGltZW91dCA9PSAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJ0Y190aW1lX3RvX3RtKHNlY3MsIHRpbWUpOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0aW1lKTsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQoreworCXN0cnVjdCBqejQ3NDBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBqejQ3NDBfcnRjX3JlZ193cml0ZShydGMsIEpaX1JFR19SVENfU0VDLCBzZWNzKTsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdWludDMyX3Qgc2VjczsKKwl1aW50MzJfdCBjdHJsOworCisJc2VjcyA9IGp6NDc0MF9ydGNfcmVnX3JlYWQocnRjLCBKWl9SRUdfUlRDX1NFQ19BTEFSTSk7CisKKwljdHJsID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfQ1RSTCk7CisKKwlhbHJtLT5lbmFibGVkID0gISEoY3RybCAmIEpaX1JUQ19DVFJMX0FFKTsKKwlhbHJtLT5wZW5kaW5nID0gISEoY3RybCAmIEpaX1JUQ19DVFJMX0FGKTsKKworCXJ0Y190aW1lX3RvX3RtKHNlY3MsICZhbHJtLT50aW1lKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0oJmFscm0tPnRpbWUpOworfQorCitzdGF0aWMgaW50IGp6NDc0MF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBzZWNzOworCisJcnRjX3RtX3RvX3RpbWUoJmFscm0tPnRpbWUsICZzZWNzKTsKKworCXJldCA9IGp6NDc0MF9ydGNfcmVnX3dyaXRlKHJ0YywgSlpfUkVHX1JUQ19TRUNfQUxBUk0sIHNlY3MpOworCWlmICghcmV0KQorCQlyZXQgPSBqejQ3NDBfcnRjX2N0cmxfc2V0X2JpdHMocnRjLAorCQkJSlpfUlRDX0NUUkxfQUUgfCBKWl9SVENfQ1RSTF9BRl9JUlEsIGFscm0tPmVuYWJsZWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBqejQ3NDBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gano0NzQwX3J0Y19jdHJsX3NldF9iaXRzKHJ0YywgSlpfUlRDX0NUUkxfQUZfSVJRLCBlbmFibGUpOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgano0NzQwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGp6NDc0MF9ydGNfcmVhZF90aW1lLAorCS5zZXRfbW1zcwk9IGp6NDc0MF9ydGNfc2V0X21tc3MsCisJLnJlYWRfYWxhcm0JPSBqejQ3NDBfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IGp6NDc0MF9ydGNfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gano0NzQwX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGp6NDc0MF9ydGNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGp6NDc0MF9ydGMgKnJ0YyA9IGRhdGE7CisJdWludDMyX3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwljdHJsID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfQ1RSTCk7CisKKwlpZiAoY3RybCAmIEpaX1JUQ19DVFJMXzFIWikKKwkJZXZlbnRzIHw9IChSVENfVUYgfCBSVENfSVJRRik7CisKKwlpZiAoY3RybCAmIEpaX1JUQ19DVFJMX0FGKQorCQlldmVudHMgfD0gKFJUQ19BRiB8IFJUQ19JUlFGKTsKKworCXJ0Y191cGRhdGVfaXJxKHJ0Yy0+cnRjLCAxLCBldmVudHMpOworCisJano0NzQwX3J0Y19jdHJsX3NldF9iaXRzKHJ0YywgSlpfUlRDX0NUUkxfMUhaIHwgSlpfUlRDX0NUUkxfQUYsIGZhbHNlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwordm9pZCBqejQ3NDBfcnRjX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJano0NzQwX3J0Y19yZWdfd3JpdGUocnRjLCBKWl9SRUdfUlRDX0hJQkVSTkFURSwgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChqejQ3NDBfcnRjX3Bvd2Vyb2ZmKTsKKworc3RhdGljIGludCBfX2RldmluaXQgano0NzQwX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGp6NDc0MF9ydGMgKnJ0YzsKKwl1aW50MzJfdCBzY3JhdGNocGFkOworCisJcnRjID0ga3phbGxvYyhzaXplb2YoKnJ0YyksIEdGUF9LRVJORUwpOworCWlmICghcnRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJ0Yy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocnRjLT5pcnEgPCAwKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgcGxhdGZvcm0gaXJxXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlydGMtPm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFydGMtPm1lbSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHBsYXRmb3JtIG1taW8gbWVtb3J5XG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlydGMtPm1lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihydGMtPm1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUocnRjLT5tZW0pLAorCQkJCQlwZGV2LT5uYW1lKTsKKwlpZiAoIXJ0Yy0+bWVtKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgbW1pbyBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlydGMtPmJhc2UgPSBpb3JlbWFwX25vY2FjaGUocnRjLT5tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJ0Yy0+bWVtKSk7CisJaWYgKCFydGMtPmJhc2UpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBtbWlvIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmcnRjLT5sb2NrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisKKwlydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwgJmp6NDc0MF9ydGNfb3BzLAorCQkJCQlUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMtPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMtPnJ0Yyk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBydGMgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShydGMtPmlycSwgano0NzQwX3J0Y19pcnEsIDAsCisJCQkJcGRldi0+bmFtZSwgcnRjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHJ0YyBpcnE6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX3J0YzsKKwl9CisKKwlzY3JhdGNocGFkID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfU0NSQVRDSFBBRCk7CisJaWYgKHNjcmF0Y2hwYWQgIT0gMHgxMjM0NTY3OCkgeworCQlyZXQgPSBqejQ3NDBfcnRjX3JlZ193cml0ZShydGMsIEpaX1JFR19SVENfU0NSQVRDSFBBRCwgMHgxMjM0NTY3OCk7CisJCXJldCA9IGp6NDc0MF9ydGNfcmVnX3dyaXRlKHJ0YywgSlpfUkVHX1JUQ19TRUMsIDApOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3Qgd3JpdGUgd3JpdGUgdG8gUlRDIHJlZ2lzdGVyc1xuIik7CisJCQlnb3RvIGVycl9mcmVlX2lycTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEocnRjLT5pcnEsIHJ0Yyk7CitlcnJfdW5yZWdpc3Rlcl9ydGM6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yy0+cnRjKTsKK2Vycl9pb3VubWFwOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlvdW5tYXAocnRjLT5iYXNlKTsKK2Vycl9yZWxlYXNlX21lbV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJ0Yy0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShydGMtPm1lbSkpOworZXJyX2ZyZWU6CisJa2ZyZWUocnRjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGp6NDc0MF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGp6NDc0MF9ydGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZnJlZV9pcnEocnRjLT5pcnEsIHJ0Yyk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjLT5ydGMpOworCisJaW91bm1hcChydGMtPmJhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihydGMtPm1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUocnRjLT5tZW0pKTsKKworCWtmcmVlKHJ0Yyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgano0NzQwX3J0Y19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKHJ0Yy0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGp6NDc0MF9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWRpc2FibGVfaXJxX3dha2UocnRjLT5pcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgano0NzQwX3BtX29wcyA9IHsKKwkuc3VzcGVuZCA9IGp6NDc0MF9ydGNfc3VzcGVuZCwKKwkucmVzdW1lICA9IGp6NDc0MF9ydGNfcmVzdW1lLAorfTsKKyNkZWZpbmUgSlo0NzQwX1JUQ19QTV9PUFMgKCZqejQ3NDBfcG1fb3BzKQorCisjZWxzZQorI2RlZmluZSBKWjQ3NDBfUlRDX1BNX09QUyBOVUxMCisjZW5kaWYgIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqejQ3NDBfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJID0gano0NzQwX3J0Y19wcm9iZSwKKwkucmVtb3ZlCSA9IF9fZGV2ZXhpdF9wKGp6NDc0MF9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCSA9IHsKKwkJLm5hbWUgID0gImp6NDc0MC1ydGMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtICAgID0gSlo0NzQwX1JUQ19QTV9PUFMsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoano0NzQwX3J0Y19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUlRDIGRyaXZlciBmb3IgdGhlIEpaNDc0MCBTb0NcbiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpqejQ3NDAtcnRjIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbGliLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjZjA1NwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1saWIuYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIHJ0YyBhbmQgZGF0ZS90aW1lIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTA2IFRvd2VyIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4KKyAqCisgKiBiYXNlZCBvbiBhcmNoL2FybS9jb21tb24vcnRjdGltZS5jIGFuZCBvdGhlciBiaXRzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcnRjX2RheXNfaW5fbW9udGhbXSA9IHsKKwkzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgcnRjX3lkYXlzWzJdWzEzXSA9IHsKKwkvKiBOb3JtYWwgeWVhcnMgKi8KKwl7IDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LCAzNjUgfSwKKwkvKiBMZWFwIHllYXJzICovCisJeyAwLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNSwgMzY2IH0KK307CisKKyNkZWZpbmUgTEVBUFNfVEhSVV9FTkRfT0YoeSkgKCh5KS80IC0gKHkpLzEwMCArICh5KS80MDApCisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGRheXMgaW4gdGhlIG1vbnRoLgorICovCitpbnQgcnRjX21vbnRoX2RheXModW5zaWduZWQgaW50IG1vbnRoLCB1bnNpZ25lZCBpbnQgeWVhcikKK3sKKwlyZXR1cm4gcnRjX2RheXNfaW5fbW9udGhbbW9udGhdICsgKGlzX2xlYXBfeWVhcih5ZWFyKSAmJiBtb250aCA9PSAxKTsKK30KK0VYUE9SVF9TWU1CT0wocnRjX21vbnRoX2RheXMpOworCisvKgorICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIEphbnVhcnkgMS4gKDAgdG8gMzY1KQorICovCitpbnQgcnRjX3llYXJfZGF5cyh1bnNpZ25lZCBpbnQgZGF5LCB1bnNpZ25lZCBpbnQgbW9udGgsIHVuc2lnbmVkIGludCB5ZWFyKQoreworCXJldHVybiBydGNfeWRheXNbaXNfbGVhcF95ZWFyKHllYXIpXVttb250aF0gKyBkYXktMTsKK30KK0VYUE9SVF9TWU1CT0wocnRjX3llYXJfZGF5cyk7CisKKy8qCisgKiBDb252ZXJ0IHNlY29uZHMgc2luY2UgMDEtMDEtMTk3MCAwMDowMDowMCB0byBHcmVnb3JpYW4gZGF0ZS4KKyAqLwordm9pZCBydGNfdGltZV90b190bSh1bnNpZ25lZCBsb25nIHRpbWUsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgaW50IG1vbnRoLCB5ZWFyOworCWludCBkYXlzOworCisJZGF5cyA9IHRpbWUgLyA4NjQwMDsKKwl0aW1lIC09ICh1bnNpZ25lZCBpbnQpIGRheXMgKiA4NjQwMDsKKworCS8qIGRheSBvZiB0aGUgd2VlaywgMTk3MC0wMS0wMSB3YXMgYSBUaHVyc2RheSAqLworCXRtLT50bV93ZGF5ID0gKGRheXMgKyA0KSAlIDc7CisKKwl5ZWFyID0gMTk3MCArIGRheXMgLyAzNjU7CisJZGF5cyAtPSAoeWVhciAtIDE5NzApICogMzY1CisJCSsgTEVBUFNfVEhSVV9FTkRfT0YoeWVhciAtIDEpCisJCS0gTEVBUFNfVEhSVV9FTkRfT0YoMTk3MCAtIDEpOworCWlmIChkYXlzIDwgMCkgeworCQl5ZWFyIC09IDE7CisJCWRheXMgKz0gMzY1ICsgaXNfbGVhcF95ZWFyKHllYXIpOworCX0KKwl0bS0+dG1feWVhciA9IHllYXIgLSAxOTAwOworCXRtLT50bV95ZGF5ID0gZGF5cyArIDE7CisKKwlmb3IgKG1vbnRoID0gMDsgbW9udGggPCAxMTsgbW9udGgrKykgeworCQlpbnQgbmV3ZGF5czsKKworCQluZXdkYXlzID0gZGF5cyAtIHJ0Y19tb250aF9kYXlzKG1vbnRoLCB5ZWFyKTsKKwkJaWYgKG5ld2RheXMgPCAwKQorCQkJYnJlYWs7CisJCWRheXMgPSBuZXdkYXlzOworCX0KKwl0bS0+dG1fbW9uID0gbW9udGg7CisJdG0tPnRtX21kYXkgPSBkYXlzICsgMTsKKworCXRtLT50bV9ob3VyID0gdGltZSAvIDM2MDA7CisJdGltZSAtPSB0bS0+dG1faG91ciAqIDM2MDA7CisJdG0tPnRtX21pbiA9IHRpbWUgLyA2MDsKKwl0bS0+dG1fc2VjID0gdGltZSAtIHRtLT50bV9taW4gKiA2MDsKKworCXRtLT50bV9pc2RzdCA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKHJ0Y190aW1lX3RvX3RtKTsKKworLyoKKyAqIERvZXMgdGhlIHJ0Y190aW1lIHJlcHJlc2VudCBhIHZhbGlkIGRhdGUvdGltZT8KKyAqLworaW50IHJ0Y192YWxpZF90bShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWlmICh0bS0+dG1feWVhciA8IDcwCisJCXx8ICgodW5zaWduZWQpdG0tPnRtX21vbikgPj0gMTIKKwkJfHwgdG0tPnRtX21kYXkgPCAxCisJCXx8IHRtLT50bV9tZGF5ID4gcnRjX21vbnRoX2RheXModG0tPnRtX21vbiwgdG0tPnRtX3llYXIgKyAxOTAwKQorCQl8fCAoKHVuc2lnbmVkKXRtLT50bV9ob3VyKSA+PSAyNAorCQl8fCAoKHVuc2lnbmVkKXRtLT50bV9taW4pID49IDYwCisJCXx8ICgodW5zaWduZWQpdG0tPnRtX3NlYykgPj0gNjApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHJ0Y192YWxpZF90bSk7CisKKy8qCisgKiBDb252ZXJ0IEdyZWdvcmlhbiBkYXRlIHRvIHNlY29uZHMgc2luY2UgMDEtMDEtMTk3MCAwMDowMDowMC4KKyAqLworaW50IHJ0Y190bV90b190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0sIHVuc2lnbmVkIGxvbmcgKnRpbWUpCit7CisJKnRpbWUgPSBta3RpbWUodG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uICsgMSwgdG0tPnRtX21kYXksCisJCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHJ0Y190bV90b190aW1lKTsKKworLyoKKyAqIENvbnZlcnQgcnRjX3RpbWUgdG8ga3RpbWUKKyAqLwora3RpbWVfdCBydGNfdG1fdG9fa3RpbWUoc3RydWN0IHJ0Y190aW1lIHRtKQoreworCXRpbWVfdCB0aW1lOworCXJ0Y190bV90b190aW1lKCZ0bSwgJnRpbWUpOworCXJldHVybiBrdGltZV9zZXQodGltZSwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfdG1fdG9fa3RpbWUpOworCisvKgorICogQ29udmVydCBrdGltZSB0byBydGNfdGltZQorICovCitzdHJ1Y3QgcnRjX3RpbWUgcnRjX2t0aW1lX3RvX3RtKGt0aW1lX3Qga3QpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXN0cnVjdCBydGNfdGltZSByZXQ7CisKKwl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKGt0KTsKKwkvKiBSb3VuZCB1cCBhbnkgbnMgKi8KKwlpZiAodHMudHZfbnNlYykKKwkJdHMudHZfc2VjKys7CisJcnRjX3RpbWVfdG9fdG0odHMudHZfc2VjLCAmcmV0KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocnRjX2t0aW1lX3RvX3RtKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLWxwYzMyeHguYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1scGMzMnh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjNzIxOAotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1scGMzMnh4LmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworLyoKKyAqIENsb2NrIGFuZCBQb3dlciBjb250cm9sIHJlZ2lzdGVyIG9mZnNldHMKKyAqLworI2RlZmluZSBMUEMzMlhYX1JUQ19VQ09VTlQJCTB4MDAKKyNkZWZpbmUgTFBDMzJYWF9SVENfRENPVU5UCQkweDA0CisjZGVmaW5lIExQQzMyWFhfUlRDX01BVENIMAkJMHgwOAorI2RlZmluZSBMUEMzMlhYX1JUQ19NQVRDSDEJCTB4MEMKKyNkZWZpbmUgTFBDMzJYWF9SVENfQ1RSTAkJMHgxMAorI2RlZmluZSBMUEMzMlhYX1JUQ19JTlRTVEFUCQkweDE0CisjZGVmaW5lIExQQzMyWFhfUlRDX0tFWQkJCTB4MTgKKyNkZWZpbmUgTFBDMzJYWF9SVENfU1JBTQkJMHg4MAorCisjZGVmaW5lIExQQzMyWFhfUlRDX0NUUkxfTUFUQ0gwCQkoMSA8PCAwKQorI2RlZmluZSBMUEMzMlhYX1JUQ19DVFJMX01BVENIMQkJKDEgPDwgMSkKKyNkZWZpbmUgTFBDMzJYWF9SVENfQ1RSTF9PTlNXX01BVENIMAkoMSA8PCAyKQorI2RlZmluZSBMUEMzMlhYX1JUQ19DVFJMX09OU1dfTUFUQ0gxCSgxIDw8IDMpCisjZGVmaW5lIExQQzMyWFhfUlRDX0NUUkxfU1dfUkVTRVQJKDEgPDwgNCkKKyNkZWZpbmUgTFBDMzJYWF9SVENfQ1RSTF9DTlRSX0RJUwkoMSA8PCA2KQorI2RlZmluZSBMUEMzMlhYX1JUQ19DVFJMX09OU1dfRk9SQ0VfSEkJKDEgPDwgNykKKworI2RlZmluZSBMUEMzMlhYX1JUQ19JTlRTVEFUX01BVENIMAkoMSA8PCAwKQorI2RlZmluZSBMUEMzMlhYX1JUQ19JTlRTVEFUX01BVENIMQkoMSA8PCAxKQorI2RlZmluZSBMUEMzMlhYX1JUQ19JTlRTVEFUX09OU1cJKDEgPDwgMikKKworI2RlZmluZSBMUEMzMlhYX1JUQ19LRVlfT05TV19MT0FEVkFMCTB4QjVDMTNGMjcKKworI2RlZmluZSBSVENfTkFNRSAicnRjLWxwYzMyeHgiCisKKyNkZWZpbmUgcnRjX3JlYWRsKGRldiwgcmVnKSBcCisJX19yYXdfcmVhZGwoKGRldiktPnJ0Y19iYXNlICsgKHJlZykpCisjZGVmaW5lIHJ0Y193cml0ZWwoZGV2LCByZWcsIHZhbCkgXAorCV9fcmF3X3dyaXRlbCgodmFsKSwgKGRldiktPnJ0Y19iYXNlICsgKHJlZykpCisKK3N0cnVjdCBscGMzMnh4X3J0YyB7CisJdm9pZCBfX2lvbWVtICpydGNfYmFzZTsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGNoYXIgYWxhcm1fZW5hYmxlZDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZF9zZWM7CisJc3RydWN0IGxwYzMyeHhfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWVsYXBzZWRfc2VjID0gcnRjX3JlYWRsKHJ0YywgTFBDMzJYWF9SVENfVUNPVU5UKTsKKwlydGNfdGltZV90b190bShlbGFwc2VkX3NlYywgdGltZSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRpbWUpOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQoreworCXN0cnVjdCBscGMzMnh4X3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHRtcDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwkvKiBSVEMgbXVzdCBiZSBkaXNhYmxlZCBkdXJpbmcgY291bnQgdXBkYXRlICovCisJdG1wID0gcnRjX3JlYWRsKHJ0YywgTFBDMzJYWF9SVENfQ1RSTCk7CisJcnRjX3dyaXRlbChydGMsIExQQzMyWFhfUlRDX0NUUkwsIHRtcCB8IExQQzMyWFhfUlRDX0NUUkxfQ05UUl9ESVMpOworCXJ0Y193cml0ZWwocnRjLCBMUEMzMlhYX1JUQ19VQ09VTlQsIHNlY3MpOworCXJ0Y193cml0ZWwocnRjLCBMUEMzMlhYX1JUQ19EQ09VTlQsIDB4RkZGRkZGRkYgLSBzZWNzKTsKKwlydGNfd3JpdGVsKHJ0YywgTFBDMzJYWF9SVENfQ1RSTCwgdG1wICY9IH5MUEMzMlhYX1JUQ19DVFJMX0NOVFJfRElTKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBydGNfd2thbHJtICp3a2Fscm0pCit7CisJc3RydWN0IGxwYzMyeHhfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y190aW1lX3RvX3RtKHJ0Y19yZWFkbChydGMsIExQQzMyWFhfUlRDX01BVENIMCksICZ3a2Fscm0tPnRpbWUpOworCXdrYWxybS0+ZW5hYmxlZCA9IHJ0Yy0+YWxhcm1fZW5hYmxlZDsKKwl3a2Fscm0tPnBlbmRpbmcgPSAhIShydGNfcmVhZGwocnRjLCBMUEMzMlhYX1JUQ19JTlRTVEFUKSAmCisJCUxQQzMyWFhfUlRDX0lOVFNUQVRfTUFUQ0gwKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0oJndrYWxybS0+dGltZSk7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcnRjX3drYWxybSAqd2thbHJtKQoreworCXN0cnVjdCBscGMzMnh4X3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBhbGFybXNlY3M7CisJdTMyIHRtcDsKKwlpbnQgcmV0OworCisJcmV0ID0gcnRjX3RtX3RvX3RpbWUoJndrYWxybS0+dGltZSwgJmFsYXJtc2Vjcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGNvbnZlcnQgdGltZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCS8qIERpc2FibGUgYWxhcm0gZHVyaW5nIHVwZGF0ZSAqLworCXRtcCA9IHJ0Y19yZWFkbChydGMsIExQQzMyWFhfUlRDX0NUUkwpOworCXJ0Y193cml0ZWwocnRjLCBMUEMzMlhYX1JUQ19DVFJMLCB0bXAgJiB+TFBDMzJYWF9SVENfQ1RSTF9NQVRDSDApOworCisJcnRjX3dyaXRlbChydGMsIExQQzMyWFhfUlRDX01BVENIMCwgYWxhcm1zZWNzKTsKKworCXJ0Yy0+YWxhcm1fZW5hYmxlZCA9IHdrYWxybS0+ZW5hYmxlZDsKKwlpZiAod2thbHJtLT5lbmFibGVkKSB7CisJCXJ0Y193cml0ZWwocnRjLCBMUEMzMlhYX1JUQ19JTlRTVEFULAorCQkJICAgTFBDMzJYWF9SVENfSU5UU1RBVF9NQVRDSDApOworCQlydGNfd3JpdGVsKHJ0YywgTFBDMzJYWF9SVENfQ1RSTCwgdG1wIHwKKwkJCSAgIExQQzMyWFhfUlRDX0NUUkxfTUFUQ0gwKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB0bXA7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCXRtcCA9IHJ0Y19yZWFkbChydGMsIExQQzMyWFhfUlRDX0NUUkwpOworCisJaWYgKGVuYWJsZWQpIHsKKwkJcnRjLT5hbGFybV9lbmFibGVkID0gMTsKKwkJdG1wIHw9IExQQzMyWFhfUlRDX0NUUkxfTUFUQ0gwOworCX0gZWxzZSB7CisJCXJ0Yy0+YWxhcm1fZW5hYmxlZCA9IDA7CisJCXRtcCAmPSB+TFBDMzJYWF9SVENfQ1RSTF9NQVRDSDA7CisJfQorCisJcnRjX3dyaXRlbChydGMsIExQQzMyWFhfUlRDX0NUUkwsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBscGMzMnh4X3J0Y19hbGFybV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBscGMzMnh4X3J0YyAqcnRjID0gZGV2OworCisJc3Bpbl9sb2NrKCZydGMtPmxvY2spOworCisJLyogRGlzYWJsZSBhbGFybSBpbnRlcnJ1cHQgKi8KKwlydGNfd3JpdGVsKHJ0YywgTFBDMzJYWF9SVENfQ1RSTCwKKwkJcnRjX3JlYWRsKHJ0YywgTFBDMzJYWF9SVENfQ1RSTCkgJgorCQkJICB+TFBDMzJYWF9SVENfQ1RSTF9NQVRDSDApOworCXJ0Yy0+YWxhcm1fZW5hYmxlZCA9IDA7CisKKwkvKgorCSAqIFdyaXRlIGEgbGFyZ2UgdmFsdWUgdG8gdGhlIG1hdGNoIHZhbHVlIHNvIHRoZSBSVEMgd29uJ3QKKwkgKiBrZWVwIGZpcmluZyB0aGUgbWF0Y2ggc3RhdHVzCisJICovCisJcnRjX3dyaXRlbChydGMsIExQQzMyWFhfUlRDX01BVENIMCwgMHhGRkZGRkZGRik7CisJcnRjX3dyaXRlbChydGMsIExQQzMyWFhfUlRDX0lOVFNUQVQsIExQQzMyWFhfUlRDX0lOVFNUQVRfTUFUQ0gwKTsKKworCXNwaW5fdW5sb2NrKCZydGMtPmxvY2spOworCisJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX0FGKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGxwYzMyeHhfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCQk9IGxwYzMyeHhfcnRjX3JlYWRfdGltZSwKKwkuc2V0X21tc3MJCT0gbHBjMzJ4eF9ydGNfc2V0X21tc3MsCisJLnJlYWRfYWxhcm0JCT0gbHBjMzJ4eF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCQk9IGxwYzMyeHhfcnRjX3NldF9hbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZQk9IGxwYzMyeHhfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBscGMzMnh4X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBscGMzMnh4X3J0YyAqcnRjOworCXJlc291cmNlX3NpemVfdCBzaXplOworCWludCBydGNpcnE7CisJdTMyIHRtcDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IG1lbW9yeSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJ0Y2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHJ0Y2lycSA8IDAgfHwgcnRjaXJxID49IE5SX0lSUVMpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkNhbid0IGdldCBpbnRlcnJ1cHQgcmVzb3VyY2VcbiIpOworCQlydGNpcnEgPSAtMTsKKwl9CisKKwlydGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXJ0YykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJ0Yy0+aXJxID0gcnRjaXJxOworCisJc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgc2l6ZSwKKwkJCQkgICAgIHBkZXYtPm5hbWUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJUQyByZWdpc3RlcnMgYXJlIG5vdCBmcmVlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlydGMtPnJ0Y19iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHNpemUpOworCWlmICghcnRjLT5ydGNfYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBtYXAgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJnJ0Yy0+bG9jayk7CisKKwkvKgorCSAqIFRoZSBSVEMgaXMgb24gYSBzZXBhcmF0ZSBwb3dlciBkb21haW4gYW5kIGNhbiBrZWVwIGl0J3Mgc3RhdGUKKwkgKiBhY3Jvc3MgYSBjaGlwIHBvd2VyIGN5Y2xlLiBJZiB0aGUgUlRDIGhhcyBuZXZlciBiZWVuIHByZXZpb3VzbHkKKwkgKiBzZXR1cCwgdGhlbiBzZXQgaXQgdXAgbm93IGZvciB0aGUgZmlyc3QgdGltZS4KKwkgKi8KKwl0bXAgPSBydGNfcmVhZGwocnRjLCBMUEMzMlhYX1JUQ19DVFJMKTsKKwlpZiAocnRjX3JlYWRsKHJ0YywgTFBDMzJYWF9SVENfS0VZKSAhPSBMUEMzMlhYX1JUQ19LRVlfT05TV19MT0FEVkFMKSB7CisJCXRtcCAmPSB+KExQQzMyWFhfUlRDX0NUUkxfU1dfUkVTRVQgfAorCQkJTFBDMzJYWF9SVENfQ1RSTF9DTlRSX0RJUyB8CisJCQlMUEMzMlhYX1JUQ19DVFJMX01BVENIMCB8CisJCQlMUEMzMlhYX1JUQ19DVFJMX01BVENIMSB8CisJCQlMUEMzMlhYX1JUQ19DVFJMX09OU1dfTUFUQ0gwIHwKKwkJCUxQQzMyWFhfUlRDX0NUUkxfT05TV19NQVRDSDEgfAorCQkJTFBDMzJYWF9SVENfQ1RSTF9PTlNXX0ZPUkNFX0hJKTsKKwkJcnRjX3dyaXRlbChydGMsIExQQzMyWFhfUlRDX0NUUkwsIHRtcCk7CisKKwkJLyogQ2xlYXIgbGF0Y2hlZCBpbnRlcnJ1cHQgc3RhdGVzICovCisJCXJ0Y193cml0ZWwocnRjLCBMUEMzMlhYX1JUQ19NQVRDSDAsIDB4RkZGRkZGRkYpOworCQlydGNfd3JpdGVsKHJ0YywgTFBDMzJYWF9SVENfSU5UU1RBVCwKKwkJCSAgIExQQzMyWFhfUlRDX0lOVFNUQVRfTUFUQ0gwIHwKKwkJCSAgIExQQzMyWFhfUlRDX0lOVFNUQVRfTUFUQ0gxIHwKKwkJCSAgIExQQzMyWFhfUlRDX0lOVFNUQVRfT05TVyk7CisKKwkJLyogV3JpdGUga2V5IHZhbHVlIHRvIFJUQyBzbyBpdCB3b24ndCByZWxvYWQgb24gcmVzZXQgKi8KKwkJcnRjX3dyaXRlbChydGMsIExQQzMyWFhfUlRDX0tFWSwKKwkJCSAgIExQQzMyWFhfUlRDX0tFWV9PTlNXX0xPQURWQUwpOworCX0gZWxzZSB7CisJCXJ0Y193cml0ZWwocnRjLCBMUEMzMlhYX1JUQ19DVFJMLAorCQkJICAgdG1wICYgfkxQQzMyWFhfUlRDX0NUUkxfTUFUQ0gwKTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKFJUQ19OQU1FLCAmcGRldi0+ZGV2LCAmbHBjMzJ4eF9ydGNfb3BzLAorCQlUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMtPnJ0YykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IFJUQ1xuIik7CisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCQlyZXR1cm4gUFRSX0VSUihydGMtPnJ0Yyk7CisJfQorCisJLyoKKwkgKiBJUlEgaXMgZW5hYmxlZCBhZnRlciBkZXZpY2UgcmVnaXN0cmF0aW9uIGluIGNhc2UgYWxhcm0gSVJRCisJICogaXMgcGVuZGluZyB1cG9uIHN1c3BlbmQgZXhpdC4KKwkgKi8KKwlpZiAocnRjLT5pcnEgPj0gMCkgeworCQlpZiAoZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBydGMtPmlycSwKKwkJCQkgICAgIGxwYzMyeHhfcnRjX2FsYXJtX2ludGVycnVwdCwKKwkJCQkgICAgIDAsIHBkZXYtPm5hbWUsIHJ0YykgPCAwKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiQ2FuJ3QgcmVxdWVzdCBpbnRlcnJ1cHQuXG4iKTsKKwkJCXJ0Yy0+aXJxID0gLTE7CisJCX0gZWxzZSB7CisJCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbHBjMzJ4eF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGxwYzMyeHhfcnRjICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChydGMtPmlycSA+PSAwKQorCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjLT5ydGMpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbHBjMzJ4eF9ydGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBscGMzMnh4X3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocnRjLT5pcnEgPj0gMCkgeworCQlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCQllbmFibGVfaXJxX3dha2UocnRjLT5pcnEpOworCQllbHNlCisJCQlkaXNhYmxlX2lycV93YWtlKHJ0Yy0+aXJxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X3J0Y19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbHBjMzJ4eF9ydGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHJ0Yy0+aXJxID49IDAgJiYgZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCWRpc2FibGVfaXJxX3dha2UocnRjLT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBhbGFybSAqLworc3RhdGljIGludCBscGMzMnh4X3J0Y19mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbHBjMzJ4eF9ydGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJ0Y193cml0ZWwocnRjLCBMUEMzMlhYX1JUQ19DVFJMLAorCQlydGNfcmVhZGwocnRjLCBMUEMzMlhYX1JUQ19DVFJMKSAmCisJCQkgIH5MUEMzMlhYX1JUQ19DVFJMX01BVENIMCk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X3J0Y190aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGxwYzMyeHhfcnRjICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChydGMtPmFsYXJtX2VuYWJsZWQpIHsKKwkJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCQlydGNfd3JpdGVsKHJ0YywgTFBDMzJYWF9SVENfQ1RSTCwKKwkJCSAgIHJ0Y19yZWFkbChydGMsIExQQzMyWFhfUlRDX0NUUkwpIHwKKwkJCSAgIExQQzMyWFhfUlRDX0NUUkxfTUFUQ0gwKTsKKworCQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBscGMzMnh4X3J0Y19wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBscGMzMnh4X3J0Y19zdXNwZW5kLAorCS5yZXN1bWUgPSBscGMzMnh4X3J0Y19yZXN1bWUsCisJLmZyZWV6ZSA9IGxwYzMyeHhfcnRjX2ZyZWV6ZSwKKwkudGhhdyA9IGxwYzMyeHhfcnRjX3RoYXcsCisJLnJlc3RvcmUgPSBscGMzMnh4X3J0Y19yZXN1bWUKK307CisKKyNkZWZpbmUgTFBDMzJYWF9SVENfUE1fT1BTICgmbHBjMzJ4eF9ydGNfcG1fb3BzKQorI2Vsc2UKKyNkZWZpbmUgTFBDMzJYWF9SVENfUE1fT1BTIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBscGMzMnh4X3J0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGxwYzMyeHhfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobHBjMzJ4eF9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9IFJUQ19OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gTFBDMzJYWF9SVENfUE1fT1BTCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobHBjMzJ4eF9ydGNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiS2V2aW4gV2VsbHMgPHdlbGxzazQwQGdtYWlsLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgZHJpdmVyIGZvciB0aGUgTFBDMzJ4eCBTb0MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLWxwYzMyeHgiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1sczF4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbHMxeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTgxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbHMxeC5jCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFpoYW8gWmhhbmcgPHpoemhsNTU1QGdtYWlsLmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gZHJpdmVyL3J0Yy9ydGMtYXUxeHh4LmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtbG9vbmdzb24xL2xvb25nc29uMS5oPgorCisjZGVmaW5lIExTMVhfUlRDX1JFR19PRkZTRVQJKExTMVhfUlRDX0JBU0UgKyAweDIwKQorI2RlZmluZSBMUzFYX1JUQ19SRUdTKHgpIFwKKwkJKCh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoTFMxWF9SVENfUkVHX09GRlNFVCArICh4KSkpCisKKy8qUlRDIHByb2dyYW1tYWJsZSBjb3VudGVycyAwIGFuZCAxKi8KKyNkZWZpbmUgU1lTX0NPVU5URVJfQ05UUkwJCShMUzFYX1JUQ19SRUdTKDB4MjApKQorI2RlZmluZSBTWVNfQ05UUkxfRVJTCQkJKDEgPDwgMjMpCisjZGVmaW5lIFNZU19DTlRSTF9SVFMJCQkoMSA8PCAyMCkKKyNkZWZpbmUgU1lTX0NOVFJMX1JNMgkJCSgxIDw8IDE5KQorI2RlZmluZSBTWVNfQ05UUkxfUk0xCQkJKDEgPDwgMTgpCisjZGVmaW5lIFNZU19DTlRSTF9STTAJCQkoMSA8PCAxNykKKyNkZWZpbmUgU1lTX0NOVFJMX1JTCQkJKDEgPDwgMTYpCisjZGVmaW5lIFNZU19DTlRSTF9CUAkJCSgxIDw8IDE0KQorI2RlZmluZSBTWVNfQ05UUkxfUkVOCQkJKDEgPDwgMTMpCisjZGVmaW5lIFNZU19DTlRSTF9CUlQJCQkoMSA8PCAxMikKKyNkZWZpbmUgU1lTX0NOVFJMX1RFTgkJCSgxIDw8IDExKQorI2RlZmluZSBTWVNfQ05UUkxfQlRUCQkJKDEgPDwgMTApCisjZGVmaW5lIFNZU19DTlRSTF9FMAkJCSgxIDw8IDgpCisjZGVmaW5lIFNZU19DTlRSTF9FVFMJCQkoMSA8PCA3KQorI2RlZmluZSBTWVNfQ05UUkxfMzJTCQkJKDEgPDwgNSkKKyNkZWZpbmUgU1lTX0NOVFJMX1RUUwkJCSgxIDw8IDQpCisjZGVmaW5lIFNZU19DTlRSTF9UTTIJCQkoMSA8PCAzKQorI2RlZmluZSBTWVNfQ05UUkxfVE0xCQkJKDEgPDwgMikKKyNkZWZpbmUgU1lTX0NOVFJMX1RNMAkJCSgxIDw8IDEpCisjZGVmaW5lIFNZU19DTlRSTF9UUwkJCSgxIDw8IDApCisKKy8qIFByb2dyYW1tYWJsZSBDb3VudGVyIDAgUmVnaXN0ZXJzICovCisjZGVmaW5lIFNZU19UT1lUUklNCQkoTFMxWF9SVENfUkVHUygwKSkKKyNkZWZpbmUgU1lTX1RPWVdSSVRFMAkJKExTMVhfUlRDX1JFR1MoNCkpCisjZGVmaW5lIFNZU19UT1lXUklURTEJCShMUzFYX1JUQ19SRUdTKDgpKQorI2RlZmluZSBTWVNfVE9ZUkVBRDAJCShMUzFYX1JUQ19SRUdTKDB4QykpCisjZGVmaW5lIFNZU19UT1lSRUFEMQkJKExTMVhfUlRDX1JFR1MoMHgxMCkpCisjZGVmaW5lIFNZU19UT1lNQVRDSDAJCShMUzFYX1JUQ19SRUdTKDB4MTQpKQorI2RlZmluZSBTWVNfVE9ZTUFUQ0gxCQkoTFMxWF9SVENfUkVHUygweDE4KSkKKyNkZWZpbmUgU1lTX1RPWU1BVENIMgkJKExTMVhfUlRDX1JFR1MoMHgxQykpCisKKy8qIFByb2dyYW1tYWJsZSBDb3VudGVyIDEgUmVnaXN0ZXJzICovCisjZGVmaW5lIFNZU19SVENUUklNCQkoTFMxWF9SVENfUkVHUygweDQwKSkKKyNkZWZpbmUgU1lTX1JUQ1dSSVRFMAkJKExTMVhfUlRDX1JFR1MoMHg0NCkpCisjZGVmaW5lIFNZU19SVENSRUFEMAkJKExTMVhfUlRDX1JFR1MoMHg0OCkpCisjZGVmaW5lIFNZU19SVENNQVRDSDAJCShMUzFYX1JUQ19SRUdTKDB4NEMpKQorI2RlZmluZSBTWVNfUlRDTUFUQ0gxCQkoTFMxWF9SVENfUkVHUygweDUwKSkKKyNkZWZpbmUgU1lTX1JUQ01BVENIMgkJKExTMVhfUlRDX1JFR1MoMHg1NCkpCisKKyNkZWZpbmUgTFMxWF9TRUNfT0ZGU0VUCQkoNCkKKyNkZWZpbmUgTFMxWF9NSU5fT0ZGU0VUCQkoMTApCisjZGVmaW5lIExTMVhfSE9VUl9PRkZTRVQJKDE2KQorI2RlZmluZSBMUzFYX0RBWV9PRkZTRVQJCSgyMSkKKyNkZWZpbmUgTFMxWF9NT05USF9PRkZTRVQJKDI2KQorCisKKyNkZWZpbmUgTFMxWF9TRUNfTUFTSwkJKDB4M2YpCisjZGVmaW5lIExTMVhfTUlOX01BU0sJCSgweDNmKQorI2RlZmluZSBMUzFYX0hPVVJfTUFTSwkJKDB4MWYpCisjZGVmaW5lIExTMVhfREFZX01BU0sJCSgweDFmKQorI2RlZmluZSBMUzFYX01PTlRIX01BU0sJCSgweDNmKQorI2RlZmluZSBMUzFYX1lFQVJfTUFTSwkJKDB4ZmZmZmZmZmYpCisKKyNkZWZpbmUgbHMxeF9nZXRfc2VjKHQpCQkoKCh0KSA+PiBMUzFYX1NFQ19PRkZTRVQpICYgTFMxWF9TRUNfTUFTSykKKyNkZWZpbmUgbHMxeF9nZXRfbWluKHQpCQkoKCh0KSA+PiBMUzFYX01JTl9PRkZTRVQpICYgTFMxWF9NSU5fTUFTSykKKyNkZWZpbmUgbHMxeF9nZXRfaG91cih0KQkoKCh0KSA+PiBMUzFYX0hPVVJfT0ZGU0VUKSAmIExTMVhfSE9VUl9NQVNLKQorI2RlZmluZSBsczF4X2dldF9kYXkodCkJCSgoKHQpID4+IExTMVhfREFZX09GRlNFVCkgJiBMUzFYX0RBWV9NQVNLKQorI2RlZmluZSBsczF4X2dldF9tb250aCh0KQkoKCh0KSA+PiBMUzFYX01PTlRIX09GRlNFVCkgJiBMUzFYX01PTlRIX01BU0spCisKKyNkZWZpbmUgUlRDX0NOVFJfT0sgKFNZU19DTlRSTF9FMCB8IFNZU19DTlRSTF8zMlMpCisKK3N0YXRpYyBpbnQgbHMxeF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpydG0pCit7CisJdW5zaWduZWQgbG9uZyB2LCB0OworCisJdiA9IHJlYWRsKFNZU19UT1lSRUFEMCk7CisJdCA9IHJlYWRsKFNZU19UT1lSRUFEMSk7CisKKwltZW1zZXQocnRtLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CisJdCAgPSBta3RpbWUoKHQgJiBMUzFYX1lFQVJfTUFTSyksIGxzMXhfZ2V0X21vbnRoKHYpLAorCQkJbHMxeF9nZXRfZGF5KHYpLCBsczF4X2dldF9ob3VyKHYpLAorCQkJbHMxeF9nZXRfbWluKHYpLCBsczF4X2dldF9zZWModikpOworCXJ0Y190aW1lX3RvX3RtKHQsIHJ0bSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHJ0bSk7Cit9CisKK3N0YXRpYyBpbnQgbHMxeF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgIHJ0Y190aW1lICpydG0pCit7CisJdW5zaWduZWQgbG9uZyB2LCB0LCBjOworCWludCByZXQgPSAtRVRJTUVET1VUOworCisJdiA9ICgocnRtLT50bV9tb24gKyAxKSAgPDwgTFMxWF9NT05USF9PRkZTRVQpCisJCXwgKHJ0bS0+dG1fbWRheSA8PCBMUzFYX0RBWV9PRkZTRVQpCisJCXwgKHJ0bS0+dG1faG91ciA8PCBMUzFYX0hPVVJfT0ZGU0VUKQorCQl8IChydG0tPnRtX21pbiAgPDwgTFMxWF9NSU5fT0ZGU0VUKQorCQl8IChydG0tPnRtX3NlYyAgPDwgTFMxWF9TRUNfT0ZGU0VUKTsKKworCXdyaXRlbCh2LCBTWVNfVE9ZV1JJVEUwKTsKKwljID0gMHgxMDAwMDsKKwkvKiBhZGQgdGltZW91dCBjaGVjayBjb3VudGVyLCBmb3IgbW9yZSBzYWZlICovCisJd2hpbGUgKChyZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfVFMpICYmIC0tYykKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDMwMDApOworCisJaWYgKCFjKSB7CisJCWRldl9lcnIoZGV2LCAic2V0IHRpbWUgdGltZW91dCFcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwl0ID0gcnRtLT50bV95ZWFyICsgMTkwMDsKKwl3cml0ZWwodCwgU1lTX1RPWVdSSVRFMSk7CisJYyA9IDB4MTAwMDA7CisJd2hpbGUgKChyZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfVFMpICYmIC0tYykKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDMwMDApOworCisJaWYgKCFjKSB7CisJCWRldl9lcnIoZGV2LCAic2V0IHRpbWUgdGltZW91dCFcbiIpOworCQlnb3RvIGVycjsKKwl9CisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzICBsczF4X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGxzMXhfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBsczF4X3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxzMXhfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y2RldjsKKwl1bnNpZ25lZCBsb25nIHY7CisJaW50IHJldDsKKworCXYgPSByZWFkbChTWVNfQ09VTlRFUl9DTlRSTCk7CisJaWYgKCEodiAmIFJUQ19DTlRSX09LKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJydGMgY291bnRlcnMgbm90IHdvcmtpbmdcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gLUVUSU1FRE9VVDsKKwkvKiBzZXQgdG8gMSBIWiBpZiBuZWVkZWQgKi8KKwlpZiAocmVhZGwoU1lTX1RPWVRSSU0pICE9IDMyNzY3KSB7CisJCXYgPSAweDEwMDAwMDsKKwkJd2hpbGUgKChyZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfVFRTKSAmJiAtLXYpCisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMzAwMCk7CisKKwkJaWYgKCF2KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0aW1lIG91dFxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCQl3cml0ZWwoMzI3NjcsIFNZU19UT1lUUklNKTsKKwl9CisJLyogdGhpcyBsb29wIGNvdW5kbid0IGJlIGVuZGxlc3MgKi8KKwl3aGlsZSAocmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX1RUUykKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDMwMDApOworCisJcnRjZGV2ID0gcnRjX2RldmljZV9yZWdpc3RlcigibHMxeC1ydGMiLCAmcGRldi0+ZGV2LAorCQkJCQkmbHMxeF9ydGNfb3BzICwgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0Y2Rldik7CisJCWdvdG8gZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Y2Rldik7CisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbHMxeF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Y2Rldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgIGxzMXhfcnRjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibHMxeC1ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobHMxeF9ydGNfcmVtb3ZlKSwKKwkucHJvYmUJCT0gbHMxeF9ydGNfcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGxzMXhfcnRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoInpoYW8gemhhbmcgPHpoemhsNTU1QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tNDF0ODAuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tNDF0ODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTBmODRhCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW00MXQ4MC5jCkBAIC0wLDAgKzEsOTA4IEBACisvKgorICogSTJDIGNsaWVudC9kcml2ZXIgZm9yIHRoZSBTVCBNNDFUODAgZmFtaWx5IG9mIGkyYyBydGMgY2hpcHMuCisgKgorICogQXV0aG9yOiBBbGV4YW5kZXIgQmlnZ2EgPGFiQG15Y2FibGUuZGU+CisgKgorICogQmFzZWQgb24gbTQxdDAwLmMgYnkgTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+CisgKgorICogMjAwNiAoYykgbXljYWJsZSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgTTQxVDgwX1JFR19TU0VDCTAKKyNkZWZpbmUgTTQxVDgwX1JFR19TRUMJMQorI2RlZmluZSBNNDFUODBfUkVHX01JTgkyCisjZGVmaW5lIE00MVQ4MF9SRUdfSE9VUgkzCisjZGVmaW5lIE00MVQ4MF9SRUdfV0RBWQk0CisjZGVmaW5lIE00MVQ4MF9SRUdfREFZCTUKKyNkZWZpbmUgTTQxVDgwX1JFR19NT04JNgorI2RlZmluZSBNNDFUODBfUkVHX1lFQVIJNworI2RlZmluZSBNNDFUODBfUkVHX0FMQVJNX01PTgkweGEKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9EQVkJMHhiCisjZGVmaW5lIE00MVQ4MF9SRUdfQUxBUk1fSE9VUgkweGMKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9NSU4JMHhkCisjZGVmaW5lIE00MVQ4MF9SRUdfQUxBUk1fU0VDCTB4ZQorI2RlZmluZSBNNDFUODBfUkVHX0ZMQUdTCTB4ZgorI2RlZmluZSBNNDFUODBfUkVHX1NRVwkweDEzCisKKyNkZWZpbmUgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFCShNNDFUODBfUkVHX1lFQVIgKyAxKQorI2RlZmluZSBNNDFUODBfQUxBUk1fUkVHX1NJWkUJXAorCShNNDFUODBfUkVHX0FMQVJNX1NFQyArIDEgLSBNNDFUODBfUkVHX0FMQVJNX01PTikKKworI2RlZmluZSBNNDFUODBfU0VDX1NUCQkoMSA8PCA3KQkvKiBTVDogU3RvcCBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMTU9OX0FGRQkoMSA8PCA3KQkvKiBBRkU6IEFGIEVuYWJsZSBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMTU9OX1NRV0UJKDEgPDwgNikJLyogU1FXRTogU1FXIEVuYWJsZSBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMSE9VUl9IVAkoMSA8PCA2KQkvKiBIVDogSGFsdCBVcGRhdGUgQml0ICovCisjZGVmaW5lIE00MVQ4MF9GTEFHU19BRgkJKDEgPDwgNikJLyogQUY6IEFsYXJtIEZsYWcgQml0ICovCisjZGVmaW5lIE00MVQ4MF9GTEFHU19CQVRUX0xPVwkoMSA8PCA0KQkvKiBCTDogQmF0dGVyeSBMb3cgQml0ICovCisjZGVmaW5lIE00MVQ4MF9XQVRDSERPR19SQjIJKDEgPDwgNykJLyogUkI6IFdhdGNoZG9nIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgTTQxVDgwX1dBVENIRE9HX1JCMQkoMSA8PCAxKQkvKiBSQjogV2F0Y2hkb2cgcmVzb2x1dGlvbiAqLworI2RlZmluZSBNNDFUODBfV0FUQ0hET0dfUkIwCSgxIDw8IDApCS8qIFJCOiBXYXRjaGRvZyByZXNvbHV0aW9uICovCisKKyNkZWZpbmUgTTQxVDgwX0ZFQVRVUkVfSFQJKDEgPDwgMCkJLyogSGFsdCBmZWF0dXJlICovCisjZGVmaW5lIE00MVQ4MF9GRUFUVVJFX0JMCSgxIDw8IDEpCS8qIEJhdHRlcnkgbG93IGluZGljYXRvciAqLworI2RlZmluZSBNNDFUODBfRkVBVFVSRV9TUQkoMSA8PCAyKQkvKiBTcXVhcmV3YXZlIGZlYXR1cmUgKi8KKyNkZWZpbmUgTTQxVDgwX0ZFQVRVUkVfV0QJKDEgPDwgMykJLyogRXh0cmEgd2F0Y2hkb2cgcmVzb2x1dGlvbiAqLworI2RlZmluZSBNNDFUODBfRkVBVFVSRV9TUV9BTFQJKDEgPDwgNCkJLyogUlN4IGJpdHMgYXJlIGluIHJlZyA0ICovCisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMDUiCisKK3N0YXRpYyBERUZJTkVfTVVURVgobTQxdDgwX3J0Y19tdXRleCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbTQxdDgwX2lkW10gPSB7CisJeyAibTQxdDYyIiwgTTQxVDgwX0ZFQVRVUkVfU1EgfCBNNDFUODBfRkVBVFVSRV9TUV9BTFQgfSwKKwl7ICJtNDF0NjUiLCBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX1dEIH0sCisJeyAibTQxdDgwIiwgTTQxVDgwX0ZFQVRVUkVfU1EgfSwKKwl7ICJtNDF0ODEiLCBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX1NRfSwKKwl7ICJtNDF0ODFzIiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB8IE00MVQ4MF9GRUFUVVJFX1NRIH0sCisJeyAibTQxdDgyIiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB8IE00MVQ4MF9GRUFUVVJFX1NRIH0sCisJeyAibTQxdDgzIiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB8IE00MVQ4MF9GRUFUVVJFX1NRIH0sCisJeyAibTQxc3Q4NCIsIE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwgfCBNNDFUODBfRkVBVFVSRV9TUSB9LAorCXsgIm00MXN0ODUiLCBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMIHwgTTQxVDgwX0ZFQVRVUkVfU1EgfSwKKwl7ICJtNDFzdDg3IiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB8IE00MVQ4MF9GRUFUVVJFX1NRIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG00MXQ4MF9pZCk7CisKK3N0cnVjdCBtNDF0ODBfZGF0YSB7CisJdTggZmVhdHVyZXM7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKK307CisKK3N0YXRpYyBpbnQgbTQxdDgwX2dldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICAgIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdTggYnVmW000MVQ4MF9EQVRFVElNRV9SRUdfU0laRV0sIGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfU0VDIH07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBkdF9hZGRyLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRSAtIE00MVQ4MF9SRUdfU0VDLAorCQkJLmJ1Zgk9IGJ1ZiArIE00MVQ4MF9SRUdfU0VDLAorCQl9LAorCX07CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXRtLT50bV9zZWMgPSBiY2QyYmluKGJ1ZltNNDFUODBfUkVHX1NFQ10gJiAweDdmKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbihidWZbTTQxVDgwX1JFR19NSU5dICYgMHg3Zik7CisJdG0tPnRtX2hvdXIgPSBiY2QyYmluKGJ1ZltNNDFUODBfUkVHX0hPVVJdICYgMHgzZik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGJ1ZltNNDFUODBfUkVHX0RBWV0gJiAweDNmKTsKKwl0bS0+dG1fd2RheSA9IGJ1ZltNNDFUODBfUkVHX1dEQVldICYgMHgwNzsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihidWZbTTQxVDgwX1JFR19NT05dICYgMHgxZikgLSAxOworCisJLyogYXNzdW1lIDIwWVkgbm90IDE5WVksIGFuZCBpZ25vcmUgdGhlIENlbnR1cnkgQml0ICovCisJdG0tPnRtX3llYXIgPSBiY2QyYmluKGJ1ZltNNDFUODBfUkVHX1lFQVJdKSArIDEwMDsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworLyogU2V0cyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdGltZSB0byB0aGUgcmVhbCB0aW1lIGNsb2NrLiAqLworc3RhdGljIGludCBtNDF0ODBfc2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdTggd2J1ZlsxICsgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFXTsKKwl1OCAqYnVmID0gJndidWZbMV07CisJdTggZHRfYWRkclsxXSA9IHsgTTQxVDgwX1JFR19TRUMgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzX2luW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGR0X2FkZHIsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFIC0gTTQxVDgwX1JFR19TRUMsCisJCQkuYnVmCT0gYnVmICsgTTQxVDgwX1JFR19TRUMsCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxICsgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFLAorCQkJLmJ1Zgk9IHdidWYsCisJCSB9LAorCX07CisKKwkvKiBSZWFkIGN1cnJlbnQgcmVnIHZhbHVlcyBpbnRvIGJ1ZlsxLi43XSAqLworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzX2luLCAyKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJd2J1ZlswXSA9IDA7IC8qIG9mZnNldCBpbnRvIHJ0YydzIHJlZ3MgKi8KKwkvKiBNZXJnZSB0aW1lLWRhdGEgYW5kIHJlZ2lzdGVyIGZsYWdzIGludG8gYnVmWzAuLjddICovCisJYnVmW000MVQ4MF9SRUdfU1NFQ10gPSAwOworCWJ1ZltNNDFUODBfUkVHX1NFQ10gPQorCQliaW4yYmNkKHRtLT50bV9zZWMpIHwgKGJ1ZltNNDFUODBfUkVHX1NFQ10gJiB+MHg3Zik7CisJYnVmW000MVQ4MF9SRUdfTUlOXSA9CisJCWJpbjJiY2QodG0tPnRtX21pbikgfCAoYnVmW000MVQ4MF9SRUdfTUlOXSAmIH4weDdmKTsKKwlidWZbTTQxVDgwX1JFR19IT1VSXSA9CisJCWJpbjJiY2QodG0tPnRtX2hvdXIpIHwgKGJ1ZltNNDFUODBfUkVHX0hPVVJdICYgfjB4M2YpIDsKKwlidWZbTTQxVDgwX1JFR19XREFZXSA9CisJCSh0bS0+dG1fd2RheSAmIDB4MDcpIHwgKGJ1ZltNNDFUODBfUkVHX1dEQVldICYgfjB4MDcpOworCWJ1ZltNNDFUODBfUkVHX0RBWV0gPQorCQliaW4yYmNkKHRtLT50bV9tZGF5KSB8IChidWZbTTQxVDgwX1JFR19EQVldICYgfjB4M2YpOworCWJ1ZltNNDFUODBfUkVHX01PTl0gPQorCQliaW4yYmNkKHRtLT50bV9tb24gKyAxKSB8IChidWZbTTQxVDgwX1JFR19NT05dICYgfjB4MWYpOworCS8qIGFzc3VtZSAyMFlZIG5vdCAxOVlZICovCisJYnVmW000MVQ4MF9SRUdfWUVBUl0gPSBiaW4yYmNkKHRtLT50bV95ZWFyICUgMTAwKTsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAxKSAhPSAxKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DX01PRFVMRSkKK3N0YXRpYyBpbnQgbTQxdDgwX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbTQxdDgwX2RhdGEgKmNsaWVudGRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCByZWc7CisKKwlpZiAoY2xpZW50ZGF0YS0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9CTCkgeworCQlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0ZMQUdTKTsKKwkJc2VxX3ByaW50ZihzZXEsICJiYXR0ZXJ5XHRcdDogJXNcbiIsCisJCQkgICAocmVnICYgTTQxVDgwX0ZMQUdTX0JBVFRfTE9XKSA/ICJleGhhdXN0ZWQiIDogIm9rIik7CisJfQorCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgbTQxdDgwX3J0Y19wcm9jIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gbTQxdDgwX2dldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludCBtNDF0ODBfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gbTQxdDgwX3NldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludCBtNDF0ODBfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCByYzsKKworCXJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04pOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJaWYgKGVuYWJsZWQpCisJCXJjIHw9IE00MVQ4MF9BTE1PTl9BRkU7CisJZWxzZQorCQlyYyAmPSB+TTQxVDgwX0FMTU9OX0FGRTsKKworCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sIHJjKSA8IDApCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbTQxdDgwX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXU4IHdidWZbMSArIE00MVQ4MF9BTEFSTV9SRUdfU0laRV07CisJdTggKmJ1ZiA9ICZ3YnVmWzFdOworCXU4ICpyZWcgPSBidWYgLSBNNDFUODBfUkVHX0FMQVJNX01PTjsKKwl1OCBkdF9hZGRyWzFdID0geyBNNDFUODBfUkVHX0FMQVJNX01PTiB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NfaW5bXSA9IHsKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gZHRfYWRkciwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSBNNDFUODBfQUxBUk1fUkVHX1NJWkUsCisJCQkuYnVmCT0gYnVmLAorCQl9LAorCX07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSArIE00MVQ4MF9BTEFSTV9SRUdfU0laRSwKKwkJCS5idWYJPSB3YnVmLAorCQkgfSwKKwl9OworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3NfaW4sIDIpIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSAmPSB+KDB4MWYgfCBNNDFUODBfQUxNT05fQUZFKTsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldID0gMDsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9IT1VSXSAmPSB+KDB4M2YgfCAweDgwKTsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9NSU5dID0gMDsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9TRUNdID0gMDsKKworCXdidWZbMF0gPSBNNDFUODBfUkVHX0FMQVJNX01PTjsgLyogb2Zmc2V0IGludG8gcnRjJ3MgcmVncyAqLworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX1NFQ10gfD0gdC0+dGltZS50bV9zZWMgPj0gMCA/CisJCWJpbjJiY2QodC0+dGltZS50bV9zZWMpIDogMHg4MDsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9NSU5dIHw9IHQtPnRpbWUudG1fbWluID49IDAgPworCQliaW4yYmNkKHQtPnRpbWUudG1fbWluKSA6IDB4ODA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fSE9VUl0gfD0gdC0+dGltZS50bV9ob3VyID49IDAgPworCQliaW4yYmNkKHQtPnRpbWUudG1faG91cikgOiAweDgwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gfD0gdC0+dGltZS50bV9tZGF5ID49IDAgPworCQliaW4yYmNkKHQtPnRpbWUudG1fbWRheSkgOiAweDgwOworCWlmICh0LT50aW1lLnRtX21vbiA+PSAwKQorCQlyZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dIHw9IGJpbjJiY2QodC0+dGltZS50bV9tb24gKyAxKTsKKwllbHNlCisJCXJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gfD0gMHg0MDsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAxKSAhPSAxKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAodC0+ZW5hYmxlZCkgeworCQlyZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dIHw9IE00MVQ4MF9BTE1PTl9BRkU7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sCisJCQkJCSAgICAgIHJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0pIDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0ZSBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtNDF0ODBfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXU4IGJ1ZltNNDFUODBfQUxBUk1fUkVHX1NJWkUgKyAxXTsgLyogYWxsIGFsYXJtIHJlZ3MgYW5kIGZsYWdzICovCisJdTggZHRfYWRkclsxXSA9IHsgTTQxVDgwX1JFR19BTEFSTV9NT04gfTsKKwl1OCAqcmVnID0gYnVmIC0gTTQxVDgwX1JFR19BTEFSTV9NT047CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBkdF9hZGRyLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IE00MVQ4MF9BTEFSTV9SRUdfU0laRSArIDEsCisJCQkuYnVmCT0gYnVmLAorCQl9LAorCX07CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwl0LT50aW1lLnRtX3NlYyA9IC0xOworCXQtPnRpbWUudG1fbWluID0gLTE7CisJdC0+dGltZS50bV9ob3VyID0gLTE7CisJdC0+dGltZS50bV9tZGF5ID0gLTE7CisJdC0+dGltZS50bV9tb24gPSAtMTsKKwlpZiAoIShyZWdbTTQxVDgwX1JFR19BTEFSTV9TRUNdICYgMHg4MCkpCisJCXQtPnRpbWUudG1fc2VjID0gYmNkMmJpbihyZWdbTTQxVDgwX1JFR19BTEFSTV9TRUNdICYgMHg3Zik7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fTUlOXSAmIDB4ODApKQorCQl0LT50aW1lLnRtX21pbiA9IGJjZDJiaW4ocmVnW000MVQ4MF9SRUdfQUxBUk1fTUlOXSAmIDB4N2YpOworCWlmICghKHJlZ1tNNDFUODBfUkVHX0FMQVJNX0hPVVJdICYgMHg4MCkpCisJCXQtPnRpbWUudG1faG91ciA9IGJjZDJiaW4ocmVnW000MVQ4MF9SRUdfQUxBUk1fSE9VUl0gJiAweDNmKTsKKwlpZiAoIShyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldICYgMHg4MCkpCisJCXQtPnRpbWUudG1fbWRheSA9IGJjZDJiaW4ocmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSAmIDB4M2YpOworCWlmICghKHJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gJiAweDQwKSkKKwkJdC0+dGltZS50bV9tb24gPSBiY2QyYmluKHJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gJiAweDFmKSAtIDE7CisJdC0+dGltZS50bV95ZWFyID0gLTE7CisJdC0+dGltZS50bV93ZGF5ID0gLTE7CisJdC0+dGltZS50bV95ZGF5ID0gLTE7CisJdC0+dGltZS50bV9pc2RzdCA9IC0xOworCXQtPmVuYWJsZWQgPSAhIShyZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dICYgTTQxVDgwX0FMTU9OX0FGRSk7CisJdC0+cGVuZGluZyA9ICEhKHJlZ1tNNDFUODBfUkVHX0ZMQUdTXSAmIE00MVQ4MF9GTEFHU19BRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtNDF0ODBfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gbTQxdDgwX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gbTQxdDgwX3J0Y19zZXRfdGltZSwKKwkvKgorCSAqIFhYWCAtIG00MXQ4MCBhbGFybSBmdW5jdGlvbmFsaXR5IGlzIHJlcG9ydGVkIGJyb2tlbi4KKwkgKiB1bnRpbCBpdCBpcyBmaXhlZCwgZG9uJ3QgcmVnaXN0ZXIgYWxhcm0gZnVuY3Rpb25zLgorCSAqCisJLnJlYWRfYWxhcm0gPSBtNDF0ODBfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IG00MXQ4MF9ydGNfc2V0X2FsYXJtLAorCSovCisJLnByb2MgPSBtNDF0ODBfcnRjX3Byb2MsCisJLyoKKwkgKiBTZWUgYWJvdmUgY29tbWVudCBvbiBicm9rZW4gYWxhcm0KKwkgKgorCS5hbGFybV9pcnFfZW5hYmxlID0gbTQxdDgwX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorCSovCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfU1lTRlMpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTX01PRFVMRSkKK3N0YXRpYyBzc2l6ZV90IG00MXQ4MF9zeXNmc19zaG93X2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJaW50IHZhbDsKKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfRkxBR1MpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlI3hcbiIsIHZhbCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZmxhZ3MsIFNfSVJVR08sIG00MXQ4MF9zeXNmc19zaG93X2ZsYWdzLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgbTQxdDgwX3N5c2ZzX3Nob3dfc3F3ZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtNDF0ODBfZGF0YSAqY2xpZW50ZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwsIHJlZ19zcXc7CisKKwlpZiAoIShjbGllbnRkYXRhLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX1NRKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWdfc3F3ID0gTTQxVDgwX1JFR19TUVc7CisJaWYgKGNsaWVudGRhdGEtPmZlYXR1cmVzICYgTTQxVDgwX0ZFQVRVUkVfU1FfQUxUKQorCQlyZWdfc3F3ID0gTTQxVDgwX1JFR19XREFZOworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZ19zcXcpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwl2YWwgPSAodmFsID4+IDQpICYgMHhmOworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCXZhbCA9IDMyNzY4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWwgPSAzMjc2OCA+PiB2YWw7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorc3RhdGljIHNzaXplX3QgbTQxdDgwX3N5c2ZzX3NldF9zcXdmcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtNDF0ODBfZGF0YSAqY2xpZW50ZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBhbG1vbiwgc3F3LCByZWdfc3F3OworCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJaWYgKCEoY2xpZW50ZGF0YS0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9TUSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhbCkgeworCQlpZiAoIWlzX3Bvd2VyX29mXzIodmFsKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl2YWwgPSBpbG9nMih2YWwpOworCQlpZiAodmFsID09IDE1KQorCQkJdmFsID0gMTsKKwkJZWxzZSBpZiAodmFsIDwgMTQpCisJCQl2YWwgPSAxNSAtIHZhbDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIGRpc2FibGUgU1FXLCBzZXQgU1FXIGZyZXF1ZW5jeSAmIHJlLWVuYWJsZSAqLworCWFsbW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04pOworCWlmIChhbG1vbiA8IDApCisJCXJldHVybiAtRUlPOworCXJlZ19zcXcgPSBNNDFUODBfUkVHX1NRVzsKKwlpZiAoY2xpZW50ZGF0YS0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9TUV9BTFQpCisJCXJlZ19zcXcgPSBNNDFUODBfUkVHX1dEQVk7CisJc3F3ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnX3Nxdyk7CisJaWYgKHNxdyA8IDApCisJCXJldHVybiAtRUlPOworCXNxdyA9IChzcXcgJiAweDBmKSB8ICh2YWwgPDwgNCk7CisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTiwKKwkJCQkgICAgICBhbG1vbiAmIH5NNDFUODBfQUxNT05fU1FXRSkgPCAwIHx8CisJICAgIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdfc3F3LCBzcXcpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHZhbCAmJiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sCisJCQkJCSAgICAgYWxtb24gfCBNNDFUODBfQUxNT05fU1FXRSkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3F3ZnJlcSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG00MXQ4MF9zeXNmc19zaG93X3Nxd2ZyZXEsIG00MXQ4MF9zeXNmc19zZXRfc3F3ZnJlcSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1tdID0geworCSZkZXZfYXR0cl9mbGFncy5hdHRyLAorCSZkZXZfYXR0cl9zcXdmcmVxLmF0dHIsCisJTlVMTCwKK307CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dyb3VwID0geworCS5hdHRycyA9IGF0dHJzLAorfTsKKworc3RhdGljIGludCBtNDF0ODBfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmF0dHJfZ3JvdXApOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgbTQxdDgwX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfTTQxVDgwX1dEVAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFdhdGNoZG9nIERyaXZlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKnNhdmVfY2xpZW50OworCisvKiBEZWZhdWx0IG1hcmdpbiAqLworI2RlZmluZSBXRF9USU1PIDYwCQkvKiAxLi4zMSBzZWNvbmRzICovCisKK3N0YXRpYyBpbnQgd2R0X21hcmdpbiA9IFdEX1RJTU87Cittb2R1bGVfcGFyYW0od2R0X21hcmdpbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X21hcmdpbiwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcyAoZGVmYXVsdCA2MHMpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGludCBib290X2ZsYWc7CisKKy8qKgorICoJd2R0X3Bpbmc6CisgKgorICoJUmVsb2FkIGNvdW50ZXIgb25lIHdpdGggdGhlIHdhdGNoZG9nIHRpbWVvdXQuIFdlIGRvbid0IGJvdGhlciByZWxvYWRpbmcKKyAqCXRoZSBjYXNjYWRlIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdkdF9waW5nKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBpMmNfZGF0YVsyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzMVsxXSA9IHsKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMiwKKwkJCS5idWYJPSBpMmNfZGF0YSwKKwkJfSwKKwl9OworCXN0cnVjdCBtNDF0ODBfZGF0YSAqY2xpZW50ZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShzYXZlX2NsaWVudCk7CisKKwlpMmNfZGF0YVswXSA9IDB4MDk7CQkvKiB3YXRjaGRvZyByZWdpc3RlciAqLworCisJaWYgKHdkdF9tYXJnaW4gPiAzMSkKKwkJaTJjX2RhdGFbMV0gPSAod2R0X21hcmdpbiAmIDB4RkMpIHwgMHg4MzsgLyogcmVzb2x1dGlvbiA9IDRzICovCisJZWxzZQorCQkvKgorCQkgKiBXRFMgPSAxICgweDgwKSwgbXVsaXRwbGllciA9IFdEX1RJTU8sIHJlc29sdXRpb24gPSAxcyAoMHgwMikKKwkJICovCisJCWkyY19kYXRhWzFdID0gd2R0X21hcmdpbjw8MiB8IDB4ODI7CisKKwkvKgorCSAqIE00MVQ2NSBoYXMgdGhyZWUgYml0cyBmb3Igd2F0Y2hkb2cgcmVzb2x1dGlvbi4gIERvbid0IHNldCBiaXQgNywgYXMKKwkgKiB0aGF0IHdvdWxkIGJlIGFuIGludmFsaWQgcmVzb2x1dGlvbi4KKwkgKi8KKwlpZiAoY2xpZW50ZGF0YS0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9XRCkKKwkJaTJjX2RhdGFbMV0gJj0gfk00MVQ4MF9XQVRDSERPR19SQjI7CisKKwlpMmNfdHJhbnNmZXIoc2F2ZV9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MxLCAxKTsKK30KKworLyoqCisgKgl3ZHRfZGlzYWJsZToKKyAqCisgKglkaXNhYmxlcyB3YXRjaGRvZy4KKyAqLworc3RhdGljIHZvaWQgd2R0X2Rpc2FibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGkyY19kYXRhWzJdLCBpMmNfYnVmWzB4MTBdOworCXN0cnVjdCBpMmNfbXNnIG1zZ3MwWzJdID0geworCQl7CisJCQkuYWRkcgk9IHNhdmVfY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGkyY19kYXRhLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IHNhdmVfY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBpMmNfYnVmLAorCQl9LAorCX07CisJc3RydWN0IGkyY19tc2cgbXNnczFbMV0gPSB7CisJCXsKKwkJCS5hZGRyCT0gc2F2ZV9jbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDIsCisJCQkuYnVmCT0gaTJjX2RhdGEsCisJCX0sCisJfTsKKworCWkyY19kYXRhWzBdID0gMHgwOTsKKwlpMmNfdHJhbnNmZXIoc2F2ZV9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MwLCAyKTsKKworCWkyY19kYXRhWzBdID0gMHgwOTsKKwlpMmNfZGF0YVsxXSA9IDB4MDA7CisJaTJjX3RyYW5zZmVyKHNhdmVfY2xpZW50LT5hZGFwdGVyLCBtc2dzMSwgMSk7Cit9CisKKy8qKgorICoJd2R0X3dyaXRlOgorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSB3YXRjaGRvZworICoJQGJ1ZjogYnVmZmVyIHRvIHdyaXRlICh1bnVzZWQgYXMgZGF0YSBkb2VzIG5vdCBtYXR0ZXIgaGVyZQorICoJQGNvdW50OiBjb3VudCBvZiBieXRlcworICoJQHBwb3M6IHBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIHRvIHdyaXRlLiBObyBzZWVrcyBhbGxvd2VkCisgKgorICoJQSB3cml0ZSB0byBhIHdhdGNoZG9nIGRldmljZSBpcyBkZWZpbmVkIGFzIGEga2VlcGFsaXZlIHNpZ25hbC4gQW55CisgKgl3cml0ZSBvZiBkYXRhIHdpbGwgZG8sIGFzIHdlIHdlIGRvbid0IGRlZmluZSBjb250ZW50IG1lYW5pbmcuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJd2R0X3BpbmcoKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB3ZHRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqCXdkdF9pb2N0bDoKKyAqCUBpbm9kZTogaW5vZGUgb2YgdGhlIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqCUBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKKyAqCUBhcmc6IGFyZ3VtZW50IHBvaW50ZXIKKyAqCisgKglUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncworICoJYWNjb3JkaW5nIHRvIHRoZWlyIGF2YWlsYWJsZSBmZWF0dXJlcy4gV2Ugb25seSBhY3R1YWxseSB1c2VmdWxseSBzdXBwb3J0CisgKglxdWVyeWluZyBjYXBhYmlsaXRpZXMgYW5kIGN1cnJlbnQgc3RhdHVzLgorICovCitzdGF0aWMgaW50IHdkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbmV3X21hcmdpbiwgcnY7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX1BPV0VSVU5ERVIgfCBXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCVdESU9GX1NFVFRJTUVPVVQsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIk00MVQ4MCBXVEQiCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKilhcmcsICZpZGVudCwKKwkJCQkgICAgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKGJvb3RfZmxhZywgKGludCBfX3VzZXIgKilhcmcpOworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfcGluZygpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfbWFyZ2luLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogQXJiaXRyYXJ5LCBjYW4ndCBmaW5kIHRoZSBjYXJkJ3MgbGltaXRzICovCisJCWlmIChuZXdfbWFyZ2luIDwgMSB8fCBuZXdfbWFyZ2luID4gMTI0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXdkdF9tYXJnaW4gPSBuZXdfbWFyZ2luOworCQl3ZHRfcGluZygpOworCQkvKiBGYWxsICovCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIod2R0X21hcmdpbiwgKGludCBfX3VzZXIgKilhcmcpOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ2LCAoaW50IF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHJ2ICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCXByX2luZm8oInJ0Yy1tNDF0ODA6IGRpc2FibGUgd2F0Y2hkb2dcbiIpOworCQkJd2R0X2Rpc2FibGUoKTsKKwkJfQorCisJCWlmIChydiAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCXByX2luZm8oInJ0Yy1tNDF0ODA6IGVuYWJsZSB3YXRjaGRvZ1xuIik7CisJCQl3ZHRfcGluZygpOworCQl9CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAtRU5PVFRZOworfQorCitzdGF0aWMgbG9uZyB3ZHRfdW5sb2NrZWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm00MXQ4MF9ydGNfbXV0ZXgpOworCXJldCA9IHdkdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJbXV0ZXhfdW5sb2NrKCZtNDF0ODBfcnRjX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJd2R0X29wZW46CisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoTUlOT1IoaW5vZGUtPmlfcmRldikgPT0gV0FUQ0hET0dfTUlOT1IpIHsKKwkJbXV0ZXhfbG9jaygmbTQxdDgwX3J0Y19tdXRleCk7CisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpIHsKKwkJCW11dGV4X3VubG9jaygmbTQxdDgwX3J0Y19tdXRleCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCS8qCisJCSAqCUFjdGl2YXRlCisJCSAqLworCQl3ZHRfaXNfb3BlbiA9IDE7CisJCW11dGV4X3VubG9jaygmbTQxdDgwX3J0Y19tdXRleCk7CisJCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qKgorICoJd2R0X2Nsb3NlOgorICoJQGlub2RlOiBpbm9kZSB0byBib2FyZAorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGJvYXJkCisgKgorICovCitzdGF0aWMgaW50IHdkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChNSU5PUihpbm9kZS0+aV9yZGV2KSA9PSBXQVRDSERPR19NSU5PUikKKwkJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJbm90aWZ5X3N5czoKKyAqCUB0aGlzOiBvdXIgbm90aWZpZXIgYmxvY2sKKyAqCUBjb2RlOiB0aGUgZXZlbnQgYmVpbmcgcmVwb3J0ZWQKKyAqCUB1bnVzZWQ6IHVudXNlZAorICoKKyAqCU91ciBub3RpZmllciBpcyBjYWxsZWQgb24gc3lzdGVtIHNodXRkb3ducy4gV2Ugd2FudCB0byB0dXJuIHRoZSBjYXJkCisgKglvZmYgYXQgcmVib290IG90aGVyd2lzZSB0aGUgbWFjaGluZSB3aWxsIHJlYm9vdCBhZ2FpbiBkdXJpbmcgbWVtb3J5CisgKgl0ZXN0IG9yIHdvcnNlIHlldCBkdXJpbmcgdGhlIGZvbGxvd2luZyBmc2NrLiBUaGlzIHdvdWxkIHN1Y2ssIGluIGZhY3QKKyAqCXRydXN0IG1lIC0gaWYgaXQgaGFwcGVucyBpdCBkb2VzIHN1Y2suCisgKi8KK3N0YXRpYyBpbnQgd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJCQkgIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCQkvKiBEaXNhYmxlIFdhdGNoZG9nICovCisJCXdkdF9kaXNhYmxlKCk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRfZm9wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkucmVhZAk9IHdkdF9yZWFkLAorCS51bmxvY2tlZF9pb2N0bCA9IHdkdF91bmxvY2tlZF9pb2N0bCwKKwkud3JpdGUJPSB3ZHRfd3JpdGUsCisJLm9wZW4JPSB3ZHRfb3BlbiwKKwkucmVsZWFzZSA9IHdkdF9yZWxlYXNlLAorCS5sbHNlZWsgPSBub19sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmd2R0X2ZvcHMsCit9OworCisvKgorICoJVGhlIFdEVCBjYXJkIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEcml2ZXIgSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQgbTQxdDgwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gTlVMTDsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJc3RydWN0IG00MXQ4MF9kYXRhICpjbGllbnRkYXRhID0gTlVMTDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMKKwkJCQkgICAgIHwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsCisJCSAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCWNsaWVudGRhdGEgPSBremFsbG9jKHNpemVvZigqY2xpZW50ZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50ZGF0YSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwljbGllbnRkYXRhLT5mZWF0dXJlcyA9IGlkLT5kcml2ZXJfZGF0YTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjbGllbnRkYXRhKTsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoY2xpZW50LT5uYW1lLCAmY2xpZW50LT5kZXYsCisJCQkJICAmbTQxdDgwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmMgPSBQVFJfRVJSKHJ0Yyk7CisJCXJ0YyA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwljbGllbnRkYXRhLT5ydGMgPSBydGM7CisKKwkvKiBNYWtlIHN1cmUgSFQgKEhhbHQgVXBkYXRlKSBiaXQgaXMgY2xlYXJlZCAqLworCXJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9IT1VSKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGh0X2VycjsKKworCWlmIChyYyAmIE00MVQ4MF9BTEhPVVJfSFQpIHsKKwkJaWYgKGNsaWVudGRhdGEtPmZlYXR1cmVzICYgTTQxVDgwX0ZFQVRVUkVfSFQpIHsKKwkJCW00MXQ4MF9nZXRfZGF0ZXRpbWUoY2xpZW50LCAmdG0pOworCQkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiSFQgYml0IHdhcyBzZXQhXG4iKTsKKwkJCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJCQkgIlBvd2VyIERvd24gYXQgIgorCQkJCSAiJTA0aS0lMDJpLSUwMmkgJTAyaTolMDJpOiUwMmlcbiIsCisJCQkJIHRtLnRtX3llYXIgKyAxOTAwLAorCQkJCSB0bS50bV9tb24gKyAxLCB0bS50bV9tZGF5LCB0bS50bV9ob3VyLAorCQkJCSB0bS50bV9taW4sIHRtLnRtX3NlYyk7CisJCX0KKwkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkgICAgICBNNDFUODBfUkVHX0FMQVJNX0hPVVIsCisJCQkJCSAgICAgIHJjICYgfk00MVQ4MF9BTEhPVVJfSFQpIDwgMCkKKwkJCWdvdG8gaHRfZXJyOworCX0KKworCS8qIE1ha2Ugc3VyZSBTVCAoc3RvcCkgYml0IGlzIGNsZWFyZWQgKi8KKwlyYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfU0VDKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIHN0X2VycjsKKworCWlmIChyYyAmIE00MVQ4MF9TRUNfU1QpIHsKKwkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX1NFQywKKwkJCQkJICAgICAgcmMgJiB+TTQxVDgwX1NFQ19TVCkgPCAwKQorCQkJZ290byBzdF9lcnI7CisJfQorCisJcmMgPSBtNDF0ODBfc3lzZnNfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXhpdDsKKworI2lmZGVmIENPTkZJR19SVENfRFJWX000MVQ4MF9XRFQKKwlpZiAoY2xpZW50ZGF0YS0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9IVCkgeworCQlzYXZlX2NsaWVudCA9IGNsaWVudDsKKwkJcmMgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfZGV2KTsKKwkJaWYgKHJjKQorCQkJZ290byBleGl0OworCQlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwkJaWYgKHJjKSB7CisJCQltaXNjX2RlcmVnaXN0ZXIoJndkdF9kZXYpOworCQkJZ290byBleGl0OworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIDA7CisKK3N0X2VycjoKKwlyYyA9IC1FSU87CisJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW4ndCBjbGVhciBTVCBiaXRcbiIpOworCWdvdG8gZXhpdDsKK2h0X2VycjoKKwlyYyA9IC1FSU87CisJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW4ndCBjbGVhciBIVCBiaXRcbiIpOworCWdvdG8gZXhpdDsKKworZXhpdDoKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlrZnJlZShjbGllbnRkYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbTQxdDgwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtNDF0ODBfZGF0YSAqY2xpZW50ZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBjbGllbnRkYXRhLT5ydGM7CisKKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUCisJaWYgKGNsaWVudGRhdGEtPmZlYXR1cmVzICYgTTQxVDgwX0ZFQVRVUkVfSFQpIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfZGV2KTsKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJfQorI2VuZGlmCisJaWYgKHJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJa2ZyZWUoY2xpZW50ZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG00MXQ4MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicnRjLW00MXQ4MCIsCisJfSwKKwkucHJvYmUgPSBtNDF0ODBfcHJvYmUsCisJLnJlbW92ZSA9IG00MXQ4MF9yZW1vdmUsCisJLmlkX3RhYmxlID0gbTQxdDgwX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIobTQxdDgwX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsZXhhbmRlciBCaWdnYSA8YWJAbXljYWJsZS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1QgTWljcm9lbGVjdHJvbmljcyBNNDFUODAgc2VyaWVzIFJUQyBJMkMgQ2xpZW50IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW00MXQ5My5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW00MXQ5My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjFjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbTQxdDkzLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKgorICogRHJpdmVyIGZvciBTVCBNNDFUOTMgU1BJIFJUQworICoKKyAqIChjKSAyMDEwIE5pa29sYXVzIFZvc3MsIFdlaW5tYW5uIE1lZGljYWwgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2RlZmluZSBNNDFUOTNfUkVHX1NTRUMJCQkwCisjZGVmaW5lIE00MVQ5M19SRUdfU1RfU0VDCQkxCisjZGVmaW5lIE00MVQ5M19SRUdfTUlOCQkJMgorI2RlZmluZSBNNDFUOTNfUkVHX0NFTlRfSE9VUgkJMworI2RlZmluZSBNNDFUOTNfUkVHX1dEQVkJCQk0CisjZGVmaW5lIE00MVQ5M19SRUdfREFZCQkJNQorI2RlZmluZSBNNDFUOTNfUkVHX01PTgkJCTYKKyNkZWZpbmUgTTQxVDkzX1JFR19ZRUFSCQkJNworCisKKyNkZWZpbmUgTTQxVDkzX1JFR19BTE1fSE9VUl9IVAkJMHhjCisjZGVmaW5lIE00MVQ5M19SRUdfRkxBR1MJCTB4ZgorCisjZGVmaW5lIE00MVQ5M19GTEFHX1NUCQkJKDEgPDwgNykKKyNkZWZpbmUgTTQxVDkzX0ZMQUdfT0YJCQkoMSA8PCAyKQorI2RlZmluZSBNNDFUOTNfRkxBR19CTAkJCSgxIDw8IDQpCisjZGVmaW5lIE00MVQ5M19GTEFHX0hUCQkJKDEgPDwgNikKKworc3RhdGljIGlubGluZSBpbnQgbTQxdDkzX3NldF9yZWcoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggYWRkciwgdTggZGF0YSkKK3sKKwl1OCBidWZbMl07CisKKwkvKiBNU0IgbXVzdCBiZSAnMScgdG8gd3JpdGUgKi8KKwlidWZbMF0gPSBhZGRyIHwgMHg4MDsKKwlidWZbMV0gPSBkYXRhOworCisJcmV0dXJuIHNwaV93cml0ZShzcGksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworfQorCitzdGF0aWMgaW50IG00MXQ5M19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwl1OCBidWZbOV0gPSB7MHg4MH07ICAgICAgICAvKiB3cml0ZSBjbWQgKyA4IGRhdGEgYnl0ZXMgKi8KKwl1OCAqIGNvbnN0IGRhdGEgPSAmYnVmWzFdOyAvKiBwdHIgdG8gZmlyc3QgZGF0YSBieXRlICovCisKKwlkZXZfZGJnKGRldiwgIiVzIHNlY3M9JWQsIG1pbnM9JWQsICIKKwkJImhvdXJzPSVkLCBtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCSJ3cml0ZSIsIHRtLT50bV9zZWMsIHRtLT50bV9taW4sCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKKworCWlmICh0bS0+dG1feWVhciA8IDEwMCkgeworCQlkZXZfd2Fybigmc3BpLT5kZXYsICJ1bnN1cHBvcnRlZCBkYXRlIChiZWZvcmUgMjAwMC0wMS0wMSkuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YVtNNDFUOTNfUkVHX1NTRUNdCQk9IDA7CisJZGF0YVtNNDFUOTNfUkVHX1NUX1NFQ10JCT0gYmluMmJjZCh0bS0+dG1fc2VjKTsKKwlkYXRhW000MVQ5M19SRUdfTUlOXQkJPSBiaW4yYmNkKHRtLT50bV9taW4pOworCWRhdGFbTTQxVDkzX1JFR19DRU5UX0hPVVJdCT0gYmluMmJjZCh0bS0+dG1faG91cikgfAorCQkJCQkJKCh0bS0+dG1feWVhci8xMDAtMSkgPDwgNik7CisJZGF0YVtNNDFUOTNfUkVHX0RBWV0JCT0gYmluMmJjZCh0bS0+dG1fbWRheSk7CisJZGF0YVtNNDFUOTNfUkVHX1dEQVldCQk9IGJpbjJiY2QodG0tPnRtX3dkYXkgKyAxKTsKKwlkYXRhW000MVQ5M19SRUdfTU9OXQkJPSBiaW4yYmNkKHRtLT50bV9tb24gKyAxKTsKKwlkYXRhW000MVQ5M19SRUdfWUVBUl0JCT0gYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCk7CisKKwlyZXR1cm4gc3BpX3dyaXRlKHNwaSwgYnVmLCBzaXplb2YoYnVmKSk7Cit9CisKKworc3RhdGljIGludCBtNDF0OTNfZ2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJY29uc3QgdTggc3RhcnRfYWRkciA9IDA7CisJdTggYnVmWzhdOworCWludCBjZW50dXJ5X2FmdGVyXzE5MDA7CisJaW50IHRtcDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIENoZWNrIHN0YXR1cyBvZiBjbG9jay4gVHdvIHN0YXRlcyBtdXN0IGJlIGNvbnNpZGVyZWQ6CisJICAgMS4gaGFsdCBiaXQgKEhUKSBpcyBzZXQ6IHRoZSBjbG9jayBpcyBydW5uaW5nIGJ1dCB1cGRhdGUgb2YgcmVhZG91dAorCSAgICAgIHJlZ2lzdGVycyBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gcG93ZXIgZmFpbHVyZS4gVGhpcyBpcyBub3JtYWwKKwkgICAgICBjYXNlIGFmdGVyIHBvd2Vyb24uIFRpbWUgaXMgdmFsaWQgYWZ0ZXIgcmVzZXR0aW5nIEhUIGJpdC4KKwkgICAyLiBvc2NpbGxhdG9yIGZhaWwgYml0IChPRikgaXMgc2V0LiBPc2NpbGxhdG9yIGhhcyBiZSBzdG9wcGVkIGFuZAorCSAgICAgIHRpbWUgaXMgaW52YWxpZDoKKwkgICAgICBhKSBPRiBjYW4gYmUgaW1tZWRpdGVseSByZXNldC4KKwkgICAgICBiKSBPRiBjYW5ub3QgYmUgaW1tZWRpYXRlbHkgcmVzZXQ6IG9zY2lsbGF0b3IgaGFzIHRvIGJlIHJlc3RhcnRlZC4KKwkqLworCXRtcCA9IHNwaV93OHI4KHNwaSwgTTQxVDkzX1JFR19BTE1fSE9VUl9IVCk7CisJaWYgKHRtcCA8IDApCisJCXJldHVybiB0bXA7CisKKwlpZiAodG1wICYgTTQxVDkzX0ZMQUdfSFQpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJIVCBiaXQgaXMgc2V0LCByZWVuYWJsZSBjbG9jayB1cGRhdGUuXG4iKTsKKwkJbTQxdDkzX3NldF9yZWcoc3BpLCBNNDFUOTNfUkVHX0FMTV9IT1VSX0hULAorCQkJICAgICAgIHRtcCAmIH5NNDFUOTNfRkxBR19IVCk7CisJfQorCisJdG1wID0gc3BpX3c4cjgoc3BpLCBNNDFUOTNfUkVHX0ZMQUdTKTsKKwlpZiAodG1wIDwgMCkKKwkJcmV0dXJuIHRtcDsKKworCWlmICh0bXAgJiBNNDFUOTNfRkxBR19PRikgeworCQlyZXQgPSAtRUlOVkFMOworCQlkZXZfd2Fybigmc3BpLT5kZXYsICJPRiBiaXQgaXMgc2V0LCByZXNldHRpbmcuXG4iKTsKKwkJbTQxdDkzX3NldF9yZWcoc3BpLCBNNDFUOTNfUkVHX0ZMQUdTLCB0bXAgJiB+TTQxVDkzX0ZMQUdfT0YpOworCisJCXRtcCA9IHNwaV93OHI4KHNwaSwgTTQxVDkzX1JFR19GTEFHUyk7CisJCWlmICh0bXAgPCAwKQorCQkJcmV0dXJuIHRtcDsKKwkJZWxzZSBpZiAodG1wICYgTTQxVDkzX0ZMQUdfT0YpIHsKKwkJCXU4IHJlc2V0X29zYyA9IGJ1ZltNNDFUOTNfUkVHX1NUX1NFQ10gfCBNNDFUOTNfRkxBR19TVDsKKworCQkJZGV2X3dhcm4oJnNwaS0+ZGV2LAorCQkJCSAiT0YgYml0IGlzIHN0aWxsIHNldCwga2lja3N0YXJ0aW5nIGNsb2NrLlxuIik7CisJCQltNDF0OTNfc2V0X3JlZyhzcGksIE00MVQ5M19SRUdfU1RfU0VDLCByZXNldF9vc2MpOworCQkJcmVzZXRfb3NjICY9IH5NNDFUOTNfRkxBR19TVDsKKwkJCW00MXQ5M19zZXRfcmVnKHNwaSwgTTQxVDkzX1JFR19TVF9TRUMsIHJlc2V0X29zYyk7CisJCX0KKwl9CisKKwlpZiAodG1wICYgTTQxVDkzX0ZMQUdfQkwpCisJCWRldl93YXJuKCZzcGktPmRldiwgIkJMIGJpdCBpcyBzZXQsIHJlcGxhY2UgYmF0dGVyeS5cbiIpOworCisJLyogcmVhZCBhY3R1YWwgdGltZS9kYXRlICovCisJdG1wID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZzdGFydF9hZGRyLCAxLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAodG1wIDwgMCkKKwkJcmV0dXJuIHRtcDsKKworCXRtLT50bV9zZWMJPSBiY2QyYmluKGJ1ZltNNDFUOTNfUkVHX1NUX1NFQ10pOworCXRtLT50bV9taW4JPSBiY2QyYmluKGJ1ZltNNDFUOTNfUkVHX01JTl0pOworCXRtLT50bV9ob3VyCT0gYmNkMmJpbihidWZbTTQxVDkzX1JFR19DRU5UX0hPVVJdICYgMHgzZik7CisJdG0tPnRtX21kYXkJPSBiY2QyYmluKGJ1ZltNNDFUOTNfUkVHX0RBWV0pOworCXRtLT50bV9tb24JPSBiY2QyYmluKGJ1ZltNNDFUOTNfUkVHX01PTl0pIC0gMTsKKwl0bS0+dG1fd2RheQk9IGJjZDJiaW4oYnVmW000MVQ5M19SRUdfV0RBWV0gJiAweDBmKSAtIDE7CisKKwljZW50dXJ5X2FmdGVyXzE5MDAgPSAoYnVmW000MVQ5M19SRUdfQ0VOVF9IT1VSXSA+PiA2KSArIDE7CisJdG0tPnRtX3llYXIgPSBiY2QyYmluKGJ1ZltNNDFUOTNfUkVHX1lFQVJdKSArIGNlbnR1cnlfYWZ0ZXJfMTkwMCAqIDEwMDsKKworCWRldl9kYmcoZGV2LCAiJXMgc2Vjcz0lZCwgbWlucz0lZCwgIgorCQkiaG91cnM9JWQsIG1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJInJlYWQiLCB0bS0+dG1fc2VjLCB0bS0+dG1fbWluLAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21kYXksCisJCXRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisKKwlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IHJ0Y192YWxpZF90bSh0bSk7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG00MXQ5M19ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBtNDF0OTNfZ2V0X3RpbWUsCisJLnNldF90aW1lCT0gbTQxdDkzX3NldF90aW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG00MXQ5M19kcml2ZXI7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG00MXQ5M19wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJaW50IHJlczsKKworCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXMgPSBzcGlfdzhyOChzcGksIE00MVQ5M19SRUdfV0RBWSk7CisJaWYgKHJlcyA8IDAgfHwgKHJlcyAmIDB4ZjgpICE9IDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJub3QgZm91bmQgMHgleC5cbiIsIHJlcyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIobTQxdDkzX2RyaXZlci5kcml2ZXIubmFtZSwKKwkJJnNwaS0+ZGV2LCAmbTQxdDkzX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBydGMpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfX2RldmV4aXQgbTQxdDkzX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtNDF0OTNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJ0Yy1tNDF0OTMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IG00MXQ5M19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobTQxdDkzX3JlbW92ZSksCit9OworCittb2R1bGVfc3BpX2RyaXZlcihtNDF0OTNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTmlrb2xhdXMgVm9zcyA8bi52b3NzQHdlaW5tYW5uLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFNUIE00MVQ5MyBTUEkgUlRDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInNwaTpydGMtbTQxdDkzIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbTQxdDk0LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbTQxdDk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3ODE5MwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tNDF0OTQuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIERyaXZlciBmb3IgU1QgTTQxVDk0IFNQSSBSVEMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggS2ltIEIuIEhlaW5vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjZGVmaW5lIE00MVQ5NF9SRUdfU0VDT05EUwkweDAxCisjZGVmaW5lIE00MVQ5NF9SRUdfTUlOVVRFUwkweDAyCisjZGVmaW5lIE00MVQ5NF9SRUdfSE9VUlMJMHgwMworI2RlZmluZSBNNDFUOTRfUkVHX1dEQVkJCTB4MDQKKyNkZWZpbmUgTTQxVDk0X1JFR19EQVkJCTB4MDUKKyNkZWZpbmUgTTQxVDk0X1JFR19NT05USAkweDA2CisjZGVmaW5lIE00MVQ5NF9SRUdfWUVBUgkJMHgwNworI2RlZmluZSBNNDFUOTRfUkVHX0hUCQkweDBjCisKKyNkZWZpbmUgTTQxVDk0X0JJVF9IQUxUCQkweDQwCisjZGVmaW5lIE00MVQ5NF9CSVRfU1RPUAkJMHg4MAorI2RlZmluZSBNNDFUOTRfQklUX0NCCQkweDQwCisjZGVmaW5lIE00MVQ5NF9CSVRfQ0VCCQkweDgwCisKK3N0YXRpYyBpbnQgbTQxdDk0X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXU4IGJ1Zls4XTsgLyogd3JpdGUgY21kICsgNyByZWdpc3RlcnMgKi8KKworCWRldl9kYmcoZGV2LCAiJXMgc2Vjcz0lZCwgbWlucz0lZCwgIgorCQkiaG91cnM9JWQsIG1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJIndyaXRlIiwgdG0tPnRtX3NlYywgdG0tPnRtX21pbiwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9tZGF5LAorCQl0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOworCisJYnVmWzBdID0gMHg4MCB8IE00MVQ5NF9SRUdfU0VDT05EUzsgLyogd3JpdGUgdGltZSArIGRhdGUgKi8KKwlidWZbTTQxVDk0X1JFR19TRUNPTkRTXSA9IGJpbjJiY2QodG0tPnRtX3NlYyk7CisJYnVmW000MVQ5NF9SRUdfTUlOVVRFU10gPSBiaW4yYmNkKHRtLT50bV9taW4pOworCWJ1ZltNNDFUOTRfUkVHX0hPVVJTXSAgID0gYmluMmJjZCh0bS0+dG1faG91cik7CisJYnVmW000MVQ5NF9SRUdfV0RBWV0gICAgPSBiaW4yYmNkKHRtLT50bV93ZGF5ICsgMSk7CisJYnVmW000MVQ5NF9SRUdfREFZXSAgICAgPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlidWZbTTQxVDk0X1JFR19NT05USF0gICA9IGJpbjJiY2QodG0tPnRtX21vbiArIDEpOworCisJYnVmW000MVQ5NF9SRUdfSE9VUlNdIHw9IE00MVQ5NF9CSVRfQ0VCOworCWlmICh0bS0+dG1feWVhciA+PSAxMDApCisJCWJ1ZltNNDFUOTRfUkVHX0hPVVJTXSB8PSBNNDFUOTRfQklUX0NCOworCWJ1ZltNNDFUOTRfUkVHX1lFQVJdID0gYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCk7CisKKwlyZXR1cm4gc3BpX3dyaXRlKHNwaSwgYnVmLCA4KTsKK30KKworc3RhdGljIGludCBtNDF0OTRfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXU4IGJ1ZlsyXTsKKwlpbnQgcmV0LCBob3VyOworCisJLyogY2xlYXIgaGFsdCB1cGRhdGUgYml0ICovCisJcmV0ID0gc3BpX3c4cjgoc3BpLCBNNDFUOTRfUkVHX0hUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ICYgTTQxVDk0X0JJVF9IQUxUKSB7CisJCWJ1ZlswXSA9IDB4ODAgfCBNNDFUOTRfUkVHX0hUOworCQlidWZbMV0gPSByZXQgJiB+TTQxVDk0X0JJVF9IQUxUOworCQlzcGlfd3JpdGUoc3BpLCBidWYsIDIpOworCX0KKworCS8qIGNsZWFyIHN0b3AgYml0ICovCisJcmV0ID0gc3BpX3c4cjgoc3BpLCBNNDFUOTRfUkVHX1NFQ09ORFMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXQgJiBNNDFUOTRfQklUX1NUT1ApIHsKKwkJYnVmWzBdID0gMHg4MCB8IE00MVQ5NF9SRUdfU0VDT05EUzsKKwkJYnVmWzFdID0gcmV0ICYgfk00MVQ5NF9CSVRfU1RPUDsKKwkJc3BpX3dyaXRlKHNwaSwgYnVmLCAyKTsKKwl9CisKKwl0bS0+dG1fc2VjICA9IGJjZDJiaW4oc3BpX3c4cjgoc3BpLCBNNDFUOTRfUkVHX1NFQ09ORFMpKTsKKwl0bS0+dG1fbWluICA9IGJjZDJiaW4oc3BpX3c4cjgoc3BpLCBNNDFUOTRfUkVHX01JTlVURVMpKTsKKwlob3VyID0gc3BpX3c4cjgoc3BpLCBNNDFUOTRfUkVHX0hPVVJTKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oaG91ciAmIDB4M2YpOworCXRtLT50bV93ZGF5ID0gYmNkMmJpbihzcGlfdzhyOChzcGksIE00MVQ5NF9SRUdfV0RBWSkpIC0gMTsKKwl0bS0+dG1fbWRheSA9IGJjZDJiaW4oc3BpX3c4cjgoc3BpLCBNNDFUOTRfUkVHX0RBWSkpOworCXRtLT50bV9tb24gID0gYmNkMmJpbihzcGlfdzhyOChzcGksIE00MVQ5NF9SRUdfTU9OVEgpKSAtIDE7CisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHNwaV93OHI4KHNwaSwgTTQxVDk0X1JFR19ZRUFSKSk7CisJaWYgKChob3VyICYgTTQxVDk0X0JJVF9DQikgfHwgIShob3VyICYgTTQxVDk0X0JJVF9DRUIpKQorCQl0bS0+dG1feWVhciArPSAxMDA7CisKKwlkZXZfZGJnKGRldiwgIiVzIHNlY3M9JWQsIG1pbnM9JWQsICIKKwkJImhvdXJzPSVkLCBtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCSJyZWFkIiwgdG0tPnRtX3NlYywgdG0tPnRtX21pbiwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9tZGF5LAorCQl0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOworCisJLyogaW5pdGlhbCBjbG9jayBzZXR0aW5nIGNhbiBiZSB1bmRlZmluZWQgKi8KKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG00MXQ5NF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBtNDF0OTRfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG00MXQ5NF9zZXRfdGltZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtNDF0OTRfZHJpdmVyOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtNDF0OTRfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWludCByZXM7CisKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCisJcmVzID0gc3BpX3c4cjgoc3BpLCBNNDFUOTRfUkVHX1NFQ09ORFMpOworCWlmIChyZXMgPCAwKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm90IGZvdW5kLlxuIik7CisJCXJldHVybiByZXM7CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihtNDF0OTRfZHJpdmVyLmRyaXZlci5uYW1lLAorCQkmc3BpLT5kZXYsICZtNDF0OTRfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbTQxdDk0X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtNDF0OTRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJ0Yy1tNDF0OTQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IG00MXQ5NF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobTQxdDk0X3JlbW92ZSksCit9OworCittb2R1bGVfc3BpX2RyaXZlcihtNDF0OTRfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiS2ltIEIuIEhlaW5vIDxLaW0uSGVpbm9AYmx1ZWdpZ2EuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFNUIE00MVQ5NCBTUEkgUlRDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInNwaTpydGMtbTQxdDk0Iik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDM1LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDM1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllM2IzNQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tNDh0MzUuYwpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIFNHUy1UaG9tc29uIE00OFQzNSBUaW1la2VlcGVyIFJBTSBjaGlwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIFdyaXR0ZW4gYnkgVWxmIENhcmxzc29uICh1bGZjQGVuZ3Iuc2dpLmNvbSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhvbWFzIEJvZ2VuZG9lcmZlcgorICoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBQYXVsIEdvcnRtYWtlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMCIKKworc3RydWN0IG00OHQzNV9ydGMgeworCXU4CXBhZFsweDdmZjhdOyAgICAvKiBzdGFydHMgYXQgMHg3ZmY4ICovCisJdTgJY29udHJvbDsKKwl1OAlzZWM7CisJdTgJbWluOworCXU4CWhvdXI7CisJdTgJZGF5OworCXU4CWRhdGU7CisJdTgJbW9udGg7CisJdTgJeWVhcjsKK307CisKKyNkZWZpbmUgTTQ4VDM1X1JUQ19TRVQJCTB4ODAKKyNkZWZpbmUgTTQ4VDM1X1JUQ19SRUFECQkweDQwCisKK3N0cnVjdCBtNDh0MzVfcHJpdiB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgbTQ4dDM1X3J0YyBfX2lvbWVtICpyZWc7CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgaW50IG00OHQzNV9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBtNDh0MzVfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4IGNvbnRyb2w7CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFdlIGxlYXZlCisJICogdG1fd2RheSwgdG1feWRheSBhbmQgdG1faXNkc3QgdW50b3VjaGVkLiBFdmVuIHRob3VnaCB0aGUKKwkgKiBSVEMgaGFzIFJUQ19EQVlfT0ZfV0VFSywgd2UgaWdub3JlIGl0LCBhcyBpdCBpcyBvbmx5IHVwZGF0ZWQKKwkgKiBieSB0aGUgUlRDIHdoZW4gaW5pdGlhbGx5IHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgorCSAqLworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCWNvbnRyb2wgPSByZWFkYigmcHJpdi0+cmVnLT5jb250cm9sKTsKKwl3cml0ZWIoY29udHJvbCB8IE00OFQzNV9SVENfUkVBRCwgJnByaXYtPnJlZy0+Y29udHJvbCk7CisJdG0tPnRtX3NlYyA9IHJlYWRiKCZwcml2LT5yZWctPnNlYyk7CisJdG0tPnRtX21pbiA9IHJlYWRiKCZwcml2LT5yZWctPm1pbik7CisJdG0tPnRtX2hvdXIgPSByZWFkYigmcHJpdi0+cmVnLT5ob3VyKTsKKwl0bS0+dG1fbWRheSA9IHJlYWRiKCZwcml2LT5yZWctPmRhdGUpOworCXRtLT50bV9tb24gPSByZWFkYigmcHJpdi0+cmVnLT5tb250aCk7CisJdG0tPnRtX3llYXIgPSByZWFkYigmcHJpdi0+cmVnLT55ZWFyKTsKKwl3cml0ZWIoY29udHJvbCwgJnByaXYtPnJlZy0+Y29udHJvbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHRtLT50bV9zZWMpOworCXRtLT50bV9taW4gPSBiY2QyYmluKHRtLT50bV9taW4pOworCXRtLT50bV9ob3VyID0gYmNkMmJpbih0bS0+dG1faG91cik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHRtLT50bV9tZGF5KTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbih0bS0+dG1fbW9uKTsKKwl0bS0+dG1feWVhciA9IGJjZDJiaW4odG0tPnRtX3llYXIpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKwl0bS0+dG1feWVhciArPSA3MDsKKwlpZiAodG0tPnRtX3llYXIgPD0gNjkpCisJCXRtLT50bV95ZWFyICs9IDEwMDsKKworCXRtLT50bV9tb24tLTsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBtNDh0MzVfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBtNDh0MzVfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWM7CisJdW5zaWduZWQgaW50IHlyczsKKwl1OCBjb250cm9sOworCisJeXJzID0gdG0tPnRtX3llYXIgKyAxOTAwOworCW1vbiA9IHRtLT50bV9tb24gKyAxOyAgIC8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLworCWRheSA9IHRtLT50bV9tZGF5OworCWhycyA9IHRtLT50bV9ob3VyOworCW1pbiA9IHRtLT50bV9taW47CisJc2VjID0gdG0tPnRtX3NlYzsKKworCWlmICh5cnMgPCAxOTcwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXlycyAtPSAxOTcwOworCWlmICh5cnMgPiAyNTUpICAgIC8qIFRoZXkgYXJlIHVuc2lnbmVkICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHlycyA+IDE2OSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoeXJzID49IDEwMCkKKwkJeXJzIC09IDEwMDsKKworCXNlYyA9IGJpbjJiY2Qoc2VjKTsKKwltaW4gPSBiaW4yYmNkKG1pbik7CisJaHJzID0gYmluMmJjZChocnMpOworCWRheSA9IGJpbjJiY2QoZGF5KTsKKwltb24gPSBiaW4yYmNkKG1vbik7CisJeXJzID0gYmluMmJjZCh5cnMpOworCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJY29udHJvbCA9IHJlYWRiKCZwcml2LT5yZWctPmNvbnRyb2wpOworCXdyaXRlYihjb250cm9sIHwgTTQ4VDM1X1JUQ19TRVQsICZwcml2LT5yZWctPmNvbnRyb2wpOworCXdyaXRlYih5cnMsICZwcml2LT5yZWctPnllYXIpOworCXdyaXRlYihtb24sICZwcml2LT5yZWctPm1vbnRoKTsKKwl3cml0ZWIoZGF5LCAmcHJpdi0+cmVnLT5kYXRlKTsKKwl3cml0ZWIoaHJzLCAmcHJpdi0+cmVnLT5ob3VyKTsKKwl3cml0ZWIobWluLCAmcHJpdi0+cmVnLT5taW4pOworCXdyaXRlYihzZWMsICZwcml2LT5yZWctPnNlYyk7CisJd3JpdGViKGNvbnRyb2wsICZwcml2LT5yZWctPmNvbnRyb2wpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtNDh0MzVfb3BzID0geworCS5yZWFkX3RpbWUJPSBtNDh0MzVfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG00OHQzNV9zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG00OHQzNV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBtNDh0MzVfcHJpdiAqcHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PREVWOworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbTQ4dDM1X3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwkvKgorCSAqIGtsdWRnZTogcmVtb3ZlIHRoZSAjaWZuZGVmIGFmdGVyIGlvYzMgcmVzb3VyY2UKKwkgKiBjb25mbGljdHMgYXJlIHJlc29sdmVkCisJICovCisjaWZuZGVmIENPTkZJR19TR0lfSVAyNworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHByaXYtPnNpemUsIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisJcHJpdi0+YmFzZWFkZHIgPSByZXMtPnN0YXJ0OworCXByaXYtPnJlZyA9IGlvcmVtYXAocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWlmICghcHJpdi0+cmVnKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJcHJpdi0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibTQ4dDM1IiwgJnBkZXYtPmRldiwKKwkJCQkgICZtNDh0MzVfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihwcml2LT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+cnRjKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0dXJuIDA7CisKK291dDoKKwlpZiAocHJpdi0+cmVnKQorCQlpb3VubWFwKHByaXYtPnJlZyk7CisJaWYgKHByaXYtPmJhc2VhZGRyKQorCQlyZWxlYXNlX21lbV9yZWdpb24ocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWtmcmVlKHByaXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG00OHQzNV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbTQ4dDM1X3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlvdW5tYXAocHJpdi0+cmVnKTsKKyNpZm5kZWYgQ09ORklHX1NHSV9JUDI3CisJcmVsZWFzZV9tZW1fcmVnaW9uKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKyNlbmRpZgorCWtmcmVlKHByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtNDh0MzVfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtbTQ4dDM1IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gbTQ4dDM1X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobTQ4dDM1X3JlbW92ZSksCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG00OHQzNV9wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgQm9nZW5kb2VyZmVyIDx0c2JvZ2VuZEBhbHBoYS5mcmFua2VuLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNNDhUMzUgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtbTQ4dDM1Iik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlYmZlYwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYwpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqIFNUIE00OFQ1OSBSVEMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIEF1dGhvcjogTWFyayBaaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMvbTQ4dDU5Lmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaWZuZGVmIE5PX0lSUQorI2RlZmluZSBOT19JUlEJKC0xKQorI2VuZGlmCisKKyNkZWZpbmUgTTQ4VDU5X1JFQUQocmVnKSAocGRhdGEtPnJlYWRfYnl0ZShkZXYsIHBkYXRhLT5vZmZzZXQgKyByZWcpKQorI2RlZmluZSBNNDhUNTlfV1JJVEUodmFsLCByZWcpIFwKKwkocGRhdGEtPndyaXRlX2J5dGUoZGV2LCBwZGF0YS0+b2Zmc2V0ICsgcmVnLCB2YWwpKQorCisjZGVmaW5lIE00OFQ1OV9TRVRfQklUUyhtYXNrLCByZWcpCVwKKwlNNDhUNTlfV1JJVEUoKE00OFQ1OV9SRUFEKHJlZykgfCAobWFzaykpLCAocmVnKSkKKyNkZWZpbmUgTTQ4VDU5X0NMRUFSX0JJVFMobWFzaywgcmVnKQlcCisJTTQ4VDU5X1dSSVRFKChNNDhUNTlfUkVBRChyZWcpICYgfihtYXNrKSksIChyZWcpKQorCitzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgeworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCBpcnE7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzcGlubG9ja190IGxvY2s7IC8qIHNlcmlhbGl6ZSB0aGUgTlZSQU0gYW5kIFJUQyBhY2Nlc3MgKi8KK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBnZW5lcmljIGFjY2VzcyBtZXRob2Qgd2hlbiB0aGUgY2hpcCBpcyBtZW1vcnktbWFwcGVkCisgKi8KK3N0YXRpYyB2b2lkCittNDh0NTlfbWVtX3dyaXRlYihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMsIHU4IHZhbCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXdyaXRlYih2YWwsIG00OHQ1OS0+aW9hZGRyK29mcyk7Cit9CisKK3N0YXRpYyB1OAorbTQ4dDU5X21lbV9yZWFkYihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gcmVhZGIobTQ4dDU5LT5pb2FkZHIrb2ZzKTsKK30KKworLyoKKyAqIE5PVEU6IE00OFQ1OSBvbmx5IHVzZXMgQkNEIG1vZGUKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJLyogSXNzdWUgdGhlIFJFQUQgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9SRUFELCBNNDhUNTlfQ05UTCk7CisKKwl0bS0+dG1feWVhcgk9IGJjZDJiaW4oTTQ4VDU5X1JFQUQoTTQ4VDU5X1lFQVIpKTsKKwkvKiB0bV9tb24gaXMgMC0xMSAqLworCXRtLT50bV9tb24JPSBiY2QyYmluKE00OFQ1OV9SRUFEKE00OFQ1OV9NT05USCkpIC0gMTsKKwl0bS0+dG1fbWRheQk9IGJjZDJiaW4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01EQVkpKTsKKworCXZhbCA9IE00OFQ1OV9SRUFEKE00OFQ1OV9XREFZKTsKKwlpZiAoKHBkYXRhLT50eXBlID09IE00OFQ1OVJUQ19UWVBFX000OFQ1OSkgJiYKKwkgICAgKHZhbCAmIE00OFQ1OV9XREFZX0NFQikgJiYgKHZhbCAmIE00OFQ1OV9XREFZX0NCKSkgeworCQlkZXZfZGJnKGRldiwgIkNlbnR1cnkgYml0IGlzIGVuYWJsZWRcbiIpOworCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIG9uZSBjZW50dXJ5ICovCisJfQorI2lmZGVmIENPTkZJR19TUEFSQworCS8qIFN1biBTUEFSQyBtYWNoaW5lcyBjb3VudCB5ZWFycyBzaW5jZSAxOTY4ICovCisJdG0tPnRtX3llYXIgKz0gNjg7CisjZW5kaWYKKworCXRtLT50bV93ZGF5CT0gYmNkMmJpbih2YWwgJiAweDA3KTsKKwl0bS0+dG1faG91cgk9IGJjZDJiaW4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0hPVVIpICYgMHgzRik7CisJdG0tPnRtX21pbgk9IGJjZDJiaW4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01JTikgJiAweDdGKTsKKwl0bS0+dG1fc2VjCT0gYmNkMmJpbihNNDhUNTlfUkVBRChNNDhUNTlfU0VDKSAmIDB4N0YpOworCisJLyogQ2xlYXIgdGhlIFJFQUQgYml0ICovCisJTTQ4VDU5X0NMRUFSX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkZXYsICJSVEMgcmVhZCB0aW1lICUwNGQtJTAyZC0lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQl0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWwgPSAwOworCWludCB5ZWFyID0gdG0tPnRtX3llYXI7CisKKyNpZmRlZiBDT05GSUdfU1BBUkMKKwkvKiBTdW4gU1BBUkMgbWFjaGluZXMgY291bnQgeWVhcnMgc2luY2UgMTk2OCAqLworCXllYXIgLT0gNjg7CisjZW5kaWYKKworCWRldl9kYmcoZGV2LCAiUlRDIHNldCB0aW1lICUwNGQtJTAyZC0lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQl5ZWFyICsgMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCWlmICh5ZWFyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJLyogSXNzdWUgdGhlIFdSSVRFIGNvbW1hbmQgKi8KKwlNNDhUNTlfU0VUX0JJVFMoTTQ4VDU5X0NOVExfV1JJVEUsIE00OFQ1OV9DTlRMKTsKKworCU00OFQ1OV9XUklURSgoYmluMmJjZCh0bS0+dG1fc2VjKSAmIDB4N0YpLCBNNDhUNTlfU0VDKTsKKwlNNDhUNTlfV1JJVEUoKGJpbjJiY2QodG0tPnRtX21pbikgJiAweDdGKSwgTTQ4VDU5X01JTik7CisJTTQ4VDU5X1dSSVRFKChiaW4yYmNkKHRtLT50bV9ob3VyKSAmIDB4M0YpLCBNNDhUNTlfSE9VUik7CisJTTQ4VDU5X1dSSVRFKChiaW4yYmNkKHRtLT50bV9tZGF5KSAmIDB4M0YpLCBNNDhUNTlfTURBWSk7CisJLyogdG1fbW9uIGlzIDAtMTEgKi8KKwlNNDhUNTlfV1JJVEUoKGJpbjJiY2QodG0tPnRtX21vbiArIDEpICYgMHgxRiksIE00OFQ1OV9NT05USCk7CisJTTQ4VDU5X1dSSVRFKGJpbjJiY2QoeWVhciAlIDEwMCksIE00OFQ1OV9ZRUFSKTsKKworCWlmIChwZGF0YS0+dHlwZSA9PSBNNDhUNTlSVENfVFlQRV9NNDhUNTkgJiYgKHllYXIgLyAxMDApKQorCQl2YWwgPSAoTTQ4VDU5X1dEQVlfQ0VCIHwgTTQ4VDU5X1dEQVlfQ0IpOworCXZhbCB8PSAoYmluMmJjZCh0bS0+dG1fd2RheSkgJiAweDA3KTsKKwlNNDhUNTlfV1JJVEUodmFsLCBNNDhUNTlfV0RBWSk7CisKKwkvKiBDbGVhciB0aGUgV1JJVEUgYml0ICovCisJTTQ4VDU5X0NMRUFSX0JJVFMoTTQ4VDU5X0NOVExfV1JJVEUsIE00OFQ1OV9DTlRMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgYWxhcm0gdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX3JlYWRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHZhbDsKKworCS8qIElmIG5vIGlycSwgd2UgZG9uJ3Qgc3VwcG9ydCBBTEFSTSAqLworCWlmIChtNDh0NTktPmlycSA9PSBOT19JUlEpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCS8qIElzc3VlIHRoZSBSRUFEIGNvbW1hbmQgKi8KKwlNNDhUNTlfU0VUX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCisJdG0tPnRtX3llYXIgPSBiY2QyYmluKE00OFQ1OV9SRUFEKE00OFQ1OV9ZRUFSKSk7CisjaWZkZWYgQ09ORklHX1NQQVJDCisJLyogU3VuIFNQQVJDIG1hY2hpbmVzIGNvdW50IHllYXJzIHNpbmNlIDE5NjggKi8KKwl0bS0+dG1feWVhciArPSA2ODsKKyNlbmRpZgorCS8qIHRtX21vbiBpcyAwLTExICovCisJdG0tPnRtX21vbiA9IGJjZDJiaW4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01PTlRIKSkgLSAxOworCisJdmFsID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X1dEQVkpOworCWlmICgodmFsICYgTTQ4VDU5X1dEQVlfQ0VCKSAmJiAodmFsICYgTTQ4VDU5X1dEQVlfQ0IpKQorCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIG9uZSBjZW50dXJ5ICovCisKKwl0bS0+dG1fbWRheSA9IGJjZDJiaW4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX0RBVEUpKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX0hPVVIpKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbihNNDhUNTlfUkVBRChNNDhUNTlfQUxBUk1fTUlOKSk7CisJdG0tPnRtX3NlYyA9IGJjZDJiaW4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX1NFQykpOworCisJLyogQ2xlYXIgdGhlIFJFQUQgYml0ICovCisJTTQ4VDU5X0NMRUFSX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkZXYsICJSVEMgcmVhZCBhbGFybSB0aW1lICUwNGQtJTAyZC0lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQl0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKKy8qCisgKiBTZXQgYWxhcm0gdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX3NldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCXU4IG1kYXksIGhvdXIsIG1pbiwgc2VjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHllYXIgPSB0bS0+dG1feWVhcjsKKworI2lmZGVmIENPTkZJR19TUEFSQworCS8qIFN1biBTUEFSQyBtYWNoaW5lcyBjb3VudCB5ZWFycyBzaW5jZSAxOTY4ICovCisJeWVhciAtPSA2ODsKKyNlbmRpZgorCisJLyogSWYgbm8gaXJxLCB3ZSBkb24ndCBzdXBwb3J0IEFMQVJNICovCisJaWYgKG00OHQ1OS0+aXJxID09IE5PX0lSUSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoeWVhciA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiAweGZmIG1lYW5zICJhbHdheXMgbWF0Y2giCisJICovCisJbWRheSA9IHRtLT50bV9tZGF5OworCW1kYXkgPSAobWRheSA+PSAxICYmIG1kYXkgPD0gMzEpID8gYmluMmJjZChtZGF5KSA6IDB4ZmY7CisJaWYgKG1kYXkgPT0gMHhmZikKKwkJbWRheSA9IE00OFQ1OV9SRUFEKE00OFQ1OV9NREFZKTsKKworCWhvdXIgPSB0bS0+dG1faG91cjsKKwlob3VyID0gKGhvdXIgPCAyNCkgPyBiaW4yYmNkKGhvdXIpIDogMHgwMDsKKworCW1pbiA9IHRtLT50bV9taW47CisJbWluID0gKG1pbiA8IDYwKSA/IGJpbjJiY2QobWluKSA6IDB4MDA7CisKKwlzZWMgPSB0bS0+dG1fc2VjOworCXNlYyA9IChzZWMgPCA2MCkgPyBiaW4yYmNkKHNlYykgOiAweDAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCS8qIElzc3VlIHRoZSBXUklURSBjb21tYW5kICovCisJTTQ4VDU5X1NFVF9CSVRTKE00OFQ1OV9DTlRMX1dSSVRFLCBNNDhUNTlfQ05UTCk7CisKKwlNNDhUNTlfV1JJVEUobWRheSwgTTQ4VDU5X0FMQVJNX0RBVEUpOworCU00OFQ1OV9XUklURShob3VyLCBNNDhUNTlfQUxBUk1fSE9VUik7CisJTTQ4VDU5X1dSSVRFKG1pbiwgTTQ4VDU5X0FMQVJNX01JTik7CisJTTQ4VDU5X1dSSVRFKHNlYywgTTQ4VDU5X0FMQVJNX1NFQyk7CisKKwkvKiBDbGVhciB0aGUgV1JJVEUgYml0ICovCisJTTQ4VDU5X0NMRUFSX0JJVFMoTTQ4VDU5X0NOVExfV1JJVEUsIE00OFQ1OV9DTlRMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoZGV2LCAiUlRDIHNldCBhbGFybSB0aW1lICUwNGQtJTAyZC0lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQl5ZWFyICsgMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmRsZSBjb21tYW5kcyBmcm9tIHVzZXItc3BhY2UKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCWlmIChlbmFibGVkKQorCQlNNDhUNTlfV1JJVEUoTTQ4VDU5X0lOVFJfQUZFLCBNNDhUNTlfSU5UUik7CisJZWxzZQorCQlNNDhUNTlfV1JJVEUoMHgwMCwgTTQ4VDU5X0lOVFIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJdmFsID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X0ZMQUdTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKworCXNlcV9wcmludGYoc2VxLCAiYmF0dGVyeVx0XHQ6ICVzXG4iLAorCQkgKHZhbCAmIE00OFQ1OV9GTEFHU19CRikgPyAibG93IiA6ICJub3JtYWwiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElSUSBoYW5kbGVyIGZvciB0aGUgUlRDCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtNDh0NTlfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gKHN0cnVjdCBkZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTggZXZlbnQ7CisKKwlzcGluX2xvY2soJm00OHQ1OS0+bG9jayk7CisJZXZlbnQgPSBNNDhUNTlfUkVBRChNNDhUNTlfRkxBR1MpOworCXNwaW5fdW5sb2NrKCZtNDh0NTktPmxvY2spOworCisJaWYgKGV2ZW50ICYgTTQ4VDU5X0ZMQUdTX0FGKSB7CisJCXJ0Y191cGRhdGVfaXJxKG00OHQ1OS0+cnRjLCAxLCAoUlRDX0FGIHwgUlRDX0lSUUYpKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG00OHQ1OV9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBtNDh0NTlfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBtNDh0NTlfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gbTQ4dDU5X3J0Y19yZWFkYWxhcm0sCisJLnNldF9hbGFybQk9IG00OHQ1OV9ydGNfc2V0YWxhcm0sCisJLnByb2MJCT0gbTQ4dDU5X3J0Y19wcm9jLAorCS5hbGFybV9pcnFfZW5hYmxlID0gbTQ4dDU5X3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG00OHQwMl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBtNDh0NTlfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBtNDh0NTlfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIHNzaXplX3QgbTQ4dDU5X252cmFtX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzc2l6ZV90IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoOyBzaXplID4gMCAmJiBwb3MgPCBwZGF0YS0+b2Zmc2V0OyBjbnQrKywgc2l6ZS0tKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkJKmJ1ZisrID0gTTQ4VDU5X1JFQUQoY250KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIHNzaXplX3QgbTQ4dDU5X252cmFtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3NpemVfdCBjbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmb3IgKDsgc2l6ZSA+IDAgJiYgcG9zIDwgcGRhdGEtPm9mZnNldDsgY250KyssIHNpemUtLSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJCU00OFQ1OV9XUklURSgqYnVmKyssIGNudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBtNDh0NTlfbnZyYW1fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAibnZyYW0iLAorCQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSLAorCX0sCisJLnJlYWQgPSBtNDh0NTlfbnZyYW1fcmVhZCwKKwkud3JpdGUgPSBtNDh0NTlfbnZyYW1fd3JpdGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtNDh0NTlfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBOVUxMOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQgPSAtRU5PTUVNOworCWNoYXIgKm5hbWU7CisJY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgKm9wczsKKworCS8qIFRoaXMgY2hpcCBjb3VsZCBiZSBtZW1vcnktbWFwcGVkIG9yIEkvTy1tYXBwZWQgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwkJaWYgKCFyZXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJLyogSWYgd2UgYXJlIEkvTy1tYXBwZWQsIHRoZSBwbGF0Zm9ybSBzaG91bGQgcHJvdmlkZQorCQkgKiB0aGUgb3BlcmF0aW9ucyBhY2Nlc3NpbmcgY2hpcCByZWdpc3RlcnMuCisJCSAqLworCQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+d3JpdGVfYnl0ZSB8fCAhcGRhdGEtPnJlYWRfYnl0ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCS8qIHdlIGFyZSBtZW1vcnktbWFwcGVkICovCisJCWlmICghcGRhdGEpIHsKKwkJCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXBkYXRhKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJLyogRW5zdXJlIHdlIG9ubHkga21hbGxvYyBwbGF0Zm9ybSBkYXRhIG9uY2UgKi8KKwkJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJCX0KKwkJaWYgKCFwZGF0YS0+dHlwZSkKKwkJCXBkYXRhLT50eXBlID0gTTQ4VDU5UlRDX1RZUEVfTTQ4VDU5OworCisJCS8qIFRyeSB0byB1c2UgdGhlIGdlbmVyaWMgbWVtb3J5IHJlYWQvd3JpdGUgb3BzICovCisJCWlmICghcGRhdGEtPndyaXRlX2J5dGUpCisJCQlwZGF0YS0+d3JpdGVfYnl0ZSA9IG00OHQ1OV9tZW1fd3JpdGViOworCQlpZiAoIXBkYXRhLT5yZWFkX2J5dGUpCisJCQlwZGF0YS0+cmVhZF9ieXRlID0gbTQ4dDU5X21lbV9yZWFkYjsKKwl9CisKKwltNDh0NTkgPSBremFsbG9jKHNpemVvZigqbTQ4dDU5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtNDh0NTkpCisJCXJldHVybiAtRU5PTUVNOworCisJbTQ4dDU5LT5pb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCisJaWYgKCFtNDh0NTktPmlvYWRkcikgeworCQkvKiBpb2FkZHIgbm90IG1hcHBlZCBleHRlcm5hbGx5ICovCisJCW00OHQ1OS0+aW9hZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCQlpZiAoIW00OHQ1OS0+aW9hZGRyKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogVHJ5IHRvIGdldCBpcnEgbnVtYmVyLiBXZSBhbHNvIGNhbiB3b3JrIGluCisJICogdGhlIG1vZGUgd2l0aG91dCBJUlEuCisJICovCisJbTQ4dDU5LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChtNDh0NTktPmlycSA8PSAwKQorCQltNDh0NTktPmlycSA9IE5PX0lSUTsKKworCWlmIChtNDh0NTktPmlycSAhPSBOT19JUlEpIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEobTQ4dDU5LT5pcnEsIG00OHQ1OV9ydGNfaW50ZXJydXB0LAorCQkJSVJRRl9TSEFSRUQsICJydGMtbTQ4dDU5IiwgJnBkZXYtPmRldik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisJc3dpdGNoIChwZGF0YS0+dHlwZSkgeworCWNhc2UgTTQ4VDU5UlRDX1RZUEVfTTQ4VDU5OgorCQluYW1lID0gIm00OHQ1OSI7CisJCW9wcyA9ICZtNDh0NTlfcnRjX29wczsKKwkJcGRhdGEtPm9mZnNldCA9IDB4MWZmMDsKKwkJYnJlYWs7CisJY2FzZSBNNDhUNTlSVENfVFlQRV9NNDhUMDI6CisJCW5hbWUgPSAibTQ4dDAyIjsKKwkJb3BzID0gJm00OHQwMl9ydGNfb3BzOworCQlwZGF0YS0+b2Zmc2V0ID0gMHg3ZjA7CisJCWJyZWFrOworCWNhc2UgTTQ4VDU5UlRDX1RZUEVfTTQ4VDA4OgorCQluYW1lID0gIm00OHQwOCI7CisJCW9wcyA9ICZtNDh0MDJfcnRjX29wczsKKwkJcGRhdGEtPm9mZnNldCA9IDB4MWZmMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBSVEMgdHlwZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCXNwaW5fbG9ja19pbml0KCZtNDh0NTktPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG00OHQ1OSk7CisKKwltNDh0NTktPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIobmFtZSwgJnBkZXYtPmRldiwgb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihtNDh0NTktPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihtNDh0NTktPnJ0Yyk7CisJCWdvdG8gb3V0OworCX0KKworCW00OHQ1OV9udnJhbV9hdHRyLnNpemUgPSBwZGF0YS0+b2Zmc2V0OworCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJm00OHQ1OV9udnJhbV9hdHRyKTsKKwlpZiAocmV0KSB7CisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihtNDh0NTktPnJ0Yyk7CisJCWdvdG8gb3V0OworCX0KKworCXJldHVybiAwOworCitvdXQ6CisJaWYgKG00OHQ1OS0+aXJxICE9IE5PX0lSUSkKKwkJZnJlZV9pcnEobTQ4dDU5LT5pcnEsICZwZGV2LT5kZXYpOworCWlmIChtNDh0NTktPmlvYWRkcikKKwkJaW91bm1hcChtNDh0NTktPmlvYWRkcik7CisJCWtmcmVlKG00OHQ1OSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbTQ4dDU5X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJm00OHQ1OV9udnJhbV9hdHRyKTsKKwlpZiAoIUlTX0VSUihtNDh0NTktPnJ0YykpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihtNDh0NTktPnJ0Yyk7CisJaWYgKG00OHQ1OS0+aW9hZGRyICYmICFwZGF0YS0+aW9hZGRyKQorCQlpb3VubWFwKG00OHQ1OS0+aW9hZGRyKTsKKwlpZiAobTQ4dDU5LT5pcnEgIT0gTk9fSVJRKQorCQlmcmVlX2lycShtNDh0NTktPmlycSwgJnBkZXYtPmRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUobTQ4dDU5KTsKKwlyZXR1cm4gMDsKK30KKworLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1tNDh0NTkiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbTQ4dDU5X3J0Y19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1tNDh0NTkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBtNDh0NTlfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobTQ4dDU5X3J0Y19yZW1vdmUpLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtNDh0NTlfcnRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgWmhhbiA8cm9uZ2thaS56aGFuQHdpbmRyaXZlci5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk00OFQ1OS9NNDhUMDIvTTQ4VDA4IFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tNDh0ODYuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tNDh0ODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjNmYjMzCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW00OHQ4Ni5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogU1QgTTQ4VDg2IC8gRGFsbGFzIERTMTI4ODcgUlRDIGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDA2IFRvd2VyIFRlY2hub2xvZ2llcworICoKKyAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGRyaXZlcnMgb25seSBzdXBwb3J0cyB0aGUgY2xvY2sgcnVubmluZyBpbiBCQ0QgYW5kIDI0SCBtb2RlLgorICogSWYgaXQgd2lsbCBiZSBldmVyIGFkYXB0ZWQgdG8gYmluYXJ5IGFuZCAxMkggbW9kZSwgY2FyZSBtdXN0IGJlIHRha2VuCisgKiB0byBub3QgaW50cm9kdWNlIGJ1Z3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L200OHQ4Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjZGVmaW5lIE00OFQ4Nl9SRUdfU0VDCQkweDAwCisjZGVmaW5lIE00OFQ4Nl9SRUdfU0VDQUxSTQkweDAxCisjZGVmaW5lIE00OFQ4Nl9SRUdfTUlOCQkweDAyCisjZGVmaW5lIE00OFQ4Nl9SRUdfTUlOQUxSTQkweDAzCisjZGVmaW5lIE00OFQ4Nl9SRUdfSE9VUgkJMHgwNAorI2RlZmluZSBNNDhUODZfUkVHX0hPVVJBTFJNCTB4MDUKKyNkZWZpbmUgTTQ4VDg2X1JFR19ET1cJCTB4MDYgLyogMSA9IHN1bmRheSAqLworI2RlZmluZSBNNDhUODZfUkVHX0RPTQkJMHgwNworI2RlZmluZSBNNDhUODZfUkVHX01PTlRICTB4MDggLyogMSAtIDEyICovCisjZGVmaW5lIE00OFQ4Nl9SRUdfWUVBUgkJMHgwOSAvKiAwIC0gOTkgKi8KKyNkZWZpbmUgTTQ4VDg2X1JFR19BCQkweDBBCisjZGVmaW5lIE00OFQ4Nl9SRUdfQgkJMHgwQgorI2RlZmluZSBNNDhUODZfUkVHX0MJCTB4MEMKKyNkZWZpbmUgTTQ4VDg2X1JFR19ECQkweDBECisKKyNkZWZpbmUgTTQ4VDg2X1JFR19CX0gyNAkoMSA8PCAxKQorI2RlZmluZSBNNDhUODZfUkVHX0JfRE0JCSgxIDw8IDIpCisjZGVmaW5lIE00OFQ4Nl9SRUdfQl9TRVQJKDEgPDwgNykKKyNkZWZpbmUgTTQ4VDg2X1JFR19EX1ZSVAkoMSA8PCA3KQorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEiCisKKworc3RhdGljIGludCBtNDh0ODZfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgY2hhciByZWc7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0ODZfb3BzICpvcHMgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXJlZyA9IG9wcy0+cmVhZGJ5dGUoTTQ4VDg2X1JFR19CKTsKKworCWlmIChyZWcgJiBNNDhUODZfUkVHX0JfRE0pIHsKKwkJLyogZGF0YSAoYmluYXJ5KSBtb2RlICovCisJCXRtLT50bV9zZWMJPSBvcHMtPnJlYWRieXRlKE00OFQ4Nl9SRUdfU0VDKTsKKwkJdG0tPnRtX21pbgk9IG9wcy0+cmVhZGJ5dGUoTTQ4VDg2X1JFR19NSU4pOworCQl0bS0+dG1faG91cgk9IG9wcy0+cmVhZGJ5dGUoTTQ4VDg2X1JFR19IT1VSKSAmIDB4M0Y7CisJCXRtLT50bV9tZGF5CT0gb3BzLT5yZWFkYnl0ZShNNDhUODZfUkVHX0RPTSk7CisJCS8qIHRtX21vbiBpcyAwLTExICovCisJCXRtLT50bV9tb24JPSBvcHMtPnJlYWRieXRlKE00OFQ4Nl9SRUdfTU9OVEgpIC0gMTsKKwkJdG0tPnRtX3llYXIJPSBvcHMtPnJlYWRieXRlKE00OFQ4Nl9SRUdfWUVBUikgKyAxMDA7CisJCXRtLT50bV93ZGF5CT0gb3BzLT5yZWFkYnl0ZShNNDhUODZfUkVHX0RPVyk7CisJfSBlbHNlIHsKKwkJLyogYmNkIG1vZGUgKi8KKwkJdG0tPnRtX3NlYwk9IGJjZDJiaW4ob3BzLT5yZWFkYnl0ZShNNDhUODZfUkVHX1NFQykpOworCQl0bS0+dG1fbWluCT0gYmNkMmJpbihvcHMtPnJlYWRieXRlKE00OFQ4Nl9SRUdfTUlOKSk7CisJCXRtLT50bV9ob3VyCT0gYmNkMmJpbihvcHMtPnJlYWRieXRlKE00OFQ4Nl9SRUdfSE9VUikgJiAweDNGKTsKKwkJdG0tPnRtX21kYXkJPSBiY2QyYmluKG9wcy0+cmVhZGJ5dGUoTTQ4VDg2X1JFR19ET00pKTsKKwkJLyogdG1fbW9uIGlzIDAtMTEgKi8KKwkJdG0tPnRtX21vbgk9IGJjZDJiaW4ob3BzLT5yZWFkYnl0ZShNNDhUODZfUkVHX01PTlRIKSkgLSAxOworCQl0bS0+dG1feWVhcgk9IGJjZDJiaW4ob3BzLT5yZWFkYnl0ZShNNDhUODZfUkVHX1lFQVIpKSArIDEwMDsKKwkJdG0tPnRtX3dkYXkJPSBiY2QyYmluKG9wcy0+cmVhZGJ5dGUoTTQ4VDg2X1JFR19ET1cpKTsKKwl9CisKKwkvKiBjb3JyZWN0IHRoZSBob3VyIGlmIHRoZSBjbG9jayBpcyBpbiAxMmggbW9kZSAqLworCWlmICghKHJlZyAmIE00OFQ4Nl9SRUdfQl9IMjQpKQorCQlpZiAob3BzLT5yZWFkYnl0ZShNNDhUODZfUkVHX0hPVVIpICYgMHg4MCkKKwkJCXRtLT50bV9ob3VyICs9IDEyOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgbTQ4dDg2X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgY2hhciByZWc7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0ODZfb3BzICpvcHMgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXJlZyA9IG9wcy0+cmVhZGJ5dGUoTTQ4VDg2X1JFR19CKTsKKworCS8qIHVwZGF0ZSBmbGFnIGFuZCAyNGggbW9kZSAqLworCXJlZyB8PSBNNDhUODZfUkVHX0JfU0VUIHwgTTQ4VDg2X1JFR19CX0gyNDsKKwlvcHMtPndyaXRlYnl0ZShyZWcsIE00OFQ4Nl9SRUdfQik7CisKKwlpZiAocmVnICYgTTQ4VDg2X1JFR19CX0RNKSB7CisJCS8qIGRhdGEgKGJpbmFyeSkgbW9kZSAqLworCQlvcHMtPndyaXRlYnl0ZSh0bS0+dG1fc2VjLCBNNDhUODZfUkVHX1NFQyk7CisJCW9wcy0+d3JpdGVieXRlKHRtLT50bV9taW4sIE00OFQ4Nl9SRUdfTUlOKTsKKwkJb3BzLT53cml0ZWJ5dGUodG0tPnRtX2hvdXIsIE00OFQ4Nl9SRUdfSE9VUik7CisJCW9wcy0+d3JpdGVieXRlKHRtLT50bV9tZGF5LCBNNDhUODZfUkVHX0RPTSk7CisJCW9wcy0+d3JpdGVieXRlKHRtLT50bV9tb24gKyAxLCBNNDhUODZfUkVHX01PTlRIKTsKKwkJb3BzLT53cml0ZWJ5dGUodG0tPnRtX3llYXIgJSAxMDAsIE00OFQ4Nl9SRUdfWUVBUik7CisJCW9wcy0+d3JpdGVieXRlKHRtLT50bV93ZGF5LCBNNDhUODZfUkVHX0RPVyk7CisJfSBlbHNlIHsKKwkJLyogYmNkIG1vZGUgKi8KKwkJb3BzLT53cml0ZWJ5dGUoYmluMmJjZCh0bS0+dG1fc2VjKSwgTTQ4VDg2X1JFR19TRUMpOworCQlvcHMtPndyaXRlYnl0ZShiaW4yYmNkKHRtLT50bV9taW4pLCBNNDhUODZfUkVHX01JTik7CisJCW9wcy0+d3JpdGVieXRlKGJpbjJiY2QodG0tPnRtX2hvdXIpLCBNNDhUODZfUkVHX0hPVVIpOworCQlvcHMtPndyaXRlYnl0ZShiaW4yYmNkKHRtLT50bV9tZGF5KSwgTTQ4VDg2X1JFR19ET00pOworCQlvcHMtPndyaXRlYnl0ZShiaW4yYmNkKHRtLT50bV9tb24gKyAxKSwgTTQ4VDg2X1JFR19NT05USCk7CisJCW9wcy0+d3JpdGVieXRlKGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApLCBNNDhUODZfUkVHX1lFQVIpOworCQlvcHMtPndyaXRlYnl0ZShiaW4yYmNkKHRtLT50bV93ZGF5KSwgTTQ4VDg2X1JFR19ET1cpOworCX0KKworCS8qIHVwZGF0ZSBlbmRlZCAqLworCXJlZyAmPSB+TTQ4VDg2X1JFR19CX1NFVDsKKwlvcHMtPndyaXRlYnl0ZShyZWcsIE00OFQ4Nl9SRUdfQik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtNDh0ODZfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ4Nl9vcHMgKm9wcyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJcmVnID0gb3BzLT5yZWFkYnl0ZShNNDhUODZfUkVHX0IpOworCisJc2VxX3ByaW50ZihzZXEsICJtb2RlXHRcdDogJXNcbiIsCisJCSAocmVnICYgTTQ4VDg2X1JFR19CX0RNKSA/ICJiaW5hcnkiIDogImJjZCIpOworCisJcmVnID0gb3BzLT5yZWFkYnl0ZShNNDhUODZfUkVHX0QpOworCisJc2VxX3ByaW50ZihzZXEsICJiYXR0ZXJ5XHRcdDogJXNcbiIsCisJCSAocmVnICYgTTQ4VDg2X1JFR19EX1ZSVCkgPyAib2siIDogImV4aGF1c3RlZCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtNDh0ODZfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gbTQ4dDg2X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gbTQ4dDg2X3J0Y19zZXRfdGltZSwKKwkucHJvYwkJPSBtNDh0ODZfcnRjX3Byb2MsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtNDh0ODZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKwlzdHJ1Y3QgbTQ4dDg2X29wcyAqb3BzID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibTQ4dDg2IiwKKwkJCQkmZGV2LT5kZXYsICZtNDh0ODZfcnRjX29wcywgVEhJU19NT0RVTEUpOworCisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBydGMpOworCisJLyogcmVhZCBiYXR0ZXJ5IHN0YXR1cyAqLworCXJlZyA9IG9wcy0+cmVhZGJ5dGUoTTQ4VDg2X1JFR19EKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJiYXR0ZXJ5ICVzXG4iLAorCQkocmVnICYgTTQ4VDg2X1JFR19EX1ZSVCkgPyAib2siIDogImV4aGF1c3RlZCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG00OHQ4Nl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworIAlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbTQ4dDg2X3J0Y19wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1tNDh0ODYiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBtNDh0ODZfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobTQ4dDg2X3J0Y19yZW1vdmUpLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtNDh0ODZfcnRjX3BsYXRmb3JtX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNNDhUODYgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtbTQ4dDg2Iik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1heDY5MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDBlMzMyCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1heDY5MDAuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIHJ0YyBjbGFzcyBkcml2ZXIgZm9yIHRoZSBNYXhpbSBNQVg2OTAwIGNoaXAKKyAqCisgKiBBdXRob3I6IERhbGUgRmFybnN3b3J0aCA8ZGFsZUBmYXJuc3dvcnRoLm9yZz4KKyAqCisgKiBiYXNlZCBvbiBwcmV2aW91c2x5IGV4aXN0aW5nIHJ0YyBjbGFzcyBkcml2ZXJzCisgKgorICogMjAwNyAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yIgorCisvKgorICogcmVnaXN0ZXIgaW5kaWNlcworICovCisjZGVmaW5lIE1BWDY5MDBfUkVHX1NDCQkJMAkvKiBzZWNvbmRzICAgICAgMDAtNTkgKi8KKyNkZWZpbmUgTUFYNjkwMF9SRUdfTU4JCQkxCS8qIG1pbnV0ZXMgICAgICAwMC01OSAqLworI2RlZmluZSBNQVg2OTAwX1JFR19IUgkJCTIJLyogaG91cnMgICAgICAgIDAwLTIzICovCisjZGVmaW5lIE1BWDY5MDBfUkVHX0RUCQkJMwkvKiBkYXkgb2YgbW9udGggMDAtMzEgKi8KKyNkZWZpbmUgTUFYNjkwMF9SRUdfTU8JCQk0CS8qIG1vbnRoICAgICAgICAwMS0xMiAqLworI2RlZmluZSBNQVg2OTAwX1JFR19EVwkJCTUJLyogZGF5IG9mIHdlZWsgICAxLTcgICovCisjZGVmaW5lIE1BWDY5MDBfUkVHX1lSCQkJNgkvKiB5ZWFyICAgICAgICAgMDAtOTkgKi8KKyNkZWZpbmUgTUFYNjkwMF9SRUdfQ1QJCQk3CS8qIGNvbnRyb2wgKi8KKwkJCQkJCS8qIHJlZ2lzdGVyIDggaXMgdW5kb2N1bWVudGVkICovCisjZGVmaW5lIE1BWDY5MDBfUkVHX0NFTlRVUlkJCTkJLyogY2VudHVyeSAqLworI2RlZmluZSBNQVg2OTAwX1JFR19MRU4JCQkxMAorCisjZGVmaW5lIE1BWDY5MDBfQlVSU1RfTEVOCQk4CS8qIGNhbiBidXJzdCByL3cgZmlyc3QgOCByZWdzICovCisKKyNkZWZpbmUgTUFYNjkwMF9SRUdfQ1RfV1AJCSgxIDw8IDcpCS8qIFdyaXRlIFByb3RlY3QgKi8KKworLyoKKyAqIHJlZ2lzdGVyIHJlYWQvd3JpdGUgY29tbWFuZHMKKyAqLworI2RlZmluZSBNQVg2OTAwX1JFR19DT05UUk9MX1dSSVRFCTB4OGUKKyNkZWZpbmUgTUFYNjkwMF9SRUdfQ0VOVFVSWV9XUklURQkweDkyCisjZGVmaW5lIE1BWDY5MDBfUkVHX0NFTlRVUllfUkVBRAkweDkzCisjZGVmaW5lIE1BWDY5MDBfUkVHX1JFU0VSVkVEX1JFQUQJMHg5NgorI2RlZmluZSBNQVg2OTAwX1JFR19CVVJTVF9XUklURQkJMHhiZQorI2RlZmluZSBNQVg2OTAwX1JFR19CVVJTVF9SRUFECQkweGJmCisKKyNkZWZpbmUgTUFYNjkwMF9JRExFX1RJTUVfQUZURVJfV1JJVEUJMwkvKiBzcGVjaWZpY2F0aW9uIHNheXMgMi41IG1TICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg2OTAwX2RyaXZlcjsKKworc3RhdGljIGludCBtYXg2OTAwX2kyY19yZWFkX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKmJ1ZikKK3sKKwl1OCByZWdfYnVyc3RfcmVhZFsxXSA9IHsgTUFYNjkwMF9SRUdfQlVSU1RfUkVBRCB9OworCXU4IHJlZ19jZW50dXJ5X3JlYWRbMV0gPSB7IE1BWDY5MDBfUkVHX0NFTlRVUllfUkVBRCB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbNF0gPSB7CisJCXsKKwkJIC5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkgLmZsYWdzID0gMCwJLyogd3JpdGUgKi8KKwkJIC5sZW4gPSBzaXplb2YocmVnX2J1cnN0X3JlYWQpLAorCQkgLmJ1ZiA9IHJlZ19idXJzdF9yZWFkfQorCQksCisJCXsKKwkJIC5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkgLmZsYWdzID0gSTJDX01fUkQsCisJCSAubGVuID0gTUFYNjkwMF9CVVJTVF9MRU4sCisJCSAuYnVmID0gYnVmfQorCQksCisJCXsKKwkJIC5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkgLmZsYWdzID0gMCwJLyogd3JpdGUgKi8KKwkJIC5sZW4gPSBzaXplb2YocmVnX2NlbnR1cnlfcmVhZCksCisJCSAuYnVmID0gcmVnX2NlbnR1cnlfcmVhZH0KKwkJLAorCQl7CisJCSAuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJIC5mbGFncyA9IEkyQ19NX1JELAorCQkgLmxlbiA9IHNpemVvZihidWZbTUFYNjkwMF9SRUdfQ0VOVFVSWV0pLAorCQkgLmJ1ZiA9ICZidWZbTUFYNjkwMF9SRUdfQ0VOVFVSWV0KKwkJIH0KKwl9OworCWludCByYzsKKworCXJjID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgQVJSQVlfU0laRShtc2dzKSk7CisJaWYgKHJjICE9IEFSUkFZX1NJWkUobXNncykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVnaXN0ZXIgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDY5MDBfaTJjX3dyaXRlX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29uc3QgKmJ1ZikKK3sKKwl1OCBpMmNfY2VudHVyeV9idWZbMSArIDFdID0geyBNQVg2OTAwX1JFR19DRU5UVVJZX1dSSVRFIH07CisJc3RydWN0IGkyY19tc2cgY2VudHVyeV9tc2dzWzFdID0geworCQl7CisJCSAuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJIC5mbGFncyA9IDAsCS8qIHdyaXRlICovCisJCSAubGVuID0gc2l6ZW9mKGkyY19jZW50dXJ5X2J1ZiksCisJCSAuYnVmID0gaTJjX2NlbnR1cnlfYnVmfQorCX07CisJdTggaTJjX2J1cnN0X2J1ZltNQVg2OTAwX0JVUlNUX0xFTiArIDFdID0geyBNQVg2OTAwX1JFR19CVVJTVF9XUklURSB9OworCXN0cnVjdCBpMmNfbXNnIGJ1cnN0X21zZ3NbMV0gPSB7CisJCXsKKwkJIC5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkgLmZsYWdzID0gMCwJLyogd3JpdGUgKi8KKwkJIC5sZW4gPSBzaXplb2YoaTJjX2J1cnN0X2J1ZiksCisJCSAuYnVmID0gaTJjX2J1cnN0X2J1Zn0KKwl9OworCWludCByYzsKKworCS8qCisJICogV2UgaGF2ZSB0byBtYWtlIHNlcGFyYXRlIGNhbGxzIHRvIGkyY190cmFuc2ZlciBiZWNhdXNlIG9mCisJICogdGhlIG5lZWQgdG8gZGVsYXkgYWZ0ZXIgZWFjaCB3cml0ZSB0byB0aGUgY2hpcC4gIEFsc28sCisJICogd2Ugd3JpdGUgdGhlIGNlbnR1cnkgYnl0ZSBmaXJzdCwgc2luY2Ugd2Ugc2V0IHRoZSB3cml0ZS1wcm90ZWN0CisJICogYml0IGFzIHBhcnQgb2YgdGhlIGJ1cnN0IHdyaXRlLgorCSAqLworCWkyY19jZW50dXJ5X2J1ZlsxXSA9IGJ1ZltNQVg2OTAwX1JFR19DRU5UVVJZXTsKKworCXJjID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgY2VudHVyeV9tc2dzLAorCQkJICBBUlJBWV9TSVpFKGNlbnR1cnlfbXNncykpOworCWlmIChyYyAhPSBBUlJBWV9TSVpFKGNlbnR1cnlfbXNncykpCisJCWdvdG8gd3JpdGVfZmFpbGVkOworCisJbXNsZWVwKE1BWDY5MDBfSURMRV9USU1FX0FGVEVSX1dSSVRFKTsKKworCW1lbWNweSgmaTJjX2J1cnN0X2J1ZlsxXSwgYnVmLCBNQVg2OTAwX0JVUlNUX0xFTik7CisKKwlyYyA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIGJ1cnN0X21zZ3MsIEFSUkFZX1NJWkUoYnVyc3RfbXNncykpOworCWlmIChyYyAhPSBBUlJBWV9TSVpFKGJ1cnN0X21zZ3MpKQorCQlnb3RvIHdyaXRlX2ZhaWxlZDsKKwltc2xlZXAoTUFYNjkwMF9JRExFX1RJTUVfQUZURVJfV1JJVEUpOworCisJcmV0dXJuIDA7CisKKyB3cml0ZV9mYWlsZWQ6CisJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVnaXN0ZXIgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbWF4NjkwMF9pMmNfcmVhZF90aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IHJjOworCXU4IHJlZ3NbTUFYNjkwMF9SRUdfTEVOXTsKKworCXJjID0gbWF4NjkwMF9pMmNfcmVhZF9yZWdzKGNsaWVudCwgcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4ocmVnc1tNQVg2OTAwX1JFR19TQ10pOworCXRtLT50bV9taW4gPSBiY2QyYmluKHJlZ3NbTUFYNjkwMF9SRUdfTU5dKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4ocmVnc1tNQVg2OTAwX1JFR19IUl0gJiAweDNmKTsKKwl0bS0+dG1fbWRheSA9IGJjZDJiaW4ocmVnc1tNQVg2OTAwX1JFR19EVF0pOworCXRtLT50bV9tb24gPSBiY2QyYmluKHJlZ3NbTUFYNjkwMF9SRUdfTU9dKSAtIDE7CisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHJlZ3NbTUFYNjkwMF9SRUdfWVJdKSArCisJCSAgICAgIGJjZDJiaW4ocmVnc1tNQVg2OTAwX1JFR19DRU5UVVJZXSkgKiAxMDAgLSAxOTAwOworCXRtLT50bV93ZGF5ID0gYmNkMmJpbihyZWdzW01BWDY5MDBfUkVHX0RXXSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBtYXg2OTAwX2kyY19jbGVhcl93cml0ZV9wcm90ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJjOworCXJjID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY5MDBfUkVHX0NPTlRST0xfV1JJVEUsIDApOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogY29udHJvbCByZWdpc3RlciB3cml0ZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWF4NjkwMF9pMmNfc2V0X3RpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lIGNvbnN0ICp0bSkKK3sKKwl1OCByZWdzW01BWDY5MDBfUkVHX0xFTl07CisJaW50IHJjOworCisJcmMgPSBtYXg2OTAwX2kyY19jbGVhcl93cml0ZV9wcm90ZWN0KGNsaWVudCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmVnc1tNQVg2OTAwX1JFR19TQ10gPSBiaW4yYmNkKHRtLT50bV9zZWMpOworCXJlZ3NbTUFYNjkwMF9SRUdfTU5dID0gYmluMmJjZCh0bS0+dG1fbWluKTsKKwlyZWdzW01BWDY5MDBfUkVHX0hSXSA9IGJpbjJiY2QodG0tPnRtX2hvdXIpOworCXJlZ3NbTUFYNjkwMF9SRUdfRFRdID0gYmluMmJjZCh0bS0+dG1fbWRheSk7CisJcmVnc1tNQVg2OTAwX1JFR19NT10gPSBiaW4yYmNkKHRtLT50bV9tb24gKyAxKTsKKwlyZWdzW01BWDY5MDBfUkVHX0RXXSA9IGJpbjJiY2QodG0tPnRtX3dkYXkpOworCXJlZ3NbTUFYNjkwMF9SRUdfWVJdID0gYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCk7CisJcmVnc1tNQVg2OTAwX1JFR19DRU5UVVJZXSA9IGJpbjJiY2QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApOworCS8qIHNldCB3cml0ZSBwcm90ZWN0ICovCisJcmVnc1tNQVg2OTAwX1JFR19DVF0gPSBNQVg2OTAwX1JFR19DVF9XUDsKKworCXJjID0gbWF4NjkwMF9pMmNfd3JpdGVfcmVncyhjbGllbnQsIHJlZ3MpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDY5MDBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIG1heDY5MDBfaTJjX3JlYWRfdGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludCBtYXg2OTAwX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIG1heDY5MDBfaTJjX3NldF90aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOworfQorCitzdGF0aWMgaW50IG1heDY5MDBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKHJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1heDY5MDBfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gbWF4NjkwMF9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IG1heDY5MDBfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGludAorbWF4NjkwMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImNoaXAgZm91bmQsIGRyaXZlciB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKG1heDY5MDBfZHJpdmVyLmRyaXZlci5uYW1lLAorCQkJCSAgJmNsaWVudC0+ZGV2LCAmbWF4NjkwMF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4NjkwMF9pZFtdID0geworCXsgIm1heDY5MDAiLCAwIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4NjkwMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAicnRjLW1heDY5MDAiLAorCQkgICB9LAorCS5wcm9iZSA9IG1heDY5MDBfcHJvYmUsCisJLnJlbW92ZSA9IG1heDY5MDBfcmVtb3ZlLAorCS5pZF90YWJsZSA9IG1heDY5MDBfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihtYXg2OTAwX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiTWF4aW0gTUFYNjkwMCBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJEYWxlIEZhcm5zd29ydGggPGRhbGVAZmFybnN3b3J0aC5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM3NGQyCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwpAQCAtMCwwICsxLDE2OCBAQAorLyogZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiA4RCBUZWNobm9sb2dpZXMgaW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0IENvbXB1bGFiIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERyaXZlciBmb3IgTUFYNjkwMiBzcGkgUlRDCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjZGVmaW5lIE1BWDY5MDJfUkVHX1NFQ09ORFMJCTB4MDEKKyNkZWZpbmUgTUFYNjkwMl9SRUdfTUlOVVRFUwkJMHgwMworI2RlZmluZSBNQVg2OTAyX1JFR19IT1VSUwkJMHgwNQorI2RlZmluZSBNQVg2OTAyX1JFR19EQVRFCQkweDA3CisjZGVmaW5lIE1BWDY5MDJfUkVHX01PTlRICQkweDA5CisjZGVmaW5lIE1BWDY5MDJfUkVHX0RBWQkJCTB4MEIKKyNkZWZpbmUgTUFYNjkwMl9SRUdfWUVBUgkJMHgwRAorI2RlZmluZSBNQVg2OTAyX1JFR19DT05UUk9MCQkweDBGCisjZGVmaW5lIE1BWDY5MDJfUkVHX0NFTlRVUlkJCTB4MTMKKworc3RhdGljIGludCBtYXg2OTAyX3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJCQkJdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisKKwkvKiBNU0IgbXVzdCBiZSAnMCcgdG8gd3JpdGUgKi8KKwlidWZbMF0gPSBhZGRyZXNzICYgMHg3ZjsKKwlidWZbMV0gPSBkYXRhOworCisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBidWYsIDIsIE5VTEwsIDApOworfQorCitzdGF0aWMgaW50IG1heDY5MDJfZ2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisKKwkvKiBTZXQgTVNCIHRvIGluZGljYXRlIHJlYWQgKi8KKwkqZGF0YSA9IGFkZHJlc3MgfCAweDgwOworCisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBkYXRhLCAxLCBkYXRhLCAxKTsKK30KKworc3RhdGljIGludCBtYXg2OTAyX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJaW50IGVyciwgY2VudHVyeTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXVuc2lnbmVkIGNoYXIgYnVmWzhdOworCisJYnVmWzBdID0gMHhiZjsJLyogQnVyc3QgcmVhZCAqLworCisJZXJyID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMSwgYnVmLCA4KTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBUaGUgY2hpcCBzZW5kcyBkYXRhIGluIHRoaXMgb3JkZXI6CisJICogU2Vjb25kcywgTWludXRlcywgSG91cnMsIERhdGUsIE1vbnRoLCBEYXksIFllYXIgKi8KKwlkdC0+dG1fc2VjCT0gYmNkMmJpbihidWZbMF0pOworCWR0LT50bV9taW4JPSBiY2QyYmluKGJ1ZlsxXSk7CisJZHQtPnRtX2hvdXIJPSBiY2QyYmluKGJ1ZlsyXSk7CisJZHQtPnRtX21kYXkJPSBiY2QyYmluKGJ1ZlszXSk7CisJZHQtPnRtX21vbgk9IGJjZDJiaW4oYnVmWzRdKSAtIDE7CisJZHQtPnRtX3dkYXkJPSBiY2QyYmluKGJ1Zls1XSk7CisJZHQtPnRtX3llYXIJPSBiY2QyYmluKGJ1Zls2XSk7CisKKwkvKiBSZWFkIGNlbnR1cnkgKi8KKwllcnIgPSBtYXg2OTAyX2dldF9yZWcoZGV2LCBNQVg2OTAyX1JFR19DRU5UVVJZLCAmYnVmWzBdKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiBlcnI7CisKKwljZW50dXJ5ID0gYmNkMmJpbihidWZbMF0pICogMTAwOworCisJZHQtPnRtX3llYXIgKz0gY2VudHVyeTsKKwlkdC0+dG1feWVhciAtPSAxOTAwOworCisJcmV0dXJuIHJ0Y192YWxpZF90bShkdCk7Cit9CisKK3N0YXRpYyBpbnQgbWF4NjkwMl9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJZHQtPnRtX3llYXIgPSBkdC0+dG1feWVhciArIDE5MDA7CisKKwkvKiBSZW1vdmUgd3JpdGUgcHJvdGVjdGlvbiAqLworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4RiwgMCk7CisKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDAxLCBiaW4yYmNkKGR0LT50bV9zZWMpKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDAzLCBiaW4yYmNkKGR0LT50bV9taW4pKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA1LCBiaW4yYmNkKGR0LT50bV9ob3VyKSk7CisKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA3LCBiaW4yYmNkKGR0LT50bV9tZGF5KSk7CisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwOSwgYmluMmJjZChkdC0+dG1fbW9uICsgMSkpOworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MEIsIGJpbjJiY2QoZHQtPnRtX3dkYXkpKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDBELCBiaW4yYmNkKGR0LT50bV95ZWFyICUgMTAwKSk7CisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgxMywgYmluMmJjZChkdC0+dG1feWVhciAvIDEwMCkpOworCisJLyogQ29tcHVsYWIgdXNlZCBhIGRlbGF5IGhlcmUuIEhvd2V2ZXIsIHRoZSBkYXRhc2hlZXQKKwkgKiBkb2VzIG5vdCBtZW50aW9uIGEgZGVsYXkgYmVpbmcgcmVxdWlyZWQgYW55d2hlcmUuLi4gKi8KKwkvKiBkZWxheSgyMDAwKTsgKi8KKworCS8qIFdyaXRlIHByb3RlY3QgKi8KKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweEYsIDB4ODApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtYXg2OTAyX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IG1heDY5MDJfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG1heDY5MDJfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYXg2OTAyX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgcmVzOworCisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCisJcmVzID0gbWF4NjkwMl9nZXRfcmVnKCZzcGktPmRldiwgTUFYNjkwMl9SRUdfU0VDT05EUywgJnRtcCk7CisJaWYgKHJlcyAhPSAwKQorCQlyZXR1cm4gcmVzOworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibWF4NjkwMiIsCisJCQkJJnNwaS0+ZGV2LCAmbWF4NjkwMl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgcnRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWF4NjkwMl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1heDY5MDJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJ0Yy1tYXg2OTAyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSBtYXg2OTAyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtYXg2OTAyX3JlbW92ZSksCit9OworCittb2R1bGVfc3BpX2RyaXZlcihtYXg2OTAyX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTiAoIm1heDY5MDIgc3BpIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IgKCJSYXBoYWVsIEFzc2VuYXQiKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfQUxJQVMoInNwaTpydGMtbWF4NjkwMiIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1heDg5MjUuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tYXg4OTI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1OTA1NQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tYXg4OTI1LmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBSVEMgZHJpdmVyIGZvciBNYXhpbSBNQVg4OTI1CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqCUhhb2ppYW4gWmh1YW5nIDxoYW9qaWFuLnpodWFuZ0BtYXJ2ZWxsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5MjUuaD4KKworZW51bSB7CisJUlRDX1NFQyA9IDAsCisJUlRDX01JTiwKKwlSVENfSE9VUiwKKwlSVENfV0VFS0RBWSwKKwlSVENfREFURSwKKwlSVENfTU9OVEgsCisJUlRDX1lFQVIxLAorCVJUQ19ZRUFSMiwKK307CisKKyNkZWZpbmUgTUFYODkyNV9SVENfU0VDCQkJMHgwMAorI2RlZmluZSBNQVg4OTI1X1JUQ19NSU4JCQkweDAxCisjZGVmaW5lIE1BWDg5MjVfUlRDX0hPVVIJCTB4MDIKKyNkZWZpbmUgTUFYODkyNV9SVENfV0VFS0RBWQkJMHgwMworI2RlZmluZSBNQVg4OTI1X1JUQ19EQVRFCQkweDA0CisjZGVmaW5lIE1BWDg5MjVfUlRDX01PTlRICQkweDA1CisjZGVmaW5lIE1BWDg5MjVfUlRDX1lFQVIxCQkweDA2CisjZGVmaW5lIE1BWDg5MjVfUlRDX1lFQVIyCQkweDA3CisjZGVmaW5lIE1BWDg5MjVfQUxBUk0wX1NFQwkJMHgwOAorI2RlZmluZSBNQVg4OTI1X0FMQVJNMF9NSU4JCTB4MDkKKyNkZWZpbmUgTUFYODkyNV9BTEFSTTBfSE9VUgkJMHgwYQorI2RlZmluZSBNQVg4OTI1X0FMQVJNMF9XRUVLREFZCQkweDBiCisjZGVmaW5lIE1BWDg5MjVfQUxBUk0wX0RBVEUJCTB4MGMKKyNkZWZpbmUgTUFYODkyNV9BTEFSTTBfTU9OCQkweDBkCisjZGVmaW5lIE1BWDg5MjVfQUxBUk0wX1lFQVIxCQkweDBlCisjZGVmaW5lIE1BWDg5MjVfQUxBUk0wX1lFQVIyCQkweDBmCisjZGVmaW5lIE1BWDg5MjVfQUxBUk0xX1NFQwkJMHgxMAorI2RlZmluZSBNQVg4OTI1X0FMQVJNMV9NSU4JCTB4MTEKKyNkZWZpbmUgTUFYODkyNV9BTEFSTTFfSE9VUgkJMHgxMgorI2RlZmluZSBNQVg4OTI1X0FMQVJNMV9XRUVLREFZCQkweDEzCisjZGVmaW5lIE1BWDg5MjVfQUxBUk0xX0RBVEUJCTB4MTQKKyNkZWZpbmUgTUFYODkyNV9BTEFSTTFfTU9OCQkweDE1CisjZGVmaW5lIE1BWDg5MjVfQUxBUk0xX1lFQVIxCQkweDE2CisjZGVmaW5lIE1BWDg5MjVfQUxBUk0xX1lFQVIyCQkweDE3CisjZGVmaW5lIE1BWDg5MjVfUlRDX0NOVEwJCTB4MWIKKyNkZWZpbmUgTUFYODkyNV9SVENfU1RBVFVTCQkweDIwCisKKyNkZWZpbmUgVElNRV9OVU0JCQk4CisjZGVmaW5lIEFMQVJNXzFTRUMJCQkoMSA8PCA3KQorI2RlZmluZSBIT1VSXzEyCQkJCSgxIDw8IDcpCisjZGVmaW5lIEhPVVJfQU1fUE0JCQkoMSA8PCA1KQorI2RlZmluZSBBTEFSTTBfSVJRCQkJKDEgPDwgMykKKyNkZWZpbmUgQUxBUk0xX0lSUQkJCSgxIDw8IDIpCisjZGVmaW5lIEFMQVJNMF9TVEFUVVMJCQkoMSA8PCAyKQorI2RlZmluZSBBTEFSTTFfU1RBVFVTCQkJKDEgPDwgMSkKKworCitzdHJ1Y3QgbWF4ODkyNV9ydGNfaW5mbyB7CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0Y19kZXY7CisJc3RydWN0IG1heDg5MjVfY2hpcAkqY2hpcDsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqcnRjOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcnRjX3VwZGF0ZV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1heDg5MjVfcnRjX2luZm8gKmluZm8gPSAoc3RydWN0IG1heDg5MjVfcnRjX2luZm8gKilkYXRhOworCisJLyogZGlzYWJsZSBBTEFSTTAgZXhjZXB0IGZvciAxU0VDIGFsYXJtICovCisJbWF4ODkyNV9zZXRfYml0cyhpbmZvLT5ydGMsIE1BWDg5MjVfQUxBUk0wX0NOVEwsIDB4N2YsIDApOworCXJ0Y191cGRhdGVfaXJxKGluZm8tPnJ0Y19kZXYsIDEsIFJUQ19JUlFGIHwgUlRDX0FGKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdG1fY2FsYyhzdHJ1Y3QgcnRjX3RpbWUgKnRtLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaWYgKGxlbiA8IFRJTUVfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0bS0+dG1feWVhciA9IChidWZbUlRDX1lFQVIyXSA+PiA0KSAqIDEwMDAKKwkJCSsgKGJ1ZltSVENfWUVBUjJdICYgMHhmKSAqIDEwMAorCQkJKyAoYnVmW1JUQ19ZRUFSMV0gPj4gNCkgKiAxMAorCQkJKyAoYnVmW1JUQ19ZRUFSMV0gJiAweGYpOworCXRtLT50bV95ZWFyIC09IDE5MDA7CisJdG0tPnRtX21vbiA9ICgoYnVmW1JUQ19NT05USF0gPj4gNCkgJiAweDAxKSAqIDEwCisJCQkrIChidWZbUlRDX01PTlRIXSAmIDB4MGYpOworCXRtLT50bV9tZGF5ID0gKChidWZbUlRDX0RBVEVdID4+IDQpICYgMHgwMykgKiAxMAorCQkJKyAoYnVmW1JUQ19EQVRFXSAmIDB4MGYpOworCXRtLT50bV93ZGF5ID0gYnVmW1JUQ19XRUVLREFZXSAmIDB4MDc7CisJaWYgKGJ1ZltSVENfSE9VUl0gJiBIT1VSXzEyKSB7CisJCXRtLT50bV9ob3VyID0gKChidWZbUlRDX0hPVVJdID4+IDQpICYgMHgxKSAqIDEwCisJCQkJKyAoYnVmW1JUQ19IT1VSXSAmIDB4MGYpOworCQlpZiAoYnVmW1JUQ19IT1VSXSAmIEhPVVJfQU1fUE0pCisJCQl0bS0+dG1faG91ciArPSAxMjsKKwl9IGVsc2UKKwkJdG0tPnRtX2hvdXIgPSAoKGJ1ZltSVENfSE9VUl0gPj4gNCkgJiAweDAzKSAqIDEwCisJCQkJKyAoYnVmW1JUQ19IT1VSXSAmIDB4MGYpOworCXRtLT50bV9taW4gPSAoKGJ1ZltSVENfTUlOXSA+PiA0KSAmIDB4NykgKiAxMAorCQkJKyAoYnVmW1JUQ19NSU5dICYgMHgwZik7CisJdG0tPnRtX3NlYyA9ICgoYnVmW1JUQ19TRUNdID4+IDQpICYgMHg3KSAqIDEwCisJCQkrIChidWZbUlRDX1NFQ10gJiAweDBmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXRhX2NhbGModW5zaWduZWQgY2hhciAqYnVmLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgaGlnaCwgbG93OworCisJaWYgKGxlbiA8IFRJTUVfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhpZ2ggPSAodG0tPnRtX3llYXIgKyAxOTAwKSAvIDEwMDA7CisJbG93ID0gKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDA7CisJbG93ID0gbG93IC0gaGlnaCAqIDEwOworCWJ1ZltSVENfWUVBUjJdID0gKGhpZ2ggPDwgNCkgKyBsb3c7CisJaGlnaCA9ICh0bS0+dG1feWVhciArIDE5MDApIC8gMTA7CisJbG93ID0gdG0tPnRtX3llYXIgKyAxOTAwOworCWxvdyA9IGxvdyAtIGhpZ2ggKiAxMDsKKwloaWdoID0gaGlnaCAtIChoaWdoIC8gMTApICogMTA7CisJYnVmW1JUQ19ZRUFSMV0gPSAoaGlnaCA8PCA0KSArIGxvdzsKKwloaWdoID0gdG0tPnRtX21vbiAvIDEwOworCWxvdyA9IHRtLT50bV9tb247CisJbG93ID0gbG93IC0gaGlnaCAqIDEwOworCWJ1ZltSVENfTU9OVEhdID0gKGhpZ2ggPDwgNCkgKyBsb3c7CisJaGlnaCA9IHRtLT50bV9tZGF5IC8gMTA7CisJbG93ID0gdG0tPnRtX21kYXk7CisJbG93ID0gbG93IC0gaGlnaCAqIDEwOworCWJ1ZltSVENfREFURV0gPSAoaGlnaCA8PCA0KSArIGxvdzsKKwlidWZbUlRDX1dFRUtEQVldID0gdG0tPnRtX3dkYXk7CisJaGlnaCA9IHRtLT50bV9ob3VyIC8gMTA7CisJbG93ID0gdG0tPnRtX2hvdXI7CisJbG93ID0gbG93IC0gaGlnaCAqIDEwOworCWJ1ZltSVENfSE9VUl0gPSAoaGlnaCA8PCA0KSArIGxvdzsKKwloaWdoID0gdG0tPnRtX21pbiAvIDEwOworCWxvdyA9IHRtLT50bV9taW47CisJbG93ID0gbG93IC0gaGlnaCAqIDEwOworCWJ1ZltSVENfTUlOXSA9IChoaWdoIDw8IDQpICsgbG93OworCWhpZ2ggPSB0bS0+dG1fc2VjIC8gMTA7CisJbG93ID0gdG0tPnRtX3NlYzsKKwlsb3cgPSBsb3cgLSBoaWdoICogMTA7CisJYnVmW1JUQ19TRUNdID0gKGhpZ2ggPDwgNCkgKyBsb3c7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4ODkyNV9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgbWF4ODkyNV9ydGNfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgYnVmW1RJTUVfTlVNXTsKKwlpbnQgcmV0OworCisJcmV0ID0gbWF4ODkyNV9idWxrX3JlYWQoaW5mby0+cnRjLCBNQVg4OTI1X1JUQ19TRUMsIFRJTUVfTlVNLCBidWYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSB0bV9jYWxjKHRtLCBidWYsIFRJTUVfTlVNKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDg5MjVfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgbWF4ODkyNV9ydGNfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgYnVmW1RJTUVfTlVNXTsKKwlpbnQgcmV0OworCisJcmV0ID0gZGF0YV9jYWxjKGJ1ZiwgdG0sIFRJTUVfTlVNKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gbWF4ODkyNV9idWxrX3dyaXRlKGluZm8tPnJ0YywgTUFYODkyNV9SVENfU0VDLCBUSU1FX05VTSwgYnVmKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDg5MjVfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgbWF4ODkyNV9ydGNfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgYnVmW1RJTUVfTlVNXTsKKwlpbnQgcmV0OworCisJcmV0ID0gbWF4ODkyNV9idWxrX3JlYWQoaW5mby0+cnRjLCBNQVg4OTI1X0FMQVJNMF9TRUMsIFRJTUVfTlVNLCBidWYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSB0bV9jYWxjKCZhbHJtLT50aW1lLCBidWYsIFRJTUVfTlVNKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gbWF4ODkyNV9yZWdfcmVhZChpbmZvLT5ydGMsIE1BWDg5MjVfUlRDX0lSUV9NQVNLKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHJldCAmIEFMQVJNMF9JUlEpIHsKKwkJYWxybS0+ZW5hYmxlZCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gbWF4ODkyNV9yZWdfcmVhZChpbmZvLT5ydGMsIE1BWDg5MjVfQUxBUk0wX0NOVEwpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlpZiAoIXJldCkKKwkJCWFscm0tPmVuYWJsZWQgPSAwOworCQllbHNlCisJCQlhbHJtLT5lbmFibGVkID0gMTsKKwl9CisJcmV0ID0gbWF4ODkyNV9yZWdfcmVhZChpbmZvLT5ydGMsIE1BWDg5MjVfUlRDX1NUQVRVUyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWlmIChyZXQgJiBBTEFSTTBfU1RBVFVTKQorCQlhbHJtLT5wZW5kaW5nID0gMTsKKwllbHNlCisJCWFscm0tPnBlbmRpbmcgPSAwOworCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4ODkyNV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IG1heDg5MjVfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltUSU1FX05VTV07CisJaW50IHJldDsKKworCXJldCA9IGRhdGFfY2FsYyhidWYsICZhbHJtLT50aW1lLCBUSU1FX05VTSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IG1heDg5MjVfYnVsa193cml0ZShpbmZvLT5ydGMsIE1BWDg5MjVfQUxBUk0wX1NFQywgVElNRV9OVU0sIGJ1Zik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWlmIChhbHJtLT5lbmFibGVkKQorCQkvKiBvbmx5IGVuYWJsZSBhbGFybSBvbiB5ZWFyL21vbnRoL2RheS9ob3VyL21pbi9zZWMgKi8KKwkJcmV0ID0gbWF4ODkyNV9yZWdfd3JpdGUoaW5mby0+cnRjLCBNQVg4OTI1X0FMQVJNMF9DTlRMLCAweDc3KTsKKwllbHNlCisJCXJldCA9IG1heDg5MjVfcmVnX3dyaXRlKGluZm8tPnJ0YywgTUFYODkyNV9BTEFSTTBfQ05UTCwgMHgwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1heDg5MjVfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gbWF4ODkyNV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG1heDg5MjVfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gbWF4ODkyNV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gbWF4ODkyNV9ydGNfc2V0X2FsYXJtLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbWF4ODkyNV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWF4ODkyNV9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBtYXg4OTI1X3J0Y19pbmZvICppbmZvOworCWludCBpcnEsIHJldDsKKworCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4ODkyNV9ydGNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5mby0+Y2hpcCA9IGNoaXA7CisJaW5mby0+cnRjID0gY2hpcC0+cnRjOworCWluZm8tPmRldiA9ICZwZGV2LT5kZXY7CisJaXJxID0gY2hpcC0+aXJxX2Jhc2UgKyBNQVg4OTI1X0lSUV9SVENfQUxBUk0wOworCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCBOVUxMLCBydGNfdXBkYXRlX2hhbmRsZXIsCisJCQkJICAgSVJRRl9PTkVTSE9ULCAicnRjLWFsYXJtMCIsIGluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJROiAjJWQ6ICVkXG4iLAorCQkJaXJxLCByZXQpOworCQlnb3RvIG91dF9pcnE7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGluZm8pOworCS8qIFhYWCAtIGlzbid0IHRoaXMgcmVkdW5kYW50PyAqLworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCisJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCisJaW5mby0+cnRjX2RldiA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoIm1heDg5MjUtcnRjIiwgJnBkZXYtPmRldiwKKwkJCQkJJm1heDg5MjVfcnRjX29wcywgVEhJU19NT0RVTEUpOworCXJldCA9IFBUUl9FUlIoaW5mby0+cnRjX2Rldik7CisJaWYgKElTX0VSUihpbmZvLT5ydGNfZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlRDIGRldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X3J0YzsKKwl9CisKKwlyZXR1cm4gMDsKK291dF9ydGM6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9pcnEoY2hpcC0+aXJxX2Jhc2UgKyBNQVg4OTI1X0lSUV9SVENfQUxBUk0wLCBpbmZvKTsKK291dF9pcnE6CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWF4ODkyNV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1heDg5MjVfcnRjX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChpbmZvKSB7CisJCWZyZWVfaXJxKGluZm8tPmNoaXAtPmlycV9iYXNlICsgTUFYODkyNV9JUlFfUlRDX0FMQVJNMCwgaW5mbyk7CisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihpbmZvLT5ydGNfZGV2KTsKKwkJa2ZyZWUoaW5mbyk7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IG1heDg5MjVfcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbWF4ODkyNV9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWNoaXAtPndha2V1cF9mbGFnIHw9IDEgPDwgTUFYODkyNV9JUlFfUlRDX0FMQVJNMDsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgbWF4ODkyNV9ydGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG1heDg5MjVfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQljaGlwLT53YWtldXBfZmxhZyAmPSB+KDEgPDwgTUFYODkyNV9JUlFfUlRDX0FMQVJNMCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1heDg5MjVfcnRjX3BtX29wcywgbWF4ODkyNV9ydGNfc3VzcGVuZCwgbWF4ODkyNV9ydGNfcmVzdW1lKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4ODkyNV9ydGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYXg4OTI1LXJ0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0gICAgID0gJm1heDg5MjVfcnRjX3BtX29wcywKKwl9LAorCS5wcm9iZQkJPSBtYXg4OTI1X3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1heDg5MjVfcnRjX3JlbW92ZSksCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1heDg5MjVfcnRjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiTWF4aW0gTUFYODkyNSBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tYXg4OTk4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbWF4ODk5OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTZmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbWF4ODk5OC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogUlRDIGRyaXZlciBmb3IgTWF4aW0gTUFYODk5OAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAorICogQXV0aG9yOiBNaW5reXUgS2FuZyA8bWs3LmthbmdAc2Ftc3VuZy5jb20+CisgKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5OC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk4LXByaXZhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjZGVmaW5lIE1BWDg5OThfUlRDX1NFQwkJCTB4MDAKKyNkZWZpbmUgTUFYODk5OF9SVENfTUlOCQkJMHgwMQorI2RlZmluZSBNQVg4OTk4X1JUQ19IT1VSCQkweDAyCisjZGVmaW5lIE1BWDg5OThfUlRDX1dFRUtEQVkJCTB4MDMKKyNkZWZpbmUgTUFYODk5OF9SVENfREFURQkJMHgwNAorI2RlZmluZSBNQVg4OTk4X1JUQ19NT05USAkJMHgwNQorI2RlZmluZSBNQVg4OTk4X1JUQ19ZRUFSMQkJMHgwNgorI2RlZmluZSBNQVg4OTk4X1JUQ19ZRUFSMgkJMHgwNworI2RlZmluZSBNQVg4OTk4X0FMQVJNMF9TRUMJCTB4MDgKKyNkZWZpbmUgTUFYODk5OF9BTEFSTTBfTUlOCQkweDA5CisjZGVmaW5lIE1BWDg5OThfQUxBUk0wX0hPVVIJCTB4MGEKKyNkZWZpbmUgTUFYODk5OF9BTEFSTTBfV0VFS0RBWQkJMHgwYgorI2RlZmluZSBNQVg4OTk4X0FMQVJNMF9EQVRFCQkweDBjCisjZGVmaW5lIE1BWDg5OThfQUxBUk0wX01PTlRICQkweDBkCisjZGVmaW5lIE1BWDg5OThfQUxBUk0wX1lFQVIxCQkweDBlCisjZGVmaW5lIE1BWDg5OThfQUxBUk0wX1lFQVIyCQkweDBmCisjZGVmaW5lIE1BWDg5OThfQUxBUk0xX1NFQwkJMHgxMAorI2RlZmluZSBNQVg4OTk4X0FMQVJNMV9NSU4JCTB4MTEKKyNkZWZpbmUgTUFYODk5OF9BTEFSTTFfSE9VUgkJMHgxMgorI2RlZmluZSBNQVg4OTk4X0FMQVJNMV9XRUVLREFZCQkweDEzCisjZGVmaW5lIE1BWDg5OThfQUxBUk0xX0RBVEUJCTB4MTQKKyNkZWZpbmUgTUFYODk5OF9BTEFSTTFfTU9OVEgJCTB4MTUKKyNkZWZpbmUgTUFYODk5OF9BTEFSTTFfWUVBUjEJCTB4MTYKKyNkZWZpbmUgTUFYODk5OF9BTEFSTTFfWUVBUjIJCTB4MTcKKyNkZWZpbmUgTUFYODk5OF9BTEFSTTBfQ09ORgkJMHgxOAorI2RlZmluZSBNQVg4OTk4X0FMQVJNMV9DT05GCQkweDE5CisjZGVmaW5lIE1BWDg5OThfUlRDX1NUQVRVUwkJMHgxYQorI2RlZmluZSBNQVg4OTk4X1dUU1JfU01QTF9DTlRMCQkweDFiCisjZGVmaW5lIE1BWDg5OThfVEVTVAkJCTB4MWYKKworI2RlZmluZSBIT1VSXzEyCQkJCSgxIDw8IDcpCisjZGVmaW5lIEhPVVJfUE0JCQkJKDEgPDwgNSkKKyNkZWZpbmUgQUxBUk0wX1NUQVRVUwkJCSgxIDw8IDEpCisjZGVmaW5lIEFMQVJNMV9TVEFUVVMJCQkoMSA8PCAyKQorCitlbnVtIHsKKwlSVENfU0VDID0gMCwKKwlSVENfTUlOLAorCVJUQ19IT1VSLAorCVJUQ19XRUVLREFZLAorCVJUQ19EQVRFLAorCVJUQ19NT05USCwKKwlSVENfWUVBUjEsCisJUlRDX1lFQVIyLAorfTsKKworc3RydWN0IG1heDg5OThfcnRjX2luZm8geworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IG1heDg5OThfZGV2CSptYXg4OTk4OworCXN0cnVjdCBpMmNfY2xpZW50CSpydGM7CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0Y19kZXY7CisJaW50IGlycTsKKwlib29sIGxwMzk3NF9idWdfd29ya2Fyb3VuZDsKK307CisKK3N0YXRpYyB2b2lkIG1heDg5OThfZGF0YV90b190bSh1OCAqZGF0YSwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihkYXRhW1JUQ19TRUNdKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbihkYXRhW1JUQ19NSU5dKTsKKwlpZiAoZGF0YVtSVENfSE9VUl0gJiBIT1VSXzEyKSB7CisJCXRtLT50bV9ob3VyID0gYmNkMmJpbihkYXRhW1JUQ19IT1VSXSAmIDB4MWYpOworCQlpZiAoZGF0YVtSVENfSE9VUl0gJiBIT1VSX1BNKQorCQkJdG0tPnRtX2hvdXIgKz0gMTI7CisJfSBlbHNlCisJCXRtLT50bV9ob3VyID0gYmNkMmJpbihkYXRhW1JUQ19IT1VSXSAmIDB4M2YpOworCisJdG0tPnRtX3dkYXkgPSBkYXRhW1JUQ19XRUVLREFZXSAmIDB4MDc7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGRhdGFbUlRDX0RBVEVdKTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihkYXRhW1JUQ19NT05USF0pOworCXRtLT50bV95ZWFyID0gYmNkMmJpbihkYXRhW1JUQ19ZRUFSMV0pICsgYmNkMmJpbihkYXRhW1JUQ19ZRUFSMl0pICogMTAwOworCXRtLT50bV95ZWFyIC09IDE5MDA7Cit9CisKK3N0YXRpYyB2b2lkIG1heDg5OThfdG1fdG9fZGF0YShzdHJ1Y3QgcnRjX3RpbWUgKnRtLCB1OCAqZGF0YSkKK3sKKwlkYXRhW1JUQ19TRUNdID0gYmluMmJjZCh0bS0+dG1fc2VjKTsKKwlkYXRhW1JUQ19NSU5dID0gYmluMmJjZCh0bS0+dG1fbWluKTsKKwlkYXRhW1JUQ19IT1VSXSA9IGJpbjJiY2QodG0tPnRtX2hvdXIpOworCWRhdGFbUlRDX1dFRUtEQVldID0gdG0tPnRtX3dkYXk7CisJZGF0YVtSVENfREFURV0gPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlkYXRhW1JUQ19NT05USF0gPSBiaW4yYmNkKHRtLT50bV9tb24pOworCWRhdGFbUlRDX1lFQVIxXSA9IGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApOworCWRhdGFbUlRDX1lFQVIyXSA9IGJpbjJiY2QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApOworfQorCitzdGF0aWMgaW50IG1heDg5OThfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IG1heDg5OThfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCBkYXRhWzhdOworCWludCByZXQ7CisKKwlyZXQgPSBtYXg4OTk4X2J1bGtfcmVhZChpbmZvLT5ydGMsIE1BWDg5OThfUlRDX1NFQywgOCwgZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltYXg4OTk4X2RhdGFfdG9fdG0oZGF0YSwgdG0pOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgbWF4ODk5OF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBtYXg4OTk4X3J0Y19pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggZGF0YVs4XTsKKwlpbnQgcmV0OworCisJbWF4ODk5OF90bV90b19kYXRhKHRtLCBkYXRhKTsKKworCXJldCA9IG1heDg5OThfYnVsa193cml0ZShpbmZvLT5ydGMsIE1BWDg5OThfUlRDX1NFQywgOCwgZGF0YSk7CisKKwlpZiAoaW5mby0+bHAzOTc0X2J1Z193b3JrYXJvdW5kKQorCQltc2xlZXAoMjAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDg5OThfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgbWF4ODk5OF9ydGNfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4IGRhdGFbOF07CisJdTggdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBtYXg4OTk4X2J1bGtfcmVhZChpbmZvLT5ydGMsIE1BWDg5OThfQUxBUk0wX1NFQywgOCwgZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltYXg4OTk4X2RhdGFfdG9fdG0oZGF0YSwgJmFscm0tPnRpbWUpOworCisJcmV0ID0gbWF4ODk5OF9yZWFkX3JlZyhpbmZvLT5ydGMsIE1BWDg5OThfQUxBUk0wX0NPTkYsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYWxybS0+ZW5hYmxlZCA9ICEhdmFsOworCisJcmV0ID0gbWF4ODk5OF9yZWFkX3JlZyhpbmZvLT5ydGMsIE1BWDg5OThfUlRDX1NUQVRVUywgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsICYgQUxBUk0wX1NUQVRVUykKKwkJYWxybS0+cGVuZGluZyA9IDE7CisJZWxzZQorCQlhbHJtLT5wZW5kaW5nID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDg5OThfcnRjX3N0b3BfYWxhcm0oc3RydWN0IG1heDg5OThfcnRjX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IG1heDg5OThfd3JpdGVfcmVnKGluZm8tPnJ0YywgTUFYODk5OF9BTEFSTTBfQ09ORiwgMCk7CisKKwlpZiAoaW5mby0+bHAzOTc0X2J1Z193b3JrYXJvdW5kKQorCQltc2xlZXAoMjAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDg5OThfcnRjX3N0YXJ0X2FsYXJtKHN0cnVjdCBtYXg4OTk4X3J0Y19pbmZvICppbmZvKQoreworCWludCByZXQ7CisJdTggYWxhcm0wX2NvbmYgPSAweDc3OworCisJLyogTFAzOTc0IHdpdGggZGVsYXkgYnVnIGNoaXBzIGhhcyBydGMgYWxhcm0gYnVncyB3aXRoICJNT05USCIgZmllbGQgKi8KKwlpZiAoaW5mby0+bHAzOTc0X2J1Z193b3JrYXJvdW5kKQorCQlhbGFybTBfY29uZiA9IDB4NTc7CisKKwlyZXQgPSBtYXg4OTk4X3dyaXRlX3JlZyhpbmZvLT5ydGMsIE1BWDg5OThfQUxBUk0wX0NPTkYsIGFsYXJtMF9jb25mKTsKKworCWlmIChpbmZvLT5scDM5NzRfYnVnX3dvcmthcm91bmQpCisJCW1zbGVlcCgyMDAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4ODk5OF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IG1heDg5OThfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCBkYXRhWzhdOworCWludCByZXQ7CisKKwltYXg4OTk4X3RtX3RvX2RhdGEoJmFscm0tPnRpbWUsIGRhdGEpOworCisJcmV0ID0gbWF4ODk5OF9ydGNfc3RvcF9hbGFybShpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG1heDg5OThfYnVsa193cml0ZShpbmZvLT5ydGMsIE1BWDg5OThfQUxBUk0wX1NFQywgOCwgZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoaW5mby0+bHAzOTc0X2J1Z193b3JrYXJvdW5kKQorCQltc2xlZXAoMjAwMCk7CisKKwlpZiAoYWxybS0+ZW5hYmxlZCkKKwkJcmV0ID0gbWF4ODk5OF9ydGNfc3RhcnRfYWxhcm0oaW5mbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDg5OThfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQl1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgbWF4ODk5OF9ydGNfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGVuYWJsZWQpCisJCXJldHVybiBtYXg4OTk4X3J0Y19zdGFydF9hbGFybShpbmZvKTsKKwllbHNlCisJCXJldHVybiBtYXg4OTk4X3J0Y19zdG9wX2FsYXJtKGluZm8pOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWF4ODk5OF9ydGNfYWxhcm1faXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1heDg5OThfcnRjX2luZm8gKmluZm8gPSBkYXRhOworCisJcnRjX3VwZGF0ZV9pcnEoaW5mby0+cnRjX2RldiwgMSwgUlRDX0lSUUYgfCBSVENfQUYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgbWF4ODk5OF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgPSBtYXg4OTk4X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gbWF4ODk5OF9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBtYXg4OTk4X3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBtYXg4OTk4X3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBtYXg4OTk4X3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbWF4ODk5OF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWF4ODk5OF9kZXYgKm1heDg5OTggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG1heDg5OThfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKG1heDg5OTgtPmRldik7CisJc3RydWN0IG1heDg5OThfcnRjX2luZm8gKmluZm87CisJaW50IHJldDsKKworCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4ODk5OF9ydGNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmZvLT5kZXYgPSAmcGRldi0+ZGV2OworCWluZm8tPm1heDg5OTggPSBtYXg4OTk4OworCWluZm8tPnJ0YyA9IG1heDg5OTgtPnJ0YzsKKwlpbmZvLT5pcnEgPSBtYXg4OTk4LT5pcnFfYmFzZSArIE1BWDg5OThfSVJRX0FMQVJNMDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCisJaW5mby0+cnRjX2RldiA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoIm1heDg5OTgtcnRjIiwgJnBkZXYtPmRldiwKKwkJCSZtYXg4OTk4X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKworCWlmIChJU19FUlIoaW5mby0+cnRjX2RldikpIHsKKwkJcmV0ID0gUFRSX0VSUihpbmZvLT5ydGNfZGV2KTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUQyBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9ydGM7CisJfQorCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaW5mby0+aXJxLCBOVUxMLCBtYXg4OTk4X3J0Y19hbGFybV9pcnEsIDAsCisJCQkicnRjLWFsYXJtMCIsIGluZm8pOworCisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGFsYXJtIElSUTogJWQ6ICVkXG4iLAorCQkJaW5mby0+aXJxLCByZXQpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlJUQyBDSElQIE5BTUU6ICVzXG4iLCBwZGV2LT5pZF9lbnRyeS0+bmFtZSk7CisJaWYgKHBkYXRhLT5ydGNfZGVsYXkpIHsKKwkJaW5mby0+bHAzOTc0X2J1Z193b3JrYXJvdW5kID0gdHJ1ZTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkxQMzk3NCB3aXRoIFJUQyBSRUdFUlIgb3B0aW9uLiIKKwkJCQkiIFJUQyB1cGRhdGVzIHdpbGwgYmUgZXh0cmVtZWx5IHNsb3cuXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3J0YzoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShpbmZvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYXg4OTk4X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWF4ODk5OF9ydGNfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGluZm8pIHsKKwkJZnJlZV9pcnEoaW5mby0+aXJxLCBpbmZvKTsKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPnJ0Y19kZXYpOworCQlrZnJlZShpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbWF4ODk5OF9ydGNfaWRbXSA9IHsKKwl7ICJtYXg4OTk4LXJ0YyIsIFRZUEVfTUFYODk5OCB9LAorCXsgImxwMzk3NC1ydGMiLCBUWVBFX0xQMzk3NCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4ODk5OF9ydGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYXg4OTk4LXJ0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IG1heDg5OThfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobWF4ODk5OF9ydGNfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBtYXg4OTk4X3J0Y19pZCwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWF4ODk5OF9ydGNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTWlua3l1IEthbmcgPG1rNy5rYW5nQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSBNQVg4OTk4IFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tYzEzeHh4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbWMxM3h4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NmY2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbWMxM3h4eC5jCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogUmVhbCBUaW1lIENsb2NrIGRyaXZlciBmb3IgRnJlZXNjYWxlIE1DMTNYWFggUE1JQworICoKKyAqIChDKSAyMDA5IFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgKKyAqIChDKSAyMDA5IFV3ZSBLbGVpbmUtS29lbmlnLCBQZW5ndXRyb25peAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21mZC9tYzEzeHh4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJtYzEzeHh4LXJ0YyIKKworI2RlZmluZSBNQzEzWFhYX1JUQ1RPRAkyMAorI2RlZmluZSBNQzEzWFhYX1JUQ1RPREEJMjEKKyNkZWZpbmUgTUMxM1hYWF9SVENEQVkJMjIKKyNkZWZpbmUgTUMxM1hYWF9SVENEQVlBCTIzCisKK3N0cnVjdCBtYzEzeHh4X3J0YyB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eDsKKwlpbnQgdmFsaWQ7Cit9OworCitzdGF0aWMgaW50IG1jMTN4eHhfcnRjX2lycV9lbmFibGVfdW5sb2NrZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1bnNpZ25lZCBpbnQgZW5hYmxlZCwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9ydGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgKCpmdW5jKShzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eCwgaW50IGlycSk7CisKKwlpZiAoIXByaXYtPnZhbGlkKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlmdW5jID0gZW5hYmxlZCA/IG1jMTN4eHhfaXJxX3VubWFzayA6IG1jMTN4eHhfaXJxX21hc2s7CisJcmV0dXJuIGZ1bmMocHJpdi0+bWMxM3h4eCwgaXJxKTsKK30KKworc3RhdGljIGludCBtYzEzeHh4X3J0Y19pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgaW50IGVuYWJsZWQsIGludCBpcnEpCit7CisJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCW1jMTN4eHhfbG9jayhwcml2LT5tYzEzeHh4KTsKKworCXJldCA9IG1jMTN4eHhfcnRjX2lycV9lbmFibGVfdW5sb2NrZWQoZGV2LCBlbmFibGVkLCBpcnEpOworCisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jMTN4eHhfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHNlY29uZHMsIGRheXMxLCBkYXlzMjsKKwl1bnNpZ25lZCBsb25nIHMxOTcwOworCWludCByZXQ7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CisKKwlpZiAoIXByaXYtPnZhbGlkKSB7CisJCXJldCA9IC1FTk9EQVRBOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfUlRDREFZLCAmZGF5czEpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IG1jMTN4eHhfcmVnX3JlYWQocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9SVENUT0QsICZzZWNvbmRzKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfUlRDREFZLCAmZGF5czIpOworb3V0OgorCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChkYXlzMiA9PSBkYXlzMSArIDEpIHsKKwkJaWYgKHNlY29uZHMgPj0gODY0MDAgLyAyKQorCQkJZGF5czIgPSBkYXlzMTsKKwkJZWxzZQorCQkJZGF5czEgPSBkYXlzMjsKKwl9CisKKwlpZiAoZGF5czEgIT0gZGF5czIpCisJCXJldHVybiAtRUlPOworCisJczE5NzAgPSBkYXlzMSAqIDg2NDAwICsgc2Vjb25kczsKKworCXJ0Y190aW1lX3RvX3RtKHMxOTcwLCB0bSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBtYzEzeHh4X3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9ydGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgc2Vjb25kcywgZGF5czsKKwl1bnNpZ25lZCBpbnQgYWxhcm1zZWNvbmRzOworCWludCByZXQ7CisKKwlzZWNvbmRzID0gc2VjcyAlIDg2NDAwOworCWRheXMgPSBzZWNzIC8gODY0MDA7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CisKKwkvKgorCSAqIHRlbXBvcmFyaWx5IGludmFsaWRhdGUgYWxhcm0gdG8gcHJldmVudCB0cmlnZ2VyaW5nIGl0IHdoZW4gdGhlIGRheSBpcworCSAqIGFscmVhZHkgdXBkYXRlZCB3aGlsZSB0aGUgdGltZSBpc24ndCB5ZXQuCisJICovCisJcmV0ID0gbWMxM3h4eF9yZWdfcmVhZChwcml2LT5tYzEzeHh4LCBNQzEzWFhYX1JUQ1RPREEsICZhbGFybXNlY29uZHMpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCWlmIChhbGFybXNlY29uZHMgPCA4NjQwMCkgeworCQlyZXQgPSBtYzEzeHh4X3JlZ193cml0ZShwcml2LT5tYzEzeHh4LAorCQkJCU1DMTNYWFhfUlRDVE9EQSwgMHgxZmZmZik7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiB3cml0ZSBzZWNvbmRzPTAgdG8gcHJldmVudCBhIGRheSBzd2l0Y2ggYmV0d2VlbiB3cml0aW5nIGRheXMKKwkgKiBhbmQgc2Vjb25kcyBiZWxvdworCSAqLworCXJldCA9IG1jMTN4eHhfcmVnX3dyaXRlKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfUlRDVE9ELCAwKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBtYzEzeHh4X3JlZ193cml0ZShwcml2LT5tYzEzeHh4LCBNQzEzWFhYX1JUQ0RBWSwgZGF5cyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9SVENUT0QsIHNlY29uZHMpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCS8qIHJlc3RvcmUgYWxhcm0gKi8KKwlpZiAoYWxhcm1zZWNvbmRzIDwgODY0MDApIHsKKwkJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUocHJpdi0+bWMxM3h4eCwKKwkJCQlNQzEzWFhYX1JUQ1RPREEsIGFsYXJtc2Vjb25kcyk7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbWMxM3h4eF9pcnFfYWNrKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfSVJRX1JUQ1JTVCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbWMxM3h4eF9pcnFfdW5tYXNrKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfSVJRX1JUQ1JTVCk7CitvdXQ6CisJcHJpdi0+dmFsaWQgPSAhcmV0OworCisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jMTN4eHhfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgc2Vjb25kcywgZGF5czsKKwl1bnNpZ25lZCBsb25nIHMxOTcwOworCWludCBlbmFibGVkLCBwZW5kaW5nOworCWludCByZXQ7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CisKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfUlRDVE9EQSwgJnNlY29uZHMpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKwlpZiAoc2Vjb25kcyA+PSA4NjQwMCkgeworCQlyZXQgPSAtRU5PREFUQTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbWMxM3h4eF9yZWdfcmVhZChwcml2LT5tYzEzeHh4LCBNQzEzWFhYX1JUQ0RBWSwgJmRheXMpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IG1jMTN4eHhfaXJxX3N0YXR1cyhwcml2LT5tYzEzeHh4LCBNQzEzWFhYX0lSUV9UT0RBLAorCQkJJmVuYWJsZWQsICZwZW5kaW5nKTsKKworb3V0OgorCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWFsYXJtLT5lbmFibGVkID0gZW5hYmxlZDsKKwlhbGFybS0+cGVuZGluZyA9IHBlbmRpbmc7CisKKwlzMTk3MCA9IGRheXMgKiA4NjQwMCArIHNlY29uZHM7CisKKwlydGNfdGltZV90b190bShzMTk3MCwgJmFsYXJtLT50aW1lKTsKKwlkZXZfZGJnKGRldiwgIiVzOiAlbHVcbiIsIF9fZnVuY19fLCBzMTk3MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYzEzeHh4X3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBzMTk3MDsKKwl1bnNpZ25lZCBzZWNvbmRzLCBkYXlzOworCWludCByZXQ7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CisKKwkvKiBkaXNhYmxlIGFsYXJtIHRvIHByZXZlbnQgZmFsc2UgdHJpZ2dlcmluZyAqLworCXJldCA9IG1jMTN4eHhfcmVnX3dyaXRlKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfUlRDVE9EQSwgMHgxZmZmZik7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbWMxM3h4eF9pcnFfYWNrKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfSVJRX1RPREEpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IHJ0Y190bV90b190aW1lKCZhbGFybS0+dGltZSwgJnMxOTcwKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBvdXQ7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBvJTIucyAlbHVcbiIsIF9fZnVuY19fLCBhbGFybS0+ZW5hYmxlZCA/ICJuIiA6ICJmZiIsCisJCQlzMTk3MCk7CisKKwlyZXQgPSBtYzEzeHh4X3J0Y19pcnFfZW5hYmxlX3VubG9ja2VkKGRldiwgYWxhcm0tPmVuYWJsZWQsCisJCQlNQzEzWFhYX0lSUV9UT0RBKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBvdXQ7CisKKwlzZWNvbmRzID0gczE5NzAgJSA4NjQwMDsKKwlkYXlzID0gczE5NzAgLyA4NjQwMDsKKworCXJldCA9IG1jMTN4eHhfcmVnX3dyaXRlKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfUlRDREFZQSwgZGF5cyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9SVENUT0RBLCBzZWNvbmRzKTsKKworb3V0OgorCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IG1jMTN4eHhfcnRjX2FsYXJtX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBtYzEzeHh4X3J0YyAqcHJpdiA9IGRldjsKKwlzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eCA9IHByaXYtPm1jMTN4eHg7CisKKwlkZXZfZGJnKCZwcml2LT5ydGMtPmRldiwgIkFsYXJtXG4iKTsKKworCXJ0Y191cGRhdGVfaXJxKHByaXYtPnJ0YywgMSwgUlRDX0lSUUYgfCBSVENfQUYpOworCisJbWMxM3h4eF9pcnFfYWNrKG1jMTN4eHgsIGlycSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYzEzeHh4X3J0Y191cGRhdGVfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2ID0gZGV2OworCXN0cnVjdCBtYzEzeHh4ICptYzEzeHh4ID0gcHJpdi0+bWMxM3h4eDsKKworCWRldl9kYmcoJnByaXYtPnJ0Yy0+ZGV2LCAiMUhaXG4iKTsKKworCXJ0Y191cGRhdGVfaXJxKHByaXYtPnJ0YywgMSwgUlRDX0lSUUYgfCBSVENfVUYpOworCisJbWMxM3h4eF9pcnFfYWNrKG1jMTN4eHgsIGlycSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWMxM3h4eF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXJldHVybiBtYzEzeHh4X3J0Y19pcnFfZW5hYmxlKGRldiwgZW5hYmxlZCwgTUMxM1hYWF9JUlFfVE9EQSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtYzEzeHh4X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZSA9IG1jMTN4eHhfcnRjX3JlYWRfdGltZSwKKwkuc2V0X21tc3MgPSBtYzEzeHh4X3J0Y19zZXRfbW1zcywKKwkucmVhZF9hbGFybSA9IG1jMTN4eHhfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IG1jMTN4eHhfcnRjX3NldF9hbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZSA9IG1jMTN4eHhfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWMxM3h4eF9ydGNfcmVzZXRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2ID0gZGV2OworCXN0cnVjdCBtYzEzeHh4ICptYzEzeHh4ID0gcHJpdi0+bWMxM3h4eDsKKworCWRldl9kYmcoJnByaXYtPnJ0Yy0+ZGV2LCAiUlRDUlNUXG4iKTsKKwlwcml2LT52YWxpZCA9IDA7CisKKwltYzEzeHh4X2lycV9tYXNrKG1jMTN4eHgsIGlycSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1jMTN4eHhfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbWMxM3h4eF9ydGMgKnByaXY7CisJc3RydWN0IG1jMTN4eHggKm1jMTN4eHg7CisJaW50IHJ0Y3JzdF9wZW5kaW5nOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1jMTN4eHggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJcHJpdi0+bWMxM3h4eCA9IG1jMTN4eHg7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCW1jMTN4eHhfbG9jayhtYzEzeHh4KTsKKworCXJldCA9IG1jMTN4eHhfaXJxX3JlcXVlc3QobWMxM3h4eCwgTUMxM1hYWF9JUlFfUlRDUlNULAorCQkJbWMxM3h4eF9ydGNfcmVzZXRfaGFuZGxlciwgRFJJVkVSX05BTUUsIHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Jlc2V0X2lycV9yZXF1ZXN0OworCisJcmV0ID0gbWMxM3h4eF9pcnFfc3RhdHVzKG1jMTN4eHgsIE1DMTNYWFhfSVJRX1JUQ1JTVCwKKwkJCU5VTEwsICZydGNyc3RfcGVuZGluZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmVzZXRfaXJxX3N0YXR1czsKKworCXByaXYtPnZhbGlkID0gIXJ0Y3JzdF9wZW5kaW5nOworCisJcmV0ID0gbWMxM3h4eF9pcnFfcmVxdWVzdF9ub3VubWFzayhtYzEzeHh4LCBNQzEzWFhYX0lSUV8xSFosCisJCQltYzEzeHh4X3J0Y191cGRhdGVfaGFuZGxlciwgRFJJVkVSX05BTUUsIHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VwZGF0ZV9pcnFfcmVxdWVzdDsKKworCXJldCA9IG1jMTN4eHhfaXJxX3JlcXVlc3Rfbm91bm1hc2sobWMxM3h4eCwgTUMxM1hYWF9JUlFfVE9EQSwKKwkJCW1jMTN4eHhfcnRjX2FsYXJtX2hhbmRsZXIsIERSSVZFUl9OQU1FLCBwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9hbGFybV9pcnFfcmVxdWVzdDsKKworCW1jMTN4eHhfdW5sb2NrKG1jMTN4eHgpOworCisJcHJpdi0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLAorCQkJJnBkZXYtPmRldiwgJm1jMTN4eHhfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocHJpdi0+cnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKHByaXYtPnJ0Yyk7CisKKwkJbWMxM3h4eF9sb2NrKG1jMTN4eHgpOworCisJCW1jMTN4eHhfaXJxX2ZyZWUobWMxM3h4eCwgTUMxM1hYWF9JUlFfVE9EQSwgcHJpdik7CitlcnJfYWxhcm1faXJxX3JlcXVlc3Q6CisKKwkJbWMxM3h4eF9pcnFfZnJlZShtYzEzeHh4LCBNQzEzWFhYX0lSUV8xSFosIHByaXYpOworZXJyX3VwZGF0ZV9pcnFfcmVxdWVzdDoKKworZXJyX3Jlc2V0X2lycV9zdGF0dXM6CisKKwkJbWMxM3h4eF9pcnFfZnJlZShtYzEzeHh4LCBNQzEzWFhYX0lSUV9SVENSU1QsIHByaXYpOworZXJyX3Jlc2V0X2lycV9yZXF1ZXN0OgorCisJCW1jMTN4eHhfdW5sb2NrKG1jMTN4eHgpOworCisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBtYzEzeHh4X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9ydGMgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW1jMTN4eHhfbG9jayhwcml2LT5tYzEzeHh4KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCisJbWMxM3h4eF9pcnFfZnJlZShwcml2LT5tYzEzeHh4LCBNQzEzWFhYX0lSUV9UT0RBLCBwcml2KTsKKwltYzEzeHh4X2lycV9mcmVlKHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfSVJRXzFIWiwgcHJpdik7CisJbWMxM3h4eF9pcnFfZnJlZShwcml2LT5tYzEzeHh4LCBNQzEzWFhYX0lSUV9SVENSU1QsIHByaXYpOworCisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWtmcmVlKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1jMTN4eHhfcnRjX2lkdGFibGVbXSA9IHsKKwl7CisJCS5uYW1lID0gIm1jMTM3ODMtcnRjIiwKKwl9LCB7CisJCS5uYW1lID0gIm1jMTM4OTItcnRjIiwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWMxM3h4eF9ydGNfZHJpdmVyID0geworCS5pZF90YWJsZSA9IG1jMTN4eHhfcnRjX2lkdGFibGUsCisJLnJlbW92ZSA9IF9fZXhpdF9wKG1jMTN4eHhfcnRjX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1jMTN4eHhfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtYzEzeHh4X3J0Y19kcml2ZXIsICZtYzEzeHh4X3J0Y19wcm9iZSk7Cit9Cittb2R1bGVfaW5pdChtYzEzeHh4X3J0Y19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1jMTN4eHhfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWMxM3h4eF9ydGNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1jMTN4eHhfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBkcml2ZXIgZm9yIEZyZWVzY2FsZSBNQzEzWFhYIFBNSUMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUklWRVJfTkFNRSk7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbXBjNTEyMS5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1wYzUxMjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjllNDIxCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1wYzUxMjEuYwpAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIFJlYWwtdGltZSBjbG9jayBkcml2ZXIgZm9yIE1QQzUxMjEKKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgRG9tZW4gUHVuY2VyIDxkb21lbi5wdW5jZXJAdGVsYXJnby5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDExLCBEbWl0cnkgRXJlbWluLVNvbGVuaWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyB7CisJdTggc2V0X3RpbWU7CQkvKiBSVEMgKyAweDAwICovCisJdTggaG91cl9zZXQ7CQkvKiBSVEMgKyAweDAxICovCisJdTggbWludXRlX3NldDsJCS8qIFJUQyArIDB4MDIgKi8KKwl1OCBzZWNvbmRfc2V0OwkJLyogUlRDICsgMHgwMyAqLworCisJdTggc2V0X2RhdGU7CQkvKiBSVEMgKyAweDA0ICovCisJdTggbW9udGhfc2V0OwkJLyogUlRDICsgMHgwNSAqLworCXU4IHdlZWtkYXlfc2V0OwkJLyogUlRDICsgMHgwNiAqLworCXU4IGRhdGVfc2V0OwkJLyogUlRDICsgMHgwNyAqLworCisJdTggd3JpdGVfc3c7CQkvKiBSVEMgKyAweDA4ICovCisJdTggc3dfc2V0OwkJLyogUlRDICsgMHgwOSAqLworCXUxNiB5ZWFyX3NldDsJCS8qIFJUQyArIDB4MGEgKi8KKworCXU4IGFsbV9lbmFibGU7CQkvKiBSVEMgKyAweDBjICovCisJdTggYWxtX2hvdXJfc2V0OwkvKiBSVEMgKyAweDBkICovCisJdTggYWxtX21pbl9zZXQ7CQkvKiBSVEMgKyAweDBlICovCisJdTggaW50X2VuYWJsZTsJCS8qIFJUQyArIDB4MGYgKi8KKworCXU4IHJlc2VydmVkMTsKKwl1OCBob3VyOwkJLyogUlRDICsgMHgxMSAqLworCXU4IG1pbnV0ZTsJCS8qIFJUQyArIDB4MTIgKi8KKwl1OCBzZWNvbmQ7CQkvKiBSVEMgKyAweDEzICovCisKKwl1OCBtb250aDsJCS8qIFJUQyArIDB4MTQgKi8KKwl1OCB3ZGF5X21kYXk7CQkvKiBSVEMgKyAweDE1ICovCisJdTE2IHllYXI7CQkvKiBSVEMgKyAweDE2ICovCisKKwl1OCBpbnRfYWxtOwkJLyogUlRDICsgMHgxOCAqLworCXU4IGludF9zdzsJCS8qIFJUQyArIDB4MTkgKi8KKwl1OCBhbG1fc3RhdHVzOwkJLyogUlRDICsgMHgxYSAqLworCXU4IHN3X21pbnV0ZTsJCS8qIFJUQyArIDB4MWIgKi8KKworCXU4IGJ1c19lcnJvcl8xOwkJLyogUlRDICsgMHgxYyAqLworCXU4IGludF9kYXk7CQkvKiBSVEMgKyAweDFkICovCisJdTggaW50X21pbjsJCS8qIFJUQyArIDB4MWUgKi8KKwl1OCBpbnRfc2VjOwkJLyogUlRDICsgMHgxZiAqLworCisJLyoKKwkgKiB0YXJnZXRfdGltZToKKwkgKglpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBoaWJlcm5hdGlvbiBidXQgaGliZXJuYXRpb24KKwkgKglkb2VzIG5vdCB3b3JrIG9uIHNpbGljb24gcmV2IDEuNSBzbyB1c2UgaXQgZm9yIG5vbi12b2xhdGlsZQorCSAqCXN0b3JhZ2Ugb2Ygb2Zmc2V0IGJldHdlZW4gdGhlIGFjdHVhbF90aW1lIHJlZ2lzdGVyIGFuZCBsaW51eAorCSAqCXRpbWUKKwkgKi8KKwl1MzIgdGFyZ2V0X3RpbWU7CS8qIFJUQyArIDB4MjAgKi8KKwkvKgorCSAqIGFjdHVhbF90aW1lOgorCSAqIAlyZWFkb25seSB0aW1lIHNpbmNlIFZCQVRfUlRDIHdhcyBsYXN0IGNvbm5lY3RlZAorCSAqLworCXUzMiBhY3R1YWxfdGltZTsJLyogUlRDICsgMHgyNCAqLworCXUzMiBrZWVwX2FsaXZlOwkJLyogUlRDICsgMHgyOCAqLworfTsKKworc3RydWN0IG1wYzUxMjFfcnRjX2RhdGEgeworCXVuc2lnbmVkIGlycTsKKwl1bnNpZ25lZCBpcnFfcGVyaW9kaWM7CisJc3RydWN0IG1wYzUxMjFfcnRjX3JlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCBydGNfd2thbHJtIHdrYWxhcm07Cit9OworCisvKgorICogVXBkYXRlIHNlY29uZC9taW51dGUvaG91ciByZWdpc3RlcnMuCisgKgorICogVGhpcyBpcyBqdXN0IHNvIGFsYXJtIHdpbGwgd29yay4KKyAqLworc3RhdGljIHZvaWQgbXBjNTEyMV9ydGNfdXBkYXRlX3NtaChzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzLAorCQkJCSAgIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJb3V0XzgoJnJlZ3MtPnNlY29uZF9zZXQsIHRtLT50bV9zZWMpOworCW91dF84KCZyZWdzLT5taW51dGVfc2V0LCB0bS0+dG1fbWluKTsKKwlvdXRfOCgmcmVncy0+aG91cl9zZXQsIHRtLT50bV9ob3VyKTsKKworCS8qIHNldCB0aW1lIHNlcXVlbmNlICovCisJb3V0XzgoJnJlZ3MtPnNldF90aW1lLCAweDEpOworCW91dF84KCZyZWdzLT5zZXRfdGltZSwgMHgzKTsKKwlvdXRfOCgmcmVncy0+c2V0X3RpbWUsIDB4MSk7CisJb3V0XzgoJnJlZ3MtPnNldF90aW1lLCAweDApOworfQorCitzdGF0aWMgaW50IG1wYzUxMjFfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IG1wYzUxMjFfcnRjX2RhdGEgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBtcGM1MTIxX3J0Y19yZWdzIF9faW9tZW0gKnJlZ3MgPSBydGMtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyBub3c7CisKKwkvKgorCSAqIGxpbnV4IHRpbWUgaXMgYWN0dWFsX3RpbWUgcGx1cyB0aGUgb2Zmc2V0IHNhdmVkIGluIHRhcmdldF90aW1lCisJICovCisJbm93ID0gaW5fYmUzMigmcmVncy0+YWN0dWFsX3RpbWUpICsgaW5fYmUzMigmcmVncy0+dGFyZ2V0X3RpbWUpOworCisJcnRjX3RpbWVfdG9fdG0obm93LCB0bSk7CisKKwkvKgorCSAqIHVwZGF0ZSBzZWNvbmQgbWludXRlIGhvdXIgcmVnaXN0ZXJzCisJICogc28gYWxhcm1zIHdpbGwgd29yaworCSAqLworCW1wYzUxMjFfcnRjX3VwZGF0ZV9zbWgocmVncywgdG0pOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTEyMV9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBtcGM1MTIxX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzID0gcnRjLT5yZWdzOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBub3c7CisKKwkvKgorCSAqIFRoZSBhY3R1YWxfdGltZSByZWdpc3RlciBpcyByZWFkIG9ubHkgc28gd2Ugd3JpdGUgdGhlIG9mZnNldAorCSAqIGJldHdlZW4gaXQgYW5kIGxpbnV4IHRpbWUgdG8gdGhlIHRhcmdldF90aW1lIHJlZ2lzdGVyLgorCSAqLworCXJldCA9IHJ0Y190bV90b190aW1lKHRtLCAmbm93KTsKKwlpZiAocmV0ID09IDApCisJCW91dF9iZTMyKCZyZWdzLT50YXJnZXRfdGltZSwgbm93IC0gaW5fYmUzMigmcmVncy0+YWN0dWFsX3RpbWUpKTsKKworCS8qCisJICogdXBkYXRlIHNlY29uZCBtaW51dGUgaG91ciByZWdpc3RlcnMKKwkgKiBzbyBhbGFybXMgd2lsbCB3b3JrCisJICovCisJbXBjNTEyMV9ydGNfdXBkYXRlX3NtaChyZWdzLCB0bSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGM1MjAwX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBtcGM1MTIxX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzID0gcnRjLT5yZWdzOworCWludCB0bXA7CisKKwl0bS0+dG1fc2VjID0gaW5fOCgmcmVncy0+c2Vjb25kKTsKKwl0bS0+dG1fbWluID0gaW5fOCgmcmVncy0+bWludXRlKTsKKworCS8qIDEyIGhvdXIgZm9ybWF0PyAqLworCWlmIChpbl84KCZyZWdzLT5ob3VyKSAmIDB4MjApCisJCXRtLT50bV9ob3VyID0gKGluXzgoJnJlZ3MtPmhvdXIpID4+IDEpICsKKwkJCShpbl84KCZyZWdzLT5ob3VyKSAmIDEgPyAxMiA6IDApOworCWVsc2UKKwkJdG0tPnRtX2hvdXIgPSBpbl84KCZyZWdzLT5ob3VyKTsKKworCXRtcCA9IGluXzgoJnJlZ3MtPndkYXlfbWRheSk7CisJdG0tPnRtX21kYXkgPSB0bXAgJiAweDFmOworCXRtLT50bV9tb24gPSBpbl84KCZyZWdzLT5tb250aCkgLSAxOworCXRtLT50bV95ZWFyID0gaW5fYmUxNigmcmVncy0+eWVhcikgLSAxOTAwOworCXRtLT50bV93ZGF5ID0gKHRtcCA+PiA1KSAlIDc7CisJdG0tPnRtX3lkYXkgPSBydGNfeWVhcl9kYXlzKHRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhcik7CisJdG0tPnRtX2lzZHN0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzUyMDBfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfZGF0YSAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG1wYzUxMjFfcnRjX3JlZ3MgX19pb21lbSAqcmVncyA9IHJ0Yy0+cmVnczsKKworCW1wYzUxMjFfcnRjX3VwZGF0ZV9zbWgocmVncywgdG0pOworCisJLyogZGF0ZSAqLworCW91dF84KCZyZWdzLT5tb250aF9zZXQsIHRtLT50bV9tb24gKyAxKTsKKwlvdXRfOCgmcmVncy0+d2Vla2RheV9zZXQsIHRtLT50bV93ZGF5ID8gdG0tPnRtX3dkYXkgOiA3KTsKKwlvdXRfOCgmcmVncy0+ZGF0ZV9zZXQsIHRtLT50bV9tZGF5KTsKKwlvdXRfYmUxNigmcmVncy0+eWVhcl9zZXQsIHRtLT50bV95ZWFyICsgMTkwMCk7CisKKwkvKiBzZXQgZGF0ZSBzZXF1ZW5jZSAqLworCW91dF84KCZyZWdzLT5zZXRfZGF0ZSwgMHgxKTsKKwlvdXRfOCgmcmVncy0+c2V0X2RhdGUsIDB4Myk7CisJb3V0XzgoJnJlZ3MtPnNldF9kYXRlLCAweDEpOworCW91dF84KCZyZWdzLT5zZXRfZGF0ZSwgMHgwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzUxMjFfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IG1wYzUxMjFfcnRjX2RhdGEgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBtcGM1MTIxX3J0Y19yZWdzIF9faW9tZW0gKnJlZ3MgPSBydGMtPnJlZ3M7CisKKwkqYWxhcm0gPSBydGMtPndrYWxhcm07CisKKwlhbGFybS0+cGVuZGluZyA9IGluXzgoJnJlZ3MtPmFsbV9zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTEyMV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBtcGM1MTIxX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzID0gcnRjLT5yZWdzOworCisJLyoKKwkgKiB0aGUgYWxhcm0gaGFzIG5vIHNlY29uZHMgc28gZGVhbCB3aXRoIGl0CisJICovCisJaWYgKGFsYXJtLT50aW1lLnRtX3NlYykgeworCQlhbGFybS0+dGltZS50bV9zZWMgPSAwOworCQlhbGFybS0+dGltZS50bV9taW4rKzsKKwkJaWYgKGFsYXJtLT50aW1lLnRtX21pbiA+PSA2MCkgeworCQkJYWxhcm0tPnRpbWUudG1fbWluID0gMDsKKwkJCWFsYXJtLT50aW1lLnRtX2hvdXIrKzsKKwkJCWlmIChhbGFybS0+dGltZS50bV9ob3VyID49IDI0KQorCQkJCWFsYXJtLT50aW1lLnRtX2hvdXIgPSAwOworCQl9CisJfQorCisJYWxhcm0tPnRpbWUudG1fbWRheSA9IC0xOworCWFsYXJtLT50aW1lLnRtX21vbiA9IC0xOworCWFsYXJtLT50aW1lLnRtX3llYXIgPSAtMTsKKworCW91dF84KCZyZWdzLT5hbG1fbWluX3NldCwgYWxhcm0tPnRpbWUudG1fbWluKTsKKwlvdXRfOCgmcmVncy0+YWxtX2hvdXJfc2V0LCBhbGFybS0+dGltZS50bV9ob3VyKTsKKworCW91dF84KCZyZWdzLT5hbG1fZW5hYmxlLCBhbGFybS0+ZW5hYmxlZCk7CisKKwlydGMtPndrYWxhcm0gPSAqYWxhcm07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtcGM1MTIxX3J0Y19oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfZGF0YSAqcnRjID0gZGV2X2dldF9kcnZkYXRhKChzdHJ1Y3QgZGV2aWNlICopZGV2KTsKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzID0gcnRjLT5yZWdzOworCisJaWYgKGluXzgoJnJlZ3MtPmludF9hbG0pKSB7CisJCS8qIGFja25vd2xlZGdlIGFuZCBjbGVhciBzdGF0dXMgKi8KKwkJb3V0XzgoJnJlZ3MtPmludF9hbG0sIDEpOworCQlvdXRfOCgmcmVncy0+YWxtX3N0YXR1cywgMSk7CisKKwkJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX0FGKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGlycXJldHVybl90IG1wYzUxMjFfcnRjX2hhbmRsZXJfdXBkKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfZGF0YSAqcnRjID0gZGV2X2dldF9kcnZkYXRhKChzdHJ1Y3QgZGV2aWNlICopZGV2KTsKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzID0gcnRjLT5yZWdzOworCisJaWYgKGluXzgoJnJlZ3MtPmludF9zZWMpICYmIChpbl84KCZyZWdzLT5pbnRfZW5hYmxlKSAmIDB4MSkpIHsKKwkJLyogYWNrbm93bGVkZ2UgKi8KKwkJb3V0XzgoJnJlZ3MtPmludF9zZWMsIDEpOworCisJCXJ0Y191cGRhdGVfaXJxKHJ0Yy0+cnRjLCAxLCBSVENfSVJRRiB8IFJUQ19VRik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTEyMV9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBtcGM1MTIxX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzID0gcnRjLT5yZWdzOworCWludCB2YWw7CisKKwlpZiAoZW5hYmxlZCkKKwkJdmFsID0gMTsKKwllbHNlCisJCXZhbCA9IDA7CisKKwlvdXRfOCgmcmVncy0+YWxtX2VuYWJsZSwgdmFsKTsKKwlydGMtPndrYWxhcm0uZW5hYmxlZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgbXBjNTEyMV9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgPSBtcGM1MTIxX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gbXBjNTEyMV9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBtcGM1MTIxX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBtcGM1MTIxX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBtcGM1MTIxX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1wYzUyMDBfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gbXBjNTIwMF9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IG1wYzUyMDBfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtID0gbXBjNTEyMV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gbXBjNTEyMV9ydGNfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gbXBjNTEyMV9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1wYzUxMjFfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQoreworCXN0cnVjdCBtcGM1MTIxX3J0Y19kYXRhICpydGM7CisJaW50IGVyciA9IDA7CisKKwlydGMgPSBremFsbG9jKHNpemVvZigqcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFydGMpCisJCXJldHVybiAtRU5PTUVNOworCisJcnRjLT5yZWdzID0gb2ZfaW9tYXAob3AtPmRldi5vZl9ub2RlLCAwKTsKKwlpZiAoIXJ0Yy0+cmVncykgeworCQlkZXZfZXJyKCZvcC0+ZGV2LCAiJXM6IGNvdWxkbid0IG1hcCBpbyBzcGFjZVxuIiwgX19mdW5jX18pOworCQllcnIgPSAtRU5PU1lTOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRldmljZV9pbml0X3dha2V1cCgmb3AtPmRldiwgMSk7CisKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHJ0Yyk7CisKKwlydGMtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5kZXYub2Zfbm9kZSwgMSk7CisJZXJyID0gcmVxdWVzdF9pcnEocnRjLT5pcnEsIG1wYzUxMjFfcnRjX2hhbmRsZXIsIDAsCisJCQkJCQkibXBjNTEyMS1ydGMiLCAmb3AtPmRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZvcC0+ZGV2LCAiJXM6IGNvdWxkIG5vdCByZXF1ZXN0IGlycTogJWlcbiIsCisJCQkJCQkJX19mdW5jX18sIHJ0Yy0+aXJxKTsKKwkJZ290byBvdXRfZGlzcG9zZTsKKwl9CisKKwlydGMtPmlycV9wZXJpb2RpYyA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5kZXYub2Zfbm9kZSwgMCk7CisJZXJyID0gcmVxdWVzdF9pcnEocnRjLT5pcnFfcGVyaW9kaWMsIG1wYzUxMjFfcnRjX2hhbmRsZXJfdXBkLAorCQkJCTAsICJtcGM1MTIxLXJ0Y191cGQiLCAmb3AtPmRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZvcC0+ZGV2LCAiJXM6IGNvdWxkIG5vdCByZXF1ZXN0IGlycTogJWlcbiIsCisJCQkJCQlfX2Z1bmNfXywgcnRjLT5pcnFfcGVyaW9kaWMpOworCQlnb3RvIG91dF9kaXNwb3NlMjsKKwl9CisKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUob3AtPmRldi5vZl9ub2RlLCAiZnNsLG1wYzUxMjEtcnRjIikpIHsKKwkJdTMyIGthOworCQlrYSA9IGluX2JlMzIoJnJ0Yy0+cmVncy0+a2VlcF9hbGl2ZSk7CisJCWlmIChrYSAmIDB4MDIpIHsKKwkJCWRldl93YXJuKCZvcC0+ZGV2LAorCQkJCSJtcGM1MTIxLXJ0YzogQmF0dGVyeSBvciBvc2NpbGxhdG9yIGZhaWx1cmUhXG4iKTsKKwkJCW91dF9iZTMyKCZydGMtPnJlZ3MtPmtlZXBfYWxpdmUsIGthKTsKKwkJfQorCisJCXJ0Yy0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibXBjNTEyMS1ydGMiLCAmb3AtPmRldiwKKwkJCQkJCSZtcGM1MTIxX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwl9IGVsc2UgeworCQlydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoIm1wYzUyMDAtcnRjIiwgJm9wLT5kZXYsCisJCQkJCQkmbXBjNTIwMF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJfQorCisJaWYgKElTX0VSUihydGMtPnJ0YykpIHsKKwkJZXJyID0gUFRSX0VSUihydGMtPnJ0Yyk7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCX0KKwlydGMtPnJ0Yy0+dWllX3Vuc3VwcG9ydGVkID0gMTsKKworCXJldHVybiAwOworCitvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEocnRjLT5pcnFfcGVyaW9kaWMsICZvcC0+ZGV2KTsKK291dF9kaXNwb3NlMjoKKwlpcnFfZGlzcG9zZV9tYXBwaW5nKHJ0Yy0+aXJxX3BlcmlvZGljKTsKKwlmcmVlX2lycShydGMtPmlycSwgJm9wLT5kZXYpOworb3V0X2Rpc3Bvc2U6CisJaXJxX2Rpc3Bvc2VfbWFwcGluZyhydGMtPmlycSk7CisJaW91bm1hcChydGMtPnJlZ3MpOworb3V0X2ZyZWU6CisJa2ZyZWUocnRjKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1wYzUxMjFfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfZGF0YSAqcnRjID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzID0gcnRjLT5yZWdzOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHQsIHNvIHRoZXJlIGFyZSBubyBuYXN0eSBzdXJwcmlzZXMgKi8KKwlvdXRfOCgmcmVncy0+YWxtX2VuYWJsZSwgMCk7CisJb3V0XzgoJnJlZ3MtPmludF9lbmFibGUsIGluXzgoJnJlZ3MtPmludF9lbmFibGUpICYgfjB4MSk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjLT5ydGMpOworCWlvdW5tYXAocnRjLT5yZWdzKTsKKwlmcmVlX2lycShydGMtPmlycSwgJm9wLT5kZXYpOworCWZyZWVfaXJxKHJ0Yy0+aXJxX3BlcmlvZGljLCAmb3AtPmRldik7CisJaXJxX2Rpc3Bvc2VfbWFwcGluZyhydGMtPmlycSk7CisJaXJxX2Rpc3Bvc2VfbWFwcGluZyhydGMtPmlycV9wZXJpb2RpYyk7CisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBOVUxMKTsKKwlrZnJlZShydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzUxMjFfcnRjX21hdGNoW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXJ0YyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1ydGMiLCB9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXBjNTEyMV9ydGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1wYzUxMjEtcnRjIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1wYzUxMjFfcnRjX21hdGNoLAorCX0sCisJLnByb2JlID0gbXBjNTEyMV9ydGNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG1wYzUxMjFfcnRjX3JlbW92ZSksCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1wYzUxMjFfcnRjX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkpvaG4gUmlnYnkgPGpjcmlnYnlAZ21haWwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1yc3QuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tcnN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxNzE5YgotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1tcnN0LmMKQEAgLTAsMCArMSw1NDQgQEAKKy8qCisgKiBydGMtbXJzdC5jOiBEcml2ZXIgZm9yIE1vb3Jlc3Rvd24gdmlydHVhbCBSVEMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSmFjb2IgUGFuIChqYWNvYi5qdW4ucGFuQGludGVsLmNvbSkKKyAqCSAgIEZlbmcgVGFuZyAoZmVuZy50YW5nQGludGVsLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKgorICogTm90ZToKKyAqIFZSVEMgaXMgZW11bGF0ZWQgYnkgc3lzdGVtIGNvbnRyb2xsZXIgZmlybXdhcmUsIHRoZSByZWFsIEhXCisgKiBSVEMgaXMgbG9jYXRlZCBpbiB0aGUgUE1JQyBkZXZpY2UuIFNDVSBGVyBzaGFkb3dzIFBNSUMgUlRDCisgKiBpbiBhIG1lbW9yeSBtYXBwZWQgSU8gc3BhY2UgdGhhdCBpcyB2aXNpYmxlIHRvIHRoZSBob3N0IElBCisgKiBwcm9jZXNzb3IuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgdXBvbiBkcml2ZXJzL3J0Yy9ydGMtY21vcy5jCisgKi8KKworLyoKKyAqIE5vdGU6CisgKiAgKiB2UlRDIG9ubHkgc3VwcG9ydHMgYmluYXJ5IG1vZGUgYW5kIDI0SCBtb2RlCisgKiAgKiB2UlRDIG9ubHkgc3VwcG9ydCBQSUUgYW5kIEFJRSwgbm8gVUlFLCBhbmQgaXRzIFBJRSBvbmx5IGhhcHBlbnMKKyAqICAgIGF0IDIzOjU5OjU5cG0gZXZlcnlkYXksIG5vIHN1cHBvcnQgZm9yIGFkanVzdGFibGUgZnJlcXVlbmN5CisgKiAgKiBBbGFybSBmdW5jdGlvbiBpcyBhbHNvIGxpbWl0ZWQgdG8gaHIvbWluL3NlYy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2ZpLmg+CisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ydGMuaD4KKyNpbmNsdWRlIDxhc20vaW50ZWxfc2N1X2lwYy5oPgorI2luY2x1ZGUgPGFzbS9tcnN0Lmg+CisjaW5jbHVkZSA8YXNtL21yc3QtdnJ0Yy5oPgorCitzdHJ1Y3QgbXJzdF9ydGMgeworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlpbnQJCQlpcnE7CisJc3RydWN0IHJlc291cmNlCQkqaW9tZW07CisKKwl1OAkJCWVuYWJsZWRfd2FrZTsKKwl1OAkJCXN1c3BlbmRfY3RybDsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAicnRjX21yc3QiOworCisjZGVmaW5lCVJUQ19JUlFNQVNLCShSVENfUEYgfCBSVENfQUYpCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2ludHIodTggcnRjX2ludHIpCit7CisJaWYgKCEocnRjX2ludHIgJiBSVENfSVJRRikpCisJCXJldHVybiAwOworCXJldHVybiBydGNfaW50ciAmIFJUQ19JUlFNQVNLOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgdnJ0Y19pc191cGRhdGluZyh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgdWlwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwl1aXAgPSAodnJ0Y19jbW9zX3JlYWQoUlRDX0ZSRVFfU0VMRUNUKSAmIFJUQ19VSVApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHVpcDsKK30KKworLyoKKyAqIHJ0Y190aW1lJ3MgeWVhciBjb250YWlucyB0aGUgaW5jcmVtZW50IG92ZXIgMTkwMCwgYnV0IHZSVEMncyBZRUFSCisgKiByZWdpc3RlciBjYW4ndCBiZSBwcm9ncmFtbWVkIHRvIHZhbHVlIGxhcmdlciB0aGFuIDB4NjQsIHNvIHZSVEMKKyAqIGRyaXZlciBjaG9zZSB0byB1c2UgMTk3MiAoMTk3MCBpcyBVTklYIHRpbWUgc3RhcnQgcG9pbnQpIGFzIHRoZSBiYXNlLAorICogYW5kIGRvZXMgdGhlIHRyYW5zbGF0aW9uIGF0IHJlYWQvd3JpdGUgdGltZS4KKyAqCisgKiBXaHkgbm90IGp1c3QgdXNlIDE5NzAgYXMgdGhlIG9mZnNldD8gaXQncyBiZWNhdXNlIHVzaW5nIDE5NzIgd2lsbAorICogbWFrZSBpdCBjb25zaXN0ZW50IGluIGxlYXAgeWVhciBzZXR0aW5nIGZvciBib3RoIHZydGMgYW5kIGxvdy1sZXZlbAorICogcGh5c2ljYWwgcnRjIGRldmljZXMuIFRoZW4gd2h5IG5vdCB1c2UgMTk2MCBhcyB0aGUgb2Zmc2V0PyBJZiB3ZSB1c2UKKyAqIDE5NjAsIGZvciBhIGRldmljZSdzIGZpcnN0IHVzZSwgaXRzIFlFQVIgcmVnaXN0ZXIgaXMgMCBhbmQgdGhlIHN5c3RlbQorICogeWVhciB3aWxsIGJlIHBhcnNlZCBhcyAxOTYwIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVOSVggdGltZSBhbmQgd2lsbAorICogY2F1c2UgbWFueSBhcHBsaWNhdGlvbnMgdG8gZmFpbCBteXN0ZXJpb3VzbHkuCisgKi8KK3N0YXRpYyBpbnQgbXJzdF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh2cnRjX2lzX3VwZGF0aW5nKCkpCisJCW1kZWxheSgyMCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwl0aW1lLT50bV9zZWMgPSB2cnRjX2Ntb3NfcmVhZChSVENfU0VDT05EUyk7CisJdGltZS0+dG1fbWluID0gdnJ0Y19jbW9zX3JlYWQoUlRDX01JTlVURVMpOworCXRpbWUtPnRtX2hvdXIgPSB2cnRjX2Ntb3NfcmVhZChSVENfSE9VUlMpOworCXRpbWUtPnRtX21kYXkgPSB2cnRjX2Ntb3NfcmVhZChSVENfREFZX09GX01PTlRIKTsKKwl0aW1lLT50bV9tb24gPSB2cnRjX2Ntb3NfcmVhZChSVENfTU9OVEgpOworCXRpbWUtPnRtX3llYXIgPSB2cnRjX2Ntb3NfcmVhZChSVENfWUVBUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKworCS8qIEFkanVzdCBmb3IgdGhlIDE5NzIvMTkwMCAqLworCXRpbWUtPnRtX3llYXIgKz0gNzI7CisJdGltZS0+dG1fbW9uLS07CisJcmV0dXJuIHJ0Y192YWxpZF90bSh0aW1lKTsKK30KKworc3RhdGljIGludCBtcnN0X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjOworCXVuc2lnbmVkIGludCB5cnM7CisKKwl5cnMgPSB0aW1lLT50bV95ZWFyOworCW1vbiA9IHRpbWUtPnRtX21vbiArIDE7ICAgLyogdG1fbW9uIHN0YXJ0cyBhdCB6ZXJvICovCisJZGF5ID0gdGltZS0+dG1fbWRheTsKKwlocnMgPSB0aW1lLT50bV9ob3VyOworCW1pbiA9IHRpbWUtPnRtX21pbjsKKwlzZWMgPSB0aW1lLT50bV9zZWM7CisKKwlpZiAoeXJzIDwgNzIgfHwgeXJzID4gMTM4KQorCQlyZXR1cm4gLUVJTlZBTDsKKwl5cnMgLT0gNzI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKworCXZydGNfY21vc193cml0ZSh5cnMsIFJUQ19ZRUFSKTsKKwl2cnRjX2Ntb3Nfd3JpdGUobW9uLCBSVENfTU9OVEgpOworCXZydGNfY21vc193cml0ZShkYXksIFJUQ19EQVlfT0ZfTU9OVEgpOworCXZydGNfY21vc193cml0ZShocnMsIFJUQ19IT1VSUyk7CisJdnJ0Y19jbW9zX3dyaXRlKG1pbiwgUlRDX01JTlVURVMpOworCXZydGNfY21vc193cml0ZShzZWMsIFJUQ19TRUNPTkRTKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBpbnRlbF9zY3VfaXBjX3NpbXBsZV9jb21tYW5kKElQQ01TR19WUlRDLCBJUENfQ01EX1ZSVENfU0VUVElNRSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtcnN0X3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3sKKwlzdHJ1Y3QgbXJzdF9ydGMJKm1yc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIHJ0Y19jb250cm9sOworCisJaWYgKG1yc3QtPmlycSA8PSAwKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEJhc2ljIGFsYXJtcyBvbmx5IHN1cHBvcnQgaG91ciwgbWludXRlLCBhbmQgc2Vjb25kcyBmaWVsZHMuCisJICogU29tZSBhbHNvIHN1cHBvcnQgZGF5IGFuZCBtb250aCwgZm9yIGFsYXJtcyB1cCB0byBhIHllYXIgaW4KKwkgKiB0aGUgZnV0dXJlLgorCSAqLworCXQtPnRpbWUudG1fbWRheSA9IC0xOworCXQtPnRpbWUudG1fbW9uID0gLTE7CisJdC0+dGltZS50bV95ZWFyID0gLTE7CisKKwkvKiB2UlRDIG9ubHkgc3VwcG9ydHMgYmluYXJ5IG1vZGUgKi8KKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJdC0+dGltZS50bV9zZWMgPSB2cnRjX2Ntb3NfcmVhZChSVENfU0VDT05EU19BTEFSTSk7CisJdC0+dGltZS50bV9taW4gPSB2cnRjX2Ntb3NfcmVhZChSVENfTUlOVVRFU19BTEFSTSk7CisJdC0+dGltZS50bV9ob3VyID0gdnJ0Y19jbW9zX3JlYWQoUlRDX0hPVVJTX0FMQVJNKTsKKworCXJ0Y19jb250cm9sID0gdnJ0Y19jbW9zX3JlYWQoUlRDX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJdC0+ZW5hYmxlZCA9ICEhKHJ0Y19jb250cm9sICYgUlRDX0FJRSk7CisJdC0+cGVuZGluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXJzdF9jaGVja2ludHIoc3RydWN0IG1yc3RfcnRjICptcnN0LCB1bnNpZ25lZCBjaGFyIHJ0Y19jb250cm9sKQoreworCXVuc2lnbmVkIGNoYXIJcnRjX2ludHI7CisKKwkvKgorCSAqIE5PVEUgYWZ0ZXIgY2hhbmdpbmcgUlRDX3hJRSBiaXRzIHdlIGFsd2F5cyByZWFkIElOVFJfRkxBR1M7CisJICogYWxsZWdlZGx5IHNvbWUgb2xkZXIgcnRjcyBuZWVkIHRoYXQgdG8gaGFuZGxlIGlycXMgcHJvcGVybHkKKwkgKi8KKwlydGNfaW50ciA9IHZydGNfY21vc19yZWFkKFJUQ19JTlRSX0ZMQUdTKTsKKwlydGNfaW50ciAmPSAocnRjX2NvbnRyb2wgJiBSVENfSVJRTUFTSykgfCBSVENfSVJRRjsKKwlpZiAoaXNfaW50cihydGNfaW50cikpCisJCXJ0Y191cGRhdGVfaXJxKG1yc3QtPnJ0YywgMSwgcnRjX2ludHIpOworfQorCitzdGF0aWMgdm9pZCBtcnN0X2lycV9lbmFibGUoc3RydWN0IG1yc3RfcnRjICptcnN0LCB1bnNpZ25lZCBjaGFyIG1hc2spCit7CisJdW5zaWduZWQgY2hhcglydGNfY29udHJvbDsKKworCS8qCisJICogRmx1c2ggYW55IHBlbmRpbmcgSVJRIHN0YXR1cywgbm90YWJseSBmb3IgdXBkYXRlIGlycXMsCisJICogYmVmb3JlIHdlIGVuYWJsZSBuZXcgSVJRcworCSAqLworCXJ0Y19jb250cm9sID0gdnJ0Y19jbW9zX3JlYWQoUlRDX0NPTlRST0wpOworCW1yc3RfY2hlY2tpbnRyKG1yc3QsIHJ0Y19jb250cm9sKTsKKworCXJ0Y19jb250cm9sIHw9IG1hc2s7CisJdnJ0Y19jbW9zX3dyaXRlKHJ0Y19jb250cm9sLCBSVENfQ09OVFJPTCk7CisKKwltcnN0X2NoZWNraW50cihtcnN0LCBydGNfY29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIG1yc3RfaXJxX2Rpc2FibGUoc3RydWN0IG1yc3RfcnRjICptcnN0LCB1bnNpZ25lZCBjaGFyIG1hc2spCit7CisJdW5zaWduZWQgY2hhcglydGNfY29udHJvbDsKKworCXJ0Y19jb250cm9sID0gdnJ0Y19jbW9zX3JlYWQoUlRDX0NPTlRST0wpOworCXJ0Y19jb250cm9sICY9IH5tYXNrOworCXZydGNfY21vc193cml0ZShydGNfY29udHJvbCwgUlRDX0NPTlRST0wpOworCW1yc3RfY2hlY2tpbnRyKG1yc3QsIHJ0Y19jb250cm9sKTsKK30KKworc3RhdGljIGludCBtcnN0X3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQoreworCXN0cnVjdCBtcnN0X3J0YwkqbXJzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgaHJzLCBtaW4sIHNlYzsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghbXJzdC0+aXJxKQorCQlyZXR1cm4gLUVJTzsKKworCWhycyA9IHQtPnRpbWUudG1faG91cjsKKwltaW4gPSB0LT50aW1lLnRtX21pbjsKKwlzZWMgPSB0LT50aW1lLnRtX3NlYzsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkvKiBOZXh0IHJ0YyBpcnEgbXVzdCBub3QgYmUgZnJvbSBwcmV2aW91cyBhbGFybSBzZXR0aW5nICovCisJbXJzdF9pcnFfZGlzYWJsZShtcnN0LCBSVENfQUlFKTsKKworCS8qIFVwZGF0ZSBhbGFybSAqLworCXZydGNfY21vc193cml0ZShocnMsIFJUQ19IT1VSU19BTEFSTSk7CisJdnJ0Y19jbW9zX3dyaXRlKG1pbiwgUlRDX01JTlVURVNfQUxBUk0pOworCXZydGNfY21vc193cml0ZShzZWMsIFJUQ19TRUNPTkRTX0FMQVJNKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJcmV0ID0gaW50ZWxfc2N1X2lwY19zaW1wbGVfY29tbWFuZChJUENNU0dfVlJUQywgSVBDX0NNRF9WUlRDX1NFVEFMQVJNKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWlmICh0LT5lbmFibGVkKQorCQltcnN0X2lycV9lbmFibGUobXJzdCwgUlRDX0FJRSk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBDdXJyZW50bHksIHRoZSB2UlRDIGRvZXNuJ3Qgc3VwcG9ydCBVSUUgT04vT0ZGICovCitzdGF0aWMgaW50IG1yc3RfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgbXJzdF9ydGMJKm1yc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJaWYgKGVuYWJsZWQpCisJCW1yc3RfaXJxX2VuYWJsZShtcnN0LCBSVENfQUlFKTsKKwllbHNlCisJCW1yc3RfaXJxX2Rpc2FibGUobXJzdCwgUlRDX0FJRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfUFJPQykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfUFJPQ19NT0RVTEUpCisKK3N0YXRpYyBpbnQgbXJzdF9wcm9jZnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwl1bnNpZ25lZCBjaGFyCXJ0Y19jb250cm9sLCB2YWxpZDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlydGNfY29udHJvbCA9IHZydGNfY21vc19yZWFkKFJUQ19DT05UUk9MKTsKKwl2YWxpZCA9IHZydGNfY21vc19yZWFkKFJUQ19WQUxJRCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gc2VxX3ByaW50ZihzZXEsCisJCQkicGVyaW9kaWNfSVJRXHQ6ICVzXG4iCisJCQkiYWxhcm1cdFx0OiAlc1xuIgorCQkJIkJDRFx0XHQ6IG5vXG4iCisJCQkicGVyaW9kaWNfZnJlcVx0OiBkYWlseSAobm90IGFkanVzdGFibGUpXG4iLAorCQkJKHJ0Y19jb250cm9sICYgUlRDX1BJRSkgPyAib24iIDogIm9mZiIsCisJCQkocnRjX2NvbnRyb2wgJiBSVENfQUlFKSA/ICJvbiIgOiAib2ZmIik7Cit9CisKKyNlbHNlCisjZGVmaW5lCW1yc3RfcHJvY2ZzCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgbXJzdF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBtcnN0X3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBtcnN0X3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gbXJzdF9yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBtcnN0X3NldF9hbGFybSwKKwkucHJvYwkJPSBtcnN0X3Byb2NmcywKKwkuYWxhcm1faXJxX2VuYWJsZSA9IG1yc3RfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgc3RydWN0IG1yc3RfcnRjCW1yc3RfcnRjOworCisvKgorICogV2hlbiB2UlRDIElSUSBpcyBjYXB0dXJlZCBieSBTQ1UgRlcsIEZXIHdpbGwgY2xlYXIgdGhlIEFJRSBiaXQgaW4KKyAqIFJlZyBCLCBzbyBubyBuZWVkIGZvciB0aGlzIGRyaXZlciB0byBjbGVhciBpdAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbXJzdF9ydGNfaXJxKGludCBpcnEsIHZvaWQgKnApCit7CisJdTggaXJxc3RhdDsKKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCS8qIFRoaXMgcmVhZCB3aWxsIGNsZWFyIGFsbCBJUlEgZmxhZ3MgaW5zaWRlIFJlZyBDICovCisJaXJxc3RhdCA9IHZydGNfY21vc19yZWFkKFJUQ19JTlRSX0ZMQUdTKTsKKwlzcGluX3VubG9jaygmcnRjX2xvY2spOworCisJaXJxc3RhdCAmPSBSVENfSVJRTUFTSyB8IFJUQ19JUlFGOworCWlmIChpc19pbnRyKGlycXN0YXQpKSB7CisJCXJ0Y191cGRhdGVfaXJxKHAsIDEsIGlycXN0YXQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3ZydGNfbXJzdF9kb19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqaW9tZW0sIGludCBydGNfaXJxKQoreworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGNoYXIgcnRjX2NvbnRyb2w7CisKKwkvKiBUaGVyZSBjYW4gYmUgb25seSBvbmUgLi4uICovCisJaWYgKG1yc3RfcnRjLmRldikKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghaW9tZW0pCisJCXJldHVybiAtRU5PREVWOworCisJaW9tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24oaW9tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvbWVtKSwKKwkJCQkgICBkcml2ZXJfbmFtZSk7CisJaWYgKCFpb21lbSkgeworCQlkZXZfZGJnKGRldiwgImkvbyBtZW0gYWxyZWFkeSBpbiB1c2UuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwltcnN0X3J0Yy5pcnEgPSBydGNfaXJxOworCW1yc3RfcnRjLmlvbWVtID0gaW9tZW07CisJbXJzdF9ydGMuZGV2ID0gZGV2OworCWRldl9zZXRfZHJ2ZGF0YShkZXYsICZtcnN0X3J0Yyk7CisKKwltcnN0X3J0Yy5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKGRyaXZlcl9uYW1lLCBkZXYsCisJCQkJJm1yc3RfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIobXJzdF9ydGMucnRjKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKG1yc3RfcnRjLnJ0Yyk7CisJCWdvdG8gY2xlYW51cDA7CisJfQorCisJcmVuYW1lX3JlZ2lvbihpb21lbSwgZGV2X25hbWUoJm1yc3RfcnRjLnJ0Yy0+ZGV2KSk7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJbXJzdF9pcnFfZGlzYWJsZSgmbXJzdF9ydGMsIFJUQ19QSUUgfCBSVENfQUlFKTsKKwlydGNfY29udHJvbCA9IHZydGNfY21vc19yZWFkKFJUQ19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmICghKHJ0Y19jb250cm9sICYgUlRDXzI0SCkgfHwgKHJ0Y19jb250cm9sICYgKFJUQ19ETV9CSU5BUlkpKSkKKwkJZGV2X2RiZyhkZXYsICJUT0RPOiBzdXBwb3J0IG1vcmUgdGhhbiAyNC1ociBCQ0QgbW9kZVxuIik7CisKKwlpZiAocnRjX2lycSkgeworCQlyZXR2YWwgPSByZXF1ZXN0X2lycShydGNfaXJxLCBtcnN0X3J0Y19pcnEsCisJCQkJMCwgZGV2X25hbWUoJm1yc3RfcnRjLnJ0Yy0+ZGV2KSwKKwkJCQltcnN0X3J0Yy5ydGMpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZGV2X2RiZyhkZXYsICJJUlEgJWQgaXMgYWxyZWFkeSBpbiB1c2UsIGVyciAlZFxuIiwKKwkJCQlydGNfaXJxLCByZXR2YWwpOworCQkJZ290byBjbGVhbnVwMTsKKwkJfQorCX0KKwlkZXZfZGJnKGRldiwgImluaXRpYWxpc2VkXG4iKTsKKwlyZXR1cm4gMDsKKworY2xlYW51cDE6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKG1yc3RfcnRjLnJ0Yyk7CitjbGVhbnVwMDoKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwltcnN0X3J0Yy5kZXYgPSBOVUxMOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpb21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9tZW0pKTsKKwlkZXZfZXJyKGRldiwgInJ0Yy1tcnN0OiB1bmFibGUgdG8gaW5pdGlhbGlzZVxuIik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgcnRjX21yc3RfZG9fc2h1dGRvd24odm9pZCkKK3sKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJbXJzdF9pcnFfZGlzYWJsZSgmbXJzdF9ydGMsIFJUQ19JUlFNQVNLKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0Y19tcnN0X2RvX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1yc3RfcnRjCSptcnN0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJlc291cmNlICppb21lbTsKKworCXJ0Y19tcnN0X2RvX3NodXRkb3duKCk7CisKKwlpZiAobXJzdC0+aXJxKQorCQlmcmVlX2lycShtcnN0LT5pcnEsIG1yc3QtPnJ0Yyk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIobXJzdC0+cnRjKTsKKwltcnN0LT5ydGMgPSBOVUxMOworCisJaW9tZW0gPSBtcnN0LT5pb21lbTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW9tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvbWVtKSk7CisJbXJzdC0+aW9tZW0gPSBOVUxMOworCisJbXJzdC0+ZGV2ID0gTlVMTDsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKK30KKworI2lmZGVmCUNPTkZJR19QTQorc3RhdGljIGludCBtcnN0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3QgbXJzdF9ydGMJKm1yc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyCXRtcDsKKworCS8qIE9ubHkgdGhlIGFsYXJtIG1pZ2h0IGJlIGEgd2FrZXVwIGV2ZW50IHNvdXJjZSAqLworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwltcnN0LT5zdXNwZW5kX2N0cmwgPSB0bXAgPSB2cnRjX2Ntb3NfcmVhZChSVENfQ09OVFJPTCk7CisJaWYgKHRtcCAmIChSVENfUElFIHwgUlRDX0FJRSkpIHsKKwkJdW5zaWduZWQgY2hhcgltYXNrOworCisJCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQkJbWFzayA9IFJUQ19JUlFNQVNLICYgflJUQ19BSUU7CisJCWVsc2UKKwkJCW1hc2sgPSBSVENfSVJRTUFTSzsKKwkJdG1wICY9IH5tYXNrOworCQl2cnRjX2Ntb3Nfd3JpdGUodG1wLCBSVENfQ09OVFJPTCk7CisKKwkJbXJzdF9jaGVja2ludHIobXJzdCwgdG1wKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAodG1wICYgUlRDX0FJRSkgeworCQltcnN0LT5lbmFibGVkX3dha2UgPSAxOworCQllbmFibGVfaXJxX3dha2UobXJzdC0+aXJxKTsKKwl9CisKKwlkZXZfZGJnKCZtcnN0X3J0Yy5ydGMtPmRldiwgInN1c3BlbmQlcywgY3RybCAlMDJ4XG4iLAorCQkJKHRtcCAmIFJUQ19BSUUpID8gIiwgYWxhcm0gbWF5IHdha2UiIDogIiIsCisJCQl0bXApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSB3YW50IFJUQyBhbGFybXMgdG8gd2FrZSB1cyBmcm9tIHRoZSBkZWVwIHBvd2VyIHNhdmluZyBzdGF0ZQorICovCitzdGF0aWMgaW5saW5lIGludCBtcnN0X3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbXJzdF9zdXNwZW5kKGRldiwgUE1TR19ISUJFUk5BVEUpOworfQorCitzdGF0aWMgaW50IG1yc3RfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXJzdF9ydGMJKm1yc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIHRtcCA9IG1yc3QtPnN1c3BlbmRfY3RybDsKKworCS8qIFJlLWVuYWJsZSBhbnkgaXJxcyBwcmV2aW91c2x5IGFjdGl2ZSAqLworCWlmICh0bXAgJiBSVENfSVJRTUFTSykgeworCQl1bnNpZ25lZCBjaGFyCW1hc2s7CisKKwkJaWYgKG1yc3QtPmVuYWJsZWRfd2FrZSkgeworCQkJZGlzYWJsZV9pcnFfd2FrZShtcnN0LT5pcnEpOworCQkJbXJzdC0+ZW5hYmxlZF93YWtlID0gMDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJZG8geworCQkJdnJ0Y19jbW9zX3dyaXRlKHRtcCwgUlRDX0NPTlRST0wpOworCisJCQltYXNrID0gdnJ0Y19jbW9zX3JlYWQoUlRDX0lOVFJfRkxBR1MpOworCQkJbWFzayAmPSAodG1wICYgUlRDX0lSUU1BU0spIHwgUlRDX0lSUUY7CisJCQlpZiAoIWlzX2ludHIobWFzaykpCisJCQkJYnJlYWs7CisKKwkJCXJ0Y191cGRhdGVfaXJxKG1yc3QtPnJ0YywgMSwgbWFzayk7CisJCQl0bXAgJj0gflJUQ19BSUU7CisJCX0gd2hpbGUgKG1hc2sgJiBSVENfQUlFKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJfQorCisJZGV2X2RiZygmbXJzdF9ydGMucnRjLT5kZXYsICJyZXN1bWUsIGN0cmwgJTAyeFxuIiwgdG1wKTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZQltcnN0X3N1c3BlbmQJTlVMTAorI2RlZmluZQltcnN0X3Jlc3VtZQlOVUxMCisKK3N0YXRpYyBpbmxpbmUgaW50IG1yc3RfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAtRU5PU1lTOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgdnJ0Y19tcnN0X3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHZydGNfbXJzdF9kb19wcm9iZSgmcGRldi0+ZGV2LAorCQkJcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKSwKKwkJCXBsYXRmb3JtX2dldF9pcnEocGRldiwgMCkpOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB2cnRjX21yc3RfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcnRjX21yc3RfZG9fcmVtb3ZlKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2cnRjX21yc3RfcGxhdGZvcm1fc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9QT1dFUl9PRkYgJiYgIW1yc3RfcG93ZXJvZmYoJnBkZXYtPmRldikpCisJCXJldHVybjsKKworCXJ0Y19tcnN0X2RvX3NodXRkb3duKCk7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06dnJ0Y19tcnN0Iik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZydGNfbXJzdF9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHZydGNfbXJzdF9wbGF0Zm9ybV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZydGNfbXJzdF9wbGF0Zm9ybV9yZW1vdmUpLAorCS5zaHV0ZG93bgk9IHZydGNfbXJzdF9wbGF0Zm9ybV9zaHV0ZG93biwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAoY2hhciAqKSBkcml2ZXJfbmFtZSwKKwkJLnN1c3BlbmQJPSBtcnN0X3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gbXJzdF9yZXN1bWUsCisJfQorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih2cnRjX21yc3RfcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFjb2IgUGFuOyBGZW5nIFRhbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBNb29yZXN0b3duIHZpcnR1YWwgUlRDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbXNtNjI0Mi5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1zbTYyNDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2IxMTNjCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW1zbTYyNDIuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqICBPa2kgTVNNNjI0MiBSVEMgRHJpdmVyCisgKgorICogIENvcHlyaWdodCAyMDA5IEdlZXJ0IFV5dHRlcmhvZXZlbgorICoKKyAqICBCYXNlZCBvbiB0aGUgQTIwMDAgVE9EIGNvZGUgaW4gYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzIEhhbWlzaCBNYWNkb25hbGQKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworCitlbnVtIHsKKwlNU002MjQyX1NFQ09ORDEJCT0gMHgwLAkvKiAxLXNlY29uZCBkaWdpdCByZWdpc3RlciAqLworCU1TTTYyNDJfU0VDT05EMTAJPSAweDEsCS8qIDEwLXNlY29uZCBkaWdpdCByZWdpc3RlciAqLworCU1TTTYyNDJfTUlOVVRFMQkJPSAweDIsCS8qIDEtbWludXRlIGRpZ2l0IHJlZ2lzdGVyICovCisJTVNNNjI0Ml9NSU5VVEUxMAk9IDB4MywJLyogMTAtbWludXRlIGRpZ2l0IHJlZ2lzdGVyICovCisJTVNNNjI0Ml9IT1VSMQkJPSAweDQsCS8qIDEtaG91ciBkaWdpdCByZWdpc3RlciAqLworCU1TTTYyNDJfSE9VUjEwCQk9IDB4NSwJLyogUE0vQU0sIDEwLWhvdXIgZGlnaXQgcmVnaXN0ZXIgKi8KKwlNU002MjQyX0RBWTEJCT0gMHg2LAkvKiAxLWRheSBkaWdpdCByZWdpc3RlciAqLworCU1TTTYyNDJfREFZMTAJCT0gMHg3LAkvKiAxMC1kYXkgZGlnaXQgcmVnaXN0ZXIgKi8KKwlNU002MjQyX01PTlRIMQkJPSAweDgsCS8qIDEtbW9udGggZGlnaXQgcmVnaXN0ZXIgKi8KKwlNU002MjQyX01PTlRIMTAJCT0gMHg5LAkvKiAxMC1tb250aCBkaWdpdCByZWdpc3RlciAqLworCU1TTTYyNDJfWUVBUjEJCT0gMHhhLAkvKiAxLXllYXIgZGlnaXQgcmVnaXN0ZXIgKi8KKwlNU002MjQyX1lFQVIxMAkJPSAweGIsCS8qIDEwLXllYXIgZGlnaXQgcmVnaXN0ZXIgKi8KKwlNU002MjQyX1dFRUsJCT0gMHhjLAkvKiBXZWVrIHJlZ2lzdGVyICovCisJTVNNNjI0Ml9DRAkJPSAweGQsCS8qIENvbnRyb2wgUmVnaXN0ZXIgRCAqLworCU1TTTYyNDJfQ0UJCT0gMHhlLAkvKiBDb250cm9sIFJlZ2lzdGVyIEUgKi8KKwlNU002MjQyX0NGCQk9IDB4ZiwJLyogQ29udHJvbCBSZWdpc3RlciBGICovCit9OworCisjZGVmaW5lIE1TTTYyNDJfSE9VUjEwX0FNCSgwIDw8IDIpCisjZGVmaW5lIE1TTTYyNDJfSE9VUjEwX1BNCSgxIDw8IDIpCisjZGVmaW5lIE1TTTYyNDJfSE9VUjEwX0hSX01BU0sJKDMgPDwgMCkKKworI2RlZmluZSBNU002MjQyX1dFRUtfU1VOREFZCTAKKyNkZWZpbmUgTVNNNjI0Ml9XRUVLX01PTkRBWQkxCisjZGVmaW5lIE1TTTYyNDJfV0VFS19UVUVTREFZCTIKKyNkZWZpbmUgTVNNNjI0Ml9XRUVLX1dFRE5FU0RBWQkzCisjZGVmaW5lIE1TTTYyNDJfV0VFS19USFVSU0RBWQk0CisjZGVmaW5lIE1TTTYyNDJfV0VFS19GUklEQVkJNQorI2RlZmluZSBNU002MjQyX1dFRUtfU0FUVVJEQVkJNgorCisjZGVmaW5lIE1TTTYyNDJfQ0RfMzBfU19BREoJKDEgPDwgMykJLyogMzAtc2Vjb25kIGFkanVzdG1lbnQgKi8KKyNkZWZpbmUgTVNNNjI0Ml9DRF9JUlFfRkxBRwkoMSA8PCAyKQorI2RlZmluZSBNU002MjQyX0NEX0JVU1kJCSgxIDw8IDEpCisjZGVmaW5lIE1TTTYyNDJfQ0RfSE9MRAkJKDEgPDwgMCkKKworI2RlZmluZSBNU002MjQyX0NFX1RfTUFTSwkoMyA8PCAyKQorI2RlZmluZSBNU002MjQyX0NFX1RfNjRIWgkoMCA8PCAyKQkvKiBwZXJpb2QgMS82NCBzZWNvbmQgKi8KKyNkZWZpbmUgTVNNNjI0Ml9DRV9UXzFIWgkoMSA8PCAyKQkvKiBwZXJpb2QgMSBzZWNvbmQgKi8KKyNkZWZpbmUgTVNNNjI0Ml9DRV9UXzFNSU5VVEUJKDIgPDwgMikJLyogcGVyaW9kIDEgbWludXRlICovCisjZGVmaW5lIE1TTTYyNDJfQ0VfVF8xSE9VUgkoMyA8PCAyKQkvKiBwZXJpb2QgMSBob3VyICovCisKKyNkZWZpbmUgTVNNNjI0Ml9DRV9JVFJQVF9TVE5ECSgxIDw8IDEpCisjZGVmaW5lIE1TTTYyNDJfQ0VfTUFTSwkJKDEgPDwgMCkJLyogU1RELlAgb3V0cHV0IGNvbnRyb2wgKi8KKworI2RlZmluZSBNU002MjQyX0NGX1RFU1QJCSgxIDw8IDMpCisjZGVmaW5lIE1TTTYyNDJfQ0ZfMTJICQkoMCA8PCAyKQorI2RlZmluZSBNU002MjQyX0NGXzI0SAkJKDEgPDwgMikKKyNkZWZpbmUgTVNNNjI0Ml9DRl9TVE9QCQkoMSA8PCAxKQorI2RlZmluZSBNU002MjQyX0NGX1JFU1QJCSgxIDw8IDApCS8qIHJlc2V0ICovCisKKworc3RydWN0IG1zbTYyNDJfcHJpdiB7CisJdTMyIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1zbTYyNDJfcmVhZChzdHJ1Y3QgbXNtNjI0Ml9wcml2ICpwcml2LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiBfX3Jhd19yZWFkbCgmcHJpdi0+cmVnc1tyZWddKSAmIDB4ZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbTYyNDJfd3JpdGUoc3RydWN0IG1zbTYyNDJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHZhbCwKKwkJCQl1bnNpZ25lZCBpbnQgcmVnKQoreworCV9fcmF3X3dyaXRlbCh2YWwsICZwcml2LT5yZWdzW3JlZ10pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtNjI0Ml9zZXQoc3RydWN0IG1zbTYyNDJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHZhbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVnKQoreworCW1zbTYyNDJfd3JpdGUocHJpdiwgbXNtNjI0Ml9yZWFkKHByaXYsIHJlZykgfCB2YWwsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc202MjQyX2NsZWFyKHN0cnVjdCBtc202MjQyX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCB2YWwsCisJCQkJIHVuc2lnbmVkIGludCByZWcpCit7CisJbXNtNjI0Ml93cml0ZShwcml2LCBtc202MjQyX3JlYWQocHJpdiwgcmVnKSAmIH52YWwsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbTYyNDJfbG9jayhzdHJ1Y3QgbXNtNjI0Ml9wcml2ICpwcml2KQoreworCWludCBjbnQgPSA1OworCisJbXNtNjI0Ml9zZXQocHJpdiwgTVNNNjI0Ml9DRF9IT0xELCBNU002MjQyX0NEKTsKKworCXdoaWxlICgobXNtNjI0Ml9yZWFkKHByaXYsIE1TTTYyNDJfQ0QpICYgTVNNNjI0Ml9DRF9CVVNZKSAmJiBjbnQpIHsKKwkJbXNtNjI0Ml9jbGVhcihwcml2LCBNU002MjQyX0NEX0hPTEQsIE1TTTYyNDJfQ0QpOworCQl1ZGVsYXkoNzApOworCQltc202MjQyX3NldChwcml2LCBNU002MjQyX0NEX0hPTEQsIE1TTTYyNDJfQ0QpOworCQljbnQtLTsKKwl9CisKKwlpZiAoIWNudCkKKwkJcHJfd2FybmluZygibXNtNjI0MjogdGltZWQgb3V0IHdhaXRpbmcgZm9yIFJUQyAoMHgleClcbiIsCisJCQkgICBtc202MjQyX3JlYWQocHJpdiwgTVNNNjI0Ml9DRCkpOworfQorCitzdGF0aWMgdm9pZCBtc202MjQyX3VubG9jayhzdHJ1Y3QgbXNtNjI0Ml9wcml2ICpwcml2KQoreworCW1zbTYyNDJfY2xlYXIocHJpdiwgTVNNNjI0Ml9DRF9IT0xELCBNU002MjQyX0NEKTsKK30KKworc3RhdGljIGludCBtc202MjQyX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IG1zbTYyNDJfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJbXNtNjI0Ml9sb2NrKHByaXYpOworCisJdG0tPnRtX3NlYyAgPSBtc202MjQyX3JlYWQocHJpdiwgTVNNNjI0Ml9TRUNPTkQxMCkgKiAxMCArCisJCSAgICAgIG1zbTYyNDJfcmVhZChwcml2LCBNU002MjQyX1NFQ09ORDEpOworCXRtLT50bV9taW4gID0gbXNtNjI0Ml9yZWFkKHByaXYsIE1TTTYyNDJfTUlOVVRFMTApICogMTAgKworCQkgICAgICBtc202MjQyX3JlYWQocHJpdiwgTVNNNjI0Ml9NSU5VVEUxKTsKKwl0bS0+dG1faG91ciA9IChtc202MjQyX3JlYWQocHJpdiwgTVNNNjI0Ml9IT1VSMTAgJiAzKSkgKiAxMCArCisJCSAgICAgIG1zbTYyNDJfcmVhZChwcml2LCBNU002MjQyX0hPVVIxKTsKKwl0bS0+dG1fbWRheSA9IG1zbTYyNDJfcmVhZChwcml2LCBNU002MjQyX0RBWTEwKSAqIDEwICsKKwkJICAgICAgbXNtNjI0Ml9yZWFkKHByaXYsIE1TTTYyNDJfREFZMSk7CisJdG0tPnRtX3dkYXkgPSBtc202MjQyX3JlYWQocHJpdiwgTVNNNjI0Ml9XRUVLKTsKKwl0bS0+dG1fbW9uICA9IG1zbTYyNDJfcmVhZChwcml2LCBNU002MjQyX01PTlRIMTApICogMTAgKworCQkgICAgICBtc202MjQyX3JlYWQocHJpdiwgTVNNNjI0Ml9NT05USDEpIC0gMTsKKwl0bS0+dG1feWVhciA9IG1zbTYyNDJfcmVhZChwcml2LCBNU002MjQyX1lFQVIxMCkgKiAxMCArCisJCSAgICAgIG1zbTYyNDJfcmVhZChwcml2LCBNU002MjQyX1lFQVIxKTsKKwlpZiAodG0tPnRtX3llYXIgPD0gNjkpCisJCXRtLT50bV95ZWFyICs9IDEwMDsKKworCWlmICghKG1zbTYyNDJfcmVhZChwcml2LCBNU002MjQyX0NGKSAmIE1TTTYyNDJfQ0ZfMjRIKSkgeworCQl1bnNpZ25lZCBpbnQgcG0gPSBtc202MjQyX3JlYWQocHJpdiwgTVNNNjI0Ml9IT1VSMTApICYKKwkJCQkgIE1TTTYyNDJfSE9VUjEwX1BNOworCQlpZiAoIXBtICYmIHRtLT50bV9ob3VyID09IDEyKQorCQkJdG0tPnRtX2hvdXIgPSAwOworCQllbHNlIGlmIChwbSAmJiB0bS0+dG1faG91ciAhPSAxMikKKwkJCXRtLT50bV9ob3VyICs9IDEyOworCX0KKworCW1zbTYyNDJfdW5sb2NrKHByaXYpOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtNjI0Ml9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IG1zbTYyNDJfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJbXNtNjI0Ml9sb2NrKHByaXYpOworCisJbXNtNjI0Ml93cml0ZShwcml2LCB0bS0+dG1fc2VjIC8gMTAsIE1TTTYyNDJfU0VDT05EMTApOworCW1zbTYyNDJfd3JpdGUocHJpdiwgdG0tPnRtX3NlYyAlIDEwLCBNU002MjQyX1NFQ09ORDEpOworCW1zbTYyNDJfd3JpdGUocHJpdiwgdG0tPnRtX21pbiAvIDEwLCBNU002MjQyX01JTlVURTEwKTsKKwltc202MjQyX3dyaXRlKHByaXYsIHRtLT50bV9taW4gJSAxMCwgTVNNNjI0Ml9NSU5VVEUxKTsKKwlpZiAobXNtNjI0Ml9yZWFkKHByaXYsIE1TTTYyNDJfQ0YpICYgTVNNNjI0Ml9DRl8yNEgpCisJCW1zbTYyNDJfd3JpdGUocHJpdiwgdG0tPnRtX2hvdXIgLyAxMCwgTVNNNjI0Ml9IT1VSMTApOworCWVsc2UgaWYgKHRtLT50bV9ob3VyID49IDEyKQorCQltc202MjQyX3dyaXRlKHByaXYsIE1TTTYyNDJfSE9VUjEwX1BNICsgKHRtLT50bV9ob3VyIC0gMTIpIC8gMTAsCisJCQkgICAgICBNU002MjQyX0hPVVIxMCk7CisJZWxzZQorCQltc202MjQyX3dyaXRlKHByaXYsIHRtLT50bV9ob3VyIC8gMTAsIE1TTTYyNDJfSE9VUjEwKTsKKwltc202MjQyX3dyaXRlKHByaXYsIHRtLT50bV9ob3VyICUgMTAsIE1TTTYyNDJfSE9VUjEpOworCW1zbTYyNDJfd3JpdGUocHJpdiwgdG0tPnRtX21kYXkgLyAxMCwgTVNNNjI0Ml9EQVkxMCk7CisJbXNtNjI0Ml93cml0ZShwcml2LCB0bS0+dG1fbWRheSAlIDEwLCBNU002MjQyX0RBWTEpOworCWlmICh0bS0+dG1fd2RheSAhPSAtMSkKKwkJbXNtNjI0Ml93cml0ZShwcml2LCB0bS0+dG1fd2RheSwgTVNNNjI0Ml9XRUVLKTsKKwltc202MjQyX3dyaXRlKHByaXYsICh0bS0+dG1fbW9uICsgMSkgLyAxMCwgTVNNNjI0Ml9NT05USDEwKTsKKwltc202MjQyX3dyaXRlKHByaXYsICh0bS0+dG1fbW9uICsgMSkgJSAxMCwgTVNNNjI0Ml9NT05USDEpOworCWlmICh0bS0+dG1feWVhciA+PSAxMDApCisJCXRtLT50bV95ZWFyIC09IDEwMDsKKwltc202MjQyX3dyaXRlKHByaXYsIHRtLT50bV95ZWFyIC8gMTAsIE1TTTYyNDJfWUVBUjEwKTsKKwltc202MjQyX3dyaXRlKHByaXYsIHRtLT50bV95ZWFyICUgMTAsIE1TTTYyNDJfWUVBUjEpOworCisJbXNtNjI0Ml91bmxvY2socHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtc202MjQyX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IG1zbTYyNDJfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG1zbTYyNDJfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc202MjQyX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IG1zbTYyNDJfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWludCBlcnJvcjsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIXByaXYtPnJlZ3MpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX3ByaXY7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgcHJpdik7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJydGMtbXNtNjI0MiIsICZkZXYtPmRldiwgJm1zbTYyNDJfcnRjX29wcywKKwkJCQkgIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKworCXByaXYtPnJ0YyA9IHJ0YzsKKwlyZXR1cm4gMDsKKworb3V0X3VubWFwOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJaW91bm1hcChwcml2LT5yZWdzKTsKK291dF9mcmVlX3ByaXY6CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBtc202MjQyX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtc202MjQyX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnJ0Yyk7CisJaW91bm1hcChwcml2LT5yZWdzKTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtNjI0Ml9ydGNfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gInJ0Yy1tc202MjQyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCT0gX19leGl0X3AobXNtNjI0Ml9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbTYyNDJfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtc202MjQyX3J0Y19kcml2ZXIsIG1zbTYyNDJfcnRjX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1zbTYyNDJfcnRjX2Zpbmkodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtNjI0Ml9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXNtNjI0Ml9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChtc202MjQyX3J0Y19maW5pKTsKKworTU9EVUxFX0FVVEhPUigiR2VlcnQgVXl0dGVyaG9ldmVuIDxnZWVydEBsaW51eC1tNjhrLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiT2tpIE1TTTYyNDIgUlRDIGRyaXZlciIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtbXNtNjI0MiIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW12LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjE4NWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW12LmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBSVEMgaW4gTWFydmVsbCBTb0NzLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKworI2RlZmluZSBSVENfVElNRV9SRUdfT0ZGUwkwCisjZGVmaW5lIFJUQ19TRUNPTkRTX09GRlMJMAorI2RlZmluZSBSVENfTUlOVVRFU19PRkZTCTgKKyNkZWZpbmUgUlRDX0hPVVJTX09GRlMJCTE2CisjZGVmaW5lIFJUQ19XREFZX09GRlMJCTI0CisjZGVmaW5lIFJUQ19IT1VSU18xMkhfTU9ERQkJKDEgPDwgMjIpIC8qIDEyIGhvdXJzIG1vZGUgKi8KKworI2RlZmluZSBSVENfREFURV9SRUdfT0ZGUwk0CisjZGVmaW5lIFJUQ19NREFZX09GRlMJCTAKKyNkZWZpbmUgUlRDX01PTlRIX09GRlMJCTgKKyNkZWZpbmUgUlRDX1lFQVJfT0ZGUwkJMTYKKworI2RlZmluZSBSVENfQUxBUk1fVElNRV9SRUdfT0ZGUwk4CisjZGVmaW5lIFJUQ19BTEFSTV9EQVRFX1JFR19PRkZTCTB4YworI2RlZmluZSBSVENfQUxBUk1fVkFMSUQJCSgxIDw8IDcpCisKKyNkZWZpbmUgUlRDX0FMQVJNX0lOVEVSUlVQVF9NQVNLX1JFR19PRkZTCTB4MTAKKyNkZWZpbmUgUlRDX0FMQVJNX0lOVEVSUlVQVF9DQVNVRV9SRUdfT0ZGUwkweDE0CisKK3N0cnVjdCBydGNfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludAkJaXJxOworfTsKKworc3RhdGljIGludCBtdl9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIJcnRjX3JlZzsKKworCXJ0Y19yZWcgPSAoYmluMmJjZCh0bS0+dG1fc2VjKSA8PCBSVENfU0VDT05EU19PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV9taW4pIDw8IFJUQ19NSU5VVEVTX09GRlMpIHwKKwkJKGJpbjJiY2QodG0tPnRtX2hvdXIpIDw8IFJUQ19IT1VSU19PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV93ZGF5KSA8PCBSVENfV0RBWV9PRkZTKTsKKwl3cml0ZWwocnRjX3JlZywgaW9hZGRyICsgUlRDX1RJTUVfUkVHX09GRlMpOworCisJcnRjX3JlZyA9IChiaW4yYmNkKHRtLT50bV9tZGF5KSA8PCBSVENfTURBWV9PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV9tb24gKyAxKSA8PCBSVENfTU9OVEhfT0ZGUykgfAorCQkoYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCkgPDwgUlRDX1lFQVJfT0ZGUyk7CisJd3JpdGVsKHJ0Y19yZWcsIGlvYWRkciArIFJUQ19EQVRFX1JFR19PRkZTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIJcnRjX3RpbWUsIHJ0Y19kYXRlOworCXVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgd2RheTsKKworCXJ0Y190aW1lID0gcmVhZGwoaW9hZGRyICsgUlRDX1RJTUVfUkVHX09GRlMpOworCXJ0Y19kYXRlID0gcmVhZGwoaW9hZGRyICsgUlRDX0RBVEVfUkVHX09GRlMpOworCisJc2Vjb25kID0gcnRjX3RpbWUgJiAweDdmOworCW1pbnV0ZSA9IChydGNfdGltZSA+PiBSVENfTUlOVVRFU19PRkZTKSAmIDB4N2Y7CisJaG91ciA9IChydGNfdGltZSA+PiBSVENfSE9VUlNfT0ZGUykgJiAweDNmOyAvKiBhc3N1bWUgMjQgaG91cnMgbW9kZSAqLworCXdkYXkgPSAocnRjX3RpbWUgPj4gUlRDX1dEQVlfT0ZGUykgJiAweDc7CisKKwlkYXkgPSBydGNfZGF0ZSAmIDB4M2Y7CisJbW9udGggPSAocnRjX2RhdGUgPj4gUlRDX01PTlRIX09GRlMpICYgMHgzZjsKKwl5ZWFyID0gKHJ0Y19kYXRlID4+IFJUQ19ZRUFSX09GRlMpICYgMHhmZjsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHNlY29uZCk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4obWludXRlKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oaG91cik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGRheSk7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHdkYXkpOworCXRtLT50bV9tb24gPSBiY2QyYmluKG1vbnRoKSAtIDE7CisJLyogaHcgY291bnRzIGZyb20geWVhciAyMDAwLCBidXQgdG1feWVhciBpcyByZWxhdGl2ZSB0byAxOTAwICovCisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHllYXIpICsgMTAwOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgbXZfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxtKQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIJcnRjX3RpbWUsIHJ0Y19kYXRlOworCXVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgd2RheTsKKworCXJ0Y190aW1lID0gcmVhZGwoaW9hZGRyICsgUlRDX0FMQVJNX1RJTUVfUkVHX09GRlMpOworCXJ0Y19kYXRlID0gcmVhZGwoaW9hZGRyICsgUlRDX0FMQVJNX0RBVEVfUkVHX09GRlMpOworCisJc2Vjb25kID0gcnRjX3RpbWUgJiAweDdmOworCW1pbnV0ZSA9IChydGNfdGltZSA+PiBSVENfTUlOVVRFU19PRkZTKSAmIDB4N2Y7CisJaG91ciA9IChydGNfdGltZSA+PiBSVENfSE9VUlNfT0ZGUykgJiAweDNmOyAvKiBhc3N1bWUgMjQgaG91cnMgbW9kZSAqLworCXdkYXkgPSAocnRjX3RpbWUgPj4gUlRDX1dEQVlfT0ZGUykgJiAweDc7CisKKwlkYXkgPSBydGNfZGF0ZSAmIDB4M2Y7CisJbW9udGggPSAocnRjX2RhdGUgPj4gUlRDX01PTlRIX09GRlMpICYgMHgzZjsKKwl5ZWFyID0gKHJ0Y19kYXRlID4+IFJUQ19ZRUFSX09GRlMpICYgMHhmZjsKKworCWFsbS0+dGltZS50bV9zZWMgPSBiY2QyYmluKHNlY29uZCk7CisJYWxtLT50aW1lLnRtX21pbiA9IGJjZDJiaW4obWludXRlKTsKKwlhbG0tPnRpbWUudG1faG91ciA9IGJjZDJiaW4oaG91cik7CisJYWxtLT50aW1lLnRtX21kYXkgPSBiY2QyYmluKGRheSk7CisJYWxtLT50aW1lLnRtX3dkYXkgPSBiY2QyYmluKHdkYXkpOworCWFsbS0+dGltZS50bV9tb24gPSBiY2QyYmluKG1vbnRoKSAtIDE7CisJLyogaHcgY291bnRzIGZyb20geWVhciAyMDAwLCBidXQgdG1feWVhciBpcyByZWxhdGl2ZSB0byAxOTAwICovCisJYWxtLT50aW1lLnRtX3llYXIgPSBiY2QyYmluKHllYXIpICsgMTAwOworCisJaWYgKHJ0Y192YWxpZF90bSgmYWxtLT50aW1lKSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJyZXRyaWV2ZWQgYWxhcm0gZGF0ZS90aW1lIGlzIG5vdCB2YWxpZC5cbiIpOworCQlydGNfdGltZV90b190bSgwLCAmYWxtLT50aW1lKTsKKwl9CisKKwlhbG0tPmVuYWJsZWQgPSAhIXJlYWRsKGlvYWRkciArIFJUQ19BTEFSTV9JTlRFUlJVUFRfTUFTS19SRUdfT0ZGUyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXUzMiBydGNfcmVnID0gMDsKKworCWlmIChhbG0tPnRpbWUudG1fc2VjID49IDApCisJCXJ0Y19yZWcgfD0gKFJUQ19BTEFSTV9WQUxJRCB8IGJpbjJiY2QoYWxtLT50aW1lLnRtX3NlYykpCisJCQk8PCBSVENfU0VDT05EU19PRkZTOworCWlmIChhbG0tPnRpbWUudG1fbWluID49IDApCisJCXJ0Y19yZWcgfD0gKFJUQ19BTEFSTV9WQUxJRCB8IGJpbjJiY2QoYWxtLT50aW1lLnRtX21pbikpCisJCQk8PCBSVENfTUlOVVRFU19PRkZTOworCWlmIChhbG0tPnRpbWUudG1faG91ciA+PSAwKQorCQlydGNfcmVnIHw9IChSVENfQUxBUk1fVkFMSUQgfCBiaW4yYmNkKGFsbS0+dGltZS50bV9ob3VyKSkKKwkJCTw8IFJUQ19IT1VSU19PRkZTOworCisJd3JpdGVsKHJ0Y19yZWcsIGlvYWRkciArIFJUQ19BTEFSTV9USU1FX1JFR19PRkZTKTsKKworCWlmIChhbG0tPnRpbWUudG1fbWRheSA+PSAwKQorCQlydGNfcmVnID0gKFJUQ19BTEFSTV9WQUxJRCB8IGJpbjJiY2QoYWxtLT50aW1lLnRtX21kYXkpKQorCQkJPDwgUlRDX01EQVlfT0ZGUzsKKwllbHNlCisJCXJ0Y19yZWcgPSAwOworCisJaWYgKGFsbS0+dGltZS50bV9tb24gPj0gMCkKKwkJcnRjX3JlZyB8PSAoUlRDX0FMQVJNX1ZBTElEIHwgYmluMmJjZChhbG0tPnRpbWUudG1fbW9uICsgMSkpCisJCQk8PCBSVENfTU9OVEhfT0ZGUzsKKworCWlmIChhbG0tPnRpbWUudG1feWVhciA+PSAwKQorCQlydGNfcmVnIHw9IChSVENfQUxBUk1fVkFMSUQgfCBiaW4yYmNkKGFsbS0+dGltZS50bV95ZWFyICUgMTAwKSkKKwkJCTw8IFJUQ19ZRUFSX09GRlM7CisKKwl3cml0ZWwocnRjX3JlZywgaW9hZGRyICsgUlRDX0FMQVJNX0RBVEVfUkVHX09GRlMpOworCXdyaXRlbCgwLCBpb2FkZHIgKyBSVENfQUxBUk1fSU5URVJSVVBUX0NBU1VFX1JFR19PRkZTKTsKKwl3cml0ZWwoYWxtLT5lbmFibGVkID8gMSA6IDAsCisJICAgICAgIGlvYWRkciArIFJUQ19BTEFSTV9JTlRFUlJVUFRfTUFTS19SRUdfT0ZGUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdl9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisKKwlpZiAocGRhdGEtPmlycSA8IDApCisJCXJldHVybiAtRUlOVkFMOyAvKiBmYWxsIGJhY2sgaW50byBydGMtZGV2J3MgZW11bGF0aW9uICovCisKKwlpZiAoZW5hYmxlZCkKKwkJd3JpdGVsKDEsIGlvYWRkciArIFJUQ19BTEFSTV9JTlRFUlJVUFRfTUFTS19SRUdfT0ZGUyk7CisJZWxzZQorCQl3cml0ZWwoMCwgaW9hZGRyICsgUlRDX0FMQVJNX0lOVEVSUlVQVF9NQVNLX1JFR19PRkZTKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IG12X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBkYXRhOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKworCS8qIGFsYXJtIGlycT8gKi8KKwlpZiAoIXJlYWRsKGlvYWRkciArIFJUQ19BTEFSTV9JTlRFUlJVUFRfQ0FTVUVfUkVHX09GRlMpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoMCwgaW9hZGRyICsgUlRDX0FMQVJNX0lOVEVSUlVQVF9DQVNVRV9SRUdfT0ZGUyk7CisJcnRjX3VwZGF0ZV9pcnEocGRhdGEtPnJ0YywgMSwgUlRDX0lSUUYgfCBSVENfQUYpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG12X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IG12X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gbXZfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG12X3J0Y19hbGFybV9vcHMgPSB7CisJLnJlYWRfdGltZQk9IG12X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gbXZfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gbXZfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IG12X3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBtdl9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG12X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YTsKKwlyZXNvdXJjZV9zaXplX3Qgc2l6ZTsKKwl1MzIgcnRjX3RpbWU7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCBzaXplLAorCQkJCSAgICAgcGRldi0+bmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlwZGF0YS0+aW9hZGRyID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHNpemUpOworCWlmICghcGRhdGEtPmlvYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBtYWtlIHN1cmUgdGhlIDI0IGhvdXJzIG1vZGUgaXMgZW5hYmxlZCAqLworCXJ0Y190aW1lID0gcmVhZGwocGRhdGEtPmlvYWRkciArIFJUQ19USU1FX1JFR19PRkZTKTsKKwlpZiAocnRjX3RpbWUgJiBSVENfSE9VUlNfMTJIX01PREUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiMjQgSG91cnMgbW9kZSBub3Qgc3VwcG9ydGVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIG1ha2Ugc3VyZSBpdCBpcyBhY3R1YWxseSBmdW5jdGlvbmFsICovCisJaWYgKHJ0Y190aW1lID09IDB4MDEwMDAwMDApIHsKKwkJc3NsZWVwKDEpOworCQlydGNfdGltZSA9IHJlYWRsKHBkYXRhLT5pb2FkZHIgKyBSVENfVElNRV9SRUdfT0ZGUyk7CisJCWlmIChydGNfdGltZSA9PSAweDAxMDAwMDAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnRlcm5hbCBSVEMgbm90IHRpY2tpbmdcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlwZGF0YS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCQlwZGF0YS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJCQkJICZtdl9ydGNfYWxhcm1fb3BzLAorCQkJCQkJIFRISVNfTU9EVUxFKTsKKwl9IGVsc2UKKwkJcGRhdGEtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkJCSAmbXZfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocGRhdGEtPnJ0YykpCisJCXJldHVybiBQVFJfRVJSKHBkYXRhLT5ydGMpOworCisJaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCQl3cml0ZWwoMCwgcGRhdGEtPmlvYWRkciArIFJUQ19BTEFSTV9JTlRFUlJVUFRfTUFTS19SRUdfT0ZGUyk7CisJCWlmIChkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHBkYXRhLT5pcnEsIG12X3J0Y19pbnRlcnJ1cHQsCisJCQkJICAgICBJUlFGX1NIQVJFRCwKKwkJCQkgICAgIHBkZXYtPm5hbWUsIHBkYXRhKSA8IDApIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbm90IGF2YWlsYWJsZS5cbiIpOworCQkJcGRhdGEtPmlycSA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IG12X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChwZGF0YS0+aXJxID49IDApCisJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcnRjX212X29mX21hdGNoX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtcnZsLG9yaW9uLXJ0YyIsIH0sCisJe30KK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXZfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKG12X3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtbXYiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHJ0Y19tdl9vZl9tYXRjaF90YWJsZSksCisJfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IG12X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtdl9ydGNfZHJpdmVyLCBtdl9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgbXZfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtdl9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXZfaW5pdCk7Cittb2R1bGVfZXhpdChtdl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2FlZWQgQmlzaGFyYSA8c2FlZWRAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtbXYiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1teGMuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1teGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2U1MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW14Yy5jCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisjZGVmaW5lIFJUQ19JTlBVVF9DTEtfMzI3NjhIWgkoMHgwMCA8PCA1KQorI2RlZmluZSBSVENfSU5QVVRfQ0xLXzMyMDAwSFoJKDB4MDEgPDwgNSkKKyNkZWZpbmUgUlRDX0lOUFVUX0NMS18zODQwMEhaCSgweDAyIDw8IDUpCisKKyNkZWZpbmUgUlRDX1NXX0JJVCAgICAgICgxIDw8IDApCisjZGVmaW5lIFJUQ19BTE1fQklUICAgICAoMSA8PCAyKQorI2RlZmluZSBSVENfMUhaX0JJVCAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUlRDXzJIWl9CSVQgICAgICgxIDw8IDcpCisjZGVmaW5lIFJUQ19TQU0wX0JJVCAgICAoMSA8PCA4KQorI2RlZmluZSBSVENfU0FNMV9CSVQgICAgKDEgPDwgOSkKKyNkZWZpbmUgUlRDX1NBTTJfQklUICAgICgxIDw8IDEwKQorI2RlZmluZSBSVENfU0FNM19CSVQgICAgKDEgPDwgMTEpCisjZGVmaW5lIFJUQ19TQU00X0JJVCAgICAoMSA8PCAxMikKKyNkZWZpbmUgUlRDX1NBTTVfQklUICAgICgxIDw8IDEzKQorI2RlZmluZSBSVENfU0FNNl9CSVQgICAgKDEgPDwgMTQpCisjZGVmaW5lIFJUQ19TQU03X0JJVCAgICAoMSA8PCAxNSkKKyNkZWZpbmUgUElUX0FMTF9PTiAgICAgIChSVENfMkhaX0JJVCB8IFJUQ19TQU0wX0JJVCB8IFJUQ19TQU0xX0JJVCB8IFwKKwkJCSBSVENfU0FNMl9CSVQgfCBSVENfU0FNM19CSVQgfCBSVENfU0FNNF9CSVQgfCBcCisJCQkgUlRDX1NBTTVfQklUIHwgUlRDX1NBTTZfQklUIHwgUlRDX1NBTTdfQklUKQorCisjZGVmaW5lIFJUQ19FTkFCTEVfQklUICAoMSA8PCA3KQorCisjZGVmaW5lIE1BWF9QSUVfTlVNICAgICA5CisjZGVmaW5lIE1BWF9QSUVfRlJFUSAgICA1MTIKK3N0YXRpYyBjb25zdCB1MzIgUElFX0JJVF9ERUZbTUFYX1BJRV9OVU1dWzJdID0geworCXsgMiwJCVJUQ18ySFpfQklUIH0sCisJeyA0LAkJUlRDX1NBTTBfQklUIH0sCisJeyA4LAkJUlRDX1NBTTFfQklUIH0sCisJeyAxNiwJCVJUQ19TQU0yX0JJVCB9LAorCXsgMzIsCQlSVENfU0FNM19CSVQgfSwKKwl7IDY0LAkJUlRDX1NBTTRfQklUIH0sCisJeyAxMjgsCQlSVENfU0FNNV9CSVQgfSwKKwl7IDI1NiwJCVJUQ19TQU02X0JJVCB9LAorCXsgTUFYX1BJRV9GUkVRLAlSVENfU0FNN19CSVQgfSwKK307CisKKyNkZWZpbmUgTVhDX1JUQ19USU1FCTAKKyNkZWZpbmUgTVhDX1JUQ19BTEFSTQkxCisKKyNkZWZpbmUgUlRDX0hPVVJNSU4JMHgwMAkvKiAgMzJiaXQgcnRjIGhvdXIvbWluIGNvdW50ZXIgcmVnICovCisjZGVmaW5lIFJUQ19TRUNPTkQJMHgwNAkvKiAgMzJiaXQgcnRjIHNlY29uZHMgY291bnRlciByZWcgKi8KKyNkZWZpbmUgUlRDX0FMUk1fSE0JMHgwOAkvKiAgMzJiaXQgcnRjIGFsYXJtIGhvdXIvbWluIHJlZyAqLworI2RlZmluZSBSVENfQUxSTV9TRUMJMHgwQwkvKiAgMzJiaXQgcnRjIGFsYXJtIHNlY29uZHMgcmVnICovCisjZGVmaW5lIFJUQ19SVENDVEwJMHgxMAkvKiAgMzJiaXQgcnRjIGNvbnRyb2wgcmVnICovCisjZGVmaW5lIFJUQ19SVENJU1IJMHgxNAkvKiAgMzJiaXQgcnRjIGludGVycnVwdCBzdGF0dXMgcmVnICovCisjZGVmaW5lIFJUQ19SVENJRU5SCTB4MTgJLyogIDMyYml0IHJ0YyBpbnRlcnJ1cHQgZW5hYmxlIHJlZyAqLworI2RlZmluZSBSVENfU1RQV0NICTB4MUMJLyogIDMyYml0IHJ0YyBzdG9wd2F0Y2ggbWluIHJlZyAqLworI2RlZmluZSBSVENfREFZUgkweDIwCS8qICAzMmJpdCBydGMgZGF5cyBjb3VudGVyIHJlZyAqLworI2RlZmluZSBSVENfREFZQUxBUk0JMHgyNAkvKiAgMzJiaXQgcnRjIGRheSBhbGFybSByZWcgKi8KKyNkZWZpbmUgUlRDX1RFU1QxCTB4MjgJLyogIDMyYml0IHJ0YyB0ZXN0IHJlZyAxICovCisjZGVmaW5lIFJUQ19URVNUMgkweDJDCS8qICAzMmJpdCBydGMgdGVzdCByZWcgMiAqLworI2RlZmluZSBSVENfVEVTVDMJMHgzMAkvKiAgMzJiaXQgcnRjIHRlc3QgcmVnIDMgKi8KKworc3RydWN0IHJ0Y19wbGF0X2RhdGEgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJaW50IGlycTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IHJ0Y190aW1lIGdfcnRjX2FsYXJtOworfTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBvYnRhaW4gdGhlIFJUQyB0aW1lIG9yIHRoZSBhbGFybSB2YWx1ZSBpbgorICogc2Vjb25kLgorICovCitzdGF0aWMgdTMyIGdldF9hbGFybV9vcl90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHRpbWVfYWxhcm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIgZGF5ID0gMCwgaHIgPSAwLCBtaW4gPSAwLCBzZWMgPSAwLCBocl9taW4gPSAwOworCisJc3dpdGNoICh0aW1lX2FsYXJtKSB7CisJY2FzZSBNWENfUlRDX1RJTUU6CisJCWRheSA9IHJlYWR3KGlvYWRkciArIFJUQ19EQVlSKTsKKwkJaHJfbWluID0gcmVhZHcoaW9hZGRyICsgUlRDX0hPVVJNSU4pOworCQlzZWMgPSByZWFkdyhpb2FkZHIgKyBSVENfU0VDT05EKTsKKwkJYnJlYWs7CisJY2FzZSBNWENfUlRDX0FMQVJNOgorCQlkYXkgPSByZWFkdyhpb2FkZHIgKyBSVENfREFZQUxBUk0pOworCQlocl9taW4gPSByZWFkdyhpb2FkZHIgKyBSVENfQUxSTV9ITSkgJiAweGZmZmY7CisJCXNlYyA9IHJlYWR3KGlvYWRkciArIFJUQ19BTFJNX1NFQyk7CisJCWJyZWFrOworCX0KKworCWhyID0gaHJfbWluID4+IDg7CisJbWluID0gaHJfbWluICYgMHhmZjsKKworCXJldHVybiAoKChkYXkgKiAyNCArIGhyKSAqIDYwKSArIG1pbikgKiA2MCArIHNlYzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgUlRDIGFsYXJtIHZhbHVlIG9yIHRoZSB0aW1lIHZhbHVlLgorICovCitzdGF0aWMgdm9pZCBzZXRfYWxhcm1fb3JfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCB0aW1lX2FsYXJtLCB1MzIgdGltZSkKK3sKKwl1MzIgZGF5LCBociwgbWluLCBzZWMsIHRlbXA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKworCWRheSA9IHRpbWUgLyA4NjQwMDsKKwl0aW1lIC09IGRheSAqIDg2NDAwOworCisJLyogdGltZSBpcyB3aXRoaW4gYSBkYXkgbm93ICovCisJaHIgPSB0aW1lIC8gMzYwMDsKKwl0aW1lIC09IGhyICogMzYwMDsKKworCS8qIHRpbWUgaXMgd2l0aGluIGFuIGhvdXIgbm93ICovCisJbWluID0gdGltZSAvIDYwOworCXNlYyA9IHRpbWUgLSBtaW4gKiA2MDsKKworCXRlbXAgPSAoaHIgPDwgOCkgKyBtaW47CisKKwlzd2l0Y2ggKHRpbWVfYWxhcm0pIHsKKwljYXNlIE1YQ19SVENfVElNRToKKwkJd3JpdGV3KGRheSwgaW9hZGRyICsgUlRDX0RBWVIpOworCQl3cml0ZXcoc2VjLCBpb2FkZHIgKyBSVENfU0VDT05EKTsKKwkJd3JpdGV3KHRlbXAsIGlvYWRkciArIFJUQ19IT1VSTUlOKTsKKwkJYnJlYWs7CisJY2FzZSBNWENfUlRDX0FMQVJNOgorCQl3cml0ZXcoZGF5LCBpb2FkZHIgKyBSVENfREFZQUxBUk0pOworCQl3cml0ZXcoc2VjLCBpb2FkZHIgKyBSVENfQUxSTV9TRUMpOworCQl3cml0ZXcodGVtcCwgaW9hZGRyICsgUlRDX0FMUk1fSE0pOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFJUQyBhbGFybSByZWdpc3RlcnMgYW5kIHRoZW4gY2xlYXJzIGFsbCB0aGUKKyAqIGludGVycnVwdCBzdGF0dXMgYml0cy4KKyAqLworc3RhdGljIGludCBydGNfdXBkYXRlX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICphbHJtKQoreworCXN0cnVjdCBydGNfdGltZSBhbGFybV90bSwgbm93X3RtOworCXVuc2lnbmVkIGxvbmcgbm93LCB0aW1lOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisKKwlub3cgPSBnZXRfYWxhcm1fb3JfdGltZShkZXYsIE1YQ19SVENfVElNRSk7CisJcnRjX3RpbWVfdG9fdG0obm93LCAmbm93X3RtKTsKKwlhbGFybV90bS50bV95ZWFyID0gbm93X3RtLnRtX3llYXI7CisJYWxhcm1fdG0udG1fbW9uID0gbm93X3RtLnRtX21vbjsKKwlhbGFybV90bS50bV9tZGF5ID0gbm93X3RtLnRtX21kYXk7CisJYWxhcm1fdG0udG1faG91ciA9IGFscm0tPnRtX2hvdXI7CisJYWxhcm1fdG0udG1fbWluID0gYWxybS0+dG1fbWluOworCWFsYXJtX3RtLnRtX3NlYyA9IGFscm0tPnRtX3NlYzsKKwlydGNfdG1fdG9fdGltZSgmYWxhcm1fdG0sICZ0aW1lKTsKKworCS8qIGNsZWFyIGFsbCB0aGUgaW50ZXJydXB0IHN0YXR1cyBiaXRzICovCisJd3JpdGV3KHJlYWR3KGlvYWRkciArIFJUQ19SVENJU1IpLCBpb2FkZHIgKyBSVENfUlRDSVNSKTsKKwlzZXRfYWxhcm1fb3JfdGltZShkZXYsIE1YQ19SVENfQUxBUk0sIHRpbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG14Y19ydGNfaXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBiaXQsCisJCQkJdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIgcmVnOworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJlZyA9IHJlYWR3KGlvYWRkciArIFJUQ19SVENJRU5SKTsKKworCWlmIChlbmFibGVkKQorCQlyZWcgfD0gYml0OworCWVsc2UKKwkJcmVnICY9IH5iaXQ7CisKKwl3cml0ZXcocmVnLCBpb2FkZHIgKyBSVENfUlRDSUVOUik7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdGhlIFJUQyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAqLworc3RhdGljIGlycXJldHVybl90IG14Y19ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2lkOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0dXM7CisJdTMyIGV2ZW50cyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSByZWFkdyhpb2FkZHIgKyBSVENfUlRDSVNSKSAmIHJlYWR3KGlvYWRkciArIFJUQ19SVENJRU5SKTsKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc291cmNlcyAqLworCXdyaXRldyhzdGF0dXMsIGlvYWRkciArIFJUQ19SVENJU1IpOworCisJLyogdXBkYXRlIGlycSBkYXRhICYgY291bnRlciAqLworCWlmIChzdGF0dXMgJiBSVENfQUxNX0JJVCkgeworCQlldmVudHMgfD0gKFJUQ19BRiB8IFJUQ19JUlFGKTsKKwkJLyogUlRDIGFsYXJtIHNob3VsZCBiZSBvbmUtc2hvdCAqLworCQlteGNfcnRjX2lycV9lbmFibGUoJnBkZXYtPmRldiwgUlRDX0FMTV9CSVQsIDApOworCX0KKworCWlmIChzdGF0dXMgJiBSVENfMUhaX0JJVCkKKwkJZXZlbnRzIHw9IChSVENfVUYgfCBSVENfSVJRRik7CisKKwlpZiAoc3RhdHVzICYgUElUX0FMTF9PTikKKwkJZXZlbnRzIHw9IChSVENfUEYgfCBSVENfSVJRRik7CisKKwlydGNfdXBkYXRlX2lycShwZGF0YS0+cnRjLCAxLCBldmVudHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkYXRhLT5ydGMtPmlycV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBDbGVhciBhbGwgaW50ZXJydXB0cyBhbmQgcmVsZWFzZSB0aGUgSVJRCisgKi8KK3N0YXRpYyB2b2lkIG14Y19ydGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKworCS8qIERpc2FibGUgYWxsIHJ0YyBpbnRlcnJ1cHRzICovCisJd3JpdGV3KDAsIGlvYWRkciArIFJUQ19SVENJRU5SKTsKKworCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgc3RhdHVzICovCisJd3JpdGV3KDB4ZmZmZmZmZmYsIGlvYWRkciArIFJUQ19SVENJU1IpOworCisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbXhjX3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJbXhjX3J0Y19pcnFfZW5hYmxlKGRldiwgUlRDX0FMTV9CSVQsIGVuYWJsZWQpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY3VycmVudCBSVEMgdGltZSBpbnRvIHRtIGluIEdyZWdvcmlhbiBkYXRlLgorICovCitzdGF0aWMgaW50IG14Y19ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1MzIgdmFsOworCisJLyogQXZvaWQgcm9sbC1vdmVyIGZyb20gcmVhZGluZyB0aGUgZGlmZmVyZW50IHJlZ2lzdGVycyAqLworCWRvIHsKKwkJdmFsID0gZ2V0X2FsYXJtX29yX3RpbWUoZGV2LCBNWENfUlRDX1RJTUUpOworCX0gd2hpbGUgKHZhbCAhPSBnZXRfYWxhcm1fb3JfdGltZShkZXYsIE1YQ19SVENfVElNRSkpOworCisJcnRjX3RpbWVfdG9fdG0odmFsLCB0bSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaW50ZXJuYWwgUlRDIHRpbWUgYmFzZWQgb24gdG0gaW4gR3JlZ29yaWFuIGRhdGUuCisgKi8KK3N0YXRpYyBpbnQgbXhjX3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgdGltZSkKK3sKKwkvKgorCSAqIFRUQ19EQVlSIHJlZ2lzdGVyIGlzIDktYml0IGluIE1YMSBTb0MsIHNhdmUgdGltZSBhbmQgZGF5IG9mIHllYXIgb25seQorCSAqLworCWlmIChjcHVfaXNfbXgxKCkpIHsKKwkJc3RydWN0IHJ0Y190aW1lIHRtOworCisJCXJ0Y190aW1lX3RvX3RtKHRpbWUsICZ0bSk7CisJCXRtLnRtX3llYXIgPSA3MDsKKwkJcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGltZSk7CisJfQorCisJLyogQXZvaWQgcm9sbC1vdmVyIGZyb20gcmVhZGluZyB0aGUgZGlmZmVyZW50IHJlZ2lzdGVycyAqLworCWRvIHsKKwkJc2V0X2FsYXJtX29yX3RpbWUoZGV2LCBNWENfUlRDX1RJTUUsIHRpbWUpOworCX0gd2hpbGUgKHRpbWUgIT0gZ2V0X2FsYXJtX29yX3RpbWUoZGV2LCBNWENfUlRDX1RJTUUpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY3VycmVudCBhbGFybSB2YWx1ZSBpbnRvIHRoZSBwYXNzZWQgaW4gJ2Fscm0nCisgKiBhcmd1bWVudC4gSXQgdXBkYXRlcyB0aGUgYWxybSdzIHBlbmRpbmcgZmllbGQgdmFsdWUgYmFzZWQgb24gdGhlIHdoZXRoZXIKKyAqIGFuIGFsYXJtIGludGVycnVwdCBvY2N1cnMgb3Igbm90LgorICovCitzdGF0aWMgaW50IG14Y19ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisKKwlydGNfdGltZV90b190bShnZXRfYWxhcm1fb3JfdGltZShkZXYsIE1YQ19SVENfQUxBUk0pLCAmYWxybS0+dGltZSk7CisJYWxybS0+cGVuZGluZyA9ICgocmVhZHcoaW9hZGRyICsgUlRDX1JUQ0lTUikgJiBSVENfQUxNX0JJVCkpID8gMSA6IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgUlRDIGFsYXJtIGJhc2VkIG9uIHBhc3NlZCBpbiBhbHJtLgorICovCitzdGF0aWMgaW50IG14Y19ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBydGNfdXBkYXRlX2FsYXJtKGRldiwgJmFscm0tPnRpbWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltZW1jcHkoJnBkYXRhLT5nX3J0Y19hbGFybSwgJmFscm0tPnRpbWUsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKKwlteGNfcnRjX2lycV9lbmFibGUoZGV2LCBSVENfQUxNX0JJVCwgYWxybS0+ZW5hYmxlZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUlRDIGxheWVyICovCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgbXhjX3J0Y19vcHMgPSB7CisJLnJlbGVhc2UJCT0gbXhjX3J0Y19yZWxlYXNlLAorCS5yZWFkX3RpbWUJCT0gbXhjX3J0Y19yZWFkX3RpbWUsCisJLnNldF9tbXNzCQk9IG14Y19ydGNfc2V0X21tc3MsCisJLnJlYWRfYWxhcm0JCT0gbXhjX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JCT0gbXhjX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUJPSBteGNfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteGNfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBOVUxMOworCXUzMiByZWc7CisJdW5zaWduZWQgbG9uZyByYXRlOworCWludCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlwZGF0YS0+aW9hZGRyID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcykpOworCisJcGRhdGEtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInJ0YyIpOworCWlmIChJU19FUlIocGRhdGEtPmNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBjbG9jayFcbiIpOworCQlyZXQgPSBQVFJfRVJSKHBkYXRhLT5jbGspOworCQlnb3RvIGV4aXRfZnJlZV9wZGF0YTsKKwl9CisKKwljbGtfZW5hYmxlKHBkYXRhLT5jbGspOworCXJhdGUgPSBjbGtfZ2V0X3JhdGUocGRhdGEtPmNsayk7CisKKwlpZiAocmF0ZSA9PSAzMjc2OCkKKwkJcmVnID0gUlRDX0lOUFVUX0NMS18zMjc2OEhaOworCWVsc2UgaWYgKHJhdGUgPT0gMzIwMDApCisJCXJlZyA9IFJUQ19JTlBVVF9DTEtfMzIwMDBIWjsKKwllbHNlIGlmIChyYXRlID09IDM4NDAwKQorCQlyZWcgPSBSVENfSU5QVVRfQ0xLXzM4NDAwSFo7CisJZWxzZSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJ0YyBjbG9jayBpcyBub3QgdmFsaWQgKCVsdSlcbiIsIHJhdGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXRfcHV0X2NsazsKKwl9CisKKwlyZWcgfD0gUlRDX0VOQUJMRV9CSVQ7CisJd3JpdGV3KHJlZywgKHBkYXRhLT5pb2FkZHIgKyBSVENfUlRDQ1RMKSk7CisJaWYgKCgocmVhZHcocGRhdGEtPmlvYWRkciArIFJUQ19SVENDVEwpKSAmIFJUQ19FTkFCTEVfQklUKSA9PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImhhcmR3YXJlIG1vZHVsZSBjYW4ndCBiZSBlbmFibGVkIVxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXhpdF9wdXRfY2xrOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCS8qIENvbmZpZ3VyZSBhbmQgZW5hYmxlIHRoZSBSVEMgKi8KKwlwZGF0YS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCWlmIChwZGF0YS0+aXJxID49IDAgJiYKKwkgICAgZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBwZGF0YS0+aXJxLCBteGNfcnRjX2ludGVycnVwdCwKKwkJCSAgICAgSVJRRl9TSEFSRUQsIHBkZXYtPm5hbWUsIHBkZXYpIDwgMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJcGRhdGEtPmlycSA9IC0xOworCX0KKworCWlmIChwZGF0YS0+aXJxID49MCkKKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LCAmbXhjX3J0Y19vcHMsCisJCQkJICBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBleGl0X2Nscl9kcnZkYXRhOworCX0KKworCXBkYXRhLT5ydGMgPSBydGM7CisKKwlyZXR1cm4gMDsKKworZXhpdF9jbHJfZHJ2ZGF0YToKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK2V4aXRfcHV0X2NsazoKKwljbGtfZGlzYWJsZShwZGF0YS0+Y2xrKTsKKwljbGtfcHV0KHBkYXRhLT5jbGspOworCitleGl0X2ZyZWVfcGRhdGE6CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBteGNfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOworCisJY2xrX2Rpc2FibGUocGRhdGEtPmNsayk7CisJY2xrX3B1dChwZGF0YS0+Y2xrKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG14Y19ydGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKHBkYXRhLT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhjX3J0Y19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWRpc2FibGVfaXJxX3dha2UocGRhdGEtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIG14Y19ydGNfcG1fb3BzID0geworCS5zdXNwZW5kCT0gbXhjX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gbXhjX3J0Y19yZXN1bWUsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG14Y19ydGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lCT0gIm14Y19ydGMiLAorI2lmZGVmIENPTkZJR19QTQorCQkgICAucG0JCT0gJm14Y19ydGNfcG1fb3BzLAorI2VuZGlmCisJCSAgIC5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZQkJPSBfX2V4aXRfcChteGNfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteGNfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZteGNfcnRjX2RyaXZlciwgbXhjX3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBteGNfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXhjX3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChteGNfcnRjX2luaXQpOworbW9kdWxlX2V4aXQobXhjX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGFuaWVsIE1hY2sgPGRhbmllbEBjYWlhcS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUlRDIGRyaXZlciBmb3IgRnJlZXNjYWxlIE1YQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbnVjOTAwLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtbnVjOTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5MDEwOQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1udWM5MDAuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbi4KKyAqCisgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisvKiBSVEMgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkVHX1JUQ19JTklSCQkweDAwCisjZGVmaW5lIFJFR19SVENfQUVSCQkweDA0CisjZGVmaW5lIFJFR19SVENfRkNSCQkweDA4CisjZGVmaW5lIFJFR19SVENfVExSCQkweDBDCisjZGVmaW5lIFJFR19SVENfQ0xSCQkweDEwCisjZGVmaW5lIFJFR19SVENfVFNTUgkJMHgxNAorI2RlZmluZSBSRUdfUlRDX0RXUgkJMHgxOAorI2RlZmluZSBSRUdfUlRDX1RBUgkJMHgxQworI2RlZmluZSBSRUdfUlRDX0NBUgkJMHgyMAorI2RlZmluZSBSRUdfUlRDX0xJUgkJMHgyNAorI2RlZmluZSBSRUdfUlRDX1JJRVIJCTB4MjgKKyNkZWZpbmUgUkVHX1JUQ19SSUlSCQkweDJDCisjZGVmaW5lIFJFR19SVENfVFRSCQkweDMwCisKKyNkZWZpbmUgUlRDU0VUCQkJMHgwMQorI2RlZmluZSBBRVJSV0VOQgkJMHgxMDAwMAorI2RlZmluZSBJTklSUkVTRVQJCTB4YTVlYjEzNTcKKyNkZWZpbmUgQUVSUE9XRVJPTgkJMHhBOTY1CisjZGVmaW5lIEFFUlBPV0VST0ZGCQkweDAwMDAKKyNkZWZpbmUgTEVBUFlFQVIJCTB4MDAwMQorI2RlZmluZSBUSUNLRU5CCQkJMHg4MAorI2RlZmluZSBUSUNLSU5URU5CCQkweDAwMDIKKyNkZWZpbmUgQUxBUk1JTlRFTkIJCTB4MDAwMQorI2RlZmluZSBNT0RFMjQJCQkweDAwMDEKKworc3RydWN0IG51YzkwMF9ydGMgeworCWludAkJCWlycV9udW07CisJdm9pZCBfX2lvbWVtCQkqcnRjX3JlZzsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjZGV2OworfTsKKworc3RydWN0IG51YzkwMF9iY2RfdGltZSB7CisJaW50IGJjZF9zZWM7CisJaW50IGJjZF9taW47CisJaW50IGJjZF9ob3VyOworCWludCBiY2RfbWRheTsKKwlpbnQgYmNkX21vbjsKKwlpbnQgYmNkX3llYXI7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgbnVjOTAwX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqX3J0YykKK3sKKwlzdHJ1Y3QgbnVjOTAwX3J0YyAqcnRjID0gX3J0YzsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDAsIHJ0Y19pcnE7CisKKwlydGNfaXJxID0gX19yYXdfcmVhZGwocnRjLT5ydGNfcmVnICsgUkVHX1JUQ19SSUlSKTsKKworCWlmIChydGNfaXJxICYgQUxBUk1JTlRFTkIpIHsKKwkJcnRjX2lycSAmPSB+QUxBUk1JTlRFTkI7CisJCV9fcmF3X3dyaXRlbChydGNfaXJxLCBydGMtPnJ0Y19yZWcgKyBSRUdfUlRDX1JJSVIpOworCQlldmVudHMgfD0gUlRDX0FGIHwgUlRDX0lSUUY7CisJfQorCisJaWYgKHJ0Y19pcnEgJiBUSUNLSU5URU5CKSB7CisJCXJ0Y19pcnEgJj0gflRJQ0tJTlRFTkI7CisJCV9fcmF3X3dyaXRlbChydGNfaXJxLCBydGMtPnJ0Y19yZWcgKyBSRUdfUlRDX1JJSVIpOworCQlldmVudHMgfD0gUlRDX1VGIHwgUlRDX0lSUUY7CisJfQorCisJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGNkZXYsIDEsIGV2ZW50cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgKmNoZWNrX3J0Y19hY2Nlc3NfZW5hYmxlKHN0cnVjdCBudWM5MDBfcnRjICpudWM5MDBfcnRjKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMHgxMDAwOworCV9fcmF3X3dyaXRlbChJTklSUkVTRVQsIG51YzkwMF9ydGMtPnJ0Y19yZWcgKyBSRUdfUlRDX0lOSVIpOworCisJbWRlbGF5KDEwKTsKKworCV9fcmF3X3dyaXRlbChBRVJQT1dFUk9OLCBudWM5MDBfcnRjLT5ydGNfcmVnICsgUkVHX1JUQ19BRVIpOworCisJd2hpbGUgKCEoX19yYXdfcmVhZGwobnVjOTAwX3J0Yy0+cnRjX3JlZyArIFJFR19SVENfQUVSKSAmIEFFUlJXRU5CKQorCQkJCQkJCQkmJiB0aW1lb3V0LS0pCisJCW1kZWxheSgxKTsKKworCWlmICghdGltZW91dCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG51YzkwMF9ydGNfYmNkMmJpbih1bnNpZ25lZCBpbnQgdGltZXJlZywKKwkJCQl1bnNpZ25lZCBpbnQgY2FscmVnLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXRtLT50bV9tZGF5CT0gYmNkMmJpbihjYWxyZWcgPj4gMCk7CisJdG0tPnRtX21vbgk9IGJjZDJiaW4oY2FscmVnID4+IDgpOworCXRtLT50bV95ZWFyCT0gYmNkMmJpbihjYWxyZWcgPj4gMTYpICsgMTAwOworCisJdG0tPnRtX3NlYwk9IGJjZDJiaW4odGltZXJlZyA+PiAwKTsKKwl0bS0+dG1fbWluCT0gYmNkMmJpbih0aW1lcmVnID4+IDgpOworCXRtLT50bV9ob3VyCT0gYmNkMmJpbih0aW1lcmVnID4+IDE2KTsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfcnRjX2JpbjJiY2Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnNldHRtLAorCQkJCQkJc3RydWN0IG51YzkwMF9iY2RfdGltZSAqZ2V0dG0pCit7CisJZ2V0dG0tPmJjZF9tZGF5ID0gYmluMmJjZChzZXR0bS0+dG1fbWRheSkgPDwgMDsKKwlnZXR0bS0+YmNkX21vbiAgPSBiaW4yYmNkKHNldHRtLT50bV9tb24pIDw8IDg7CisKKwlpZiAoc2V0dG0tPnRtX3llYXIgPCAxMDApIHsKKwkJZGV2X3dhcm4oZGV2LCAiVGhlIHllYXIgd2lsbCBiZSBiZXR3ZWVuIDE5NzAtMTk5OSwgcmlnaHQ/XG4iKTsKKwkJZ2V0dG0tPmJjZF95ZWFyID0gYmluMmJjZChzZXR0bS0+dG1feWVhcikgPDwgMTY7CisJfSBlbHNlIHsKKwkJZ2V0dG0tPmJjZF95ZWFyID0gYmluMmJjZChzZXR0bS0+dG1feWVhciAtIDEwMCkgPDwgMTY7CisJfQorCisJZ2V0dG0tPmJjZF9zZWMgID0gYmluMmJjZChzZXR0bS0+dG1fc2VjKSA8PCAwOworCWdldHRtLT5iY2RfbWluICA9IGJpbjJiY2Qoc2V0dG0tPnRtX21pbikgPDwgODsKKwlnZXR0bS0+YmNkX2hvdXIgPSBiaW4yYmNkKHNldHRtLT50bV9ob3VyKSA8PCAxNjsKK30KKworc3RhdGljIGludCBudWM5MDBfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBudWM5MDBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChlbmFibGVkKQorCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwocnRjLT5ydGNfcmVnICsgUkVHX1JUQ19SSUVSKXwKKwkJCQkoQUxBUk1JTlRFTkIpLCBydGMtPnJ0Y19yZWcgKyBSRUdfUlRDX1JJRVIpOworCWVsc2UKKwkJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKHJ0Yy0+cnRjX3JlZyArIFJFR19SVENfUklFUikmCisJCQkJKH5BTEFSTUlOVEVOQiksIHJ0Yy0+cnRjX3JlZyArIFJFR19SVENfUklFUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudWM5MDBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IG51YzkwMF9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCB0aW1ldmFsLCBjbHJ2YWw7CisKKwl0aW1ldmFsID0gX19yYXdfcmVhZGwocnRjLT5ydGNfcmVnICsgUkVHX1JUQ19UTFIpOworCWNscnZhbAk9IF9fcmF3X3JlYWRsKHJ0Yy0+cnRjX3JlZyArIFJFR19SVENfQ0xSKTsKKworCXJldHVybiBudWM5MDBfcnRjX2JjZDJiaW4odGltZXZhbCwgY2xydmFsLCB0bSk7Cit9CisKK3N0YXRpYyBpbnQgbnVjOTAwX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IG51YzkwMF9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBudWM5MDBfYmNkX3RpbWUgZ2V0dG07CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50ICplcnI7CisKKwludWM5MDBfcnRjX2JpbjJiY2QoZGV2LCB0bSwgJmdldHRtKTsKKworCWVyciA9IGNoZWNrX3J0Y19hY2Nlc3NfZW5hYmxlKHJ0Yyk7CisJaWYgKElTX0VSUihlcnIpKQorCQlyZXR1cm4gUFRSX0VSUihlcnIpOworCisJdmFsID0gZ2V0dG0uYmNkX21kYXkgfCBnZXR0bS5iY2RfbW9uIHwgZ2V0dG0uYmNkX3llYXI7CisJX19yYXdfd3JpdGVsKHZhbCwgcnRjLT5ydGNfcmVnICsgUkVHX1JUQ19DTFIpOworCisJdmFsID0gZ2V0dG0uYmNkX3NlYyB8IGdldHRtLmJjZF9taW4gfCBnZXR0bS5iY2RfaG91cjsKKwlfX3Jhd193cml0ZWwodmFsLCBydGMtPnJ0Y19yZWcgKyBSRUdfUlRDX1RMUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudWM5MDBfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgbnVjOTAwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHRpbWV2YWwsIGNhcnZhbDsKKworCXRpbWV2YWwgPSBfX3Jhd19yZWFkbChydGMtPnJ0Y19yZWcgKyBSRUdfUlRDX1RBUik7CisJY2FydmFsCT0gX19yYXdfcmVhZGwocnRjLT5ydGNfcmVnICsgUkVHX1JUQ19DQVIpOworCisJcmV0dXJuIG51YzkwMF9ydGNfYmNkMmJpbih0aW1ldmFsLCBjYXJ2YWwsICZhbHJtLT50aW1lKTsKK30KKworc3RhdGljIGludCBudWM5MDBfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBudWM5MDBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbnVjOTAwX2JjZF90aW1lIHRtOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCAqZXJyOworCisJbnVjOTAwX3J0Y19iaW4yYmNkKGRldiwgJmFscm0tPnRpbWUsICZ0bSk7CisKKwllcnIgPSBjaGVja19ydGNfYWNjZXNzX2VuYWJsZShydGMpOworCWlmIChJU19FUlIoZXJyKSkKKwkJcmV0dXJuIFBUUl9FUlIoZXJyKTsKKworCXZhbCA9IHRtLmJjZF9tZGF5IHwgdG0uYmNkX21vbiB8IHRtLmJjZF95ZWFyOworCV9fcmF3X3dyaXRlbCh2YWwsIHJ0Yy0+cnRjX3JlZyArIFJFR19SVENfQ0FSKTsKKworCXZhbCA9IHRtLmJjZF9zZWMgfCB0bS5iY2RfbWluIHwgdG0uYmNkX2hvdXI7CisJX19yYXdfd3JpdGVsKHZhbCwgcnRjLT5ydGNfcmVnICsgUkVHX1JUQ19UQVIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBudWM5MDBfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gbnVjOTAwX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gbnVjOTAwX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IG51YzkwMF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gbnVjOTAwX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBudWM5MDBfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG51YzkwMF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgbnVjOTAwX3J0YyAqbnVjOTAwX3J0YzsKKwlpbnQgZXJyID0gMDsKKworCW51YzkwMF9ydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbnVjOTAwX3J0YyksIEdGUF9LRVJORUwpOworCWlmICghbnVjOTAwX3J0YykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJremFsbG9jIG51YzkwMF9ydGMgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZ2V0X3Jlc291cmNlIGZhaWxlZFxuIik7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCisJCQkJcGRldi0+bmFtZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwludWM5MDBfcnRjLT5ydGNfcmVnID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghbnVjOTAwX3J0Yy0+cnRjX3JlZykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpb3JlbWFwIHJ0Y19yZWcgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsMjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBudWM5MDBfcnRjKTsKKworCW51YzkwMF9ydGMtPnJ0Y2RldiA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkJCSZudWM5MDBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIobnVjOTAwX3J0Yy0+cnRjZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJydGMgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCWVyciA9IFBUUl9FUlIobnVjOTAwX3J0Yy0+cnRjZGV2KTsKKwkJZ290byBmYWlsMzsKKwl9CisKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwobnVjOTAwX3J0Yy0+cnRjX3JlZyArIFJFR19SVENfVFNTUikgfCBNT0RFMjQsCisJCQkJCW51YzkwMF9ydGMtPnJ0Y19yZWcgKyBSRUdfUlRDX1RTU1IpOworCisJbnVjOTAwX3J0Yy0+aXJxX251bSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHJlcXVlc3RfaXJxKG51YzkwMF9ydGMtPmlycV9udW0sIG51YzkwMF9ydGNfaW50ZXJydXB0LAorCQkJCTAsICJudWM5MDBydGMiLCBudWM5MDBfcnRjKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJOVUM5MDAgUlRDIHJlcXVlc3QgaXJxIGZhaWxlZFxuIik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBmYWlsNDsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDQ6CXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihudWM5MDBfcnRjLT5ydGNkZXYpOworZmFpbDM6CWlvdW5tYXAobnVjOTAwX3J0Yy0+cnRjX3JlZyk7CitmYWlsMjoJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CitmYWlsMToJa2ZyZWUobnVjOTAwX3J0Yyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbnVjOTAwX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbnVjOTAwX3J0YyAqbnVjOTAwX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJZnJlZV9pcnEobnVjOTAwX3J0Yy0+aXJxX251bSwgbnVjOTAwX3J0Yyk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKG51YzkwMF9ydGMtPnJ0Y2Rldik7CisJaW91bm1hcChudWM5MDBfcnRjLT5ydGNfcmVnKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisKKwlrZnJlZShudWM5MDBfcnRjKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG51YzkwMF9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobnVjOTAwX3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJudWM5MDAtcnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG51YzkwMF9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm51YzkwMF9ydGNfZHJpdmVyLCBudWM5MDBfcnRjX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG51YzkwMF9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZudWM5MDBfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG51YzkwMF9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChudWM5MDBfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIm51YzkxMC9udWM5MjAgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpudWM5MDAtcnRjIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtb21hcC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjYxNGUzCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLW9tYXAuYwpAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIFRJIE9NQVAxIFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIEF1dGhvcjogR2VvcmdlIEcuIERhdmlzIDxnZGF2aXNAbXZpc3RhLmNvbT4gb3IgPHNvdXJjZUBtdmlzdGEuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBCcm93bmVsbCAobmV3IFJUQyBmcmFtZXdvcmspCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisvKiBUaGUgT01BUDEgUlRDIGlzIGEgeWVhci9tb250aC9kYXkvaG91cnMvbWludXRlcy9zZWNvbmRzIEJDRCBjbG9jaworICogd2l0aCBjZW50dXJ5LXJhbmdlIGFsYXJtIG1hdGNoaW5nLCBkcml2ZW4gYnkgdGhlIDMya0h6IGNsb2NrLgorICoKKyAqIFRoZSBtYWluIHVzZXItdmlzaWJsZSB3YXlzIGl0IGRpZmZlcnMgZnJvbSBQQyBSVENzIGFyZSBieSBvbWl0dGluZworICogImRvbid0IGNhcmUiIGFsYXJtIGZpZWxkcyBhbmQgc3ViLXNlY29uZCBwZXJpb2RpYyBJUlFzLCBhbmQgaGF2aW5nCisgKiBhbiBhdXRvYWRqdXN0IG1lY2hhbmlzbSB0byBjYWxpYnJhdGUgdG8gdGhlIHRydWUgb3NjaWxsYXRvciByYXRlLgorICoKKyAqIEJvYXJkLXNwZWNpZmljIHdpcmluZyBvcHRpb25zIGluY2x1ZGUgdXNpbmcgc3BsaXQgcG93ZXIgbW9kZSB3aXRoCisgKiBSVENfT0ZGX05PRkYgdXNlZCBhcyB0aGUgcmVzZXQgc2lnbmFsIChzbyB0aGUgUlRDIHdvbid0IGJlIHJlc2V0KSwKKyAqIGFuZCB3aXJpbmcgUlRDX1dBS0VfSU5UIChzbyB0aGUgUlRDIGFsYXJtIGNhbiB3YWtlIHRoZSBzeXN0ZW0gZnJvbQorICogbG93IHBvd2VyIG1vZGVzKSBmb3IgT01BUDEgYm9hcmRzIChPTUFQLUwxMzggaGFzIHRoaXMgYnVpbHQgaW50bworICogdGhlIFNvQykuIFNlZSB0aGUgQk9BUkQtU1BFQ0lGSUMgQ1VTVE9NSVpBVElPTiBjb21tZW50LgorICovCisKKyNkZWZpbmUgT01BUF9SVENfQkFTRQkJCTB4ZmZmYjQ4MDAKKworLyogUlRDIHJlZ2lzdGVycyAqLworI2RlZmluZSBPTUFQX1JUQ19TRUNPTkRTX1JFRwkJMHgwMAorI2RlZmluZSBPTUFQX1JUQ19NSU5VVEVTX1JFRwkJMHgwNAorI2RlZmluZSBPTUFQX1JUQ19IT1VSU19SRUcJCTB4MDgKKyNkZWZpbmUgT01BUF9SVENfREFZU19SRUcJCTB4MEMKKyNkZWZpbmUgT01BUF9SVENfTU9OVEhTX1JFRwkJMHgxMAorI2RlZmluZSBPTUFQX1JUQ19ZRUFSU19SRUcJCTB4MTQKKyNkZWZpbmUgT01BUF9SVENfV0VFS1NfUkVHCQkweDE4CisKKyNkZWZpbmUgT01BUF9SVENfQUxBUk1fU0VDT05EU19SRUcJMHgyMAorI2RlZmluZSBPTUFQX1JUQ19BTEFSTV9NSU5VVEVTX1JFRwkweDI0CisjZGVmaW5lIE9NQVBfUlRDX0FMQVJNX0hPVVJTX1JFRwkweDI4CisjZGVmaW5lIE9NQVBfUlRDX0FMQVJNX0RBWVNfUkVHCQkweDJjCisjZGVmaW5lIE9NQVBfUlRDX0FMQVJNX01PTlRIU19SRUcJMHgzMAorI2RlZmluZSBPTUFQX1JUQ19BTEFSTV9ZRUFSU19SRUcJMHgzNAorCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfUkVHCQkweDQwCisjZGVmaW5lIE9NQVBfUlRDX1NUQVRVU19SRUcJCTB4NDQKKyNkZWZpbmUgT01BUF9SVENfSU5URVJSVVBUU19SRUcJCTB4NDgKKworI2RlZmluZSBPTUFQX1JUQ19DT01QX0xTQl9SRUcJCTB4NGMKKyNkZWZpbmUgT01BUF9SVENfQ09NUF9NU0JfUkVHCQkweDUwCisjZGVmaW5lIE9NQVBfUlRDX09TQ19SRUcJCTB4NTQKKworLyogT01BUF9SVENfQ1RSTF9SRUcgYml0IGZpZWxkczogKi8KKyNkZWZpbmUgT01BUF9SVENfQ1RSTF9TUExJVAkJKDE8PDcpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfRElTQUJMRQkJKDE8PDYpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfU0VUXzMyX0NPVU5URVIJKDE8PDUpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfVEVTVAkJKDE8PDQpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfTU9ERV8xMl8yNAkoMTw8MykKKyNkZWZpbmUgT01BUF9SVENfQ1RSTF9BVVRPX0NPTVAJCSgxPDwyKQorI2RlZmluZSBPTUFQX1JUQ19DVFJMX1JPVU5EXzMwUwkJKDE8PDEpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfU1RPUAkJKDE8PDApCisKKy8qIE9NQVBfUlRDX1NUQVRVU19SRUcgYml0IGZpZWxkczogKi8KKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTX1BPV0VSX1VQICAgICAgICAoMTw8NykKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTX0FMQVJNICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTXzFEX0VWRU5UICAgICAgICAoMTw8NSkKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTXzFIX0VWRU5UICAgICAgICAoMTw8NCkKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTXzFNX0VWRU5UICAgICAgICAoMTw8MykKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTXzFTX0VWRU5UICAgICAgICAoMTw8MikKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTX1JVTiAgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTX0JVU1kgICAgICAgICAgICAoMTw8MCkKKworLyogT01BUF9SVENfSU5URVJSVVBUU19SRUcgYml0IGZpZWxkczogKi8KKyNkZWZpbmUgT01BUF9SVENfSU5URVJSVVBUU19JVF9BTEFSTSAgICAoMTw8MykKKyNkZWZpbmUgT01BUF9SVENfSU5URVJSVVBUU19JVF9USU1FUiAgICAoMTw8MikKKworc3RhdGljIHZvaWQgX19pb21lbQkqcnRjX2Jhc2U7CisKKyNkZWZpbmUgcnRjX3JlYWQoYWRkcikJCV9fcmF3X3JlYWRiKHJ0Y19iYXNlICsgKGFkZHIpKQorI2RlZmluZSBydGNfd3JpdGUodmFsLCBhZGRyKQlfX3Jhd193cml0ZWIodmFsLCBydGNfYmFzZSArIChhZGRyKSkKKworCisvKiB3ZSByZWx5IG9uIHRoZSBydGMgZnJhbWV3b3JrIHRvIGhhbmRsZSBsb2NraW5nIChydGMtPm9wc19sb2NrKSwKKyAqIHNvIHRoZSBvbmx5IG90aGVyIHJlcXVpcmVtZW50IGlzIHRoYXQgcmVnaXN0ZXIgYWNjZXNzZXMgd2hpY2gKKyAqIHJlcXVpcmUgQlVTWSB0byBiZSBjbGVhciBhcmUgbWFkZSB3aXRoIElSUXMgbG9jYWxseSBkaXNhYmxlZAorICovCitzdGF0aWMgdm9pZCBydGNfd2FpdF9ub3RfYnVzeSh2b2lkKQoreworCWludAljb3VudCA9IDA7CisJdTgJc3RhdHVzOworCisJLyogQlVTWSBtYXkgc3RheSBhY3RpdmUgZm9yIDEvMzI3Njggc2Vjb25kICh+MzAgdXNlYykgKi8KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCA1MDsgY291bnQrKykgeworCQlzdGF0dXMgPSBydGNfcmVhZChPTUFQX1JUQ19TVEFUVVNfUkVHKTsKKwkJaWYgKChzdGF0dXMgJiAodTgpT01BUF9SVENfU1RBVFVTX0JVU1kpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKwkvKiBub3cgd2UgaGF2ZSB+MTUgdXNlYyB0byByZWFkL3dyaXRlIHZhcmlvdXMgcmVnaXN0ZXJzICovCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBydGNfaXJxKGludCBpcnEsIHZvaWQgKnJ0YykKK3sKKwl1bnNpZ25lZCBsb25nCQlldmVudHMgPSAwOworCXU4CQkJaXJxX2RhdGE7CisKKwlpcnFfZGF0YSA9IHJ0Y19yZWFkKE9NQVBfUlRDX1NUQVRVU19SRUcpOworCisJLyogYWxhcm0gaXJxPyAqLworCWlmIChpcnFfZGF0YSAmIE9NQVBfUlRDX1NUQVRVU19BTEFSTSkgeworCQlydGNfd3JpdGUoT01BUF9SVENfU1RBVFVTX0FMQVJNLCBPTUFQX1JUQ19TVEFUVVNfUkVHKTsKKwkJZXZlbnRzIHw9IFJUQ19JUlFGIHwgUlRDX0FGOworCX0KKworCS8qIDEvc2VjIHBlcmlvZGljL3VwZGF0ZSBpcnE/ICovCisJaWYgKGlycV9kYXRhICYgT01BUF9SVENfU1RBVFVTXzFTX0VWRU5UKQorCQlldmVudHMgfD0gUlRDX0lSUUYgfCBSVENfVUY7CisKKwlydGNfdXBkYXRlX2lycShydGMsIDEsIGV2ZW50cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXU4IHJlZzsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcnRjX3dhaXRfbm90X2J1c3koKTsKKwlyZWcgPSBydGNfcmVhZChPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisJaWYgKGVuYWJsZWQpCisJCXJlZyB8PSBPTUFQX1JUQ19JTlRFUlJVUFRTX0lUX0FMQVJNOworCWVsc2UKKwkJcmVnICY9IH5PTUFQX1JUQ19JTlRFUlJVUFRTX0lUX0FMQVJNOworCXJ0Y193YWl0X25vdF9idXN5KCk7CisJcnRjX3dyaXRlKHJlZywgT01BUF9SVENfSU5URVJSVVBUU19SRUcpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXJldHVybiAwOworfQorCisvKiB0aGlzIGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCAiZG9uJ3QgY2FyZSIgYWxhcm0gZmllbGRzICovCitzdGF0aWMgaW50IHRtMmJjZChzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWlmIChydGNfdmFsaWRfdG0odG0pICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdG0tPnRtX3NlYyA9IGJpbjJiY2QodG0tPnRtX3NlYyk7CisJdG0tPnRtX21pbiA9IGJpbjJiY2QodG0tPnRtX21pbik7CisJdG0tPnRtX2hvdXIgPSBiaW4yYmNkKHRtLT50bV9ob3VyKTsKKwl0bS0+dG1fbWRheSA9IGJpbjJiY2QodG0tPnRtX21kYXkpOworCisJdG0tPnRtX21vbiA9IGJpbjJiY2QodG0tPnRtX21vbiArIDEpOworCisJLyogZXBvY2ggPT0gMTkwMCAqLworCWlmICh0bS0+dG1feWVhciA8IDEwMCB8fCB0bS0+dG1feWVhciA+IDE5OSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdG0tPnRtX3llYXIgPSBiaW4yYmNkKHRtLT50bV95ZWFyIC0gMTAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY2QydG0oc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl0bS0+dG1fc2VjID0gYmNkMmJpbih0bS0+dG1fc2VjKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbih0bS0+dG1fbWluKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4odG0tPnRtX2hvdXIpOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbih0bS0+dG1fbWRheSk7CisJdG0tPnRtX21vbiA9IGJjZDJiaW4odG0tPnRtX21vbikgLSAxOworCS8qIGVwb2NoID09IDE5MDAgKi8KKwl0bS0+dG1feWVhciA9IGJjZDJiaW4odG0tPnRtX3llYXIpICsgMTAwOworfQorCisKK3N0YXRpYyBpbnQgb21hcF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwkvKiB3ZSBkb24ndCByZXBvcnQgd2RheS95ZGF5L2lzZHN0IC4uLiAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcnRjX3dhaXRfbm90X2J1c3koKTsKKworCXRtLT50bV9zZWMgPSBydGNfcmVhZChPTUFQX1JUQ19TRUNPTkRTX1JFRyk7CisJdG0tPnRtX21pbiA9IHJ0Y19yZWFkKE9NQVBfUlRDX01JTlVURVNfUkVHKTsKKwl0bS0+dG1faG91ciA9IHJ0Y19yZWFkKE9NQVBfUlRDX0hPVVJTX1JFRyk7CisJdG0tPnRtX21kYXkgPSBydGNfcmVhZChPTUFQX1JUQ19EQVlTX1JFRyk7CisJdG0tPnRtX21vbiA9IHJ0Y19yZWFkKE9NQVBfUlRDX01PTlRIU19SRUcpOworCXRtLT50bV95ZWFyID0gcnRjX3JlYWQoT01BUF9SVENfWUVBUlNfUkVHKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWJjZDJ0bSh0bSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWlmICh0bTJiY2QodG0pIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlydGNfd2FpdF9ub3RfYnVzeSgpOworCisJcnRjX3dyaXRlKHRtLT50bV95ZWFyLCBPTUFQX1JUQ19ZRUFSU19SRUcpOworCXJ0Y193cml0ZSh0bS0+dG1fbW9uLCBPTUFQX1JUQ19NT05USFNfUkVHKTsKKwlydGNfd3JpdGUodG0tPnRtX21kYXksIE9NQVBfUlRDX0RBWVNfUkVHKTsKKwlydGNfd3JpdGUodG0tPnRtX2hvdXIsIE9NQVBfUlRDX0hPVVJTX1JFRyk7CisJcnRjX3dyaXRlKHRtLT50bV9taW4sIE9NQVBfUlRDX01JTlVURVNfUkVHKTsKKwlydGNfd3JpdGUodG0tPnRtX3NlYywgT01BUF9SVENfU0VDT05EU19SRUcpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlydGNfd2FpdF9ub3RfYnVzeSgpOworCisJYWxtLT50aW1lLnRtX3NlYyA9IHJ0Y19yZWFkKE9NQVBfUlRDX0FMQVJNX1NFQ09ORFNfUkVHKTsKKwlhbG0tPnRpbWUudG1fbWluID0gcnRjX3JlYWQoT01BUF9SVENfQUxBUk1fTUlOVVRFU19SRUcpOworCWFsbS0+dGltZS50bV9ob3VyID0gcnRjX3JlYWQoT01BUF9SVENfQUxBUk1fSE9VUlNfUkVHKTsKKwlhbG0tPnRpbWUudG1fbWRheSA9IHJ0Y19yZWFkKE9NQVBfUlRDX0FMQVJNX0RBWVNfUkVHKTsKKwlhbG0tPnRpbWUudG1fbW9uID0gcnRjX3JlYWQoT01BUF9SVENfQUxBUk1fTU9OVEhTX1JFRyk7CisJYWxtLT50aW1lLnRtX3llYXIgPSBydGNfcmVhZChPTUFQX1JUQ19BTEFSTV9ZRUFSU19SRUcpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJYmNkMnRtKCZhbG0tPnRpbWUpOworCWFsbS0+ZW5hYmxlZCA9ICEhKHJ0Y19yZWFkKE9NQVBfUlRDX0lOVEVSUlVQVFNfUkVHKQorCQkJJiBPTUFQX1JUQ19JTlRFUlJVUFRTX0lUX0FMQVJNKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJdTggcmVnOworCisJaWYgKHRtMmJjZCgmYWxtLT50aW1lKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlydGNfd2FpdF9ub3RfYnVzeSgpOworCisJcnRjX3dyaXRlKGFsbS0+dGltZS50bV95ZWFyLCBPTUFQX1JUQ19BTEFSTV9ZRUFSU19SRUcpOworCXJ0Y193cml0ZShhbG0tPnRpbWUudG1fbW9uLCBPTUFQX1JUQ19BTEFSTV9NT05USFNfUkVHKTsKKwlydGNfd3JpdGUoYWxtLT50aW1lLnRtX21kYXksIE9NQVBfUlRDX0FMQVJNX0RBWVNfUkVHKTsKKwlydGNfd3JpdGUoYWxtLT50aW1lLnRtX2hvdXIsIE9NQVBfUlRDX0FMQVJNX0hPVVJTX1JFRyk7CisJcnRjX3dyaXRlKGFsbS0+dGltZS50bV9taW4sIE9NQVBfUlRDX0FMQVJNX01JTlVURVNfUkVHKTsKKwlydGNfd3JpdGUoYWxtLT50aW1lLnRtX3NlYywgT01BUF9SVENfQUxBUk1fU0VDT05EU19SRUcpOworCisJcmVnID0gcnRjX3JlYWQoT01BUF9SVENfSU5URVJSVVBUU19SRUcpOworCWlmIChhbG0tPmVuYWJsZWQpCisJCXJlZyB8PSBPTUFQX1JUQ19JTlRFUlJVUFRTX0lUX0FMQVJNOworCWVsc2UKKwkJcmVnICY9IH5PTUFQX1JUQ19JTlRFUlJVUFRTX0lUX0FMQVJNOworCXJ0Y193cml0ZShyZWcsIE9NQVBfUlRDX0lOVEVSUlVQVFNfUkVHKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgb21hcF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBvbWFwX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gb21hcF9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0JPSBvbWFwX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBvbWFwX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBvbWFwX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGludCBvbWFwX3J0Y19hbGFybTsKK3N0YXRpYyBpbnQgb21hcF9ydGNfdGltZXI7CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlCQkqcmVzLCAqbWVtOworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJdTgJCQlyZWcsIG5ld19jdHJsOworCisJb21hcF9ydGNfdGltZXIgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChvbWFwX3J0Y190aW1lciA8PSAwKSB7CisJCXByX2RlYnVnKCIlczogbm8gdXBkYXRlIGlycT9cbiIsIHBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlvbWFwX3J0Y19hbGFybSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CisJaWYgKG9tYXBfcnRjX2FsYXJtIDw9IDApIHsKKwkJcHJfZGVidWcoIiVzOiBubyBhbGFybSBpcnE/XG4iLCBwZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlwcl9kZWJ1ZygiJXM6IFJUQyByZXNvdXJjZSBkYXRhIG1pc3NpbmdcbiIsIHBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwltZW0gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKTsKKwlpZiAoIW1lbSkgeworCQlwcl9kZWJ1ZygiJXM6IFJUQyByZWdpc3RlcnMgYXQgJTA4eCBhcmUgbm90IGZyZWVcbiIsCisJCQlwZGV2LT5uYW1lLCByZXMtPnN0YXJ0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlydGNfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIXJ0Y19iYXNlKSB7CisJCXByX2RlYnVnKCIlczogUlRDIHJlZ2lzdGVycyBjYW4ndCBiZSBtYXBwZWRcbiIsIHBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWw7CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJJm9tYXBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlwcl9kZWJ1ZygiJXM6IGNhbid0IHJlZ2lzdGVyIFJUQyBkZXZpY2UsIGVyciAlbGRcbiIsCisJCQlwZGV2LT5uYW1lLCBQVFJfRVJSKHJ0YykpOworCQlnb3RvIGZhaWwwOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCWRldl9zZXRfZHJ2ZGF0YSgmcnRjLT5kZXYsIG1lbSk7CisKKwkvKiBjbGVhciBwZW5kaW5nIGlycXMsIGFuZCBzZXQgMS9zZWNvbmQgcGVyaW9kaWMsCisJICogd2hpY2ggd2UnbGwgdXNlIGluc3RlYWQgb2YgdXBkYXRlIGlycXMKKwkgKi8KKwlydGNfd3JpdGUoMCwgT01BUF9SVENfSU5URVJSVVBUU19SRUcpOworCisJLyogY2xlYXIgb2xkIHN0YXR1cyAqLworCXJlZyA9IHJ0Y19yZWFkKE9NQVBfUlRDX1NUQVRVU19SRUcpOworCWlmIChyZWcgJiAodTgpIE9NQVBfUlRDX1NUQVRVU19QT1dFUl9VUCkgeworCQlwcl9pbmZvKCIlczogUlRDIHBvd2VyIHVwIHJlc2V0IGRldGVjdGVkXG4iLAorCQkJcGRldi0+bmFtZSk7CisJCXJ0Y193cml0ZShPTUFQX1JUQ19TVEFUVVNfUE9XRVJfVVAsIE9NQVBfUlRDX1NUQVRVU19SRUcpOworCX0KKwlpZiAocmVnICYgKHU4KSBPTUFQX1JUQ19TVEFUVVNfQUxBUk0pCisJCXJ0Y193cml0ZShPTUFQX1JUQ19TVEFUVVNfQUxBUk0sIE9NQVBfUlRDX1NUQVRVU19SRUcpOworCisJLyogaGFuZGxlIHBlcmlvZGljIGFuZCBhbGFybSBpcnFzICovCisJaWYgKHJlcXVlc3RfaXJxKG9tYXBfcnRjX3RpbWVyLCBydGNfaXJxLCAwLAorCQkJZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgcnRjKSkgeworCQlwcl9kZWJ1ZygiJXM6IFJUQyB0aW1lciBpbnRlcnJ1cHQgSVJRJWQgYWxyZWFkeSBjbGFpbWVkXG4iLAorCQkJcGRldi0+bmFtZSwgb21hcF9ydGNfdGltZXIpOworCQlnb3RvIGZhaWwxOworCX0KKwlpZiAoKG9tYXBfcnRjX3RpbWVyICE9IG9tYXBfcnRjX2FsYXJtKSAmJgorCQkocmVxdWVzdF9pcnEob21hcF9ydGNfYWxhcm0sIHJ0Y19pcnEsIDAsCisJCQlkZXZfbmFtZSgmcnRjLT5kZXYpLCBydGMpKSkgeworCQlwcl9kZWJ1ZygiJXM6IFJUQyBhbGFybSBpbnRlcnJ1cHQgSVJRJWQgYWxyZWFkeSBjbGFpbWVkXG4iLAorCQkJcGRldi0+bmFtZSwgb21hcF9ydGNfYWxhcm0pOworCQlnb3RvIGZhaWwyOworCX0KKworCS8qIE9uIGJvYXJkcyB3aXRoIHNwbGl0IHBvd2VyLCBSVENfT05fTk9GRiB3b24ndCByZXNldCB0aGUgUlRDICovCisJcmVnID0gcnRjX3JlYWQoT01BUF9SVENfQ1RSTF9SRUcpOworCWlmIChyZWcgJiAodTgpIE9NQVBfUlRDX0NUUkxfU1RPUCkKKwkJcHJfaW5mbygiJXM6IGFscmVhZHkgcnVubmluZ1xuIiwgcGRldi0+bmFtZSk7CisKKwkvKiBmb3JjZSB0byAyNCBob3VyIG1vZGUgKi8KKwluZXdfY3RybCA9IHJlZyAmIChPTUFQX1JUQ19DVFJMX1NQTElUfE9NQVBfUlRDX0NUUkxfQVVUT19DT01QKTsKKwluZXdfY3RybCB8PSBPTUFQX1JUQ19DVFJMX1NUT1A7CisKKwkvKiBCT0FSRC1TUEVDSUZJQyBDVVNUT01JWkFUSU9OIENBTiBHTyBIRVJFOgorCSAqCisJICogIC0gRGV2aWNlIHdha2UtdXAgY2FwYWJpbGl0eSBzZXR0aW5nIHNob3VsZCBjb21lIHRocm91Z2ggY2hpcAorCSAqICAgIGluaXQgbG9naWMuIE9NQVAxIGJvYXJkcyBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgIndha2V1cCBjYXBhYmxlIgorCSAqICAgIGZsYWcgaW4gdGhlIHBsYXRmb3JtIGRldmljZSBpZiB0aGUgYm9hcmQgaXMgd2lyZWQgcmlnaHQgZm9yCisJICogICAgYmVpbmcgd29rZW4gdXAgYnkgUlRDIGFsYXJtLiBGb3IgT01BUC1MMTM4LCB0aGlzIGNhcGFiaWxpdHkKKwkgKiAgICBpcyBidWlsdCBpbnRvIHRoZSBTb0MgYnkgdGhlICJEZWVwIFNsZWVwIiBjYXBhYmlsaXR5LgorCSAqCisJICogIC0gQm9hcmRzIHdpcmVkIHNvIFJUQ19PTl9uT0ZGIGlzIHVzZWQgYXMgdGhlIHJlc2V0IHNpZ25hbCwKKwkgKiAgICByYXRoZXIgdGhhbiBuUFdST05fUkVTRVQsIHNob3VsZCBmb3JjaWJseSBlbmFibGUgc3BsaXQKKwkgKiAgICBwb3dlciBtb2RlLiAgKFNvbWUgY2hpcCBlcnJhdGEgcmVwb3J0IHRoYXQgUlRDX0NUUkxfU1BMSVQKKwkgKiAgICBpcyB3cml0ZS1vbmx5LCBhbmQgYWx3YXlzIHJlYWRzIGFzIHplcm8uLi4pCisJICovCisKKwlpZiAobmV3X2N0cmwgJiAodTgpIE9NQVBfUlRDX0NUUkxfU1BMSVQpCisJCXByX2luZm8oIiVzOiBzcGxpdCBwb3dlciBtb2RlXG4iLCBwZGV2LT5uYW1lKTsKKworCWlmIChyZWcgIT0gbmV3X2N0cmwpCisJCXJ0Y193cml0ZShuZXdfY3RybCwgT01BUF9SVENfQ1RSTF9SRUcpOworCisJcmV0dXJuIDA7CisKK2ZhaWwyOgorCWZyZWVfaXJxKG9tYXBfcnRjX3RpbWVyLCBydGMpOworZmFpbDE6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CitmYWlsMDoKKwlpb3VubWFwKHJ0Y19iYXNlKTsKK2ZhaWw6CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IG9tYXBfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlCSpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSptZW0gPSBkZXZfZ2V0X2RydmRhdGEoJnJ0Yy0+ZGV2KTsKKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKKworCS8qIGxlYXZlIHJ0YyBydW5uaW5nLCBidXQgZGlzYWJsZSBpcnFzICovCisJcnRjX3dyaXRlKDAsIE9NQVBfUlRDX0lOVEVSUlVQVFNfUkVHKTsKKworCWZyZWVfaXJxKG9tYXBfcnRjX3RpbWVyLCBydGMpOworCisJaWYgKG9tYXBfcnRjX3RpbWVyICE9IG9tYXBfcnRjX2FsYXJtKQorCQlmcmVlX2lycShvbWFwX3J0Y19hbGFybSwgcnRjKTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWlvdW5tYXAocnRjX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyB1OCBpcnFzdGF0OworCitzdGF0aWMgaW50IG9tYXBfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWlycXN0YXQgPSBydGNfcmVhZChPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisKKwkvKiBGSVhNRSB0aGUgUlRDIGFsYXJtIGlzIG5vdCBjdXJyZW50bHkgYWN0aW5nIGFzIGEgd2FrZXVwIGV2ZW50CisJICogc291cmNlLCBhbmQgaW4gZmFjdCB0aGlzIGVuYWJsZSgpIGNhbGwgaXMganVzdCBzYXZpbmcgYSBmbGFnCisJICogdGhhdCdzIG5ldmVyIHVzZWQuLi4KKwkgKi8KKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCWVuYWJsZV9pcnFfd2FrZShvbWFwX3J0Y19hbGFybSk7CisJZWxzZQorCQlydGNfd3JpdGUoMCwgT01BUF9SVENfSU5URVJSVVBUU19SRUcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKG9tYXBfcnRjX2FsYXJtKTsKKwllbHNlCisJCXJ0Y193cml0ZShpcnFzdGF0LCBPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIG9tYXBfcnRjX3N1c3BlbmQgTlVMTAorI2RlZmluZSBvbWFwX3J0Y19yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvbWFwX3J0Y19zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJ0Y193cml0ZSgwLCBPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06b21hcF9ydGMiKTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKG9tYXBfcnRjX3JlbW92ZSksCisJLnN1c3BlbmQJPSBvbWFwX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gb21hcF9ydGNfcmVzdW1lLAorCS5zaHV0ZG93bgk9IG9tYXBfcnRjX3NodXRkb3duLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJvbWFwX3J0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm9tYXBfcnRjX2RyaXZlciwgb21hcF9ydGNfcHJvYmUpOworfQorbW9kdWxlX2luaXQocnRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9ydGNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHJ0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiR2VvcmdlIEcuIERhdmlzIChhbmQgb3RoZXJzKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBjYXAuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wY2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ZjE5OAotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wY2FwLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiAgcGNhcCBydGMgY29kZSBmb3IgTW90b3JvbGEgRVpYIHBob25lcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggZ3VpbWluZyB6aHVvIDxnbXpodW9AZ21haWwuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwOSBEYW5pZWwgUmliZWlybyA8ZHJ3eXJtQGdtYWlsLmNvbT4KKyAqCisgKiAgQmFzZWQgb24gTW90b3JvbGEncyBydGMuYyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBNb3Rvcm9sYQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2V6eC1wY2FwLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCitzdHJ1Y3QgcGNhcF9ydGMgeworCXN0cnVjdCBwY2FwX2NoaXAgKnBjYXA7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2FwX3J0Y19pcnEoaW50IGlycSwgdm9pZCAqX3BjYXBfcnRjKQoreworCXN0cnVjdCBwY2FwX3J0YyAqcGNhcF9ydGMgPSBfcGNhcF9ydGM7CisJdW5zaWduZWQgbG9uZyBydGNfZXZlbnRzOworCisJaWYgKGlycSA9PSBwY2FwX3RvX2lycShwY2FwX3J0Yy0+cGNhcCwgUENBUF9JUlFfMUhaKSkKKwkJcnRjX2V2ZW50cyA9IFJUQ19JUlFGIHwgUlRDX1VGOworCWVsc2UgaWYgKGlycSA9PSBwY2FwX3RvX2lycShwY2FwX3J0Yy0+cGNhcCwgUENBUF9JUlFfVE9EQSkpCisJCXJ0Y19ldmVudHMgPSBSVENfSVJRRiB8IFJUQ19BRjsKKwllbHNlCisJCXJ0Y19ldmVudHMgPSAwOworCisJcnRjX3VwZGF0ZV9pcnEocGNhcF9ydGMtPnJ0YywgMSwgcnRjX2V2ZW50cyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHBjYXBfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHBjYXBfcnRjICpwY2FwX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1bnNpZ25lZCBsb25nIHNlY3M7CisJdTMyIHRvZDsJLyogdGltZSBvZiBkYXksIHNlY29uZHMgc2luY2UgbWlkbmlnaHQgKi8KKwl1MzIgZGF5czsJLyogZGF5cyBzaW5jZSAxLzEvMTk3MCAqLworCisJZXp4X3BjYXBfcmVhZChwY2FwX3J0Yy0+cGNhcCwgUENBUF9SRUdfUlRDX1RPREEsICZ0b2QpOworCXNlY3MgPSB0b2QgJiBQQ0FQX1JUQ19UT0RfTUFTSzsKKworCWV6eF9wY2FwX3JlYWQocGNhcF9ydGMtPnBjYXAsIFBDQVBfUkVHX1JUQ19EQVlBLCAmZGF5cyk7CisJc2VjcyArPSAoZGF5cyAmIFBDQVBfUlRDX0RBWV9NQVNLKSAqIFNFQ19QRVJfREFZOworCisJcnRjX3RpbWVfdG9fdG0oc2VjcywgdG0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNhcF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBwY2FwX3J0YyAqcGNhcF9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJdW5zaWduZWQgbG9uZyBzZWNzOworCXUzMiB0b2QsIGRheXM7CisKKwlydGNfdG1fdG9fdGltZSh0bSwgJnNlY3MpOworCisJdG9kID0gc2VjcyAlIFNFQ19QRVJfREFZOworCWV6eF9wY2FwX3dyaXRlKHBjYXBfcnRjLT5wY2FwLCBQQ0FQX1JFR19SVENfVE9EQSwgdG9kKTsKKworCWRheXMgPSBzZWNzIC8gU0VDX1BFUl9EQVk7CisJZXp4X3BjYXBfd3JpdGUocGNhcF9ydGMtPnBjYXAsIFBDQVBfUkVHX1JUQ19EQVlBLCBkYXlzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjYXBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBwY2FwX3J0YyAqcGNhcF9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIHNlY3M7CisJdTMyIHRvZCwgZGF5czsKKworCWV6eF9wY2FwX3JlYWQocGNhcF9ydGMtPnBjYXAsIFBDQVBfUkVHX1JUQ19UT0QsICZ0b2QpOworCXNlY3MgPSB0b2QgJiBQQ0FQX1JUQ19UT0RfTUFTSzsKKworCWV6eF9wY2FwX3JlYWQocGNhcF9ydGMtPnBjYXAsIFBDQVBfUkVHX1JUQ19EQVksICZkYXlzKTsKKwlzZWNzICs9IChkYXlzICYgUENBUF9SVENfREFZX01BU0spICogU0VDX1BFUl9EQVk7CisKKwlydGNfdGltZV90b190bShzZWNzLCB0bSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBwY2FwX3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHBjYXBfcnRjICpwY2FwX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXUzMiB0b2QsIGRheXM7CisKKwl0b2QgPSBzZWNzICUgU0VDX1BFUl9EQVk7CisJZXp4X3BjYXBfd3JpdGUocGNhcF9ydGMtPnBjYXAsIFBDQVBfUkVHX1JUQ19UT0QsIHRvZCk7CisKKwlkYXlzID0gc2VjcyAvIFNFQ19QRVJfREFZOworCWV6eF9wY2FwX3dyaXRlKHBjYXBfcnRjLT5wY2FwLCBQQ0FQX1JFR19SVENfREFZLCBkYXlzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjYXBfcnRjX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcGlycSwgdW5zaWduZWQgaW50IGVuKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcGNhcF9ydGMgKnBjYXBfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZW4pCisJCWVuYWJsZV9pcnEocGNhcF90b19pcnEocGNhcF9ydGMtPnBjYXAsIHBpcnEpKTsKKwllbHNlCisJCWRpc2FibGVfaXJxKHBjYXBfdG9faXJxKHBjYXBfcnRjLT5wY2FwLCBwaXJxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2FwX3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuKQoreworCXJldHVybiBwY2FwX3J0Y19pcnFfZW5hYmxlKGRldiwgUENBUF9JUlFfVE9EQSwgZW4pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgcGNhcF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgPSBwY2FwX3J0Y19yZWFkX3RpbWUsCisJLnJlYWRfYWxhcm0gPSBwY2FwX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBwY2FwX3J0Y19zZXRfYWxhcm0sCisJLnNldF9tbXNzID0gcGNhcF9ydGNfc2V0X21tc3MsCisJLmFsYXJtX2lycV9lbmFibGUgPSBwY2FwX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgcGNhcF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGNhcF9ydGMgKnBjYXBfcnRjOworCWludCB0aW1lcl9pcnEsIGFsYXJtX2lycTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCXBjYXBfcnRjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjYXBfcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2FwX3J0YykKKwkJcmV0dXJuIGVycjsKKworCXBjYXBfcnRjLT5wY2FwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGNhcF9ydGMpOworCisJcGNhcF9ydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInBjYXAiLCAmcGRldi0+ZGV2LAorCQkJCSAgJnBjYXBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocGNhcF9ydGMtPnJ0YykpIHsKKwkJZXJyID0gUFRSX0VSUihwY2FwX3J0Yy0+cnRjKTsKKwkJZ290byBmYWlsX3J0YzsKKwl9CisKKworCXRpbWVyX2lycSA9IHBjYXBfdG9faXJxKHBjYXBfcnRjLT5wY2FwLCBQQ0FQX0lSUV8xSFopOworCWFsYXJtX2lycSA9IHBjYXBfdG9faXJxKHBjYXBfcnRjLT5wY2FwLCBQQ0FQX0lSUV9UT0RBKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHRpbWVyX2lycSwgcGNhcF9ydGNfaXJxLCAwLCAiUlRDIFRpbWVyIiwgcGNhcF9ydGMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF90aW1lcjsKKworCWVyciA9IHJlcXVlc3RfaXJxKGFsYXJtX2lycSwgcGNhcF9ydGNfaXJxLCAwLCAiUlRDIEFsYXJtIiwgcGNhcF9ydGMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9hbGFybTsKKworCXJldHVybiAwOworZmFpbF9hbGFybToKKwlmcmVlX2lycSh0aW1lcl9pcnEsIHBjYXBfcnRjKTsKK2ZhaWxfdGltZXI6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBjYXBfcnRjLT5ydGMpOworZmFpbF9ydGM6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUocGNhcF9ydGMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBjYXBfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwY2FwX3J0YyAqcGNhcF9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZyZWVfaXJxKHBjYXBfdG9faXJxKHBjYXBfcnRjLT5wY2FwLCBQQ0FQX0lSUV8xSFopLCBwY2FwX3J0Yyk7CisJZnJlZV9pcnEocGNhcF90b19pcnEocGNhcF9ydGMtPnBjYXAsIFBDQVBfSVJRX1RPREEpLCBwY2FwX3J0Yyk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBjYXBfcnRjLT5ydGMpOworCWtmcmVlKHBjYXBfcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwY2FwX3J0Y19kcml2ZXIgPSB7CisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHBjYXBfcnRjX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgID0gInBjYXAtcnRjIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJ0Y19wY2FwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZwY2FwX3J0Y19kcml2ZXIsIHBjYXBfcnRjX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJ0Y19wY2FwX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGNhcF9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocnRjX3BjYXBfaW5pdCk7Cittb2R1bGVfZXhpdChydGNfcGNhcF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb3Rvcm9sYSBwY2FwIHJ0YyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoImd1aW1pbmcgemh1byA8Z216aHVvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wY2YyMTIzLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcGNmMjEyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTI1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcGNmMjEyMy5jCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogQW4gU1BJIGRyaXZlciBmb3IgdGhlIFBoaWxpcHMgUENGMjEyMyBSVEMKKyAqIENvcHlyaWdodCAyMDA5IEN5YmVyIFN3aXRjaGluZywgSW5jLgorICoKKyAqIEF1dGhvcjogQ2hyaXMgVmVyZ2VzIDxjaHJpc3ZAY3liZXJzd2l0Y2hpbmcuY29tPgorICogTWFpbnRhaW5lcnM6IGh0dHA6Ly93d3cuY3liZXJzd2l0Y2hpbmcuY29tCisgKgorICogYmFzZWQgb24gdGhlIFJTNUMzNDggZHJpdmVyIGluIHRoaXMgc2FtZSBkaXJlY3RvcnkuCisgKgorICogVGhhbmtzIHRvIENocmlzdGlhbiBQZWxsZWdyaW4gPGNocmlwZWxsQGZzZmUub3JnPiBmb3IKKyAqIHRoZSBzeXNmcyBjb250cmlidXRpb25zIHRvIHRoaXMgZHJpdmVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgQ1MgaXMgYWN0aXZlIGhpZ2gsIHNvIHBsYXRmb3JtIGRhdGEKKyAqIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOgorICoKKyAqIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gZWtfc3BpX2RldmljZXNbXSA9IHsKKyAqIAkuLi4KKyAqIAl7CisgKiAJCS5tb2RhbGlhcwkJPSAicnRjLXBjZjIxMjMiLAorICogCQkuY2hpcF9zZWxlY3QJCT0gMSwKKyAqIAkJLmNvbnRyb2xsZXJfZGF0YQk9ICh2b2lkICopQVQ5MV9QSU5fUEExMCwKKyAqCQkubWF4X3NwZWVkX2h6CQk9IDEwMDAgKiAxMDAwLAorICoJCS5tb2RlCQkJPSBTUElfQ1NfSElHSCwKKyAqCQkuYnVzX251bQkJPSAwLAorICoJfSwKKyAqCS4uLgorICp9OworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjYiCisKKyNkZWZpbmUgUENGMjEyM19SRUdfQ1RSTDEJKDB4MDApCS8qIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBQQ0YyMTIzX1JFR19DVFJMMgkoMHgwMSkJLyogQ29udHJvbCBSZWdpc3RlciAyICovCisjZGVmaW5lIFBDRjIxMjNfUkVHX1NDCQkoMHgwMikJLyogZGF0ZXRpbWUgKi8KKyNkZWZpbmUgUENGMjEyM19SRUdfTU4JCSgweDAzKQorI2RlZmluZSBQQ0YyMTIzX1JFR19IUgkJKDB4MDQpCisjZGVmaW5lIFBDRjIxMjNfUkVHX0RNCQkoMHgwNSkKKyNkZWZpbmUgUENGMjEyM19SRUdfRFcJCSgweDA2KQorI2RlZmluZSBQQ0YyMTIzX1JFR19NTwkJKDB4MDcpCisjZGVmaW5lIFBDRjIxMjNfUkVHX1lSCQkoMHgwOCkKKworI2RlZmluZSBQQ0YyMTIzX1NVQkFERFIJCSgxIDw8IDQpCisjZGVmaW5lIFBDRjIxMjNfV1JJVEUJCSgoMCA8PCA3KSB8IFBDRjIxMjNfU1VCQUREUikKKyNkZWZpbmUgUENGMjEyM19SRUFECQkoKDEgPDwgNykgfCBQQ0YyMTIzX1NVQkFERFIpCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwY2YyMTIzX2RyaXZlcjsKKworc3RydWN0IHBjZjIxMjNfc3lzZnNfcmVnIHsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyOworCWNoYXIgbmFtZVsyXTsKK307CisKK3N0cnVjdCBwY2YyMTIzX3BsYXRfZGF0YSB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcGNmMjEyM19zeXNmc19yZWcgcmVnc1sxNl07Cit9OworCisvKgorICogQ2F1c2VzIGEgMzAgbmFub3NlY29uZCBkZWxheSB0byBlbnN1cmUgdGhhdCB0aGUgUENGMjEyMyBjaGlwIHNlbGVjdAorICogaXMgcmVsZWFzZWQgcHJvcGVybHkgYWZ0ZXIgYW4gU1BJIHdyaXRlLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUKKyAqIGNhbGxlZCBhZnRlciBFVkVSWSByZWFkL3dyaXRlIGNhbGwgb3ZlciBTUEkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2YyMTIzX2RlbGF5X3RyZWModm9pZCkKK3sKKwluZGVsYXkoMzApOworfQorCitzdGF0aWMgc3NpemVfdCBwY2YyMTIzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcGNmMjEyM19zeXNmc19yZWcgKnI7CisJdTggdHhidWZbMV0sIHJ4YnVmWzFdOworCXVuc2lnbmVkIGxvbmcgcmVnOworCWludCByZXQ7CisKKwlyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBwY2YyMTIzX3N5c2ZzX3JlZywgYXR0cik7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoci0+bmFtZSwgMTYsICZyZWcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXR4YnVmWzBdID0gUENGMjEyM19SRUFEIHwgcmVnOworCXJldCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCB0eGJ1ZiwgMSwgcnhidWYsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlwY2YyMTIzX2RlbGF5X3RyZWMoKTsKKwlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIweCV4XG4iLCByeGJ1ZlswXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBjZjIxMjNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCBwY2YyMTIzX3N5c2ZzX3JlZyAqcjsKKwl1OCB0eGJ1ZlsyXTsKKwl1bnNpZ25lZCBsb25nIHJlZzsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWludCByZXQ7CisKKwlyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBwY2YyMTIzX3N5c2ZzX3JlZywgYXR0cik7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoci0+bmFtZSwgMTYsICZyZWcpCisJCXx8IHN0cmljdF9zdHJ0b3VsKGJ1ZmZlciwgMTAsICZ2YWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXR4YnVmWzBdID0gUENGMjEyM19XUklURSB8IHJlZzsKKwl0eGJ1ZlsxXSA9IHZhbDsKKwlyZXQgPSBzcGlfd3JpdGUoc3BpLCB0eGJ1Ziwgc2l6ZW9mKHR4YnVmKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlPOworCXBjZjIxMjNfZGVsYXlfdHJlYygpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwY2YyMTIzX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJdTggdHhidWZbMV0sIHJ4YnVmWzddOworCWludCByZXQ7CisKKwl0eGJ1ZlswXSA9IFBDRjIxMjNfUkVBRCB8IFBDRjIxMjNfUkVHX1NDOworCXJldCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCB0eGJ1Ziwgc2l6ZW9mKHR4YnVmKSwKKwkJCXJ4YnVmLCBzaXplb2YocnhidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlwY2YyMTIzX2RlbGF5X3RyZWMoKTsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHJ4YnVmWzBdICYgMHg3Rik7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4ocnhidWZbMV0gJiAweDdGKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4ocnhidWZbMl0gJiAweDNGKTsgLyogcnRjIGhyIDAtMjMgKi8KKwl0bS0+dG1fbWRheSA9IGJjZDJiaW4ocnhidWZbM10gJiAweDNGKTsKKwl0bS0+dG1fd2RheSA9IHJ4YnVmWzRdICYgMHgwNzsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihyeGJ1Zls1XSAmIDB4MUYpIC0gMTsgLyogcnRjIG1uIDEtMTIgKi8KKwl0bS0+dG1feWVhciA9IGJjZDJiaW4ocnhidWZbNl0pOworCWlmICh0bS0+dG1feWVhciA8IDcwKQorCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIGFzc3VtZSB3ZSBhcmUgaW4gMTk3MC4uLjIwNjkgKi8KKworCWRldl9kYmcoZGV2LCAiJXM6IHRtIGlzIHNlY3M9JWQsIG1pbnM9JWQsIGhvdXJzPSVkLCAiCisJCQkibWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQkJX19mdW5jX18sCisJCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKKwkJCXRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOworCisJLyogdGhlIGNsb2NrIGNhbiBnaXZlIG91dCBpbnZhbGlkIGRhdGV0aW1lLCBidXQgd2UgY2Fubm90IHJldHVybgorCSAqIC1FSU5WQUwgb3RoZXJ3aXNlIGh3Y2xvY2sgd2lsbCByZWZ1c2UgdG8gc2V0IHRoZSB0aW1lIG9uIGJvb3R1cC4KKwkgKi8KKwlpZiAocnRjX3ZhbGlkX3RtKHRtKSA8IDApCisJCWRldl9lcnIoZGV2LCAicmV0cmlldmVkIGRhdGUvdGltZSBpcyBub3QgdmFsaWQuXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjZjIxMjNfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXU4IHR4YnVmWzhdOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIiVzOiB0bSBpcyBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCwgIgorCQkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJdG0tPnRtX3NlYywgdG0tPnRtX21pbiwgdG0tPnRtX2hvdXIsCisJCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKKworCS8qIFN0b3AgdGhlIGNvdW50ZXIgZmlyc3QgKi8KKwl0eGJ1ZlswXSA9IFBDRjIxMjNfV1JJVEUgfCBQQ0YyMTIzX1JFR19DVFJMMTsKKwl0eGJ1ZlsxXSA9IDB4MjA7CisJcmV0ID0gc3BpX3dyaXRlKHNwaSwgdHhidWYsIDIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXBjZjIxMjNfZGVsYXlfdHJlYygpOworCisJLyogU2V0IHRoZSBuZXcgdGltZSAqLworCXR4YnVmWzBdID0gUENGMjEyM19XUklURSB8IFBDRjIxMjNfUkVHX1NDOworCXR4YnVmWzFdID0gYmluMmJjZCh0bS0+dG1fc2VjICYgMHg3Rik7CisJdHhidWZbMl0gPSBiaW4yYmNkKHRtLT50bV9taW4gJiAweDdGKTsKKwl0eGJ1ZlszXSA9IGJpbjJiY2QodG0tPnRtX2hvdXIgJiAweDNGKTsKKwl0eGJ1Zls0XSA9IGJpbjJiY2QodG0tPnRtX21kYXkgJiAweDNGKTsKKwl0eGJ1Zls1XSA9IHRtLT50bV93ZGF5ICYgMHgwNzsKKwl0eGJ1Zls2XSA9IGJpbjJiY2QoKHRtLT50bV9tb24gKyAxKSAmIDB4MUYpOyAvKiBydGMgbW4gMS0xMiAqLworCXR4YnVmWzddID0gYmluMmJjZCh0bS0+dG1feWVhciA8IDEwMCA/IHRtLT50bV95ZWFyIDogdG0tPnRtX3llYXIgLSAxMDApOworCisJcmV0ID0gc3BpX3dyaXRlKHNwaSwgdHhidWYsIHNpemVvZih0eGJ1ZikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXBjZjIxMjNfZGVsYXlfdHJlYygpOworCisJLyogU3RhcnQgdGhlIGNvdW50ZXIgKi8KKwl0eGJ1ZlswXSA9IFBDRjIxMjNfV1JJVEUgfCBQQ0YyMTIzX1JFR19DVFJMMTsKKwl0eGJ1ZlsxXSA9IDB4MDA7CisJcmV0ID0gc3BpX3dyaXRlKHNwaSwgdHhidWYsIDIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXBjZjIxMjNfZGVsYXlfdHJlYygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBwY2YyMTIzX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHBjZjIxMjNfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBwY2YyMTIzX3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjZjIxMjNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCBwY2YyMTIzX3BsYXRfZGF0YSAqcGRhdGE7CisJdTggdHhidWZbMl0sIHJ4YnVmWzJdOworCWludCByZXQsIGk7CisKKwlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2YyMTIzX3BsYXRfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXNwaS0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKworCS8qIFNlbmQgYSBzb2Z0d2FyZSByZXNldCBjb21tYW5kICovCisJdHhidWZbMF0gPSBQQ0YyMTIzX1dSSVRFIHwgUENGMjEyM19SRUdfQ1RSTDE7CisJdHhidWZbMV0gPSAweDU4OworCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVzZXR0aW5nIFJUQyAoMHglMDJYIDB4JTAyWClcbiIsCisJCQl0eGJ1ZlswXSwgdHhidWZbMV0pOworCXJldCA9IHNwaV93cml0ZShzcGksIHR4YnVmLCAyICogc2l6ZW9mKHU4KSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8ga2ZyZWVfZXhpdDsKKwlwY2YyMTIzX2RlbGF5X3RyZWMoKTsKKworCS8qIFN0b3AgdGhlIGNvdW50ZXIgKi8KKwl0eGJ1ZlswXSA9IFBDRjIxMjNfV1JJVEUgfCBQQ0YyMTIzX1JFR19DVFJMMTsKKwl0eGJ1ZlsxXSA9IDB4MjA7CisJZGV2X2RiZygmc3BpLT5kZXYsICJzdG9wcGluZyBSVEMgKDB4JTAyWCAweCUwMlgpXG4iLAorCQkJdHhidWZbMF0sIHR4YnVmWzFdKTsKKwlyZXQgPSBzcGlfd3JpdGUoc3BpLCB0eGJ1ZiwgMiAqIHNpemVvZih1OCkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGtmcmVlX2V4aXQ7CisJcGNmMjEyM19kZWxheV90cmVjKCk7CisKKwkvKiBTZWUgaWYgdGhlIGNvdW50ZXIgd2FzIGFjdHVhbGx5IHN0b3BwZWQgKi8KKwl0eGJ1ZlswXSA9IFBDRjIxMjNfUkVBRCB8IFBDRjIxMjNfUkVHX0NUUkwxOworCWRldl9kYmcoJnNwaS0+ZGV2LCAiY2hlY2tpbmcgZm9yIHByZXNlbmNlIG9mIFJUQyAoMHglMDJYKVxuIiwKKwkJCXR4YnVmWzBdKTsKKwlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgdHhidWYsIDEgKiBzaXplb2YodTgpLAorCQkJCQlyeGJ1ZiwgMiAqIHNpemVvZih1OCkpOworCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVjZWl2ZWQgZGF0YSBmcm9tIFJUQyAoMHglMDJYIDB4JTAyWClcbiIsCisJCQlyeGJ1ZlswXSwgcnhidWZbMV0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGtmcmVlX2V4aXQ7CisJcGNmMjEyM19kZWxheV90cmVjKCk7CisKKwlpZiAoIShyeGJ1ZlswXSAmIDB4MjApKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY2hpcCBub3QgZm91bmRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGtmcmVlX2V4aXQ7CisJfQorCisJZGV2X2luZm8oJnNwaS0+ZGV2LCAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlkZXZfaW5mbygmc3BpLT5kZXYsICJzcGljbGsgJXUgS0h6LlxuIiwKKwkJCShzcGktPm1heF9zcGVlZF9oeiArIDUwMCkgLyAxMDAwKTsKKworCS8qIFN0YXJ0IHRoZSBjb3VudGVyICovCisJdHhidWZbMF0gPSBQQ0YyMTIzX1dSSVRFIHwgUENGMjEyM19SRUdfQ1RSTDE7CisJdHhidWZbMV0gPSAweDAwOworCXJldCA9IHNwaV93cml0ZShzcGksIHR4YnVmLCBzaXplb2YodHhidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBrZnJlZV9leGl0OworCXBjZjIxMjNfZGVsYXlfdHJlYygpOworCisJLyogRmluYWxpemUgdGhlIGluaXRpYWxpemF0aW9uICovCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwY2YyMTIzX2RyaXZlci5kcml2ZXIubmFtZSwgJnNwaS0+ZGV2LAorCQkJJnBjZjIxMjNfcnRjX29wcywgVEhJU19NT0RVTEUpOworCisJaWYgKElTX0VSUihydGMpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyLlxuIik7CisJCXJldCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBrZnJlZV9leGl0OworCX0KKworCXBkYXRhLT5ydGMgPSBydGM7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlzcHJpbnRmKHBkYXRhLT5yZWdzW2ldLm5hbWUsICIlMXgiLCBpKTsKKwkJcGRhdGEtPnJlZ3NbaV0uYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUjsKKwkJcGRhdGEtPnJlZ3NbaV0uYXR0ci5hdHRyLm5hbWUgPSBwZGF0YS0+cmVnc1tpXS5uYW1lOworCQlwZGF0YS0+cmVnc1tpXS5hdHRyLnNob3cgPSBwY2YyMTIzX3Nob3c7CisJCXBkYXRhLT5yZWdzW2ldLmF0dHIuc3RvcmUgPSBwY2YyMTIzX3N0b3JlOworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmcGRhdGEtPnJlZ3NbaV0uYXR0cik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyAlc1xuIiwKKwkJCQlwZGF0YS0+cmVnc1tpXS5uYW1lKTsKKwkJCWdvdG8gc3lzZnNfZXhpdDsKKwkJfQorCX0KKworCXJldHVybiAwOworCitzeXNmc19leGl0OgorCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJnBkYXRhLT5yZWdzW2ldLmF0dHIpOworCitrZnJlZV9leGl0OgorCWtmcmVlKHBkYXRhKTsKKwlzcGktPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwY2YyMTIzX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBwY2YyMTIzX3BsYXRfZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBpOworCisJaWYgKHBkYXRhKSB7CisJCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwZGF0YS0+cnRjOworCisJCWlmIChydGMpCisJCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlpZiAocGRhdGEtPnJlZ3NbaV0ubmFtZVswXSkKKwkJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LAorCQkJCQkJICAgJnBkYXRhLT5yZWdzW2ldLmF0dHIpOworCQlrZnJlZShwZGF0YSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwY2YyMTIzX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkJLm5hbWUJPSAicnRjLXBjZjIxMjMiLAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSBwY2YyMTIzX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChwY2YyMTIzX3JlbW92ZSksCit9OworCittb2R1bGVfc3BpX2RyaXZlcihwY2YyMTIzX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkNocmlzIFZlcmdlcyA8Y2hyaXN2QGN5YmVyc3dpdGNoaW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTlhQIFBDRjIxMjMgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBjZjUwNjMzLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcGNmNTA2MzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjAyMDJmCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBjZjUwNjMzLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qIE5YUCBQQ0Y1MDYzMyBSVEMgRHJpdmVyCisgKgorICogKEMpIDIwMDYtMjAwOCBieSBPcGVubW9rbywgSW5jLgorICogQXV0aG9yOiBCYWxhamkgUmFvIDxiYWxhamlycmFvQG9wZW5tb2tvLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQnJva2VuIGRvd24gZnJvbSBtb25zdHJvdXMgUENGNTA2MzMgZHJpdmVyIG1haW5seSBieQorICogSGFyYWxkIFdlbHRlLCBBbmR5IEdyZWVuIGFuZCBXZXJuZXIgQWxtZXNiZXJnZXIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvcGNmNTA2MzMvY29yZS5oPgorCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENTQwkweDU5IC8qIFNlY29uZCAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDTU4JMHg1YSAvKiBNaW51dGUgKi8KKyNkZWZpbmUgUENGNTA2MzNfUkVHX1JUQ0hSCTB4NWIgLyogSG91ciAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDV0QJMHg1YyAvKiBXZWVrZGF5ICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENEVAkweDVkIC8qIERheSAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDTVQJMHg1ZSAvKiBNb250aCAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDWVIJMHg1ZiAvKiBZZWFyICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENTQ0EJMHg2MCAvKiBBbGFybSBTZWNvbmQgKi8KKyNkZWZpbmUgUENGNTA2MzNfUkVHX1JUQ01OQQkweDYxIC8qIEFsYXJtIE1pbnV0ZSAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDSFJBCTB4NjIgLyogQWxhcm0gSG91ciAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDV0RBCTB4NjMgLyogQWxhcm0gV2Vla2RheSAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDRFRBCTB4NjQgLyogQWxhcm0gRGF5ICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENNVEEJMHg2NSAvKiBBbGFybSBNb250aCAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDWVJBCTB4NjYgLyogQWxhcm0gWWVhciAqLworCitlbnVtIHBjZjUwNjMzX3RpbWVfaW5kZXhlcyB7CisJUENGNTA2MzNfVElfU0VDLAorCVBDRjUwNjMzX1RJX01JTiwKKwlQQ0Y1MDYzM19USV9IT1VSLAorCVBDRjUwNjMzX1RJX1dLREFZLAorCVBDRjUwNjMzX1RJX0RBWSwKKwlQQ0Y1MDYzM19USV9NT05USCwKKwlQQ0Y1MDYzM19USV9ZRUFSLAorCVBDRjUwNjMzX1RJX0VYVEVOVCAvKiBhbHdheXMgbGFzdCAqLworfTsKKworc3RydWN0IHBjZjUwNjMzX3RpbWUgeworCXVfaW50OF90IHRpbWVbUENGNTA2MzNfVElfRVhURU5UXTsKK307CisKK3N0cnVjdCBwY2Y1MDYzM19ydGMgeworCWludCBhbGFybV9lbmFibGVkOworCWludCBhbGFybV9wZW5kaW5nOworCisJc3RydWN0IHBjZjUwNjMzICpwY2Y7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXY7Cit9OworCitzdGF0aWMgdm9pZCBwY2YycnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGMsIHN0cnVjdCBwY2Y1MDYzM190aW1lICpwY2YpCit7CisJcnRjLT50bV9zZWMgPSBiY2QyYmluKHBjZi0+dGltZVtQQ0Y1MDYzM19USV9TRUNdKTsKKwlydGMtPnRtX21pbiA9IGJjZDJiaW4ocGNmLT50aW1lW1BDRjUwNjMzX1RJX01JTl0pOworCXJ0Yy0+dG1faG91ciA9IGJjZDJiaW4ocGNmLT50aW1lW1BDRjUwNjMzX1RJX0hPVVJdKTsKKwlydGMtPnRtX3dkYXkgPSBiY2QyYmluKHBjZi0+dGltZVtQQ0Y1MDYzM19USV9XS0RBWV0pOworCXJ0Yy0+dG1fbWRheSA9IGJjZDJiaW4ocGNmLT50aW1lW1BDRjUwNjMzX1RJX0RBWV0pOworCXJ0Yy0+dG1fbW9uID0gYmNkMmJpbihwY2YtPnRpbWVbUENGNTA2MzNfVElfTU9OVEhdKSAtIDE7CisJcnRjLT50bV95ZWFyID0gYmNkMmJpbihwY2YtPnRpbWVbUENGNTA2MzNfVElfWUVBUl0pICsgMTAwOworfQorCitzdGF0aWMgdm9pZCBydGMycGNmX3RpbWUoc3RydWN0IHBjZjUwNjMzX3RpbWUgKnBjZiwgc3RydWN0IHJ0Y190aW1lICpydGMpCit7CisJcGNmLT50aW1lW1BDRjUwNjMzX1RJX1NFQ10gPSBiaW4yYmNkKHJ0Yy0+dG1fc2VjKTsKKwlwY2YtPnRpbWVbUENGNTA2MzNfVElfTUlOXSA9IGJpbjJiY2QocnRjLT50bV9taW4pOworCXBjZi0+dGltZVtQQ0Y1MDYzM19USV9IT1VSXSA9IGJpbjJiY2QocnRjLT50bV9ob3VyKTsKKwlwY2YtPnRpbWVbUENGNTA2MzNfVElfV0tEQVldID0gYmluMmJjZChydGMtPnRtX3dkYXkpOworCXBjZi0+dGltZVtQQ0Y1MDYzM19USV9EQVldID0gYmluMmJjZChydGMtPnRtX21kYXkpOworCXBjZi0+dGltZVtQQ0Y1MDYzM19USV9NT05USF0gPSBiaW4yYmNkKHJ0Yy0+dG1fbW9uICsgMSk7CisJcGNmLT50aW1lW1BDRjUwNjMzX1RJX1lFQVJdID0gYmluMmJjZChydGMtPnRtX3llYXIgJSAxMDApOworfQorCitzdGF0aWMgaW50CitwY2Y1MDYzM19ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBwY2Y1MDYzM19ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnI7CisKKwlpZiAoZW5hYmxlZCkKKwkJZXJyID0gcGNmNTA2MzNfaXJxX3VubWFzayhydGMtPnBjZiwgUENGNTA2MzNfSVJRX0FMQVJNKTsKKwllbHNlCisJCWVyciA9IHBjZjUwNjMzX2lycV9tYXNrKHJ0Yy0+cGNmLCBQQ0Y1MDYzM19JUlFfQUxBUk0pOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlydGMtPmFsYXJtX2VuYWJsZWQgPSBlbmFibGVkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNmNTA2MzNfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBjZjUwNjMzX3J0YyAqcnRjOworCXN0cnVjdCBwY2Y1MDYzM190aW1lIHBjZl90bTsKKwlpbnQgcmV0OworCisJcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXQgPSBwY2Y1MDYzM19yZWFkX2Jsb2NrKHJ0Yy0+cGNmLCBQQ0Y1MDYzM19SRUdfUlRDU0MsCisJCQkJCSAgICBQQ0Y1MDYzM19USV9FWFRFTlQsCisJCQkJCSAgICAmcGNmX3RtLnRpbWVbMF0pOworCWlmIChyZXQgIT0gUENGNTA2MzNfVElfRVhURU5UKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgdGltZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldl9kYmcoZGV2LCAiUENGX1RJTUU6ICUwMnguJTAyeC4lMDJ4ICUwMng6JTAyeDolMDJ4XG4iLAorCQlwY2ZfdG0udGltZVtQQ0Y1MDYzM19USV9EQVldLAorCQlwY2ZfdG0udGltZVtQQ0Y1MDYzM19USV9NT05USF0sCisJCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX1lFQVJdLAorCQlwY2ZfdG0udGltZVtQQ0Y1MDYzM19USV9IT1VSXSwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfTUlOXSwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfU0VDXSk7CisKKwlwY2YycnRjX3RpbWUodG0sICZwY2ZfdG0pOworCisJZGV2X2RiZyhkZXYsICJSVENfVElNRTogJXUuJXUuJXUgJXU6JXU6JXVcbiIsCisJCXRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgcGNmNTA2MzNfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfcnRjICpydGM7CisJc3RydWN0IHBjZjUwNjMzX3RpbWUgcGNmX3RtOworCWludCBhbGFybV9tYXNrZWQsIHJldCA9IDA7CisKKwlydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWRldl9kYmcoZGV2LCAiUlRDX1RJTUU6ICV1LiV1LiV1ICV1OiV1OiV1XG4iLAorCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJ0YzJwY2ZfdGltZSgmcGNmX3RtLCB0bSk7CisKKwlkZXZfZGJnKGRldiwgIlBDRl9USU1FOiAlMDJ4LiUwMnguJTAyeCAlMDJ4OiUwMng6JTAyeFxuIiwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfREFZXSwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfTU9OVEhdLAorCQlwY2ZfdG0udGltZVtQQ0Y1MDYzM19USV9ZRUFSXSwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfSE9VUl0sCisJCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX01JTl0sCisJCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX1NFQ10pOworCisKKwlhbGFybV9tYXNrZWQgPSBwY2Y1MDYzM19pcnFfbWFza19nZXQocnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSk7CisKKwlpZiAoIWFsYXJtX21hc2tlZCkKKwkJcGNmNTA2MzNfaXJxX21hc2socnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSk7CisKKwkvKiBSZXR1cm5zIDAgb24gc3VjY2VzcyAqLworCXJldCA9IHBjZjUwNjMzX3dyaXRlX2Jsb2NrKHJ0Yy0+cGNmLCBQQ0Y1MDYzM19SRUdfUlRDU0MsCisJCQkJCSAgICAgUENGNTA2MzNfVElfRVhURU5ULAorCQkJCQkgICAgICZwY2ZfdG0udGltZVswXSk7CisKKwlpZiAoIWFsYXJtX21hc2tlZCkKKwkJcGNmNTA2MzNfaXJxX3VubWFzayhydGMtPnBjZiwgUENGNTA2MzNfSVJRX0FMQVJNKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGNmNTA2MzNfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfcnRjICpydGM7CisJc3RydWN0IHBjZjUwNjMzX3RpbWUgcGNmX3RtOworCWludCByZXQgPSAwOworCisJcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlhbHJtLT5lbmFibGVkID0gcnRjLT5hbGFybV9lbmFibGVkOworCWFscm0tPnBlbmRpbmcgPSBydGMtPmFsYXJtX3BlbmRpbmc7CisKKwlyZXQgPSBwY2Y1MDYzM19yZWFkX2Jsb2NrKHJ0Yy0+cGNmLCBQQ0Y1MDYzM19SRUdfUlRDU0NBLAorCQkJCVBDRjUwNjMzX1RJX0VYVEVOVCwgJnBjZl90bS50aW1lWzBdKTsKKwlpZiAocmV0ICE9IFBDRjUwNjMzX1RJX0VYVEVOVCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIHRpbWVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwY2YycnRjX3RpbWUoJmFscm0tPnRpbWUsICZwY2ZfdG0pOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSgmYWxybS0+dGltZSk7Cit9CisKK3N0YXRpYyBpbnQgcGNmNTA2MzNfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwY2Y1MDYzM19ydGMgKnJ0YzsKKwlzdHJ1Y3QgcGNmNTA2MzNfdGltZSBwY2ZfdG07CisJaW50IGFsYXJtX21hc2tlZCwgcmV0ID0gMDsKKworCXJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjMnBjZl90aW1lKCZwY2ZfdG0sICZhbHJtLT50aW1lKTsKKworCS8qIGRvIGxpa2UgbWt0aW1lIGRvZXMgYW5kIGlnbm9yZSB0bV93ZGF5ICovCisJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfV0tEQVldID0gNzsKKworCWFsYXJtX21hc2tlZCA9IHBjZjUwNjMzX2lycV9tYXNrX2dldChydGMtPnBjZiwgUENGNTA2MzNfSVJRX0FMQVJNKTsKKworCS8qIGRpc2FibGUgYWxhcm0gaW50ZXJydXB0ICovCisJaWYgKCFhbGFybV9tYXNrZWQpCisJCXBjZjUwNjMzX2lycV9tYXNrKHJ0Yy0+cGNmLCBQQ0Y1MDYzM19JUlFfQUxBUk0pOworCisJLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgKi8KKwlyZXQgPSBwY2Y1MDYzM193cml0ZV9ibG9jayhydGMtPnBjZiwgUENGNTA2MzNfUkVHX1JUQ1NDQSwKKwkJCQlQQ0Y1MDYzM19USV9FWFRFTlQsICZwY2ZfdG0udGltZVswXSk7CisJaWYgKCFhbHJtLT5lbmFibGVkKQorCQlydGMtPmFsYXJtX3BlbmRpbmcgPSAwOworCisJaWYgKCFhbGFybV9tYXNrZWQgfHwgYWxybS0+ZW5hYmxlZCkKKwkJcGNmNTA2MzNfaXJxX3VubWFzayhydGMtPnBjZiwgUENGNTA2MzNfSVJRX0FMQVJNKTsKKwlydGMtPmFsYXJtX2VuYWJsZWQgPSBhbHJtLT5lbmFibGVkOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHBjZjUwNjMzX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQkJPSBwY2Y1MDYzM19ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQkJPSBwY2Y1MDYzM19ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0JCT0gcGNmNTA2MzNfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQkJPSBwY2Y1MDYzM19ydGNfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlCT0gcGNmNTA2MzNfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgdm9pZCBwY2Y1MDYzM19ydGNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBjZjUwNjMzX3J0YyAqcnRjID0gZGF0YTsKKworCXJ0Y191cGRhdGVfaXJxKHJ0Yy0+cnRjX2RldiwgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCXJ0Yy0+YWxhcm1fcGVuZGluZyA9IDE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjZjUwNjMzX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwY2Y1MDYzM19ydGMgKnJ0YzsKKworCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKCpydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ0YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlydGMtPnBjZiA9IGRldl90b19wY2Y1MDYzMyhwZGV2LT5kZXYucGFyZW50KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCXJ0Yy0+cnRjX2RldiA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInBjZjUwNjMzLXJ0YyIsICZwZGV2LT5kZXYsCisJCQkJJnBjZjUwNjMzX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKworCWlmIChJU19FUlIocnRjLT5ydGNfZGV2KSkgeworCQlpbnQgcmV0ID0gIFBUUl9FUlIocnRjLT5ydGNfZGV2KTsKKwkJa2ZyZWUocnRjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwY2Y1MDYzM19yZWdpc3Rlcl9pcnEocnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSwKKwkJCQkJcGNmNTA2MzNfcnRjX2lycSwgcnRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcGNmNTA2MzNfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwY2Y1MDYzM19ydGMgKnJ0YzsKKworCXJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGNmNTA2MzNfZnJlZV9pcnEocnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjLT5ydGNfZGV2KTsKKwlrZnJlZShydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBjZjUwNjMzX3J0Y19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicGNmNTA2MzMtcnRjIiwKKwl9LAorCS5wcm9iZSA9IHBjZjUwNjMzX3J0Y19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AocGNmNTA2MzNfcnRjX3JlbW92ZSksCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHBjZjUwNjMzX3J0Y19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRjUwNjMzIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJhbGFqaSBSYW8gPGJhbGFqaXJyYW9Ab3Blbm1va28ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcGNmODU2My5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzA2NzdkCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYwpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIEFuIEkyQyBkcml2ZXIgZm9yIHRoZSBQaGlsaXBzIFBDRjg1NjMgUlRDCisgKiBDb3B5cmlnaHQgMjAwNS0wNiBUb3dlciBUZWNobm9sb2dpZXMKKyAqCisgKiBBdXRob3I6IEFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PgorICogTWFpbnRhaW5lcnM6IGh0dHA6Ly93d3cubnNsdTItbGludXgub3JnLworICoKKyAqIGJhc2VkIG9uIHRoZSBvdGhlciBkcml2ZXJzIGluIHRoaXMgc2FtZSBkaXJlY3RvcnkuCisgKgorICogaHR0cDovL3d3dy5zZW1pY29uZHVjdG9ycy5waGlsaXBzLmNvbS9hY3JvYmF0L2RhdGFzaGVldHMvUENGODU2My0wNC5wZGYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNC4zIgorCisjZGVmaW5lIFBDRjg1NjNfUkVHX1NUMQkJMHgwMCAvKiBzdGF0dXMgKi8KKyNkZWZpbmUgUENGODU2M19SRUdfU1QyCQkweDAxCisKKyNkZWZpbmUgUENGODU2M19SRUdfU0MJCTB4MDIgLyogZGF0ZXRpbWUgKi8KKyNkZWZpbmUgUENGODU2M19SRUdfTU4JCTB4MDMKKyNkZWZpbmUgUENGODU2M19SRUdfSFIJCTB4MDQKKyNkZWZpbmUgUENGODU2M19SRUdfRE0JCTB4MDUKKyNkZWZpbmUgUENGODU2M19SRUdfRFcJCTB4MDYKKyNkZWZpbmUgUENGODU2M19SRUdfTU8JCTB4MDcKKyNkZWZpbmUgUENGODU2M19SRUdfWVIJCTB4MDgKKworI2RlZmluZSBQQ0Y4NTYzX1JFR19BTU4JCTB4MDkgLyogYWxhcm0gKi8KKyNkZWZpbmUgUENGODU2M19SRUdfQUhSCQkweDBBCisjZGVmaW5lIFBDRjg1NjNfUkVHX0FETQkJMHgwQgorI2RlZmluZSBQQ0Y4NTYzX1JFR19BRFcJCTB4MEMKKworI2RlZmluZSBQQ0Y4NTYzX1JFR19DTEtPCTB4MEQgLyogY2xvY2sgb3V0ICovCisjZGVmaW5lIFBDRjg1NjNfUkVHX1RNUkMJMHgwRSAvKiB0aW1lciBjb250cm9sICovCisjZGVmaW5lIFBDRjg1NjNfUkVHX1RNUgkJMHgwRiAvKiB0aW1lciAqLworCisjZGVmaW5lIFBDRjg1NjNfU0NfTFYJCTB4ODAgLyogbG93IHZvbHRhZ2UgKi8KKyNkZWZpbmUgUENGODU2M19NT19DCQkweDgwIC8qIGNlbnR1cnkgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjZjg1NjNfZHJpdmVyOworCitzdHJ1Y3QgcGNmODU2MyB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwkvKgorCSAqIFRoZSBtZWFuaW5nIG9mIE1PX0MgYml0IHZhcmllcyBieSB0aGUgY2hpcCB0eXBlLgorCSAqIEZyb20gUENGODU2MyBkYXRhc2hlZXQ6IHRoaXMgYml0IGlzIHRvZ2dsZWQgd2hlbiB0aGUgeWVhcnMKKwkgKiByZWdpc3RlciBvdmVyZmxvd3MgZnJvbSA5OSB0byAwMAorCSAqICAgMCBpbmRpY2F0ZXMgdGhlIGNlbnR1cnkgaXMgMjB4eAorCSAqICAgMSBpbmRpY2F0ZXMgdGhlIGNlbnR1cnkgaXMgMTl4eAorCSAqIEZyb20gUlRDODU2NCBkYXRhc2hlZXQ6IHRoaXMgYml0IGluZGljYXRlcyBjaGFuZ2Ugb2YKKwkgKiBjZW50dXJ5LiBXaGVuIHRoZSB5ZWFyIGRpZ2l0IGRhdGEgb3ZlcmZsb3dzIGZyb20gOTkgdG8gMDAsCisJICogdGhpcyBiaXQgaXMgc2V0LiBCeSBwcmVzZXR0aW5nIGl0IHRvIDAgd2hpbGUgc3RpbGwgaW4gdGhlCisJICogMjB0aCBjZW50dXJ5LCBpdCB3aWxsIGJlIHNldCBpbiB5ZWFyIDIwMDAsIC4uLgorCSAqIFRoZXJlIHNlZW1zIG5vIHJlbGlhYmxlIHdheSB0byBrbm93IGhvdyB0aGUgc3lzdGVtIHVzZSB0aGlzCisJICogYml0LiAgU28gbGV0J3MgZG8gaXQgaGV1cmlzdGljYWxseSwgYXNzdW1pbmcgd2UgYXJlIGxpdmUgaW4KKwkgKiAxOTcwLi4uMjA2OS4KKwkgKi8KKwlpbnQgY19wb2xhcml0eTsJLyogMDogTU9fQz0xIG1lYW5zIDE5eHgsIG90aGVyd2lzZSBNT19DPTEgbWVhbnMgMjB4eCAqLworfTsKKworLyoKKyAqIEluIHRoZSByb3V0aW5lcyB0aGF0IGRlYWwgZGlyZWN0bHkgd2l0aCB0aGUgcGNmODU2MyBoYXJkd2FyZSwgd2UgdXNlCisgKiBydGNfdGltZSAtLSBtb250aCAwLTExLCBob3VyIDAtMjMsIHlyID0gY2FsZW5kYXIgeWVhci1lcG9jaC4KKyAqLworc3RhdGljIGludCBwY2Y4NTYzX2dldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwY2Y4NTYzICpwY2Y4NTYzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgY2hhciBidWZbMTNdID0geyBQQ0Y4NTYzX1JFR19TVDEgfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeyBjbGllbnQtPmFkZHIsIDAsIDEsIGJ1ZiB9LAkvKiBzZXR1cCByZWFkIHB0ciAqLworCQl7IGNsaWVudC0+YWRkciwgSTJDX01fUkQsIDEzLCBidWYgfSwJLyogcmVhZCBzdGF0dXMgKyBkYXRlICovCisJfTsKKworCS8qIHJlYWQgcmVnaXN0ZXJzICovCisJaWYgKChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSkgIT0gMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChidWZbUENGODU2M19SRUdfU0NdICYgUENGODU2M19TQ19MVikKKwkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LAorCQkJImxvdyB2b2x0YWdlIGRldGVjdGVkLCBkYXRlL3RpbWUgaXMgbm90IHJlbGlhYmxlLlxuIik7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwKKwkJIiVzOiByYXcgZGF0YSBpcyBzdDE9JTAyeCwgc3QyPSUwMngsIHNlYz0lMDJ4LCBtaW49JTAyeCwgaHI9JTAyeCwgIgorCQkibWRheT0lMDJ4LCB3ZGF5PSUwMngsIG1vbj0lMDJ4LCB5ZWFyPSUwMnhcbiIsCisJCV9fZnVuY19fLAorCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJCWJ1Zls0XSwgYnVmWzVdLCBidWZbNl0sIGJ1Zls3XSwKKwkJYnVmWzhdKTsKKworCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4oYnVmW1BDRjg1NjNfUkVHX1NDXSAmIDB4N0YpOworCXRtLT50bV9taW4gPSBiY2QyYmluKGJ1ZltQQ0Y4NTYzX1JFR19NTl0gJiAweDdGKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oYnVmW1BDRjg1NjNfUkVHX0hSXSAmIDB4M0YpOyAvKiBydGMgaHIgMC0yMyAqLworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihidWZbUENGODU2M19SRUdfRE1dICYgMHgzRik7CisJdG0tPnRtX3dkYXkgPSBidWZbUENGODU2M19SRUdfRFddICYgMHgwNzsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihidWZbUENGODU2M19SRUdfTU9dICYgMHgxRikgLSAxOyAvKiBydGMgbW4gMS0xMiAqLworCXRtLT50bV95ZWFyID0gYmNkMmJpbihidWZbUENGODU2M19SRUdfWVJdKTsKKwlpZiAodG0tPnRtX3llYXIgPCA3MCkKKwkJdG0tPnRtX3llYXIgKz0gMTAwOwkvKiBhc3N1bWUgd2UgYXJlIGluIDE5NzAuLi4yMDY5ICovCisJLyogZGV0ZWN0IHRoZSBwb2xhcml0eSBoZXVyaXN0aWNhbGx5LiBzZWUgbm90ZSBhYm92ZS4gKi8KKwlwY2Y4NTYzLT5jX3BvbGFyaXR5ID0gKGJ1ZltQQ0Y4NTYzX1JFR19NT10gJiBQQ0Y4NTYzX01PX0MpID8KKwkJKHRtLT50bV95ZWFyID49IDEwMCkgOiAodG0tPnRtX3llYXIgPCAxMDApOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogdG0gaXMgc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsICIKKwkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJX19mdW5jX18sCisJCXRtLT50bV9zZWMsIHRtLT50bV9taW4sIHRtLT50bV9ob3VyLAorCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKKworCS8qIHRoZSBjbG9jayBjYW4gZ2l2ZSBvdXQgaW52YWxpZCBkYXRldGltZSwgYnV0IHdlIGNhbm5vdCByZXR1cm4KKwkgKiAtRUlOVkFMIG90aGVyd2lzZSBod2Nsb2NrIHdpbGwgcmVmdXNlIHRvIHNldCB0aGUgdGltZSBvbiBib290dXAuCisJICovCisJaWYgKHJ0Y192YWxpZF90bSh0bSkgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJldHJpZXZlZCBkYXRlL3RpbWUgaXMgbm90IHZhbGlkLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2Y4NTYzX3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwY2Y4NTYzICpwY2Y4NTYzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGksIGVycjsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls5XTsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IHNlY3M9JWQsIG1pbnM9JWQsIGhvdXJzPSVkLCAiCisJCSJtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCV9fZnVuY19fLAorCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKKwkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisKKwkvKiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcyAqLworCWJ1ZltQQ0Y4NTYzX1JFR19TQ10gPSBiaW4yYmNkKHRtLT50bV9zZWMpOworCWJ1ZltQQ0Y4NTYzX1JFR19NTl0gPSBiaW4yYmNkKHRtLT50bV9taW4pOworCWJ1ZltQQ0Y4NTYzX1JFR19IUl0gPSBiaW4yYmNkKHRtLT50bV9ob3VyKTsKKworCWJ1ZltQQ0Y4NTYzX1JFR19ETV0gPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKworCS8qIG1vbnRoLCAxIC0gMTIgKi8KKwlidWZbUENGODU2M19SRUdfTU9dID0gYmluMmJjZCh0bS0+dG1fbW9uICsgMSk7CisKKwkvKiB5ZWFyIGFuZCBjZW50dXJ5ICovCisJYnVmW1BDRjg1NjNfUkVHX1lSXSA9IGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApOworCWlmIChwY2Y4NTYzLT5jX3BvbGFyaXR5ID8gKHRtLT50bV95ZWFyID49IDEwMCkgOiAodG0tPnRtX3llYXIgPCAxMDApKQorCQlidWZbUENGODU2M19SRUdfTU9dIHw9IFBDRjg1NjNfTU9fQzsKKworCWJ1ZltQQ0Y4NTYzX1JFR19EV10gPSB0bS0+dG1fd2RheSAmIDB4MDc7CisKKwkvKiB3cml0ZSByZWdpc3RlcidzIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgZGF0YVsyXSA9IHsgUENGODU2M19SRUdfU0MgKyBpLAorCQkJCQkJYnVmW1BDRjg1NjNfUkVHX1NDICsgaV0gfTsKKworCQllcnIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkYXRhLCBzaXplb2YoZGF0YSkpOworCQlpZiAoZXJyICE9IHNpemVvZihkYXRhKSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJIiVzOiBlcnI9JWQgYWRkcj0lMDJ4LCBkYXRhPSUwMnhcbiIsCisJCQkJX19mdW5jX18sIGVyciwgZGF0YVswXSwgZGF0YVsxXSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2Y4NTYzX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiBwY2Y4NTYzX2dldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludCBwY2Y4NTYzX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIHBjZjg1NjNfc2V0X2RhdGV0aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgcGNmODU2M19ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBwY2Y4NTYzX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gcGNmODU2M19ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IHBjZjg1NjNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHBjZjg1NjMgKnBjZjg1NjM7CisKKwlpbnQgZXJyID0gMDsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBjZjg1NjMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNmODU2MyksIEdGUF9LRVJORUwpOworCWlmICghcGNmODU2MykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJjaGlwIGZvdW5kLCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcGNmODU2Myk7CisKKwlwY2Y4NTYzLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBjZjg1NjNfZHJpdmVyLmRyaXZlci5uYW1lLAorCQkJCSZjbGllbnQtPmRldiwgJnBjZjg1NjNfcnRjX29wcywgVEhJU19NT0RVTEUpOworCisJaWYgKElTX0VSUihwY2Y4NTYzLT5ydGMpKSB7CisJCWVyciA9IFBUUl9FUlIocGNmODU2My0+cnRjKTsKKwkJZ290byBleGl0X2tmcmVlOworCX0KKworCXJldHVybiAwOworCitleGl0X2tmcmVlOgorCWtmcmVlKHBjZjg1NjMpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwY2Y4NTYzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBwY2Y4NTYzICpwY2Y4NTYzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAocGNmODU2My0+cnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGNmODU2My0+cnRjKTsKKworCWtmcmVlKHBjZjg1NjMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBwY2Y4NTYzX2lkW10gPSB7CisJeyAicGNmODU2MyIsIDAgfSwKKwl7ICJydGM4NTY0IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwY2Y4NTYzX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjZjg1NjNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtcGNmODU2MyIsCisJfSwKKwkucHJvYmUJCT0gcGNmODU2M19wcm9iZSwKKwkucmVtb3ZlCQk9IHBjZjg1NjNfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHBjZjg1NjNfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihwY2Y4NTYzX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzIFBDRjg1NjMvRXBzb24gUlRDODU2NCBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcGNmODU4My5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBjZjg1ODMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTlmZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBjZjg1ODMuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqICBkcml2ZXJzL3J0Yy9ydGMtcGNmODU4My5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBSdXNzZWxsIEtpbmcKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggV29sZnJhbSBTYW5nICYgSnVlcmdlbiBCZWlzZXJ0LCBQZW5ndXRyb25peAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIERyaXZlciBmb3IgUENGODU4MyBSVEMgJiBSQU0gY2hpcAorICoKKyAqICBDb252ZXJ0ZWQgdG8gdGhlIGdlbmVyaWMgUlRDIHN1c2JzeXN0ZW0gYnkgRy4gTGlha2hvdmV0c2tpICgyMDA2KQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCitzdHJ1Y3QgcnRjX21lbSB7CisJdW5zaWduZWQgaW50CWxvYzsKKwl1bnNpZ25lZCBpbnQJbnI7CisJdW5zaWduZWQgY2hhcgkqZGF0YTsKK307CisKK3N0cnVjdCBwY2Y4NTgzIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXVuc2lnbmVkIGNoYXIgY3RybDsKK307CisKKyNkZWZpbmUgQ1RSTF9TVE9QCTB4ODAKKyNkZWZpbmUgQ1RSTF9IT0xECTB4NDAKKyNkZWZpbmUgQ1RSTF8zMktIWgkweDAwCisjZGVmaW5lIENUUkxfTUFTSwkweDA4CisjZGVmaW5lIENUUkxfQUxBUk1FTgkweDA0CisjZGVmaW5lIENUUkxfQUxBUk0JMHgwMgorI2RlZmluZSBDVFJMX1RJTUVSCTB4MDEKKworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGNmODU4M19kcml2ZXI7CisKKyNkZWZpbmUgZ2V0X2N0cmwoeCkgICAgKChzdHJ1Y3QgcGNmODU4MyAqKWkyY19nZXRfY2xpZW50ZGF0YSh4KSktPmN0cmwKKyNkZWZpbmUgc2V0X2N0cmwoeCwgdikgZ2V0X2N0cmwoeCkgPSB2CisKKyNkZWZpbmUgQ01PU19ZRUFSCSg2NCArIDEyOCkKKyNkZWZpbmUgQ01PU19DSEVDS1NVTQkoNjMpCisKK3N0YXRpYyBpbnQgcGNmODU4M19nZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XSwgYWRkclsxXSA9IHsgMSB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7CisJCXsKKwkJCS5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IGFkZHIsCisJCX0sIHsKKwkJCS5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuID0gNiwKKwkJCS5idWYgPSBidWYsCisJCX0KKwl9OworCWludCByZXQ7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKTsKKwlpZiAocmV0ID09IDIpIHsKKwkJZHQtPnRtX3llYXIgPSBidWZbNF0gPj4gNjsKKwkJZHQtPnRtX3dkYXkgPSBidWZbNV0gPj4gNTsKKworCQlidWZbNF0gJj0gMHgzZjsKKwkJYnVmWzVdICY9IDB4MWY7CisKKwkJZHQtPnRtX3NlYyA9IGJjZDJiaW4oYnVmWzFdKTsKKwkJZHQtPnRtX21pbiA9IGJjZDJiaW4oYnVmWzJdKTsKKwkJZHQtPnRtX2hvdXIgPSBiY2QyYmluKGJ1ZlszXSk7CisJCWR0LT50bV9tZGF5ID0gYmNkMmJpbihidWZbNF0pOworCQlkdC0+dG1fbW9uID0gYmNkMmJpbihidWZbNV0pIC0gMTsKKwl9CisKKwlyZXR1cm4gcmV0ID09IDIgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBwY2Y4NTgzX3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0LCBpbnQgZGF0ZXRvbykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwlpbnQgcmV0LCBsZW4gPSA2OworCisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSBnZXRfY3RybChjbGllbnQpIHwgMHg4MDsKKwlidWZbMl0gPSAwOworCWJ1ZlszXSA9IGJpbjJiY2QoZHQtPnRtX3NlYyk7CisJYnVmWzRdID0gYmluMmJjZChkdC0+dG1fbWluKTsKKwlidWZbNV0gPSBiaW4yYmNkKGR0LT50bV9ob3VyKTsKKworCWlmIChkYXRldG9vKSB7CisJCWxlbiA9IDg7CisJCWJ1Zls2XSA9IGJpbjJiY2QoZHQtPnRtX21kYXkpIHwgKGR0LT50bV95ZWFyIDw8IDYpOworCQlidWZbN10gPSBiaW4yYmNkKGR0LT50bV9tb24gKyAxKSAgfCAoZHQtPnRtX3dkYXkgPDwgNSk7CisJfQorCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgKGNoYXIgKilidWYsIGxlbik7CisJaWYgKHJldCAhPSBsZW4pCisJCXJldHVybiAtRUlPOworCisJYnVmWzFdID0gZ2V0X2N0cmwoY2xpZW50KTsKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAoY2hhciAqKWJ1ZiwgMik7CisKKwlyZXR1cm4gcmV0ID09IDIgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBwY2Y4NTgzX2dldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNoYXIgKmN0cmwpCit7CisJKmN0cmwgPSBnZXRfY3RybChjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfc2V0X2N0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY2hhciAqY3RybCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKworCWJ1ZlswXSA9IDA7CisJYnVmWzFdID0gKmN0cmw7CisJc2V0X2N0cmwoY2xpZW50LCAqY3RybCk7CisKKwlyZXR1cm4gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgKGNoYXIgKilidWYsIDIpOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfcmVhZF9tZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y19tZW0gKm1lbSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFkZHJbMV07CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gYWRkciwKKwkJfSwgeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSBtZW0tPm5yLAorCQkJLmJ1ZiA9IG1lbS0+ZGF0YSwKKwkJfQorCX07CisKKwlpZiAobWVtLT5sb2MgPCA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZHJbMF0gPSBtZW0tPmxvYzsKKworCXJldHVybiBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA9PSAyID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgcGNmODU4M193cml0ZV9tZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y19tZW0gKm1lbSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls5XTsKKwlpbnQgcmV0OworCisJaWYgKG1lbS0+bG9jIDwgOCB8fCBtZW0tPm5yID4gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWZbMF0gPSBtZW0tPmxvYzsKKwltZW1jcHkoYnVmICsgMSwgbWVtLT5kYXRhLCBtZW0tPm5yKTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgbWVtLT5uciArIDEpOworCXJldHVybiByZXQgPT0gbWVtLT5uciArIDEgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBwY2Y4NTgzX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdW5zaWduZWQgY2hhciBjdHJsLCB5ZWFyWzJdOworCXN0cnVjdCBydGNfbWVtIG1lbSA9IHsgQ01PU19ZRUFSLCBzaXplb2YoeWVhciksIHllYXIgfTsKKwlpbnQgcmVhbF95ZWFyLCB5ZWFyX29mZnNldCwgZXJyOworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgUlRDIGlzIHJ1bm5pbmcuCisJICovCisJcGNmODU4M19nZXRfY3RybChjbGllbnQsICZjdHJsKTsKKwlpZiAoY3RybCAmIChDVFJMX1NUT1AgfCBDVFJMX0hPTEQpKSB7CisJCXVuc2lnbmVkIGNoYXIgbmV3X2N0cmwgPSBjdHJsICYgfihDVFJMX1NUT1AgfCBDVFJMX0hPTEQpOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJUQzogcmVzZXR0aW5nIGNvbnRyb2wgJTAyeCAtPiAlMDJ4XG4iLAorCQkgICAgICAgY3RybCwgbmV3X2N0cmwpOworCisJCWlmICgoZXJyID0gcGNmODU4M19zZXRfY3RybChjbGllbnQsICZuZXdfY3RybCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHBjZjg1ODNfZ2V0X2RhdGV0aW1lKGNsaWVudCwgdG0pIHx8CisJICAgIHBjZjg1ODNfcmVhZF9tZW0oY2xpZW50LCAmbWVtKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZWFsX3llYXIgPSB5ZWFyWzBdOworCisJLyoKKwkgKiBUaGUgUlRDIHllYXIgaG9sZHMgdGhlIExTQiB0d28gYml0cyBvZiB0aGUgY3VycmVudAorCSAqIHllYXIsIHdoaWNoIHNob3VsZCByZWZsZWN0IHRoZSBMU0IgdHdvIGJpdHMgb2YgdGhlCisJICogQ01PUyBjb3B5IG9mIHRoZSB5ZWFyLiAgQW55IGRpZmZlcmVuY2UgaW5kaWNhdGVzCisJICogdGhhdCB3ZSBoYXZlIHRvIGNvcnJlY3QgdGhlIENNT1MgdmVyc2lvbi4KKwkgKi8KKwl5ZWFyX29mZnNldCA9IHRtLT50bV95ZWFyIC0gKHJlYWxfeWVhciAmIDMpOworCWlmICh5ZWFyX29mZnNldCA8IDApCisJCS8qCisJCSAqIFJUQyB5ZWFyIHdyYXBwZWQuICBBZGp1c3QgaXQgYXBwcm9wcmlhdGVseS4KKwkJICovCisJCXllYXJfb2Zmc2V0ICs9IDQ7CisKKwl0bS0+dG1feWVhciA9IChyZWFsX3llYXIgKyB5ZWFyX29mZnNldCArIHllYXJbMV0gKiAxMDApIC0gMTkwMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXVuc2lnbmVkIGNoYXIgeWVhclsyXSwgY2hrOworCXN0cnVjdCBydGNfbWVtIGNtb3NfeWVhciAgPSB7IENNT1NfWUVBUiwgc2l6ZW9mKHllYXIpLCB5ZWFyIH07CisJc3RydWN0IHJ0Y19tZW0gY21vc19jaGVjayA9IHsgQ01PU19DSEVDS1NVTSwgMSwgJmNoayB9OworCXVuc2lnbmVkIGludCBwcm9wZXJfeWVhciA9IHRtLT50bV95ZWFyICsgMTkwMDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUaGUgUlRDJ3Mgb3duIDItYml0IHllYXIgbXVzdCByZWZsZWN0IHRoZSBsZWFzdAorCSAqIHNpZ25pZmljYW50IHR3byBiaXRzIG9mIHRoZSBDTU9TIHllYXIuCisJICovCisKKwlyZXQgPSBwY2Y4NTgzX3NldF9kYXRldGltZShjbGllbnQsIHRtLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGNmODU4M19yZWFkX21lbShjbGllbnQsICZjbW9zX2NoZWNrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGNmODU4M19yZWFkX21lbShjbGllbnQsICZjbW9zX3llYXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljaGsgLT0geWVhclsxXSArIHllYXJbMF07CisKKwl5ZWFyWzFdID0gcHJvcGVyX3llYXIgLyAxMDA7CisJeWVhclswXSA9IHByb3Blcl95ZWFyICUgMTAwOworCisJY2hrICs9IHllYXJbMV0gKyB5ZWFyWzBdOworCisJcmV0ID0gcGNmODU4M193cml0ZV9tZW0oY2xpZW50LCAmY21vc195ZWFyKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwY2Y4NTgzX3dyaXRlX21lbShjbGllbnQsICZjbW9zX2NoZWNrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBwY2Y4NTgzX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHBjZjg1ODNfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBwY2Y4NTgzX3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgcGNmODU4M19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcGNmODU4MyAqcGNmODU4MzsKKwlpbnQgZXJyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCXJldHVybiAtRU5PREVWOworCisJcGNmODU4MyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2Y4NTgzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2Y4NTgzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHBjZjg1ODMpOworCisJcGNmODU4My0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwY2Y4NTgzX2RyaXZlci5kcml2ZXIubmFtZSwKKwkJCSZjbGllbnQtPmRldiwgJnBjZjg1ODNfcnRjX29wcywgVEhJU19NT0RVTEUpOworCisJaWYgKElTX0VSUihwY2Y4NTgzLT5ydGMpKSB7CisJCWVyciA9IFBUUl9FUlIocGNmODU4My0+cnRjKTsKKwkJZ290byBleGl0X2tmcmVlOworCX0KKworCXJldHVybiAwOworCitleGl0X2tmcmVlOgorCWtmcmVlKHBjZjg1ODMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBjZjg1ODNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHBjZjg1ODMgKnBjZjg1ODMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChwY2Y4NTgzLT5ydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwY2Y4NTgzLT5ydGMpOworCWtmcmVlKHBjZjg1ODMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcGNmODU4M19pZFtdID0geworCXsgInBjZjg1ODMiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHBjZjg1ODNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGNmODU4M19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAicGNmODU4MyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHBjZjg1ODNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwY2Y4NTgzX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gcGNmODU4M19pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKHBjZjg1ODNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRjg1ODMgSTJDIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wbDAzMC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBsMDMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiYWNkYgotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wbDAzMC5jCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvcnRjL3J0Yy1wbDAzMC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBSVENfRFIJCSgwKQorI2RlZmluZSBSVENfTVIJCSg0KQorI2RlZmluZSBSVENfU1RBVAkoOCkKKyNkZWZpbmUgUlRDX0VPSQkJKDgpCisjZGVmaW5lIFJUQ19MUgkJKDEyKQorI2RlZmluZSBSVENfQ1IJCSgxNikKKyNkZWZpbmUgUlRDX0NSX01JRQkoMSA8PCAwKQorCitzdHJ1Y3QgcGwwMzBfcnRjIHsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCXZvaWQgX19pb21lbQkJKmJhc2U7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcGwwMzBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGwwMzBfcnRjICpydGMgPSBkZXZfaWQ7CisJd3JpdGVsKDAsIHJ0Yy0+YmFzZSArIFJUQ19FT0kpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBwbDAzMF9yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsMDMwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlydGNfdGltZV90b190bShyZWFkbChydGMtPmJhc2UgKyBSVENfTVIpLCAmYWxybS0+dGltZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGwwMzBfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsMDMwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWludCByZXQ7CisKKwkvKgorCSAqIEF0IHRoZSBtb21lbnQsIHdlIGNhbiBvbmx5IGRlYWwgd2l0aCBub24td2lsZGNhcmRlZCBhbGFybSB0aW1lcy4KKwkgKi8KKwlyZXQgPSBydGNfdmFsaWRfdG0oJmFscm0tPnRpbWUpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gcnRjX3RtX3RvX3RpbWUoJmFscm0tPnRpbWUsICZ0aW1lKTsKKwlpZiAocmV0ID09IDApCisJCXdyaXRlbCh0aW1lLCBydGMtPmJhc2UgKyBSVENfTVIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGwwMzBfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGwwMzBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y190aW1lX3RvX3RtKHJlYWRsKHJ0Yy0+YmFzZSArIFJUQ19EUiksIHRtKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBSVEMgdGltZS4gIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IGFjY3VyYXRlbHkgc2V0CisgKiB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIGNvdW50ZXIgdXBkYXRlcy4KKyAqCisgKiBBbHNvLCBzaW5jZSBSVENfTFIgaXMgdHJhbnNmZXJyZWQgdG8gUlRDX0NSIG9uIG5leHQgcmlzaW5nCisgKiBlZGdlIG9mIHRoZSAxSHogY2xvY2ssIHdlIG11c3Qgd3JpdGUgdGhlIHRpbWUgb25lIHNlY29uZAorICogaW4gYWR2YW5jZS4KKyAqLworc3RhdGljIGludCBwbDAzMF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsMDMwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWludCByZXQ7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSh0bSwgJnRpbWUpOworCWlmIChyZXQgPT0gMCkKKwkJd3JpdGVsKHRpbWUgKyAxLCBydGMtPmJhc2UgKyBSVENfTFIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHBsMDMwX29wcyA9IHsKKwkucmVhZF90aW1lCT0gcGwwMzBfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHBsMDMwX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gcGwwMzBfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gcGwwMzBfc2V0X2FsYXJtLAorfTsKKworc3RhdGljIGludCBwbDAzMF9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGFtYmFfaWQgKmlkKQoreworCXN0cnVjdCBwbDAzMF9ydGMgKnJ0YzsKKwlpbnQgcmV0OworCisJcmV0ID0gYW1iYV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCBOVUxMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXE7CisKKwlydGMgPSBrbWFsbG9jKHNpemVvZigqcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFydGMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfcnRjOworCX0KKworCXJ0Yy0+YmFzZSA9IGlvcmVtYXAoZGV2LT5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJmRldi0+cmVzKSk7CisJaWYgKCFydGMtPmJhc2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfbWFwOworCX0KKworCV9fcmF3X3dyaXRlbCgwLCBydGMtPmJhc2UgKyBSVENfQ1IpOworCV9fcmF3X3dyaXRlbCgwLCBydGMtPmJhc2UgKyBSVENfRU9JKTsKKworCWFtYmFfc2V0X2RydmRhdGEoZGV2LCBydGMpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnFbMF0sIHBsMDMwX2ludGVycnVwdCwgMCwKKwkJCSAgInJ0Yy1wbDAzMCIsIHJ0Yyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaXJxOworCisJcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJwbDAzMCIsICZkZXYtPmRldiwgJnBsMDMwX29wcywKKwkJCQkgICAgICAgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjLT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjLT5ydGMpOworCQlnb3RvIGVycl9yZWc7CisJfQorCisJcmV0dXJuIDA7CisKKyBlcnJfcmVnOgorCWZyZWVfaXJxKGRldi0+aXJxWzBdLCBydGMpOworIGVycl9pcnE6CisJaW91bm1hcChydGMtPmJhc2UpOworIGVycl9tYXA6CisJa2ZyZWUocnRjKTsKKyBlcnJfcnRjOgorCWFtYmFfcmVsZWFzZV9yZWdpb25zKGRldik7CisgZXJyX3JlcToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBsMDMwX3JlbW92ZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGwwMzBfcnRjICpydGMgPSBhbWJhX2dldF9kcnZkYXRhKGRldik7CisKKwlhbWJhX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwl3cml0ZWwoMCwgcnRjLT5iYXNlICsgUlRDX0NSKTsKKworCWZyZWVfaXJxKGRldi0+aXJxWzBdLCBydGMpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Yyk7CisJaW91bm1hcChydGMtPmJhc2UpOworCWtmcmVlKHJ0Yyk7CisJYW1iYV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFtYmFfaWQgcGwwMzBfaWRzW10gPSB7CisJeworCQkuaWQJPSAweDAwMDQxMDMwLAorCQkubWFzawk9IDB4MDAwZmZmZmYsCisJfSwKKwl7IDAsIDAgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYW1iYSwgcGwwMzBfaWRzKTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciBwbDAzMF9kcml2ZXIgPSB7CisJLmRydgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1wbDAzMCIsCisJfSwKKwkucHJvYmUJCT0gcGwwMzBfcHJvYmUsCisJLnJlbW92ZQkJPSBwbDAzMF9yZW1vdmUsCisJLmlkX3RhYmxlCT0gcGwwMzBfaWRzLAorfTsKKworbW9kdWxlX2FtYmFfZHJpdmVyKHBsMDMwX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFSTSBBTUJBIFBMMDMwIFJUQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBsMDMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlZjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogZHJpdmVycy9ydGMvcnRjLXBsMDMxLmMKKyAqCisgKiBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJmYWNlIGZvciBBUk0gQU1CQSBQcmltZUNlbGwgMDMxIFJUQworICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIEF1dGhvcjogTWlhbiBZb3VzYWYgS2F1a2FiIDxtaWFuLnlvdXNhZi5rYXVrYWJAc3Rlcmljc3Nvbi5jb20+CisgKiBDb3B5cmlnaHQgMjAxMCAoYykgU1QtRXJpY3Nzb24gQUIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyoKKyAqIFJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUJUlRDX0RSCQkweDAwCS8qIERhdGEgcmVhZCByZWdpc3RlciAqLworI2RlZmluZQlSVENfTVIJCTB4MDQJLyogTWF0Y2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0xSCQkweDA4CS8qIERhdGEgbG9hZCByZWdpc3RlciAqLworI2RlZmluZQlSVENfQ1IJCTB4MGMJLyogQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZQlSVENfSU1TQwkweDEwCS8qIEludGVycnVwdCBtYXNrIGFuZCBzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX1JJUwkJMHgxNAkvKiBSYXcgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlSVENfTUlTCQkweDE4CS8qIE1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19JQ1IJCTB4MWMJLyogSW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyICovCisvKiBTVCB2YXJpYW50cyBoYXZlIGFkZGl0aW9uYWwgdGltZXIgZnVuY3Rpb25hbGl0eSAqLworI2RlZmluZSBSVENfVERSCQkweDIwCS8qIFRpbWVyIGRhdGEgcmVhZCByZWdpc3RlciAqLworI2RlZmluZSBSVENfVExSCQkweDI0CS8qIFRpbWVyIGRhdGEgbG9hZCByZWdpc3RlciAqLworI2RlZmluZSBSVENfVENSCQkweDI4CS8qIFRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX1lEUgkJMHgzMAkvKiBZZWFyIGRhdGEgcmVhZCByZWdpc3RlciAqLworI2RlZmluZSBSVENfWU1SCQkweDM0CS8qIFllYXIgbWF0Y2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX1lMUgkJMHgzOAkvKiBZZWFyIGRhdGEgbG9hZCByZWdpc3RlciAqLworCisjZGVmaW5lIFJUQ19DUl9FTgkoMSA8PCAwKQkvKiBjb3VudGVyIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgUlRDX0NSX0NXRU4JKDEgPDwgMjYpCS8qIENsb2Nrd2F0Y2ggZW5hYmxlIGJpdCAqLworCisjZGVmaW5lIFJUQ19UQ1JfRU4JKDEgPDwgMSkgLyogUGVyaW9kaWMgdGltZXIgZW5hYmxlIGJpdCAqLworCisvKiBDb21tb24gYml0IGRlZmluaXRpb25zIGZvciBJbnRlcnJ1cHQgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSVENfQklUX0FJCSgxIDw8IDApIC8qIEFsYXJtIGludGVycnVwdCBiaXQgKi8KKyNkZWZpbmUgUlRDX0JJVF9QSQkoMSA8PCAxKSAvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgYml0LiBTVCB2YXJpYW50cyBvbmx5LiAqLworCisvKiBDb21tb24gYml0IGRlZmluYXRpb25zIGZvciBTVCB2MiBmb3IgcmVhZGluZy93cml0aW5nIHRpbWUgKi8KKyNkZWZpbmUgUlRDX1NFQ19TSElGVCAwCisjZGVmaW5lIFJUQ19TRUNfTUFTSyAoMHgzRiA8PCBSVENfU0VDX1NISUZUKSAvKiBTZWNvbmQgWzAtNTldICovCisjZGVmaW5lIFJUQ19NSU5fU0hJRlQgNgorI2RlZmluZSBSVENfTUlOX01BU0sgKDB4M0YgPDwgUlRDX01JTl9TSElGVCkgLyogTWludXRlIFswLTU5XSAqLworI2RlZmluZSBSVENfSE9VUl9TSElGVCAxMgorI2RlZmluZSBSVENfSE9VUl9NQVNLICgweDFGIDw8IFJUQ19IT1VSX1NISUZUKSAvKiBIb3VyIFswLTIzXSAqLworI2RlZmluZSBSVENfV0RBWV9TSElGVCAxNworI2RlZmluZSBSVENfV0RBWV9NQVNLICgweDcgPDwgUlRDX1dEQVlfU0hJRlQpIC8qIERheSBvZiBXZWVrIFsxLTddIDE9U3VuZGF5ICovCisjZGVmaW5lIFJUQ19NREFZX1NISUZUIDIwCisjZGVmaW5lIFJUQ19NREFZX01BU0sgKDB4MUYgPDwgUlRDX01EQVlfU0hJRlQpIC8qIERheSBvZiBNb250aCBbMS0zMV0gKi8KKyNkZWZpbmUgUlRDX01PTl9TSElGVCAyNQorI2RlZmluZSBSVENfTU9OX01BU0sgKDB4RiA8PCBSVENfTU9OX1NISUZUKSAvKiBNb250aCBbMS0xMl0gMT1KYW51YXJ5ICovCisKKyNkZWZpbmUgUlRDX1RJTUVSX0ZSRVEgMzI3NjgKKworc3RydWN0IHBsMDMxX2xvY2FsIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1OCBod19kZXNpZ25lcjsKKwl1OCBod19yZXZpc2lvbjo0OworfTsKKworc3RhdGljIGludCBwbDAzMV9hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBpbXNjOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgYWxhcm0gaW50ZXJydXB0cy4gKi8KKwl3cml0ZWwoUlRDX0JJVF9BSSwgbGRhdGEtPmJhc2UgKyBSVENfSUNSKTsKKworCWltc2MgPSByZWFkbChsZGF0YS0+YmFzZSArIFJUQ19JTVNDKTsKKworCWlmIChlbmFibGVkID09IDEpCisJCXdyaXRlbChpbXNjIHwgUlRDX0JJVF9BSSwgbGRhdGEtPmJhc2UgKyBSVENfSU1TQyk7CisJZWxzZQorCQl3cml0ZWwoaW1zYyAmIH5SVENfQklUX0FJLCBsZGF0YS0+YmFzZSArIFJUQ19JTVNDKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29udmVydCBHcmVnb3JpYW4gZGF0ZSB0byBTVCB2MiBSVEMgZm9ybWF0LgorICovCitzdGF0aWMgaW50IHBsMDMxX3N0djJfdG1fdG9fdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBydGNfdGltZSAqdG0sIHVuc2lnbmVkIGxvbmcgKnN0X3RpbWUsCisJdW5zaWduZWQgbG9uZyAqYmNkX3llYXIpCit7CisJaW50IHllYXIgPSB0bS0+dG1feWVhciArIDE5MDA7CisJaW50IHdkYXkgPSB0bS0+dG1fd2RheTsKKworCS8qIHdkYXkgbWFza2luZyBpcyBub3Qgd29ya2luZyBpbiBoYXJkd2FyZSBzbyB3ZGF5IG11c3QgYmUgdmFsaWQgKi8KKwlpZiAod2RheSA8IC0xIHx8IHdkYXkgPiA2KSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCB3ZGF5IHZhbHVlICVkXG4iLCB0bS0+dG1fd2RheSk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAod2RheSA9PSAtMSkgeworCQkvKiB3ZGF5IGlzIG5vdCBwcm92aWRlZCwgY2FsY3VsYXRlIGl0IGhlcmUgKi8KKwkJdW5zaWduZWQgbG9uZyB0aW1lOworCQlzdHJ1Y3QgcnRjX3RpbWUgY2FsY190bTsKKworCQlydGNfdG1fdG9fdGltZSh0bSwgJnRpbWUpOworCQlydGNfdGltZV90b190bSh0aW1lLCAmY2FsY190bSk7CisJCXdkYXkgPSBjYWxjX3RtLnRtX3dkYXk7CisJfQorCisJKmJjZF95ZWFyID0gKGJpbjJiY2QoeWVhciAlIDEwMCkgfCBiaW4yYmNkKHllYXIgLyAxMDApIDw8IDgpOworCisJKnN0X3RpbWUgPSAoKHRtLT50bV9tb24gKyAxKSA8PCBSVENfTU9OX1NISUZUKQorCQkJfAkodG0tPnRtX21kYXkgPDwgUlRDX01EQVlfU0hJRlQpCisJCQl8CSgod2RheSArIDEpIDw8IFJUQ19XREFZX1NISUZUKQorCQkJfAkodG0tPnRtX2hvdXIgPDwgUlRDX0hPVVJfU0hJRlQpCisJCQl8CSh0bS0+dG1fbWluIDw8IFJUQ19NSU5fU0hJRlQpCisJCQl8CSh0bS0+dG1fc2VjIDw8IFJUQ19TRUNfU0hJRlQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb252ZXJ0IFNUIHYyIFJUQyBmb3JtYXQgdG8gR3JlZ29yaWFuIGRhdGUuCisgKi8KK3N0YXRpYyBpbnQgcGwwMzFfc3R2Ml90aW1lX3RvX3RtKHVuc2lnbmVkIGxvbmcgc3RfdGltZSwgdW5zaWduZWQgbG9uZyBiY2RfeWVhciwKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXRtLT50bV95ZWFyID0gYmNkMmJpbihiY2RfeWVhcikgKyAoYmNkMmJpbihiY2RfeWVhciA+PiA4KSAqIDEwMCk7CisJdG0tPnRtX21vbiAgPSAoKHN0X3RpbWUgJiBSVENfTU9OX01BU0spID4+IFJUQ19NT05fU0hJRlQpIC0gMTsKKwl0bS0+dG1fbWRheSA9ICgoc3RfdGltZSAmIFJUQ19NREFZX01BU0spID4+IFJUQ19NREFZX1NISUZUKTsKKwl0bS0+dG1fd2RheSA9ICgoc3RfdGltZSAmIFJUQ19XREFZX01BU0spID4+IFJUQ19XREFZX1NISUZUKSAtIDE7CisJdG0tPnRtX2hvdXIgPSAoKHN0X3RpbWUgJiBSVENfSE9VUl9NQVNLKSA+PiBSVENfSE9VUl9TSElGVCk7CisJdG0tPnRtX21pbiAgPSAoKHN0X3RpbWUgJiBSVENfTUlOX01BU0spID4+IFJUQ19NSU5fU0hJRlQpOworCXRtLT50bV9zZWMgID0gKChzdF90aW1lICYgUlRDX1NFQ19NQVNLKSA+PiBSVENfU0VDX1NISUZUKTsKKworCXRtLT50bV95ZGF5ID0gcnRjX3llYXJfZGF5cyh0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIpOworCXRtLT50bV95ZWFyIC09IDE5MDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbDAzMV9zdHYyX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcGwwMzFfc3R2Ml90aW1lX3RvX3RtKHJlYWRsKGxkYXRhLT5iYXNlICsgUlRDX0RSKSwKKwkJCXJlYWRsKGxkYXRhLT5iYXNlICsgUlRDX1lEUiksIHRtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsMDMxX3N0djJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKwl1bnNpZ25lZCBsb25nIGJjZF95ZWFyOworCXN0cnVjdCBwbDAzMV9sb2NhbCAqbGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gcGwwMzFfc3R2Ml90bV90b190aW1lKGRldiwgdG0sICZ0aW1lLCAmYmNkX3llYXIpOworCWlmIChyZXQgPT0gMCkgeworCQl3cml0ZWwoYmNkX3llYXIsIGxkYXRhLT5iYXNlICsgUlRDX1lMUik7CisJCXdyaXRlbCh0aW1lLCBsZGF0YS0+YmFzZSArIFJUQ19MUik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbDAzMV9zdHYyX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBwbDAzMV9zdHYyX3RpbWVfdG9fdG0ocmVhZGwobGRhdGEtPmJhc2UgKyBSVENfTVIpLAorCQkJcmVhZGwobGRhdGEtPmJhc2UgKyBSVENfWU1SKSwgJmFsYXJtLT50aW1lKTsKKworCWFsYXJtLT5wZW5kaW5nID0gcmVhZGwobGRhdGEtPmJhc2UgKyBSVENfUklTKSAmIFJUQ19CSVRfQUk7CisJYWxhcm0tPmVuYWJsZWQgPSByZWFkbChsZGF0YS0+YmFzZSArIFJUQ19JTVNDKSAmIFJUQ19CSVRfQUk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBsMDMxX3N0djJfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBwbDAzMV9sb2NhbCAqbGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisJdW5zaWduZWQgbG9uZyBiY2RfeWVhcjsKKwlpbnQgcmV0OworCisJLyogQXQgdGhlIG1vbWVudCwgd2UgY2FuIG9ubHkgZGVhbCB3aXRoIG5vbi13aWxkY2FyZGVkIGFsYXJtIHRpbWVzLiAqLworCXJldCA9IHJ0Y192YWxpZF90bSgmYWxhcm0tPnRpbWUpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSBwbDAzMV9zdHYyX3RtX3RvX3RpbWUoZGV2LCAmYWxhcm0tPnRpbWUsCisJCQkJCSAgICAmdGltZSwgJmJjZF95ZWFyKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQl3cml0ZWwoYmNkX3llYXIsIGxkYXRhLT5iYXNlICsgUlRDX1lNUik7CisJCQl3cml0ZWwodGltZSwgbGRhdGEtPmJhc2UgKyBSVENfTVIpOworCisJCQlwbDAzMV9hbGFybV9pcnFfZW5hYmxlKGRldiwgYWxhcm0tPmVuYWJsZWQpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHBsMDMxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YSA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIHJ0Y21pczsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwlydGNtaXMgPSByZWFkbChsZGF0YS0+YmFzZSArIFJUQ19NSVMpOworCWlmIChydGNtaXMpIHsKKwkJd3JpdGVsKHJ0Y21pcywgbGRhdGEtPmJhc2UgKyBSVENfSUNSKTsKKworCQlpZiAocnRjbWlzICYgUlRDX0JJVF9BSSkKKwkJCWV2ZW50cyB8PSAoUlRDX0FGIHwgUlRDX0lSUUYpOworCisJCS8qIFRpbWVyIGludGVycnVwdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBTVCB2YXJpYW50cyAqLworCQlpZiAoKHJ0Y21pcyAmIFJUQ19CSVRfUEkpICYmCisJCQkobGRhdGEtPmh3X2Rlc2lnbmVyID09IEFNQkFfVkVORE9SX1NUKSkKKwkJCWV2ZW50cyB8PSAoUlRDX1BGIHwgUlRDX0lSUUYpOworCisJCXJ0Y191cGRhdGVfaXJxKGxkYXRhLT5ydGMsIDEsIGV2ZW50cyk7CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGludCBwbDAzMV9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbDAzMV9sb2NhbCAqbGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y190aW1lX3RvX3RtKHJlYWRsKGxkYXRhLT5iYXNlICsgUlRDX0RSKSwgdG0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGwwMzFfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKwlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IHJ0Y190bV90b190aW1lKHRtLCAmdGltZSk7CisKKwlpZiAocmV0ID09IDApCisJCXdyaXRlbCh0aW1lLCBsZGF0YS0+YmFzZSArIFJUQ19MUik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBsMDMxX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3RpbWVfdG9fdG0ocmVhZGwobGRhdGEtPmJhc2UgKyBSVENfTVIpLCAmYWxhcm0tPnRpbWUpOworCisJYWxhcm0tPnBlbmRpbmcgPSByZWFkbChsZGF0YS0+YmFzZSArIFJUQ19SSVMpICYgUlRDX0JJVF9BSTsKKwlhbGFybS0+ZW5hYmxlZCA9IHJlYWRsKGxkYXRhLT5iYXNlICsgUlRDX0lNU0MpICYgUlRDX0JJVF9BSTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsMDMxX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWludCByZXQ7CisKKwkvKiBBdCB0aGUgbW9tZW50LCB3ZSBjYW4gb25seSBkZWFsIHdpdGggbm9uLXdpbGRjYXJkZWQgYWxhcm0gdGltZXMuICovCisJcmV0ID0gcnRjX3ZhbGlkX3RtKCZhbGFybS0+dGltZSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IHJ0Y190bV90b190aW1lKCZhbGFybS0+dGltZSwgJnRpbWUpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXdyaXRlbCh0aW1lLCBsZGF0YS0+YmFzZSArIFJUQ19NUik7CisJCQlwbDAzMV9hbGFybV9pcnFfZW5hYmxlKGRldiwgYWxhcm0tPmVuYWJsZWQpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbDAzMV9yZW1vdmUoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2KQoreworCXN0cnVjdCBwbDAzMV9sb2NhbCAqbGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmFkZXYtPmRldik7CisKKwlhbWJhX3NldF9kcnZkYXRhKGFkZXYsIE5VTEwpOworCWZyZWVfaXJxKGFkZXYtPmlycVswXSwgbGRhdGEtPnJ0Yyk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGxkYXRhLT5ydGMpOworCWlvdW5tYXAobGRhdGEtPmJhc2UpOworCWtmcmVlKGxkYXRhKTsKKwlhbWJhX3JlbGVhc2VfcmVnaW9ucyhhZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsMDMxX3Byb2JlKHN0cnVjdCBhbWJhX2RldmljZSAqYWRldiwgY29uc3Qgc3RydWN0IGFtYmFfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YTsKKwlzdHJ1Y3QgcnRjX2NsYXNzX29wcyAqb3BzID0gaWQtPmRhdGE7CisJdW5zaWduZWQgbG9uZyB0aW1lLCBkYXRhOworCisJcmV0ID0gYW1iYV9yZXF1ZXN0X3JlZ2lvbnMoYWRldiwgTlVMTCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmVxOworCisJbGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGwwMzFfbG9jYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxkYXRhKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWxkYXRhLT5iYXNlID0gaW9yZW1hcChhZGV2LT5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJmFkZXYtPnJlcykpOworCisJaWYgKCFsZGF0YS0+YmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub19yZW1hcDsKKwl9CisKKwlhbWJhX3NldF9kcnZkYXRhKGFkZXYsIGxkYXRhKTsKKworCWxkYXRhLT5od19kZXNpZ25lciA9IGFtYmFfbWFuZihhZGV2KTsKKwlsZGF0YS0+aHdfcmV2aXNpb24gPSBhbWJhX3JldihhZGV2KTsKKworCWRldl9kYmcoJmFkZXYtPmRldiwgImRlc2lnbmVyIElEID0gMHglMDJ4XG4iLCBsZGF0YS0+aHdfZGVzaWduZXIpOworCWRldl9kYmcoJmFkZXYtPmRldiwgInJldmlzaW9uID0gMHglMDF4XG4iLCBsZGF0YS0+aHdfcmV2aXNpb24pOworCisJZGF0YSA9IHJlYWRsKGxkYXRhLT5iYXNlICsgUlRDX0NSKTsKKwkvKiBFbmFibGUgdGhlIGNsb2Nrd2F0Y2ggb24gU1QgVmFyaWFudHMgKi8KKwlpZiAobGRhdGEtPmh3X2Rlc2lnbmVyID09IEFNQkFfVkVORE9SX1NUKQorCQlkYXRhIHw9IFJUQ19DUl9DV0VOOworCWVsc2UKKwkJZGF0YSB8PSBSVENfQ1JfRU47CisJd3JpdGVsKGRhdGEsIGxkYXRhLT5iYXNlICsgUlRDX0NSKTsKKworCS8qCisJICogT24gU1QgUEwwMzEgdmFyaWFudHMsIHRoZSBSVEMgcmVzZXQgdmFsdWUgZG9lcyBub3QgcHJvdmlkZSBjb3JyZWN0CisJICogd2Vla2RheSBmb3IgMjAwMC0wMS0wMS4gQ29ycmVjdCB0aGUgZXJyb25lb3VzIHN1bmRheSB0byBzYXR1cmRheS4KKwkgKi8KKwlpZiAobGRhdGEtPmh3X2Rlc2lnbmVyID09IEFNQkFfVkVORE9SX1NUKSB7CisJCWlmIChyZWFkbChsZGF0YS0+YmFzZSArIFJUQ19ZRFIpID09IDB4MjAwMCkgeworCQkJdGltZSA9IHJlYWRsKGxkYXRhLT5iYXNlICsgUlRDX0RSKTsKKwkJCWlmICgodGltZSAmCisJCQkgICAgIChSVENfTU9OX01BU0sgfCBSVENfTURBWV9NQVNLIHwgUlRDX1dEQVlfTUFTSykpCisJCQkgICAgPT0gMHgwMjEyMDAwMCkgeworCQkJCXRpbWUgPSB0aW1lIHwgKDB4NyA8PCBSVENfV0RBWV9TSElGVCk7CisJCQkJd3JpdGVsKDB4MjAwMCwgbGRhdGEtPmJhc2UgKyBSVENfWUxSKTsKKwkJCQl3cml0ZWwodGltZSwgbGRhdGEtPmJhc2UgKyBSVENfTFIpOworCQkJfQorCQl9CisJfQorCisJbGRhdGEtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInBsMDMxIiwgJmFkZXYtPmRldiwgb3BzLAorCQkJCQlUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihsZGF0YS0+cnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKGxkYXRhLT5ydGMpOworCQlnb3RvIG91dF9ub19ydGM7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGFkZXYtPmlycVswXSwgcGwwMzFfaW50ZXJydXB0LAorCQkJMCwgInJ0Yy1wbDAzMSIsIGxkYXRhKSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9ub19pcnE7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9ub19pcnE6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGxkYXRhLT5ydGMpOworb3V0X25vX3J0YzoKKwlpb3VubWFwKGxkYXRhLT5iYXNlKTsKKwlhbWJhX3NldF9kcnZkYXRhKGFkZXYsIE5VTEwpOworb3V0X25vX3JlbWFwOgorCWtmcmVlKGxkYXRhKTsKK291dDoKKwlhbWJhX3JlbGVhc2VfcmVnaW9ucyhhZGV2KTsKK2Vycl9yZXE6CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBPcGVyYXRpb25zIGZvciB0aGUgb3JpZ2luYWwgQVJNIHZlcnNpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhcm1fcGwwMzFfb3BzID0geworCS5yZWFkX3RpbWUgPSBwbDAzMV9yZWFkX3RpbWUsCisJLnNldF90aW1lID0gcGwwMzFfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBwbDAzMV9yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBwbDAzMV9zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBwbDAzMV9hbGFybV9pcnFfZW5hYmxlLAorfTsKKworLyogVGhlIEZpcnN0IFNUIGRlcml2YXRpdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzdHYxX3BsMDMxX29wcyA9IHsKKwkucmVhZF90aW1lID0gcGwwMzFfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IHBsMDMxX3NldF90aW1lLAorCS5yZWFkX2FsYXJtID0gcGwwMzFfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gcGwwMzFfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gcGwwMzFfYWxhcm1faXJxX2VuYWJsZSwKK307CisKKy8qIEFuZCB0aGUgc2Vjb25kIFNUIGRlcml2YXRpdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzdHYyX3BsMDMxX29wcyA9IHsKKwkucmVhZF90aW1lID0gcGwwMzFfc3R2Ml9yZWFkX3RpbWUsCisJLnNldF90aW1lID0gcGwwMzFfc3R2Ml9zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IHBsMDMxX3N0djJfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gcGwwMzFfc3R2Ml9zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBwbDAzMV9hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2lkIHBsMDMxX2lkc1tdID0geworCXsKKwkJLmlkID0gMHgwMDA0MTAzMSwKKwkJLm1hc2sgPSAweDAwMGZmZmZmLAorCQkuZGF0YSA9ICZhcm1fcGwwMzFfb3BzLAorCX0sCisJLyogU1QgTWljcm8gdmFyaWFudHMgKi8KKwl7CisJCS5pZCA9IDB4MDAxODAwMzEsCisJCS5tYXNrID0gMHgwMGZmZmZmZiwKKwkJLmRhdGEgPSAmc3R2MV9wbDAzMV9vcHMsCisJfSwKKwl7CisJCS5pZCA9IDB4MDAyODAwMzEsCisJCS5tYXNrID0gMHgwMGZmZmZmZiwKKwkJLmRhdGEgPSAmc3R2Ml9wbDAzMV9vcHMsCisJfSwKKwl7MCwgMH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGFtYmEsIHBsMDMxX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kcml2ZXIgcGwwMzFfZHJpdmVyID0geworCS5kcnYgPSB7CisJCS5uYW1lID0gInJ0Yy1wbDAzMSIsCisJfSwKKwkuaWRfdGFibGUgPSBwbDAzMV9pZHMsCisJLnByb2JlID0gcGwwMzFfcHJvYmUsCisJLnJlbW92ZSA9IHBsMDMxX3JlbW92ZSwKK307CisKK21vZHVsZV9hbWJhX2RyaXZlcihwbDAzMV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJEZWVwYWsgU2F4ZW5hIDxkc2F4ZW5hQHBsZXhpdHkubmV0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFSTSBBTUJBIFBMMDMxIFJUQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wbTh4eHguYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wbTh4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBiZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBtOHh4eC5jCkBAIC0wLDAgKzEsNTQwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvcG04eHh4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvcG04eHh4L3J0Yy5oPgorCisKKy8qIFJUQyBSZWdpc3RlciBvZmZzZXRzIGZyb20gUlRDIENUUkwgUkVHICovCisjZGVmaW5lIFBNOFhYWF9BTEFSTV9DVFJMX09GRlNFVAkweDAxCisjZGVmaW5lIFBNOFhYWF9SVENfV1JJVEVfT0ZGU0VUCQkweDAyCisjZGVmaW5lIFBNOFhYWF9SVENfUkVBRF9PRkZTRVQJCTB4MDYKKyNkZWZpbmUgUE04WFhYX0FMQVJNX1JXX09GRlNFVAkJMHgwQQorCisvKiBSVENfQ1RSTCByZWdpc3RlciBiaXQgZmllbGRzICovCisjZGVmaW5lIFBNOHh4eF9SVENfRU5BQkxFCQlCSVQoNykKKyNkZWZpbmUgUE04eHh4X1JUQ19BTEFSTV9FTkFCTEUJCUJJVCgxKQorI2RlZmluZSBQTTh4eHhfUlRDX0FMQVJNX0NMRUFSCQlCSVQoMCkKKworI2RlZmluZSBOVU1fOF9CSVRfUlRDX1JFR1MJCTB4NAorCisvKioKKyAqIHN0cnVjdCBwbTh4eHhfcnRjIC0gIHJ0YyBkcml2ZXIgaW50ZXJuYWwgc3RydWN0dXJlCisgKiBAcnRjOgkJcnRjIGRldmljZSBmb3IgdGhpcyBkcml2ZXIuCisgKiBAcnRjX2FsYXJtX2lycToJcnRjIGFsYXJtIGlycSBudW1iZXIuCisgKiBAcnRjX2Jhc2U6CQlhZGRyZXNzIG9mIHJ0YyBjb250cm9sIHJlZ2lzdGVyLgorICogQHJ0Y19yZWFkX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiByZWFkIHJlZ2lzdGVycy4KKyAqIEBydGNfd3JpdGVfYmFzZToJYmFzZSBhZGRyZXNzIG9mIHdyaXRlIHJlZ2lzdGVycy4KKyAqIEBhbGFybV9yd19iYXNlOgliYXNlIGFkZHJlc3Mgb2YgYWxhcm0gcmVnaXN0ZXJzLgorICogQGN0cmxfcmVnOgkJcnRjIGNvbnRyb2wgcmVnaXN0ZXIuCisgKiBAcnRjX2RldjoJCWRldmljZSBzdHJ1Y3R1cmUuCisgKiBAY3RybF9yZWdfbG9jazoJc3BpbmxvY2sgcHJvdGVjdGluZyBhY2Nlc3MgdG8gY3RybF9yZWcuCisgKi8KK3N0cnVjdCBwbTh4eHhfcnRjIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWludCBydGNfYWxhcm1faXJxOworCWludCBydGNfYmFzZTsKKwlpbnQgcnRjX3JlYWRfYmFzZTsKKwlpbnQgcnRjX3dyaXRlX2Jhc2U7CisJaW50IGFsYXJtX3J3X2Jhc2U7CisJdTggIGN0cmxfcmVnOworCXN0cnVjdCBkZXZpY2UgKnJ0Y19kZXY7CisJc3BpbmxvY2tfdCBjdHJsX3JlZ19sb2NrOworfTsKKworLyoKKyAqIFRoZSBSVEMgcmVnaXN0ZXJzIG5lZWQgdG8gYmUgcmVhZC93cml0dGVuIG9uZSBieXRlIGF0IGEgdGltZS4gVGhpcyBpcyBhCisgKiBoYXJkd2FyZSBsaW1pdGF0aW9uLgorICovCitzdGF0aWMgaW50IHBtOHh4eF9yZWFkX3dyYXBwZXIoc3RydWN0IHBtOHh4eF9ydGMgKnJ0Y19kZCwgdTggKnJ0Y192YWwsCisJCWludCBiYXNlLCBpbnQgY291bnQpCit7CisJaW50IGksIHJjOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IHJ0Y19kZC0+cnRjX2Rldi0+cGFyZW50OworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmMgPSBwbTh4eHhfcmVhZGIocGFyZW50LCBiYXNlICsgaSwgJnJ0Y192YWxbaV0pOworCQlpZiAocmMgPCAwKSB7CisJCQlkZXZfZXJyKHJ0Y19kZC0+cnRjX2RldiwgIlBNSUMgcmVhZCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG04eHh4X3dyaXRlX3dyYXBwZXIoc3RydWN0IHBtOHh4eF9ydGMgKnJ0Y19kZCwgdTggKnJ0Y192YWwsCisJCWludCBiYXNlLCBpbnQgY291bnQpCit7CisJaW50IGksIHJjOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IHJ0Y19kZC0+cnRjX2Rldi0+cGFyZW50OworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmMgPSBwbTh4eHhfd3JpdGViKHBhcmVudCwgYmFzZSArIGksIHJ0Y192YWxbaV0pOworCQlpZiAocmMgPCAwKSB7CisJCQlkZXZfZXJyKHJ0Y19kZC0+cnRjX2RldiwgIlBNSUMgd3JpdGUgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgorICogU3RlcHMgdG8gd3JpdGUgdGhlIFJUQyByZWdpc3RlcnMuCisgKiAxLiBEaXNhYmxlIGFsYXJtIGlmIGVuYWJsZWQuCisgKiAyLiBXcml0ZSAweDAwIHRvIExTQi4KKyAqIDMuIFdyaXRlIEJ5dGVbMV0sIEJ5dGVbMl0sIEJ5dGVbM10gdGhlbiBCeXRlWzBdLgorICogNC4gRW5hYmxlIGFsYXJtIGlmIGRpc2FibGVkIGluIHN0ZXAgMS4KKyAqLworc3RhdGljIGludCBwbTh4eHhfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlpbnQgcmMsIGk7CisJdW5zaWduZWQgbG9uZyBzZWNzLCBpcnFfZmxhZ3M7CisJdTggdmFsdWVbTlVNXzhfQklUX1JUQ19SRUdTXSwgcmVnID0gMCwgYWxhcm1fZW5hYmxlZCA9IDAsIGN0cmxfcmVnOworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y190bV90b190aW1lKHRtLCAmc2Vjcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNXzhfQklUX1JUQ19SRUdTOyBpKyspIHsKKwkJdmFsdWVbaV0gPSBzZWNzICYgMHhGRjsKKwkJc2VjcyA+Pj0gODsKKwl9CisKKwlkZXZfZGJnKGRldiwgIlNlY29uZHMgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byBSVEMgPSAlbHVcbiIsIHNlY3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19kZC0+Y3RybF9yZWdfbG9jaywgaXJxX2ZsYWdzKTsKKwljdHJsX3JlZyA9IHJ0Y19kZC0+Y3RybF9yZWc7CisKKwlpZiAoY3RybF9yZWcgJiBQTTh4eHhfUlRDX0FMQVJNX0VOQUJMRSkgeworCQlhbGFybV9lbmFibGVkID0gMTsKKwkJY3RybF9yZWcgJj0gflBNOHh4eF9SVENfQUxBUk1fRU5BQkxFOworCQlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlLAorCQkJCTEpOworCQlpZiAocmMgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIldyaXRlIHRvIFJUQyBjb250cm9sIHJlZ2lzdGVyICIKKwkJCQkJCQkJImZhaWxlZFxuIik7CisJCQlnb3RvIHJ0Y19yd19mYWlsOworCQl9CisJCXJ0Y19kZC0+Y3RybF9yZWcgPSBjdHJsX3JlZzsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2RkLT5jdHJsX3JlZ19sb2NrLCBpcnFfZmxhZ3MpOworCisJLyogV3JpdGUgMCB0byBCeXRlWzBdICovCisJcmVnID0gMDsKKwlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgJnJlZywgcnRjX2RkLT5ydGNfd3JpdGVfYmFzZSwgMSk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIldyaXRlIHRvIFJUQyB3cml0ZSBkYXRhIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCWdvdG8gcnRjX3J3X2ZhaWw7CisJfQorCisJLyogV3JpdGUgQnl0ZVsxXSwgQnl0ZVsyXSwgQnl0ZVszXSAqLworCXJjID0gcG04eHh4X3dyaXRlX3dyYXBwZXIocnRjX2RkLCB2YWx1ZSArIDEsCisJCQkJCXJ0Y19kZC0+cnRjX3dyaXRlX2Jhc2UgKyAxLCAzKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiV3JpdGUgdG8gUlRDIHdyaXRlIGRhdGEgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBydGNfcndfZmFpbDsKKwl9CisKKwkvKiBXcml0ZSBCeXRlWzBdICovCisJcmMgPSBwbTh4eHhfd3JpdGVfd3JhcHBlcihydGNfZGQsIHZhbHVlLCBydGNfZGQtPnJ0Y193cml0ZV9iYXNlLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiV3JpdGUgdG8gUlRDIHdyaXRlIGRhdGEgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBydGNfcndfZmFpbDsKKwl9CisKKwlpZiAoYWxhcm1fZW5hYmxlZCkgeworCQljdHJsX3JlZyB8PSBQTTh4eHhfUlRDX0FMQVJNX0VOQUJMRTsKKwkJcmMgPSBwbTh4eHhfd3JpdGVfd3JhcHBlcihydGNfZGQsICZjdHJsX3JlZywgcnRjX2RkLT5ydGNfYmFzZSwKKwkJCQkJCQkJCTEpOworCQlpZiAocmMgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIldyaXRlIHRvIFJUQyBjb250cm9sIHJlZ2lzdGVyICIKKwkJCQkJCQkJImZhaWxlZFxuIik7CisJCQlnb3RvIHJ0Y19yd19mYWlsOworCQl9CisJCXJ0Y19kZC0+Y3RybF9yZWcgPSBjdHJsX3JlZzsKKwl9CisKK3J0Y19yd19mYWlsOgorCWlmIChhbGFybV9lbmFibGVkKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfZGQtPmN0cmxfcmVnX2xvY2ssIGlycV9mbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcG04eHh4X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWludCByYzsKKwl1OCB2YWx1ZVtOVU1fOF9CSVRfUlRDX1JFR1NdLCByZWc7CisJdW5zaWduZWQgbG9uZyBzZWNzOworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJjID0gcG04eHh4X3JlYWRfd3JhcHBlcihydGNfZGQsIHZhbHVlLCBydGNfZGQtPnJ0Y19yZWFkX2Jhc2UsCisJCQkJCQkJTlVNXzhfQklUX1JUQ19SRUdTKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUlRDIHJlYWQgZGF0YSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiBSZWFkIHRoZSBMU0IgYWdhaW4gYW5kIGNoZWNrIGlmIHRoZXJlIGhhcyBiZWVuIGEgY2Fycnkgb3Zlci4KKwkgKiBJZiB0aGVyZSBpcywgcmVkbyB0aGUgcmVhZCBvcGVyYXRpb24uCisJICovCisJcmMgPSBwbTh4eHhfcmVhZF93cmFwcGVyKHJ0Y19kZCwgJnJlZywgcnRjX2RkLT5ydGNfcmVhZF9iYXNlLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUlRDIHJlYWQgZGF0YSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHVubGlrZWx5KHJlZyA8IHZhbHVlWzBdKSkgeworCQlyYyA9IHBtOHh4eF9yZWFkX3dyYXBwZXIocnRjX2RkLCB2YWx1ZSwKKwkJCQlydGNfZGQtPnJ0Y19yZWFkX2Jhc2UsIE5VTV84X0JJVF9SVENfUkVHUyk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiUlRDIHJlYWQgZGF0YSByZWdpc3RlciBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJc2VjcyA9IHZhbHVlWzBdIHwgKHZhbHVlWzFdIDw8IDgpIHwgKHZhbHVlWzJdIDw8IDE2KSB8ICh2YWx1ZVszXSA8PCAyNCk7CisKKwlydGNfdGltZV90b190bShzZWNzLCB0bSk7CisKKwlyYyA9IHJ0Y192YWxpZF90bSh0bSk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgdGltZSByZWFkIGZyb20gUlRDXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWRldl9kYmcoZGV2LCAic2VjcyA9ICVsdSwgaDptOnMgPT0gJWQ6JWQ6JWQsIGQvbS95ID0gJWQvJWQvJWRcbiIsCisJCQkJc2VjcywgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMsCisJCQkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtOHh4eF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCWludCByYywgaTsKKwl1OCB2YWx1ZVtOVU1fOF9CSVRfUlRDX1JFR1NdLCBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNlY3MsIGlycV9mbGFnczsKKwlzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlydGNfdG1fdG9fdGltZSgmYWxhcm0tPnRpbWUsICZzZWNzKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fOF9CSVRfUlRDX1JFR1M7IGkrKykgeworCQl2YWx1ZVtpXSA9IHNlY3MgJiAweEZGOworCQlzZWNzID4+PSA4OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfZGQtPmN0cmxfcmVnX2xvY2ssIGlycV9mbGFncyk7CisKKwlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgdmFsdWUsIHJ0Y19kZC0+YWxhcm1fcndfYmFzZSwKKwkJCQkJCQlOVU1fOF9CSVRfUlRDX1JFR1MpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJXcml0ZSB0byBSVEMgQUxBUk0gcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBydGNfcndfZmFpbDsKKwl9CisKKwljdHJsX3JlZyA9IHJ0Y19kZC0+Y3RybF9yZWc7CisJY3RybF9yZWcgPSBhbGFybS0+ZW5hYmxlZCA/IChjdHJsX3JlZyB8IFBNOHh4eF9SVENfQUxBUk1fRU5BQkxFKSA6CisJCQkJCShjdHJsX3JlZyAmIH5QTTh4eHhfUlRDX0FMQVJNX0VOQUJMRSk7CisKKwlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiV3JpdGUgdG8gUlRDIGNvbnRyb2wgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBydGNfcndfZmFpbDsKKwl9CisKKwlydGNfZGQtPmN0cmxfcmVnID0gY3RybF9yZWc7CisKKwlkZXZfZGJnKGRldiwgIkFsYXJtIFNldCBmb3IgaDpyOnM9JWQ6JWQ6JWQsIGQvbS95PSVkLyVkLyVkXG4iLAorCQkJCWFsYXJtLT50aW1lLnRtX2hvdXIsIGFsYXJtLT50aW1lLnRtX21pbiwKKwkJCQlhbGFybS0+dGltZS50bV9zZWMsIGFsYXJtLT50aW1lLnRtX21kYXksCisJCQkJYWxhcm0tPnRpbWUudG1fbW9uLCBhbGFybS0+dGltZS50bV95ZWFyKTsKK3J0Y19yd19mYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19kZC0+Y3RybF9yZWdfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcG04eHh4X3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCWludCByYzsKKwl1OCB2YWx1ZVtOVU1fOF9CSVRfUlRDX1JFR1NdOworCXVuc2lnbmVkIGxvbmcgc2VjczsKKwlzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyYyA9IHBtOHh4eF9yZWFkX3dyYXBwZXIocnRjX2RkLCB2YWx1ZSwgcnRjX2RkLT5hbGFybV9yd19iYXNlLAorCQkJTlVNXzhfQklUX1JUQ19SRUdTKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUlRDIGFsYXJtIHRpbWUgcmVhZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJc2VjcyA9IHZhbHVlWzBdIHwgKHZhbHVlWzFdIDw8IDgpIHwgKHZhbHVlWzJdIDw8IDE2KSB8ICh2YWx1ZVszXSA8PCAyNCk7CisKKwlydGNfdGltZV90b190bShzZWNzLCAmYWxhcm0tPnRpbWUpOworCisJcmMgPSBydGNfdmFsaWRfdG0oJmFsYXJtLT50aW1lKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBhbGFybSB0aW1lIHJlYWQgZnJvbSBSVENcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZGV2X2RiZyhkZXYsICJBbGFybSBzZXQgZm9yIC0gaDpyOnM9JWQ6JWQ6JWQsIGQvbS95PSVkLyVkLyVkXG4iLAorCQkJCWFsYXJtLT50aW1lLnRtX2hvdXIsIGFsYXJtLT50aW1lLnRtX21pbiwKKwkJCQlhbGFybS0+dGltZS50bV9zZWMsIGFsYXJtLT50aW1lLnRtX21kYXksCisJCQkJYWxhcm0tPnRpbWUudG1fbW9uLCBhbGFybS0+dGltZS50bV95ZWFyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtOHh4eF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGUpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCBjdHJsX3JlZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfZGQtPmN0cmxfcmVnX2xvY2ssIGlycV9mbGFncyk7CisJY3RybF9yZWcgPSBydGNfZGQtPmN0cmxfcmVnOworCWN0cmxfcmVnID0gKGVuYWJsZSkgPyAoY3RybF9yZWcgfCBQTTh4eHhfUlRDX0FMQVJNX0VOQUJMRSkgOgorCQkJCShjdHJsX3JlZyAmIH5QTTh4eHhfUlRDX0FMQVJNX0VOQUJMRSk7CisKKwlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiV3JpdGUgdG8gUlRDIGNvbnRyb2wgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBydGNfcndfZmFpbDsKKwl9CisKKwlydGNfZGQtPmN0cmxfcmVnID0gY3RybF9yZWc7CisKK3J0Y19yd19mYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19kZC0+Y3RybF9yZWdfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBwbTh4eHhfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gcG04eHh4X3J0Y19yZWFkX3RpbWUsCisJLnNldF9hbGFybQk9IHBtOHh4eF9ydGNfc2V0X2FsYXJtLAorCS5yZWFkX2FsYXJtCT0gcG04eHh4X3J0Y19yZWFkX2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gcG04eHh4X3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGlycXJldHVybl90IHBtOHh4eF9hbGFybV90cmlnZ2VyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkID0gZGV2X2lkOworCXU4IGN0cmxfcmVnOworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXJ0Y191cGRhdGVfaXJxKHJ0Y19kZC0+cnRjLCAxLCBSVENfSVJRRiB8IFJUQ19BRik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2RkLT5jdHJsX3JlZ19sb2NrLCBpcnFfZmxhZ3MpOworCisJLyogQ2xlYXIgdGhlIGFsYXJtIGVuYWJsZSBiaXQgKi8KKwljdHJsX3JlZyA9IHJ0Y19kZC0+Y3RybF9yZWc7CisJY3RybF9yZWcgJj0gflBNOHh4eF9SVENfQUxBUk1fRU5BQkxFOworCisJcmMgPSBwbTh4eHhfd3JpdGVfd3JhcHBlcihydGNfZGQsICZjdHJsX3JlZywgcnRjX2RkLT5ydGNfYmFzZSwgMSk7CisJaWYgKHJjIDwgMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfZGQtPmN0cmxfcmVnX2xvY2ssIGlycV9mbGFncyk7CisJCWRldl9lcnIocnRjX2RkLT5ydGNfZGV2LCAiV3JpdGUgdG8gUlRDIGNvbnRyb2wgcmVnaXN0ZXIgIgorCQkJCQkJCQkiZmFpbGVkXG4iKTsKKwkJZ290byBydGNfYWxhcm1faGFuZGxlZDsKKwl9CisKKwlydGNfZGQtPmN0cmxfcmVnID0gY3RybF9yZWc7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2RkLT5jdHJsX3JlZ19sb2NrLCBpcnFfZmxhZ3MpOworCisJLyogQ2xlYXIgUlRDIGFsYXJtIHJlZ2lzdGVyICovCisJcmMgPSBwbTh4eHhfcmVhZF93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlICsKKwkJCQkJCVBNOFhYWF9BTEFSTV9DVFJMX09GRlNFVCwgMSk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKHJ0Y19kZC0+cnRjX2RldiwgIlJUQyBBbGFybSBjb250cm9sIHJlZ2lzdGVyIHJlYWQgIgorCQkJCQkJCQkiZmFpbGVkXG4iKTsKKwkJZ290byBydGNfYWxhcm1faGFuZGxlZDsKKwl9CisKKwljdHJsX3JlZyAmPSB+UE04eHh4X1JUQ19BTEFSTV9DTEVBUjsKKwlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlICsKKwkJCQkJCVBNOFhYWF9BTEFSTV9DVFJMX09GRlNFVCwgMSk7CisJaWYgKHJjIDwgMCkKKwkJZGV2X2VycihydGNfZGQtPnJ0Y19kZXYsICJXcml0ZSB0byBSVEMgQWxhcm0gY29udHJvbCByZWdpc3RlciIKKwkJCQkJCQkJIiBmYWlsZWRcbiIpOworCitydGNfYWxhcm1faGFuZGxlZDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBtOHh4eF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmM7CisJdTggY3RybF9yZWc7CisJYm9vbCBydGNfd3JpdGVfZW5hYmxlID0gZmFsc2U7CisJc3RydWN0IHBtOHh4eF9ydGMgKnJ0Y19kZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJ0Y19yZXNvdXJjZTsKKwljb25zdCBzdHJ1Y3QgcG04eHh4X3J0Y19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCQkJCQlkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCisJaWYgKHBkYXRhICE9IE5VTEwpCisJCXJ0Y193cml0ZV9lbmFibGUgPSBwZGF0YS0+cnRjX3dyaXRlX2VuYWJsZTsKKworCXJ0Y19kZCA9IGt6YWxsb2Moc2l6ZW9mKCpydGNfZGQpLCBHRlBfS0VSTkVMKTsKKwlpZiAocnRjX2RkID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBJbml0aWFsaXNlIHNwaW5sb2NrIHRvIHByb3RlY3QgUlRDIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlzcGluX2xvY2tfaW5pdCgmcnRjX2RkLT5jdHJsX3JlZ19sb2NrKTsKKworCXJ0Y19kZC0+cnRjX2FsYXJtX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHJ0Y19kZC0+cnRjX2FsYXJtX2lycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQWxhcm0gSVJRIHJlc291cmNlIGFic2VudCFcbiIpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBmYWlsX3J0Y19lbmFibGU7CisJfQorCisJcnRjX3Jlc291cmNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0lPLAorCQkJCQkJCSJwbWljX3J0Y19iYXNlIik7CisJaWYgKCEocnRjX3Jlc291cmNlICYmIHJ0Y19yZXNvdXJjZS0+c3RhcnQpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJUQyBJTyByZXNvdXJjZSBhYnNlbnQhXG4iKTsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gZmFpbF9ydGNfZW5hYmxlOworCX0KKworCXJ0Y19kZC0+cnRjX2Jhc2UgPSBydGNfcmVzb3VyY2UtPnN0YXJ0OworCisJLyogU2V0dXAgUlRDIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworCXJ0Y19kZC0+cnRjX3dyaXRlX2Jhc2UgPSBydGNfZGQtPnJ0Y19iYXNlICsgUE04WFhYX1JUQ19XUklURV9PRkZTRVQ7CisJcnRjX2RkLT5ydGNfcmVhZF9iYXNlID0gcnRjX2RkLT5ydGNfYmFzZSArIFBNOFhYWF9SVENfUkVBRF9PRkZTRVQ7CisJcnRjX2RkLT5hbGFybV9yd19iYXNlID0gcnRjX2RkLT5ydGNfYmFzZSArIFBNOFhYWF9BTEFSTV9SV19PRkZTRVQ7CisKKwlydGNfZGQtPnJ0Y19kZXYgPSAmcGRldi0+ZGV2OworCisJLyogQ2hlY2sgaWYgdGhlIFJUQyBpcyBvbiwgZWxzZSB0dXJuIGl0IG9uICovCisJcmMgPSBwbTh4eHhfcmVhZF93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJUQyBjb250cm9sIHJlZ2lzdGVyIHJlYWQgZmFpbGVkIVxuIik7CisJCWdvdG8gZmFpbF9ydGNfZW5hYmxlOworCX0KKworCWlmICghKGN0cmxfcmVnICYgUE04eHh4X1JUQ19FTkFCTEUpKSB7CisJCWN0cmxfcmVnIHw9IFBNOHh4eF9SVENfRU5BQkxFOworCQlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlLAorCQkJCQkJCQkJMSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIldyaXRlIHRvIFJUQyBjb250cm9sIHJlZ2lzdGVyICIKKwkJCQkJCQkJImZhaWxlZFxuIik7CisJCQlnb3RvIGZhaWxfcnRjX2VuYWJsZTsKKwkJfQorCX0KKworCXJ0Y19kZC0+Y3RybF9yZWcgPSBjdHJsX3JlZzsKKwlpZiAocnRjX3dyaXRlX2VuYWJsZSA9PSB0cnVlKQorCQlwbTh4eHhfcnRjX29wcy5zZXRfdGltZSA9IHBtOHh4eF9ydGNfc2V0X3RpbWU7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGNfZGQpOworCisJLyogUmVnaXN0ZXIgdGhlIFJUQyBkZXZpY2UgKi8KKwlydGNfZGQtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInBtOHh4eF9ydGMiLCAmcGRldi0+ZGV2LAorCQkJCSZwbTh4eHhfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjX2RkLT5ydGMpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBSVEMgcmVnaXN0cmF0aW9uIGZhaWxlZCAoJWxkKVxuIiwKKwkJCQkJX19mdW5jX18sIFBUUl9FUlIocnRjX2RkLT5ydGMpKTsKKwkJcmMgPSBQVFJfRVJSKHJ0Y19kZC0+cnRjKTsKKwkJZ290byBmYWlsX3J0Y19lbmFibGU7CisJfQorCisJLyogUmVxdWVzdCB0aGUgYWxhcm0gSVJRICovCisJcmMgPSByZXF1ZXN0X2FueV9jb250ZXh0X2lycShydGNfZGQtPnJ0Y19hbGFybV9pcnEsCisJCQkJIHBtOHh4eF9hbGFybV90cmlnZ2VyLCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSAicG04eHh4X3J0Y19hbGFybSIsIHJ0Y19kZCk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJSZXF1ZXN0IElSUSBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlnb3RvIGZhaWxfcmVxX2lycTsKKwl9CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iZSBzdWNjZXNzICEhXG4iKTsKKworCXJldHVybiAwOworCitmYWlsX3JlcV9pcnE6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Y19kZC0+cnRjKTsKK2ZhaWxfcnRjX2VuYWJsZToKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShydGNfZGQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcG04eHh4X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CisJZnJlZV9pcnEocnRjX2RkLT5ydGNfYWxhcm1faXJxLCBydGNfZGQpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGNfZGQtPnJ0Yyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUocnRjX2RkKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHBtOHh4eF9ydGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShydGNfZGQtPnJ0Y19hbGFybV9pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG04eHh4X3J0Y19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKHJ0Y19kZC0+cnRjX2FsYXJtX2lycSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocG04eHh4X3J0Y19wbV9vcHMsIHBtOHh4eF9ydGNfc3VzcGVuZCwgcG04eHh4X3J0Y19yZXN1bWUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbTh4eHhfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcG04eHh4X3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBtOHh4eF9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9IFBNOFhYWF9SVENfREVWX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmcG04eHh4X3J0Y19wbV9vcHMsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocG04eHh4X3J0Y19kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1wbTh4eHgiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUE1JQzh4eHggUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiQW5pcnVkaCBHaGF5YWwgPGFnaGF5YWxAY29kZWF1cm9yYS5vcmc+Iik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcHJvYy5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTU5ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXByb2MuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIFJUQyBzdWJzeXN0ZW0sIHByb2MgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTA2IFRvd2VyIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4KKyAqCisgKiBiYXNlZCBvbiBhcmNoL2FybS9jb21tb24vcnRjdGltZS5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgInJ0Yy1jb3JlLmgiCisKKworc3RhdGljIGludCBydGNfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gc2VxLT5wcml2YXRlOworCWNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzICpvcHMgPSBydGMtPm9wczsKKwlzdHJ1Y3QgcnRjX3drYWxybSBhbHJtOworCXN0cnVjdCBydGNfdGltZSB0bTsKKworCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCWlmIChlcnIgPT0gMCkgeworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSJydGNfdGltZVx0OiAlMDJkOiUwMmQ6JTAyZFxuIgorCQkJInJ0Y19kYXRlXHQ6ICUwNGQtJTAyZC0lMDJkXG4iLAorCQkJdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMsCisJCQl0bS50bV95ZWFyICsgMTkwMCwgdG0udG1fbW9uICsgMSwgdG0udG1fbWRheSk7CisJfQorCisJZXJyID0gcnRjX3JlYWRfYWxhcm0ocnRjLCAmYWxybSk7CisJaWYgKGVyciA9PSAwKSB7CisJCXNlcV9wcmludGYoc2VxLCAiYWxybV90aW1lXHQ6ICIpOworCQlpZiAoKHVuc2lnbmVkIGludClhbHJtLnRpbWUudG1faG91ciA8PSAyNCkKKwkJCXNlcV9wcmludGYoc2VxLCAiJTAyZDoiLCBhbHJtLnRpbWUudG1faG91cik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiKio6Iik7CisJCWlmICgodW5zaWduZWQgaW50KWFscm0udGltZS50bV9taW4gPD0gNTkpCisJCQlzZXFfcHJpbnRmKHNlcSwgIiUwMmQ6IiwgYWxybS50aW1lLnRtX21pbik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiKio6Iik7CisJCWlmICgodW5zaWduZWQgaW50KWFscm0udGltZS50bV9zZWMgPD0gNTkpCisJCQlzZXFfcHJpbnRmKHNlcSwgIiUwMmRcbiIsIGFscm0udGltZS50bV9zZWMpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIioqXG4iKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgImFscm1fZGF0ZVx0OiAiKTsKKwkJaWYgKCh1bnNpZ25lZCBpbnQpYWxybS50aW1lLnRtX3llYXIgPD0gMjAwKQorCQkJc2VxX3ByaW50ZihzZXEsICIlMDRkLSIsIGFscm0udGltZS50bV95ZWFyICsgMTkwMCk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiKioqKi0iKTsKKwkJaWYgKCh1bnNpZ25lZCBpbnQpYWxybS50aW1lLnRtX21vbiA8PSAxMSkKKwkJCXNlcV9wcmludGYoc2VxLCAiJTAyZC0iLCBhbHJtLnRpbWUudG1fbW9uICsgMSk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiKiotIik7CisJCWlmIChhbHJtLnRpbWUudG1fbWRheSAmJiAodW5zaWduZWQgaW50KWFscm0udGltZS50bV9tZGF5IDw9IDMxKQorCQkJc2VxX3ByaW50ZihzZXEsICIlMDJkXG4iLCBhbHJtLnRpbWUudG1fbWRheSk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiKipcbiIpOworCQlzZXFfcHJpbnRmKHNlcSwgImFsYXJtX0lSUVx0OiAlc1xuIiwKKwkJCQlhbHJtLmVuYWJsZWQgPyAieWVzIiA6ICJubyIpOworCQlzZXFfcHJpbnRmKHNlcSwgImFscm1fcGVuZGluZ1x0OiAlc1xuIiwKKwkJCQlhbHJtLnBlbmRpbmcgPyAieWVzIiA6ICJubyIpOworCQlzZXFfcHJpbnRmKHNlcSwgInVwZGF0ZSBJUlEgZW5hYmxlZFx0OiAlc1xuIiwKKwkJCShydGMtPnVpZV9ydGN0aW1lci5lbmFibGVkKSA/ICJ5ZXMiIDogIm5vIik7CisJCXNlcV9wcmludGYoc2VxLCAicGVyaW9kaWMgSVJRIGVuYWJsZWRcdDogJXNcbiIsCisJCQkocnRjLT5waWVfZW5hYmxlZCkgPyAieWVzIiA6ICJubyIpOworCQlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljIElSUSBmcmVxdWVuY3lcdDogJWRcbiIsCisJCQlydGMtPmlycV9mcmVxKTsKKwkJc2VxX3ByaW50ZihzZXEsICJtYXggdXNlciBJUlEgZnJlcXVlbmN5XHQ6ICVkXG4iLAorCQkJcnRjLT5tYXhfdXNlcl9mcmVxKTsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIjI0aHJcdFx0OiB5ZXNcbiIpOworCisJaWYgKG9wcy0+cHJvYykKKwkJb3BzLT5wcm9jKHJ0Yy0+ZGV2LnBhcmVudCwgc2VxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gUERFKGlub2RlKS0+ZGF0YTsKKworCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IHNpbmdsZV9vcGVuKGZpbGUsIHJ0Y19wcm9jX3Nob3csIHJ0Yyk7CisJaWYgKHJldCkKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydGNfcHJvY19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByZXMgPSBzaW5nbGVfcmVsZWFzZShpbm9kZSwgZmlsZSk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX3Byb2NfZm9wcyA9IHsKKwkub3BlbgkJPSBydGNfcHJvY19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gcnRjX3Byb2NfcmVsZWFzZSwKK307CisKK3ZvaWQgcnRjX3Byb2NfYWRkX2RldmljZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQoreworCWlmIChydGMtPmlkID09IDApCisJCXByb2NfY3JlYXRlX2RhdGEoImRyaXZlci9ydGMiLCAwLCBOVUxMLCAmcnRjX3Byb2NfZm9wcywgcnRjKTsKK30KKwordm9pZCBydGNfcHJvY19kZWxfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7CisJaWYgKHJ0Yy0+aWQgPT0gMCkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9ydGMiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wczMuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wczMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjgxMzNjCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXBzMy5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogUFMzIFJUQyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBTb255IENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uCisgKiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KKyNpbmNsdWRlIDxhc20vcHMzLmg+CisKKworc3RhdGljIHU2NCByZWFkX3J0Yyh2b2lkKQoreworCWludCByZXN1bHQ7CisJdTY0IHJ0Y192YWw7CisJdTY0IHRiX3ZhbDsKKworCXJlc3VsdCA9IGx2MV9nZXRfcnRjKCZydGNfdmFsLCAmdGJfdmFsKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJldHVybiBydGNfdmFsOworfQorCitzdGF0aWMgaW50IHBzM19nZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcnRjX3RpbWVfdG9fdG0ocmVhZF9ydGMoKSArIHBzM19vc19hcmVhX2dldF9ydGNfZGlmZigpLCB0bSk7CisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIG5vdzsKKworCXJ0Y190bV90b190aW1lKHRtLCAmbm93KTsKKwlwczNfb3NfYXJlYV9zZXRfcnRjX2RpZmYobm93IC0gcmVhZF9ydGMoKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBwczNfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gcHMzX2dldF90aW1lLAorCS5zZXRfdGltZSA9IHBzM19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJydGMtcHMzIiwgJmRldi0+ZGV2LCAmcHMzX3J0Y19vcHMsCisJCQkJICBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBydGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBwczNfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwczNfcnRjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJydGMtcHMzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlID0gX19leGl0X3AocHMzX3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHMzX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmcHMzX3J0Y19kcml2ZXIsIHBzM19ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHMzX3J0Y19maW5pKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBzM19ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHMzX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHBzM19ydGNfZmluaSk7CisKK01PRFVMRV9BVVRIT1IoIlNvbnkgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigicHMzIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLXBzMyIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXB1djMuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wdXYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwYWNhZQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1wdXYzLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBSVEMgZHJpdmVyIGNvZGUgc3BlY2lmaWMgdG8gUEtVbml0eSBTb0MgYW5kIFVuaUNvcmUgSVNBCisgKgorICoJTWFpbnRhaW5lZCBieSBHVUFOIFh1ZS10YW8gPGd4dEBtcHJjLnBrdS5lZHUuY24+CisgKglDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBHdWFuIFh1ZXRhbworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlICpwdXYzX3J0Y19tZW07CisKK3N0YXRpYyBpbnQgcHV2M19ydGNfYWxhcm1ubyA9IElSUV9SVENBbGFybTsKK3N0YXRpYyBpbnQgcHV2M19ydGNfdGlja25vICA9IElSUV9SVEM7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socHV2M19ydGNfcGllX2xvY2spOworCisvKiBJUlEgSGFuZGxlcnMgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBwdXYzX3J0Y19hbGFybWlycShpbnQgaXJxLCB2b2lkICppZCkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcmRldiA9IGlkOworCisJd3JpdGVsKHJlYWRsKFJUQ19SVFNSKSB8IFJUQ19SVFNSX0FMLCBSVENfUlRTUik7CisJcnRjX3VwZGF0ZV9pcnEocmRldiwgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHB1djNfcnRjX3RpY2tpcnEoaW50IGlycSwgdm9pZCAqaWQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJkZXYgPSBpZDsKKworCXdyaXRlbChyZWFkbChSVENfUlRTUikgfCBSVENfUlRTUl9IWiwgUlRDX1JUU1IpOworCXJ0Y191cGRhdGVfaXJxKHJkZXYsIDEsIFJUQ19QRiB8IFJUQ19JUlFGKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIFVwZGF0ZSBjb250cm9sIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgcHV2M19ydGNfc2V0YWllKGludCB0bykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJcHJfZGVidWcoIiVzOiBhaWU9JWRcbiIsIF9fZnVuY19fLCB0byk7CisKKwl0bXAgPSByZWFkbChSVENfUlRTUikgJiB+UlRDX1JUU1JfQUxFOworCisJaWYgKHRvKQorCQl0bXAgfD0gUlRDX1JUU1JfQUxFOworCisJd3JpdGVsKHRtcCwgUlRDX1JUU1IpOworfQorCitzdGF0aWMgaW50IHB1djNfcnRjX3NldHBpZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBlbmFibGVkKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlwcl9kZWJ1ZygiJXM6IHBpZT0lZFxuIiwgX19mdW5jX18sIGVuYWJsZWQpOworCisJc3Bpbl9sb2NrX2lycSgmcHV2M19ydGNfcGllX2xvY2spOworCXRtcCA9IHJlYWRsKFJUQ19SVFNSKSAmIH5SVENfUlRTUl9IWkU7CisKKwlpZiAoZW5hYmxlZCkKKwkJdG1wIHw9IFJUQ19SVFNSX0haRTsKKworCXdyaXRlbCh0bXAsIFJUQ19SVFNSKTsKKwlzcGluX3VubG9ja19pcnEoJnB1djNfcnRjX3BpZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBUaW1lIHJlYWQvd3JpdGUgKi8KK3N0YXRpYyBpbnQgcHV2M19ydGNfZ2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCXJ0Y190aW1lX3RvX3RtKHJlYWRsKFJUQ19SQ05SKSwgcnRjX3RtKTsKKworCXByX2RlYnVnKCJyZWFkIHRpbWUgJTAyeC4lMDJ4LiUwMnggJTAyeC8lMDJ4LyUwMnhcbiIsCisJCSBydGNfdG0tPnRtX3llYXIsIHJ0Y190bS0+dG1fbW9uLCBydGNfdG0tPnRtX21kYXksCisJCSBydGNfdG0tPnRtX2hvdXIsIHJ0Y190bS0+dG1fbWluLCBydGNfdG0tPnRtX3NlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXYzX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIHJ0Y19jb3VudCA9IDA7CisKKwlwcl9kZWJ1Zygic2V0IHRpbWUgJTAyZC4lMDJkLiUwMmQgJTAyZC8lMDJkLyUwMmRcbiIsCisJCSB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCSB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisKKwlydGNfdG1fdG9fdGltZSh0bSwgJnJ0Y19jb3VudCk7CisJd3JpdGVsKHJ0Y19jb3VudCwgUlRDX1JDTlIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV2M19ydGNfZ2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSA9ICZhbHJtLT50aW1lOworCisJcnRjX3RpbWVfdG9fdG0ocmVhZGwoUlRDX1JUQVIpLCBhbG1fdG0pOworCisJYWxybS0+ZW5hYmxlZCA9IHJlYWRsKFJUQ19SVFNSKSAmIFJUQ19SVFNSX0FMRTsKKworCXByX2RlYnVnKCJyZWFkIGFsYXJtICUwMnggJTAyeC4lMDJ4LiUwMnggJTAyeC8lMDJ4LyUwMnhcbiIsCisJCSBhbHJtLT5lbmFibGVkLAorCQkgYWxtX3RtLT50bV95ZWFyLCBhbG1fdG0tPnRtX21vbiwgYWxtX3RtLT50bV9tZGF5LAorCQkgYWxtX3RtLT50bV9ob3VyLCBhbG1fdG0tPnRtX21pbiwgYWxtX3RtLT50bV9zZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV2M19ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJdW5zaWduZWQgbG9uZyBydGNhbGFybV9jb3VudCA9IDA7CisKKwlwcl9kZWJ1ZygicHV2M19ydGNfc2V0YWxhcm06ICVkLCAlMDJ4LyUwMngvJTAyeCAlMDJ4LiUwMnguJTAyeFxuIiwKKwkJIGFscm0tPmVuYWJsZWQsCisJCSB0bS0+dG1fbWRheSAmIDB4ZmYsIHRtLT50bV9tb24gJiAweGZmLCB0bS0+dG1feWVhciAmIDB4ZmYsCisJCSB0bS0+dG1faG91ciAmIDB4ZmYsIHRtLT50bV9taW4gJiAweGZmLCB0bS0+dG1fc2VjKTsKKworCXJ0Y190bV90b190aW1lKHRtLCAmcnRjYWxhcm1fY291bnQpOworCXdyaXRlbChydGNhbGFybV9jb3VudCwgUlRDX1JUQVIpOworCisJcHV2M19ydGNfc2V0YWllKGFscm0tPmVuYWJsZWQpOworCisJaWYgKGFscm0tPmVuYWJsZWQpCisJCWVuYWJsZV9pcnFfd2FrZShwdXYzX3J0Y19hbGFybW5vKTsKKwllbHNlCisJCWRpc2FibGVfaXJxX3dha2UocHV2M19ydGNfYWxhcm1ubyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXYzX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsCisJCSAgICAgKHJlYWRsKFJUQ19SVFNSKSAmIFJUQ19SVFNSX0haRSkgPyAieWVzIiA6ICJubyIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1djNfcnRjX29wZW4oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShwdXYzX3J0Y19hbGFybW5vLCBwdXYzX3J0Y19hbGFybWlycSwKKwkJCTAsICJwa3VuaXR5LXJ0YyBhbGFybSIsIHJ0Y19kZXYpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIklSUSVkIGVycm9yICVkXG4iLCBwdXYzX3J0Y19hbGFybW5vLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKHB1djNfcnRjX3RpY2tubywgcHV2M19ydGNfdGlja2lycSwKKwkJCTAsICJwa3VuaXR5LXJ0YyB0aWNrIiwgcnRjX2Rldik7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiSVJRJWQgZXJyb3IgJWRcbiIsIHB1djNfcnRjX3RpY2tubywgcmV0KTsKKwkJZ290byB0aWNrX2VycjsKKwl9CisKKwlyZXR1cm4gcmV0OworCisgdGlja19lcnI6CisJZnJlZV9pcnEocHV2M19ydGNfYWxhcm1ubywgcnRjX2Rldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcHV2M19ydGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGNfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwkvKiBkbyBub3QgY2xlYXIgQUlFIGhlcmUsIGl0IG1heSBiZSBuZWVkZWQgZm9yIHdha2UgKi8KKwlwdXYzX3J0Y19zZXRwaWUoZGV2LCAwKTsKKwlmcmVlX2lycShwdXYzX3J0Y19hbGFybW5vLCBydGNfZGV2KTsKKwlmcmVlX2lycShwdXYzX3J0Y190aWNrbm8sIHJ0Y19kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgcHV2M19ydGNvcHMgPSB7CisJLm9wZW4JCT0gcHV2M19ydGNfb3BlbiwKKwkucmVsZWFzZQk9IHB1djNfcnRjX3JlbGVhc2UsCisJLnJlYWRfdGltZQk9IHB1djNfcnRjX2dldHRpbWUsCisJLnNldF90aW1lCT0gcHV2M19ydGNfc2V0dGltZSwKKwkucmVhZF9hbGFybQk9IHB1djNfcnRjX2dldGFsYXJtLAorCS5zZXRfYWxhcm0JPSBwdXYzX3J0Y19zZXRhbGFybSwKKwkucHJvYwkgICAgICAgID0gcHV2M19ydGNfcHJvYywKK307CisKK3N0YXRpYyB2b2lkIHB1djNfcnRjX2VuYWJsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgZW4pCit7CisJaWYgKCFlbikgeworCQl3cml0ZWwocmVhZGwoUlRDX1JUU1IpICYgflJUQ19SVFNSX0haRSwgUlRDX1JUU1IpOworCX0gZWxzZSB7CisJCS8qIHJlLWVuYWJsZSB0aGUgZGV2aWNlLCBhbmQgY2hlY2sgaXQgaXMgb2sgKi8KKwkJaWYgKChyZWFkbChSVENfUlRTUikgJiBSVENfUlRTUl9IWkUpID09IDApIHsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJydGMgZGlzYWJsZWQsIHJlLWVuYWJsaW5nXG4iKTsKKwkJCXdyaXRlbChyZWFkbChSVENfUlRTUikgfCBSVENfUlRTUl9IWkUsIFJUQ19SVFNSKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcHV2M19ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlwdXYzX3J0Y19zZXRwaWUoJmRldi0+ZGV2LCAwKTsKKwlwdXYzX3J0Y19zZXRhaWUoMCk7CisKKwlyZWxlYXNlX3Jlc291cmNlKHB1djNfcnRjX21lbSk7CisJa2ZyZWUocHV2M19ydGNfbWVtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwdXYzX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlczogcHJvYmU9JXBcbiIsIF9fZnVuY19fLCBwZGV2KTsKKworCS8qIGZpbmQgdGhlIElSUXMgKi8KKwlwdXYzX3J0Y190aWNrbm8gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCWlmIChwdXYzX3J0Y190aWNrbm8gPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSBmb3IgcnRjIHRpY2tcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlwdXYzX3J0Y19hbGFybW5vID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocHV2M19ydGNfYWxhcm1ubyA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIGZvciBhbGFybVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXByX2RlYnVnKCJQS1VuaXR5X3J0YzogdGljayBpcnEgJWQsIGFsYXJtIGlycSAlZFxuIiwKKwkJIHB1djNfcnRjX3RpY2tubywgcHV2M19ydGNfYWxhcm1ubyk7CisKKwkvKiBnZXQgdGhlIG1lbW9yeSByZWdpb24gKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb24gcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlwdXYzX3J0Y19tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLAorCQkJCQkgIHBkZXYtPm5hbWUpOworCisJaWYgKHB1djNfcnRjX21lbSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXNlcnZlIG1lbW9yeSByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9ub3JlczsKKwl9CisKKwlwdXYzX3J0Y19lbmFibGUocGRldiwgMSk7CisKKwkvKiByZWdpc3RlciBSVEMgYW5kIGV4aXQgKi8KKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJwa3VuaXR5IiwgJnBkZXYtPmRldiwgJnB1djNfcnRjb3BzLAorCQkJCSAgVEhJU19NT0RVTEUpOworCisJaWYgKElTX0VSUihydGMpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhdHRhY2ggcnRjXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihydGMpOworCQlnb3RvIGVycl9ub3J0YzsKKwl9CisKKwkvKiBwbGF0Zm9ybSBzZXR1cCBjb2RlIHNob3VsZCBoYXZlIGhhbmRsZWQgdGhpczsgc2lnaCAqLworCWlmICghZGV2aWNlX2Nhbl93YWtldXAoJnBkZXYtPmRldikpCisJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisJcmV0dXJuIDA7CisKKyBlcnJfbm9ydGM6CisJcHV2M19ydGNfZW5hYmxlKHBkZXYsIDApOworCXJlbGVhc2VfcmVzb3VyY2UocHV2M19ydGNfbWVtKTsKKworIGVycl9ub3JlczoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgdGljbnRfc2F2ZTsKKworc3RhdGljIGludCBwdXYzX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwkvKiBzYXZlIFJUQVIgZm9yIGFueW9uZSB1c2luZyBwZXJpb2RpYyBpbnRlcnJ1cHRzICovCisJdGljbnRfc2F2ZSA9IHJlYWRsKFJUQ19SVEFSKTsKKwlwdXYzX3J0Y19lbmFibGUocGRldiwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV2M19ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcHV2M19ydGNfZW5hYmxlKHBkZXYsIDEpOworCXdyaXRlbCh0aWNudF9zYXZlLCBSVENfUlRBUik7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBwdXYzX3J0Y19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgcHV2M19ydGNfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHV2M19ydGNfZHJpdmVyID0geworCS5wcm9iZQkJPSBwdXYzX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHB1djNfcnRjX3JlbW92ZSksCisJLnN1c3BlbmQJPSBwdXYzX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHV2M19ydGNfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJQS1VuaXR5LXYzLVJUQyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocHV2M19ydGNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgRHJpdmVyIGZvciB0aGUgUEtVbml0eSB2MyBjaGlwIik7CitNT0RVTEVfQVVUSE9SKCJIdSBEb25nbGlhbmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1weGEuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1weGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc1YzhmCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXB4YS5jCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgWFNjYWxlIFBYQTI3eCBhbmQgUFhBM3h4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJvYmVydCBKYXJ6bWlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgVElNRVJfRlJFUQkJQ0xPQ0tfVElDS19SQVRFCisjZGVmaW5lIFJUQ19ERUZfRElWSURFUgkJKDMyNzY4IC0gMSkKKyNkZWZpbmUgUlRDX0RFRl9UUklNCQkwCisjZGVmaW5lIE1BWEZSRVFfUEVSSU9ESUMJMTAwMAorCisvKgorICogUFhBIFJlZ2lzdGVycyBhbmQgYml0cyBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFJUU1JfUElDRQkoMSA8PCAxNSkJLyogUGVyaW9kaWMgaW50ZXJydXB0IGNvdW50IGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1BJQUxFCSgxIDw8IDE0KQkvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgQWxhcm0gZW5hYmxlICovCisjZGVmaW5lIFJUU1JfUElBTAkoMSA8PCAxMykJLyogUGVyaW9kaWMgaW50ZXJydXB0IGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfU1dBTEUyCSgxIDw8IDExKQkvKiBSVEMgc3RvcHdhdGNoIGFsYXJtMiBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9TV0FMMgkoMSA8PCAxMCkJLyogUlRDIHN0b3B3YXRjaCBhbGFybTIgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9TV0FMRTEJKDEgPDwgOSkJLyogUlRDIHN0b3B3YXRjaCBhbGFybTEgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfU1dBTDEJKDEgPDwgOCkJLyogUlRDIHN0b3B3YXRjaCBhbGFybTEgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9SREFMRTIJKDEgPDwgNykJLyogUlRDIGFsYXJtMiBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9SREFMMgkoMSA8PCA2KQkvKiBSVEMgYWxhcm0yIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfUkRBTEUxCSgxIDw8IDUpCS8qIFJUQyBhbGFybTEgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfUkRBTDEJKDEgPDwgNCkJLyogUlRDIGFsYXJtMSBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX0haRQkoMSA8PCAzKQkvKiBIWiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfQUxFCSgxIDw8IDIpCS8qIFJUQyBhbGFybSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfSFoJCSgxIDw8IDEpCS8qIEhaIHJpc2luZy1lZGdlIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfQUwJCSgxIDw8IDApCS8qIFJUQyBhbGFybSBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX1RSSUdfTUFTSwkoUlRTUl9BTCB8IFJUU1JfSFogfCBSVFNSX1JEQUwxIHwgUlRTUl9SREFMMlwKKwkJCSB8IFJUU1JfU1dBTDEgfCBSVFNSX1NXQUwyKQorI2RlZmluZSBSWXhSX1lFQVJfUwk5CisjZGVmaW5lIFJZeFJfWUVBUl9NQVNLCSgweGZmZiA8PCBSWXhSX1lFQVJfUykKKyNkZWZpbmUgUll4Ul9NT05USF9TCTUKKyNkZWZpbmUgUll4Ul9NT05USF9NQVNLCSgweGYgPDwgUll4Ul9NT05USF9TKQorI2RlZmluZSBSWXhSX0RBWV9NQVNLCTB4MWYKKyNkZWZpbmUgUkR4Ul9IT1VSX1MJMTIKKyNkZWZpbmUgUkR4Ul9IT1VSX01BU0sJKDB4MWYgPDwgUkR4Ul9IT1VSX1MpCisjZGVmaW5lIFJEeFJfTUlOX1MJNgorI2RlZmluZSBSRHhSX01JTl9NQVNLCSgweDNmIDw8IFJEeFJfTUlOX1MpCisjZGVmaW5lIFJEeFJfU0VDX01BU0sJMHgzZgorCisjZGVmaW5lIFJUU1IJCTB4MDgKKyNkZWZpbmUgUlRUUgkJMHgwYworI2RlZmluZSBSRENSCQkweDEwCisjZGVmaW5lIFJZQ1IJCTB4MTQKKyNkZWZpbmUgUkRBUjEJCTB4MTgKKyNkZWZpbmUgUllBUjEJCTB4MWMKKyNkZWZpbmUgUlRDUElDUgkJMHgzNAorI2RlZmluZSBQSUFSCQkweDM4CisKKyNkZWZpbmUgcnRjX3JlYWRsKHB4YV9ydGMsIHJlZykJXAorCV9fcmF3X3JlYWRsKChweGFfcnRjKS0+YmFzZSArIChyZWcpKQorI2RlZmluZSBydGNfd3JpdGVsKHB4YV9ydGMsIHJlZywgdmFsdWUpCVwKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKHB4YV9ydGMpLT5iYXNlICsgKHJlZykpCisKK3N0cnVjdCBweGFfcnRjIHsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlc3M7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlpbnQJCQlpcnFfMUh6OworCWludAkJCWlycV9BbHJtOworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJc3BpbmxvY2tfdAkJbG9jazsJCS8qIFByb3RlY3RzIHRoaXMgc3RydWN0dXJlICovCit9OworCitzdGF0aWMgdTMyIHJ5eHJfY2FsYyhzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiAoKHRtLT50bV95ZWFyICsgMTkwMCkgPDwgUll4Ul9ZRUFSX1MpCisJCXwgKCh0bS0+dG1fbW9uICsgMSkgPDwgUll4Ul9NT05USF9TKQorCQl8IHRtLT50bV9tZGF5OworfQorCitzdGF0aWMgdTMyIHJkeHJfY2FsYyhzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiAodG0tPnRtX2hvdXIgPDwgUkR4Ul9IT1VSX1MpIHwgKHRtLT50bV9taW4gPDwgUkR4Ul9NSU5fUykKKwkJfCB0bS0+dG1fc2VjOworfQorCitzdGF0aWMgdm9pZCB0bV9jYWxjKHUzMiByeWNyLCB1MzIgcmRjciwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl0bS0+dG1feWVhciA9ICgocnljciAmIFJZeFJfWUVBUl9NQVNLKSA+PiBSWXhSX1lFQVJfUykgLSAxOTAwOworCXRtLT50bV9tb24gPSAoKChyeWNyICYgUll4Ul9NT05USF9NQVNLKSA+PiBSWXhSX01PTlRIX1MpKSAtIDE7CisJdG0tPnRtX21kYXkgPSAocnljciAmIFJZeFJfREFZX01BU0spOworCXRtLT50bV9ob3VyID0gKHJkY3IgJiBSRHhSX0hPVVJfTUFTSykgPj4gUkR4Ul9IT1VSX1M7CisJdG0tPnRtX21pbiA9IChyZGNyICYgUkR4Ul9NSU5fTUFTSykgPj4gUkR4Ul9NSU5fUzsKKwl0bS0+dG1fc2VjID0gcmRjciAmIFJEeFJfU0VDX01BU0s7Cit9CisKK3N0YXRpYyB2b2lkIHJ0c3JfY2xlYXJfYml0cyhzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YywgdTMyIG1hc2spCit7CisJdTMyIHJ0c3I7CisKKwlydHNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpOworCXJ0c3IgJj0gflJUU1JfVFJJR19NQVNLOworCXJ0c3IgJj0gfm1hc2s7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyKTsKK30KKworc3RhdGljIHZvaWQgcnRzcl9zZXRfYml0cyhzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YywgdTMyIG1hc2spCit7CisJdTMyIHJ0c3I7CisKKwlydHNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpOworCXJ0c3IgJj0gflJUU1JfVFJJR19NQVNLOworCXJ0c3IgfD0gbWFzazsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJUU1IsIHJ0c3IpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcHhhX3J0Y19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2X2lkKTsKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXUzMiBydHNyOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKKworCXNwaW5fbG9jaygmcHhhX3J0Yy0+bG9jayk7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc291cmNlcyAqLworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyKTsKKworCS8qIHRlbXBvcmFyeSBkaXNhYmxlIHJ0YyBpbnRlcnJ1cHRzICovCisJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUkRBTEUxIHwgUlRTUl9QSUFMRSB8IFJUU1JfSFpFKTsKKworCS8qIGNsZWFyIGFsYXJtIGludGVycnVwdCBpZiBpdCBoYXMgb2NjdXJyZWQgKi8KKwlpZiAocnRzciAmIFJUU1JfUkRBTDEpCisJCXJ0c3IgJj0gflJUU1JfUkRBTEUxOworCisJLyogdXBkYXRlIGlycSBkYXRhICYgY291bnRlciAqLworCWlmIChydHNyICYgUlRTUl9SREFMMSkKKwkJZXZlbnRzIHw9IFJUQ19BRiB8IFJUQ19JUlFGOworCWlmIChydHNyICYgUlRTUl9IWikKKwkJZXZlbnRzIHw9IFJUQ19VRiB8IFJUQ19JUlFGOworCWlmIChydHNyICYgUlRTUl9QSUFMKQorCQlldmVudHMgfD0gUlRDX1BGIHwgUlRDX0lSUUY7CisKKwlydGNfdXBkYXRlX2lycShweGFfcnRjLT5ydGMsIDEsIGV2ZW50cyk7CisKKwkvKiBlbmFibGUgYmFjayBydGMgaW50ZXJydXB0cyAqLworCXJ0Y193cml0ZWwocHhhX3J0YywgUlRTUiwgcnRzciAmIH5SVFNSX1RSSUdfTUFTSyk7CisKKwlzcGluX3VubG9jaygmcHhhX3J0Yy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfb3BlbihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEocHhhX3J0Yy0+aXJxXzFIeiwgcHhhX3J0Y19pcnEsIDAsCisJCQkgICJydGMgMUh6IiwgZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwgcHhhX3J0Yy0+aXJxXzFIeiwKKwkJCXJldCk7CisJCWdvdG8gZXJyX2lycV8xSHo7CisJfQorCXJldCA9IHJlcXVlc3RfaXJxKHB4YV9ydGMtPmlycV9BbHJtLCBweGFfcnRjX2lycSwgMCwKKwkJCSAgInJ0YyBBbHJtIiwgZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwgcHhhX3J0Yy0+aXJxX0Fscm0sCisJCQlyZXQpOworCQlnb3RvIGVycl9pcnFfQWxybTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2lycV9BbHJtOgorCWZyZWVfaXJxKHB4YV9ydGMtPmlycV8xSHosIGRldik7CitlcnJfaXJxXzFIejoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBweGFfcnRjX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKwlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9QSUFMRSB8IFJUU1JfUkRBTEUxIHwgUlRTUl9IWkUpOworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisKKwlmcmVlX2lycShweGFfcnRjLT5pcnFfQWxybSwgZGV2KTsKKwlmcmVlX2lycShweGFfcnRjLT5pcnFfMUh6LCBkZXYpOworfQorCitzdGF0aWMgaW50IHB4YV9hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCisJaWYgKGVuYWJsZWQpCisJCXJ0c3Jfc2V0X2JpdHMocHhhX3J0YywgUlRTUl9SREFMRTEpOworCWVsc2UKKwkJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUkRBTEUxKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHJ5Y3IsIHJkY3I7CisKKwlyeWNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJZQ1IpOworCXJkY3IgPSBydGNfcmVhZGwocHhhX3J0YywgUkRDUik7CisKKwl0bV9jYWxjKHJ5Y3IsIHJkY3IsIHRtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3dyaXRlbChweGFfcnRjLCBSWUNSLCByeXhyX2NhbGModG0pKTsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJEQ1IsIHJkeHJfY2FsYyh0bSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgcnRzciwgcnlhciwgcmRhcjsKKworCXJ5YXIgPSBydGNfcmVhZGwocHhhX3J0YywgUllBUjEpOworCXJkYXIgPSBydGNfcmVhZGwocHhhX3J0YywgUkRBUjEpOworCXRtX2NhbGMocnlhciwgcmRhciwgJmFscm0tPnRpbWUpOworCisJcnRzciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKTsKKwlhbHJtLT5lbmFibGVkID0gKHJ0c3IgJiBSVFNSX1JEQUxFMSkgPyAxIDogMDsKKwlhbHJtLT5wZW5kaW5nID0gKHJ0c3IgJiBSVFNSX1JEQUwxKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgcnRzcjsKKworCXNwaW5fbG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCisJcnRjX3dyaXRlbChweGFfcnRjLCBSWUFSMSwgcnl4cl9jYWxjKCZhbHJtLT50aW1lKSk7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSREFSMSwgcmR4cl9jYWxjKCZhbHJtLT50aW1lKSk7CisKKwlydHNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpOworCWlmIChhbHJtLT5lbmFibGVkKQorCQlydHNyIHw9IFJUU1JfUkRBTEUxOworCWVsc2UKKwkJcnRzciAmPSB+UlRTUl9SREFMRTE7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc2VxX3ByaW50ZihzZXEsICJ0cmltL2RpdmlkZXJcdDogMHglMDh4XG4iLCBydGNfcmVhZGwocHhhX3J0YywgUlRUUikpOworCXNlcV9wcmludGYoc2VxLCAidXBkYXRlX0lSUVx0OiAlc1xuIiwKKwkJICAgKHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKSAmIFJUU1JfSFpFKSA/ICJ5ZXMiIDogIm5vIik7CisJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsCisJCSAgIChydGNfcmVhZGwocHhhX3J0YywgUlRTUikgJiBSVFNSX1BJQUxFKSA/ICJ5ZXMiIDogIm5vIik7CisJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19mcmVxXHQ6ICV1XG4iLCBydGNfcmVhZGwocHhhX3J0YywgUElBUikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBweGFfcnRjX29wcyA9IHsKKwkub3BlbiA9IHB4YV9ydGNfb3BlbiwKKwkucmVsZWFzZSA9IHB4YV9ydGNfcmVsZWFzZSwKKwkucmVhZF90aW1lID0gcHhhX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gcHhhX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IHB4YV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gcHhhX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBweGFfYWxhcm1faXJxX2VuYWJsZSwKKwkucHJvYyA9IHB4YV9ydGNfcHJvYywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjOworCWludCByZXQ7CisJdTMyIHJ0dHI7CisKKwlweGFfcnRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHB4YV9ydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB4YV9ydGMpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnB4YV9ydGMtPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHB4YV9ydGMpOworCisJcmV0ID0gLUVOWElPOworCXB4YV9ydGMtPnJlc3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcHhhX3J0Yy0+cmVzcykgeworCQlkZXZfZXJyKGRldiwgIk5vIEkvTyBtZW1vcnkgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gZXJyX3Jlc3M7CisJfQorCisJcHhhX3J0Yy0+aXJxXzFIeiA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHB4YV9ydGMtPmlycV8xSHogPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gMUh6IElSUSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJZ290byBlcnJfcmVzczsKKwl9CisJcHhhX3J0Yy0+aXJxX0Fscm0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCWlmIChweGFfcnRjLT5pcnFfQWxybSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJObyBhbGFybSBJUlEgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gZXJyX3Jlc3M7CisJfQorCisJcmV0ID0gLUVOT01FTTsKKwlweGFfcnRjLT5iYXNlID0gaW9yZW1hcChweGFfcnRjLT5yZXNzLT5zdGFydCwKKwkJCQlyZXNvdXJjZV9zaXplKHB4YV9ydGMtPnJlc3MpKTsKKwlpZiAoIXB4YV9ydGMtPmJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIG1hcCBweGEgUlRDIEkvTyBtZW1vcnlcbiIpOworCQlnb3RvIGVycl9tYXA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgY2xvY2sgZGl2aWRlciBpcyB1bmluaXRpYWxpemVkIHRoZW4gcmVzZXQgaXQgdG8gdGhlCisJICogZGVmYXVsdCB2YWx1ZSB0byBnZXQgdGhlIDFIeiBjbG9jay4KKwkgKi8KKwlpZiAocnRjX3JlYWRsKHB4YV9ydGMsIFJUVFIpID09IDApIHsKKwkJcnR0ciA9IFJUQ19ERUZfRElWSURFUiArIChSVENfREVGX1RSSU0gPDwgMTYpOworCQlydGNfd3JpdGVsKHB4YV9ydGMsIFJUVFIsIHJ0dHIpOworCQlkZXZfd2FybihkZXYsICJ3YXJuaW5nOiBpbml0aWFsaXppbmcgZGVmYXVsdCBjbG9jayIKKwkJCSAiIGRpdmlkZXIvdHJpbSB2YWx1ZVxuIik7CisJfQorCisJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUElBTEUgfCBSVFNSX1JEQUxFMSB8IFJUU1JfSFpFKTsKKworCXB4YV9ydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInB4YS1ydGMiLCAmcGRldi0+ZGV2LCAmcHhhX3J0Y19vcHMsCisJCQkJCSAgIFRISVNfTU9EVUxFKTsKKwlyZXQgPSBQVFJfRVJSKHB4YV9ydGMtPnJ0Yyk7CisJaWYgKElTX0VSUihweGFfcnRjLT5ydGMpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUQyBkZXZpY2UgLT4gJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3J0Y19yZWc7CisJfQorCisJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisKKwlyZXR1cm4gMDsKKworZXJyX3J0Y19yZWc6CisJIGlvdW5tYXAocHhhX3J0Yy0+YmFzZSk7CitlcnJfcmVzczoKK2Vycl9tYXA6CisJa2ZyZWUocHhhX3J0Yyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgcHhhX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHB4YV9ydGMtPnJ0Yyk7CisKKwlzcGluX2xvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKwlpb3VubWFwKHB4YV9ydGMtPmJhc2UpOworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisKKwlrZnJlZShweGFfcnRjKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHB4YV9ydGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQllbmFibGVfaXJxX3dha2UocHhhX3J0Yy0+aXJxX0Fscm0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWRpc2FibGVfaXJxX3dha2UocHhhX3J0Yy0+aXJxX0Fscm0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcHhhX3J0Y19wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBweGFfcnRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBweGFfcnRjX3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHhhX3J0Y19kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChweGFfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInB4YS1ydGMiLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmcHhhX3J0Y19wbV9vcHMsCisjZW5kaWYKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHhhX3J0Y19pbml0KHZvaWQpCit7CisJaWYgKGNwdV9pc19weGEyN3goKSB8fCBjcHVfaXNfcHhhM3h4KCkpCisJCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnB4YV9ydGNfZHJpdmVyLCBweGFfcnRjX3Byb2JlKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHhhX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB4YV9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHhhX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHB4YV9ydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJvYmVydCBKYXJ6bWlrIDxyb2JlcnQuamFyem1pa0BmcmVlLmZyPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQWEEyN3gvUFhBM3h4IFJlYWx0aW1lIENsb2NrIERyaXZlciAoUlRDKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpweGEtcnRjIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcjk3MDEuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1yOTcwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjZiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcjk3MDEuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIERyaXZlciBmb3IgRXBzb24gUlRDLTk3MDFKRQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWdudXMgRGFtbQorICoKKyAqIEJhc2VkIG9uIHJ0Yy1tYXg2OTAyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgOEQgVGVjaG5vbG9naWVzIGluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBDb21wdWxhYiBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjZGVmaW5lIFJTRUNDTlQJMHgwMAkvKiBTZWNvbmQgQ291bnRlciAqLworI2RlZmluZSBSTUlOQ05UCTB4MDEJLyogTWludXRlIENvdW50ZXIgKi8KKyNkZWZpbmUgUkhSQ05UCTB4MDIJLyogSG91ciBDb3VudGVyICovCisjZGVmaW5lIFJXS0NOVAkweDAzCS8qIFdlZWsgQ291bnRlciAqLworI2RlZmluZSBSREFZQ05UCTB4MDQJLyogRGF5IENvdW50ZXIgKi8KKyNkZWZpbmUgUk1PTkNOVAkweDA1CS8qIE1vbnRoIENvdW50ZXIgKi8KKyNkZWZpbmUgUllSQ05UCTB4MDYJLyogWWVhciBDb3VudGVyICovCisjZGVmaW5lIFIxMDBDTlQJMHgwNwkvKiBZMTAwIENvdW50ZXIgKi8KKyNkZWZpbmUgUk1JTkFSCTB4MDgJLyogTWludXRlIEFsYXJtICovCisjZGVmaW5lIFJIUkFSCTB4MDkJLyogSG91ciBBbGFybSAqLworI2RlZmluZSBSV0tBUgkweDBhCS8qIFdlZWsvRGF5IEFsYXJtICovCisjZGVmaW5lIFJUSU1DTlQJMHgwYwkvKiBJbnRlcnZhbCBUaW1lciAqLworI2RlZmluZSBSRVhUCTB4MGQJLyogRXh0ZW5zaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFJGTEFHCTB4MGUJLyogUlRDIEZsYWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNSCTB4MGYJLyogUlRDIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworc3RhdGljIGludCB3cml0ZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYWRkcmVzcywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisKKwlidWZbMF0gPSBhZGRyZXNzICYgMHg3ZjsKKwlidWZbMV0gPSBkYXRhOworCisJcmV0dXJuIHNwaV93cml0ZShzcGksIGJ1ZiwgQVJSQVlfU0laRShidWYpKTsKK30KKworc3RhdGljIGludCByZWFkX3JlZ3Moc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpyZWdzLCBpbnQgbm9fcmVncykKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXU4IHR4YnVmWzFdLCByeGJ1ZlsxXTsKKwlpbnQgaywgcmV0OworCisJcmV0ID0gMDsKKworCWZvciAoayA9IDA7IHJldCA9PSAwICYmIGsgPCBub19yZWdzOyBrKyspIHsKKwkJdHhidWZbMF0gPSAweDgwIHwgcmVnc1trXTsKKwkJcmV0ID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIHR4YnVmLCAxLCByeGJ1ZiwgMSk7CisJCXJlZ3Nba10gPSByeGJ1ZlswXTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI5NzAxX2dldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltdID0geyBSU0VDQ05ULCBSTUlOQ05ULCBSSFJDTlQsCisJCQkJUkRBWUNOVCwgUk1PTkNOVCwgUllSQ05UIH07CisKKwlyZXQgPSByZWFkX3JlZ3MoZGV2LCBidWYsIEFSUkFZX1NJWkUoYnVmKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1lbXNldChkdCwgMCwgc2l6ZW9mKCpkdCkpOworCisJZHQtPnRtX3NlYyA9IGJjZDJiaW4oYnVmWzBdKTsgLyogUlNFQ0NOVCAqLworCWR0LT50bV9taW4gPSBiY2QyYmluKGJ1ZlsxXSk7IC8qIFJNSU5DTlQgKi8KKwlkdC0+dG1faG91ciA9IGJjZDJiaW4oYnVmWzJdKTsgLyogUkhSQ05UICovCisKKwlkdC0+dG1fbWRheSA9IGJjZDJiaW4oYnVmWzNdKTsgLyogUkRBWUNOVCAqLworCWR0LT50bV9tb24gPSBiY2QyYmluKGJ1Zls0XSkgLSAxOyAvKiBSTU9OQ05UICovCisJZHQtPnRtX3llYXIgPSBiY2QyYmluKGJ1Zls1XSkgKyAxMDA7IC8qIFJZUkNOVCAqLworCisJLyogdGhlIHJ0YyBkZXZpY2UgbWF5IGNvbnRhaW4gaWxsZWdhbCB2YWx1ZXMgb24gcG93ZXIgdXAKKwkgKiBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgc2hlZXQuIG1ha2Ugc3VyZSB0aGV5IGFyZSB2YWxpZC4KKwkgKi8KKworCXJldHVybiBydGNfdmFsaWRfdG0oZHQpOworfQorCitzdGF0aWMgaW50IHI5NzAxX3NldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJaW50IHJldCwgeWVhcjsKKworCXllYXIgPSBkdC0+dG1feWVhciArIDE5MDA7CisJaWYgKHllYXIgPj0gMjEwMCB8fCB5ZWFyIDwgMjAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB3cml0ZV9yZWcoZGV2LCBSSFJDTlQsIGJpbjJiY2QoZHQtPnRtX2hvdXIpKTsKKwlyZXQgPSByZXQgPyByZXQgOiB3cml0ZV9yZWcoZGV2LCBSTUlOQ05ULCBiaW4yYmNkKGR0LT50bV9taW4pKTsKKwlyZXQgPSByZXQgPyByZXQgOiB3cml0ZV9yZWcoZGV2LCBSU0VDQ05ULCBiaW4yYmNkKGR0LT50bV9zZWMpKTsKKwlyZXQgPSByZXQgPyByZXQgOiB3cml0ZV9yZWcoZGV2LCBSREFZQ05ULCBiaW4yYmNkKGR0LT50bV9tZGF5KSk7CisJcmV0ID0gcmV0ID8gcmV0IDogd3JpdGVfcmVnKGRldiwgUk1PTkNOVCwgYmluMmJjZChkdC0+dG1fbW9uICsgMSkpOworCXJldCA9IHJldCA/IHJldCA6IHdyaXRlX3JlZyhkZXYsIFJZUkNOVCwgYmluMmJjZChkdC0+dG1feWVhciAtIDEwMCkpOworCXJldCA9IHJldCA/IHJldCA6IHdyaXRlX3JlZyhkZXYsIFJXS0NOVCwgMSA8PCBkdC0+dG1fd2RheSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgcjk3MDFfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gcjk3MDFfZ2V0X2RhdGV0aW1lLAorCS5zZXRfdGltZQk9IHI5NzAxX3NldF9kYXRldGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHI5NzAxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcnRjX3RpbWUgZHQ7CisJdW5zaWduZWQgY2hhciB0bXA7CisJaW50IHJlczsKKworCXRtcCA9IFIxMDBDTlQ7CisJcmVzID0gcmVhZF9yZWdzKCZzcGktPmRldiwgJnRtcCwgMSk7CisJaWYgKHJlcyB8fCB0bXAgIT0gMHgyMCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCByZWFkIFJUQyByZWdpc3RlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICogVGhlIGRldmljZSBzZWVtcyB0byBiZSBwcmVzZW50LiBOb3cgY2hlY2sgaWYgdGhlIHJlZ2lzdGVycworCSAqIGNvbnRhaW4gaW52YWxpZCB2YWx1ZXMuIElmIHNvLCB0cnkgdG8gd3JpdGUgYSBkZWZhdWx0IGRhdGU6CisJICogMjAwMC8xLzEgMDA6MDA6MDAKKwkgKi8KKwlyOTcwMV9nZXRfZGF0ZXRpbWUoJnNwaS0+ZGV2LCAmZHQpOworCWlmIChydGNfdmFsaWRfdG0oJmR0KSkgeworCQlkZXZfaW5mbygmc3BpLT5kZXYsICJ0cnlpbmcgdG8gcmVwYWlyIGludmFsaWQgZGF0ZS90aW1lXG4iKTsKKwkJZHQudG1fc2VjICA9IDA7CisJCWR0LnRtX21pbiAgPSAwOworCQlkdC50bV9ob3VyID0gMDsKKwkJZHQudG1fbWRheSA9IDE7CisJCWR0LnRtX21vbiAgPSAwOworCQlkdC50bV95ZWFyID0gMTAwOworCisJCWlmIChyOTcwMV9zZXRfZGF0ZXRpbWUoJnNwaS0+ZGV2LCAmZHQpKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCByZXBhaXIgUlRDIHJlZ2lzdGVyXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3Rlcigicjk3MDEiLAorCQkJCSZzcGktPmRldiwgJnI5NzAxX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHI5NzAxX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgcjk3MDFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJ0Yy1yOTcwMSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCT0gcjk3MDFfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHI5NzAxX3JlbW92ZSksCit9OworCittb2R1bGVfc3BpX2RyaXZlcihyOTcwMV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oInI5NzAxIHNwaSBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYWdudXMgRGFtbSA8ZGFtbUBvcGVuc291cmNlLnNlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJzcGk6cnRjLXI5NzAxIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcnA1YzAxLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcnA1YzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5ZGE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1ycDVjMDEuYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqICBSaWNvaCBSUDVDMDEgUlRDIERyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgMjAwOSBHZWVydCBVeXR0ZXJob2V2ZW4KKyAqCisgKiAgQmFzZWQgb24gdGhlIEEzMDAwIFRPRCBjb2RlIGluIGFyY2gvbTY4ay9hbWlnYS9jb25maWcuYworICogIENvcHlyaWdodCAoQykgMTk5MyBIYW1pc2ggTWFjZG9uYWxkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisKK2VudW0geworCVJQNUMwMV8xX1NFQ09ORAkJPSAweDAsCS8qIE1PREUgMDAgKi8KKwlSUDVDMDFfMTBfU0VDT05ECT0gMHgxLAkvKiBNT0RFIDAwICovCisJUlA1QzAxXzFfTUlOVVRFCQk9IDB4MiwJLyogTU9ERSAwMCBhbmQgTU9ERSAwMSAqLworCVJQNUMwMV8xMF9NSU5VVEUJPSAweDMsCS8qIE1PREUgMDAgYW5kIE1PREUgMDEgKi8KKwlSUDVDMDFfMV9IT1VSCQk9IDB4NCwJLyogTU9ERSAwMCBhbmQgTU9ERSAwMSAqLworCVJQNUMwMV8xMF9IT1VSCQk9IDB4NSwJLyogTU9ERSAwMCBhbmQgTU9ERSAwMSAqLworCVJQNUMwMV9EQVlfT0ZfV0VFSwk9IDB4NiwJLyogTU9ERSAwMCBhbmQgTU9ERSAwMSAqLworCVJQNUMwMV8xX0RBWQkJPSAweDcsCS8qIE1PREUgMDAgYW5kIE1PREUgMDEgKi8KKwlSUDVDMDFfMTBfREFZCQk9IDB4OCwJLyogTU9ERSAwMCBhbmQgTU9ERSAwMSAqLworCVJQNUMwMV8xX01PTlRICQk9IDB4OSwJLyogTU9ERSAwMCAqLworCVJQNUMwMV8xMF9NT05USAkJPSAweGEsCS8qIE1PREUgMDAgKi8KKwlSUDVDMDFfMV9ZRUFSCQk9IDB4YiwJLyogTU9ERSAwMCAqLworCVJQNUMwMV8xMF9ZRUFSCQk9IDB4YywJLyogTU9ERSAwMCAqLworCisJUlA1QzAxXzEyXzI0X1NFTEVDVAk9IDB4YSwJLyogTU9ERSAwMSAqLworCVJQNUMwMV9MRUFQX1lFQVIJPSAweGIsCS8qIE1PREUgMDEgKi8KKworCVJQNUMwMV9NT0RFCQk9IDB4ZCwJLyogYWxsIG1vZGVzICovCisJUlA1QzAxX1RFU1QJCT0gMHhlLAkvKiBhbGwgbW9kZXMgKi8KKwlSUDVDMDFfUkVTRVQJCT0gMHhmLAkvKiBhbGwgbW9kZXMgKi8KK307CisKKyNkZWZpbmUgUlA1QzAxXzEyXzI0X1NFTEVDVF8xMgkoMCA8PCAwKQorI2RlZmluZSBSUDVDMDFfMTJfMjRfU0VMRUNUXzI0CSgxIDw8IDApCisKKyNkZWZpbmUgUlA1QzAxXzEwX0hPVVJfQU0JKDAgPDwgMSkKKyNkZWZpbmUgUlA1QzAxXzEwX0hPVVJfUE0JKDEgPDwgMSkKKworI2RlZmluZSBSUDVDMDFfTU9ERV9USU1FUl9FTgkoMSA8PCAzKQkvKiB0aW1lciBlbmFibGUgKi8KKyNkZWZpbmUgUlA1QzAxX01PREVfQUxBUk1fRU4JKDEgPDwgMikJLyogYWxhcm0gZW5hYmxlICovCisKKyNkZWZpbmUgUlA1QzAxX01PREVfTU9ERV9NQVNLCSgzIDw8IDApCisjZGVmaW5lIFJQNUMwMV9NT0RFX01PREUwMAkoMCA8PCAwKQkvKiB0aW1lICovCisjZGVmaW5lIFJQNUMwMV9NT0RFX01PREUwMQkoMSA8PCAwKQkvKiBhbGFybSwgMTJoLzI0aCwgbGVhcCB5ZWFyICovCisjZGVmaW5lIFJQNUMwMV9NT0RFX1JBTV9CTE9DSzEwCSgyIDw8IDApCS8qIFJBTSA0IGJpdHMgeCAxMyAqLworI2RlZmluZSBSUDVDMDFfTU9ERV9SQU1fQkxPQ0sxMQkoMyA8PCAwKQkvKiBSQU0gNCBiaXRzIHggMTMgKi8KKworI2RlZmluZSBSUDVDMDFfUkVTRVRfMUhaX1BVTFNFCSgxIDw8IDMpCisjZGVmaW5lIFJQNUMwMV9SRVNFVF8xNkhaX1BVTFNFCSgxIDw8IDIpCisjZGVmaW5lIFJQNUMwMV9SRVNFVF9TRUNPTkQJKDEgPDwgMSkJLyogcmVzZXQgZGl2aWRlciBzdGFnZXMgZm9yICovCisJCQkJCQkvKiBzZWNvbmRzIG9yIHNtYWxsZXIgdW5pdHMgKi8KKyNkZWZpbmUgUlA1QzAxX1JFU0VUX0FMQVJNCSgxIDw8IDApCS8qIHJlc2V0IGFsbCBhbGFybSByZWdpc3RlcnMgKi8KKworCitzdHJ1Y3QgcnA1YzAxX3ByaXYgeworCXUzMiBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBhZ2FpbnN0IGNvbmN1cnJlbnQgUlRDL05WUkFNIGFjY2VzcyAqLworCXN0cnVjdCBiaW5fYXR0cmlidXRlIG52cmFtX2F0dHI7Cit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBycDVjMDFfcmVhZChzdHJ1Y3QgcnA1YzAxX3ByaXYgKnByaXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKCZwcml2LT5yZWdzW3JlZ10pICYgMHhmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnA1YzAxX3dyaXRlKHN0cnVjdCBycDVjMDFfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHZhbCwKKwkJCQl1bnNpZ25lZCBpbnQgcmVnKQoreworCV9fcmF3X3dyaXRlbCh2YWwsICZwcml2LT5yZWdzW3JlZ10pOworfQorCitzdGF0aWMgdm9pZCBycDVjMDFfbG9jayhzdHJ1Y3QgcnA1YzAxX3ByaXYgKnByaXYpCit7CisJcnA1YzAxX3dyaXRlKHByaXYsIFJQNUMwMV9NT0RFX01PREUwMCwgUlA1QzAxX01PREUpOworfQorCitzdGF0aWMgdm9pZCBycDVjMDFfdW5sb2NrKHN0cnVjdCBycDVjMDFfcHJpdiAqcHJpdikKK3sKKwlycDVjMDFfd3JpdGUocHJpdiwgUlA1QzAxX01PREVfVElNRVJfRU4gfCBSUDVDMDFfTU9ERV9NT0RFMDEsCisJCSAgICAgUlA1QzAxX01PREUpOworfQorCitzdGF0aWMgaW50IHJwNWMwMV9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBycDVjMDFfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJcnA1YzAxX2xvY2socHJpdik7CisKKwl0bS0+dG1fc2VjICA9IHJwNWMwMV9yZWFkKHByaXYsIFJQNUMwMV8xMF9TRUNPTkQpICogMTAgKworCQkgICAgICBycDVjMDFfcmVhZChwcml2LCBSUDVDMDFfMV9TRUNPTkQpOworCXRtLT50bV9taW4gID0gcnA1YzAxX3JlYWQocHJpdiwgUlA1QzAxXzEwX01JTlVURSkgKiAxMCArCisJCSAgICAgIHJwNWMwMV9yZWFkKHByaXYsIFJQNUMwMV8xX01JTlVURSk7CisJdG0tPnRtX2hvdXIgPSBycDVjMDFfcmVhZChwcml2LCBSUDVDMDFfMTBfSE9VUikgKiAxMCArCisJCSAgICAgIHJwNWMwMV9yZWFkKHByaXYsIFJQNUMwMV8xX0hPVVIpOworCXRtLT50bV9tZGF5ID0gcnA1YzAxX3JlYWQocHJpdiwgUlA1QzAxXzEwX0RBWSkgKiAxMCArCisJCSAgICAgIHJwNWMwMV9yZWFkKHByaXYsIFJQNUMwMV8xX0RBWSk7CisJdG0tPnRtX3dkYXkgPSBycDVjMDFfcmVhZChwcml2LCBSUDVDMDFfREFZX09GX1dFRUspOworCXRtLT50bV9tb24gID0gcnA1YzAxX3JlYWQocHJpdiwgUlA1QzAxXzEwX01PTlRIKSAqIDEwICsKKwkJICAgICAgcnA1YzAxX3JlYWQocHJpdiwgUlA1QzAxXzFfTU9OVEgpIC0gMTsKKwl0bS0+dG1feWVhciA9IHJwNWMwMV9yZWFkKHByaXYsIFJQNUMwMV8xMF9ZRUFSKSAqIDEwICsKKwkJICAgICAgcnA1YzAxX3JlYWQocHJpdiwgUlA1QzAxXzFfWUVBUik7CisJaWYgKHRtLT50bV95ZWFyIDw9IDY5KQorCQl0bS0+dG1feWVhciArPSAxMDA7CisKKwlycDVjMDFfdW5sb2NrKHByaXYpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBycDVjMDFfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBycDVjMDFfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJcnA1YzAxX2xvY2socHJpdik7CisKKwlycDVjMDFfd3JpdGUocHJpdiwgdG0tPnRtX3NlYyAvIDEwLCBSUDVDMDFfMTBfU0VDT05EKTsKKwlycDVjMDFfd3JpdGUocHJpdiwgdG0tPnRtX3NlYyAlIDEwLCBSUDVDMDFfMV9TRUNPTkQpOworCXJwNWMwMV93cml0ZShwcml2LCB0bS0+dG1fbWluIC8gMTAsIFJQNUMwMV8xMF9NSU5VVEUpOworCXJwNWMwMV93cml0ZShwcml2LCB0bS0+dG1fbWluICUgMTAsIFJQNUMwMV8xX01JTlVURSk7CisJcnA1YzAxX3dyaXRlKHByaXYsIHRtLT50bV9ob3VyIC8gMTAsIFJQNUMwMV8xMF9IT1VSKTsKKwlycDVjMDFfd3JpdGUocHJpdiwgdG0tPnRtX2hvdXIgJSAxMCwgUlA1QzAxXzFfSE9VUik7CisJcnA1YzAxX3dyaXRlKHByaXYsIHRtLT50bV9tZGF5IC8gMTAsIFJQNUMwMV8xMF9EQVkpOworCXJwNWMwMV93cml0ZShwcml2LCB0bS0+dG1fbWRheSAlIDEwLCBSUDVDMDFfMV9EQVkpOworCWlmICh0bS0+dG1fd2RheSAhPSAtMSkKKwkJcnA1YzAxX3dyaXRlKHByaXYsIHRtLT50bV93ZGF5LCBSUDVDMDFfREFZX09GX1dFRUspOworCXJwNWMwMV93cml0ZShwcml2LCAodG0tPnRtX21vbiArIDEpIC8gMTAsIFJQNUMwMV8xMF9NT05USCk7CisJcnA1YzAxX3dyaXRlKHByaXYsICh0bS0+dG1fbW9uICsgMSkgJSAxMCwgUlA1QzAxXzFfTU9OVEgpOworCWlmICh0bS0+dG1feWVhciA+PSAxMDApCisJCXRtLT50bV95ZWFyIC09IDEwMDsKKwlycDVjMDFfd3JpdGUocHJpdiwgdG0tPnRtX3llYXIgLyAxMCwgUlA1QzAxXzEwX1lFQVIpOworCXJwNWMwMV93cml0ZShwcml2LCB0bS0+dG1feWVhciAlIDEwLCBSUDVDMDFfMV9ZRUFSKTsKKworCXJwNWMwMV91bmxvY2socHJpdik7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHJwNWMwMV9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBycDVjMDFfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHJwNWMwMV9zZXRfdGltZSwKK307CisKKworLyoKKyAqIFRoZSBOVlJBTSBpcyBvcmdhbml6ZWQgYXMgMiBibG9ja3Mgb2YgMTMgbmliYmxlcyBvZiA0IGJpdHMuCisgKiBXZSBwcm92aWRlIGFjY2VzcyB0byB0aGVtIGxpa2UgQW1pZ2FPUyBkb2VzOiB0aGUgaGlnaCBuaWJibGUgb2YgZWFjaCA4LWJpdAorICogYnl0ZSBpcyBzdG9yZWQgaW4gQkxPQ0sxMCwgdGhlIGxvdyBuaWJibGUgaW4gQkxPQ0sxMS4KKyAqLworCitzdGF0aWMgc3NpemVfdCBycDVjMDFfbnZyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHJwNWMwMV9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCBjb3VudDsKKworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCisJZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IFJQNUMwMV9NT0RFOyBjb3VudCsrLCBzaXplLS0pIHsKKwkJdTggZGF0YTsKKworCQlycDVjMDFfd3JpdGUocHJpdiwKKwkJCSAgICAgUlA1QzAxX01PREVfVElNRVJfRU4gfCBSUDVDMDFfTU9ERV9SQU1fQkxPQ0sxMCwKKwkJCSAgICAgUlA1QzAxX01PREUpOworCQlkYXRhID0gcnA1YzAxX3JlYWQocHJpdiwgcG9zKSA8PCA0OworCQlycDVjMDFfd3JpdGUocHJpdiwKKwkJCSAgICAgUlA1QzAxX01PREVfVElNRVJfRU4gfCBSUDVDMDFfTU9ERV9SQU1fQkxPQ0sxMSwKKwkJCSAgICAgUlA1QzAxX01PREUpOworCQlkYXRhIHw9IHJwNWMwMV9yZWFkKHByaXYsIHBvcysrKTsKKwkJcnA1YzAxX3dyaXRlKHByaXYsIFJQNUMwMV9NT0RFX1RJTUVSX0VOIHwgUlA1QzAxX01PREVfTU9ERTAxLAorCQkJICAgICBSUDVDMDFfTU9ERSk7CisJCSpidWYrKyA9IGRhdGE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJwNWMwMV9udnJhbV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJICBjaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcnA1YzAxX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzc2l6ZV90IGNvdW50OworCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgUlA1QzAxX01PREU7IGNvdW50KyssIHNpemUtLSkgeworCQl1OCBkYXRhID0gKmJ1ZisrOworCisJCXJwNWMwMV93cml0ZShwcml2LAorCQkJICAgICBSUDVDMDFfTU9ERV9USU1FUl9FTiB8IFJQNUMwMV9NT0RFX1JBTV9CTE9DSzEwLAorCQkJICAgICBSUDVDMDFfTU9ERSk7CisJCXJwNWMwMV93cml0ZShwcml2LCBkYXRhID4+IDQsIHBvcyk7CisJCXJwNWMwMV93cml0ZShwcml2LAorCQkJICAgICBSUDVDMDFfTU9ERV9USU1FUl9FTiB8IFJQNUMwMV9NT0RFX1JBTV9CTE9DSzExLAorCQkJICAgICBSUDVDMDFfTU9ERSk7CisJCXJwNWMwMV93cml0ZShwcml2LCBkYXRhICYgMHhmLCBwb3MrKyk7CisJCXJwNWMwMV93cml0ZShwcml2LCBSUDVDMDFfTU9ERV9USU1FUl9FTiB8IFJQNUMwMV9NT0RFX01PREUwMSwKKwkJCSAgICAgUlA1QzAxX01PREUpOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IF9faW5pdCBycDVjMDFfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcnA1YzAxX3ByaXYgKnByaXY7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlpbnQgZXJyb3I7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PREVWOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPnJlZ3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFwcml2LT5yZWdzKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9wcml2OworCX0KKworCXN5c2ZzX2Jpbl9hdHRyX2luaXQoJnByaXYtPm52cmFtX2F0dHIpOworCXByaXYtPm52cmFtX2F0dHIuYXR0ci5uYW1lID0gIm52cmFtIjsKKwlwcml2LT5udnJhbV9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSOworCXByaXYtPm52cmFtX2F0dHIucmVhZCA9IHJwNWMwMV9udnJhbV9yZWFkOworCXByaXYtPm52cmFtX2F0dHIud3JpdGUgPSBycDVjMDFfbnZyYW1fd3JpdGU7CisJcHJpdi0+bnZyYW1fYXR0ci5zaXplID0gUlA1QzAxX01PREU7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIHByaXYpOworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigicnRjLXJwNWMwMSIsICZkZXYtPmRldiwgJnJwNWMwMV9ydGNfb3BzLAorCQkJCSAgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQllcnJvciA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCXByaXYtPnJ0YyA9IHJ0YzsKKworCWVycm9yID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXYtPmRldi5rb2JqLCAmcHJpdi0+bnZyYW1fYXR0cik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCisJcmV0dXJuIDA7CisKK291dF91bnJlZ2lzdGVyOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworb3V0X3VubWFwOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJaW91bm1hcChwcml2LT5yZWdzKTsKK291dF9mcmVlX3ByaXY6CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBycDVjMDFfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJwNWMwMV9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmZGV2LT5kZXYua29iaiwgJnByaXYtPm52cmFtX2F0dHIpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlvdW5tYXAocHJpdi0+cmVncyk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJwNWMwMV9ydGNfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gInJ0Yy1ycDVjMDEiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJPSBfX2V4aXRfcChycDVjMDFfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBycDVjMDFfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZycDVjMDFfcnRjX2RyaXZlciwgcnA1YzAxX3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBycDVjMDFfcnRjX2Zpbmkodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcnA1YzAxX3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChycDVjMDFfcnRjX2luaXQpOworbW9kdWxlX2V4aXQocnA1YzAxX3J0Y19maW5pKTsKKworTU9EVUxFX0FVVEhPUigiR2VlcnQgVXl0dGVyaG9ldmVuIDxnZWVydEBsaW51eC1tNjhrLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmljb2ggUlA1QzAxIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLXJwNWMwMSIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXJzNWMzMTMuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1yczVjMzEzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmZjE3OQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1yczVjMzEzLmMKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBSaWNvaCBSUzVDMzEzIFJUQyBkZXZpY2UvZHJpdmVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IE5vYnVoaXJvIEl3YW1hdHN1CisgKgorICogIDIwMDUtMDktMTkgbW9kaWZlZCBieSBrb2dpaWRlbmEKKyAqCisgKiBCYXNlZCBvbiB0aGUgb2xkIGRyaXZlcnMvY2hhci9yczVjMzEzX3J0Yy5jICBieToKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IFRldHN1eWEgT2thZGEgJiBOaWliZSBZdXRha2EKKyAqCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF1bCBHb3J0bWFrZXIuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgR29ydG1ha2VyCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQmFzZWQgb24gb3RoZXIgbWluaW1hbCBjaGFyIGRldmljZSBkcml2ZXJzLCBsaWtlIEFsYW4ncworICogd2F0Y2hkb2csIFRlZCdzIHJhbmRvbSwgZXRjLiBldGMuCisgKgorICoJMS4wNwlQYXVsIEdvcnRtYWtlci4KKyAqCTEuMDgJTWlxdWVsIHZhbiBTbW9vcmVuYnVyZzogZGlzYWxsb3cgY2VydGFpbiB0aGluZ3Mgb24gdGhlCisgKgkJREVDIEFscGhhIGFzIHRoZSBDTU9TIGNsb2NrIGlzIGFsc28gdXNlZCBmb3Igb3RoZXIgdGhpbmdzLgorICoJMS4wOQlOaWtpdGEgU2NobWlkdDogZXBvY2ggc3VwcG9ydCBhbmQgc29tZSBBbHBoYSBjbGVhbnVwLgorICoJMS4wOWEJUGV0ZSBaYWl0Y2V2OiBTdW4gU1BBUkMKKyAqCTEuMDliCUplZmYgR2FyemlrOiBNb2R1bGFyaXplLCBpbml0IGNsZWFudXAKKyAqCTEuMDljCUplZmYgR2FyemlrOiBTTVAgY2xlYW51cAorICoJMS4xMCAgICBQYXVsIEJhcnRvbi1EYXZpczogYWRkIHN1cHBvcnQgZm9yIGFzeW5jIEkvTworICoJMS4xMGEJQW5kcmVhIEFyY2FuZ2VsaTogQWxwaGEgdXBkYXRlcworICoJMS4xMGIJQW5kcmV3IE1vcnRvbjogU01QIGxvY2sgZml4CisgKgkxLjEwYwlDZXNhciBCYXJyb3M6IFNNUCBsb2NraW5nIGZpeGVzIGFuZCBjbGVhbnVwCisgKgkxLjEwZAlQYXVsIEdvcnRtYWtlcjogZGVsZXRlIHBhcmFub2lhIGNoZWNrIGluIHJ0Y19leGl0CisgKgkxLjEwZQlNYWNpZWogVy4gUm96eWNraTogSGFuZGxlIERFQ3N0YXRpb24ncyB5ZWFyIHdlaXJkbmVzcy4KKyAqICAgICAgMS4xMSAgICBUYWthc2hpIEl3YWk6IEtlcm5lbCBhY2Nlc3MgZnVuY3Rpb25zCisgKgkJCSAgICAgIHJ0Y19yZWdpc3Rlci9ydGNfdW5yZWdpc3Rlci9ydGNfY29udHJvbAorICogICAgICAxLjExYSAgIERhbmllbGUgQmVsbHVjY2k6IEF1ZGl0IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgaW4gcnRjX2luaXQKKyAqCTEuMTIJVmVua2F0ZXNoIFBhbGxpcGFkaTogSG9va3MgZm9yIGVtdWxhdGluZyBydGMgb24gSFBFVCBiYXNlLXRpbWVyCisgKgkJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKyAqCTEuMTMJTm9idWhpcm8gSXdhbWF0c3U6IFVwZGF0YSBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInJzNWMzMTMiCisjZGVmaW5lIERSVl9WRVJTSU9OIAkiMS4xMyIKKworI2lmZGVmIENPTkZJR19TSF9MQU5ESVNLCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMQU5ESVNLIGRlcGVuZGVuY2UgcGFydCBvZiBSUzVDMzEzICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0NTTVIxCQkweEZGRTAwMDAwCisjZGVmaW5lIFNDU0NSMQkJMHhGRkUwMDAwOAorI2RlZmluZSBTQ1NNUjFfQ0EJMHg4MAorI2RlZmluZSBTQ1NDUjFfQ0tFCTB4MDMKKyNkZWZpbmUgU0NTUFRSMQkJMHhGRkUwMDAxQworI2RlZmluZSBTQ1NQVFIxX0VJTwkweDgwCisjZGVmaW5lIFNDU1BUUjFfU1BCMUlPCTB4MDgKKyNkZWZpbmUgU0NTUFRSMV9TUEIxRFQJMHgwNAorI2RlZmluZSBTQ1NQVFIxX1NQQjBJTwkweDAyCisjZGVmaW5lIFNDU1BUUjFfU1BCMERUCTB4MDEKKworI2RlZmluZSBTREFfT0VOCQlTQ1NQVFIxX1NQQjFJTworI2RlZmluZSBTREEJCVNDU1BUUjFfU1BCMURUCisjZGVmaW5lIFNDTF9PRU4JCVNDU1BUUjFfU1BCMElPCisjZGVmaW5lIFNDTAkJU0NTUFRSMV9TUEIwRFQKKworLyogUklDT0ggUlM1QzMxMyBDRSBwb3J0ICovCisjZGVmaW5lIFJTNUMzMTNfQ0UJMHhCMDAwMDAwMworCisvKiBSSUNPSCBSUzVDMzEzIENFIHBvcnQgYml0ICovCisjZGVmaW5lIFJTNUMzMTNfQ0VfUlRDQ0UJMHgwMgorCisvKiBTQ1NQVFIxIGRhdGEgKi8KK3Vuc2lnbmVkIGNoYXIgc2NzcHRyMV9kYXRhOworCisjZGVmaW5lIFJTNUMzMTNfQ0VFTkFCTEUgICAgX19yYXdfd3JpdGViKFJTNUMzMTNfQ0VfUlRDQ0UsIFJTNUMzMTNfQ0UpOworI2RlZmluZSBSUzVDMzEzX0NFRElTQUJMRSAgIF9fcmF3X3dyaXRlYigweDAwLCBSUzVDMzEzX0NFKQorI2RlZmluZSBSUzVDMzEzX01JU0NPUCAgICAgIF9fcmF3X3dyaXRlYigweDAyLCAweEIwMDAwMDA4KQorCitzdGF0aWMgdm9pZCByczVjMzEzX2luaXRfcG9ydCh2b2lkKQoreworCS8qIFNldCBTQ0sgYXMgSS9PIHBvcnQgYW5kIEluaXRpYWxpemUgU0NTUFRSMSBkYXRhICYgSS9PIHBvcnQuICovCisJX19yYXdfd3JpdGViKF9fcmF3X3JlYWRiKFNDU01SMSkgJiB+U0NTTVIxX0NBLCBTQ1NNUjEpOworCV9fcmF3X3dyaXRlYihfX3Jhd19yZWFkYihTQ1NDUjEpICYgflNDU0NSMV9DS0UsIFNDU0NSMSk7CisKKwkvKiBBbmQgSW5pdGlhbGl6ZSBTQ0wgZm9yIFJTNUMzMTMgY2xvY2sgKi8KKwlzY3NwdHIxX2RhdGEgPSBfX3Jhd19yZWFkYihTQ1NQVFIxKSB8IFNDTDsJLyogU0NMOkggKi8KKwlfX3Jhd193cml0ZWIoc2NzcHRyMV9kYXRhLCBTQ1NQVFIxKTsKKwlzY3NwdHIxX2RhdGEgPSBfX3Jhd19yZWFkYihTQ1NQVFIxKSB8IFNDTF9PRU47CS8qIFNDTCBvdXRwdXQgZW5hYmxlICovCisJX19yYXdfd3JpdGViKHNjc3B0cjFfZGF0YSwgU0NTUFRSMSk7CisJUlM1QzMxM19DRURJU0FCTEU7CS8qIENFOkwgKi8KK30KKworc3RhdGljIHZvaWQgcnM1YzMxM193cml0ZV9kYXRhKHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJLyogU0RBOldyaXRlIERhdGEgKi8KKwkJc2NzcHRyMV9kYXRhID0gKHNjc3B0cjFfZGF0YSAmIH5TREEpIHwKKwkJCQkoKCgoMHg4MCA+PiBpKSAmIGRhdGEpID4+ICg3IC0gaSkpIDw8IDIpOworCQlfX3Jhd193cml0ZWIoc2NzcHRyMV9kYXRhLCBTQ1NQVFIxKTsKKwkJaWYgKGkgPT0gMCkgeworCQkJc2NzcHRyMV9kYXRhIHw9IFNEQV9PRU47CS8qIFNEQTpvdXRwdXQgZW5hYmxlICovCisJCQlfX3Jhd193cml0ZWIoc2NzcHRyMV9kYXRhLCBTQ1NQVFIxKTsKKwkJfQorCQluZGVsYXkoNzAwKTsKKwkJc2NzcHRyMV9kYXRhICY9IH5TQ0w7CS8qIFNDTDpMICovCisJCV9fcmF3X3dyaXRlYihzY3NwdHIxX2RhdGEsIFNDU1BUUjEpOworCQluZGVsYXkoNzAwKTsKKwkJc2NzcHRyMV9kYXRhIHw9IFNDTDsJLyogU0NMOkggKi8KKwkJX19yYXdfd3JpdGViKHNjc3B0cjFfZGF0YSwgU0NTUFRSMSk7CisJfQorCisJc2NzcHRyMV9kYXRhICY9IH5TREFfT0VOOwkvKiBTREE6b3V0cHV0IGRpc2FibGUgKi8KKwlfX3Jhd193cml0ZWIoc2NzcHRyMV9kYXRhLCBTQ1NQVFIxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcnM1YzMxM19yZWFkX2RhdGEodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGRhdGEgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQluZGVsYXkoNzAwKTsKKwkJLyogU0RBOlJlYWQgRGF0YSAqLworCQlkYXRhIHw9ICgoX19yYXdfcmVhZGIoU0NTUFRSMSkgJiBTREEpID4+IDIpIDw8ICg3IC0gaSk7CisJCXNjc3B0cjFfZGF0YSAmPSB+U0NMOwkvKiBTQ0w6TCAqLworCQlfX3Jhd193cml0ZWIoc2NzcHRyMV9kYXRhLCBTQ1NQVFIxKTsKKwkJbmRlbGF5KDcwMCk7CisJCXNjc3B0cjFfZGF0YSB8PSBTQ0w7CS8qIFNDTDpIICovCisJCV9fcmF3X3dyaXRlYihzY3NwdHIxX2RhdGEsIFNDU1BUUjEpOworCX0KKwlyZXR1cm4gZGF0YSAmIDB4MEY7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0hfTEFORElTSyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBtYWNoaW5lIGluZGVwZW5kZW5jZSBwYXJ0IG9mIFJTNUMzMTMgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJJQ09IIFJTNUMzMTMgYWRkcmVzcyAqLworI2RlZmluZSBSUzVDMzEzX0FERFJfU0VDCTB4MDAKKyNkZWZpbmUgUlM1QzMxM19BRERSX1NFQzEwCTB4MDEKKyNkZWZpbmUgUlM1QzMxM19BRERSX01JTgkweDAyCisjZGVmaW5lIFJTNUMzMTNfQUREUl9NSU4xMAkweDAzCisjZGVmaW5lIFJTNUMzMTNfQUREUl9IT1VSCTB4MDQKKyNkZWZpbmUgUlM1QzMxM19BRERSX0hPVVIxMAkweDA1CisjZGVmaW5lIFJTNUMzMTNfQUREUl9XRUVLCTB4MDYKKyNkZWZpbmUgUlM1QzMxM19BRERSX0lOVElOVFZSRUcJMHgwNworI2RlZmluZSBSUzVDMzEzX0FERFJfREFZCTB4MDgKKyNkZWZpbmUgUlM1QzMxM19BRERSX0RBWTEwCTB4MDkKKyNkZWZpbmUgUlM1QzMxM19BRERSX01PTgkweDBBCisjZGVmaW5lIFJTNUMzMTNfQUREUl9NT04xMAkweDBCCisjZGVmaW5lIFJTNUMzMTNfQUREUl9ZRUFSCTB4MEMKKyNkZWZpbmUgUlM1QzMxM19BRERSX1lFQVIxMAkweDBECisjZGVmaW5lIFJTNUMzMTNfQUREUl9DTlRSRUcJMHgwRQorI2RlZmluZSBSUzVDMzEzX0FERFJfVEVTVFJFRwkweDBGCisKKy8qIFJJQ09IIFJTNUMzMTMgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBSUzVDMzEzX0NOVFJFR19BREpfQlNZCTB4MDEKKyNkZWZpbmUgUlM1QzMxM19DTlRSRUdfV1RFTl9YU1RQCTB4MDIKKyNkZWZpbmUgUlM1QzMxM19DTlRSRUdfMTJfMjQJMHgwNAorI2RlZmluZSBSUzVDMzEzX0NOVFJFR19DVEZHCTB4MDgKKworLyogUklDT0ggUlM1QzMxMyB0ZXN0IHJlZ2lzdGVyICovCisjZGVmaW5lIFJTNUMzMTNfVEVTVFJFR19URVNUCTB4MDEKKworLyogUklDT0ggUlM1QzMxMyBjb250cm9sIGJpdCAqLworI2RlZmluZSBSUzVDMzEzX0NOVEJJVF9SRUFECTB4NDAKKyNkZWZpbmUgUlM1QzMxM19DTlRCSVRfQUQJMHgyMAorI2RlZmluZSBSUzVDMzEzX0NOVEJJVF9EVAkweDEwCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJzNWMzMTNfcmVhZF9yZWcodW5zaWduZWQgY2hhciBhZGRyKQoreworCisJcnM1YzMxM193cml0ZV9kYXRhKGFkZHIgfCBSUzVDMzEzX0NOVEJJVF9SRUFEIHwgUlM1QzMxM19DTlRCSVRfQUQpOworCXJldHVybiByczVjMzEzX3JlYWRfZGF0YSgpOworfQorCitzdGF0aWMgdm9pZCByczVjMzEzX3dyaXRlX3JlZyh1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlkYXRhICY9IDB4MGY7CisJcnM1YzMxM193cml0ZV9kYXRhKGFkZHIgfCBSUzVDMzEzX0NOVEJJVF9BRCk7CisJcnM1YzMxM193cml0ZV9kYXRhKGRhdGEgfCBSUzVDMzEzX0NOVEJJVF9EVCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcnM1YzMxM19yZWFkX2NudHJlZyh2b2lkKQoreworCXJldHVybiByczVjMzEzX3JlYWRfcmVnKFJTNUMzMTNfQUREUl9DTlRSRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnM1YzMxM193cml0ZV9jbnRyZWcodW5zaWduZWQgY2hhciBkYXRhKQoreworCXJzNWMzMTNfd3JpdGVfcmVnKFJTNUMzMTNfQUREUl9DTlRSRUcsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnM1YzMxM193cml0ZV9pbnRpbnR2cmVnKHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlyczVjMzEzX3dyaXRlX3JlZyhSUzVDMzEzX0FERFJfSU5USU5UVlJFRywgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcnM1YzMxM19ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlpbnQgZGF0YTsKKwlpbnQgY250OworCisJY250ID0gMDsKKwl3aGlsZSAoMSkgeworCQlSUzVDMzEzX0NFRU5BQkxFOwkvKiBDRTpIICovCisKKwkJLyogSW5pdGlhbGl6ZSBjb250cm9sIHJlZy4gMjQgaG91ciAqLworCQlyczVjMzEzX3dyaXRlX2NudHJlZygweDA0KTsKKworCQlpZiAoIShyczVjMzEzX3JlYWRfY250cmVnKCkgJiBSUzVDMzEzX0NOVFJFR19BREpfQlNZKSkKKwkJCWJyZWFrOworCisJCVJTNUMzMTNfQ0VESVNBQkxFOworCQluZGVsYXkoNzAwKTsJLyogQ0U6TCAqLworCisJCWlmIChjbnQrKyA+IDEwMCkgeworCQkJZGV2X2VycihkZXYsICIlczogdGltZW91dCBlcnJvclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlkYXRhID0gcnM1YzMxM19yZWFkX3JlZyhSUzVDMzEzX0FERFJfU0VDKTsKKwlkYXRhIHw9IChyczVjMzEzX3JlYWRfcmVnKFJTNUMzMTNfQUREUl9TRUMxMCkgPDwgNCk7CisJdG0tPnRtX3NlYyA9IGJjZDJiaW4oZGF0YSk7CisKKwlkYXRhID0gcnM1YzMxM19yZWFkX3JlZyhSUzVDMzEzX0FERFJfTUlOKTsKKwlkYXRhIHw9IChyczVjMzEzX3JlYWRfcmVnKFJTNUMzMTNfQUREUl9NSU4xMCkgPDwgNCk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4oZGF0YSk7CisKKwlkYXRhID0gcnM1YzMxM19yZWFkX3JlZyhSUzVDMzEzX0FERFJfSE9VUik7CisJZGF0YSB8PSAocnM1YzMxM19yZWFkX3JlZyhSUzVDMzEzX0FERFJfSE9VUjEwKSA8PCA0KTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oZGF0YSk7CisKKwlkYXRhID0gcnM1YzMxM19yZWFkX3JlZyhSUzVDMzEzX0FERFJfREFZKTsKKwlkYXRhIHw9IChyczVjMzEzX3JlYWRfcmVnKFJTNUMzMTNfQUREUl9EQVkxMCkgPDwgNCk7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGRhdGEpOworCisJZGF0YSA9IHJzNWMzMTNfcmVhZF9yZWcoUlM1QzMxM19BRERSX01PTik7CisJZGF0YSB8PSAocnM1YzMxM19yZWFkX3JlZyhSUzVDMzEzX0FERFJfTU9OMTApIDw8IDQpOworCXRtLT50bV9tb24gPSBiY2QyYmluKGRhdGEpIC0gMTsKKworCWRhdGEgPSByczVjMzEzX3JlYWRfcmVnKFJTNUMzMTNfQUREUl9ZRUFSKTsKKwlkYXRhIHw9IChyczVjMzEzX3JlYWRfcmVnKFJTNUMzMTNfQUREUl9ZRUFSMTApIDw8IDQpOworCXRtLT50bV95ZWFyID0gYmNkMmJpbihkYXRhKTsKKworCWlmICh0bS0+dG1feWVhciA8IDcwKQorCQl0bS0+dG1feWVhciArPSAxMDA7CisKKwlkYXRhID0gcnM1YzMxM19yZWFkX3JlZyhSUzVDMzEzX0FERFJfV0VFSyk7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKGRhdGEpOworCisJUlM1QzMxM19DRURJU0FCTEU7CisJbmRlbGF5KDcwMCk7CQkvKiBDRTpMICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByczVjMzEzX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IGRhdGE7CisJaW50IGNudDsKKworCWNudCA9IDA7CisJLyogYnVzeSBjaGVjay4gKi8KKwl3aGlsZSAoMSkgeworCQlSUzVDMzEzX0NFRU5BQkxFOwkvKiBDRTpIICovCisKKwkJLyogSW5pdGlhdGxpemUgY29udHJvbCByZWcuIDI0IGhvdXIgKi8KKwkJcnM1YzMxM193cml0ZV9jbnRyZWcoMHgwNCk7CisKKwkJaWYgKCEocnM1YzMxM19yZWFkX2NudHJlZygpICYgUlM1QzMxM19DTlRSRUdfQURKX0JTWSkpCisJCQlicmVhazsKKwkJUlM1QzMxM19NSVNDT1A7CisJCVJTNUMzMTNfQ0VESVNBQkxFOworCQluZGVsYXkoNzAwKTsJLyogQ0U6TCAqLworCisJCWlmIChjbnQrKyA+IDEwMCkgeworCQkJZGV2X2VycihkZXYsICIlczogdGltZW91dCBlcnJvclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlkYXRhID0gYmluMmJjZCh0bS0+dG1fc2VjKTsKKwlyczVjMzEzX3dyaXRlX3JlZyhSUzVDMzEzX0FERFJfU0VDLCBkYXRhKTsKKwlyczVjMzEzX3dyaXRlX3JlZyhSUzVDMzEzX0FERFJfU0VDMTAsIChkYXRhID4+IDQpKTsKKworCWRhdGEgPSBiaW4yYmNkKHRtLT50bV9taW4pOworCXJzNWMzMTNfd3JpdGVfcmVnKFJTNUMzMTNfQUREUl9NSU4sIGRhdGEgKTsKKwlyczVjMzEzX3dyaXRlX3JlZyhSUzVDMzEzX0FERFJfTUlOMTAsIChkYXRhID4+IDQpKTsKKworCWRhdGEgPSBiaW4yYmNkKHRtLT50bV9ob3VyKTsKKwlyczVjMzEzX3dyaXRlX3JlZyhSUzVDMzEzX0FERFJfSE9VUiwgZGF0YSk7CisJcnM1YzMxM193cml0ZV9yZWcoUlM1QzMxM19BRERSX0hPVVIxMCwgKGRhdGEgPj4gNCkpOworCisJZGF0YSA9IGJpbjJiY2QodG0tPnRtX21kYXkpOworCXJzNWMzMTNfd3JpdGVfcmVnKFJTNUMzMTNfQUREUl9EQVksIGRhdGEpOworCXJzNWMzMTNfd3JpdGVfcmVnKFJTNUMzMTNfQUREUl9EQVkxMCwgKGRhdGE+PiA0KSk7CisKKwlkYXRhID0gYmluMmJjZCh0bS0+dG1fbW9uICsgMSk7CisJcnM1YzMxM193cml0ZV9yZWcoUlM1QzMxM19BRERSX01PTiwgZGF0YSk7CisJcnM1YzMxM193cml0ZV9yZWcoUlM1QzMxM19BRERSX01PTjEwLCAoZGF0YSA+PiA0KSk7CisKKwlkYXRhID0gYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCk7CisJcnM1YzMxM193cml0ZV9yZWcoUlM1QzMxM19BRERSX1lFQVIsIGRhdGEpOworCXJzNWMzMTNfd3JpdGVfcmVnKFJTNUMzMTNfQUREUl9ZRUFSMTAsIChkYXRhID4+IDQpKTsKKworCWRhdGEgPSBiaW4yYmNkKHRtLT50bV93ZGF5KTsKKwlyczVjMzEzX3dyaXRlX3JlZyhSUzVDMzEzX0FERFJfV0VFSywgZGF0YSk7CisKKwlSUzVDMzEzX0NFRElTQUJMRTsJLyogQ0U6SCAqLworCW5kZWxheSg3MDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJzNWMzMTNfY2hlY2tfeHN0cF9iaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJaW50IGNudDsKKworCVJTNUMzMTNfQ0VFTkFCTEU7CS8qIENFOkggKi8KKwlpZiAocnM1YzMxM19yZWFkX2NudHJlZygpICYgUlM1QzMxM19DTlRSRUdfV1RFTl9YU1RQKSB7CisJCS8qIElOVCBpbnRlcnZhbCByZWcuIE9GRiAqLworCQlyczVjMzEzX3dyaXRlX2ludGludHZyZWcoMHgwMCk7CisJCS8qIEluaXRpYWxpemUgY29udHJvbCByZWcuIDI0IGhvdXIgJiBhZGp1c3QgKi8KKwkJcnM1YzMxM193cml0ZV9jbnRyZWcoMHgwNyk7CisKKwkJLyogYnVzeSBjaGVjay4gKi8KKwkJZm9yIChjbnQgPSAwOyBjbnQgPCAxMDA7IGNudCsrKSB7CisJCQlpZiAoIShyczVjMzEzX3JlYWRfY250cmVnKCkgJiBSUzVDMzEzX0NOVFJFR19BREpfQlNZKSkKKwkJCQlicmVhazsKKwkJCVJTNUMzMTNfTUlTQ09QOworCQl9CisKKwkJbWVtc2V0KCZ0bSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOworCQl0bS50bV9tZGF5IAk9IDE7CisJCXRtLnRtX21vbiAJPSAxIC0gMTsKKwkJdG0udG1feWVhciAJPSAyMDAwIC0gMTkwMDsKKworCQlyczVjMzEzX3J0Y19zZXRfdGltZShOVUxMLCAmdG0pOworCQlwcmludGsoS0VSTl9FUlIgIlJJQ0hPIFJTNUMzMTM6IGludmFsaWQgdmFsdWUsIHJlc2V0dGluZyB0byAiCisJCQkJIjEgSmFuIDIwMDBcbiIpOworCX0KKwlSUzVDMzEzX0NFRElTQUJMRTsKKwluZGVsYXkoNzAwKTsJCS8qIENFOkwgKi8KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHJzNWMzMTNfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lID0gcnM1YzMxM19ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IHJzNWMzMTNfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCByczVjMzEzX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJyczVjMzEzIiwgJnBkZXYtPmRldiwKKwkJCQkmcnM1YzMxM19ydGNfb3BzLCBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHJzNWMzMTNfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSggcGRldiApOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcnM1YzMxM19ydGNfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLm5hbWUgICA9IERSVl9OQU1FLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgCT0gcnM1YzMxM19ydGNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCByczVjMzEzX3J0Y19yZW1vdmUgKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJzNWMzMTNfcnRjX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyczVjMzEzX3J0Y19wbGF0Zm9ybV9kcml2ZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyczVjMzEzX2luaXRfcG9ydCgpOworCXJzNWMzMTNfY2hlY2tfeHN0cF9iaXQoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnM1YzMxM19ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCAmcnM1YzMxM19ydGNfcGxhdGZvcm1fZHJpdmVyICk7Cit9CisKK21vZHVsZV9pbml0KHJzNWMzMTNfcnRjX2luaXQpOworbW9kdWxlX2V4aXQocnM1YzMxM19ydGNfZXhpdCk7CisKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoImtvZ2lpZGVuYSAsIE5vYnVoaXJvIEl3YW1hdHN1IDxpd2FtYXRzdUBuaWdhdXJpLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmljb2ggUlM1QzMxMyBSVEMgZGV2aWNlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1yczVjMzQ4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNWM3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM0OC5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogQSBTUEkgZHJpdmVyIGZvciB0aGUgUmljb2ggUlM1QzM0OCBSVEMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXRzdXNoaSBOZW1vdG8gPGFuZW1vQG1iYS5vY24ubmUuanA+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGUgYm9hcmQgc3BlY2lmaWMgaW5pdCBjb2RlIHNob3VsZCBwcm92aWRlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGlzCisgKiBkZXZpY2U6CisgKiAgICAgTW9kZSAxIChIaWdoLUFjdGl2ZSwgU2hpZnQtVGhlbi1TYW1wbGUpLCBIaWdoIEF2dGl2ZSBDUworICovCisKKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMiIKKworI2RlZmluZSBSUzVDMzQ4X1JFR19TRUNTCTAKKyNkZWZpbmUgUlM1QzM0OF9SRUdfTUlOUwkxCisjZGVmaW5lIFJTNUMzNDhfUkVHX0hPVVJTCTIKKyNkZWZpbmUgUlM1QzM0OF9SRUdfV0RBWQkzCisjZGVmaW5lIFJTNUMzNDhfUkVHX0RBWQk0CisjZGVmaW5lIFJTNUMzNDhfUkVHX01PTlRICTUKKyNkZWZpbmUgUlM1QzM0OF9SRUdfWUVBUgk2CisjZGVmaW5lIFJTNUMzNDhfUkVHX0NUTDEJMTQKKyNkZWZpbmUgUlM1QzM0OF9SRUdfQ1RMMgkxNQorCisjZGVmaW5lIFJTNUMzNDhfU0VDU19NQVNLCTB4N2YKKyNkZWZpbmUgUlM1QzM0OF9NSU5TX01BU0sJMHg3ZgorI2RlZmluZSBSUzVDMzQ4X0hPVVJTX01BU0sJMHgzZgorI2RlZmluZSBSUzVDMzQ4X1dEQVlfTUFTSwkweDAzCisjZGVmaW5lIFJTNUMzNDhfREFZX01BU0sJMHgzZgorI2RlZmluZSBSUzVDMzQ4X01PTlRIX01BU0sJMHgxZgorCisjZGVmaW5lIFJTNUMzNDhfQklUX1BNCTB4MjAJLyogUkVHX0hPVVJTICovCisjZGVmaW5lIFJTNUMzNDhfQklUX1kySwkweDgwCS8qIFJFR19NT05USCAqLworI2RlZmluZSBSUzVDMzQ4X0JJVF8yNEgJMHgyMAkvKiBSRUdfQ1RMMSAqLworI2RlZmluZSBSUzVDMzQ4X0JJVF9YU1RQCTB4MTAJLyogUkVHX0NUTDIgKi8KKyNkZWZpbmUgUlM1QzM0OF9CSVRfVkRFVAkweDQwCS8qIFJFR19DVEwyICovCisKKyNkZWZpbmUgUlM1QzM0OF9DTURfVyhhZGRyKQkoKChhZGRyKSA8PCA0KSB8IDB4MDgpCS8qIHNpbmdsZSB3cml0ZSAqLworI2RlZmluZSBSUzVDMzQ4X0NNRF9SKGFkZHIpCSgoKGFkZHIpIDw8IDQpIHwgMHgwYykJLyogc2luZ2xlIHJlYWQgKi8KKyNkZWZpbmUgUlM1QzM0OF9DTURfTVcoYWRkcikJKCgoYWRkcikgPDwgNCkgfCAweDAwKQkvKiBidXJzdCB3cml0ZSAqLworI2RlZmluZSBSUzVDMzQ4X0NNRF9NUihhZGRyKQkoKChhZGRyKSA8PCA0KSB8IDB4MDQpCS8qIGJ1cnN0IHJlYWQgKi8KKworc3RydWN0IHJzNWMzNDhfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWludCBydGNfMjRoOworfTsKKworc3RhdGljIGludAorcnM1YzM0OF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IHJzNWMzNDhfcGxhdF9kYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdTggdHhidWZbNSs3XSwgKnR4cDsKKwlpbnQgcmV0OworCisJLyogVHJhbnNmZXIgNSBieXRlcyBiZWZvcmUgd3JpdGluZyBTRUMuICBUaGlzIGdpdmVzIDMxdXMgZm9yIGNhcnJ5LiAqLworCXR4cCA9IHR4YnVmOworCXR4YnVmWzBdID0gUlM1QzM0OF9DTURfUihSUzVDMzQ4X1JFR19DVEwyKTsgLyogY21kLCBjdGwyICovCisJdHhidWZbMV0gPSAwOwkvKiBkdW1teSAqLworCXR4YnVmWzJdID0gUlM1QzM0OF9DTURfUihSUzVDMzQ4X1JFR19DVEwyKTsgLyogY21kLCBjdGwyICovCisJdHhidWZbM10gPSAwOwkvKiBkdW1teSAqLworCXR4YnVmWzRdID0gUlM1QzM0OF9DTURfTVcoUlM1QzM0OF9SRUdfU0VDUyk7IC8qIGNtZCwgc2VjLCAuLi4gKi8KKwl0eHAgPSAmdHhidWZbNV07CisJdHhwW1JTNUMzNDhfUkVHX1NFQ1NdID0gYmluMmJjZCh0bS0+dG1fc2VjKTsKKwl0eHBbUlM1QzM0OF9SRUdfTUlOU10gPSBiaW4yYmNkKHRtLT50bV9taW4pOworCWlmIChwZGF0YS0+cnRjXzI0aCkgeworCQl0eHBbUlM1QzM0OF9SRUdfSE9VUlNdID0gYmluMmJjZCh0bS0+dG1faG91cik7CisJfSBlbHNlIHsKKwkJLyogaG91ciAwIGlzIEFNMTIsIG5vb24gaXMgUE0xMiAqLworCQl0eHBbUlM1QzM0OF9SRUdfSE9VUlNdID0gYmluMmJjZCgodG0tPnRtX2hvdXIgKyAxMSkgJSAxMiArIDEpIHwKKwkJCSh0bS0+dG1faG91ciA+PSAxMiA/IFJTNUMzNDhfQklUX1BNIDogMCk7CisJfQorCXR4cFtSUzVDMzQ4X1JFR19XREFZXSA9IGJpbjJiY2QodG0tPnRtX3dkYXkpOworCXR4cFtSUzVDMzQ4X1JFR19EQVldID0gYmluMmJjZCh0bS0+dG1fbWRheSk7CisJdHhwW1JTNUMzNDhfUkVHX01PTlRIXSA9IGJpbjJiY2QodG0tPnRtX21vbiArIDEpIHwKKwkJKHRtLT50bV95ZWFyID49IDEwMCA/IFJTNUMzNDhfQklUX1kySyA6IDApOworCXR4cFtSUzVDMzQ4X1JFR19ZRUFSXSA9IGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApOworCS8qIHdyaXRlIGluIG9uZSB0cmFuc2ZlciB0byBhdm9pZCBkYXRhIGluY29uc2lzdGVuY3kgKi8KKwlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgdHhidWYsIHNpemVvZih0eGJ1ZiksIE5VTEwsIDApOworCXVkZWxheSg2Mik7CS8qIFRjc3IgNjJ1cyAqLworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3JzNWMzNDhfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnM1YzM0OF9wbGF0X2RhdGEgKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1OCB0eGJ1Zls1XSwgcnhidWZbN107CisJaW50IHJldDsKKworCS8qIFRyYW5zZmVyIDUgYnl0ZSBiZWZvcmVzIHJlYWRpbmcgU0VDLiAgVGhpcyBnaXZlcyAzMXVzIGZvciBjYXJyeS4gKi8KKwl0eGJ1ZlswXSA9IFJTNUMzNDhfQ01EX1IoUlM1QzM0OF9SRUdfQ1RMMik7IC8qIGNtZCwgY3RsMiAqLworCXR4YnVmWzFdID0gMDsJLyogZHVtbXkgKi8KKwl0eGJ1ZlsyXSA9IFJTNUMzNDhfQ01EX1IoUlM1QzM0OF9SRUdfQ1RMMik7IC8qIGNtZCwgY3RsMiAqLworCXR4YnVmWzNdID0gMDsJLyogZHVtbXkgKi8KKwl0eGJ1Zls0XSA9IFJTNUMzNDhfQ01EX01SKFJTNUMzNDhfUkVHX1NFQ1MpOyAvKiBjbWQsIHNlYywgLi4uICovCisKKwkvKiByZWFkIGluIG9uZSB0cmFuc2ZlciB0byBhdm9pZCBkYXRhIGluY29uc2lzdGVuY3kgKi8KKwlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgdHhidWYsIHNpemVvZih0eGJ1ZiksCisJCQkJICByeGJ1Ziwgc2l6ZW9mKHJ4YnVmKSk7CisJdWRlbGF5KDYyKTsJLyogVGNzciA2MnVzICovCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihyeGJ1ZltSUzVDMzQ4X1JFR19TRUNTXSAmIFJTNUMzNDhfU0VDU19NQVNLKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbihyeGJ1ZltSUzVDMzQ4X1JFR19NSU5TXSAmIFJTNUMzNDhfTUlOU19NQVNLKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4ocnhidWZbUlM1QzM0OF9SRUdfSE9VUlNdICYgUlM1QzM0OF9IT1VSU19NQVNLKTsKKwlpZiAoIXBkYXRhLT5ydGNfMjRoKSB7CisJCWlmIChyeGJ1ZltSUzVDMzQ4X1JFR19IT1VSU10gJiBSUzVDMzQ4X0JJVF9QTSkgeworCQkJdG0tPnRtX2hvdXIgLT0gMjA7CisJCQl0bS0+dG1faG91ciAlPSAxMjsKKwkJCXRtLT50bV9ob3VyICs9IDEyOworCQl9IGVsc2UKKwkJCXRtLT50bV9ob3VyICU9IDEyOworCX0KKwl0bS0+dG1fd2RheSA9IGJjZDJiaW4ocnhidWZbUlM1QzM0OF9SRUdfV0RBWV0gJiBSUzVDMzQ4X1dEQVlfTUFTSyk7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHJ4YnVmW1JTNUMzNDhfUkVHX0RBWV0gJiBSUzVDMzQ4X0RBWV9NQVNLKTsKKwl0bS0+dG1fbW9uID0KKwkJYmNkMmJpbihyeGJ1ZltSUzVDMzQ4X1JFR19NT05USF0gJiBSUzVDMzQ4X01PTlRIX01BU0spIC0gMTsKKwkvKiB5ZWFyIGlzIDE5MDAgKyB0bS0+dG1feWVhciAqLworCXRtLT50bV95ZWFyID0gYmNkMmJpbihyeGJ1ZltSUzVDMzQ4X1JFR19ZRUFSXSkgKworCQkoKHJ4YnVmW1JTNUMzNDhfUkVHX01PTlRIXSAmIFJTNUMzNDhfQklUX1kySykgPyAxMDAgOiAwKTsKKworCWlmIChydGNfdmFsaWRfdG0odG0pIDwgMCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgInJldHJpZXZlZCBkYXRlL3RpbWUgaXMgbm90IHZhbGlkLlxuIik7CisJCXJ0Y190aW1lX3RvX3RtKDAsIHRtKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHJzNWMzNDhfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gcnM1YzM0OF9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHJzNWMzNDhfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHJzNWMzNDhfZHJpdmVyOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCByczVjMzQ4X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCByczVjMzQ4X3BsYXRfZGF0YSAqcGRhdGE7CisKKwlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByczVjMzQ4X3BsYXRfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXNwaS0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKworCS8qIENoZWNrIEQ3IG9mIFNFQ09ORCByZWdpc3RlciAqLworCXJldCA9IHNwaV93OHI4KHNwaSwgUlM1QzM0OF9DTURfUihSUzVDMzQ4X1JFR19TRUNTKSk7CisJaWYgKHJldCA8IDAgfHwgKHJldCAmIDB4ODApKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm90IGZvdW5kLlxuIik7CisJCWdvdG8ga2ZyZWVfZXhpdDsKKwl9CisKKwlkZXZfaW5mbygmc3BpLT5kZXYsICJjaGlwIGZvdW5kLCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWRldl9pbmZvKCZzcGktPmRldiwgInNwaWNsayAldSBLSHouXG4iLAorCQkgKHNwaS0+bWF4X3NwZWVkX2h6ICsgNTAwKSAvIDEwMDApOworCisJLyogdHVybiBSVEMgb24gaWYgaXQgd2FzIG5vdCBvbiAqLworCXJldCA9IHNwaV93OHI4KHNwaSwgUlM1QzM0OF9DTURfUihSUzVDMzQ4X1JFR19DVEwyKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8ga2ZyZWVfZXhpdDsKKwlpZiAocmV0ICYgKFJTNUMzNDhfQklUX1hTVFAgfCBSUzVDMzQ4X0JJVF9WREVUKSkgeworCQl1OCBidWZbMl07CisJCXN0cnVjdCBydGNfdGltZSB0bTsKKwkJaWYgKHJldCAmIFJTNUMzNDhfQklUX1ZERVQpCisJCQlkZXZfd2Fybigmc3BpLT5kZXYsICJ2b2x0YWdlLWxvdyBkZXRlY3RlZC5cbiIpOworCQlpZiAocmV0ICYgUlM1QzM0OF9CSVRfWFNUUCkKKwkJCWRldl93YXJuKCZzcGktPmRldiwgIm9zY2lsbGF0b3Itc3RvcCBkZXRlY3RlZC5cbiIpOworCQlydGNfdGltZV90b190bSgwLCAmdG0pOwkvKiAxOTcwLzEvMSAqLworCQlyZXQgPSByczVjMzQ4X3J0Y19zZXRfdGltZSgmc3BpLT5kZXYsICZ0bSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBrZnJlZV9leGl0OworCQlidWZbMF0gPSBSUzVDMzQ4X0NNRF9XKFJTNUMzNDhfUkVHX0NUTDIpOworCQlidWZbMV0gPSAwOworCQlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBrZnJlZV9leGl0OworCX0KKworCXJldCA9IHNwaV93OHI4KHNwaSwgUlM1QzM0OF9DTURfUihSUzVDMzQ4X1JFR19DVEwxKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8ga2ZyZWVfZXhpdDsKKwlpZiAocmV0ICYgUlM1QzM0OF9CSVRfMjRIKQorCQlwZGF0YS0+cnRjXzI0aCA9IDE7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHJzNWMzNDhfZHJpdmVyLmRyaXZlci5uYW1lLCAmc3BpLT5kZXYsCisJCQkJICAmcnM1YzM0OF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMpOworCQlnb3RvIGtmcmVlX2V4aXQ7CisJfQorCisJcGRhdGEtPnJ0YyA9IHJ0YzsKKworCXJldHVybiAwOworIGtmcmVlX2V4aXQ6CisJa2ZyZWUocGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHJzNWMzNDhfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJzNWMzNDhfcGxhdF9kYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBkYXRhLT5ydGM7CisKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlrZnJlZShwZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciByczVjMzQ4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJydGMtcnM1YzM0OCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCT0gcnM1YzM0OF9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AocnM1YzM0OF9yZW1vdmUpLAorfTsKKworbW9kdWxlX3NwaV9kcml2ZXIocnM1YzM0OF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmljb2ggUlM1QzM0OCBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQUxJQVMoInNwaTpydGMtcnM1YzM0OCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0ODQyYwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiBBbiBJMkMgZHJpdmVyIGZvciBSaWNvaCBSUzVDMzcyLCBSMjAyNVMvRCBhbmQgUlY1QzM4WzY3XSBSVENzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdmVsIE1pcm9uY2hpayA8cG1pcm9uY2hpa0BvcHRpZmFjaW8ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRvd2VyIFRlY2hub2xvZ2llcworICogQ29weXJpZ2h0IChDKSAyMDA4IFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNiIKKworCisvKgorICogUmljb2ggaGFzIGEgZmFtaWx5IG9mIEkyQyBiYXNlZCBSVENzLCB3aGljaCBkaWZmZXIgb25seSBzbGlnaHRseSBmcm9tCisgKiBlYWNoIG90aGVyLiAgRGlmZmVyZW5jZXMgY2VudGVyIG9uIHBpbm91dCAoZS5nLiBob3cgbWFueSBpbnRlcnJ1cHRzLAorICogb3V0cHV0IGNsb2NrLCBldGMpIGFuZCBob3cgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSB1c2VkLiAgVGhlICczNzIKKyAqIGlzIHNpZ25pZmljYW50IG9ubHkgYmVjYXVzZSB0aGF0J3MgdGhlIG9uZSB0aGlzIGRyaXZlciBmaXJzdCBzdXBwb3J0ZWQuCisgKi8KKyNkZWZpbmUgUlM1QzM3Ml9SRUdfU0VDUwkwCisjZGVmaW5lIFJTNUMzNzJfUkVHX01JTlMJMQorI2RlZmluZSBSUzVDMzcyX1JFR19IT1VSUwkyCisjZGVmaW5lIFJTNUMzNzJfUkVHX1dEQVkJMworI2RlZmluZSBSUzVDMzcyX1JFR19EQVkJCTQKKyNkZWZpbmUgUlM1QzM3Ml9SRUdfTU9OVEgJNQorI2RlZmluZSBSUzVDMzcyX1JFR19ZRUFSCTYKKyNkZWZpbmUgUlM1QzM3Ml9SRUdfVFJJTQk3CisjCWRlZmluZSBSUzVDMzcyX1RSSU1fWFNMCQkweDgwCisjCWRlZmluZSBSUzVDMzcyX1RSSU1fTUFTSwkweDdGCisKKyNkZWZpbmUgUlM1Q19SRUdfQUxBUk1fQV9NSU4JOAkJCS8qIG9yIEFMQVJNX1cgKi8KKyNkZWZpbmUgUlM1Q19SRUdfQUxBUk1fQV9IT1VSUwk5CisjZGVmaW5lIFJTNUNfUkVHX0FMQVJNX0FfV0RBWQkxMAorCisjZGVmaW5lIFJTNUNfUkVHX0FMQVJNX0JfTUlOCTExCQkJLyogb3IgQUxBUk1fRCAqLworI2RlZmluZSBSUzVDX1JFR19BTEFSTV9CX0hPVVJTCTEyCisjZGVmaW5lIFJTNUNfUkVHX0FMQVJNX0JfV0RBWQkxMwkJCS8qIChBTEFSTV9CIG9ubHkpICovCisKKyNkZWZpbmUgUlM1Q19SRUdfQ1RSTDEJCTE0CisjCWRlZmluZSBSUzVDX0NUUkwxX0FBTEUJCSgxIDw8IDcpCS8qIG9yIFdBTEUgKi8KKyMJZGVmaW5lIFJTNUNfQ1RSTDFfQkFMRQkJKDEgPDwgNikJLyogb3IgREFMRSAqLworIwlkZWZpbmUgUlY1QzM4N19DVFJMMV8yNAkJKDEgPDwgNSkKKyMJZGVmaW5lIFJTNUMzNzJBX0NUUkwxX1NMMQkoMSA8PCA1KQorIwlkZWZpbmUgUlM1Q19DVFJMMV9DVF9NQVNLCSg3IDw8IDApCisjCWRlZmluZSBSUzVDX0NUUkwxX0NUMAkJKDAgPDwgMCkJLyogbm8gcGVyaW9kaWMgaXJxICovCisjCWRlZmluZSBSUzVDX0NUUkwxX0NUNAkJKDQgPDwgMCkJLyogMSBIeiBsZXZlbCBpcnEgKi8KKyNkZWZpbmUgUlM1Q19SRUdfQ1RSTDIJCTE1CisjCWRlZmluZSBSUzVDMzcyX0NUUkwyXzI0CQkoMSA8PCA1KQorIwlkZWZpbmUgUjIwMjVfQ1RSTDJfWFNUCQkoMSA8PCA1KQorIwlkZWZpbmUgUlM1Q19DVFJMMl9YU1RQCQkoMSA8PCA0KQkvKiBvbmx5IGlmICFSMjAyNVMvRCAqLworIwlkZWZpbmUgUlM1Q19DVFJMMl9DVEZHCQkoMSA8PCAyKQorIwlkZWZpbmUgUlM1Q19DVFJMMl9BQUZHCQkoMSA8PCAxKQkvKiBvciBXQUZHICovCisjCWRlZmluZSBSUzVDX0NUUkwyX0JBRkcJCSgxIDw8IDApCS8qIG9yIERBRkcgKi8KKworCisvKiB0byByZWFkIChzdHlsZSAxKSBvciB3cml0ZSByZWdpc3RlcnMgc3RhcnRpbmcgYXQgUiAqLworI2RlZmluZSBSUzVDX0FERFIoUikJCSgoKFIpIDw8IDQpIHwgMCkKKworCitlbnVtIHJ0Y190eXBlIHsKKwlydGNfdW5kZWYgPSAwLAorCXJ0Y19yMjAyNXNkLAorCXJ0Y19yczVjMzcyYSwKKwlydGNfcnM1YzM3MmIsCisJcnRjX3J2NWMzODYsCisJcnRjX3J2NWMzODdhLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHJzNWMzNzJfaWRbXSA9IHsKKwl7ICJyMjAyNXNkIiwgcnRjX3IyMDI1c2QgfSwKKwl7ICJyczVjMzcyYSIsIHJ0Y19yczVjMzcyYSB9LAorCXsgInJzNWMzNzJiIiwgcnRjX3JzNWMzNzJiIH0sCisJeyAicnY1YzM4NiIsIHJ0Y19ydjVjMzg2IH0sCisJeyAicnY1YzM4N2EiLCBydGNfcnY1YzM4N2EgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcnM1YzM3Ml9pZCk7CisKKy8qIFJFVklTSVQ6ICB0aGlzIGFzc3VtZXMgdGhhdDoKKyAqICAtIHdlJ3JlIGluIHRoZSAyMXN0IGNlbnR1cnksIHNvIGl0J3Mgc2FmZSB0byBpZ25vcmUgdGhlIGNlbnR1cnkKKyAqICAgIGJpdCBmb3IgcnY1YzM4WzY3XSAoUkVHX01PTlRIIGJpdCA3KTsKKyAqICAtIHdlIHNob3VsZCB1c2UgQUxBUk1fQSBub3QgQUxBUk1fQiAobWF5IGJlIHdyb25nIG9uIHNvbWUgYm9hcmRzKQorICovCitzdHJ1Y3QgcnM1YzM3MiB7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCWVudW0gcnRjX3R5cGUJCXR5cGU7CisJdW5zaWduZWQJCXRpbWUyNDoxOworCXVuc2lnbmVkCQloYXNfaXJxOjE7CisJdW5zaWduZWQJCXNtYnVzOjE7CisJY2hhcgkJCWJ1ZlsxN107CisJY2hhcgkJCSpyZWdzOworfTsKKworc3RhdGljIGludCByczVjX2dldF9yZWdzKHN0cnVjdCByczVjMzcyICpyczVjKQoreworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQgPSByczVjLT5jbGllbnQ7CisJc3RydWN0IGkyY19tc2cJCW1zZ3NbXSA9IHsKKwkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCBzaXplb2YgcnM1Yy0+YnVmLCByczVjLT5idWYgfSwKKwl9OworCisJLyogVGhpcyBpbXBsZW1lbnRzIHRoZSB0aGlyZCByZWFkaW5nIG1ldGhvZCBmcm9tIHRoZSBkYXRhc2hlZXQsIHVzaW5nCisJICogYW4gaW50ZXJuYWwgYWRkcmVzcyB0aGF0J3MgcmVzZXQgYWZ0ZXIgZWFjaCB0cmFuc2FjdGlvbiAoYnkgU1RPUCkKKwkgKiB0byAweDBmIC4uLiBzbyB3ZSByZWFkIGV4dHJhIHJlZ2lzdGVycywgYW5kIHNraXAgdGhlIGZpcnN0IG9uZS4KKwkgKgorCSAqIFRoZSBmaXJzdCBtZXRob2QgZG9lc24ndCB3b3JrIHdpdGggdGhlIGlvcDN4eCBhZGFwdGVyIGRyaXZlciwgb24gYXQKKwkgKiBsZWFzdCA4MDIxOSBjaGlwczsgdGhpcyB3b3JrcyBhcm91bmQgdGhhdCBidWcuCisJICoKKwkgKiBUaGUgdGhpcmQgbWV0aG9kIG9uIHRoZSBvdGhlciBoYW5kIGRvZXNuJ3Qgd29yayBmb3IgdGhlIFNNQnVzLW9ubHkKKwkgKiBjb25maWd1cmF0aW9ucywgc28gd2UgdXNlIHRoZSB0aGUgZmlyc3QgbWV0aG9kIHRoZXJlLCBzdHJpcHBpbmcgb2ZmCisJICogdGhlIGV4dHJhIHJlZ2lzdGVyIGluIHRoZSBwcm9jZXNzLgorCSAqLworCWlmIChyczVjLT5zbWJ1cykgeworCQlpbnQgYWRkciA9IFJTNUNfQUREUihSUzVDMzcyX1JFR19TRUNTKTsKKwkJaW50IHNpemUgPSBzaXplb2YocnM1Yy0+YnVmKSAtIDE7CisKKwkJaWYgKGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgYWRkciwgc2l6ZSwKKwkJCQkJCSAgcnM1Yy0+YnVmICsgMSkgIT0gc2l6ZSkgeworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiY2FuJ3QgcmVhZCByZWdpc3RlcnNcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDEpKSAhPSAxKSB7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJjYW4ndCByZWFkIHJlZ2lzdGVyc1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkiJTAyeCAlMDJ4ICUwMnggKCUwMngpICUwMnggJTAyeCAlMDJ4ICglMDJ4KSwgIgorCQkiJTAyeCAlMDJ4ICUwMngsICUwMnggJTAyeCAlMDJ4OyAlMDJ4ICUwMnhcbiIsCisJCXJzNWMtPnJlZ3NbMF0sICByczVjLT5yZWdzWzFdLCAgcnM1Yy0+cmVnc1syXSwgIHJzNWMtPnJlZ3NbM10sCisJCXJzNWMtPnJlZ3NbNF0sICByczVjLT5yZWdzWzVdLCAgcnM1Yy0+cmVnc1s2XSwgIHJzNWMtPnJlZ3NbN10sCisJCXJzNWMtPnJlZ3NbOF0sICByczVjLT5yZWdzWzldLCAgcnM1Yy0+cmVnc1sxMF0sIHJzNWMtPnJlZ3NbMTFdLAorCQlyczVjLT5yZWdzWzEyXSwgcnM1Yy0+cmVnc1sxM10sIHJzNWMtPnJlZ3NbMTRdLCByczVjLT5yZWdzWzE1XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIHJzNWNfcmVnMmhyKHN0cnVjdCByczVjMzcyICpyczVjLCB1bnNpZ25lZCByZWcpCit7CisJdW5zaWduZWQJaG91cjsKKworCWlmIChyczVjLT50aW1lMjQpCisJCXJldHVybiBiY2QyYmluKHJlZyAmIDB4M2YpOworCisJaG91ciA9IGJjZDJiaW4ocmVnICYgMHgxZik7CisJaWYgKGhvdXIgPT0gMTIpCisJCWhvdXIgPSAwOworCWlmIChyZWcgJiAweDIwKQorCQlob3VyICs9IDEyOworCXJldHVybiBob3VyOworfQorCitzdGF0aWMgdW5zaWduZWQgcnM1Y19ocjJyZWcoc3RydWN0IHJzNWMzNzIgKnJzNWMsIHVuc2lnbmVkIGhvdXIpCit7CisJaWYgKHJzNWMtPnRpbWUyNCkKKwkJcmV0dXJuIGJpbjJiY2QoaG91cik7CisKKwlpZiAoaG91ciA+IDEyKQorCQlyZXR1cm4gMHgyMCB8IGJpbjJiY2QoaG91ciAtIDEyKTsKKwlpZiAoaG91ciA9PSAxMikKKwkJcmV0dXJuIDB4MjAgfCBiaW4yYmNkKDEyKTsKKwlpZiAoaG91ciA9PSAwKQorCQlyZXR1cm4gYmluMmJjZCgxMik7CisJcmV0dXJuIGJpbjJiY2QoaG91cik7Cit9CisKK3N0YXRpYyBpbnQgcnM1YzM3Ml9nZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcnM1YzM3MgkqcnM1YyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludAkJc3RhdHVzID0gcnM1Y19nZXRfcmVncyhyczVjKTsKKworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4ocnM1Yy0+cmVnc1tSUzVDMzcyX1JFR19TRUNTXSAmIDB4N2YpOworCXRtLT50bV9taW4gPSBiY2QyYmluKHJzNWMtPnJlZ3NbUlM1QzM3Ml9SRUdfTUlOU10gJiAweDdmKTsKKwl0bS0+dG1faG91ciA9IHJzNWNfcmVnMmhyKHJzNWMsIHJzNWMtPnJlZ3NbUlM1QzM3Ml9SRUdfSE9VUlNdKTsKKworCXRtLT50bV93ZGF5ID0gYmNkMmJpbihyczVjLT5yZWdzW1JTNUMzNzJfUkVHX1dEQVldICYgMHgwNyk7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHJzNWMtPnJlZ3NbUlM1QzM3Ml9SRUdfREFZXSAmIDB4M2YpOworCisJLyogdG0tPnRtX21vbiBpcyB6ZXJvLWJhc2VkICovCisJdG0tPnRtX21vbiA9IGJjZDJiaW4ocnM1Yy0+cmVnc1tSUzVDMzcyX1JFR19NT05USF0gJiAweDFmKSAtIDE7CisKKwkvKiB5ZWFyIGlzIDE5MDAgKyB0bS0+dG1feWVhciAqLworCXRtLT50bV95ZWFyID0gYmNkMmJpbihyczVjLT5yZWdzW1JTNUMzNzJfUkVHX1lFQVJdKSArIDEwMDsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IHRtIGlzIHNlY3M9JWQsIG1pbnM9JWQsIGhvdXJzPSVkLCAiCisJCSJtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCV9fZnVuY19fLAorCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKKwkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisKKwkvKiBydGMgbWlnaHQgbmVlZCBpbml0aWFsaXphdGlvbiAqLworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IHJzNWMzNzJfc2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHJzNWMzNzIJKnJzNWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBjaGFyCWJ1Zls3XTsKKwlpbnQJCWFkZHI7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiB0bSBpcyBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCAiCisJCSJtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCV9fZnVuY19fLAorCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKKwkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisKKwlhZGRyICAgPSBSUzVDX0FERFIoUlM1QzM3Ml9SRUdfU0VDUyk7CisJYnVmWzBdID0gYmluMmJjZCh0bS0+dG1fc2VjKTsKKwlidWZbMV0gPSBiaW4yYmNkKHRtLT50bV9taW4pOworCWJ1ZlsyXSA9IHJzNWNfaHIycmVnKHJzNWMsIHRtLT50bV9ob3VyKTsKKwlidWZbM10gPSBiaW4yYmNkKHRtLT50bV93ZGF5KTsKKwlidWZbNF0gPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlidWZbNV0gPSBiaW4yYmNkKHRtLT50bV9tb24gKyAxKTsKKwlidWZbNl0gPSBiaW4yYmNkKHRtLT50bV95ZWFyIC0gMTAwKTsKKworCWlmIChpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCBhZGRyLCBzaXplb2YoYnVmKSwgYnVmKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogd3JpdGUgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DX01PRFVMRSkKKyNkZWZpbmUJTkVFRF9UUklNCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9TWVNGU19NT0RVTEUpCisjZGVmaW5lCU5FRURfVFJJTQorI2VuZGlmCisKKyNpZmRlZglORUVEX1RSSU0KK3N0YXRpYyBpbnQgcnM1YzM3Ml9nZXRfdHJpbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgKm9zYywgaW50ICp0cmltKQoreworCXN0cnVjdCByczVjMzcyICpyczVjMzcyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggdG1wID0gcnM1YzM3Mi0+cmVnc1tSUzVDMzcyX1JFR19UUklNXTsKKworCWlmIChvc2MpCisJCSpvc2MgPSAodG1wICYgUlM1QzM3Ml9UUklNX1hTTCkgPyAzMjAwMCA6IDMyNzY4OworCisJaWYgKHRyaW0pIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogcmF3IHRyaW09JXhcbiIsIF9fZnVuY19fLCB0bXApOworCQl0bXAgJj0gUlM1QzM3Ml9UUklNX01BU0s7CisJCWlmICh0bXAgJiAweDNlKSB7CisJCQlpbnQgdCA9IHRtcCAmIDB4M2Y7CisKKwkJCWlmICh0bXAgJiAweDQwKQorCQkJCXQgPSAofnQgfCAoczgpMHhjMCkgKyAxOworCQkJZWxzZQorCQkJCXQgPSB0IC0gMTsKKworCQkJdG1wID0gdCAqIDI7CisJCX0gZWxzZQorCQkJdG1wID0gMDsKKwkJKnRyaW0gPSB0bXA7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCByczVjMzcyX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiByczVjMzcyX2dldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludCByczVjMzcyX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIHJzNWMzNzJfc2V0X2RhdGV0aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOworfQorCisKK3N0YXRpYyBpbnQgcnM1Y19ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHJzNWMzNzIJCSpyczVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgY2hhcgkJYnVmOworCWludAkJCXN0YXR1cywgYWRkcjsKKworCWJ1ZiA9IHJzNWMtPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdOworCisJaWYgKCFyczVjLT5oYXNfaXJxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1cyA9IHJzNWNfZ2V0X3JlZ3MocnM1Yyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlhZGRyID0gUlM1Q19BRERSKFJTNUNfUkVHX0NUUkwxKTsKKwlpZiAoZW5hYmxlZCkKKwkJYnVmIHw9IFJTNUNfQ1RSTDFfQUFMRTsKKwllbHNlCisJCWJ1ZiAmPSB+UlM1Q19DVFJMMV9BQUxFOworCisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBhZGRyLCBidWYpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgdXBkYXRlIGFsYXJtXG4iLAorCQkJcnM1Yy0+cnRjLT5uYW1lKTsKKwkJc3RhdHVzID0gLUVJTzsKKwl9IGVsc2UKKwkJcnM1Yy0+cmVnc1tSUzVDX1JFR19DVFJMMV0gPSBidWY7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qIE5PVEU6ICBTaW5jZSBSVENfV0tBTE1fe1JELFNFVH0gd2VyZSBvcmlnaW5hbGx5IGRlZmluZWQgZm9yIEVGSSwKKyAqIHdoaWNoIG9ubHkgZXhwb3NlcyBhIHBvbGxlZCBwcm9ncmFtbWluZyBpbnRlcmZhY2U7IGFuZCBzaW5jZQorICogdGhlc2UgY2FsbHMgbWFwIGRpcmVjdGx5IHRvIHRob3NlIEVGSSByZXF1ZXN0czsgd2UgZG9uJ3QgZGVtYW5kCisgKiB3ZSBoYXZlIGFuIElSUSBmb3IgdGhpcyBjaGlwIHdoZW4gd2UgZ28gdGhyb3VnaCB0aGlzIEFQSS4KKyAqCisgKiBUaGUgb2xkZXIgeDg2X3BjIGRlcml2ZWQgUlRDX0FMTV97UkVBRCxTRVR9IGNhbGxzIHJlcXVpcmUgaXJxcworICogdGhvdWdoLCBtYW5hZ2VkIHRocm91Z2ggUlRDX0FJRV97T04sT0ZGfSByZXF1ZXN0cy4KKyAqLworCitzdGF0aWMgaW50IHJzNWNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQoreworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHJzNWMzNzIJCSpyczVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50CQkJc3RhdHVzOworCisJc3RhdHVzID0gcnM1Y19nZXRfcmVncyhyczVjKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIHJlcG9ydCBhbGFybSB0aW1lICovCisJdC0+dGltZS50bV9zZWMgPSAwOworCXQtPnRpbWUudG1fbWluID0gYmNkMmJpbihyczVjLT5yZWdzW1JTNUNfUkVHX0FMQVJNX0FfTUlOXSAmIDB4N2YpOworCXQtPnRpbWUudG1faG91ciA9IHJzNWNfcmVnMmhyKHJzNWMsIHJzNWMtPnJlZ3NbUlM1Q19SRUdfQUxBUk1fQV9IT1VSU10pOworCXQtPnRpbWUudG1fbWRheSA9IC0xOworCXQtPnRpbWUudG1fbW9uID0gLTE7CisJdC0+dGltZS50bV95ZWFyID0gLTE7CisJdC0+dGltZS50bV93ZGF5ID0gLTE7CisJdC0+dGltZS50bV95ZGF5ID0gLTE7CisJdC0+dGltZS50bV9pc2RzdCA9IC0xOworCisJLyogLi4uIGFuZCBzdGF0dXMgKi8KKwl0LT5lbmFibGVkID0gISEocnM1Yy0+cmVnc1tSUzVDX1JFR19DVFJMMV0gJiBSUzVDX0NUUkwxX0FBTEUpOworCXQtPnBlbmRpbmcgPSAhIShyczVjLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSAmIFJTNUNfQ1RSTDJfQUFGRyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByczVjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQoreworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHJzNWMzNzIJCSpyczVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50CQkJc3RhdHVzLCBhZGRyLCBpOworCXVuc2lnbmVkIGNoYXIJCWJ1ZlszXTsKKworCS8qIG9ubHkgaGFuZGxlIHVwIHRvIDI0IGhvdXJzIGluIHRoZSBmdXR1cmUsIGxpa2UgUlRDX0FMTV9TRVQgKi8KKwlpZiAodC0+dGltZS50bV9tZGF5ICE9IC0xCisJCQl8fCB0LT50aW1lLnRtX21vbiAhPSAtMQorCQkJfHwgdC0+dGltZS50bV95ZWFyICE9IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFJFVklTSVQ6IHJvdW5kIHVwIHRtX3NlYyAqLworCisJLyogaWYgbmVlZGVkLCBkaXNhYmxlIGlycSAoY2xlYXJzIHBlbmRpbmcgc3RhdHVzKSAqLworCXN0YXR1cyA9IHJzNWNfZ2V0X3JlZ3MocnM1Yyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJaWYgKHJzNWMtPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdICYgUlM1Q19DVFJMMV9BQUxFKSB7CisJCWFkZHIgPSBSUzVDX0FERFIoUlM1Q19SRUdfQ1RSTDEpOworCQlidWZbMF0gPSByczVjLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSAmIH5SUzVDX0NUUkwxX0FBTEU7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgYWRkciwgYnVmWzBdKSA8IDApIHsKKwkJCXByX2RlYnVnKCIlczogY2FuJ3QgZGlzYWJsZSBhbGFybVxuIiwgcnM1Yy0+cnRjLT5uYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXJzNWMtPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdID0gYnVmWzBdOworCX0KKworCS8qIHNldCBhbGFybSAqLworCWJ1ZlswXSA9IGJpbjJiY2QodC0+dGltZS50bV9taW4pOworCWJ1ZlsxXSA9IHJzNWNfaHIycmVnKHJzNWMsIHQtPnRpbWUudG1faG91cik7CisJYnVmWzJdID0gMHg3ZjsJLyogYW55L2FsbCBkYXlzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykgeworCQlhZGRyID0gUlM1Q19BRERSKFJTNUNfUkVHX0FMQVJNX0FfTUlOICsgaSk7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgYWRkciwgYnVmW2ldKSA8IDApIHsKKwkJCXByX2RlYnVnKCIlczogY2FuJ3Qgc2V0IGFsYXJtIHRpbWVcbiIsIHJzNWMtPnJ0Yy0+bmFtZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qIC4uLiBhbmQgbWF5YmUgZW5hYmxlIGl0cyBpcnEgKi8KKwlpZiAodC0+ZW5hYmxlZCkgeworCQlhZGRyID0gUlM1Q19BRERSKFJTNUNfUkVHX0NUUkwxKTsKKwkJYnVmWzBdID0gcnM1Yy0+cmVnc1tSUzVDX1JFR19DVFJMMV0gfCBSUzVDX0NUUkwxX0FBTEU7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgYWRkciwgYnVmWzBdKSA8IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgZW5hYmxlIGFsYXJtXG4iLAorCQkJCXJzNWMtPnJ0Yy0+bmFtZSk7CisJCXJzNWMtPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdID0gYnVmWzBdOworCX0KKworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfUFJPQykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfUFJPQ19NT0RVTEUpCisKK3N0YXRpYyBpbnQgcnM1YzM3Ml9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCWludCBlcnIsIG9zYywgdHJpbTsKKworCWVyciA9IHJzNWMzNzJfZ2V0X3RyaW0odG9faTJjX2NsaWVudChkZXYpLCAmb3NjLCAmdHJpbSk7CisJaWYgKGVyciA9PSAwKSB7CisJCXNlcV9wcmludGYoc2VxLCAiY3J5c3RhbFx0XHQ6ICVkLiUwM2QgS0h6XG4iLAorCQkJCW9zYyAvIDEwMDAsIG9zYyAlIDEwMDApOworCQlzZXFfcHJpbnRmKHNlcSwgInRyaW1cdFx0OiAlZFxuIiwgdHJpbSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lCXJzNWMzNzJfcnRjX3Byb2MJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyByczVjMzcyX3J0Y19vcHMgPSB7CisJLnByb2MJCT0gcnM1YzM3Ml9ydGNfcHJvYywKKwkucmVhZF90aW1lCT0gcnM1YzM3Ml9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHJzNWMzNzJfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gcnM1Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSByczVjX3NldF9hbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZSA9IHJzNWNfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfU1lTRlMpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTX01PRFVMRSkKKworc3RhdGljIHNzaXplX3QgcnM1YzM3Ml9zeXNmc19zaG93X3RyaW0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGVyciwgdHJpbTsKKworCWVyciA9IHJzNWMzNzJfZ2V0X3RyaW0odG9faTJjX2NsaWVudChkZXYpLCBOVUxMLCAmdHJpbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0cmltKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih0cmltLCBTX0lSVUdPLCByczVjMzcyX3N5c2ZzX3Nob3dfdHJpbSwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHJzNWMzNzJfc3lzZnNfc2hvd19vc2Moc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGVyciwgb3NjOworCisJZXJyID0gcnM1YzM3Ml9nZXRfdHJpbSh0b19pMmNfY2xpZW50KGRldiksICZvc2MsIE5VTEwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lMDNkIEtIelxuIiwgb3NjIC8gMTAwMCwgb3NjICUgMTAwMCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIob3NjLCBTX0lSVUdPLCByczVjMzcyX3N5c2ZzX3Nob3dfb3NjLCBOVUxMKTsKKworc3RhdGljIGludCByczVjX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3RyaW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX29zYyk7CisJaWYgKGVycikKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3RyaW0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcnM1Y19zeXNmc191bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdHJpbSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX29zYyk7Cit9CisKKyNlbHNlCitzdGF0aWMgaW50IHJzNWNfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByczVjX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIG5vdGhpbmcgKi8KK30KKyNlbmRpZgkvKiBTWVNGUyAqLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcnM1YzM3Ml9kcml2ZXI7CisKK3N0YXRpYyBpbnQgcnM1Y19vc2NpbGxhdG9yX3NldHVwKHN0cnVjdCByczVjMzcyICpyczVjMzcyKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzJdOworCWludCBhZGRyLCBpLCByZXQgPSAwOworCisJaWYgKHJzNWMzNzItPnR5cGUgPT0gcnRjX3IyMDI1c2QpIHsKKwkJaWYgKCEocnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl0gJiBSMjAyNV9DVFJMMl9YU1QpKQorCQkJcmV0dXJuIHJldDsKKwkJcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl0gJj0gflIyMDI1X0NUUkwyX1hTVDsKKwl9IGVsc2UgeworCQlpZiAoIShyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSAmIFJTNUNfQ1RSTDJfWFNUUCkpCisJCQlyZXR1cm4gcmV0OworCQlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSAmPSB+UlM1Q19DVFJMMl9YU1RQOworCX0KKworCWFkZHIgICA9IFJTNUNfQUREUihSUzVDX1JFR19DVFJMMSk7CisJYnVmWzBdID0gcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMV07CisJYnVmWzFdID0gcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl07CisKKwkvKiB1c2UgMjRociBtb2RlICovCisJc3dpdGNoIChyczVjMzcyLT50eXBlKSB7CisJY2FzZSBydGNfcnM1YzM3MmE6CisJY2FzZSBydGNfcnM1YzM3MmI6CisJCWJ1ZlsxXSB8PSBSUzVDMzcyX0NUUkwyXzI0OworCQlyczVjMzcyLT50aW1lMjQgPSAxOworCQlicmVhazsKKwljYXNlIHJ0Y19yMjAyNXNkOgorCWNhc2UgcnRjX3J2NWMzODY6CisJY2FzZSBydGNfcnY1YzM4N2E6CisJCWJ1ZlswXSB8PSBSVjVDMzg3X0NUUkwxXzI0OworCQlyczVjMzcyLT50aW1lMjQgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBpbXBvc3NpYmxlICovCisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKTsgaSsrKSB7CisJCWFkZHIgPSBSUzVDX0FERFIoUlM1Q19SRUdfQ1RSTDEgKyBpKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShyczVjMzcyLT5jbGllbnQsIGFkZHIsIGJ1ZltpXSk7CisJCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMV0gPSBidWZbMF07CisJcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl0gPSBidWZbMV07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByczVjMzcyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCBlcnIgPSAwOworCWludCBzbWJ1c19tb2RlID0gMDsKKwlzdHJ1Y3QgcnM1YzM3MiAqcnM1YzM3MjsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDIHwKKwkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSykpIHsKKwkJLyoKKwkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbWFzdGVyIG1vZGUgYWRhcHRlciwgdHJ5IGJyZWFraW5nCisJCSAqIGl0IGRvd24gaW4gdG8gdGhlIGJhcmVzdCBvZiBjYXBhYmlsaXRpZXMuCisJCSAqLworCQlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQkJSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKSkKKwkJCXNtYnVzX21vZGUgPSAxOworCQllbHNlIHsKKwkJCS8qIFN0aWxsIG5vIGdvb2QsIGdpdmUgdXAgKi8KKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwlpZiAoIShyczVjMzcyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJzNWMzNzIpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCXJzNWMzNzItPmNsaWVudCA9IGNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCByczVjMzcyKTsKKwlyczVjMzcyLT50eXBlID0gaWQtPmRyaXZlcl9kYXRhOworCisJLyogd2UgcmVhZCByZWdpc3RlcnMgMHgwZiB0aGVuIDB4MDAtMHgwZjsgc2tpcCB0aGUgZmlyc3Qgb25lICovCisJcnM1YzM3Mi0+cmVncyA9ICZyczVjMzcyLT5idWZbMV07CisJcnM1YzM3Mi0+c21idXMgPSBzbWJ1c19tb2RlOworCisJZXJyID0gcnM1Y19nZXRfcmVncyhyczVjMzcyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBleGl0X2tmcmVlOworCisJLyogY2xvY2sgbWF5IGJlIHNldCBmb3IgYW0vcG0gb3IgMjQgaHIgdGltZSAqLworCXN3aXRjaCAocnM1YzM3Mi0+dHlwZSkgeworCWNhc2UgcnRjX3JzNWMzNzJhOgorCWNhc2UgcnRjX3JzNWMzNzJiOgorCQkvKiBhbGFybSB1c2VzIEFMQVJNX0E7IGFuZCBuSU5UUkEgb24gMzcyYSwgbklOVFIgb24gMzcyYi4KKwkJICogc28gZG9lcyBwZXJpb2RpYyBpcnEsIGV4Y2VwdCBzb21lIDMyN2EgbW9kZXMuCisJCSAqLworCQlpZiAocnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl0gJiBSUzVDMzcyX0NUUkwyXzI0KQorCQkJcnM1YzM3Mi0+dGltZTI0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBydGNfcjIwMjVzZDoKKwljYXNlIHJ0Y19ydjVjMzg2OgorCWNhc2UgcnRjX3J2NWMzODdhOgorCQlpZiAocnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMV0gJiBSVjVDMzg3X0NUUkwxXzI0KQorCQkJcnM1YzM3Mi0+dGltZTI0ID0gMTsKKwkJLyogYWxhcm0gdXNlcyBBTEFSTV9XOyBhbmQgbklOVFJCIGZvciBhbGFybSBhbmQgcGVyaW9kaWMKKwkJICogaXJxLCBvbiBib3RoIDM4NiBhbmQgMzg3CisJCSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVua25vd24gUlRDIHR5cGVcbiIpOworCQlnb3RvIGV4aXRfa2ZyZWU7CisJfQorCisJLyogaWYgdGhlIG9zY2lsbGF0b3IgbG9zdCBwb3dlciBhbmQgbm8gb3RoZXIgc29mdHdhcmUgKGxpa2UKKwkgKiB0aGUgYm9vdGxvYWRlcikgc2V0IGl0IHVwLCBkbyBpdCBoZXJlLgorCSAqCisJICogVGhlIFIyMDI1Uy9EIGRvZXMgdGhpcyBhIGxpdHRsZSBkaWZmZXJlbnRseSB0aGFuIHRoZSBvdGhlcgorCSAqIHBhcnRzLCBzbyB3ZSBzcGVjaWFsIGNhc2UgdGhhdC4uCisJICovCisJZXJyID0gcnM1Y19vc2NpbGxhdG9yX3NldHVwKHJzNWMzNzIpOworCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInNldHVwIGVycm9yXG4iKTsKKwkJZ290byBleGl0X2tmcmVlOworCX0KKworCWlmIChyczVjMzcyX2dldF9kYXRldGltZShjbGllbnQsICZ0bSkgPCAwKQorCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJjbG9jayBuZWVkcyB0byBiZSBzZXRcbiIpOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgZm91bmQsICVzLCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIsCisJCQkoeyBjaGFyICpzOyBzd2l0Y2ggKHJzNWMzNzItPnR5cGUpIHsKKwkJCWNhc2UgcnRjX3IyMDI1c2Q6CXMgPSAicjIwMjVzZCI7IGJyZWFrOworCQkJY2FzZSBydGNfcnM1YzM3MmE6CXMgPSAicnM1YzM3MmEiOyBicmVhazsKKwkJCWNhc2UgcnRjX3JzNWMzNzJiOglzID0gInJzNWMzNzJiIjsgYnJlYWs7CisJCQljYXNlIHJ0Y19ydjVjMzg2OglzID0gInJ2NWMzODYiOyBicmVhazsKKwkJCWNhc2UgcnRjX3J2NWMzODdhOglzID0gInJ2NWMzODdhIjsgYnJlYWs7CisJCQlkZWZhdWx0OgkJcyA9ICJjaGlwIjsgYnJlYWs7CisJCQl9OyBzO30pLAorCQkJcnM1YzM3Mi0+dGltZTI0ID8gIjI0aHIiIDogImFtL3BtIgorCQkJKTsKKworCS8qIFJFVklTSVQgdXNlIGNsaWVudC0+aXJxIHRvIHJlZ2lzdGVyIGFsYXJtIGlycSAuLi4gKi8KKworCXJzNWMzNzItPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocnM1YzM3Ml9kcml2ZXIuZHJpdmVyLm5hbWUsCisJCQkJJmNsaWVudC0+ZGV2LCAmcnM1YzM3Ml9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJzNWMzNzItPnJ0YykpIHsKKwkJZXJyID0gUFRSX0VSUihyczVjMzcyLT5ydGMpOworCQlnb3RvIGV4aXRfa2ZyZWU7CisJfQorCisJZXJyID0gcnM1Y19zeXNmc19yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9kZXZyZWc7CisKKwlyZXR1cm4gMDsKKworZXhpdF9kZXZyZWc6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJzNWMzNzItPnJ0Yyk7CisKK2V4aXRfa2ZyZWU6CisJa2ZyZWUocnM1YzM3Mik7CisKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByczVjMzcyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCByczVjMzcyICpyczVjMzcyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnM1YzM3Mi0+cnRjKTsKKwlyczVjX3N5c2ZzX3VucmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlrZnJlZShyczVjMzcyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJzNWMzNzJfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtcnM1YzM3MiIsCisJfSwKKwkucHJvYmUJCT0gcnM1YzM3Ml9wcm9iZSwKKwkucmVtb3ZlCQk9IHJzNWMzNzJfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHJzNWMzNzJfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihyczVjMzcyX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoCisJCSJQYXZlbCBNaXJvbmNoaWsgPHBtaXJvbmNoaWtAb3B0aWZhY2lvLm5ldD4sICIKKwkJIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiwgIgorCQkiUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmljb2ggUlM1QzM3MiBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcnYzMDI5YzIuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1ydjMwMjljMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDYzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcnYzMDI5YzIuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqIE1pY3JvIENyeXN0YWwgUlYtMzAyOUMyIHJ0YyBjbGFzcyBkcml2ZXIKKyAqCisgKiBBdXRob3I6IEdyZWdvcnkgSGVybWFudCA8Z3JlZ29yeS5oZXJtYW50QGNhbGFvLXN5c3RlbXMuY29tPgorICoKKyAqIGJhc2VkIG9uIHByZXZpb3VzbHkgZXhpc3RpbmcgcnRjIGNsYXNzIGRyaXZlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PVEU6IEN1cnJlbnRseSB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBiYXJlIG1pbmltdW0gZm9yIHJlYWQKKyAqIGFuZCB3cml0ZSB0aGUgUlRDIGFuZCBhbGFybXMuIFRoZSBleHRyYSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGlzIGNoaXAKKyAqICh0cmlja2xlIGNoYXJnZXIsIGVlcHJvbSwgVMKwIGNvbXBlbnNhdGlvbikgYXJlIHVuYXZhaWxhYmxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworLyogUmVnaXN0ZXIgbWFwICovCisvKiBjb250cm9sIHNlY3Rpb24gKi8KKyNkZWZpbmUgUlYzMDI5QzJfT05PRkZfQ1RSTAkJMHgwMAorI2RlZmluZSBSVjMwMjlDMl9JUlFfQ1RSTAkJMHgwMQorI2RlZmluZSBSVjMwMjlDMl9JUlFfQ1RSTF9BSUUJCSgxIDw8IDApCisjZGVmaW5lIFJWMzAyOUMyX0lSUV9GTEFHUwkJMHgwMgorI2RlZmluZSBSVjMwMjlDMl9JUlFfRkxBR1NfQUYJCSgxIDw8IDApCisjZGVmaW5lIFJWMzAyOUMyX1NUQVRVUwkJCTB4MDMKKyNkZWZpbmUgUlYzMDI5QzJfU1RBVFVTX1ZMT1cxCQkoMSA8PCAyKQorI2RlZmluZSBSVjMwMjlDMl9TVEFUVVNfVkxPVzIJCSgxIDw8IDMpCisjZGVmaW5lIFJWMzAyOUMyX1NUQVRVU19TUgkJKDEgPDwgNCkKKyNkZWZpbmUgUlYzMDI5QzJfU1RBVFVTX1BPTgkJKDEgPDwgNSkKKyNkZWZpbmUgUlYzMDI5QzJfU1RBVFVTX0VFQlVTWQkJKDEgPDwgNykKKyNkZWZpbmUgUlYzMDI5QzJfUlNUX0NUUkwJCTB4MDQKKyNkZWZpbmUgUlYzMDI5QzJfQ09OVFJPTF9TRUNUSU9OX0xFTgkweDA1CisKKy8qIHdhdGNoIHNlY3Rpb24gKi8KKyNkZWZpbmUgUlYzMDI5QzJfV19TRUMJCQkweDA4CisjZGVmaW5lIFJWMzAyOUMyX1dfTUlOVVRFUwkJMHgwOQorI2RlZmluZSBSVjMwMjlDMl9XX0hPVVJTCQkweDBBCisjZGVmaW5lIFJWMzAyOUMyX1JFR19IUl8xMl8yNAkJKDE8PDYpICAvKiAyNGgvMTJoIG1vZGUgKi8KKyNkZWZpbmUgUlYzMDI5QzJfUkVHX0hSX1BNCQkoMTw8NSkgIC8qIFBNL0FNIGJpdCBpbiAxMmggbW9kZSAqLworI2RlZmluZSBSVjMwMjlDMl9XX0RBVEUJCQkweDBCCisjZGVmaW5lIFJWMzAyOUMyX1dfREFZUwkJCTB4MEMKKyNkZWZpbmUgUlYzMDI5QzJfV19NT05USFMJCTB4MEQKKyNkZWZpbmUgUlYzMDI5QzJfV19ZRUFSUwkJMHgwRQorI2RlZmluZSBSVjMwMjlDMl9XQVRDSF9TRUNUSU9OX0xFTgkweDA3CisKKy8qIGFsYXJtIHNlY3Rpb24gKi8KKyNkZWZpbmUgUlYzMDI5QzJfQV9TQwkJCTB4MTAKKyNkZWZpbmUgUlYzMDI5QzJfQV9NTgkJCTB4MTEKKyNkZWZpbmUgUlYzMDI5QzJfQV9IUgkJCTB4MTIKKyNkZWZpbmUgUlYzMDI5QzJfQV9EVAkJCTB4MTMKKyNkZWZpbmUgUlYzMDI5QzJfQV9EVwkJCTB4MTQKKyNkZWZpbmUgUlYzMDI5QzJfQV9NTwkJCTB4MTUKKyNkZWZpbmUgUlYzMDI5QzJfQV9ZUgkJCTB4MTYKKyNkZWZpbmUgUlYzMDI5QzJfQUxBUk1fU0VDVElPTl9MRU4JMHgwNworCisvKiB0aW1lciBzZWN0aW9uICovCisjZGVmaW5lIFJWMzAyOUMyX1RJTUVSX0xPVwkJMHgxOAorI2RlZmluZSBSVjMwMjlDMl9USU1FUl9ISUdICQkweDE5CisKKy8qIHRlbXBlcmF0dXJlIHNlY3Rpb24gKi8KKyNkZWZpbmUgUlYzMDI5QzJfVEVNUF9QQUdFCQkweDIwCisKKy8qIGVlcHJvbSBkYXRhIHNlY3Rpb24gKi8KKyNkZWZpbmUgUlYzMDI5QzJfRTJQX0VFREFUQTEJCTB4MjgKKyNkZWZpbmUgUlYzMDI5QzJfRTJQX0VFREFUQTIJCTB4MjkKKworLyogZWVwcm9tIGNvbnRyb2wgc2VjdGlvbiAqLworI2RlZmluZSBSVjMwMjlDMl9DT05UUk9MX0UyUF9FRUNUUkwJMHgzMAorI2RlZmluZSBSVjMwMjlDMl9UUklDS0xFXzFLCQkoMTw8MCkgIC8qICAxSyByZXNpc3RhbmNlICovCisjZGVmaW5lIFJWMzAyOUMyX1RSSUNLTEVfNUsJCSgxPDwxKSAgLyogIDVLIHJlc2lzdGFuY2UgKi8KKyNkZWZpbmUgUlYzMDI5QzJfVFJJQ0tMRV8yMEsJCSgxPDwyKSAgLyogMjBLIHJlc2lzdGFuY2UgKi8KKyNkZWZpbmUgUlYzMDI5QzJfVFJJQ0tMRV84MEsJCSgxPDwzKSAgLyogODBLIHJlc2lzdGFuY2UgKi8KKyNkZWZpbmUgUlYzMDI5QzJfQ09OVFJPTF9FMlBfWFRBTE9GRlNFVAkweDMxCisjZGVmaW5lIFJWMzAyOUMyX0NPTlRST0xfRTJQX1FDT0VGCTB4MzIKKyNkZWZpbmUgUlYzMDI5QzJfQ09OVFJPTF9FMlBfVFVSTk9WRVIJMHgzMworCisvKiB1c2VyIHJhbSBzZWN0aW9uICovCisjZGVmaW5lIFJWMzAyOUMyX1VTUjFfUkFNX1BBR0UJCTB4MzgKKyNkZWZpbmUgUlYzMDI5QzJfVVNSMV9TRUNUSU9OX0xFTgkweDA0CisjZGVmaW5lIFJWMzAyOUMyX1VTUjJfUkFNX1BBR0UJCTB4M0MKKyNkZWZpbmUgUlYzMDI5QzJfVVNSMl9TRUNUSU9OX0xFTgkweDA0CisKK3N0YXRpYyBpbnQKK3J2MzAyOWMyX2kyY19yZWFkX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCAqYnVmLAorCXVuc2lnbmVkIGxlbikKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZWcgPiBSVjMwMjlDMl9VU1IxX1JBTV9QQUdFICsgNykgfHwKKwkJKHJlZyArIGxlbiA+IFJWMzAyOUMyX1VTUjFfUkFNX1BBR0UgKyA4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsIHJlZywgbGVuLCBidWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPCBsZW4pCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitydjMwMjljMl9pMmNfd3JpdGVfcmVncyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IGNvbnN0IGJ1ZltdLAorCQkJdW5zaWduZWQgbGVuKQoreworCWlmICgocmVnID4gUlYzMDI5QzJfVVNSMV9SQU1fUEFHRSArIDcpIHx8CisJCShyZWcgKyBsZW4gPiBSVjMwMjlDMl9VU1IxX1JBTV9QQUdFICsgOCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjbGllbnQsIHJlZywgbGVuLCBidWYpOworfQorCitzdGF0aWMgaW50CitydjMwMjljMl9pMmNfZ2V0X3NyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4ICpidWYpCit7CisJaW50IHJldCA9IHJ2MzAyOWMyX2kyY19yZWFkX3JlZ3MoY2xpZW50LCBSVjMwMjlDMl9TVEFUVVMsIGJ1ZiwgMSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU87CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJzdGF0dXMgPSAweCUuMnggKCVkKVxuIiwgYnVmWzBdLCBidWZbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitydjMwMjljMl9pMmNfc2V0X3NyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHZhbCkKK3sKKwl1OCBidWZbMV07CisJaW50IHNyOworCisJYnVmWzBdID0gdmFsOworCXNyID0gcnYzMDI5YzJfaTJjX3dyaXRlX3JlZ3MoY2xpZW50LCBSVjMwMjlDMl9TVEFUVVMsIGJ1ZiwgMSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJzdGF0dXMgPSAweCUuMnggKCVkKVxuIiwgYnVmWzBdLCBidWZbMF0pOworCWlmIChzciA8IDApCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitydjMwMjljMl9pMmNfcmVhZF90aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdTggYnVmWzFdOworCWludCByZXQ7CisJdTggcmVnc1tSVjMwMjlDMl9XQVRDSF9TRUNUSU9OX0xFTl0gPSB7IDAsIH07CisKKwlyZXQgPSBydjMwMjljMl9pMmNfZ2V0X3NyKGNsaWVudCwgYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIFNSIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBydjMwMjljMl9pMmNfcmVhZF9yZWdzKGNsaWVudCwgUlYzMDI5QzJfV19TRUMgLCByZWdzLAorCQkJCQlSVjMwMjlDMl9XQVRDSF9TRUNUSU9OX0xFTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZGluZyBSVEMgc2VjdGlvbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4ocmVnc1tSVjMwMjlDMl9XX1NFQy1SVjMwMjlDMl9XX1NFQ10pOworCXRtLT50bV9taW4gPSBiY2QyYmluKHJlZ3NbUlYzMDI5QzJfV19NSU5VVEVTLVJWMzAyOUMyX1dfU0VDXSk7CisKKwkvKiBIUiBmaWVsZCBoYXMgYSBtb3JlIGNvbXBsZXggaW50ZXJwcmV0YXRpb24gKi8KKwl7CisJCWNvbnN0IHU4IF9ociA9IHJlZ3NbUlYzMDI5QzJfV19IT1VSUy1SVjMwMjlDMl9XX1NFQ107CisJCWlmIChfaHIgJiBSVjMwMjlDMl9SRUdfSFJfMTJfMjQpIHsKKwkJCS8qIDEyaCBmb3JtYXQgKi8KKwkJCXRtLT50bV9ob3VyID0gYmNkMmJpbihfaHIgJiAweDFmKTsKKwkJCWlmIChfaHIgJiBSVjMwMjlDMl9SRUdfSFJfUE0pCS8qIFBNIGZsYWcgc2V0ICovCisJCQkJdG0tPnRtX2hvdXIgKz0gMTI7CisJCX0gZWxzZSAvKiAyNGggZm9ybWF0ICovCisJCQl0bS0+dG1faG91ciA9IGJjZDJiaW4oX2hyICYgMHgzZik7CisJfQorCisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHJlZ3NbUlYzMDI5QzJfV19EQVRFLVJWMzAyOUMyX1dfU0VDXSk7CisJdG0tPnRtX21vbiA9IGJjZDJiaW4ocmVnc1tSVjMwMjlDMl9XX01PTlRIUy1SVjMwMjlDMl9XX1NFQ10pIC0gMTsKKwl0bS0+dG1feWVhciA9IGJjZDJiaW4ocmVnc1tSVjMwMjlDMl9XX1lFQVJTLVJWMzAyOUMyX1dfU0VDXSkgKyAxMDA7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHJlZ3NbUlYzMDI5QzJfV19EQVlTLVJWMzAyOUMyX1dfU0VDXSkgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnYzMDI5YzJfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIHJ2MzAyOWMyX2kyY19yZWFkX3RpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKK3N0YXRpYyBpbnQKK3J2MzAyOWMyX2kyY19yZWFkX2FsYXJtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKmNvbnN0IHRtID0gJmFsYXJtLT50aW1lOworCWludCByZXQ7CisJdTggcmVnc1s4XTsKKworCXJldCA9IHJ2MzAyOWMyX2kyY19nZXRfc3IoY2xpZW50LCByZWdzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIFNSIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBydjMwMjljMl9pMmNfcmVhZF9yZWdzKGNsaWVudCwgUlYzMDI5QzJfQV9TQywgcmVncywKKwkJCQkJUlYzMDI5QzJfQUxBUk1fU0VDVElPTl9MRU4pOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZGluZyBhbGFybSBzZWN0aW9uIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihyZWdzW1JWMzAyOUMyX0FfU0MtUlYzMDI5QzJfQV9TQ10gJiAweDdmKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbihyZWdzW1JWMzAyOUMyX0FfTU4tUlYzMDI5QzJfQV9TQ10gJiAweDdmKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4ocmVnc1tSVjMwMjlDMl9BX0hSLVJWMzAyOUMyX0FfU0NdICYgMHgzZik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHJlZ3NbUlYzMDI5QzJfQV9EVC1SVjMwMjlDMl9BX1NDXSAmIDB4M2YpOworCXRtLT50bV9tb24gPSBiY2QyYmluKHJlZ3NbUlYzMDI5QzJfQV9NTy1SVjMwMjlDMl9BX1NDXSAmIDB4MWYpIC0gMTsKKwl0bS0+dG1feWVhciA9IGJjZDJiaW4ocmVnc1tSVjMwMjlDMl9BX1lSLVJWMzAyOUMyX0FfU0NdICYgMHg3ZikgKyAxMDA7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHJlZ3NbUlYzMDI5QzJfQV9EVy1SVjMwMjlDMl9BX1NDXSAmIDB4MDcpIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitydjMwMjljMl9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlyZXR1cm4gcnYzMDI5YzJfaTJjX3JlYWRfYWxhcm0odG9faTJjX2NsaWVudChkZXYpLCBhbGFybSk7Cit9CisKK3N0YXRpYyBpbnQgcnYzMDI5YzJfcnRjX2kyY19hbGFybV9zZXRfaXJxKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJCWludCBlbmFibGUpCit7CisJaW50IHJldDsKKwl1OCBidWZbMV07CisKKwkvKiBlbmFibGUgQUlFIGlycSAqLworCXJldCA9IHJ2MzAyOWMyX2kyY19yZWFkX3JlZ3MoY2xpZW50LCBSVjMwMjlDMl9JUlFfQ1RSTCwJYnVmLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNhbid0IHJlYWQgSU5UIHJlZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChlbmFibGUpCisJCWJ1ZlswXSB8PSBSVjMwMjlDMl9JUlFfQ1RSTF9BSUU7CisJZWxzZQorCQlidWZbMF0gJj0gflJWMzAyOUMyX0lSUV9DVFJMX0FJRTsKKworCXJldCA9IHJ2MzAyOWMyX2kyY193cml0ZV9yZWdzKGNsaWVudCwgUlYzMDI5QzJfSVJRX0NUUkwsIGJ1ZiwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjYW4ndCBzZXQgSU5UIHJlZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnYzMDI5YzJfcnRjX2kyY19zZXRfYWxhcm0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkJc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBydGNfdGltZSAqY29uc3QgdG0gPSAmYWxhcm0tPnRpbWU7CisJaW50IHJldDsKKwl1OCByZWdzWzhdOworCisJLyoKKwkgKiBUaGUgY2xvY2sgaGFzIGFuIDggYml0IHdpZGUgYmNkLWNvZGVkIHJlZ2lzdGVyICh0aGV5IG5ldmVyIGxlYXJuKQorCSAqIGZvciB0aGUgeWVhci4gdG1feWVhciBpcyBhbiBvZmZzZXQgZnJvbSAxOTAwIGFuZCB3ZSBhcmUgaW50ZXJlc3RlZAorCSAqIGluIHRoZSAyMDAwLTIwOTkgcmFuZ2UsIHNvIGFueSB2YWx1ZSBsZXNzIHRoYW4gMTAwIGlzIGludmFsaWQuCisJKi8KKwlpZiAodG0tPnRtX3llYXIgPCAxMDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gcnYzMDI5YzJfaTJjX2dldF9zcihjbGllbnQsIHJlZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHJlYWRpbmcgU1IgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZWdzW1JWMzAyOUMyX0FfU0MtUlYzMDI5QzJfQV9TQ10gPSBiaW4yYmNkKHRtLT50bV9zZWMgJiAweDdmKTsKKwlyZWdzW1JWMzAyOUMyX0FfTU4tUlYzMDI5QzJfQV9TQ10gPSBiaW4yYmNkKHRtLT50bV9taW4gJiAweDdmKTsKKwlyZWdzW1JWMzAyOUMyX0FfSFItUlYzMDI5QzJfQV9TQ10gPSBiaW4yYmNkKHRtLT50bV9ob3VyICYgMHgzZik7CisJcmVnc1tSVjMwMjlDMl9BX0RULVJWMzAyOUMyX0FfU0NdID0gYmluMmJjZCh0bS0+dG1fbWRheSAmIDB4M2YpOworCXJlZ3NbUlYzMDI5QzJfQV9NTy1SVjMwMjlDMl9BX1NDXSA9IGJpbjJiY2QoKHRtLT50bV9tb24gJiAweDFmKSAtIDEpOworCXJlZ3NbUlYzMDI5QzJfQV9EVy1SVjMwMjlDMl9BX1NDXSA9IGJpbjJiY2QoKHRtLT50bV93ZGF5ICYgNykgLSAxKTsKKwlyZWdzW1JWMzAyOUMyX0FfWVItUlYzMDI5QzJfQV9TQ10gPSBiaW4yYmNkKCh0bS0+dG1feWVhciAmIDB4N2YpIC0gMTAwKTsKKworCXJldCA9IHJ2MzAyOWMyX2kyY193cml0ZV9yZWdzKGNsaWVudCwgUlYzMDI5QzJfQV9TQywgcmVncywKKwkJCQkJUlYzMDI5QzJfQUxBUk1fU0VDVElPTl9MRU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFsYXJtLT5lbmFibGVkKSB7CisJCXU4IGJ1ZlsxXTsKKworCQkvKiBjbGVhciBBRiBmbGFnICovCisJCXJldCA9IHJ2MzAyOWMyX2kyY19yZWFkX3JlZ3MoY2xpZW50LCBSVjMwMjlDMl9JUlFfRkxBR1MsCisJCQkJCQlidWYsIDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjYW4ndCByZWFkIGFsYXJtIGZsYWdcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlidWZbMF0gJj0gflJWMzAyOUMyX0lSUV9GTEFHU19BRjsKKwkJcmV0ID0gcnYzMDI5YzJfaTJjX3dyaXRlX3JlZ3MoY2xpZW50LCBSVjMwMjlDMl9JUlFfRkxBR1MsCisJCQkJCQlidWYsIDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjYW4ndCBzZXQgYWxhcm0gZmxhZ1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCS8qIGVuYWJsZSBBSUUgaXJxICovCisJCXJldCA9IHJ2MzAyOWMyX3J0Y19pMmNfYWxhcm1fc2V0X2lycShjbGllbnQsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImFsYXJtIElSUSBhcm1lZFxuIik7CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBBSUUgaXJxICovCisJCXJldCA9IHJ2MzAyOWMyX3J0Y19pMmNfYWxhcm1fc2V0X2lycShjbGllbnQsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImFsYXJtIElSUSBkaXNhYmxlZFxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnYzMDI5YzJfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlyZXR1cm4gcnYzMDI5YzJfcnRjX2kyY19zZXRfYWxhcm0odG9faTJjX2NsaWVudChkZXYpLCBhbGFybSk7Cit9CisKK3N0YXRpYyBpbnQKK3J2MzAyOWMyX2kyY19zZXRfdGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgY29uc3QgKnRtKQoreworCXU4IHJlZ3NbOF07CisJaW50IHJldDsKKworCS8qCisJICogVGhlIGNsb2NrIGhhcyBhbiA4IGJpdCB3aWRlIGJjZC1jb2RlZCByZWdpc3RlciAodGhleSBuZXZlciBsZWFybikKKwkgKiBmb3IgdGhlIHllYXIuIHRtX3llYXIgaXMgYW4gb2Zmc2V0IGZyb20gMTkwMCBhbmQgd2UgYXJlIGludGVyZXN0ZWQKKwkgKiBpbiB0aGUgMjAwMC0yMDk5IHJhbmdlLCBzbyBhbnkgdmFsdWUgbGVzcyB0aGFuIDEwMCBpcyBpbnZhbGlkLgorCSovCisJaWYgKHRtLT50bV95ZWFyIDwgMTAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ3NbUlYzMDI5QzJfV19TRUMtUlYzMDI5QzJfV19TRUNdID0gYmluMmJjZCh0bS0+dG1fc2VjKTsKKwlyZWdzW1JWMzAyOUMyX1dfTUlOVVRFUy1SVjMwMjlDMl9XX1NFQ10gPSBiaW4yYmNkKHRtLT50bV9taW4pOworCXJlZ3NbUlYzMDI5QzJfV19IT1VSUy1SVjMwMjlDMl9XX1NFQ10gPSBiaW4yYmNkKHRtLT50bV9ob3VyKTsKKwlyZWdzW1JWMzAyOUMyX1dfREFURS1SVjMwMjlDMl9XX1NFQ10gPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlyZWdzW1JWMzAyOUMyX1dfTU9OVEhTLVJWMzAyOUMyX1dfU0VDXSA9IGJpbjJiY2QodG0tPnRtX21vbisxKTsKKwlyZWdzW1JWMzAyOUMyX1dfREFZUy1SVjMwMjlDMl9XX1NFQ10gPSBiaW4yYmNkKCh0bS0+dG1fd2RheSAmIDcpKzEpOworCXJlZ3NbUlYzMDI5QzJfV19ZRUFSUy1SVjMwMjlDMl9XX1NFQ10gPSBiaW4yYmNkKHRtLT50bV95ZWFyIC0gMTAwKTsKKworCXJldCA9IHJ2MzAyOWMyX2kyY193cml0ZV9yZWdzKGNsaWVudCwgUlYzMDI5QzJfV19TRUMsIHJlZ3MsCisJCQkJCVJWMzAyOUMyX1dBVENIX1NFQ1RJT05fTEVOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJ2MzAyOWMyX2kyY19nZXRfc3IoY2xpZW50LCByZWdzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIFNSIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBjbGVhciBQT04gYml0ICovCisJcmV0ID0gcnYzMDI5YzJfaTJjX3NldF9zcihjbGllbnQsIChyZWdzWzBdICYgflJWMzAyOUMyX1NUQVRVU19QT04pKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkaW5nIFNSIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ2MzAyOWMyX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIHJ2MzAyOWMyX2kyY19zZXRfdGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHJ2MzAyOWMyX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHJ2MzAyOWMyX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gcnYzMDI5YzJfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gcnYzMDI5YzJfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IHJ2MzAyOWMyX3J0Y19zZXRfYWxhcm0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgcnYzMDI5YzJfaWRbXSA9IHsKKwl7ICJydjMwMjljMiIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcnYzMDI5YzJfaWQpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcnYzMDI5YzJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJaW50IHJjID0gMDsKKwl1OCBidWZbMV07CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfRU1VTCkpCisJCXJldHVybiAtRU5PREVWOworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihjbGllbnQtPm5hbWUsCisJCQkJJmNsaWVudC0+ZGV2LCAmcnYzMDI5YzJfcnRjX29wcywKKwkJCQlUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBydGMpOworCisJcmMgPSBydjMwMjljMl9pMmNfZ2V0X3NyKGNsaWVudCwgYnVmKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZGluZyBzdGF0dXMgZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X3VucmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfdW5yZWdpc3RlcjoKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcnYzMDI5YzJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJ2MzAyOWMyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJydGMtcnYzMDI5YzIiLAorCX0sCisJLnByb2JlID0gcnYzMDI5YzJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHJ2MzAyOWMyX3JlbW92ZSksCisJLmlkX3RhYmxlID0gcnYzMDI5YzJfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihydjMwMjljMl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJHcmVnb3J5IEhlcm1hbnQgPGdyZWdvcnkuaGVybWFudEBjYWxhby1zeXN0ZW1zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWljcm8gQ3J5c3RhbCBSVjMwMjlDMiBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcng4MDI1LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcng4MDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlOTAyZAotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1yeDgwMjUuYwpAQCAtMCwwICsxLDY1MSBAQAorLyoKKyAqIERyaXZlciBmb3IgRXBzb24ncyBSVEMgbW9kdWxlIFJYLTgwMjUgU0EvTkIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IERpZ2kgSW50ZXJuYXRpb25hbCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIE1vZGlmaWVkIGJ5IGZlbmdqaCBhdCByaXNpbmcuY29tLmNuCisgKiA8aHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycz4KKyAqIDIwMDYuMTEKKyAqCisgKiBDb2RlIGNsZWFudXAgYnkgU2VyZ2VpIFBvc2VsZW5vdiwgPHNwb3NlbGVub3ZAZW1jcmFmdC5jb20+CisgKiBDb252ZXJ0ZWQgdG8gbmV3IHN0eWxlIGJ5IFdvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGdyYW5kZWdnZXIuY29tPgorICogQWxhcm0gYW5kIHBlcmlvZGljIGludGVycnVwdCBhZGRlZCBieSBEbWl0cnkgUmFraGNoZXYgPHJkYUBlbWNyYWZ0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKy8qIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFJYODAyNV9SRUdfU0VDCQkweDAwCisjZGVmaW5lIFJYODAyNV9SRUdfTUlOCQkweDAxCisjZGVmaW5lIFJYODAyNV9SRUdfSE9VUgkJMHgwMgorI2RlZmluZSBSWDgwMjVfUkVHX1dEQVkJCTB4MDMKKyNkZWZpbmUgUlg4MDI1X1JFR19NREFZCQkweDA0CisjZGVmaW5lIFJYODAyNV9SRUdfTU9OVEgJMHgwNQorI2RlZmluZSBSWDgwMjVfUkVHX1lFQVIJCTB4MDYKKyNkZWZpbmUgUlg4MDI1X1JFR19ESUdPRkYJMHgwNworI2RlZmluZSBSWDgwMjVfUkVHX0FMV01JTgkweDA4CisjZGVmaW5lIFJYODAyNV9SRUdfQUxXSE9VUgkweDA5CisjZGVmaW5lIFJYODAyNV9SRUdfQUxXV0RBWQkweDBhCisjZGVmaW5lIFJYODAyNV9SRUdfQUxETUlOCTB4MGIKKyNkZWZpbmUgUlg4MDI1X1JFR19BTERIT1VSCTB4MGMKKy8qIDB4MGQgaXMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlg4MDI1X1JFR19DVFJMMQkweDBlCisjZGVmaW5lIFJYODAyNV9SRUdfQ1RSTDIJMHgwZgorCisjZGVmaW5lIFJYODAyNV9CSVRfQ1RSTDFfQ1QJKDcgPDwgMCkKKy8qIDEgSHogcGVyaW9kaWMgbGV2ZWwgaXJxICovCisjZGVmaW5lIFJYODAyNV9CSVRfQ1RSTDFfQ1RfMUhaCTQKKyNkZWZpbmUgUlg4MDI1X0JJVF9DVFJMMV9URVNUCSgxIDw8IDMpCisjZGVmaW5lIFJYODAyNV9CSVRfQ1RSTDFfMTIyNAkoMSA8PCA1KQorI2RlZmluZSBSWDgwMjVfQklUX0NUUkwxX0RBTEUJKDEgPDwgNikKKyNkZWZpbmUgUlg4MDI1X0JJVF9DVFJMMV9XQUxFCSgxIDw8IDcpCisKKyNkZWZpbmUgUlg4MDI1X0JJVF9DVFJMMl9EQUZHCSgxIDw8IDApCisjZGVmaW5lIFJYODAyNV9CSVRfQ1RSTDJfV0FGRwkoMSA8PCAxKQorI2RlZmluZSBSWDgwMjVfQklUX0NUUkwyX0NURkcJKDEgPDwgMikKKyNkZWZpbmUgUlg4MDI1X0JJVF9DVFJMMl9QT04JKDEgPDwgNCkKKyNkZWZpbmUgUlg4MDI1X0JJVF9DVFJMMl9YU1QJKDEgPDwgNSkKKyNkZWZpbmUgUlg4MDI1X0JJVF9DVFJMMl9WREVUCSgxIDw8IDYpCisKKy8qIENsb2NrIHByZWNpc2lvbiBhZGp1c3RtZW50ICovCisjZGVmaW5lIFJYODAyNV9BREpfUkVTT0xVVElPTgkzMDUwIC8qIGluIHBwYiAqLworI2RlZmluZSBSWDgwMjVfQURKX0RBVEFfTUFYCTYyCisjZGVmaW5lIFJYODAyNV9BREpfREFUQV9NSU4JLTYyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCByeDgwMjVfaWRbXSA9IHsKKwl7ICJyeDgwMjUiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHJ4ODAyNV9pZCk7CisKK3N0cnVjdCByeDgwMjVfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXU4IGN0cmwxOworCXVuc2lnbmVkIGV4aXRpbmc6MTsKK307CisKK3N0YXRpYyBpbnQgcng4MDI1X3JlYWRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBudW1iZXIsIHU4ICp2YWx1ZSkKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgKG51bWJlciA8PCA0KSB8IDB4MDgpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gcmVhZCByZWdpc3RlciAjJWRcbiIsIG51bWJlcik7CisJCXJldHVybiByZXQ7CisJfQorCisJKnZhbHVlID0gcmV0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ4ODAyNV9yZWFkX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICBpbnQgbnVtYmVyLCB1OCBsZW5ndGgsIHU4ICp2YWx1ZXMpCit7CisJaW50IHJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgKG51bWJlciA8PCA0KSB8IDB4MDgsCisJCQkJCQlsZW5ndGgsIHZhbHVlcyk7CisKKwlpZiAocmV0ICE9IGxlbmd0aCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVycyAjJWQuLiMlZFxuIiwKKwkJCW51bWJlciwgbnVtYmVyICsgbGVuZ3RoIC0gMSk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByeDgwMjVfd3JpdGVfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBudW1iZXIsIHU4IHZhbHVlKQoreworCWludCByZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgbnVtYmVyIDw8IDQsIHZhbHVlKTsKKworCWlmIChyZXQpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIHdyaXRlIHJlZ2lzdGVyICMlZFxuIiwKKwkJCW51bWJlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ4ODAyNV93cml0ZV9yZWdzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIGludCBudW1iZXIsIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNsaWVudCwgKG51bWJlciA8PCA0KSB8IDB4MDgsCisJCQkJCQkgbGVuZ3RoLCB2YWx1ZXMpOworCisJaWYgKHJldCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gd3JpdGUgcmVnaXN0ZXJzICMlZC4uIyVkXG4iLAorCQkJbnVtYmVyLCBudW1iZXIgKyBsZW5ndGggLSAxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByeDgwMjVfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGV2X2lkOworCXN0cnVjdCByeDgwMjVfZGF0YSAqcng4MDI1ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwlzY2hlZHVsZV93b3JrKCZyeDgwMjUtPndvcmspOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgcng4MDI1X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByeDgwMjVfZGF0YSAqcng4MDI1ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeDgwMjVfZGF0YSwKKwkJCQkJCSAgd29yayk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHJ4ODAyNS0+Y2xpZW50OworCXN0cnVjdCBtdXRleCAqbG9jayA9ICZyeDgwMjUtPnJ0Yy0+b3BzX2xvY2s7CisJdTggc3RhdHVzOworCisJbXV0ZXhfbG9jayhsb2NrKTsKKworCWlmIChyeDgwMjVfcmVhZF9yZWcoY2xpZW50LCBSWDgwMjVfUkVHX0NUUkwyLCAmc3RhdHVzKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIShzdGF0dXMgJiBSWDgwMjVfQklUX0NUUkwyX1hTVCkpCisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIk9zY2lsbGF0aW9uIHN0b3Agd2FzIGRldGVjdGVkLCIKKwkJCSAieW91IG1heSBoYXZlIHRvIHJlYWRqdXN0IHRoZSBjbG9ja1xuIik7CisKKwlpZiAoc3RhdHVzICYgUlg4MDI1X0JJVF9DVFJMMl9DVEZHKSB7CisJCS8qIHBlcmlvZGljICovCisJCXN0YXR1cyAmPSB+Ulg4MDI1X0JJVF9DVFJMMl9DVEZHOworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlydGNfdXBkYXRlX2lycShyeDgwMjUtPnJ0YywgMSwgUlRDX1BGIHwgUlRDX0lSUUYpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJfQorCisJaWYgKHN0YXR1cyAmIFJYODAyNV9CSVRfQ1RSTDJfREFGRykgeworCQkvKiBhbGFybSAqLworCQlzdGF0dXMgJj0gUlg4MDI1X0JJVF9DVFJMMl9EQUZHOworCQlpZiAocng4MDI1X3dyaXRlX3JlZyhjbGllbnQsIFJYODAyNV9SRUdfQ1RSTDEsCisJCQkJICAgICByeDgwMjUtPmN0cmwxICYgflJYODAyNV9CSVRfQ1RSTDFfREFMRSkpCisJCQlnb3RvIG91dDsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJcnRjX3VwZGF0ZV9pcnEocng4MDI1LT5ydGMsIDEsIFJUQ19BRiB8IFJUQ19JUlFGKTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0KKworCS8qIGFja25vd2xlZGdlIElSUSAqLworCXJ4ODAyNV93cml0ZV9yZWcoY2xpZW50LCBSWDgwMjVfUkVHX0NUUkwyLAorCQkJIHN0YXR1cyB8IFJYODAyNV9CSVRfQ1RSTDJfWFNUKTsKKworb3V0OgorCWlmICghcng4MDI1LT5leGl0aW5nKQorCQllbmFibGVfaXJxKGNsaWVudC0+aXJxKTsKKworCW11dGV4X3VubG9jayhsb2NrKTsKK30KKworc3RhdGljIGludCByeDgwMjVfZ2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworCXN0cnVjdCByeDgwMjVfZGF0YSAqcng4MDI1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggZGF0ZVs3XTsKKwlpbnQgZXJyOworCisJZXJyID0gcng4MDI1X3JlYWRfcmVncyhyeDgwMjUtPmNsaWVudCwgUlg4MDI1X1JFR19TRUMsIDcsIGRhdGUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkZXZfZGJnKGRldiwgIiVzOiByZWFkIDB4JTAyeCAweCUwMnggIgorCQkiMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeFxuIiwgX19mdW5jX18sCisJCWRhdGVbMF0sIGRhdGVbMV0sIGRhdGVbMl0sIGRhdGVbM10sIGRhdGVbNF0sCisJCWRhdGVbNV0sIGRhdGVbNl0pOworCisJZHQtPnRtX3NlYyA9IGJjZDJiaW4oZGF0ZVtSWDgwMjVfUkVHX1NFQ10gJiAweDdmKTsKKwlkdC0+dG1fbWluID0gYmNkMmJpbihkYXRlW1JYODAyNV9SRUdfTUlOXSAmIDB4N2YpOworCWlmIChyeDgwMjUtPmN0cmwxICYgUlg4MDI1X0JJVF9DVFJMMV8xMjI0KQorCQlkdC0+dG1faG91ciA9IGJjZDJiaW4oZGF0ZVtSWDgwMjVfUkVHX0hPVVJdICYgMHgzZik7CisJZWxzZQorCQlkdC0+dG1faG91ciA9IGJjZDJiaW4oZGF0ZVtSWDgwMjVfUkVHX0hPVVJdICYgMHgxZikgJSAxMgorCQkJKyAoZGF0ZVtSWDgwMjVfUkVHX0hPVVJdICYgMHgyMCA/IDEyIDogMCk7CisKKwlkdC0+dG1fbWRheSA9IGJjZDJiaW4oZGF0ZVtSWDgwMjVfUkVHX01EQVldICYgMHgzZik7CisJZHQtPnRtX21vbiA9IGJjZDJiaW4oZGF0ZVtSWDgwMjVfUkVHX01PTlRIXSAmIDB4MWYpIC0gMTsKKwlkdC0+dG1feWVhciA9IGJjZDJiaW4oZGF0ZVtSWDgwMjVfUkVHX1lFQVJdKTsKKworCWlmIChkdC0+dG1feWVhciA8IDcwKQorCQlkdC0+dG1feWVhciArPSAxMDA7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBkYXRlICVkcyAlZG0gJWRoICVkbWQgJWRtICVkeVxuIiwgX19mdW5jX18sCisJCWR0LT50bV9zZWMsIGR0LT50bV9taW4sIGR0LT50bV9ob3VyLAorCQlkdC0+dG1fbWRheSwgZHQtPnRtX21vbiwgZHQtPnRtX3llYXIpOworCisJcmV0dXJuIHJ0Y192YWxpZF90bShkdCk7Cit9CisKK3N0YXRpYyBpbnQgcng4MDI1X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3sKKwlzdHJ1Y3Qgcng4MDI1X2RhdGEgKnJ4ODAyNSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4IGRhdGVbN107CisKKwkvKgorCSAqIEJVRzogVGhlIEhXIGFzc3VtZXMgZXZlcnkgeWVhciB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgNCB0byBiZSBhIGxlYXAKKwkgKiB5ZWFyLiAgTmV4dCB0aW1lIHRoaXMgaXMgd3JvbmcgaXMgMjEwMCwgd2hpY2ggd2lsbCBub3QgYmUgYSBsZWFwCisJICogeWVhci4KKwkgKi8KKworCS8qCisJICogSGVyZSB0aGUgcmVhZC1vbmx5IGJpdHMgYXJlIHdyaXR0ZW4gYXMgIjAiLiAgSSdtIG5vdCBzdXJlIGlmIHRoYXQKKwkgKiBpcyBzb3VuZC4KKwkgKi8KKwlkYXRlW1JYODAyNV9SRUdfU0VDXSA9IGJpbjJiY2QoZHQtPnRtX3NlYyk7CisJZGF0ZVtSWDgwMjVfUkVHX01JTl0gPSBiaW4yYmNkKGR0LT50bV9taW4pOworCWlmIChyeDgwMjUtPmN0cmwxICYgUlg4MDI1X0JJVF9DVFJMMV8xMjI0KQorCQlkYXRlW1JYODAyNV9SRUdfSE9VUl0gPSBiaW4yYmNkKGR0LT50bV9ob3VyKTsKKwllbHNlCisJCWRhdGVbUlg4MDI1X1JFR19IT1VSXSA9IChkdC0+dG1faG91ciA+PSAxMiA/IDB4MjAgOiAwKQorCQkJfCBiaW4yYmNkKChkdC0+dG1faG91ciArIDExKSAlIDEyICsgMSk7CisKKwlkYXRlW1JYODAyNV9SRUdfV0RBWV0gPSBiaW4yYmNkKGR0LT50bV93ZGF5KTsKKwlkYXRlW1JYODAyNV9SRUdfTURBWV0gPSBiaW4yYmNkKGR0LT50bV9tZGF5KTsKKwlkYXRlW1JYODAyNV9SRUdfTU9OVEhdID0gYmluMmJjZChkdC0+dG1fbW9uICsgMSk7CisJZGF0ZVtSWDgwMjVfUkVHX1lFQVJdID0gYmluMmJjZChkdC0+dG1feWVhciAlIDEwMCk7CisKKwlkZXZfZGJnKGRldiwKKwkJIiVzOiB3cml0ZSAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCisJCV9fZnVuY19fLAorCQlkYXRlWzBdLCBkYXRlWzFdLCBkYXRlWzJdLCBkYXRlWzNdLCBkYXRlWzRdLCBkYXRlWzVdLCBkYXRlWzZdKTsKKworCXJldHVybiByeDgwMjVfd3JpdGVfcmVncyhyeDgwMjUtPmNsaWVudCwgUlg4MDI1X1JFR19TRUMsIDcsIGRhdGUpOworfQorCitzdGF0aWMgaW50IHJ4ODAyNV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgKm5lZWRfcmVzZXQpCit7CisJc3RydWN0IHJ4ODAyNV9kYXRhICpyeDgwMjUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCBjdHJsWzJdLCBjdHJsMjsKKwlpbnQgbmVlZF9jbGVhciA9IDA7CisJaW50IGVycjsKKworCWVyciA9IHJ4ODAyNV9yZWFkX3JlZ3Mocng4MDI1LT5jbGllbnQsIFJYODAyNV9SRUdfQ1RSTDEsIDIsIGN0cmwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogS2VlcCB0ZXN0IGJpdCB6ZXJvICEgKi8KKwlyeDgwMjUtPmN0cmwxID0gY3RybFswXSAmIH5SWDgwMjVfQklUX0NUUkwxX1RFU1Q7CisKKwlpZiAoY3RybFsxXSAmIFJYODAyNV9CSVRfQ1RSTDJfUE9OKSB7CisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgInBvd2VyLW9uIHJlc2V0IHdhcyBkZXRlY3RlZCwgIgorCQkJICJ5b3UgbWF5IGhhdmUgdG8gcmVhZGp1c3QgdGhlIGNsb2NrXG4iKTsKKwkJKm5lZWRfcmVzZXQgPSAxOworCX0KKworCWlmIChjdHJsWzFdICYgUlg4MDI1X0JJVF9DVFJMMl9WREVUKSB7CisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgImEgcG93ZXIgdm9sdGFnZSBkcm9wIHdhcyBkZXRlY3RlZCwgIgorCQkJICJ5b3UgbWF5IGhhdmUgdG8gcmVhZGp1c3QgdGhlIGNsb2NrXG4iKTsKKwkJKm5lZWRfcmVzZXQgPSAxOworCX0KKworCWlmICghKGN0cmxbMV0gJiBSWDgwMjVfQklUX0NUUkwyX1hTVCkpIHsKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiT3NjaWxsYXRpb24gc3RvcCB3YXMgZGV0ZWN0ZWQsIgorCQkJICJ5b3UgbWF5IGhhdmUgdG8gcmVhZGp1c3QgdGhlIGNsb2NrXG4iKTsKKwkJKm5lZWRfcmVzZXQgPSAxOworCX0KKworCWlmIChjdHJsWzFdICYgKFJYODAyNV9CSVRfQ1RSTDJfREFGRyB8IFJYODAyNV9CSVRfQ1RSTDJfV0FGRykpIHsKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiQWxhcm0gd2FzIGRldGVjdGVkXG4iKTsKKwkJbmVlZF9jbGVhciA9IDE7CisJfQorCisJaWYgKCEoY3RybFsxXSAmIFJYODAyNV9CSVRfQ1RSTDJfQ1RGRykpCisJCW5lZWRfY2xlYXIgPSAxOworCisJaWYgKCpuZWVkX3Jlc2V0IHx8IG5lZWRfY2xlYXIpIHsKKwkJY3RybDIgPSBjdHJsWzBdOworCQljdHJsMiAmPSB+KFJYODAyNV9CSVRfQ1RSTDJfUE9OIHwgUlg4MDI1X0JJVF9DVFJMMl9WREVUIHwKKwkJCSAgIFJYODAyNV9CSVRfQ1RSTDJfQ1RGRyB8IFJYODAyNV9CSVRfQ1RSTDJfV0FGRyB8CisJCQkgICBSWDgwMjVfQklUX0NUUkwyX0RBRkcpOworCQljdHJsMiB8PSBSWDgwMjVfQklUX0NUUkwyX1hTVDsKKworCQllcnIgPSByeDgwMjVfd3JpdGVfcmVnKGNsaWVudCwgUlg4MDI1X1JFR19DVFJMMiwgY3RybDIpOworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKiBBbGFybSBzdXBwb3J0ICovCitzdGF0aWMgaW50IHJ4ODAyNV9yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCit7CisJc3RydWN0IHJ4ODAyNV9kYXRhICpyeDgwMjUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gcng4MDI1LT5jbGllbnQ7CisJdTggY3RybDIsIGFsZFsyXTsKKwlpbnQgZXJyOworCisJaWYgKGNsaWVudC0+aXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gcng4MDI1X3JlYWRfcmVncyhjbGllbnQsIFJYODAyNV9SRUdfQUxETUlOLCAyLCBhbGQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSByeDgwMjVfcmVhZF9yZWcoY2xpZW50LCBSWDgwMjVfUkVHX0NUUkwyLCAmY3RybDIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkZXZfZGJnKGRldiwgIiVzOiByZWFkIGFsYXJtIDB4JTAyeCAweCUwMnggY3RybDIgJTAyeFxuIiwKKwkJX19mdW5jX18sIGFsZFswXSwgYWxkWzFdLCBjdHJsMik7CisKKwkvKiBIYXJkd2FyZSBhbGFybXMgcHJlY2lzaW9uIGlzIDEgbWludXRlISAqLworCXQtPnRpbWUudG1fc2VjID0gMDsKKwl0LT50aW1lLnRtX21pbiA9IGJjZDJiaW4oYWxkWzBdICYgMHg3Zik7CisJaWYgKHJ4ODAyNS0+Y3RybDEgJiBSWDgwMjVfQklUX0NUUkwxXzEyMjQpCisJCXQtPnRpbWUudG1faG91ciA9IGJjZDJiaW4oYWxkWzFdICYgMHgzZik7CisJZWxzZQorCQl0LT50aW1lLnRtX2hvdXIgPSBiY2QyYmluKGFsZFsxXSAmIDB4MWYpICUgMTIKKwkJCSsgKGFsZFsxXSAmIDB4MjAgPyAxMiA6IDApOworCisJdC0+dGltZS50bV93ZGF5ID0gLTE7CisJdC0+dGltZS50bV9tZGF5ID0gLTE7CisJdC0+dGltZS50bV9tb24gPSAtMTsKKwl0LT50aW1lLnRtX3llYXIgPSAtMTsKKworCWRldl9kYmcoZGV2LCAiJXM6IGRhdGU6ICVkcyAlZG0gJWRoICVkbWQgJWRtICVkeVxuIiwKKwkJX19mdW5jX18sCisJCXQtPnRpbWUudG1fc2VjLCB0LT50aW1lLnRtX21pbiwgdC0+dGltZS50bV9ob3VyLAorCQl0LT50aW1lLnRtX21kYXksIHQtPnRpbWUudG1fbW9uLCB0LT50aW1lLnRtX3llYXIpOworCXQtPmVuYWJsZWQgPSAhIShyeDgwMjUtPmN0cmwxICYgUlg4MDI1X0JJVF9DVFJMMV9EQUxFKTsKKwl0LT5wZW5kaW5nID0gKGN0cmwyICYgUlg4MDI1X0JJVF9DVFJMMl9EQUZHKSAmJiB0LT5lbmFibGVkOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByeDgwMjVfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgcng4MDI1X2RhdGEgKnJ4ODAyNSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4IGFsZFsyXTsKKwlpbnQgZXJyOworCisJaWYgKGNsaWVudC0+aXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSGFyZHdhcmUgYWxhcm0gcHJlY2lzaW9uIGlzIDEgbWludXRlISAqLworCWFsZFswXSA9IGJpbjJiY2QodC0+dGltZS50bV9taW4pOworCWlmIChyeDgwMjUtPmN0cmwxICYgUlg4MDI1X0JJVF9DVFJMMV8xMjI0KQorCQlhbGRbMV0gPSBiaW4yYmNkKHQtPnRpbWUudG1faG91cik7CisJZWxzZQorCQlhbGRbMV0gPSAodC0+dGltZS50bV9ob3VyID49IDEyID8gMHgyMCA6IDApCisJCQl8IGJpbjJiY2QoKHQtPnRpbWUudG1faG91ciArIDExKSAlIDEyICsgMSk7CisKKwlkZXZfZGJnKGRldiwgIiVzOiB3cml0ZSAweCUwMnggMHglMDJ4XG4iLCBfX2Z1bmNfXywgYWxkWzBdLCBhbGRbMV0pOworCisJaWYgKHJ4ODAyNS0+Y3RybDEgJiBSWDgwMjVfQklUX0NUUkwxX0RBTEUpIHsKKwkJcng4MDI1LT5jdHJsMSAmPSB+Ulg4MDI1X0JJVF9DVFJMMV9EQUxFOworCQllcnIgPSByeDgwMjVfd3JpdGVfcmVnKHJ4ODAyNS0+Y2xpZW50LCBSWDgwMjVfUkVHX0NUUkwxLAorCQkJCSAgICAgICByeDgwMjUtPmN0cmwxKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCWVyciA9IHJ4ODAyNV93cml0ZV9yZWdzKHJ4ODAyNS0+Y2xpZW50LCBSWDgwMjVfUkVHX0FMRE1JTiwgMiwgYWxkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHQtPmVuYWJsZWQpIHsKKwkJcng4MDI1LT5jdHJsMSB8PSBSWDgwMjVfQklUX0NUUkwxX0RBTEU7CisJCWVyciA9IHJ4ODAyNV93cml0ZV9yZWcocng4MDI1LT5jbGllbnQsIFJYODAyNV9SRUdfQ1RSTDEsCisJCQkJICAgICAgIHJ4ODAyNS0+Y3RybDEpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByeDgwMjVfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCByeDgwMjVfZGF0YSAqcng4MDI1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggY3RybDE7CisJaW50IGVycjsKKworCWN0cmwxID0gcng4MDI1LT5jdHJsMTsKKwlpZiAoZW5hYmxlZCkKKwkJY3RybDEgfD0gUlg4MDI1X0JJVF9DVFJMMV9EQUxFOworCWVsc2UKKwkJY3RybDEgJj0gflJYODAyNV9CSVRfQ1RSTDFfREFMRTsKKworCWlmIChjdHJsMSAhPSByeDgwMjUtPmN0cmwxKSB7CisJCXJ4ODAyNS0+Y3RybDEgPSBjdHJsMTsKKwkJZXJyID0gcng4MDI1X3dyaXRlX3JlZyhyeDgwMjUtPmNsaWVudCwgUlg4MDI1X1JFR19DVFJMMSwKKwkJCQkgICAgICAgcng4MDI1LT5jdHJsMSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHJ4ODAyNV9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgPSByeDgwMjVfZ2V0X3RpbWUsCisJLnNldF90aW1lID0gcng4MDI1X3NldF90aW1lLAorCS5yZWFkX2FsYXJtID0gcng4MDI1X3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IHJ4ODAyNV9zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSByeDgwMjVfYWxhcm1faXJxX2VuYWJsZSwKK307CisKKy8qCisgKiBDbG9jayBwcmVjaXNpb24gYWRqdXN0bWVudCBzdXBwb3J0CisgKgorICogQWNjb3JkaW5nIHRvIHRoZSBSWDgwMjUgU0EvTkIgYXBwbGljYXRpb24gbWFudWFsIHRoZSBmcmVxdWVuY3kgYW5kCisgKiB0ZW1wZXJhdHVyZSBjaGFyYWN0ZXJpc3RpY3MgY2FuIGJlIGFwcHJveGltYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nCisgKiBlcXVhdGlvbjoKKyAqCisgKiAgIGRmID0gYSAqICh1dCAtIHQpKioyCisgKgorICogICBkZjogRnJlcXVlbmN5IGRldmlhdGlvbiBpbiBhbnkgdGVtcGVyYXR1cmUKKyAqICAgYSA6IENvZWZmaWNpZW50ID0gKC0zNSArLTUpICogMTAqKi05CisgKiAgIHV0OiBVbHRpbWF0ZSB0ZW1wZXJhdHVyZSBpbiBkZWdyZWUgPSArMjUgKy01IGRlZ3JlZQorICogICB0IDogQW55IHRlbXBlcmF0dXJlIGluIGRlZ3JlZQorICoKKyAqIE5vdGUgdGhhdCB0aGUgY2xvY2sgYWRqdXN0bWVudCBpbiBwcGIgbXVzdCBiZSBlbnRlcmVkICh3aGljaCBpcworICogdGhlIG5lZ2F0aXZlIHZhbHVlIG9mIHRoZSBkZXZpYXRpb24pLgorICovCitzdGF0aWMgaW50IHJ4ODAyNV9nZXRfY2xvY2tfYWRqdXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50ICphZGopCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1OCBkaWdvZmY7CisJaW50IGVycjsKKworCWVyciA9IHJ4ODAyNV9yZWFkX3JlZyhjbGllbnQsIFJYODAyNV9SRUdfRElHT0ZGLCAmZGlnb2ZmKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJKmFkaiA9IGRpZ29mZiA+PSA2NCA/IGRpZ29mZiAtIDEyOCA6IGRpZ29mZjsKKwlpZiAoKmFkaiA+IDApCisJCSgqYWRqKS0tOworCSphZGogKj0gLVJYODAyNV9BREpfUkVTT0xVVElPTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ4ODAyNV9zZXRfY2xvY2tfYWRqdXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGFkaikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXU4IGRpZ29mZjsKKwlpbnQgZXJyOworCisJYWRqIC89IC1SWDgwMjVfQURKX1JFU09MVVRJT047CisJaWYgKGFkaiA+IFJYODAyNV9BREpfREFUQV9NQVgpCisJCWFkaiA9IFJYODAyNV9BREpfREFUQV9NQVg7CisJZWxzZSBpZiAoYWRqIDwgUlg4MDI1X0FESl9EQVRBX01JTikKKwkJYWRqID0gUlg4MDI1X0FESl9EQVRBX01JTjsKKwllbHNlIGlmIChhZGogPiAwKQorCQlhZGorKzsKKwllbHNlIGlmIChhZGogPCAwKQorCQlhZGogKz0gMTI4OworCWRpZ29mZiA9IGFkajsKKworCWVyciA9IHJ4ODAyNV93cml0ZV9yZWcoY2xpZW50LCBSWDgwMjVfUkVHX0RJR09GRiwgZGlnb2ZmKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZGV2X2RiZyhkZXYsICIlczogd3JpdGUgMHglMDJ4XG4iLCBfX2Z1bmNfXywgZGlnb2ZmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCByeDgwMjVfc3lzZnNfc2hvd19jbG9ja19hZGp1c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgY2hhciAqYnVmKQoreworCWludCBlcnIsIGFkajsKKworCWVyciA9IHJ4ODAyNV9nZXRfY2xvY2tfYWRqdXN0KGRldiwgJmFkaik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBhZGopOworfQorCitzdGF0aWMgc3NpemVfdCByeDgwMjVfc3lzZnNfc3RvcmVfY2xvY2tfYWRqdXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGFkaiwgZXJyOworCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZhZGopICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gcng4MDI1X3NldF9jbG9ja19hZGp1c3QoZGV2LCBhZGopOworCisJcmV0dXJuIGVyciA/IGVyciA6IGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY2xvY2tfYWRqdXN0X3BwYiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHJ4ODAyNV9zeXNmc19zaG93X2Nsb2NrX2FkanVzdCwKKwkJICAgcng4MDI1X3N5c2ZzX3N0b3JlX2Nsb2NrX2FkanVzdCk7CisKK3N0YXRpYyBpbnQgcng4MDI1X3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2Nsb2NrX2FkanVzdF9wcGIpOworfQorCitzdGF0aWMgdm9pZCByeDgwMjVfc3lzZnNfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2Nsb2NrX2FkanVzdF9wcGIpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCByeDgwMjVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOworCXN0cnVjdCByeDgwMjVfZGF0YSAqcng4MDI1OworCWludCBlcnIsIG5lZWRfcmVzZXQgPSAwOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEKKwkJCQkgICAgIHwgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCisJCQkiZG9lc24ndCBzdXBwb3J0IHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHlcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlyeDgwMjUgPSBremFsbG9jKHNpemVvZigqcng4MDI1KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeDgwMjUpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIG1lbW9yeVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3V0OworCX0KKworCXJ4ODAyNS0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHJ4ODAyNSk7CisJSU5JVF9XT1JLKCZyeDgwMjUtPndvcmssIHJ4ODAyNV93b3JrKTsKKworCWVyciA9IHJ4ODAyNV9pbml0X2NsaWVudChjbGllbnQsICZuZWVkX3Jlc2V0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm91dF9mcmVlOworCisJaWYgKG5lZWRfcmVzZXQpIHsKKwkJc3RydWN0IHJ0Y190aW1lIHRtOworCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsCisJCQkgImJhZCBjb25kaXRpb25zIGRldGVjdGVkLCByZXNldHRpbmcgZGF0ZVxuIik7CisJCXJ0Y190aW1lX3RvX3RtKDAsICZ0bSk7CS8qIDE5NzAvMS8xICovCisJCXJ4ODAyNV9zZXRfdGltZSgmY2xpZW50LT5kZXYsICZ0bSk7CisJfQorCisJcng4MDI1LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKGNsaWVudC0+bmFtZSwgJmNsaWVudC0+ZGV2LAorCQkJCQkgICZyeDgwMjVfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocng4MDI1LT5ydGMpKSB7CisJCWVyciA9IFBUUl9FUlIocng4MDI1LT5ydGMpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciB0aGUgY2xhc3MgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJvdXRfZnJlZTsKKwl9CisKKwlpZiAoY2xpZW50LT5pcnEgPiAwKSB7CisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIklSUSAlZCBzdXBwbGllZFxuIiwgY2xpZW50LT5pcnEpOworCQllcnIgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgcng4MDI1X2lycSwKKwkJCQkgIDAsICJyeDgwMjUiLCBjbGllbnQpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IElSUVxuIik7CisJCQlnb3RvIGVycm91dF9yZWc7CisJCX0KKwl9CisKKwlyeDgwMjUtPnJ0Yy0+aXJxX2ZyZXEgPSAxOworCXJ4ODAyNS0+cnRjLT5tYXhfdXNlcl9mcmVxID0gMTsKKworCWVyciA9IHJ4ODAyNV9zeXNmc19yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3V0X2lycTsKKworCXJldHVybiAwOworCitlcnJvdXRfaXJxOgorCWlmIChjbGllbnQtPmlycSA+IDApCisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBjbGllbnQpOworCitlcnJvdXRfcmVnOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihyeDgwMjUtPnJ0Yyk7CisKK2Vycm91dF9mcmVlOgorCWtmcmVlKHJ4ODAyNSk7CisKK2Vycm91dDoKKwlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJwcm9iaW5nIGZvciByeDgwMjUgZmFpbGVkXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCByeDgwMjVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ4ODAyNV9kYXRhICpyeDgwMjUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXV0ZXggKmxvY2sgPSAmcng4MDI1LT5ydGMtPm9wc19sb2NrOworCisJaWYgKGNsaWVudC0+aXJxID4gMCkgeworCQltdXRleF9sb2NrKGxvY2spOworCQlyeDgwMjUtPmV4aXRpbmcgPSAxOworCQltdXRleF91bmxvY2sobG9jayk7CisKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGNsaWVudCk7CisJCWNhbmNlbF93b3JrX3N5bmMoJnJ4ODAyNS0+d29yayk7CisJfQorCisJcng4MDI1X3N5c2ZzX3VucmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocng4MDI1LT5ydGMpOworCWtmcmVlKHJ4ODAyNSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciByeDgwMjVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInJ0Yy1yeDgwMjUiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSByeDgwMjVfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChyeDgwMjVfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSByeDgwMjVfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihyeDgwMjVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJYLTgwMjUgU0EvTkIgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXJ4ODU4MS5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXJ4ODU4MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDgyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtcng4NTgxLmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBBbiBJMkMgZHJpdmVyIGZvciB0aGUgRXBzb24gUlg4NTgxIFJUQworICoKKyAqIEF1dGhvcjogTWFydHluIFdlbGNoIDxtYXJ0eW4ud2VsY2hAZ2UuY29tPgorICogQ29weXJpZ2h0IDIwMDggR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEJhc2VkIG9uOiBydGMtcGNmODU2My5jIChBbiBJMkMgZHJpdmVyIGZvciB0aGUgUGhpbGlwcyBQQ0Y4NTYzIFJUQykKKyAqIENvcHlyaWdodCAyMDA1LTA2IFRvd2VyIFRlY2hub2xvZ2llcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMSIKKworI2RlZmluZSBSWDg1ODFfUkVHX1NDCQkweDAwIC8qIFNlY29uZCBpbiBCQ0QgKi8KKyNkZWZpbmUgUlg4NTgxX1JFR19NTgkJMHgwMSAvKiBNaW51dGUgaW4gQkNEICovCisjZGVmaW5lIFJYODU4MV9SRUdfSFIJCTB4MDIgLyogSG91ciBpbiBCQ0QgKi8KKyNkZWZpbmUgUlg4NTgxX1JFR19EVwkJMHgwMyAvKiBEYXkgb2YgV2VlayAqLworI2RlZmluZSBSWDg1ODFfUkVHX0RNCQkweDA0IC8qIERheSBvZiBNb250aCBpbiBCQ0QgKi8KKyNkZWZpbmUgUlg4NTgxX1JFR19NTwkJMHgwNSAvKiBNb250aCBpbiBCQ0QgKi8KKyNkZWZpbmUgUlg4NTgxX1JFR19ZUgkJMHgwNiAvKiBZZWFyIGluIEJDRCAqLworI2RlZmluZSBSWDg1ODFfUkVHX1JBTQkJMHgwNyAvKiBSQU0gKi8KKyNkZWZpbmUgUlg4NTgxX1JFR19BTU4JCTB4MDggLyogQWxhcm0gTWluIGluIEJDRCovCisjZGVmaW5lIFJYODU4MV9SRUdfQUhSCQkweDA5IC8qIEFsYXJtIEhvdXIgaW4gQkNEICovCisjZGVmaW5lIFJYODU4MV9SRUdfQURNCQkweDBBCisjZGVmaW5lIFJYODU4MV9SRUdfQURXCQkweDBBCisjZGVmaW5lIFJYODU4MV9SRUdfVE1SMAkJMHgwQgorI2RlZmluZSBSWDg1ODFfUkVHX1RNUjEJCTB4MEMKKyNkZWZpbmUgUlg4NTgxX1JFR19FWFQJCTB4MEQgLyogRXh0ZW5zaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFJYODU4MV9SRUdfRkxBRwkJMHgwRSAvKiBGbGFnIFJlZ2lzdGVyICovCisjZGVmaW5lIFJYODU4MV9SRUdfQ1RSTAkJMHgwRiAvKiBDb250cm9sIFJlZ2lzdGVyICovCisKKworLyogRmxhZyBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUlg4NTgxX0ZMQUdfVUYJCTB4MjAgLyogVXBkYXRlICovCisjZGVmaW5lIFJYODU4MV9GTEFHX1RGCQkweDEwIC8qIFRpbWVyICovCisjZGVmaW5lIFJYODU4MV9GTEFHX0FGCQkweDA4IC8qIEFsYXJtICovCisjZGVmaW5lIFJYODU4MV9GTEFHX1ZMRgkJMHgwMiAvKiBWb2x0YWdlIExvdyAqLworCisvKiBDb250cm9sIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBSWDg1ODFfQ1RSTF9VSUUJCTB4MjAgLyogVXBkYXRlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUlg4NTgxX0NUUkxfVElFCQkweDEwIC8qIFRpbWVyIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUlg4NTgxX0NUUkxfQUlFCQkweDA4IC8qIEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUlg4NTgxX0NUUkxfU1RPUAkweDAyIC8qIFNUT1AgYml0ICovCisjZGVmaW5lIFJYODU4MV9DVFJMX1JFU0VUCTB4MDEgLyogUkVTRVQgYml0ICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciByeDg1ODFfZHJpdmVyOworCisvKgorICogSW4gdGhlIHJvdXRpbmVzIHRoYXQgZGVhbCBkaXJlY3RseSB3aXRoIHRoZSByeDg1ODEgaGFyZHdhcmUsIHdlIHVzZQorICogcnRjX3RpbWUgLS0gbW9udGggMC0xMSwgaG91ciAwLTIzLCB5ciA9IGNhbGVuZGFyIHllYXItZXBvY2guCisgKi8KK3N0YXRpYyBpbnQgcng4NTgxX2dldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGNoYXIgZGF0ZVs3XTsKKwlpbnQgZGF0YSwgZXJyOworCisJLyogRmlyc3Qgd2UgZW5zdXJlIHRoYXQgdGhlICJ1cGRhdGUgZmxhZyIgaXMgbm90IHNldCwgd2UgcmVhZCB0aGUKKwkgKiB0aW1lIGFuZCBkYXRlIHRoZW4gcmUtcmVhZCB0aGUgInVwZGF0ZSBmbGFnIi4gSWYgdGhlIHVwZGF0ZSBmbGFnCisJICogaGFzIGJlZW4gc2V0LCB3ZSBrbm93IHRoYXQgdGhlIHRpbWUgaGFzIGNoYW5nZWQgZHVyaW5nIHRoZSByZWFkIHNvCisJICogd2UgcmVwZWF0IHRoZSB3aG9sZSBwcm9jZXNzIGFnYWluLgorCSAqLworCWRhdGEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBSWDg1ODFfUkVHX0ZMQUcpOworCWlmIChkYXRhIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuYWJsZSB0byByZWFkIGRldmljZSBmbGFnc1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRvIHsKKwkJLyogSWYgdXBkYXRlIGZsYWcgc2V0LCBjbGVhciBpdCAqLworCQlpZiAoZGF0YSAmIFJYODU4MV9GTEFHX1VGKSB7CisJCQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQlSWDg1ODFfUkVHX0ZMQUcsIChkYXRhICYgflJYODU4MV9GTEFHX1VGKSk7CisJCQlpZiAoZXJyICE9IDApIHsKKwkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuYWJsZSB0byB3cml0ZSBkZXZpY2UgIgorCQkJCQkiZmxhZ3NcbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisKKwkJLyogTm93IHJlYWQgdGltZSBhbmQgZGF0ZSAqLworCQllcnIgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfU0MsCisJCQk3LCBkYXRlKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIHJlYWQgZGF0ZVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIENoZWNrIGZsYWcgcmVnaXN0ZXIgKi8KKwkJZGF0YSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfRkxBRyk7CisJCWlmIChkYXRhIDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gcmVhZCBkZXZpY2UgZmxhZ3NcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IHdoaWxlIChkYXRhICYgUlg4NTgxX0ZMQUdfVUYpOworCisJaWYgKGRhdGEgJiBSWDg1ODFfRkxBR19WTEYpCisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJCSJsb3cgdm9sdGFnZSBkZXRlY3RlZCwgZGF0ZS90aW1lIGlzIG5vdCByZWxpYWJsZS5cbiIpOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCSIlczogcmF3IGRhdGEgaXMgc2VjPSUwMngsIG1pbj0lMDJ4LCBocj0lMDJ4LCAiCisJCSJ3ZGF5PSUwMngsIG1kYXk9JTAyeCwgbW9uPSUwMngsIHllYXI9JTAyeFxuIiwKKwkJX19mdW5jX18sCisJCWRhdGVbMF0sIGRhdGVbMV0sIGRhdGVbMl0sIGRhdGVbM10sIGRhdGVbNF0sIGRhdGVbNV0sIGRhdGVbNl0pOworCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4oZGF0ZVtSWDg1ODFfUkVHX1NDXSAmIDB4N0YpOworCXRtLT50bV9taW4gPSBiY2QyYmluKGRhdGVbUlg4NTgxX1JFR19NTl0gJiAweDdGKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oZGF0ZVtSWDg1ODFfUkVHX0hSXSAmIDB4M0YpOyAvKiBydGMgaHIgMC0yMyAqLworCXRtLT50bV93ZGF5ID0gaWxvZzIoZGF0ZVtSWDg1ODFfUkVHX0RXXSAmIDB4N0YpOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihkYXRlW1JYODU4MV9SRUdfRE1dICYgMHgzRik7CisJdG0tPnRtX21vbiA9IGJjZDJiaW4oZGF0ZVtSWDg1ODFfUkVHX01PXSAmIDB4MUYpIC0gMTsgLyogcnRjIG1uIDEtMTIgKi8KKwl0bS0+dG1feWVhciA9IGJjZDJiaW4oZGF0ZVtSWDg1ODFfUkVHX1lSXSk7CisJaWYgKHRtLT50bV95ZWFyIDwgNzApCisJCXRtLT50bV95ZWFyICs9IDEwMDsJLyogYXNzdW1lIHdlIGFyZSBpbiAxOTcwLi4uMjA2OSAqLworCisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiB0bSBpcyBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCwgIgorCQkibWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQlfX2Z1bmNfXywKKwkJdG0tPnRtX3NlYywgdG0tPnRtX21pbiwgdG0tPnRtX2hvdXIsCisJCXRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOworCisJZXJyID0gcnRjX3ZhbGlkX3RtKHRtKTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZXRyaWV2ZWQgZGF0ZS90aW1lIGlzIG5vdCB2YWxpZC5cbiIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByeDg1ODFfc2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IGRhdGEsIGVycjsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls3XTsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IHNlY3M9JWQsIG1pbnM9JWQsIGhvdXJzPSVkLCAiCisJCSJtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCisJCV9fZnVuY19fLAorCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKKwkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisKKwkvKiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcyAqLworCWJ1ZltSWDg1ODFfUkVHX1NDXSA9IGJpbjJiY2QodG0tPnRtX3NlYyk7CisJYnVmW1JYODU4MV9SRUdfTU5dID0gYmluMmJjZCh0bS0+dG1fbWluKTsKKwlidWZbUlg4NTgxX1JFR19IUl0gPSBiaW4yYmNkKHRtLT50bV9ob3VyKTsKKworCWJ1ZltSWDg1ODFfUkVHX0RNXSA9IGJpbjJiY2QodG0tPnRtX21kYXkpOworCisJLyogbW9udGgsIDEgLSAxMiAqLworCWJ1ZltSWDg1ODFfUkVHX01PXSA9IGJpbjJiY2QodG0tPnRtX21vbiArIDEpOworCisJLyogeWVhciBhbmQgY2VudHVyeSAqLworCWJ1ZltSWDg1ODFfUkVHX1lSXSA9IGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApOworCWJ1ZltSWDg1ODFfUkVHX0RXXSA9ICgweDEgPDwgdG0tPnRtX3dkYXkpOworCisJLyogU3RvcCB0aGUgY2xvY2sgKi8KKwlkYXRhID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgUlg4NTgxX1JFR19DVFJMKTsKKwlpZiAoZGF0YSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gcmVhZCBjb250cm9sIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfQ1RSTCwKKwkJKGRhdGEgfCBSWDg1ODFfQ1RSTF9TVE9QKSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gd3JpdGUgY29udHJvbCByZWdpc3RlclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHdyaXRlIHJlZ2lzdGVyJ3MgZGF0YSAqLworCWVyciA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfU0MsIDcsIGJ1Zik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gd3JpdGUgdG8gZGF0ZSByZWdpc3RlcnNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBnZXQgVkxGIGFuZCBjbGVhciBpdCAqLworCWRhdGEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBSWDg1ODFfUkVHX0ZMQUcpOworCWlmIChkYXRhIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuYWJsZSB0byByZWFkIGZsYWcgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgUlg4NTgxX1JFR19GTEFHLAorCQkoZGF0YSAmIH4oUlg4NTgxX0ZMQUdfVkxGKSkpOworCWlmIChlcnIgIT0gMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuYWJsZSB0byB3cml0ZSBmbGFnIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogUmVzdGFydCB0aGUgY2xvY2sgKi8KKwlkYXRhID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgUlg4NTgxX1JFR19DVFJMKTsKKwlpZiAoZGF0YSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gcmVhZCBjb250cm9sIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfQ1RSTCwKKwkJKGRhdGEgJiB+KFJYODU4MV9DVFJMX1NUT1ApKSk7CisJaWYgKGVyciAhPSAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIHdyaXRlIGNvbnRyb2wgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByeDg1ODFfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIHJ4ODU4MV9nZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKK3N0YXRpYyBpbnQgcng4NTgxX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIHJ4ODU4MV9zZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyByeDg1ODFfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gcng4NTgxX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gcng4NTgxX3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ4ODU4MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocng4NTgxX2RyaXZlci5kcml2ZXIubmFtZSwKKwkJCQkmY2xpZW50LT5kZXYsICZyeDg1ODFfcnRjX29wcywgVEhJU19NT0RVTEUpOworCisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCByeDg1ODFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHJ4ODU4MV9pZFtdID0geworCXsgInJ4ODU4MSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcng4NTgxX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJ4ODU4MV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1yeDg1ODEiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSByeDg1ODFfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChyeDg1ODFfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSByeDg1ODFfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihyeDg1ODFfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTWFydHluIFdlbGNoIDxtYXJ0eW4ud2VsY2hAZ2UuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFcHNvbiBSWC04NTgxIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1zMzUzOTBhLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtczM1MzkwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTYyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtczM1MzkwYS5jCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogU2Vpa28gSW5zdHJ1bWVudHMgUy0zNTM5MEEgUlRDIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCeXJvbiBCcmFkbGV5CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIFMzNTM5MEFfQ01EX1NUQVRVUzEJMAorI2RlZmluZSBTMzUzOTBBX0NNRF9TVEFUVVMyCTEKKyNkZWZpbmUgUzM1MzkwQV9DTURfVElNRTEJMgorCisjZGVmaW5lIFMzNTM5MEFfQllURV9ZRUFSCTAKKyNkZWZpbmUgUzM1MzkwQV9CWVRFX01PTlRICTEKKyNkZWZpbmUgUzM1MzkwQV9CWVRFX0RBWQkyCisjZGVmaW5lIFMzNTM5MEFfQllURV9XREFZCTMKKyNkZWZpbmUgUzM1MzkwQV9CWVRFX0hPVVJTCTQKKyNkZWZpbmUgUzM1MzkwQV9CWVRFX01JTlMJNQorI2RlZmluZSBTMzUzOTBBX0JZVEVfU0VDUwk2CisKKyNkZWZpbmUgUzM1MzkwQV9GTEFHX1BPQwkweDAxCisjZGVmaW5lIFMzNTM5MEFfRkxBR19CTEQJMHgwMgorI2RlZmluZSBTMzUzOTBBX0ZMQUdfMjRICTB4NDAKKyNkZWZpbmUgUzM1MzkwQV9GTEFHX1JFU0VUCTB4ODAKKyNkZWZpbmUgUzM1MzkwQV9GTEFHX1RFU1QJMHgwMQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgczM1MzkwYV9pZFtdID0geworCXsgInMzNTM5MGEiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHMzNTM5MGFfaWQpOworCitzdHJ1Y3QgczM1MzkwYSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudFs4XTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWludCB0d2VudHlmb3VyaG91cjsKK307CisKK3N0YXRpYyBpbnQgczM1MzkwYV9zZXRfcmVnKHN0cnVjdCBzMzUzOTBhICpzMzUzOTBhLCBpbnQgcmVnLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHMzNTM5MGEtPmNsaWVudFtyZWddOworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7IGNsaWVudC0+YWRkciwgMCwgbGVuLCBidWYgfSwKKwl9OworCisJaWYgKChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDEpKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzNTM5MGFfZ2V0X3JlZyhzdHJ1Y3QgczM1MzkwYSAqczM1MzkwYSwgaW50IHJlZywgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBzMzUzOTBhLT5jbGllbnRbcmVnXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKKwkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCBsZW4sIGJ1ZiB9LAorCX07CisKKwlpZiAoKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZywgMSkpICE9IDEpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczM1MzkwYV9yZXNldChzdHJ1Y3QgczM1MzkwYSAqczM1MzkwYSkKK3sKKwljaGFyIGJ1ZlsxXTsKKworCWlmIChzMzUzOTBhX2dldF9yZWcoczM1MzkwYSwgUzM1MzkwQV9DTURfU1RBVFVTMSwgYnVmLCBzaXplb2YoYnVmKSkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghKGJ1ZlswXSAmIChTMzUzOTBBX0ZMQUdfUE9DIHwgUzM1MzkwQV9GTEFHX0JMRCkpKQorCQlyZXR1cm4gMDsKKworCWJ1ZlswXSB8PSAoUzM1MzkwQV9GTEFHX1JFU0VUIHwgUzM1MzkwQV9GTEFHXzI0SCk7CisJYnVmWzBdICY9IDB4ZjA7CisJcmV0dXJuIHMzNTM5MGFfc2V0X3JlZyhzMzUzOTBhLCBTMzUzOTBBX0NNRF9TVEFUVVMxLCBidWYsIHNpemVvZihidWYpKTsKK30KKworc3RhdGljIGludCBzMzUzOTBhX2Rpc2FibGVfdGVzdF9tb2RlKHN0cnVjdCBzMzUzOTBhICpzMzUzOTBhKQoreworCWNoYXIgYnVmWzFdOworCisJaWYgKHMzNTM5MGFfZ2V0X3JlZyhzMzUzOTBhLCBTMzUzOTBBX0NNRF9TVEFUVVMyLCBidWYsIHNpemVvZihidWYpKSA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKCEoYnVmWzBdICYgUzM1MzkwQV9GTEFHX1RFU1QpKQorCQlyZXR1cm4gMDsKKworCWJ1ZlswXSAmPSB+UzM1MzkwQV9GTEFHX1RFU1Q7CisJcmV0dXJuIHMzNTM5MGFfc2V0X3JlZyhzMzUzOTBhLCBTMzUzOTBBX0NNRF9TVEFUVVMyLCBidWYsIHNpemVvZihidWYpKTsKK30KKworc3RhdGljIGNoYXIgczM1MzkwYV9ocjJyZWcoc3RydWN0IHMzNTM5MGEgKnMzNTM5MGEsIGludCBob3VyKQoreworCWlmIChzMzUzOTBhLT50d2VudHlmb3VyaG91cikKKwkJcmV0dXJuIGJpbjJiY2QoaG91cik7CisKKwlpZiAoaG91ciA8IDEyKQorCQlyZXR1cm4gYmluMmJjZChob3VyKTsKKworCXJldHVybiAweDQwIHwgYmluMmJjZChob3VyIC0gMTIpOworfQorCitzdGF0aWMgaW50IHMzNTM5MGFfcmVnMmhyKHN0cnVjdCBzMzUzOTBhICpzMzUzOTBhLCBjaGFyIHJlZykKK3sKKwl1bnNpZ25lZCBob3VyOworCisJaWYgKHMzNTM5MGEtPnR3ZW50eWZvdXJob3VyKQorCQlyZXR1cm4gYmNkMmJpbihyZWcgJiAweDNmKTsKKworCWhvdXIgPSBiY2QyYmluKHJlZyAmIDB4M2YpOworCWlmIChyZWcgJiAweDQwKQorCQlob3VyICs9IDEyOworCisJcmV0dXJuIGhvdXI7Cit9CisKK3N0YXRpYyBpbnQgczM1MzkwYV9zZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgczM1MzkwYQkqczM1MzkwYSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpLCBlcnI7CisJY2hhciBidWZbN107CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiB0bSBpcyBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCBtZGF5PSVkLCAiCisJCSJtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsIF9fZnVuY19fLCB0bS0+dG1fc2VjLAorCQl0bS0+dG1fbWluLCB0bS0+dG1faG91ciwgdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLAorCQl0bS0+dG1fd2RheSk7CisKKwlidWZbUzM1MzkwQV9CWVRFX1lFQVJdID0gYmluMmJjZCh0bS0+dG1feWVhciAtIDEwMCk7CisJYnVmW1MzNTM5MEFfQllURV9NT05USF0gPSBiaW4yYmNkKHRtLT50bV9tb24gKyAxKTsKKwlidWZbUzM1MzkwQV9CWVRFX0RBWV0gPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlidWZbUzM1MzkwQV9CWVRFX1dEQVldID0gYmluMmJjZCh0bS0+dG1fd2RheSk7CisJYnVmW1MzNTM5MEFfQllURV9IT1VSU10gPSBzMzUzOTBhX2hyMnJlZyhzMzUzOTBhLCB0bS0+dG1faG91cik7CisJYnVmW1MzNTM5MEFfQllURV9NSU5TXSA9IGJpbjJiY2QodG0tPnRtX21pbik7CisJYnVmW1MzNTM5MEFfQllURV9TRUNTXSA9IGJpbjJiY2QodG0tPnRtX3NlYyk7CisKKwkvKiBUaGlzIGNoaXAgZXhwZWN0cyB0aGUgYml0cyBvZiBlYWNoIGJ5dGUgdG8gYmUgaW4gcmV2ZXJzZSBvcmRlciAqLworCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCisJCWJ1ZltpXSA9IGJpdHJldjgoYnVmW2ldKTsKKworCWVyciA9IHMzNTM5MGFfc2V0X3JlZyhzMzUzOTBhLCBTMzUzOTBBX0NNRF9USU1FMSwgYnVmLCBzaXplb2YoYnVmKSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHMzNTM5MGFfZ2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHMzNTM5MGEgKnMzNTM5MGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwljaGFyIGJ1Zls3XTsKKwlpbnQgaSwgZXJyOworCisJZXJyID0gczM1MzkwYV9nZXRfcmVnKHMzNTM5MGEsIFMzNTM5MEFfQ01EX1RJTUUxLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIFRoaXMgY2hpcCByZXR1cm5zIHRoZSBiaXRzIG9mIGVhY2ggYnl0ZSBpbiByZXZlcnNlIG9yZGVyICovCisJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKKwkJYnVmW2ldID0gYml0cmV2OChidWZbaV0pOworCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4oYnVmW1MzNTM5MEFfQllURV9TRUNTXSk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4oYnVmW1MzNTM5MEFfQllURV9NSU5TXSk7CisJdG0tPnRtX2hvdXIgPSBzMzUzOTBhX3JlZzJocihzMzUzOTBhLCBidWZbUzM1MzkwQV9CWVRFX0hPVVJTXSk7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKGJ1ZltTMzUzOTBBX0JZVEVfV0RBWV0pOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihidWZbUzM1MzkwQV9CWVRFX0RBWV0pOworCXRtLT50bV9tb24gPSBiY2QyYmluKGJ1ZltTMzUzOTBBX0JZVEVfTU9OVEhdKSAtIDE7CisJdG0tPnRtX3llYXIgPSBiY2QyYmluKGJ1ZltTMzUzOTBBX0JZVEVfWUVBUl0pICsgMTAwOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogdG0gaXMgc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsIG1kYXk9JWQsICIKKwkJIm1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwgX19mdW5jX18sIHRtLT50bV9zZWMsCisJCXRtLT50bV9taW4sIHRtLT50bV9ob3VyLCB0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsCisJCXRtLT50bV93ZGF5KTsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IHMzNTM5MGFfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIHMzNTM5MGFfZ2V0X2RhdGV0aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOworfQorCitzdGF0aWMgaW50IHMzNTM5MGFfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gczM1MzkwYV9zZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzMzUzOTBhX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHMzNTM5MGFfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBzMzUzOTBhX3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzMzUzOTBhX2RyaXZlcjsKKworc3RhdGljIGludCBzMzUzOTBhX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHMzNTM5MGEgKnMzNTM5MGE7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCWNoYXIgYnVmWzFdOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCXMzNTM5MGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgczM1MzkwYSksIEdGUF9LRVJORUwpOworCWlmICghczM1MzkwYSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJczM1MzkwYS0+Y2xpZW50WzBdID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHMzNTM5MGEpOworCisJLyogVGhpcyBjaGlwIHVzZXMgbXVsdGlwbGUgYWRkcmVzc2VzLCB1c2UgZHVtbXkgZGV2aWNlcyBmb3IgdGhlbSAqLworCWZvciAoaSA9IDE7IGkgPCA4OyArK2kpIHsKKwkJczM1MzkwYS0+Y2xpZW50W2ldID0gaTJjX25ld19kdW1teShjbGllbnQtPmFkYXB0ZXIsCisJCQkJCWNsaWVudC0+YWRkciArIGkpOworCQlpZiAoIXMzNTM5MGEtPmNsaWVudFtpXSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJBZGRyZXNzICUwMnggdW5hdmFpbGFibGVcbiIsCisJCQkJCQljbGllbnQtPmFkZHIgKyBpKTsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gZXhpdF9kdW1teTsKKwkJfQorCX0KKworCWVyciA9IHMzNTM5MGFfcmVzZXQoczM1MzkwYSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJlcnJvciByZXNldHRpbmcgY2hpcFxuIik7CisJCWdvdG8gZXhpdF9kdW1teTsKKwl9CisKKwllcnIgPSBzMzUzOTBhX2Rpc2FibGVfdGVzdF9tb2RlKHMzNTM5MGEpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZXJyb3IgZGlzYWJsaW5nIHRlc3QgbW9kZVxuIik7CisJCWdvdG8gZXhpdF9kdW1teTsKKwl9CisKKwllcnIgPSBzMzUzOTBhX2dldF9yZWcoczM1MzkwYSwgUzM1MzkwQV9DTURfU1RBVFVTMSwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJlcnJvciBjaGVja2luZyAxMi8yNCBob3VyIG1vZGVcbiIpOworCQlnb3RvIGV4aXRfZHVtbXk7CisJfQorCWlmIChidWZbMF0gJiBTMzUzOTBBX0ZMQUdfMjRIKQorCQlzMzUzOTBhLT50d2VudHlmb3VyaG91ciA9IDE7CisJZWxzZQorCQlzMzUzOTBhLT50d2VudHlmb3VyaG91ciA9IDA7CisKKwlpZiAoczM1MzkwYV9nZXRfZGF0ZXRpbWUoY2xpZW50LCAmdG0pIDwgMCkKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiY2xvY2sgbmVlZHMgdG8gYmUgc2V0XG4iKTsKKworCXMzNTM5MGEtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoczM1MzkwYV9kcml2ZXIuZHJpdmVyLm5hbWUsCisJCQkJJmNsaWVudC0+ZGV2LCAmczM1MzkwYV9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHMzNTM5MGEtPnJ0YykpIHsKKwkJZXJyID0gUFRSX0VSUihzMzUzOTBhLT5ydGMpOworCQlnb3RvIGV4aXRfZHVtbXk7CisJfQorCXJldHVybiAwOworCitleGl0X2R1bW15OgorCWZvciAoaSA9IDE7IGkgPCA4OyArK2kpCisJCWlmIChzMzUzOTBhLT5jbGllbnRbaV0pCisJCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoczM1MzkwYS0+Y2xpZW50W2ldKTsKKwlrZnJlZShzMzUzOTBhKTsKKworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHMzNTM5MGFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlzdHJ1Y3QgczM1MzkwYSAqczM1MzkwYSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWZvciAoaSA9IDE7IGkgPCA4OyArK2kpCisJCWlmIChzMzUzOTBhLT5jbGllbnRbaV0pCisJCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoczM1MzkwYS0+Y2xpZW50W2ldKTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihzMzUzOTBhLT5ydGMpOworCWtmcmVlKHMzNTM5MGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzMzUzOTBhX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLXMzNTM5MGEiLAorCX0sCisJLnByb2JlCQk9IHMzNTM5MGFfcHJvYmUsCisJLnJlbW92ZQkJPSBzMzUzOTBhX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBzMzUzOTBhX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoczM1MzkwYV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJCeXJvbiBCcmFkbGV5IDxieXJvbi5iYnJhZGxleUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlMzNTM5MEEgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXMzYy5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXMzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmM2EyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtczNjLmMKQEAgLTAsMCArMSw3MzkgQEAKKy8qIGRyaXZlcnMvcnRjL3J0Yy1zM2MuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFMzQzI0MTAvUzNDMjQ0MC9TM0MyNFhYIEludGVybmFsIFJUQyBEcml2ZXIKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXJ0Yy5oPgorCitlbnVtIHMzY19jcHVfdHlwZSB7CisJVFlQRV9TM0MyNDEwLAorCVRZUEVfUzNDMjQxNiwKKwlUWVBFX1MzQzI0NDMsCisJVFlQRV9TM0M2NFhYLAorfTsKKworc3RydWN0IHMzY19ydGNfZHJ2X2RhdGEgeworCWludCBjcHVfdHlwZTsKK307CisKKy8qIEkgaGF2ZSB5ZXQgdG8gZmluZCBhbiBTM0MgaW1wbGVtZW50YXRpb24gd2l0aCBtb3JlIHRoYW4gb25lCisgKiBvZiB0aGVzZSBydGMgYmxvY2tzIGluICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKnMzY19ydGNfbWVtOworCitzdGF0aWMgc3RydWN0IGNsayAqcnRjX2NsazsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnMzY19ydGNfYmFzZTsKK3N0YXRpYyBpbnQgczNjX3J0Y19hbGFybW5vID0gTk9fSVJROworc3RhdGljIGludCBzM2NfcnRjX3RpY2tubyAgPSBOT19JUlE7CitzdGF0aWMgYm9vbCB3YWtlX2VuOworc3RhdGljIGVudW0gczNjX2NwdV90eXBlIHMzY19ydGNfY3B1X3R5cGU7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soczNjX3J0Y19waWVfbG9jayk7CisKK3N0YXRpYyB2b2lkIHMzY19ydGNfYWxhcm1fY2xrX2VuYWJsZShib29sIGVuYWJsZSkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHMzY19ydGNfYWxhcm1fY2xrX2xvY2spOworCXN0YXRpYyBib29sIGFsYXJtX2Nsa19lbmFibGVkOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMzY19ydGNfYWxhcm1fY2xrX2xvY2ssIGlycV9mbGFncyk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAoIWFsYXJtX2Nsa19lbmFibGVkKSB7CisJCQljbGtfZW5hYmxlKHJ0Y19jbGspOworCQkJYWxhcm1fY2xrX2VuYWJsZWQgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFsYXJtX2Nsa19lbmFibGVkKSB7CisJCQljbGtfZGlzYWJsZShydGNfY2xrKTsKKwkJCWFsYXJtX2Nsa19lbmFibGVkID0gZmFsc2U7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmczNjX3J0Y19hbGFybV9jbGtfbG9jaywgaXJxX2ZsYWdzKTsKK30KKworLyogSVJRIEhhbmRsZXJzICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzM2NfcnRjX2FsYXJtaXJxKGludCBpcnEsIHZvaWQgKmlkKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpyZGV2ID0gaWQ7CisKKwljbGtfZW5hYmxlKHJ0Y19jbGspOworCXJ0Y191cGRhdGVfaXJxKHJkZXYsIDEsIFJUQ19BRiB8IFJUQ19JUlFGKTsKKworCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDNjRYWCkKKwkJd3JpdGViKFMzQzI0MTBfSU5UUF9BTE0sIHMzY19ydGNfYmFzZSArIFMzQzI0MTBfSU5UUCk7CisKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKKworCXMzY19ydGNfYWxhcm1fY2xrX2VuYWJsZShmYWxzZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzM2NfcnRjX3RpY2tpcnEoaW50IGlycSwgdm9pZCAqaWQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJkZXYgPSBpZDsKKworCWNsa19lbmFibGUocnRjX2Nsayk7CisJcnRjX3VwZGF0ZV9pcnEocmRldiwgMSwgUlRDX1BGIHwgUlRDX0lSUUYpOworCisJaWYgKHMzY19ydGNfY3B1X3R5cGUgPT0gVFlQRV9TM0M2NFhYKQorCQl3cml0ZWIoUzNDMjQxMF9JTlRQX1RJQywgczNjX3J0Y19iYXNlICsgUzNDMjQxMF9JTlRQKTsKKworCWNsa19kaXNhYmxlKHJ0Y19jbGspOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogVXBkYXRlIGNvbnRyb2wgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHMzY19ydGNfc2V0YWllKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXByX2RlYnVnKCIlczogYWllPSVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlZCk7CisKKwljbGtfZW5hYmxlKHJ0Y19jbGspOworCXRtcCA9IHJlYWRiKHMzY19ydGNfYmFzZSArIFMzQzI0MTBfUlRDQUxNKSAmIH5TM0MyNDEwX1JUQ0FMTV9BTE1FTjsKKworCWlmIChlbmFibGVkKQorCQl0bXAgfD0gUzNDMjQxMF9SVENBTE1fQUxNRU47CisKKwl3cml0ZWIodG1wLCBzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1JUQ0FMTSk7CisJY2xrX2Rpc2FibGUocnRjX2Nsayk7CisKKwlzM2NfcnRjX2FsYXJtX2Nsa19lbmFibGUoZW5hYmxlZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2NfcnRjX3NldGZyZXEoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZnJlcSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgdG1wID0gMDsKKwlpbnQgdmFsOworCisJaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNsa19lbmFibGUocnRjX2Nsayk7CisJc3Bpbl9sb2NrX2lycSgmczNjX3J0Y19waWVfbG9jayk7CisKKwlpZiAoczNjX3J0Y19jcHVfdHlwZSAhPSBUWVBFX1MzQzY0WFgpIHsKKwkJdG1wID0gcmVhZGIoczNjX3J0Y19iYXNlICsgUzNDMjQxMF9USUNOVCk7CisJCXRtcCAmPSBTM0MyNDEwX1RJQ05UX0VOQUJMRTsKKwl9CisKKwl2YWwgPSAocnRjX2Rldi0+bWF4X3VzZXJfZnJlcSAvIGZyZXEpIC0gMTsKKworCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDMjQxNiB8fCBzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDMjQ0MykgeworCQl0bXAgfD0gUzNDMjQ0M19USUNOVF9QQVJUKHZhbCk7CisJCXdyaXRlbChTM0MyNDQzX1RJQ05UMV9QQVJUKHZhbCksIHMzY19ydGNfYmFzZSArIFMzQzI0NDNfVElDTlQxKTsKKworCQlpZiAoczNjX3J0Y19jcHVfdHlwZSA9PSBUWVBFX1MzQzI0MTYpCisJCQl3cml0ZWwoUzNDMjQxNl9USUNOVDJfUEFSVCh2YWwpLCBzM2NfcnRjX2Jhc2UgKyBTM0MyNDE2X1RJQ05UMik7CisJfSBlbHNlIHsKKwkJdG1wIHw9IHZhbDsKKwl9CisKKwl3cml0ZWwodG1wLCBzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1RJQ05UKTsKKwlzcGluX3VubG9ja19pcnEoJnMzY19ydGNfcGllX2xvY2spOworCWNsa19kaXNhYmxlKHJ0Y19jbGspOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRpbWUgcmVhZC93cml0ZSAqLworCitzdGF0aWMgaW50IHMzY19ydGNfZ2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCXVuc2lnbmVkIGludCBoYXZlX3JldHJpZWQgPSAwOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHMzY19ydGNfYmFzZTsKKworCWNsa19lbmFibGUocnRjX2Nsayk7CisgcmV0cnlfZ2V0X3RpbWU6CisJcnRjX3RtLT50bV9taW4gID0gcmVhZGIoYmFzZSArIFMzQzI0MTBfUlRDTUlOKTsKKwlydGNfdG0tPnRtX2hvdXIgPSByZWFkYihiYXNlICsgUzNDMjQxMF9SVENIT1VSKTsKKwlydGNfdG0tPnRtX21kYXkgPSByZWFkYihiYXNlICsgUzNDMjQxMF9SVENEQVRFKTsKKwlydGNfdG0tPnRtX21vbiAgPSByZWFkYihiYXNlICsgUzNDMjQxMF9SVENNT04pOworCXJ0Y190bS0+dG1feWVhciA9IHJlYWRiKGJhc2UgKyBTM0MyNDEwX1JUQ1lFQVIpOworCXJ0Y190bS0+dG1fc2VjICA9IHJlYWRiKGJhc2UgKyBTM0MyNDEwX1JUQ1NFQyk7CisKKwkvKiB0aGUgb25seSB3YXkgdG8gd29yayBvdXQgd2V0aGVyIHRoZSBzeXN0ZW0gd2FzIG1pZC11cGRhdGUKKwkgKiB3aGVuIHdlIHJlYWQgaXQgaXMgdG8gY2hlY2sgdGhlIHNlY29uZCBjb3VudGVyLCBhbmQgaWYgaXQKKwkgKiBpcyB6ZXJvLCB0aGVuIHdlIHJlLXRyeSB0aGUgZW50aXJlIHJlYWQKKwkgKi8KKworCWlmIChydGNfdG0tPnRtX3NlYyA9PSAwICYmICFoYXZlX3JldHJpZWQpIHsKKwkJaGF2ZV9yZXRyaWVkID0gMTsKKwkJZ290byByZXRyeV9nZXRfdGltZTsKKwl9CisKKwlydGNfdG0tPnRtX3NlYyA9IGJjZDJiaW4ocnRjX3RtLT50bV9zZWMpOworCXJ0Y190bS0+dG1fbWluID0gYmNkMmJpbihydGNfdG0tPnRtX21pbik7CisJcnRjX3RtLT50bV9ob3VyID0gYmNkMmJpbihydGNfdG0tPnRtX2hvdXIpOworCXJ0Y190bS0+dG1fbWRheSA9IGJjZDJiaW4ocnRjX3RtLT50bV9tZGF5KTsKKwlydGNfdG0tPnRtX21vbiA9IGJjZDJiaW4ocnRjX3RtLT50bV9tb24pOworCXJ0Y190bS0+dG1feWVhciA9IGJjZDJiaW4ocnRjX3RtLT50bV95ZWFyKTsKKworCXJ0Y190bS0+dG1feWVhciArPSAxMDA7CisKKwlwcl9kZWJ1ZygicmVhZCB0aW1lICUwNGQuJTAyZC4lMDJkICUwMmQ6JTAyZDolMDJkXG4iLAorCQkgMTkwMCArIHJ0Y190bS0+dG1feWVhciwgcnRjX3RtLT50bV9tb24sIHJ0Y190bS0+dG1fbWRheSwKKwkJIHJ0Y190bS0+dG1faG91ciwgcnRjX3RtLT50bV9taW4sIHJ0Y190bS0+dG1fc2VjKTsKKworCXJ0Y190bS0+dG1fbW9uIC09IDE7CisKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHJ0Y190bSk7Cit9CisKK3N0YXRpYyBpbnQgczNjX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBzM2NfcnRjX2Jhc2U7CisJaW50IHllYXIgPSB0bS0+dG1feWVhciAtIDEwMDsKKworCXByX2RlYnVnKCJzZXQgdGltZSAlMDRkLiUwMmQuJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwKKwkJIDE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCSB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisKKwkvKiB3ZSBnZXQgYXJvdW5kIHkyayBieSBzaW1wbHkgbm90IHN1cHBvcnRpbmcgaXQgKi8KKworCWlmICh5ZWFyIDwgMCB8fCB5ZWFyID49IDEwMCkgeworCQlkZXZfZXJyKGRldiwgInJ0YyBvbmx5IHN1cHBvcnRzIDEwMCB5ZWFyc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNsa19lbmFibGUocnRjX2Nsayk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX3NlYyksICBiYXNlICsgUzNDMjQxMF9SVENTRUMpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9taW4pLCAgYmFzZSArIFMzQzI0MTBfUlRDTUlOKTsKKwl3cml0ZWIoYmluMmJjZCh0bS0+dG1faG91ciksIGJhc2UgKyBTM0MyNDEwX1JUQ0hPVVIpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9tZGF5KSwgYmFzZSArIFMzQzI0MTBfUlRDREFURSk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX21vbiArIDEpLCBiYXNlICsgUzNDMjQxMF9SVENNT04pOworCXdyaXRlYihiaW4yYmNkKHllYXIpLCBiYXNlICsgUzNDMjQxMF9SVENZRUFSKTsKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzY19ydGNfZ2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSA9ICZhbHJtLT50aW1lOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHMzY19ydGNfYmFzZTsKKwl1bnNpZ25lZCBpbnQgYWxtX2VuOworCisJY2xrX2VuYWJsZShydGNfY2xrKTsKKwlhbG1fdG0tPnRtX3NlYyAgPSByZWFkYihiYXNlICsgUzNDMjQxMF9BTE1TRUMpOworCWFsbV90bS0+dG1fbWluICA9IHJlYWRiKGJhc2UgKyBTM0MyNDEwX0FMTU1JTik7CisJYWxtX3RtLT50bV9ob3VyID0gcmVhZGIoYmFzZSArIFMzQzI0MTBfQUxNSE9VUik7CisJYWxtX3RtLT50bV9tb24gID0gcmVhZGIoYmFzZSArIFMzQzI0MTBfQUxNTU9OKTsKKwlhbG1fdG0tPnRtX21kYXkgPSByZWFkYihiYXNlICsgUzNDMjQxMF9BTE1EQVRFKTsKKwlhbG1fdG0tPnRtX3llYXIgPSByZWFkYihiYXNlICsgUzNDMjQxMF9BTE1ZRUFSKTsKKworCWFsbV9lbiA9IHJlYWRiKGJhc2UgKyBTM0MyNDEwX1JUQ0FMTSk7CisKKwlhbHJtLT5lbmFibGVkID0gKGFsbV9lbiAmIFMzQzI0MTBfUlRDQUxNX0FMTUVOKSA/IDEgOiAwOworCisJcHJfZGVidWcoInJlYWQgYWxhcm0gJWQsICUwNGQuJTAyZC4lMDJkICUwMmQ6JTAyZDolMDJkXG4iLAorCQkgYWxtX2VuLAorCQkgMTkwMCArIGFsbV90bS0+dG1feWVhciwgYWxtX3RtLT50bV9tb24sIGFsbV90bS0+dG1fbWRheSwKKwkJIGFsbV90bS0+dG1faG91ciwgYWxtX3RtLT50bV9taW4sIGFsbV90bS0+dG1fc2VjKTsKKworCisJLyogZGVjb2RlIHRoZSBhbGFybSBlbmFibGUgZmllbGQgKi8KKworCWlmIChhbG1fZW4gJiBTM0MyNDEwX1JUQ0FMTV9TRUNFTikKKwkJYWxtX3RtLT50bV9zZWMgPSBiY2QyYmluKGFsbV90bS0+dG1fc2VjKTsKKwllbHNlCisJCWFsbV90bS0+dG1fc2VjID0gLTE7CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fTUlORU4pCisJCWFsbV90bS0+dG1fbWluID0gYmNkMmJpbihhbG1fdG0tPnRtX21pbik7CisJZWxzZQorCQlhbG1fdG0tPnRtX21pbiA9IC0xOworCisJaWYgKGFsbV9lbiAmIFMzQzI0MTBfUlRDQUxNX0hPVVJFTikKKwkJYWxtX3RtLT50bV9ob3VyID0gYmNkMmJpbihhbG1fdG0tPnRtX2hvdXIpOworCWVsc2UKKwkJYWxtX3RtLT50bV9ob3VyID0gLTE7CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fREFZRU4pCisJCWFsbV90bS0+dG1fbWRheSA9IGJjZDJiaW4oYWxtX3RtLT50bV9tZGF5KTsKKwllbHNlCisJCWFsbV90bS0+dG1fbWRheSA9IC0xOworCisJaWYgKGFsbV9lbiAmIFMzQzI0MTBfUlRDQUxNX01PTkVOKSB7CisJCWFsbV90bS0+dG1fbW9uID0gYmNkMmJpbihhbG1fdG0tPnRtX21vbik7CisJCWFsbV90bS0+dG1fbW9uIC09IDE7CisJfSBlbHNlIHsKKwkJYWxtX3RtLT50bV9tb24gPSAtMTsKKwl9CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fWUVBUkVOKQorCQlhbG1fdG0tPnRtX3llYXIgPSBiY2QyYmluKGFsbV90bS0+dG1feWVhcik7CisJZWxzZQorCQlhbG1fdG0tPnRtX3llYXIgPSAtMTsKKworCWNsa19kaXNhYmxlKHJ0Y19jbGspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzY19ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gczNjX3J0Y19iYXNlOworCXVuc2lnbmVkIGludCBhbHJtX2VuOworCisJY2xrX2VuYWJsZShydGNfY2xrKTsKKwlwcl9kZWJ1ZygiczNjX3J0Y19zZXRhbGFybTogJWQsICUwNGQuJTAyZC4lMDJkICUwMmQ6JTAyZDolMDJkXG4iLAorCQkgYWxybS0+ZW5hYmxlZCwKKwkJIDE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiArIDEsIHRtLT50bV9tZGF5LAorCQkgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJYWxybV9lbiA9IHJlYWRiKGJhc2UgKyBTM0MyNDEwX1JUQ0FMTSkgJiBTM0MyNDEwX1JUQ0FMTV9BTE1FTjsKKwl3cml0ZWIoMHgwMCwgYmFzZSArIFMzQzI0MTBfUlRDQUxNKTsKKworCWlmICh0bS0+dG1fc2VjIDwgNjAgJiYgdG0tPnRtX3NlYyA+PSAwKSB7CisJCWFscm1fZW4gfD0gUzNDMjQxMF9SVENBTE1fU0VDRU47CisJCXdyaXRlYihiaW4yYmNkKHRtLT50bV9zZWMpLCBiYXNlICsgUzNDMjQxMF9BTE1TRUMpOworCX0KKworCWlmICh0bS0+dG1fbWluIDwgNjAgJiYgdG0tPnRtX21pbiA+PSAwKSB7CisJCWFscm1fZW4gfD0gUzNDMjQxMF9SVENBTE1fTUlORU47CisJCXdyaXRlYihiaW4yYmNkKHRtLT50bV9taW4pLCBiYXNlICsgUzNDMjQxMF9BTE1NSU4pOworCX0KKworCWlmICh0bS0+dG1faG91ciA8IDI0ICYmIHRtLT50bV9ob3VyID49IDApIHsKKwkJYWxybV9lbiB8PSBTM0MyNDEwX1JUQ0FMTV9IT1VSRU47CisJCXdyaXRlYihiaW4yYmNkKHRtLT50bV9ob3VyKSwgYmFzZSArIFMzQzI0MTBfQUxNSE9VUik7CisJfQorCisJcHJfZGVidWcoInNldHRpbmcgUzNDMjQxMF9SVENBTE0gdG8gJTA4eFxuIiwgYWxybV9lbik7CisKKwl3cml0ZWIoYWxybV9lbiwgYmFzZSArIFMzQzI0MTBfUlRDQUxNKTsKKworCXMzY19ydGNfc2V0YWllKGRldiwgYWxybS0+ZW5hYmxlZCk7CisKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2NfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwl1bnNpZ25lZCBpbnQgdGljbnQ7CisKKwljbGtfZW5hYmxlKHJ0Y19jbGspOworCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDNjRYWCkgeworCQl0aWNudCA9IHJlYWR3KHMzY19ydGNfYmFzZSArIFMzQzI0MTBfUlRDQ09OKTsKKwkJdGljbnQgJj0gUzNDNjRYWF9SVENDT05fVElDRU47CisJfSBlbHNlIHsKKwkJdGljbnQgPSByZWFkYihzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1RJQ05UKTsKKwkJdGljbnQgJj0gUzNDMjQxMF9USUNOVF9FTkFCTEU7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsIHRpY250ICA/ICJ5ZXMiIDogIm5vIik7CisJY2xrX2Rpc2FibGUocnRjX2Nsayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzM2NfcnRjb3BzID0geworCS5yZWFkX3RpbWUJPSBzM2NfcnRjX2dldHRpbWUsCisJLnNldF90aW1lCT0gczNjX3J0Y19zZXR0aW1lLAorCS5yZWFkX2FsYXJtCT0gczNjX3J0Y19nZXRhbGFybSwKKwkuc2V0X2FsYXJtCT0gczNjX3J0Y19zZXRhbGFybSwKKwkucHJvYwkJPSBzM2NfcnRjX3Byb2MsCisJLmFsYXJtX2lycV9lbmFibGUgPSBzM2NfcnRjX3NldGFpZSwKK307CisKK3N0YXRpYyB2b2lkIHMzY19ydGNfZW5hYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBlbikKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBzM2NfcnRjX2Jhc2U7CisJdW5zaWduZWQgaW50IHRtcDsKKworCWlmIChzM2NfcnRjX2Jhc2UgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2xrX2VuYWJsZShydGNfY2xrKTsKKwlpZiAoIWVuKSB7CisJCXRtcCA9IHJlYWR3KGJhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CisJCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDNjRYWCkKKwkJCXRtcCAmPSB+UzNDNjRYWF9SVENDT05fVElDRU47CisJCXRtcCAmPSB+UzNDMjQxMF9SVENDT05fUlRDRU47CisJCXdyaXRldyh0bXAsIGJhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CisKKwkJaWYgKHMzY19ydGNfY3B1X3R5cGUgIT0gVFlQRV9TM0M2NFhYKSB7CisJCQl0bXAgPSByZWFkYihiYXNlICsgUzNDMjQxMF9USUNOVCk7CisJCQl0bXAgJj0gflMzQzI0MTBfVElDTlRfRU5BQkxFOworCQkJd3JpdGViKHRtcCwgYmFzZSArIFMzQzI0MTBfVElDTlQpOworCQl9CisJfSBlbHNlIHsKKwkJLyogcmUtZW5hYmxlIHRoZSBkZXZpY2UsIGFuZCBjaGVjayBpdCBpcyBvayAqLworCisJCWlmICgocmVhZHcoYmFzZStTM0MyNDEwX1JUQ0NPTikgJiBTM0MyNDEwX1JUQ0NPTl9SVENFTikgPT0gMCkgeworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgInJ0YyBkaXNhYmxlZCwgcmUtZW5hYmxpbmdcbiIpOworCisJCQl0bXAgPSByZWFkdyhiYXNlICsgUzNDMjQxMF9SVENDT04pOworCQkJd3JpdGV3KHRtcCB8IFMzQzI0MTBfUlRDQ09OX1JUQ0VOLAorCQkJCWJhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CisJCX0KKworCQlpZiAoKHJlYWR3KGJhc2UgKyBTM0MyNDEwX1JUQ0NPTikgJiBTM0MyNDEwX1JUQ0NPTl9DTlRTRUwpKSB7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicmVtb3ZpbmcgUlRDQ09OX0NOVFNFTFxuIik7CisKKwkJCXRtcCA9IHJlYWR3KGJhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CisJCQl3cml0ZXcodG1wICYgflMzQzI0MTBfUlRDQ09OX0NOVFNFTCwKKwkJCQliYXNlICsgUzNDMjQxMF9SVENDT04pOworCQl9CisKKwkJaWYgKChyZWFkdyhiYXNlICsgUzNDMjQxMF9SVENDT04pICYgUzNDMjQxMF9SVENDT05fQ0xLUlNUKSkgeworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgInJlbW92aW5nIFJUQ0NPTl9DTEtSU1RcbiIpOworCisJCQl0bXAgPSByZWFkdyhiYXNlICsgUzNDMjQxMF9SVENDT04pOworCQkJd3JpdGV3KHRtcCAmIH5TM0MyNDEwX1JUQ0NPTl9DTEtSU1QsCisJCQkJYmFzZSArIFMzQzI0MTBfUlRDQ09OKTsKKwkJfQorCX0KKwljbGtfZGlzYWJsZShydGNfY2xrKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgczNjX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJZnJlZV9pcnEoczNjX3J0Y19hbGFybW5vLCBydGMpOworCWZyZWVfaXJxKHMzY19ydGNfdGlja25vLCBydGMpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCXMzY19ydGNfc2V0YWllKCZkZXYtPmRldiwgMCk7CisKKwljbGtfcHV0KHJ0Y19jbGspOworCXJ0Y19jbGsgPSBOVUxMOworCisJaW91bm1hcChzM2NfcnRjX2Jhc2UpOworCXJlbGVhc2VfcmVzb3VyY2UoczNjX3J0Y19tZW0pOworCWtmcmVlKHMzY19ydGNfbWVtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzM2NfcnRjX2R0X21hdGNoW107CisKK3N0YXRpYyBpbmxpbmUgaW50IHMzY19ydGNfZ2V0X2RyaXZlcl9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisjaWZkZWYgQ09ORklHX09GCisJc3RydWN0IHMzY19ydGNfZHJ2X2RhdGEgKmRhdGE7CisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCQltYXRjaCA9IG9mX21hdGNoX25vZGUoczNjX3J0Y19kdF9tYXRjaCwgcGRldi0+ZGV2Lm9mX25vZGUpOworCQlkYXRhID0gKHN0cnVjdCBzM2NfcnRjX2Rydl9kYXRhICopIG1hdGNoLT5kYXRhOworCQlyZXR1cm4gZGF0YS0+Y3B1X3R5cGU7CisJfQorI2VuZGlmCisJcmV0dXJuIHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzM2NfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisJaW50IHRtcDsKKworCXByX2RlYnVnKCIlczogcHJvYmU9JXBcbiIsIF9fZnVuY19fLCBwZGV2KTsKKworCS8qIGZpbmQgdGhlIElSUXMgKi8KKworCXMzY19ydGNfdGlja25vID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAoczNjX3J0Y190aWNrbm8gPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSBmb3IgcnRjIHRpY2tcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlzM2NfcnRjX2FsYXJtbm8gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChzM2NfcnRjX2FsYXJtbm8gPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSBmb3IgYWxhcm1cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IHRpY2sgaXJxICVkLCBhbGFybSBpcnEgJWRcbiIsCisJCSBzM2NfcnRjX3RpY2tubywgczNjX3J0Y19hbGFybW5vKTsKKworCS8qIGdldCB0aGUgbWVtb3J5IHJlZ2lvbiAqLworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVnaW9uIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJczNjX3J0Y19tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLAorCQkJCQkgcGRldi0+bmFtZSk7CisKKwlpZiAoczNjX3J0Y19tZW0gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVzZXJ2ZSBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfbm9yZXM7CisJfQorCisJczNjX3J0Y19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChzM2NfcnRjX2Jhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgaW9yZW1hcCgpXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfbm9tYXA7CisJfQorCisJcnRjX2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInJ0YyIpOworCWlmIChJU19FUlIocnRjX2NsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGZpbmQgcnRjIGNsb2NrIHNvdXJjZVxuIik7CisJCXJldCA9IFBUUl9FUlIocnRjX2Nsayk7CisJCXJ0Y19jbGsgPSBOVUxMOworCQlnb3RvIGVycl9jbGs7CisJfQorCisJY2xrX2VuYWJsZShydGNfY2xrKTsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiBldmVyeXRoaW5nIGlzIHNldHVwIGNvcnJlY3RseSAqLworCisJczNjX3J0Y19lbmFibGUocGRldiwgMSk7CisKKwlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IFJUQ0NPTj0lMDJ4XG4iLAorCQkgcmVhZHcoczNjX3J0Y19iYXNlICsgUzNDMjQxMF9SVENDT04pKTsKKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKworCS8qIHJlZ2lzdGVyIFJUQyBhbmQgZXhpdCAqLworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiczNjIiwgJnBkZXYtPmRldiwgJnMzY19ydGNvcHMsCisJCQkJICBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGF0dGFjaCBydGNcbiIpOworCQlyZXQgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gZXJyX25vcnRjOworCX0KKworCXMzY19ydGNfY3B1X3R5cGUgPSBzM2NfcnRjX2dldF9kcml2ZXJfZGF0YShwZGV2KTsKKworCS8qIENoZWNrIFJUQyBUaW1lICovCisKKwlzM2NfcnRjX2dldHRpbWUoTlVMTCwgJnJ0Y190bSk7CisKKwlpZiAocnRjX3ZhbGlkX3RtKCZydGNfdG0pKSB7CisJCXJ0Y190bS50bV95ZWFyCT0gMTAwOworCQlydGNfdG0udG1fbW9uCT0gMDsKKwkJcnRjX3RtLnRtX21kYXkJPSAxOworCQlydGNfdG0udG1faG91cgk9IDA7CisJCXJ0Y190bS50bV9taW4JPSAwOworCQlydGNfdG0udG1fc2VjCT0gMDsKKworCQlzM2NfcnRjX3NldHRpbWUoTlVMTCwgJnJ0Y190bSk7CisKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIndhcm5pbmc6IGludmFsaWQgUlRDIHZhbHVlIHNvIGluaXRpYWxpemluZyBpdFxuIik7CisJfQorCisJaWYgKHMzY19ydGNfY3B1X3R5cGUgIT0gVFlQRV9TM0MyNDEwKQorCQlydGMtPm1heF91c2VyX2ZyZXEgPSAzMjc2ODsKKwllbHNlCisJCXJ0Yy0+bWF4X3VzZXJfZnJlcSA9IDEyODsKKworCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDMjQxNiB8fCBzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDMjQ0MykgeworCQl0bXAgPSByZWFkdyhzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CisJCXRtcCB8PSBTM0MyNDQzX1JUQ0NPTl9USUNTRUw7CisJCXdyaXRldyh0bXAsIHMzY19ydGNfYmFzZSArIFMzQzI0MTBfUlRDQ09OKTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJczNjX3J0Y19zZXRmcmVxKCZwZGV2LT5kZXYsIDEpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoczNjX3J0Y19hbGFybW5vLCBzM2NfcnRjX2FsYXJtaXJxLAorCQkJICAwLCAgInMzYzI0MTAtcnRjIGFsYXJtIiwgcnRjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIklSUSVkIGVycm9yICVkXG4iLCBzM2NfcnRjX2FsYXJtbm8sIHJldCk7CisJCWdvdG8gZXJyX2FsYXJtX2lycTsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShzM2NfcnRjX3RpY2tubywgczNjX3J0Y190aWNraXJxLAorCQkJICAwLCAgInMzYzI0MTAtcnRjIHRpY2siLCBydGMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVJRJWQgZXJyb3IgJWRcbiIsIHMzY19ydGNfdGlja25vLCByZXQpOworCQlmcmVlX2lycShzM2NfcnRjX2FsYXJtbm8sIHJ0Yyk7CisJCWdvdG8gZXJyX3RpY2tfaXJxOworCX0KKworCWNsa19kaXNhYmxlKHJ0Y19jbGspOworCisJcmV0dXJuIDA7CisKKyBlcnJfdGlja19pcnE6CisJZnJlZV9pcnEoczNjX3J0Y19hbGFybW5vLCBydGMpOworCisgZXJyX2FsYXJtX2lycToKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworIGVycl9ub3J0YzoKKwlzM2NfcnRjX2VuYWJsZShwZGV2LCAwKTsKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKKwljbGtfcHV0KHJ0Y19jbGspOworCisgZXJyX2NsazoKKwlpb3VubWFwKHMzY19ydGNfYmFzZSk7CisKKyBlcnJfbm9tYXA6CisJcmVsZWFzZV9yZXNvdXJjZShzM2NfcnRjX21lbSk7CisKKyBlcnJfbm9yZXM6CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKiBSVEMgUG93ZXIgbWFuYWdlbWVudCBjb250cm9sICovCisKK3N0YXRpYyBpbnQgdGljbnRfc2F2ZSwgdGljbnRfZW5fc2F2ZTsKKworc3RhdGljIGludCBzM2NfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWNsa19lbmFibGUocnRjX2Nsayk7CisJLyogc2F2ZSBUSUNOVCBmb3IgYW55b25lIHVzaW5nIHBlcmlvZGljIGludGVycnVwdHMgKi8KKwl0aWNudF9zYXZlID0gcmVhZGIoczNjX3J0Y19iYXNlICsgUzNDMjQxMF9USUNOVCk7CisJaWYgKHMzY19ydGNfY3B1X3R5cGUgPT0gVFlQRV9TM0M2NFhYKSB7CisJCXRpY250X2VuX3NhdmUgPSByZWFkdyhzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CisJCXRpY250X2VuX3NhdmUgJj0gUzNDNjRYWF9SVENDT05fVElDRU47CisJfQorCXMzY19ydGNfZW5hYmxlKHBkZXYsIDApOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpICYmICF3YWtlX2VuKSB7CisJCWlmIChlbmFibGVfaXJxX3dha2UoczNjX3J0Y19hbGFybW5vKSA9PSAwKQorCQkJd2FrZV9lbiA9IHRydWU7CisJCWVsc2UKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImVuYWJsZV9pcnFfd2FrZSBmYWlsZWRcbiIpOworCX0KKwljbGtfZGlzYWJsZShydGNfY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzY19ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCWNsa19lbmFibGUocnRjX2Nsayk7CisJczNjX3J0Y19lbmFibGUocGRldiwgMSk7CisJd3JpdGViKHRpY250X3NhdmUsIHMzY19ydGNfYmFzZSArIFMzQzI0MTBfVElDTlQpOworCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDNjRYWCAmJiB0aWNudF9lbl9zYXZlKSB7CisJCXRtcCA9IHJlYWR3KHMzY19ydGNfYmFzZSArIFMzQzI0MTBfUlRDQ09OKTsKKwkJd3JpdGV3KHRtcCB8IHRpY250X2VuX3NhdmUsIHMzY19ydGNfYmFzZSArIFMzQzI0MTBfUlRDQ09OKTsKKwl9CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikgJiYgd2FrZV9lbikgeworCQlkaXNhYmxlX2lycV93YWtlKHMzY19ydGNfYWxhcm1ubyk7CisJCXdha2VfZW4gPSBmYWxzZTsKKwl9CisJY2xrX2Rpc2FibGUocnRjX2Nsayk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHMzY19ydGNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHMzY19ydGNfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzM2NfcnRjX2Rydl9kYXRhIHMzY19ydGNfZHJ2X2RhdGFfYXJyYXlbXSA9IHsKKwlbVFlQRV9TM0MyNDEwXSA9IHsgVFlQRV9TM0MyNDEwIH0sCisJW1RZUEVfUzNDMjQxNl0gPSB7IFRZUEVfUzNDMjQxNiB9LAorCVtUWVBFX1MzQzI0NDNdID0geyBUWVBFX1MzQzI0NDMgfSwKKwlbVFlQRV9TM0M2NFhYXSA9IHsgVFlQRV9TM0M2NFhYIH0sCit9OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzM2NfcnRjX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzI0MTAtcnRjIiwKKwkJLmRhdGEgPSAmczNjX3J0Y19kcnZfZGF0YV9hcnJheVtUWVBFX1MzQzI0MTBdLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzM2MyNDE2LXJ0YyIsCisJCS5kYXRhID0gJnMzY19ydGNfZHJ2X2RhdGFfYXJyYXlbVFlQRV9TM0MyNDE2XSwKKwl9LCB7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsczNjMjQ0My1ydGMiLAorCQkuZGF0YSA9ICZzM2NfcnRjX2Rydl9kYXRhX2FycmF5W1RZUEVfUzNDMjQ0M10sCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzY0MTAtcnRjIiwKKwkJLmRhdGEgPSAmczNjX3J0Y19kcnZfZGF0YV9hcnJheVtUWVBFX1MzQzY0WFhdLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgczNjX3J0Y19kdF9tYXRjaCk7CisjZWxzZQorI2RlZmluZSBzM2NfcnRjX2R0X21hdGNoIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzM2NfcnRjX2RyaXZlcl9pZHNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJzM2MyNDEwLXJ0YyIsCisJCS5kcml2ZXJfZGF0YQk9IFRZUEVfUzNDMjQxMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJzM2MyNDE2LXJ0YyIsCisJCS5kcml2ZXJfZGF0YQk9IFRZUEVfUzNDMjQxNiwKKwl9LCB7CisJCS5uYW1lCQk9ICJzM2MyNDQzLXJ0YyIsCisJCS5kcml2ZXJfZGF0YQk9IFRZUEVfUzNDMjQ0MywKKwl9LCB7CisJCS5uYW1lCQk9ICJzM2M2NHh4LXJ0YyIsCisJCS5kcml2ZXJfZGF0YQk9IFRZUEVfUzNDNjRYWCwKKwl9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgczNjX3J0Y19kcml2ZXJfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjX3J0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IHMzY19ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzM2NfcnRjX3JlbW92ZSksCisJLnN1c3BlbmQJPSBzM2NfcnRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2NfcnRjX3Jlc3VtZSwKKwkuaWRfdGFibGUJPSBzM2NfcnRjX2RyaXZlcl9pZHMsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInMzYy1ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gczNjX3J0Y19kdF9tYXRjaCwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzM2NfcnRjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTM0MgUlRDIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzM2MyNDEwLXJ0YyIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTVjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJmYWNlIGZvciBTdHJvbmdBUk0gU0ExeDAwIGFuZCBYU2NhbGUgUFhBMnh4CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIE5pbHMgRmFlcmJlcgorICoKKyAqIEJhc2VkIG9uIHJ0Yy5jIGJ5IFBhdWwgR29ydG1ha2VyCisgKgorICogT3JpZ2luYWwgRHJpdmVyIGJ5IE5pbHMgRmFlcmJlciA8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZyb206CisgKiAgIENJSCA8Y2loQGNvdmVudGl2ZS5jb20+CisgKiAgIE5pY29sYXMgUGl0cmUgPG5pY29AZmx1eG5pYy5uZXQ+CisgKiAgIEFuZHJldyBDaHJpc3RpYW4gPGFuZHJldy5jaHJpc3RpYW5AaHAuY29tPgorICoKKyAqIENvbnZlcnRlZCB0byB0aGUgUlRDIHN1YnN5c3RlbSBhbmQgRHJpdmVyIE1vZGVsCisgKiAgIGJ5IFJpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1BYQSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9NTVApCisjaW5jbHVkZSA8bWFjaC9yZWdzLXJ0Yy5oPgorI2VuZGlmCisKKyNkZWZpbmUgUlRDX0RFRl9ESVZJREVSCQkoMzI3NjggLSAxKQorI2RlZmluZSBSVENfREVGX1RSSU0JCTAKKyNkZWZpbmUgUlRDX0ZSRVEJCTEwMjQKKworc3RydWN0IHNhMTEwMF9ydGMgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJaW50CQkJaXJxXzFoejsKKwlpbnQJCQlpcnFfYWxhcm07CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwlzdHJ1Y3QgY2xrCQkqY2xrOworfTsKKworc3RhdGljIGlycXJldHVybl90IHNhMTEwMF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2ExMTAwX3J0YyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZfaWQpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBpbmZvLT5ydGM7CisJdW5zaWduZWQgaW50IHJ0c3I7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKworCXJ0c3IgPSBSVFNSOworCS8qIGNsZWFyIGludGVycnVwdCBzb3VyY2VzICovCisJUlRTUiA9IDA7CisJLyogRml4IGZvciBhIG5hc3R5IGluaXRpYWxpemF0aW9uIHByb2JsZW0gdGhlIGluIFNBMTF4eCBSVFNSIHJlZ2lzdGVyLgorCSAqIFNlZSBhbHNvIHRoZSBjb21tZW50cyBpbiBzYTExMDBfcnRjX3Byb2JlKCkuICovCisJaWYgKHJ0c3IgJiAoUlRTUl9BTEUgfCBSVFNSX0haRSkpIHsKKwkJLyogVGhpcyBpcyB0aGUgb3JpZ2luYWwgY29kZSwgYmVmb3JlIHRoZXJlIHdhcyB0aGUgaWYgdGVzdAorCQkgKiBhYm92ZS4gVGhpcyBjb2RlIGRvZXMgbm90IGNsZWFyIGludGVycnVwdHMgdGhhdCB3ZXJlIG5vdAorCQkgKiBlbmFibGVkLiAqLworCQlSVFNSID0gKFJUU1JfQUwgfCBSVFNSX0haKSAmIChydHNyID4+IDIpOworCX0gZWxzZSB7CisJCS8qIEZvciBzb21lIHJlYXNvbiwgaXQgaXMgcG9zc2libGUgdG8gZW50ZXIgdGhpcyByb3V0aW5lCisJCSAqIHdpdGhvdXQgaW50ZXJydXB0aW9ucyBlbmFibGVkLCBpdCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aAorCQkgKiBzZXZlcmFsIHVuaXRzIChCdWcgaW4gU0ExMXh4IGNoaXA/KS4KKwkJICoKKwkJICogVGhpcyBzaXR1YXRpb24gbGVhZHMgdG8gYW4gaW5maW5pdGUgImxvb3AiIG9mIGludGVycnVwdAorCQkgKiByb3V0aW5lIGNhbGxpbmcgYW5kIGFzIGEgcmVzdWx0IHRoZSBwcm9jZXNzb3Igc2VlbXMgdG8KKwkJICogbG9jayBvbiBpdHMgZmlyc3QgY2FsbCB0byBvcGVuKCkuICovCisJCVJUU1IgPSBSVFNSX0FMIHwgUlRTUl9IWjsKKwl9CisKKwkvKiBjbGVhciBhbGFybSBpbnRlcnJ1cHQgaWYgaXQgaGFzIG9jY3VycmVkICovCisJaWYgKHJ0c3IgJiBSVFNSX0FMKQorCQlydHNyICY9IH5SVFNSX0FMRTsKKwlSVFNSID0gcnRzciAmIChSVFNSX0FMRSB8IFJUU1JfSFpFKTsKKworCS8qIHVwZGF0ZSBpcnEgZGF0YSAmIGNvdW50ZXIgKi8KKwlpZiAocnRzciAmIFJUU1JfQUwpCisJCWV2ZW50cyB8PSBSVENfQUYgfCBSVENfSVJRRjsKKwlpZiAocnRzciAmIFJUU1JfSFopCisJCWV2ZW50cyB8PSBSVENfVUYgfCBSVENfSVJRRjsKKworCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgZXZlbnRzKTsKKworCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzYTExMDBfcnRjX29wZW4oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBfcnRjICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGluZm8tPnJ0YzsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGluZm8tPmNsayk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX2NsazsKKwlyZXQgPSByZXF1ZXN0X2lycShpbmZvLT5pcnFfMWh6LCBzYTExMDBfcnRjX2ludGVycnVwdCwgMCwgInJ0YyAxSHoiLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJJUlEgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLCBpbmZvLT5pcnFfMWh6KTsKKwkJZ290byBmYWlsX3VpOworCX0KKwlyZXQgPSByZXF1ZXN0X2lycShpbmZvLT5pcnFfYWxhcm0sIHNhMTEwMF9ydGNfaW50ZXJydXB0LCAwLCAicnRjIEFscm0iLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJJUlEgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLCBpbmZvLT5pcnFfYWxhcm0pOworCQlnb3RvIGZhaWxfYWk7CisJfQorCXJ0Yy0+bWF4X3VzZXJfZnJlcSA9IFJUQ19GUkVROworCXJ0Y19pcnFfc2V0X2ZyZXEocnRjLCBOVUxMLCBSVENfRlJFUSk7CisKKwlyZXR1cm4gMDsKKworIGZhaWxfYWk6CisJZnJlZV9pcnEoaW5mby0+aXJxXzFoeiwgZGV2KTsKKyBmYWlsX3VpOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShpbmZvLT5jbGspOworIGZhaWxfY2xrOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNhMTEwMF9ydGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTEwMF9ydGMgKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJmluZm8tPmxvY2spOworCVJUU1IgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmaW5mby0+bG9jayk7CisKKwlmcmVlX2lycShpbmZvLT5pcnFfYWxhcm0sIGRldik7CisJZnJlZV9pcnEoaW5mby0+aXJxXzFoeiwgZGV2KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaW5mby0+Y2xrKTsKK30KKworc3RhdGljIGludCBzYTExMDBfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3Qgc2ExMTAwX3J0YyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmaW5mby0+bG9jayk7CisJaWYgKGVuYWJsZWQpCisJCVJUU1IgfD0gUlRTUl9BTEU7CisJZWxzZQorCQlSVFNSICY9IH5SVFNSX0FMRTsKKwlzcGluX3VubG9ja19pcnEoJmluZm8tPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlydGNfdGltZV90b190bShSQ05SLCB0bSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWludCByZXQ7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSh0bSwgJnRpbWUpOworCWlmIChyZXQgPT0gMCkKKwkJUkNOUiA9IHRpbWU7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzYTExMDBfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwl1MzIJcnRzcjsKKworCXJ0c3IgPSBSVFNSOworCWFscm0tPmVuYWJsZWQgPSAocnRzciAmIFJUU1JfQUxFKSA/IDEgOiAwOworCWFscm0tPnBlbmRpbmcgPSAocnRzciAmIFJUU1JfQUwpID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3Qgc2ExMTAwX3J0YyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgdGltZTsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycSgmaW5mby0+bG9jayk7CisJcmV0ID0gcnRjX3RtX3RvX3RpbWUoJmFscm0tPnRpbWUsICZ0aW1lKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0OworCVJUU1IgPSBSVFNSICYgKFJUU1JfSFpFfFJUU1JfQUxFfFJUU1JfQUwpOworCVJUQVIgPSB0aW1lOworCWlmIChhbHJtLT5lbmFibGVkKQorCQlSVFNSIHw9IFJUU1JfQUxFOworCWVsc2UKKwkJUlRTUiAmPSB+UlRTUl9BTEU7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZpbmZvLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc2VxX3ByaW50ZihzZXEsICJ0cmltL2RpdmlkZXJcdFx0OiAweCUwOHhcbiIsICh1MzIpIFJUVFIpOworCXNlcV9wcmludGYoc2VxLCAiUlRTUlx0XHRcdDogMHglMDh4XG4iLCAodTMyKVJUU1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzYTExMDBfcnRjX29wcyA9IHsKKwkub3BlbiA9IHNhMTEwMF9ydGNfb3BlbiwKKwkucmVsZWFzZSA9IHNhMTEwMF9ydGNfcmVsZWFzZSwKKwkucmVhZF90aW1lID0gc2ExMTAwX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gc2ExMTAwX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IHNhMTEwMF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gc2ExMTAwX3J0Y19zZXRfYWxhcm0sCisJLnByb2MgPSBzYTExMDBfcnRjX3Byb2MsCisJLmFsYXJtX2lycV9lbmFibGUgPSBzYTExMDBfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaW50IHNhMTEwMF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCBzYTExMDBfcnRjICppbmZvOworCWludCBpcnFfMWh6LCBpcnFfYWxhcm0sIHJldCA9IDA7CisKKwlpcnFfMWh6ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInJ0YyAxSHoiKTsKKwlpcnFfYWxhcm0gPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAicnRjIGFsYXJtIik7CisJaWYgKGlycV8xaHogPCAwIHx8IGlycV9hbGFybSA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYTExMDBfcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoaW5mby0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZmluZCBydGMgY2xvY2sgc291cmNlXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihpbmZvLT5jbGspOworCQlnb3RvIGVycl9jbGs7CisJfQorCWluZm8tPmlycV8xaHogPSBpcnFfMWh6OworCWluZm8tPmlycV9hbGFybSA9IGlycV9hbGFybTsKKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CisKKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgbWFudWFsIHdlIHNob3VsZCBiZSBhYmxlIHRvIGxldCBSVFRSIGJlIHplcm8KKwkgKiBhbmQgdGhlbiBhIGRlZmF1bHQgZGl2aXNlciBmb3IgYSAzMi43NjhLSHogY2xvY2sgaXMgdXNlZC4KKwkgKiBBcHBhcmVudGx5IHRoaXMgZG9lc24ndCB3b3JrLCBhdCBsZWFzdCBmb3IgbXkgU0ExMTEwIHJldiA1LgorCSAqIElmIHRoZSBjbG9jayBkaXZpZGVyIGlzIHVuaW5pdGlhbGl6ZWQgdGhlbiByZXNldCBpdCB0byB0aGUKKwkgKiBkZWZhdWx0IHZhbHVlIHRvIGdldCB0aGUgMUh6IGNsb2NrLgorCSAqLworCWlmIChSVFRSID09IDApIHsKKwkJUlRUUiA9IFJUQ19ERUZfRElWSURFUiArIChSVENfREVGX1RSSU0gPDwgMTYpOworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAid2FybmluZzogIgorCQkJImluaXRpYWxpemluZyBkZWZhdWx0IGNsb2NrIGRpdmlkZXIvdHJpbSB2YWx1ZVxuIik7CisJCS8qIFRoZSBjdXJyZW50IFJUQyB2YWx1ZSBwcm9iYWJseSBkb2Vzbid0IG1ha2Ugc2Vuc2UgZWl0aGVyICovCisJCVJDTlIgPSAwOworCX0KKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwgJnNhMTEwMF9ydGNfb3BzLAorCQlUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMpOworCQlnb3RvIGVycl9kZXY7CisJfQorCWluZm8tPnJ0YyA9IHJ0YzsKKworCS8qIEZpeCBmb3IgYSBuYXN0eSBpbml0aWFsaXphdGlvbiBwcm9ibGVtIHRoZSBpbiBTQTExeHggUlRTUiByZWdpc3Rlci4KKwkgKiBTZWUgYWxzbyB0aGUgY29tbWVudHMgaW4gc2ExMTAwX3J0Y19pbnRlcnJ1cHQoKS4KKwkgKgorCSAqIFNvbWV0aW1lcyBiaXQgMSBvZiB0aGUgUlRTUiAoUlRTUl9IWikgd2lsbCB3YWtlIHVwIDEsIHdoaWNoIG1lYW5zIGFuCisJICogaW50ZXJydXB0IHBlbmRpbmcsIGV2ZW4gdGhvdWdoIGludGVycnVwdHMgd2VyZSBuZXZlciBlbmFibGVkLgorCSAqIEluIHRoaXMgY2FzZSwgdGhpcyBiaXQgaXQgbXVzdCBiZSByZXNldCBiZWZvcmUgZW5hYmxpbmcKKwkgKiBpbnRlcnJ1cHRpb25zIHRvIGF2b2lkIGEgbm9uZXhpc3RlbnQgaW50ZXJydXB0IHRvIG9jY3VyLgorCSAqCisJICogSW4gcHJpbmNpcGxlLCB0aGUgc2FtZSBwcm9ibGVtIHdvdWxkIGFwcGx5IHRvIGJpdCAwLCBhbHRob3VnaCBpdCBoYXMKKwkgKiBuZXZlciBiZWVuIG9ic2VydmVkIHRvIGhhcHBlbi4KKwkgKgorCSAqIFRoaXMgaXNzdWUgaXMgYWRkcmVzc2VkIGJvdGggaGVyZSBhbmQgaW4gc2ExMTAwX3J0Y19pbnRlcnJ1cHQoKS4KKwkgKiBJZiB0aGUgaXNzdWUgaXMgbm90IGFkZHJlc3NlZCBoZXJlLCBpbiB0aGUgdGltZXMgd2hlbiB0aGUgcHJvY2Vzc29yCisJICogd2FrZXMgdXAgd2l0aCB0aGUgYml0IHNldCB0aGVyZSB3aWxsIGJlIG9uZSBzcHVyaW91cyBpbnRlcnJ1cHQuCisJICoKKwkgKiBUaGUgaXNzdWUgaXMgYWxzbyBkZWFsdCB3aXRoIGluIHNhMTEwMF9ydGNfaW50ZXJydXB0KCkgdG8gYmUgb24gdGhlCisJICogc2FmZSBzaWRlLCBvbmNlIHRoZSBjb25kaXRpb24gdGhhdCBsZWFkIHRvIHRoaXMgc3RyYW5nZQorCSAqIGluaXRpYWxpemF0aW9uIGlzIHVua25vd24gYW5kIGNvdWxkIGluIHByaW5jaXBsZSBoYXBwZW4gZHVyaW5nCisJICogbm9ybWFsIHByb2Nlc3NpbmcuCisJICoKKwkgKiBOb3RpY2UgdGhhdCBjbGVhcmluZyBiaXQgMSBhbmQgMCBpcyBhY2NvbXBsaXNoZWQgYnkgd3JpdHRpbmcgT05FUyB0bworCSAqIHRoZSBjb3JyZXNwb25kaW5nIGJpdHMgaW4gUlRTUi4gKi8KKwlSVFNSID0gUlRTUl9BTCB8IFJUU1JfSFo7CisKKwlyZXR1cm4gMDsKK2Vycl9kZXY6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJY2xrX3B1dChpbmZvLT5jbGspOworZXJyX2NsazoKKwlrZnJlZShpbmZvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNhMTEwMF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNhMTEwMF9ydGMgKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChpbmZvKSB7CisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihpbmZvLT5ydGMpOworCQljbGtfcHV0KGluZm8tPmNsayk7CisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCQlrZnJlZShpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzYTExMDBfcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBfcnRjICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWVuYWJsZV9pcnFfd2FrZShpbmZvLT5pcnFfYWxhcm0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9ydGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2ExMTAwX3J0YyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKGluZm8tPmlycV9hbGFybSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzYTExMDBfcnRjX3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IHNhMTEwMF9ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNhMTEwMF9ydGNfcmVzdW1lLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzYTExMDBfcnRjX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAibXJ2bCxzYTExMDAtcnRjIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1ydmwsbW1wLXJ0YyIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzYTExMDBfcnRjX2R0X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNhMTEwMF9ydGNfZHJpdmVyID0geworCS5wcm9iZQkJPSBzYTExMDBfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gc2ExMTAwX3J0Y19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNhMTEwMC1ydGMiLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmc2ExMTAwX3J0Y19wbV9vcHMsCisjZW5kaWYKKwkJLm9mX21hdGNoX3RhYmxlID0gc2ExMTAwX3J0Y19kdF9pZHMsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2ExMTAwX3J0Y19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBycHN5cy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNBMTF4MC9QWEEyeHggUmVhbHRpbWUgQ2xvY2sgRHJpdmVyIChSVEMpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNhMTEwMC1ydGMiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1zaC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1YTc2MwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1zaC5jCkBAIC0wLDAgKzEsODQyIEBACisvKgorICogU3VwZXJIIE9uLUNoaXAgUlRDIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA5ICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEphbWllIExlbmVoYW4KKyAqIENvcHlyaWdodCAoQykgMjAwOCAgQW5nZWxvIENhc3RlbGxvCisgKgorICogQmFzZWQgb24gdGhlIG9sZCBhcmNoL3NoL2tlcm5lbC9jcHUvcnRjLmMgYnk6CisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInNoLXJ0YyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMi4zIgorCisjZGVmaW5lIFJUQ19SRUcocikJKChyKSAqIHJ0Y19yZWdfc2l6ZSkKKworI2RlZmluZSBSNjRDTlQJCVJUQ19SRUcoMCkKKworI2RlZmluZSBSU0VDQ05UCQlSVENfUkVHKDEpCS8qIFJUQyBzZWMgKi8KKyNkZWZpbmUgUk1JTkNOVAkJUlRDX1JFRygyKQkvKiBSVEMgbWluICovCisjZGVmaW5lIFJIUkNOVAkJUlRDX1JFRygzKQkvKiBSVEMgaG91ciAqLworI2RlZmluZSBSV0tDTlQJCVJUQ19SRUcoNCkJLyogUlRDIHdlZWsgKi8KKyNkZWZpbmUgUkRBWUNOVAkJUlRDX1JFRyg1KQkvKiBSVEMgZGF5ICovCisjZGVmaW5lIFJNT05DTlQJCVJUQ19SRUcoNikJLyogUlRDIG1vbnRoICovCisjZGVmaW5lIFJZUkNOVAkJUlRDX1JFRyg3KQkvKiBSVEMgeWVhciAqLworI2RlZmluZSBSU0VDQVIJCVJUQ19SRUcoOCkJLyogQUxBUk0gc2VjICovCisjZGVmaW5lIFJNSU5BUgkJUlRDX1JFRyg5KQkvKiBBTEFSTSBtaW4gKi8KKyNkZWZpbmUgUkhSQVIJCVJUQ19SRUcoMTApCS8qIEFMQVJNIGhvdXIgKi8KKyNkZWZpbmUgUldLQVIJCVJUQ19SRUcoMTEpCS8qIEFMQVJNIHdlZWsgKi8KKyNkZWZpbmUgUkRBWUFSCQlSVENfUkVHKDEyKQkvKiBBTEFSTSBkYXkgKi8KKyNkZWZpbmUgUk1PTkFSCQlSVENfUkVHKDEzKQkvKiBBTEFSTSBtb250aCAqLworI2RlZmluZSBSQ1IxCQlSVENfUkVHKDE0KQkvKiBDb250cm9sICovCisjZGVmaW5lIFJDUjIJCVJUQ19SRUcoMTUpCS8qIENvbnRyb2wgKi8KKworLyoKKyAqIE5vdGUgb24gUllSQVIgYW5kIFJDUjM6IFVwIHVudGlsIHRoaXMgcG9pbnQgbW9zdCBvZiB0aGUgcmVnaXN0ZXIKKyAqIGRlZmluaXRpb25zIGFyZSBjb25zaXN0ZW50IGFjcm9zcyBhbGwgb2YgdGhlIGF2YWlsYWJsZSBwYXJ0cy4gSG93ZXZlciwKKyAqIHRoZSBwbGFjZW1lbnQgb2YgdGhlIG9wdGlvbmFsIFJZUkFSIGFuZCBSQ1IzICh0aGUgUllSQVIgY29udHJvbAorICogcmVnaXN0ZXIgdXNlZCB0byBjb250cm9sIFJZUkNOVC9SWVJBUiBjb21wYXJlKSB2YXJpZXMgY29uc2lkZXJhYmx5CisgKiBhY3Jvc3MgdmFyaW91cyBwYXJ0cywgb2NjYXNpb25hbGx5IGJlaW5nIG1hcHBlZCBpbiB0byBhIGNvbXBsZXRlbHkKKyAqIHVucmVsYXRlZCBhZGRyZXNzIHNwYWNlLiBGb3IgcHJvcGVyIFJZUkFSIHN1cHBvcnQgYSBzZXBhcmF0ZSByZXNvdXJjZQorICogd291bGQgaGF2ZSB0byBiZSBoYW5kZWQgb2ZmLCBidXQgYXMgdGhpcyBpcyBwdXJlbHkgb3B0aW9uYWwgaW4KKyAqIHByYWN0aWNlLCB3ZSBzaW1wbHkgb3B0IG5vdCB0byBzdXBwb3J0IGl0LCB0aGVyZWJ5IGtlZXBpbmcgdGhlIGNvZGUKKyAqIHF1aXRlIGEgYml0IG1vcmUgc2ltcGxpZmllZC4KKyAqLworCisvKiBBTEFSTSBCaXRzIC0gb3Igd2l0aCBCQ0QgZW5jb2RlZCB2YWx1ZSAqLworI2RlZmluZSBBUl9FTkIJCTB4ODAJLyogRW5hYmxlIGZvciBhbGFybSBjbXAgICAqLworCisvKiBQZXJpb2QgQml0cyAqLworI2RlZmluZSBQRl9IUAkJMHgxMDAJLyogRW5hYmxlIEhhbGYgUGVyaW9kIHRvIHN1cHBvcnQgOCwzMiwxMjhIeiAqLworI2RlZmluZSBQRl9DT1VOVAkweDIwMAkvKiBIYWxmIHBlcmlvZGljIGNvdW50ZXIgKi8KKyNkZWZpbmUgUEZfT1hTCQkweDQwMAkvKiBQZXJpb2RpYyBPbmUgeCBTZWNvbmQgKi8KKyNkZWZpbmUgUEZfS09VCQkweDgwMAkvKiBLZXJuZWwgb3IgVXNlciBwZXJpb2RpYyByZXF1ZXN0IDE9a2VybmVsICovCisjZGVmaW5lIFBGX01BU0sJCTB4ZjAwCisKKy8qIFJDUjEgQml0cyAqLworI2RlZmluZSBSQ1IxX0NGCQkweDgwCS8qIENhcnJ5IEZsYWcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNSMV9DSUUJMHgxMAkvKiBDYXJyeSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJDUjFfQUlFCTB4MDgJLyogQWxhcm0gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBSQ1IxX0FGCQkweDAxCS8qIEFsYXJtIEZsYWcgICAgICAgICAgICAgKi8KKworLyogUkNSMiBCaXRzICovCisjZGVmaW5lIFJDUjJfUEVGCTB4ODAJLyogUEVyaW9kaWMgaW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgUkNSMl9QRVNNQVNLCTB4NzAJLyogUGVyaW9kaWMgaW50ZXJydXB0IFNldCAgKi8KKyNkZWZpbmUgUkNSMl9SVENFTgkweDA4CS8qIEVOYWJsZSBSVEMgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDUjJfQURKCTB4MDQJLyogQURKdXN0bWVudCAoMzAtc2Vjb25kKSAgKi8KKyNkZWZpbmUgUkNSMl9SRVNFVAkweDAyCS8qIFJlc2V0IGJpdCAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDUjJfU1RBUlQJMHgwMQkvKiBTdGFydCBiaXQgICAgICAgICAgICAgICAqLworCitzdHJ1Y3Qgc2hfcnRjIHsKKwl2b2lkIF9faW9tZW0JCSpyZWdiYXNlOworCXVuc2lnbmVkIGxvbmcJCXJlZ3NpemU7CisJc3RydWN0IHJlc291cmNlCQkqcmVzOworCWludAkJCWFsYXJtX2lycTsKKwlpbnQJCQlwZXJpb2RpY19pcnE7CisJaW50CQkJY2FycnlfaXJxOworCXN0cnVjdCBjbGsJCSpjbGs7CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0Y19kZXY7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl1bnNpZ25lZCBsb25nCQljYXBhYmlsaXRpZXM7CS8qIFNlZSBhc20vcnRjLmggZm9yIGNhcCBiaXRzICovCisJdW5zaWduZWQgc2hvcnQJCXBlcmlvZGljX2ZyZXE7Cit9OworCitzdGF0aWMgaW50IF9fc2hfcnRjX2ludGVycnVwdChzdHJ1Y3Qgc2hfcnRjICpydGMpCit7CisJdW5zaWduZWQgaW50IHRtcCwgcGVuZGluZzsKKworCXRtcCA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjEpOworCXBlbmRpbmcgPSB0bXAgJiBSQ1IxX0NGOworCXRtcCAmPSB+UkNSMV9DRjsKKwl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCS8qIFVzZXJzIGhhdmUgcmVxdWVzdGVkIE9uZSB4IFNlY29uZCBJUlEgKi8KKwlpZiAocGVuZGluZyAmJiBydGMtPnBlcmlvZGljX2ZyZXEgJiBQRl9PWFMpCisJCXJ0Y191cGRhdGVfaXJxKHJ0Yy0+cnRjX2RldiwgMSwgUlRDX1VGIHwgUlRDX0lSUUYpOworCisJcmV0dXJuIHBlbmRpbmc7Cit9CisKK3N0YXRpYyBpbnQgX19zaF9ydGNfYWxhcm0oc3RydWN0IHNoX3J0YyAqcnRjKQoreworCXVuc2lnbmVkIGludCB0bXAsIHBlbmRpbmc7CisKKwl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKwlwZW5kaW5nID0gdG1wICYgUkNSMV9BRjsKKwl0bXAgJj0gfihSQ1IxX0FGIHwgUkNSMV9BSUUpOworCXdyaXRlYih0bXAsIHJ0Yy0+cmVnYmFzZSArIFJDUjEpOworCisJaWYgKHBlbmRpbmcpCisJCXJ0Y191cGRhdGVfaXJxKHJ0Yy0+cnRjX2RldiwgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCisJcmV0dXJuIHBlbmRpbmc7Cit9CisKK3N0YXRpYyBpbnQgX19zaF9ydGNfcGVyaW9kaWMoc3RydWN0IHNoX3J0YyAqcnRjKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGNfZGV2ID0gcnRjLT5ydGNfZGV2OworCXN0cnVjdCBydGNfdGFzayAqaXJxX3Rhc2s7CisJdW5zaWduZWQgaW50IHRtcCwgcGVuZGluZzsKKworCXRtcCA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjIpOworCXBlbmRpbmcgPSB0bXAgJiBSQ1IyX1BFRjsKKwl0bXAgJj0gflJDUjJfUEVGOworCXdyaXRlYih0bXAsIHJ0Yy0+cmVnYmFzZSArIFJDUjIpOworCisJaWYgKCFwZW5kaW5nKQorCQlyZXR1cm4gMDsKKworCS8qIEhhbGYgcGVyaW9kIGVuYWJsZWQgdGhhbiBvbmUgc2tpcHBlZCBhbmQgdGhlIG5leHQgbm90aWZpZWQgKi8KKwlpZiAoKHJ0Yy0+cGVyaW9kaWNfZnJlcSAmIFBGX0hQKSAmJiAocnRjLT5wZXJpb2RpY19mcmVxICYgUEZfQ09VTlQpKQorCQlydGMtPnBlcmlvZGljX2ZyZXEgJj0gflBGX0NPVU5UOworCWVsc2UgeworCQlpZiAocnRjLT5wZXJpb2RpY19mcmVxICYgUEZfSFApCisJCQlydGMtPnBlcmlvZGljX2ZyZXEgfD0gUEZfQ09VTlQ7CisJCWlmIChydGMtPnBlcmlvZGljX2ZyZXEgJiBQRl9LT1UpIHsKKwkJCXNwaW5fbG9jaygmcnRjX2Rldi0+aXJxX3Rhc2tfbG9jayk7CisJCQlpcnFfdGFzayA9IHJ0Y19kZXYtPmlycV90YXNrOworCQkJaWYgKGlycV90YXNrKQorCQkJCWlycV90YXNrLT5mdW5jKGlycV90YXNrLT5wcml2YXRlX2RhdGEpOworCQkJc3Bpbl91bmxvY2soJnJ0Y19kZXYtPmlycV90YXNrX2xvY2spOworCQl9IGVsc2UKKwkJCXJ0Y191cGRhdGVfaXJxKHJ0Yy0+cnRjX2RldiwgMSwgUlRDX1BGIHwgUlRDX0lSUUYpOworCX0KKworCXJldHVybiBwZW5kaW5nOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2hfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2lkOworCWludCByZXQ7CisKKwlzcGluX2xvY2soJnJ0Yy0+bG9jayk7CisJcmV0ID0gX19zaF9ydGNfaW50ZXJydXB0KHJ0Yyk7CisJc3Bpbl91bmxvY2soJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChyZXQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2hfcnRjX2FsYXJtKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBkZXZfaWQ7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmcnRjLT5sb2NrKTsKKwlyZXQgPSBfX3NoX3J0Y19hbGFybShydGMpOworCXNwaW5fdW5sb2NrKCZydGMtPmxvY2spOworCisJcmV0dXJuIElSUV9SRVRWQUwocmV0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNoX3J0Y19wZXJpb2RpYyhpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2lkOworCWludCByZXQ7CisKKwlzcGluX2xvY2soJnJ0Yy0+bG9jayk7CisJcmV0ID0gX19zaF9ydGNfcGVyaW9kaWMocnRjKTsKKwlzcGluX3VubG9jaygmcnRjLT5sb2NrKTsKKworCXJldHVybiBJUlFfUkVUVkFMKHJldCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaF9ydGNfc2hhcmVkKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBkZXZfaWQ7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmcnRjLT5sb2NrKTsKKwlyZXQgPSBfX3NoX3J0Y19pbnRlcnJ1cHQocnRjKTsKKwlyZXQgfD0gX19zaF9ydGNfYWxhcm0ocnRjKTsKKwlyZXQgfD0gX19zaF9ydGNfcGVyaW9kaWMocnRjKTsKKwlzcGluX3VubG9jaygmcnRjLT5sb2NrKTsKKworCXJldHVybiBJUlFfUkVUVkFMKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgc2hfcnRjX2lycV9zZXRfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzaF9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCisJdG1wID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUkNSMik7CisKKwlpZiAoZW5hYmxlKSB7CisJCXJ0Yy0+cGVyaW9kaWNfZnJlcSB8PSBQRl9LT1U7CisJCXRtcCAmPSB+UkNSMl9QRUY7CS8qIENsZWFyIFBFUyBiaXQgKi8KKwkJdG1wIHw9IChydGMtPnBlcmlvZGljX2ZyZXEgJiB+UEZfSFApOwkvKiBTZXQgUEVTMi0wICovCisJfSBlbHNlIHsKKwkJcnRjLT5wZXJpb2RpY19mcmVxICY9IH5QRl9LT1U7CisJCXRtcCAmPSB+KFJDUjJfUEVTTUFTSyB8IFJDUjJfUEVGKTsKKwl9CisKKwl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IyKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoX3J0Y19pcnFfc2V0X2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZnJlcSkKK3sKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgdG1wLCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKwl0bXAgPSBydGMtPnBlcmlvZGljX2ZyZXEgJiBQRl9NQVNLOworCisJc3dpdGNoIChmcmVxKSB7CisJY2FzZSAwOgorCQlydGMtPnBlcmlvZGljX2ZyZXEgPSAweDAwOworCQlicmVhazsKKwljYXNlIDE6CisJCXJ0Yy0+cGVyaW9kaWNfZnJlcSA9IDB4NjA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcnRjLT5wZXJpb2RpY19mcmVxID0gMHg1MDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlydGMtPnBlcmlvZGljX2ZyZXEgPSAweDQwOworCQlicmVhazsKKwljYXNlIDg6CisJCXJ0Yy0+cGVyaW9kaWNfZnJlcSA9IDB4MzAgfCBQRl9IUDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJcnRjLT5wZXJpb2RpY19mcmVxID0gMHgzMDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJcnRjLT5wZXJpb2RpY19mcmVxID0gMHgyMCB8IFBGX0hQOworCQlicmVhazsKKwljYXNlIDY0OgorCQlydGMtPnBlcmlvZGljX2ZyZXEgPSAweDIwOworCQlicmVhazsKKwljYXNlIDEyODoKKwkJcnRjLT5wZXJpb2RpY19mcmVxID0gMHgxMCB8IFBGX0hQOworCQlicmVhazsKKwljYXNlIDI1NjoKKwkJcnRjLT5wZXJpb2RpY19mcmVxID0gMHgxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1RTVVBQOworCX0KKworCWlmIChyZXQgPT0gMCkKKwkJcnRjLT5wZXJpb2RpY19mcmVxIHw9IHRtcDsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2hfcnRjX3NldGFpZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGUpCit7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCWlmIChlbmFibGUpCisJCXRtcCB8PSBSQ1IxX0FJRTsKKwllbHNlCisJCXRtcCAmPSB+UkNSMV9BSUU7CisKKwl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKK30KKworc3RhdGljIGludCBzaF9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBzaF9ydGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCB0bXA7CisKKwl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKwlzZXFfcHJpbnRmKHNlcSwgImNhcnJ5X0lSUVx0OiAlc1xuIiwgKHRtcCAmIFJDUjFfQ0lFKSA/ICJ5ZXMiIDogIm5vIik7CisKKwl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IyKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKKwkJICAgKHRtcCAmIFJDUjJfUEVTTUFTSykgPyAieWVzIiA6ICJubyIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaF9ydGNfc2V0Y2llKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXRtcCA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjEpOworCisJaWYgKCFlbmFibGUpCisJCXRtcCAmPSB+UkNSMV9DSUU7CisJZWxzZQorCQl0bXAgfD0gUkNSMV9DSUU7CisKKwl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKK30KKworc3RhdGljIGludCBzaF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXNoX3J0Y19zZXRhaWUoZGV2LCBlbmFibGVkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW50IHNlYzEyOCwgc2VjMiwgeXIsIHlyMTAwLCBjZl9iaXQ7CisKKwlkbyB7CisJCXVuc2lnbmVkIGludCB0bXA7CisKKwkJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCQl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKwkJdG1wICY9IH5SQ1IxX0NGOyAvKiBDbGVhciBDRi1iaXQgKi8KKwkJdG1wIHw9IFJDUjFfQ0lFOworCQl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCQlzZWMxMjggPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSNjRDTlQpOworCisJCXRtLT50bV9zZWMJPSBiY2QyYmluKHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJTRUNDTlQpKTsKKwkJdG0tPnRtX21pbgk9IGJjZDJiaW4ocmVhZGIocnRjLT5yZWdiYXNlICsgUk1JTkNOVCkpOworCQl0bS0+dG1faG91cgk9IGJjZDJiaW4ocmVhZGIocnRjLT5yZWdiYXNlICsgUkhSQ05UKSk7CisJCXRtLT50bV93ZGF5CT0gYmNkMmJpbihyZWFkYihydGMtPnJlZ2Jhc2UgKyBSV0tDTlQpKTsKKwkJdG0tPnRtX21kYXkJPSBiY2QyYmluKHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJEQVlDTlQpKTsKKwkJdG0tPnRtX21vbgk9IGJjZDJiaW4ocmVhZGIocnRjLT5yZWdiYXNlICsgUk1PTkNOVCkpIC0gMTsKKworCQlpZiAocnRjLT5jYXBhYmlsaXRpZXMgJiBSVENfQ0FQXzRfRElHSVRfWUVBUikgeworCQkJeXIgID0gcmVhZHcocnRjLT5yZWdiYXNlICsgUllSQ05UKTsKKwkJCXlyMTAwID0gYmNkMmJpbih5ciA+PiA4KTsKKwkJCXlyICY9IDB4ZmY7CisJCX0gZWxzZSB7CisJCQl5ciAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSWVJDTlQpOworCQkJeXIxMDAgPSBiY2QyYmluKCh5ciA9PSAweDk5KSA/IDB4MTkgOiAweDIwKTsKKwkJfQorCisJCXRtLT50bV95ZWFyID0gKHlyMTAwICogMTAwICsgYmNkMmJpbih5cikpIC0gMTkwMDsKKworCQlzZWMyID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUjY0Q05UKTsKKwkJY2ZfYml0ID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUkNSMSkgJiBSQ1IxX0NGOworCisJCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKwl9IHdoaWxlIChjZl9iaXQgIT0gMCB8fCAoKHNlYzEyOCBeIHNlYzIpICYgUlRDX0JJVF9JTlZFUlRFRCkgIT0gMCk7CisKKyNpZiBSVENfQklUX0lOVkVSVEVEICE9IDAKKwlpZiAoKHNlYzEyOCAmIFJUQ19CSVRfSU5WRVJURUQpKQorCQl0bS0+dG1fc2VjLS07CisjZW5kaWYKKworCS8qIG9ubHkga2VlcCB0aGUgY2FycnkgaW50ZXJydXB0IGVuYWJsZWQgaWYgVUlFIGlzIG9uICovCisJaWYgKCEocnRjLT5wZXJpb2RpY19mcmVxICYgUEZfT1hTKSkKKwkJc2hfcnRjX3NldGNpZShkZXYsIDApOworCisJZGV2X2RiZyhkZXYsICIlczogdG0gaXMgc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsICIKKwkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJX19mdW5jX18sCisJCXRtLT50bV9zZWMsIHRtLT50bV9taW4sIHRtLT50bV9ob3VyLAorCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiArIDEsIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBzaF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCWludCB5ZWFyOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCS8qIFJlc2V0IHByZS1zY2FsZXIgJiBzdG9wIFJUQyAqLworCXRtcCA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjIpOworCXRtcCB8PSBSQ1IyX1JFU0VUOworCXRtcCAmPSB+UkNSMl9TVEFSVDsKKwl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IyKTsKKworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9zZWMpLCAgcnRjLT5yZWdiYXNlICsgUlNFQ0NOVCk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX21pbiksICBydGMtPnJlZ2Jhc2UgKyBSTUlOQ05UKTsKKwl3cml0ZWIoYmluMmJjZCh0bS0+dG1faG91ciksIHJ0Yy0+cmVnYmFzZSArIFJIUkNOVCk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX3dkYXkpLCBydGMtPnJlZ2Jhc2UgKyBSV0tDTlQpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9tZGF5KSwgcnRjLT5yZWdiYXNlICsgUkRBWUNOVCk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX21vbiArIDEpLCBydGMtPnJlZ2Jhc2UgKyBSTU9OQ05UKTsKKworCWlmIChydGMtPmNhcGFiaWxpdGllcyAmIFJUQ19DQVBfNF9ESUdJVF9ZRUFSKSB7CisJCXllYXIgPSAoYmluMmJjZCgodG0tPnRtX3llYXIgKyAxOTAwKSAvIDEwMCkgPDwgOCkgfAorCQkJYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCk7CisJCXdyaXRldyh5ZWFyLCBydGMtPnJlZ2Jhc2UgKyBSWVJDTlQpOworCX0gZWxzZSB7CisJCXllYXIgPSB0bS0+dG1feWVhciAlIDEwMDsKKwkJd3JpdGViKGJpbjJiY2QoeWVhciksIHJ0Yy0+cmVnYmFzZSArIFJZUkNOVCk7CisJfQorCisJLyogU3RhcnQgUlRDICovCisJdG1wID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUkNSMik7CisJdG1wICY9IH5SQ1IyX1JFU0VUOworCXRtcCB8PSBSQ1IyX1JUQ0VOIHwgUkNSMl9TVEFSVDsKKwl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IyKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaF9ydGNfcmVhZF9hbGFybV92YWx1ZShzdHJ1Y3Qgc2hfcnRjICpydGMsIGludCByZWdfb2ZmKQoreworCXVuc2lnbmVkIGludCBieXRlOworCWludCB2YWx1ZSA9IDB4ZmY7CS8qIHJldHVybiAweGZmIGZvciBpZ25vcmVkIHZhbHVlcyAqLworCisJYnl0ZSA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIHJlZ19vZmYpOworCWlmIChieXRlICYgQVJfRU5CKSB7CisJCWJ5dGUgJj0gfkFSX0VOQjsJLyogc3RyaXAgdGhlIGVuYWJsZSBiaXQgKi8KKwkJdmFsdWUgPSBiY2QyYmluKGJ5dGUpOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBzaF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp3a2Fscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzaF9ydGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmd2thbHJtLT50aW1lOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXRtLT50bV9zZWMJPSBzaF9ydGNfcmVhZF9hbGFybV92YWx1ZShydGMsIFJTRUNBUik7CisJdG0tPnRtX21pbgk9IHNoX3J0Y19yZWFkX2FsYXJtX3ZhbHVlKHJ0YywgUk1JTkFSKTsKKwl0bS0+dG1faG91cgk9IHNoX3J0Y19yZWFkX2FsYXJtX3ZhbHVlKHJ0YywgUkhSQVIpOworCXRtLT50bV93ZGF5CT0gc2hfcnRjX3JlYWRfYWxhcm1fdmFsdWUocnRjLCBSV0tBUik7CisJdG0tPnRtX21kYXkJPSBzaF9ydGNfcmVhZF9hbGFybV92YWx1ZShydGMsIFJEQVlBUik7CisJdG0tPnRtX21vbgk9IHNoX3J0Y19yZWFkX2FsYXJtX3ZhbHVlKHJ0YywgUk1PTkFSKTsKKwlpZiAodG0tPnRtX21vbiA+IDApCisJCXRtLT50bV9tb24gLT0gMTsgLyogUlRDIGlzIDEtMTIsIHRtX21vbiBpcyAwLTExICovCisJdG0tPnRtX3llYXIgICAgID0gMHhmZmZmOworCisJd2thbHJtLT5lbmFibGVkID0gKHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjEpICYgUkNSMV9BSUUpID8gMSA6IDA7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNoX3J0Y193cml0ZV9hbGFybV92YWx1ZShzdHJ1Y3Qgc2hfcnRjICpydGMsCisJCQkJCSAgICBpbnQgdmFsdWUsIGludCByZWdfb2ZmKQoreworCS8qIDwgMCBmb3IgYSB2YWx1ZSB0aGF0IGlzIGlnbm9yZWQgKi8KKwlpZiAodmFsdWUgPCAwKQorCQl3cml0ZWIoMCwgcnRjLT5yZWdiYXNlICsgcmVnX29mZik7CisJZWxzZQorCQl3cml0ZWIoYmluMmJjZCh2YWx1ZSkgfCBBUl9FTkIsICBydGMtPnJlZ2Jhc2UgKyByZWdfb2ZmKTsKK30KKworc3RhdGljIGludCBzaF9ydGNfY2hlY2tfYWxhcm0oc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwkvKgorCSAqIFRoZSBvcmlnaW5hbCBydGMgc2F5cyBhbnl0aGluZyA+IDB4YzAgaXMgImRvbid0IGNhcmUiIG9yICJtYXRjaAorCSAqIGFsbCIgLSBtb3N0IHVzZXJzIHVzZSAweGZmIGJ1dCBydGMtZGV2IHVzZXMgLTEgZm9yIHRoZSBzYW1lIHRoaW5nLgorCSAqIFRoZSBvcmlnaW5hbCBydGMgZG9lc24ndCBzdXBwb3J0IHllYXJzIC0gc29tZSB0aGluZ3MgdXNlIC0xIGFuZAorCSAqIHNvbWUgMHhmZmZmLiBXZSB1c2UgLTEgdG8gbWFrZSBvdXQgdGVzdHMgZWFzaWVyLgorCSAqLworCWlmICh0bS0+dG1feWVhciA9PSAweGZmZmYpCisJCXRtLT50bV95ZWFyID0gLTE7CisJaWYgKHRtLT50bV9tb24gPj0gMHhmZikKKwkJdG0tPnRtX21vbiA9IC0xOworCWlmICh0bS0+dG1fbWRheSA+PSAweGZmKQorCQl0bS0+dG1fbWRheSA9IC0xOworCWlmICh0bS0+dG1fd2RheSA+PSAweGZmKQorCQl0bS0+dG1fd2RheSA9IC0xOworCWlmICh0bS0+dG1faG91ciA+PSAweGZmKQorCQl0bS0+dG1faG91ciA9IC0xOworCWlmICh0bS0+dG1fbWluID49IDB4ZmYpCisJCXRtLT50bV9taW4gPSAtMTsKKwlpZiAodG0tPnRtX3NlYyA+PSAweGZmKQorCQl0bS0+dG1fc2VjID0gLTE7CisKKwlpZiAodG0tPnRtX3llYXIgPiA5OTk5IHx8CisJCXRtLT50bV9tb24gPj0gMTIgfHwKKwkJdG0tPnRtX21kYXkgPT0gMCB8fCB0bS0+dG1fbWRheSA+PSAzMiB8fAorCQl0bS0+dG1fd2RheSA+PSA3IHx8CisJCXRtLT50bV9ob3VyID49IDI0IHx8CisJCXRtLT50bV9taW4gPj0gNjAgfHwKKwkJdG0tPnRtX3NlYyA+PSA2MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKndrYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW50IHJjcjE7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZ3a2Fscm0tPnRpbWU7CisJaW50IG1vbiwgZXJyOworCisJZXJyID0gc2hfcnRjX2NoZWNrX2FsYXJtKHRtKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCXJldHVybiBlcnI7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCisJLyogZGlzYWJsZSBhbGFybSBpbnRlcnJ1cHQgYW5kIGNsZWFyIHRoZSBhbGFybSBmbGFnICovCisJcmNyMSA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjEpOworCXJjcjEgJj0gfihSQ1IxX0FGIHwgUkNSMV9BSUUpOworCXdyaXRlYihyY3IxLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCS8qIHNldCBhbGFybSB0aW1lICovCisJc2hfcnRjX3dyaXRlX2FsYXJtX3ZhbHVlKHJ0YywgdG0tPnRtX3NlYywgIFJTRUNBUik7CisJc2hfcnRjX3dyaXRlX2FsYXJtX3ZhbHVlKHJ0YywgdG0tPnRtX21pbiwgIFJNSU5BUik7CisJc2hfcnRjX3dyaXRlX2FsYXJtX3ZhbHVlKHJ0YywgdG0tPnRtX2hvdXIsIFJIUkFSKTsKKwlzaF9ydGNfd3JpdGVfYWxhcm1fdmFsdWUocnRjLCB0bS0+dG1fd2RheSwgUldLQVIpOworCXNoX3J0Y193cml0ZV9hbGFybV92YWx1ZShydGMsIHRtLT50bV9tZGF5LCBSREFZQVIpOworCW1vbiA9IHRtLT50bV9tb247CisJaWYgKG1vbiA+PSAwKQorCQltb24gKz0gMTsKKwlzaF9ydGNfd3JpdGVfYWxhcm1fdmFsdWUocnRjLCBtb24sIFJNT05BUik7CisKKwlpZiAod2thbHJtLT5lbmFibGVkKSB7CisJCXJjcjEgfD0gUkNSMV9BSUU7CisJCXdyaXRlYihyY3IxLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHNoX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHNoX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gc2hfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gc2hfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IHNoX3J0Y19zZXRfYWxhcm0sCisJLnByb2MJCT0gc2hfcnRjX3Byb2MsCisJLmFsYXJtX2lycV9lbmFibGUgPSBzaF9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaF9ydGMgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcnRjX3RpbWUgcjsKKwljaGFyIGNsa19uYW1lWzZdOworCWludCBjbGtfaWQsIHJldDsKKworCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaF9ydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXJ0YykpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnJ0Yy0+bG9jayk7CisKKwkvKiBnZXQgcGVyaW9kaWMvY2FycnkvYWxhcm0gaXJxcyAqLworCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHVubGlrZWx5KHJldCA8PSAwKSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgcmVzb3VyY2VcbiIpOworCQlnb3RvIGVycl9iYWRyZXM7CisJfQorCisJcnRjLT5wZXJpb2RpY19pcnEgPSByZXQ7CisJcnRjLT5jYXJyeV9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCXJ0Yy0+YWxhcm1faXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAyKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwlpZiAodW5saWtlbHkocmVzID09IE5VTEwpKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElPIHJlc291cmNlXG4iKTsKKwkJZ290byBlcnJfYmFkcmVzOworCX0KKworCXJ0Yy0+cmVnc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKworCXJ0Yy0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJ0Yy0+cmVnc2l6ZSwgcGRldi0+bmFtZSk7CisJaWYgKHVubGlrZWx5KCFydGMtPnJlcykpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9iYWRyZXM7CisJfQorCisJcnRjLT5yZWdiYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJ0Yy0+cmVzLT5zdGFydCwgcnRjLT5yZWdzaXplKTsKKwlpZiAodW5saWtlbHkoIXJ0Yy0+cmVnYmFzZSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfYmFkbWFwOworCX0KKworCWNsa19pZCA9IHBkZXYtPmlkOworCS8qIFdpdGggYSBzaW5nbGUgZGV2aWNlLCB0aGUgY2xvY2sgaWQgaXMgc3RpbGwgInJ0YzAiICovCisJaWYgKGNsa19pZCA8IDApCisJCWNsa19pZCA9IDA7CisKKwlzbnByaW50ZihjbGtfbmFtZSwgc2l6ZW9mKGNsa19uYW1lKSwgInJ0YyVkIiwgY2xrX2lkKTsKKworCXJ0Yy0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBjbGtfbmFtZSk7CisJaWYgKElTX0VSUihydGMtPmNsaykpIHsKKwkJLyoKKwkJICogTm8gZXJyb3IgaGFuZGxpbmcgZm9yIHJ0Yy0+Y2xrIGludGVudGlvbmFsbHksIG5vdCBhbGwKKwkJICogcGxhdGZvcm1zIHdpbGwgaGF2ZSBhIHVuaXF1ZSBjbG9jayBmb3IgdGhlIFJUQywgYW5kCisJCSAqIHRoZSBjbGsgQVBJIGNhbiBoYW5kbGUgdGhlIHN0cnVjdCBjbGsgcG9pbnRlciBiZWluZworCQkgKiBOVUxMLgorCQkgKi8KKwkJcnRjLT5jbGsgPSBOVUxMOworCX0KKworCWNsa19lbmFibGUocnRjLT5jbGspOworCisJcnRjLT5jYXBhYmlsaXRpZXMgPSBSVENfREVGX0NBUEFCSUxJVElFUzsKKwlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpIHsKKwkJc3RydWN0IHNoX3J0Y19wbGF0Zm9ybV9pbmZvICpwaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJCS8qCisJCSAqIFNvbWUgQ1BVcyBoYXZlIHNwZWNpYWwgY2FwYWJpbGl0aWVzIGluIGFkZGl0aW9uIHRvIHRoZQorCQkgKiBkZWZhdWx0IHNldC4gQWRkIHRob3NlIGluIGhlcmUuCisJCSAqLworCQlydGMtPmNhcGFiaWxpdGllcyB8PSBwaW5mby0+Y2FwYWJpbGl0aWVzOworCX0KKworCWlmIChydGMtPmNhcnJ5X2lycSA8PSAwKSB7CisJCS8qIHJlZ2lzdGVyIHNoYXJlZCBwZXJpb2RpYy9jYXJyeS9hbGFybSBpcnEgKi8KKwkJcmV0ID0gcmVxdWVzdF9pcnEocnRjLT5wZXJpb2RpY19pcnEsIHNoX3J0Y19zaGFyZWQsCisJCQkJICAwLCAic2gtcnRjIiwgcnRjKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkicmVxdWVzdCBJUlEgZmFpbGVkIHdpdGggJWQsIElSUSAlZFxuIiwgcmV0LAorCQkJCXJ0Yy0+cGVyaW9kaWNfaXJxKTsKKwkJCWdvdG8gZXJyX3VubWFwOworCQl9CisJfSBlbHNlIHsKKwkJLyogcmVnaXN0ZXIgcGVyaW9kaWMvY2FycnkvYWxhcm0gaXJxcyAqLworCQlyZXQgPSByZXF1ZXN0X2lycShydGMtPnBlcmlvZGljX2lycSwgc2hfcnRjX3BlcmlvZGljLAorCQkJCSAgMCwgInNoLXJ0YyBwZXJpb2QiLCBydGMpOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJyZXF1ZXN0IHBlcmlvZCBJUlEgZmFpbGVkIHdpdGggJWQsIElSUSAlZFxuIiwKKwkJCQlyZXQsIHJ0Yy0+cGVyaW9kaWNfaXJxKTsKKwkJCWdvdG8gZXJyX3VubWFwOworCQl9CisKKwkJcmV0ID0gcmVxdWVzdF9pcnEocnRjLT5jYXJyeV9pcnEsIHNoX3J0Y19pbnRlcnJ1cHQsCisJCQkJICAwLCAic2gtcnRjIGNhcnJ5IiwgcnRjKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkicmVxdWVzdCBjYXJyeSBJUlEgZmFpbGVkIHdpdGggJWQsIElSUSAlZFxuIiwKKwkJCQlyZXQsIHJ0Yy0+Y2FycnlfaXJxKTsKKwkJCWZyZWVfaXJxKHJ0Yy0+cGVyaW9kaWNfaXJxLCBydGMpOworCQkJZ290byBlcnJfdW5tYXA7CisJCX0KKworCQlyZXQgPSByZXF1ZXN0X2lycShydGMtPmFsYXJtX2lycSwgc2hfcnRjX2FsYXJtLAorCQkJCSAgMCwgInNoLXJ0YyBhbGFybSIsIHJ0Yyk7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJInJlcXVlc3QgYWxhcm0gSVJRIGZhaWxlZCB3aXRoICVkLCBJUlEgJWRcbiIsCisJCQkJcmV0LCBydGMtPmFsYXJtX2lycSk7CisJCQlmcmVlX2lycShydGMtPmNhcnJ5X2lycSwgcnRjKTsKKwkJCWZyZWVfaXJxKHJ0Yy0+cGVyaW9kaWNfaXJxLCBydGMpOworCQkJZ290byBlcnJfdW5tYXA7CisJCX0KKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJLyogZXZlcnl0aGluZyBkaXNhYmxlZCBieSBkZWZhdWx0ICovCisJc2hfcnRjX2lycV9zZXRfZnJlcSgmcGRldi0+ZGV2LCAwKTsKKwlzaF9ydGNfaXJxX3NldF9zdGF0ZSgmcGRldi0+ZGV2LCAwKTsKKwlzaF9ydGNfc2V0YWllKCZwZGV2LT5kZXYsIDApOworCXNoX3J0Y19zZXRjaWUoJnBkZXYtPmRldiwgMCk7CisKKwlydGMtPnJ0Y19kZXYgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJzaCIsICZwZGV2LT5kZXYsCisJCQkJCSAgICZzaF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMtPnJ0Y19kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjLT5ydGNfZGV2KTsKKwkJZnJlZV9pcnEocnRjLT5wZXJpb2RpY19pcnEsIHJ0Yyk7CisJCWZyZWVfaXJxKHJ0Yy0+Y2FycnlfaXJxLCBydGMpOworCQlmcmVlX2lycShydGMtPmFsYXJtX2lycSwgcnRjKTsKKwkJZ290byBlcnJfdW5tYXA7CisJfQorCisJcnRjLT5ydGNfZGV2LT5tYXhfdXNlcl9mcmVxID0gMjU2OworCisJLyogcmVzZXQgcnRjIHRvIGVwb2NoIDAgaWYgdGltZSBpcyBpbnZhbGlkICovCisJaWYgKHJ0Y19yZWFkX3RpbWUocnRjLT5ydGNfZGV2LCAmcikgPCAwKSB7CisJCXJ0Y190aW1lX3RvX3RtKDAsICZyKTsKKwkJcnRjX3NldF90aW1lKHJ0Yy0+cnRjX2RldiwgJnIpOworCX0KKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKwlyZXR1cm4gMDsKKworZXJyX3VubWFwOgorCWNsa19kaXNhYmxlKHJ0Yy0+Y2xrKTsKKwljbGtfcHV0KHJ0Yy0+Y2xrKTsKKwlpb3VubWFwKHJ0Yy0+cmVnYmFzZSk7CitlcnJfYmFkbWFwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihydGMtPnJlcy0+c3RhcnQsIHJ0Yy0+cmVnc2l6ZSk7CitlcnJfYmFkcmVzOgorCWtmcmVlKHJ0Yyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBzaF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjLT5ydGNfZGV2KTsKKwlzaF9ydGNfaXJxX3NldF9zdGF0ZSgmcGRldi0+ZGV2LCAwKTsKKworCXNoX3J0Y19zZXRhaWUoJnBkZXYtPmRldiwgMCk7CisJc2hfcnRjX3NldGNpZSgmcGRldi0+ZGV2LCAwKTsKKworCWZyZWVfaXJxKHJ0Yy0+cGVyaW9kaWNfaXJxLCBydGMpOworCisJaWYgKHJ0Yy0+Y2FycnlfaXJxID4gMCkgeworCQlmcmVlX2lycShydGMtPmNhcnJ5X2lycSwgcnRjKTsKKwkJZnJlZV9pcnEocnRjLT5hbGFybV9pcnEsIHJ0Yyk7CisJfQorCisJaW91bm1hcChydGMtPnJlZ2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihydGMtPnJlcy0+c3RhcnQsIHJ0Yy0+cmVnc2l6ZSk7CisKKwljbGtfZGlzYWJsZShydGMtPmNsayk7CisJY2xrX3B1dChydGMtPmNsayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWtmcmVlKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hfcnRjX3NldF9pcnFfd2FrZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBlbmFibGVkKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlycV9zZXRfaXJxX3dha2UocnRjLT5wZXJpb2RpY19pcnEsIGVuYWJsZWQpOworCisJaWYgKHJ0Yy0+Y2FycnlfaXJxID4gMCkgeworCQlpcnFfc2V0X2lycV93YWtlKHJ0Yy0+Y2FycnlfaXJxLCBlbmFibGVkKTsKKwkJaXJxX3NldF9pcnFfd2FrZShydGMtPmFsYXJtX2lycSwgZW5hYmxlZCk7CisJfQorfQorCitzdGF0aWMgaW50IHNoX3J0Y19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJc2hfcnRjX3NldF9pcnFfd2FrZShkZXYsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hfcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCXNoX3J0Y19zZXRfaXJxX3dha2UoZGV2LCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc2hfcnRjX2Rldl9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBzaF9ydGNfc3VzcGVuZCwKKwkucmVzdW1lID0gc2hfcnRjX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNoX3J0Y19wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gRFJWX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmc2hfcnRjX2Rldl9wbV9vcHMsCisJfSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHNoX3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2hfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzaF9ydGNfcGxhdGZvcm1fZHJpdmVyLCBzaF9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2hfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2hfcnRjX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNoX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHNoX3J0Y19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggb24tY2hpcCBSVEMgZHJpdmVyIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiwgIgorCSAgICAgICJKYW1pZSBMZW5laGFuIDxsZW5laGFuQHR3aWJibGUub3JnPiwgIgorCSAgICAgICJBbmdlbG8gQ2FzdGVsbG8gPGFuZ2Vsby5jYXN0ZWxsb0BzdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXNwZWFyLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtc3BlYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzViMGVmCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXNwZWFyLmMKQEAgLTAsMCArMSw1MzggQEAKKy8qCisgKiBkcml2ZXJzL3J0Yy9ydGMtc3BlYXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTVCBNaWNyb2VsZWN0cm9uaWNzCisgKiBSYWplZXYgS3VtYXI8cmFqZWV2LWRsaC5rdW1hckBzdC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworLyogUlRDIHJlZ2lzdGVycyAqLworI2RlZmluZSBUSU1FX1JFRwkJMHgwMAorI2RlZmluZSBEQVRFX1JFRwkJMHgwNAorI2RlZmluZSBBTEFSTV9USU1FX1JFRwkJMHgwOAorI2RlZmluZSBBTEFSTV9EQVRFX1JFRwkJMHgwQworI2RlZmluZSBDVFJMX1JFRwkJMHgxMAorI2RlZmluZSBTVEFUVVNfUkVHCQkweDE0CisKKy8qIFRJTUVfUkVHICYgQUxBUk1fVElNRV9SRUcgKi8KKyNkZWZpbmUgU0VDT05EU19VTklUUwkJKDB4Zjw8MCkJLyogc2Vjb25kcyB1bml0cyBwb3NpdGlvbiAqLworI2RlZmluZSBTRUNPTkRTX1RFTlMJCSgweDc8PDQpCS8qIHNlY29uZHMgdGVucyBwb3NpdGlvbiAqLworI2RlZmluZSBNSU5VVEVTX1VOSVRTCQkoMHhmPDw4KQkvKiBtaW51dGVzIHVuaXRzIHBvc2l0aW9uICovCisjZGVmaW5lIE1JTlVURVNfVEVOUwkJKDB4Nzw8MTIpCS8qIG1pbnV0ZXMgdGVucyBwb3NpdGlvbiAqLworI2RlZmluZSBIT1VSU19VTklUUwkJKDB4Zjw8MTYpCS8qIGhvdXJzIHVuaXRzIHBvc2l0aW9uICovCisjZGVmaW5lIEhPVVJTX1RFTlMJCSgweDM8PDIwKQkvKiBob3VycyB0ZW5zIHBvc2l0aW9uICovCisKKy8qIERBVEVfUkVHICYgQUxBUk1fREFURV9SRUcgKi8KKyNkZWZpbmUgREFZU19VTklUUwkJKDB4Zjw8MCkJLyogZGF5cyB1bml0cyBwb3NpdGlvbiAqLworI2RlZmluZSBEQVlTX1RFTlMJCSgweDM8PDQpCS8qIGRheXMgdGVucyBwb3NpdGlvbiAqLworI2RlZmluZSBNT05USFNfVU5JVFMJCSgweGY8PDgpCS8qIG1vbnRocyB1bml0cyBwb3NpdGlvbiAqLworI2RlZmluZSBNT05USFNfVEVOUwkJKDB4MTw8MTIpCS8qIG1vbnRocyB0ZW5zIHBvc2l0aW9uICovCisjZGVmaW5lIFlFQVJTX1VOSVRTCQkoMHhmPDwxNikJLyogeWVhcnMgdW5pdHMgcG9zaXRpb24gKi8KKyNkZWZpbmUgWUVBUlNfVEVOUwkJKDB4Zjw8MjApCS8qIHllYXJzIHRlbnMgcG9zaXRpb24gKi8KKyNkZWZpbmUgWUVBUlNfSFVORFJFRFMJCSgweGY8PDI0KQkvKiB5ZWFycyBodW5kZXJlZHMgcG9zaXRpb24gKi8KKyNkZWZpbmUgWUVBUlNfTUlMTEVOSVVNUwkoMHhmPDwyOCkJLyogeWVhcnMgbWlsbGVuaXVtIHBvc2l0aW9uICovCisKKy8qIE1BU0sgU0hJRlQgVElNRV9SRUcgJiBBTEFSTV9USU1FX1JFRyovCisjZGVmaW5lIFNFQ09ORF9TSElGVAkJMHgwMAkJLyogc2Vjb25kcyB1bml0cyAqLworI2RlZmluZSBNSU5VVEVfU0hJRlQJCTB4MDgJCS8qIG1pbnV0ZXMgdW5pdHMgcG9zaXRpb24gKi8KKyNkZWZpbmUgSE9VUl9TSElGVAkJMHgxMAkJLyogaG91cnMgdW5pdHMgcG9zaXRpb24gKi8KKyNkZWZpbmUgTURBWV9TSElGVAkJMHgwMAkJLyogTW9udGggZGF5IHNoaWZ0ICovCisjZGVmaW5lIE1PTlRIX1NISUZUCQkweDA4CQkvKiBNb250aCBzaGlmdCAqLworI2RlZmluZSBZRUFSX1NISUZUCQkweDEwCQkvKiBZZWFyIHNoaWZ0ICovCisKKyNkZWZpbmUgU0VDT05EX01BU0sJCTB4N0YKKyNkZWZpbmUgTUlOX01BU0sJCTB4N0YKKyNkZWZpbmUgSE9VUl9NQVNLCQkweDNGCisjZGVmaW5lIERBWV9NQVNLCQkweDNGCisjZGVmaW5lIE1PTlRIX01BU0sJCTB4N0YKKyNkZWZpbmUgWUVBUl9NQVNLCQkweEZGRkYKKworLyogZGF0ZSByZWcgZXF1YWwgdG8gdGltZSByZWcsIGZvciBkZWJ1ZyBvbmx5ICovCisjZGVmaW5lIFRJTUVfQllQCQkoMTw8OSkKKyNkZWZpbmUgSU5UX0VOQUJMRQkJKDE8PDMxKQkJLyogaW50ZXJydXB0IGVuYWJsZSAqLworCisvKiBTVEFUVVNfUkVHICovCisjZGVmaW5lIENMS19VTkNPTk5FQ1RFRAkJKDE8PDApCisjZGVmaW5lIFBFTkRfV1JfVElNRQkJKDE8PDIpCisjZGVmaW5lIFBFTkRfV1JfREFURQkJKDE8PDMpCisjZGVmaW5lIExPU1RfV1JfVElNRQkJKDE8PDQpCisjZGVmaW5lIExPU1RfV1JfREFURQkJKDE8PDUpCisjZGVmaW5lIFJUQ19JTlRfTUFTSwkJKDE8PDMxKQorI2RlZmluZSBTVEFUVVNfQlVTWQkJKFBFTkRfV1JfVElNRSB8IFBFTkRfV1JfREFURSkKKyNkZWZpbmUgU1RBVFVTX0ZBSUwJCShMT1NUX1dSX1RJTUUgfCBMT1NUX1dSX0RBVEUpCisKK3N0cnVjdCBzcGVhcl9ydGNfY29uZmlnIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCBjbGsgKmNsazsKKwlzcGlubG9ja190IGxvY2s7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdW5zaWduZWQgaW50IGlycV93YWtlOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNwZWFyX3J0Y19jbGVhcl9pbnRlcnJ1cHQoc3RydWN0IHNwZWFyX3J0Y19jb25maWcgKmNvbmZpZykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29uZmlnLT5sb2NrLCBmbGFncyk7CisJdmFsID0gcmVhZGwoY29uZmlnLT5pb2FkZHIgKyBTVEFUVVNfUkVHKTsKKwl2YWwgfD0gUlRDX0lOVF9NQVNLOworCXdyaXRlbCh2YWwsIGNvbmZpZy0+aW9hZGRyICsgU1RBVFVTX1JFRyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZmlnLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGVhcl9ydGNfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3Qgc3BlYXJfcnRjX2NvbmZpZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSByZWFkbChjb25maWctPmlvYWRkciArIENUUkxfUkVHKTsKKwlpZiAoISh2YWwgJiBJTlRfRU5BQkxFKSkgeworCQlzcGVhcl9ydGNfY2xlYXJfaW50ZXJydXB0KGNvbmZpZyk7CisJCXZhbCB8PSBJTlRfRU5BQkxFOworCQl3cml0ZWwodmFsLCBjb25maWctPmlvYWRkciArIENUUkxfUkVHKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGVhcl9ydGNfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IHNwZWFyX3J0Y19jb25maWcgKmNvbmZpZykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gcmVhZGwoY29uZmlnLT5pb2FkZHIgKyBDVFJMX1JFRyk7CisJaWYgKHZhbCAmIElOVF9FTkFCTEUpIHsKKwkJdmFsICY9IH5JTlRfRU5BQkxFOworCQl3cml0ZWwodmFsLCBjb25maWctPmlvYWRkciArIENUUkxfUkVHKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBzcGVhcl9ydGNfY29uZmlnICpjb25maWcpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25maWctPmxvY2ssIGZsYWdzKTsKKwlpZiAoKHJlYWRsKGNvbmZpZy0+aW9hZGRyICsgU1RBVFVTX1JFRykpICYgU1RBVFVTX0ZBSUwpCisJCXJldCA9IC1FSU87CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZmlnLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBydGNfd2FpdF9ub3RfYnVzeShzdHJ1Y3Qgc3BlYXJfcnRjX2NvbmZpZyAqY29uZmlnKQoreworCWludCBzdGF0dXMsIGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQXNzdW1pbmcgQlVTWSBtYXkgc3RheSBhY3RpdmUgZm9yIDgwIG1zZWMpICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgODA7IGNvdW50KyspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmZpZy0+bG9jaywgZmxhZ3MpOworCQlzdGF0dXMgPSByZWFkbChjb25maWctPmlvYWRkciArIFNUQVRVU19SRUcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25maWctPmxvY2ssIGZsYWdzKTsKKwkJaWYgKChzdGF0dXMgJiBTVEFUVVNfQlVTWSkgPT0gMCkKKwkJCWJyZWFrOworCQkvKiBjaGVjayBzdGF0dXMgYnVzeSwgYWZ0ZXIgZWFjaCBtc2VjICovCisJCW1zbGVlcCgxKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzcGVhcl9ydGNfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc3BlYXJfcnRjX2NvbmZpZyAqY29uZmlnID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGV2ZW50cyA9IDA7CisJdW5zaWduZWQgaW50IGlycV9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmZpZy0+bG9jaywgZmxhZ3MpOworCWlycV9kYXRhID0gcmVhZGwoY29uZmlnLT5pb2FkZHIgKyBTVEFUVVNfUkVHKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25maWctPmxvY2ssIGZsYWdzKTsKKworCWlmICgoaXJxX2RhdGEgJiBSVENfSU5UX01BU0spKSB7CisJCXNwZWFyX3J0Y19jbGVhcl9pbnRlcnJ1cHQoY29uZmlnKTsKKwkJZXZlbnRzID0gUlRDX0lSUUYgfCBSVENfQUY7CisJCXJ0Y191cGRhdGVfaXJxKGNvbmZpZy0+cnRjLCAxLCBldmVudHMpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlCisJCXJldHVybiBJUlFfTk9ORTsKKworfQorCitzdGF0aWMgaW50IHRtMmJjZChzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWlmIChydGNfdmFsaWRfdG0odG0pICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXRtLT50bV9zZWMgPSBiaW4yYmNkKHRtLT50bV9zZWMpOworCXRtLT50bV9taW4gPSBiaW4yYmNkKHRtLT50bV9taW4pOworCXRtLT50bV9ob3VyID0gYmluMmJjZCh0bS0+dG1faG91cik7CisJdG0tPnRtX21kYXkgPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwl0bS0+dG1fbW9uID0gYmluMmJjZCh0bS0+dG1fbW9uICsgMSk7CisJdG0tPnRtX3llYXIgPSBiaW4yYmNkKHRtLT50bV95ZWFyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY2QydG0oc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl0bS0+dG1fc2VjID0gYmNkMmJpbih0bS0+dG1fc2VjKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbih0bS0+dG1fbWluKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4odG0tPnRtX2hvdXIpOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbih0bS0+dG1fbWRheSk7CisJdG0tPnRtX21vbiA9IGJjZDJiaW4odG0tPnRtX21vbikgLSAxOworCS8qIGVwb2NoID09IDE5MDAgKi8KKwl0bS0+dG1feWVhciA9IGJjZDJiaW4odG0tPnRtX3llYXIpOworfQorCisvKgorICogc3BlYXJfcnRjX3JlYWRfdGltZSAtIHNldCB0aGUgdGltZQorICogQGRldjogcnRjIGRldmljZSBpbiB1c2UKKyAqIEB0bTogaG9sZHMgZGF0ZSBhbmQgdGltZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZCB0aW1lIGFuZCBkYXRlLiBPbiBzdWNjZXNzIGl0IHdpbGwgcmV0dXJuIDAKKyAqIG90aGVyd2lzZSAtdmUgZXJyb3IgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgc3BlYXJfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHNwZWFyX3J0Y19jb25maWcgKmNvbmZpZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCB0aW1lLCBkYXRlOworCisJLyogd2UgZG9uJ3QgcmVwb3J0IHdkYXkveWRheS9pc2RzdCAuLi4gKi8KKwlydGNfd2FpdF9ub3RfYnVzeShjb25maWcpOworCisJdGltZSA9IHJlYWRsKGNvbmZpZy0+aW9hZGRyICsgVElNRV9SRUcpOworCWRhdGUgPSByZWFkbChjb25maWctPmlvYWRkciArIERBVEVfUkVHKTsKKwl0bS0+dG1fc2VjID0gKHRpbWUgPj4gU0VDT05EX1NISUZUKSAmIFNFQ09ORF9NQVNLOworCXRtLT50bV9taW4gPSAodGltZSA+PiBNSU5VVEVfU0hJRlQpICYgTUlOX01BU0s7CisJdG0tPnRtX2hvdXIgPSAodGltZSA+PiBIT1VSX1NISUZUKSAmIEhPVVJfTUFTSzsKKwl0bS0+dG1fbWRheSA9IChkYXRlID4+IE1EQVlfU0hJRlQpICYgREFZX01BU0s7CisJdG0tPnRtX21vbiA9IChkYXRlID4+IE1PTlRIX1NISUZUKSAmIE1PTlRIX01BU0s7CisJdG0tPnRtX3llYXIgPSAoZGF0ZSA+PiBZRUFSX1NISUZUKSAmIFlFQVJfTUFTSzsKKworCWJjZDJ0bSh0bSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzcGVhcl9ydGNfc2V0X3RpbWUgLSBzZXQgdGhlIHRpbWUKKyAqIEBkZXY6IHJ0YyBkZXZpY2UgaW4gdXNlCisgKiBAdG06IGhvbGRzIGRhdGUgYW5kIHRpbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldCB0aW1lIGFuZCBkYXRlLiBPbiBzdWNjZXNzIGl0IHdpbGwgcmV0dXJuIDAKKyAqIG90aGVyd2lzZSAtdmUgZXJyb3IgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgc3BlYXJfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3Qgc3BlYXJfcnRjX2NvbmZpZyAqY29uZmlnID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHRpbWUsIGRhdGUsIGVyciA9IDA7CisKKwlpZiAodG0yYmNkKHRtKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcnRjX3dhaXRfbm90X2J1c3koY29uZmlnKTsKKwl0aW1lID0gKHRtLT50bV9zZWMgPDwgU0VDT05EX1NISUZUKSB8ICh0bS0+dG1fbWluIDw8IE1JTlVURV9TSElGVCkgfAorCQkodG0tPnRtX2hvdXIgPDwgSE9VUl9TSElGVCk7CisJZGF0ZSA9ICh0bS0+dG1fbWRheSA8PCBNREFZX1NISUZUKSB8ICh0bS0+dG1fbW9uIDw8IE1PTlRIX1NISUZUKSB8CisJCSh0bS0+dG1feWVhciA8PCBZRUFSX1NISUZUKTsKKwl3cml0ZWwodGltZSwgY29uZmlnLT5pb2FkZHIgKyBUSU1FX1JFRyk7CisJd3JpdGVsKGRhdGUsIGNvbmZpZy0+aW9hZGRyICsgREFURV9SRUcpOworCWVyciA9IGlzX3dyaXRlX2NvbXBsZXRlKGNvbmZpZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNwZWFyX3J0Y19yZWFkX2FsYXJtIC0gcmVhZCB0aGUgYWxhcm0gdGltZQorICogQGRldjogcnRjIGRldmljZSBpbiB1c2UKKyAqIEBhbG06IGhvbGRzIGFsYXJtIGRhdGUgYW5kIHRpbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWQgYWxhcm0gdGltZSBhbmQgZGF0ZS4gT24gc3VjY2VzcyBpdCB3aWxsIHJldHVybiAwCisgKiBvdGhlcndpc2UgLXZlIGVycm9yIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW50IHNwZWFyX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsbSkKK3sKKwlzdHJ1Y3Qgc3BlYXJfcnRjX2NvbmZpZyAqY29uZmlnID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHRpbWUsIGRhdGU7CisKKwlydGNfd2FpdF9ub3RfYnVzeShjb25maWcpOworCisJdGltZSA9IHJlYWRsKGNvbmZpZy0+aW9hZGRyICsgQUxBUk1fVElNRV9SRUcpOworCWRhdGUgPSByZWFkbChjb25maWctPmlvYWRkciArIEFMQVJNX0RBVEVfUkVHKTsKKwlhbG0tPnRpbWUudG1fc2VjID0gKHRpbWUgPj4gU0VDT05EX1NISUZUKSAmIFNFQ09ORF9NQVNLOworCWFsbS0+dGltZS50bV9taW4gPSAodGltZSA+PiBNSU5VVEVfU0hJRlQpICYgTUlOX01BU0s7CisJYWxtLT50aW1lLnRtX2hvdXIgPSAodGltZSA+PiBIT1VSX1NISUZUKSAmIEhPVVJfTUFTSzsKKwlhbG0tPnRpbWUudG1fbWRheSA9IChkYXRlID4+IE1EQVlfU0hJRlQpICYgREFZX01BU0s7CisJYWxtLT50aW1lLnRtX21vbiA9IChkYXRlID4+IE1PTlRIX1NISUZUKSAmIE1PTlRIX01BU0s7CisJYWxtLT50aW1lLnRtX3llYXIgPSAoZGF0ZSA+PiBZRUFSX1NISUZUKSAmIFlFQVJfTUFTSzsKKworCWJjZDJ0bSgmYWxtLT50aW1lKTsKKwlhbG0tPmVuYWJsZWQgPSByZWFkbChjb25maWctPmlvYWRkciArIENUUkxfUkVHKSAmIElOVF9FTkFCTEU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNwZWFyX3J0Y19zZXRfYWxhcm0gLSBzZXQgdGhlIGFsYXJtIHRpbWUKKyAqIEBkZXY6IHJ0YyBkZXZpY2UgaW4gdXNlCisgKiBAYWxtOiBob2xkcyBhbGFybSBkYXRlIGFuZCB0aW1lCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXQgYWxhcm0gdGltZSBhbmQgZGF0ZS4gT24gc3VjY2VzcyBpdCB3aWxsIHJldHVybiAwCisgKiBvdGhlcndpc2UgLXZlIGVycm9yIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW50IHNwZWFyX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxtKQoreworCXN0cnVjdCBzcGVhcl9ydGNfY29uZmlnICpjb25maWcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgdGltZSwgZGF0ZSwgZXJyID0gMDsKKworCWlmICh0bTJiY2QoJmFsbS0+dGltZSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0Y193YWl0X25vdF9idXN5KGNvbmZpZyk7CisKKwl0aW1lID0gKGFsbS0+dGltZS50bV9zZWMgPDwgU0VDT05EX1NISUZUKSB8IChhbG0tPnRpbWUudG1fbWluIDw8CisJCQlNSU5VVEVfU0hJRlQpIHwJKGFsbS0+dGltZS50bV9ob3VyIDw8IEhPVVJfU0hJRlQpOworCWRhdGUgPSAoYWxtLT50aW1lLnRtX21kYXkgPDwgTURBWV9TSElGVCkgfCAoYWxtLT50aW1lLnRtX21vbiA8PAorCQkJTU9OVEhfU0hJRlQpIHwgKGFsbS0+dGltZS50bV95ZWFyIDw8IFlFQVJfU0hJRlQpOworCisJd3JpdGVsKHRpbWUsIGNvbmZpZy0+aW9hZGRyICsgQUxBUk1fVElNRV9SRUcpOworCXdyaXRlbChkYXRlLCBjb25maWctPmlvYWRkciArIEFMQVJNX0RBVEVfUkVHKTsKKwllcnIgPSBpc193cml0ZV9jb21wbGV0ZShjb25maWcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGFsbS0+ZW5hYmxlZCkKKwkJc3BlYXJfcnRjX2VuYWJsZV9pbnRlcnJ1cHQoY29uZmlnKTsKKwllbHNlCisJCXNwZWFyX3J0Y19kaXNhYmxlX2ludGVycnVwdChjb25maWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BlYXJfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBzcGVhcl9ydGNfY29uZmlnICpjb25maWcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXNwZWFyX3J0Y19jbGVhcl9pbnRlcnJ1cHQoY29uZmlnKTsKKworCXN3aXRjaCAoZW5hYmxlZCkgeworCWNhc2UgMDoKKwkJLyogYWxhcm0gb2ZmICovCisJCXNwZWFyX3J0Y19kaXNhYmxlX2ludGVycnVwdChjb25maWcpOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIGFsYXJtIG9uICovCisJCXNwZWFyX3J0Y19lbmFibGVfaW50ZXJydXB0KGNvbmZpZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzcGVhcl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgPSBzcGVhcl9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IHNwZWFyX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IHNwZWFyX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBzcGVhcl9ydGNfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gc3BlYXJfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNwZWFyX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBzcGVhcl9ydGNfY29uZmlnICpjb25maWc7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IDA7CisJaW50IGlycTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicnRjIHJlZ2lvbiBhbHJlYWR5IGNsYWltZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNvbmZpZyA9IGt6YWxsb2Moc2l6ZW9mKCpjb25maWcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbmZpZykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCisJY29uZmlnLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoY29uZmlnLT5jbGspKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoY29uZmlnLT5jbGspOworCQlnb3RvIGVycl9rZnJlZTsKKwl9CisKKwlzdGF0dXMgPSBjbGtfZW5hYmxlKGNvbmZpZy0+Y2xrKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJfY2xrX3B1dDsKKworCWNvbmZpZy0+aW9hZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghY29uZmlnLT5pb2FkZHIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsXG4iKTsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGlzYWJsZV9jbG9jazsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmY29uZmlnLT5sb2NrKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjb25maWcpOworCisJY29uZmlnLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkmc3BlYXJfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIoY29uZmlnLT5ydGMpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlZ2lzdGVyIFJUQyBkZXZpY2UsIGVyciAlbGRcbiIsCisJCQkJUFRSX0VSUihjb25maWctPnJ0YykpOworCQlzdGF0dXMgPSBQVFJfRVJSKGNvbmZpZy0+cnRjKTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisKKwkvKiBhbGFybSBpcnFzICovCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyB1cGRhdGUgaXJxP1xuIik7CisJCXN0YXR1cyA9IGlycTsKKwkJZ290byBlcnJfY2xlYXJfcGxhdGRhdGE7CisJfQorCisJc3RhdHVzID0gcmVxdWVzdF9pcnEoaXJxLCBzcGVhcl9ydGNfaXJxLCAwLCBwZGV2LT5uYW1lLCBjb25maWcpOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQWxhcm0gaW50ZXJydXB0IElSUSVkIGFscmVhZHkgXAorCQkJCWNsYWltZWRcbiIsIGlycSk7CisJCWdvdG8gZXJyX2NsZWFyX3BsYXRkYXRhOworCX0KKworCWlmICghZGV2aWNlX2Nhbl93YWtldXAoJnBkZXYtPmRldikpCisJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKworCXJldHVybiAwOworCitlcnJfY2xlYXJfcGxhdGRhdGE6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGNvbmZpZy0+cnRjKTsKK2Vycl9pb3VubWFwOgorCWlvdW5tYXAoY29uZmlnLT5pb2FkZHIpOworZXJyX2Rpc2FibGVfY2xvY2s6CisJY2xrX2Rpc2FibGUoY29uZmlnLT5jbGspOworZXJyX2Nsa19wdXQ6CisJY2xrX3B1dChjb25maWctPmNsayk7CitlcnJfa2ZyZWU6CisJa2ZyZWUoY29uZmlnKTsKK2Vycl9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNwZWFyX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BlYXJfcnRjX2NvbmZpZyAqY29uZmlnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlycTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCS8qIGxlYXZlIHJ0YyBydW5uaW5nLCBidXQgZGlzYWJsZSBpcnFzICovCisJc3BlYXJfcnRjX2Rpc2FibGVfaW50ZXJydXB0KGNvbmZpZyk7CisJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDApOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSkKKwkJZnJlZV9pcnEoaXJxLCBwZGV2KTsKKwljbGtfZGlzYWJsZShjb25maWctPmNsayk7CisJY2xrX3B1dChjb25maWctPmNsayk7CisJaW91bm1hcChjb25maWctPmlvYWRkcik7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzKQorCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoY29uZmlnLT5ydGMpOworCWtmcmVlKGNvbmZpZyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHNwZWFyX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc3BlYXJfcnRjX2NvbmZpZyAqY29uZmlnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlycTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKSB7CisJCWlmICghZW5hYmxlX2lycV93YWtlKGlycSkpCisJCQljb25maWctPmlycV93YWtlID0gMTsKKwl9IGVsc2UgeworCQlzcGVhcl9ydGNfZGlzYWJsZV9pbnRlcnJ1cHQoY29uZmlnKTsKKwkJY2xrX2Rpc2FibGUoY29uZmlnLT5jbGspOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwZWFyX3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BlYXJfcnRjX2NvbmZpZyAqY29uZmlnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlycTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpIHsKKwkJaWYgKGNvbmZpZy0+aXJxX3dha2UpIHsKKwkJCWRpc2FibGVfaXJxX3dha2UoaXJxKTsKKwkJCWNvbmZpZy0+aXJxX3dha2UgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJY2xrX2VuYWJsZShjb25maWctPmNsayk7CisJCXNwZWFyX3J0Y19lbmFibGVfaW50ZXJydXB0KGNvbmZpZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHNwZWFyX3J0Y19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc3BlYXJfcnRjX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIHZvaWQgc3BlYXJfcnRjX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwZWFyX3J0Y19jb25maWcgKmNvbmZpZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3BlYXJfcnRjX2Rpc2FibGVfaW50ZXJydXB0KGNvbmZpZyk7CisJY2xrX2Rpc2FibGUoY29uZmlnLT5jbGspOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGVhcl9ydGNfZHJpdmVyID0geworCS5wcm9iZSA9IHNwZWFyX3J0Y19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc3BlYXJfcnRjX3JlbW92ZSksCisJLnN1c3BlbmQgPSBzcGVhcl9ydGNfc3VzcGVuZCwKKwkucmVzdW1lID0gc3BlYXJfcnRjX3Jlc3VtZSwKKwkuc2h1dGRvd24gPSBzcGVhcl9ydGNfc2h1dGRvd24sCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicnRjLXNwZWFyIiwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzcGVhcl9ydGNfZHJpdmVyKTsKKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtc3BlYXIiKTsKK01PRFVMRV9BVVRIT1IoIlJhamVldiBLdW1hciA8cmFqZWV2LWRsaC5rdW1hckBzdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNUIFNQRUFyIFJlYWx0aW1lIENsb2NrIERyaXZlciAoUlRDKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXN0YXJmaXJlLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtc3RhcmZpcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmU5OGJmCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXN0YXJmaXJlLmMKQEAgLTAsMCArMSw4MCBAQAorLyogcnRjLXN0YXJmaXJlLmM6IFN0YXJmaXJlIHBsYXRmb3JtIFJUQyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3RhcmZpcmUgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdTMyIHN0YXJmaXJlX2dldF90aW1lKHZvaWQpCit7CisJc3RhdGljIGNoYXIgb2JwX2dldHRvZFszMl07CisJc3RhdGljIHUzMiB1bml4X3RvZDsKKworCXNwcmludGYob2JwX2dldHRvZCwgImgjICUwOHggdW5peC1nZXR0b2QiLAorCQkodW5zaWduZWQgaW50KSAobG9uZykgJnVuaXhfdG9kKTsKKwlwcm9tX2ZldmFsKG9icF9nZXR0b2QpOworCisJcmV0dXJuIHVuaXhfdG9kOworfQorCitzdGF0aWMgaW50IHN0YXJmaXJlX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcnRjX3RpbWVfdG9fdG0oc3RhcmZpcmVfZ2V0X3RpbWUoKSwgdG0pOworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgc3RhcmZpcmVfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gc3RhcmZpcmVfcmVhZF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3RhcmZpcmVfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInN0YXJmaXJlIiwgJnBkZXYtPmRldiwKKwkJCQkgICAgICZzdGFyZmlyZV9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBzdGFyZmlyZV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3RhcmZpcmVfcnRjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLXN0YXJmaXJlIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHN0YXJmaXJlX3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3RhcmZpcmVfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzdGFyZmlyZV9ydGNfZHJpdmVyLCBzdGFyZmlyZV9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3RhcmZpcmVfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3RhcmZpcmVfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHN0YXJmaXJlX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHN0YXJmaXJlX3J0Y19leGl0KTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5ZjVjZgotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQSBSVEMgZHJpdmVyIGZvciB0aGUgU2ltdGVrIFNUSzE3VEE4CisgKgorICogQnkgVGhvbWFzIEhvbW1lbCA8dGhvbWFzLmhvbW1lbEBnZS5jb20+CisgKgorICogQmFzZWQgb24gdGhlIERTMTU1MyBkcml2ZXIgZnJvbQorICogQXRzdXNoaSBOZW1vdG8gPGFuZW1vQG1iYS5vY24ubmUuanA+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMSIKKworI2RlZmluZSBSVENfUkVHX1NJWkUJCTB4MjAwMDAKKyNkZWZpbmUgUlRDX09GRlNFVAkJMHgxZmZmMAorCisjZGVmaW5lIFJUQ19GTEFHUwkJKFJUQ19PRkZTRVQgKyAwKQorI2RlZmluZSBSVENfQ0VOVFVSWQkJKFJUQ19PRkZTRVQgKyAxKQorI2RlZmluZSBSVENfU0VDT05EU19BTEFSTQkoUlRDX09GRlNFVCArIDIpCisjZGVmaW5lIFJUQ19NSU5VVEVTX0FMQVJNCShSVENfT0ZGU0VUICsgMykKKyNkZWZpbmUgUlRDX0hPVVJTX0FMQVJNCQkoUlRDX09GRlNFVCArIDQpCisjZGVmaW5lIFJUQ19EQVRFX0FMQVJNCQkoUlRDX09GRlNFVCArIDUpCisjZGVmaW5lIFJUQ19JTlRFUlJVUFRTCQkoUlRDX09GRlNFVCArIDYpCisjZGVmaW5lIFJUQ19XQVRDSERPRwkJKFJUQ19PRkZTRVQgKyA3KQorI2RlZmluZSBSVENfQ0FMSUJSQVRJT04JCShSVENfT0ZGU0VUICsgOCkKKyNkZWZpbmUgUlRDX1NFQ09ORFMJCShSVENfT0ZGU0VUICsgOSkKKyNkZWZpbmUgUlRDX01JTlVURVMJCShSVENfT0ZGU0VUICsgMTApCisjZGVmaW5lIFJUQ19IT1VSUwkJKFJUQ19PRkZTRVQgKyAxMSkKKyNkZWZpbmUgUlRDX0RBWQkJCShSVENfT0ZGU0VUICsgMTIpCisjZGVmaW5lIFJUQ19EQVRFCQkoUlRDX09GRlNFVCArIDEzKQorI2RlZmluZSBSVENfTU9OVEgJCShSVENfT0ZGU0VUICsgMTQpCisjZGVmaW5lIFJUQ19ZRUFSCQkoUlRDX09GRlNFVCArIDE1KQorCisjZGVmaW5lIFJUQ19TRUNPTkRTX01BU0sJMHg3ZgorI2RlZmluZSBSVENfREFZX01BU0sJCTB4MDcKKyNkZWZpbmUgUlRDX0NBTF9NQVNLCQkweDNmCisKKy8qIEJpdHMgaW4gdGhlIENhbGlicmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19TVE9QCQkweDgwCisKKy8qIEJpdHMgaW4gdGhlIEZsYWdzIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19GTEFHU19BRgkJMHg0MAorI2RlZmluZSBSVENfRkxBR1NfUEYJCTB4MjAKKyNkZWZpbmUgUlRDX1dSSVRFCQkweDAyCisjZGVmaW5lIFJUQ19SRUFECQkweDAxCisKKy8qIEJpdHMgaW4gdGhlIEludGVycnVwdHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX0lOVFNfQUlFCQkweDQwCisKK3N0cnVjdCBydGNfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCWludCBpcnE7CisJdW5zaWduZWQgaW50IGlycWVuOworCWludCBhbHJtX3NlYzsKKwlpbnQgYWxybV9taW47CisJaW50IGFscm1faG91cjsKKwlpbnQgYWxybV9tZGF5OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBpbnQgc3RrMTd0YThfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXU4IGZsYWdzOworCisJZmxhZ3MgPSByZWFkYihwZGF0YS0+aW9hZGRyICsgUlRDX0ZMQUdTKTsKKwl3cml0ZWIoZmxhZ3MgfCBSVENfV1JJVEUsIHBkYXRhLT5pb2FkZHIgKyBSVENfRkxBR1MpOworCisJd3JpdGViKGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApLCBpb2FkZHIgKyBSVENfWUVBUik7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX21vbiArIDEpLCBpb2FkZHIgKyBSVENfTU9OVEgpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV93ZGF5KSAmIFJUQ19EQVlfTUFTSywgaW9hZGRyICsgUlRDX0RBWSk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX21kYXkpLCBpb2FkZHIgKyBSVENfREFURSk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX2hvdXIpLCBpb2FkZHIgKyBSVENfSE9VUlMpOworCXdyaXRlYihiaW4yYmNkKHRtLT50bV9taW4pLCBpb2FkZHIgKyBSVENfTUlOVVRFUyk7CisJd3JpdGViKGJpbjJiY2QodG0tPnRtX3NlYykgJiBSVENfU0VDT05EU19NQVNLLCBpb2FkZHIgKyBSVENfU0VDT05EUyk7CisJd3JpdGViKGJpbjJiY2QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApLCBpb2FkZHIgKyBSVENfQ0VOVFVSWSk7CisKKwl3cml0ZWIoZmxhZ3MgJiB+UlRDX1dSSVRFLCBwZGF0YS0+aW9hZGRyICsgUlRDX0ZMQUdTKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGsxN3RhOF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgd2VlazsKKwl1bnNpZ25lZCBpbnQgY2VudHVyeTsKKwl1OCBmbGFnczsKKworCS8qIGdpdmUgZW5vdWdoIHRpbWUgdG8gdXBkYXRlIFJUQyBpbiBjYXNlIG9mIGNvbnRpbnVvdXMgcmVhZCAqLworCWlmIChwZGF0YS0+bGFzdF9qaWZmaWVzID09IGppZmZpZXMpCisJCW1zbGVlcCgxKTsKKwlwZGF0YS0+bGFzdF9qaWZmaWVzID0gamlmZmllczsKKworCWZsYWdzID0gcmVhZGIocGRhdGEtPmlvYWRkciArIFJUQ19GTEFHUyk7CisJd3JpdGViKGZsYWdzIHwgUlRDX1JFQUQsIGlvYWRkciArIFJUQ19GTEFHUyk7CisJc2Vjb25kID0gcmVhZGIoaW9hZGRyICsgUlRDX1NFQ09ORFMpICYgUlRDX1NFQ09ORFNfTUFTSzsKKwltaW51dGUgPSByZWFkYihpb2FkZHIgKyBSVENfTUlOVVRFUyk7CisJaG91ciA9IHJlYWRiKGlvYWRkciArIFJUQ19IT1VSUyk7CisJZGF5ID0gcmVhZGIoaW9hZGRyICsgUlRDX0RBVEUpOworCXdlZWsgPSByZWFkYihpb2FkZHIgKyBSVENfREFZKSAmIFJUQ19EQVlfTUFTSzsKKwltb250aCA9IHJlYWRiKGlvYWRkciArIFJUQ19NT05USCk7CisJeWVhciA9IHJlYWRiKGlvYWRkciArIFJUQ19ZRUFSKTsKKwljZW50dXJ5ID0gcmVhZGIoaW9hZGRyICsgUlRDX0NFTlRVUlkpOworCXdyaXRlYihmbGFncyAmIH5SVENfUkVBRCwgaW9hZGRyICsgUlRDX0ZMQUdTKTsKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihzZWNvbmQpOworCXRtLT50bV9taW4gPSBiY2QyYmluKG1pbnV0ZSk7CisJdG0tPnRtX2hvdXIgPSBiY2QyYmluKGhvdXIpOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihkYXkpOworCXRtLT50bV93ZGF5ID0gYmNkMmJpbih3ZWVrKTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihtb250aCkgLSAxOworCS8qIHllYXIgaXMgMTkwMCArIHRtLT50bV95ZWFyICovCisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHllYXIpICsgYmNkMmJpbihjZW50dXJ5KSAqIDEwMCAtIDE5MDA7CisKKwlpZiAocnRjX3ZhbGlkX3RtKHRtKSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJyZXRyaWV2ZWQgZGF0ZS90aW1lIGlzIG5vdCB2YWxpZC5cbiIpOworCQlydGNfdGltZV90b190bSgwLCB0bSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdGsxN3RhOF9ydGNfdXBkYXRlX2FsYXJtKHN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwl1OCBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+bG9jaywgaXJxZmxhZ3MpOworCisJZmxhZ3MgPSByZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpOworCXdyaXRlYihmbGFncyB8IFJUQ19XUklURSwgaW9hZGRyICsgUlRDX0ZMQUdTKTsKKworCXdyaXRlYihwZGF0YS0+YWxybV9tZGF5IDwgMCB8fCAocGRhdGEtPmlycWVuICYgUlRDX1VGKSA/CisJICAgICAgIDB4ODAgOiBiaW4yYmNkKHBkYXRhLT5hbHJtX21kYXkpLAorCSAgICAgICBpb2FkZHIgKyBSVENfREFURV9BTEFSTSk7CisJd3JpdGViKHBkYXRhLT5hbHJtX2hvdXIgPCAwIHx8IChwZGF0YS0+aXJxZW4gJiBSVENfVUYpID8KKwkgICAgICAgMHg4MCA6IGJpbjJiY2QocGRhdGEtPmFscm1faG91ciksCisJICAgICAgIGlvYWRkciArIFJUQ19IT1VSU19BTEFSTSk7CisJd3JpdGViKHBkYXRhLT5hbHJtX21pbiA8IDAgfHwgKHBkYXRhLT5pcnFlbiAmIFJUQ19VRikgPworCSAgICAgICAweDgwIDogYmluMmJjZChwZGF0YS0+YWxybV9taW4pLAorCSAgICAgICBpb2FkZHIgKyBSVENfTUlOVVRFU19BTEFSTSk7CisJd3JpdGViKHBkYXRhLT5hbHJtX3NlYyA8IDAgfHwgKHBkYXRhLT5pcnFlbiAmIFJUQ19VRikgPworCSAgICAgICAweDgwIDogYmluMmJjZChwZGF0YS0+YWxybV9zZWMpLAorCSAgICAgICBpb2FkZHIgKyBSVENfU0VDT05EU19BTEFSTSk7CisJd3JpdGViKHBkYXRhLT5pcnFlbiA/IFJUQ19JTlRTX0FJRSA6IDAsIGlvYWRkciArIFJUQ19JTlRFUlJVUFRTKTsKKwlyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpOwkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJd3JpdGViKGZsYWdzICYgflJUQ19XUklURSwgaW9hZGRyICsgUlRDX0ZMQUdTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGF0YS0+bG9jaywgaXJxZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHN0azE3dGE4X3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocGRhdGEtPmlycSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwZGF0YS0+YWxybV9tZGF5ID0gYWxybS0+dGltZS50bV9tZGF5OworCXBkYXRhLT5hbHJtX2hvdXIgPSBhbHJtLT50aW1lLnRtX2hvdXI7CisJcGRhdGEtPmFscm1fbWluID0gYWxybS0+dGltZS50bV9taW47CisJcGRhdGEtPmFscm1fc2VjID0gYWxybS0+dGltZS50bV9zZWM7CisJaWYgKGFscm0tPmVuYWJsZWQpCisJCXBkYXRhLT5pcnFlbiB8PSBSVENfQUY7CisJc3RrMTd0YThfcnRjX3VwZGF0ZV9hbGFybShwZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RrMTd0YThfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocGRhdGEtPmlycSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhbHJtLT50aW1lLnRtX21kYXkgPSBwZGF0YS0+YWxybV9tZGF5IDwgMCA/IDAgOiBwZGF0YS0+YWxybV9tZGF5OworCWFscm0tPnRpbWUudG1faG91ciA9IHBkYXRhLT5hbHJtX2hvdXIgPCAwID8gMCA6IHBkYXRhLT5hbHJtX2hvdXI7CisJYWxybS0+dGltZS50bV9taW4gPSBwZGF0YS0+YWxybV9taW4gPCAwID8gMCA6IHBkYXRhLT5hbHJtX21pbjsKKwlhbHJtLT50aW1lLnRtX3NlYyA9IHBkYXRhLT5hbHJtX3NlYyA8IDAgPyAwIDogcGRhdGEtPmFscm1fc2VjOworCWFscm0tPmVuYWJsZWQgPSAocGRhdGEtPmlycWVuICYgUlRDX0FGKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3RrMTd0YThfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCisJc3Bpbl9sb2NrKCZwZGF0YS0+bG9jayk7CisJLyogcmVhZCBhbmQgY2xlYXIgaW50ZXJydXB0ICovCisJaWYgKHJlYWRiKGlvYWRkciArIFJUQ19GTEFHUykgJiBSVENfRkxBR1NfQUYpIHsKKwkJZXZlbnRzID0gUlRDX0lSUUY7CisJCWlmIChyZWFkYihpb2FkZHIgKyBSVENfU0VDT05EU19BTEFSTSkgJiAweDgwKQorCQkJZXZlbnRzIHw9IFJUQ19VRjsKKwkJZWxzZQorCQkJZXZlbnRzIHw9IFJUQ19BRjsKKwkJaWYgKGxpa2VseShwZGF0YS0+cnRjKSkKKwkJCXJ0Y191cGRhdGVfaXJxKHBkYXRhLT5ydGMsIDEsIGV2ZW50cyk7CisJfQorCXNwaW5fdW5sb2NrKCZwZGF0YS0+bG9jayk7CisJcmV0dXJuIGV2ZW50cyA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgc3RrMTd0YThfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCXVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChwZGF0YS0+aXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlbmFibGVkKQorCQlwZGF0YS0+aXJxZW4gfD0gUlRDX0FGOworCWVsc2UKKwkJcGRhdGEtPmlycWVuICY9IH5SVENfQUY7CisJc3RrMTd0YThfcnRjX3VwZGF0ZV9hbGFybShwZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzdGsxN3RhOF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJCT0gc3RrMTd0YThfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJCT0gc3RrMTd0YThfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCQk9IHN0azE3dGE4X3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JCT0gc3RrMTd0YThfcnRjX3NldF9hbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZQk9IHN0azE3dGE4X3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIHNzaXplX3Qgc3RrMTd0YThfbnZyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCQkJIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXNzaXplX3QgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgUlRDX09GRlNFVDsgY291bnQrKywgc2l6ZS0tKQorCQkqYnVmKysgPSByZWFkYihpb2FkZHIgKyBwb3MrKyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzdGsxN3RhOF9udnJhbV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQkJCSAgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJc3NpemVfdCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBSVENfT0ZGU0VUOyBjb3VudCsrLCBzaXplLS0pCisJCXdyaXRlYigqYnVmKyssIGlvYWRkciArIHBvcysrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBzdGsxN3RhOF9udnJhbV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJudnJhbSIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IFJUQ19PRkZTRVQsCisJLnJlYWQgPSBzdGsxN3RhOF9udnJhbV9yZWFkLAorCS53cml0ZSA9IHN0azE3dGE4X252cmFtX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc3RrMTd0YThfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgaW50IGNhbDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCByZXQgPSAwOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCBSVENfUkVHX1NJWkUsCisJCQlwZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpb2FkZHIgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgUlRDX1JFR19TSVpFKTsKKwlpZiAoIWlvYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisJcGRhdGEtPmlvYWRkciA9IGlvYWRkcjsKKwlwZGF0YS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCS8qIHR1cm4gUlRDIG9uIGlmIGl0IHdhcyBub3Qgb24gKi8KKwljYWwgPSByZWFkYihpb2FkZHIgKyBSVENfQ0FMSUJSQVRJT04pOworCWlmIChjYWwgJiBSVENfU1RPUCkgeworCQljYWwgJj0gUlRDX0NBTF9NQVNLOworCQlmbGFncyA9IHJlYWRiKGlvYWRkciArIFJUQ19GTEFHUyk7CisJCXdyaXRlYihmbGFncyB8IFJUQ19XUklURSwgaW9hZGRyICsgUlRDX0ZMQUdTKTsKKwkJd3JpdGViKGNhbCwgaW9hZGRyICsgUlRDX0NBTElCUkFUSU9OKTsKKwkJd3JpdGViKGZsYWdzICYgflJUQ19XUklURSwgaW9hZGRyICsgUlRDX0ZMQUdTKTsKKwl9CisJaWYgKHJlYWRiKGlvYWRkciArIFJUQ19GTEFHUykgJiBSVENfRkxBR1NfUEYpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJ2b2x0YWdlLWxvdyBkZXRlY3RlZC5cbiIpOworCisJc3Bpbl9sb2NrX2luaXQoJnBkYXRhLT5sb2NrKTsKKwlwZGF0YS0+bGFzdF9qaWZmaWVzID0gamlmZmllczsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CisJCXdyaXRlYigwLCBpb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CisJCWlmIChkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHBkYXRhLT5pcnEsCisJCQkJc3RrMTd0YThfcnRjX2ludGVycnVwdCwKKwkJCQlJUlFGX1NIQVJFRCwKKwkJCQlwZGV2LT5uYW1lLCBwZGV2KSA8IDApIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbm90IGF2YWlsYWJsZS5cbiIpOworCQkJcGRhdGEtPmlycSA9IDA7CisJCX0KKwl9CisKKwlwZGF0YS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJCSAgJnN0azE3dGE4X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5ydGMpKQorCQlyZXR1cm4gUFRSX0VSUihwZGF0YS0+cnRjKTsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZzdGsxN3RhOF9udnJhbV9hdHRyKTsKKwlpZiAocmV0KQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc3RrMTd0YThfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnN0azE3dGE4X252cmFtX2F0dHIpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKKwlpZiAocGRhdGEtPmlycSA+IDApCisJCXdyaXRlYigwLCBwZGF0YS0+aW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOworCXJldHVybiAwOworfQorCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06c3RrMTd0YTgiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3RrMTd0YThfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc3RrMTd0YThfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3RrMTd0YThfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInN0azE3dGE4IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3RrMTd0YThfcnRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBIb21tZWwgPHRob21hcy5ob21tZWxAZ2UuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaW10ZWsgU1RLMTdUQTggUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXN0bXAzeHh4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtc3RtcDN4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDI4Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXN0bXAzeHh4LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBGcmVlc2NhbGUgU1RNUDM3WFgvU1RNUDM3OFggUmVhbCBUaW1lIENsb2NrIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBTaWdtYXRlbCwgSW5jLgorICogUGV0ZXIgSGFydGxleSwgPHBldGVyLmhhcnRsZXlAc2lnbWF0ZWwuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOCBFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMsIEluYyBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTEgV29sZnJhbSBTYW5nLCBQZW5ndXRyb25peCBlLksuCisgKi8KKworLyoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19DVFJMCQkJMHgwCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19DVFJMX1NFVAkJCTB4NAorI2RlZmluZSBTVE1QM1hYWF9SVENfQ1RSTF9DTFIJCQkweDgKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX0NUUkxfQUxBUk1fSVJRX0VOCQkweDAwMDAwMDAxCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19DVFJMX09ORU1TRUNfSVJRX0VOCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX0NUUkxfQUxBUk1fSVJRCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX1NUQVQJCQkweDEwCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19TVEFUX1NUQUxFX1NISUZUCQkxNgorI2RlZmluZSBTVE1QM1hYWF9SVENfU1RBVF9SVENfUFJFU0VOVAkJMHg4MDAwMDAwMAorCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19TRUNPTkRTCQkJMHgzMAorCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19BTEFSTQkJCTB4NDAKKworI2RlZmluZSBTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDAJCTB4NjAKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX1NFVAkJMHg2NAorI2RlZmluZSBTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQ0xSCQkweDY4CisjZGVmaW5lIFNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9XQUtFX0VOCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX0VOCTB4MDAwMDAwMDQKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX1dBS0UJMHgwMDAwMDA4MAorCitzdHJ1Y3Qgc3RtcDN4eHhfcnRjX2RhdGEgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICppbzsKKwlpbnQgaXJxX2FsYXJtOworfTsKKworc3RhdGljIHZvaWQgc3RtcDN4eHhfd2FpdF90aW1lKHN0cnVjdCBzdG1wM3h4eF9ydGNfZGF0YSAqcnRjX2RhdGEpCit7CisJLyoKKwkgKiBUaGUgZGF0YXNoZWV0IGRvZXNuJ3Qgc2F5IHdoaWNoIHdheSByb3VuZCB0aGUKKwkgKiBORVdfUkVHUy9TVEFMRV9SRUdTIGJpdGZpZWxkcyBnby4gSW4gZmFjdCBpdCdzIDB4MT1QMCwKKwkgKiAweDI9UDEsIC4uLCAweDIwPVA1LCAweDQwPUFMQVJNLCAweDgwPVNFQ09ORFMKKwkgKi8KKwl3aGlsZSAocmVhZGwocnRjX2RhdGEtPmlvICsgU1RNUDNYWFhfUlRDX1NUQVQpICYKKwkJCSgweDgwIDw8IFNUTVAzWFhYX1JUQ19TVEFUX1NUQUxFX1NISUZUKSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKKy8qIFRpbWUgcmVhZC93cml0ZSAqLworc3RhdGljIGludCBzdG1wM3h4eF9ydGNfZ2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQoreworCXN0cnVjdCBzdG1wM3h4eF9ydGNfZGF0YSAqcnRjX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXN0bXAzeHh4X3dhaXRfdGltZShydGNfZGF0YSk7CisJcnRjX3RpbWVfdG9fdG0ocmVhZGwocnRjX2RhdGEtPmlvICsgU1RNUDNYWFhfUlRDX1NFQ09ORFMpLCBydGNfdG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0bXAzeHh4X3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgdCkKK3sKKwlzdHJ1Y3Qgc3RtcDN4eHhfcnRjX2RhdGEgKnJ0Y19kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwl3cml0ZWwodCwgcnRjX2RhdGEtPmlvICsgU1RNUDNYWFhfUlRDX1NFQ09ORFMpOworCXN0bXAzeHh4X3dhaXRfdGltZShydGNfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGludGVycnVwdChzKSBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3RtcDN4eHhfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHN0bXAzeHh4X3J0Y19kYXRhICpydGNfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXZfaWQpOworCXUzMiBzdGF0dXMgPSByZWFkbChydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQ1RSTCk7CisKKwlpZiAoc3RhdHVzICYgU1RNUDNYWFhfUlRDX0NUUkxfQUxBUk1fSVJRKSB7CisJCXdyaXRlbChTVE1QM1hYWF9SVENfQ1RSTF9BTEFSTV9JUlEsCisJCQkJcnRjX2RhdGEtPmlvICsgU1RNUDNYWFhfUlRDX0NUUkxfQ0xSKTsKKwkJcnRjX3VwZGF0ZV9pcnEocnRjX2RhdGEtPnJ0YywgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaW50IHN0bXAzeHh4X2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3Qgc3RtcDN4eHhfcnRjX2RhdGEgKnJ0Y19kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZW5hYmxlZCkgeworCQl3cml0ZWwoU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX0VOIHwKKwkJCQlTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRV9FTiwKKwkJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfU0VUKTsKKwkJd3JpdGVsKFNUTVAzWFhYX1JUQ19DVFJMX0FMQVJNX0lSUV9FTiwKKwkJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQ1RSTF9TRVQpOworCX0gZWxzZSB7CisJCXdyaXRlbChTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fRU4gfAorCQkJCVNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9XQUtFX0VOLAorCQkJCXJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9DTFIpOworCQl3cml0ZWwoU1RNUDNYWFhfUlRDX0NUUkxfQUxBUk1fSVJRX0VOLAorCQkJCXJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19DVFJMX0NMUik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0bXAzeHh4X3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsbSkKK3sKKwlzdHJ1Y3Qgc3RtcDN4eHhfcnRjX2RhdGEgKnJ0Y19kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlydGNfdGltZV90b190bShyZWFkbChydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQUxBUk0pLCAmYWxtLT50aW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG1wM3h4eF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsbSkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisJc3RydWN0IHN0bXAzeHh4X3J0Y19kYXRhICpydGNfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3RtX3RvX3RpbWUoJmFsbS0+dGltZSwgJnQpOworCXdyaXRlbCh0LCBydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQUxBUk0pOworCisJc3RtcDN4eHhfYWxhcm1faXJxX2VuYWJsZShkZXYsIGFsbS0+ZW5hYmxlZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHN0bXAzeHh4X3J0Y19vcHMgPSB7CisJLmFsYXJtX2lycV9lbmFibGUgPQorCQkJICBzdG1wM3h4eF9hbGFybV9pcnFfZW5hYmxlLAorCS5yZWFkX3RpbWUJPSBzdG1wM3h4eF9ydGNfZ2V0dGltZSwKKwkuc2V0X21tc3MJPSBzdG1wM3h4eF9ydGNfc2V0X21tc3MsCisJLnJlYWRfYWxhcm0JPSBzdG1wM3h4eF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gc3RtcDN4eHhfcnRjX3NldF9hbGFybSwKK307CisKK3N0YXRpYyBpbnQgc3RtcDN4eHhfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzdG1wM3h4eF9ydGNfZGF0YSAqcnRjX2RhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghcnRjX2RhdGEpCisJCXJldHVybiAwOworCisJd3JpdGVsKFNUTVAzWFhYX1JUQ19DVFJMX0FMQVJNX0lSUV9FTiwKKwkJCXJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19DVFJMX0NMUik7CisJZnJlZV9pcnEocnRjX2RhdGEtPmlycV9hbGFybSwgJnBkZXYtPmRldik7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Y19kYXRhLT5ydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlvdW5tYXAocnRjX2RhdGEtPmlvKTsKKwlrZnJlZShydGNfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG1wM3h4eF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3RtcDN4eHhfcnRjX2RhdGEgKnJ0Y19kYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgZXJyOworCisJcnRjX2RhdGEgPSBremFsbG9jKHNpemVvZiAqcnRjX2RhdGEsIEdGUF9LRVJORUwpOworCWlmICghcnRjX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgcmVzb3VyY2VcbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcnRjX2RhdGEtPmlvID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CisJaWYgKCFydGNfZGF0YS0+aW8pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsZWRcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXJ0Y19kYXRhLT5pcnFfYWxhcm0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJaWYgKCEocmVhZGwoU1RNUDNYWFhfUlRDX1NUQVQgKyBydGNfZGF0YS0+aW8pICYKKwkJCVNUTVAzWFhYX1JUQ19TVEFUX1JUQ19QUkVTRU5UKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBkZXZpY2Ugb25ib2FyZFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3JlbWFwOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Y19kYXRhKTsKKworCW14c19yZXNldF9ibG9jayhydGNfZGF0YS0+aW8pOworCXdyaXRlbChTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fRU4gfAorCQkJU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX1dBS0VfRU4gfAorCQkJU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX1dBS0UsCisJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQ0xSKTsKKworCXdyaXRlbChTVE1QM1hYWF9SVENfQ1RSTF9PTkVNU0VDX0lSUV9FTiB8CisJCQlTVE1QM1hYWF9SVENfQ1RSTF9BTEFSTV9JUlFfRU4sCisJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQ1RSTF9DTFIpOworCisJcnRjX2RhdGEtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkmc3RtcDN4eHhfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjX2RhdGEtPnJ0YykpIHsKKwkJZXJyID0gUFRSX0VSUihydGNfZGF0YS0+cnRjKTsKKwkJZ290byBvdXRfcmVtYXA7CisJfQorCisJZXJyID0gcmVxdWVzdF9pcnEocnRjX2RhdGEtPmlycV9hbGFybSwgc3RtcDN4eHhfcnRjX2ludGVycnVwdCwgMCwKKwkJCSJSVEMgYWxhcm0iLCAmcGRldi0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBjbGFpbSBJUlElZFxuIiwKKwkJCXJ0Y19kYXRhLT5pcnFfYWxhcm0pOworCQlnb3RvIG91dF9pcnFfYWxhcm07CisJfQorCisJcmV0dXJuIDA7CisKK291dF9pcnFfYWxhcm06CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Y19kYXRhLT5ydGMpOworb3V0X3JlbWFwOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlvdW5tYXAocnRjX2RhdGEtPmlvKTsKK291dF9mcmVlOgorCWtmcmVlKHJ0Y19kYXRhKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHN0bXAzeHh4X3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0bXAzeHh4X3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdG1wM3h4eF9ydGNfZGF0YSAqcnRjX2RhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJbXhzX3Jlc2V0X2Jsb2NrKHJ0Y19kYXRhLT5pbyk7CisJd3JpdGVsKFNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9FTiB8CisJCQlTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRV9FTiB8CisJCQlTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRSwKKwkJCXJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9DTFIpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgc3RtcDN4eHhfcnRjX3N1c3BlbmQJTlVMTAorI2RlZmluZSBzdG1wM3h4eF9ydGNfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdG1wM3h4eF9ydGNkcnYgPSB7CisJLnByb2JlCQk9IHN0bXAzeHh4X3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IHN0bXAzeHh4X3J0Y19yZW1vdmUsCisJLnN1c3BlbmQJPSBzdG1wM3h4eF9ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHN0bXAzeHh4X3J0Y19yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInN0bXAzeHh4LXJ0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN0bXAzeHh4X3J0Y2Rydik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU1RNUDN4eHggUlRDIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiZG1pdHJ5IHBlcnZ1c2hpbiA8ZHBlcnZ1c2hpbkBlbWJlZGRlZGFsbGV5LmNvbT4gYW5kICIKKwkJIldvbGZyYW0gU2FuZyA8dy5zYW5nQHBlbmd1dHJvbml4LmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXN1bjR2LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtc3VuNHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjIyNjEwCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXN1bjR2LmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIHJ0Yy1zdW40di5jOiBIeXBlcnZpc29yIGJhc2VkIFJUQyBmb3IgU1VONFYgc3lzdGVtcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGh5cGVydmlzb3JfZ2V0X3RpbWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldCwgdGltZTsKKwlpbnQgcmV0cmllcyA9IDEwMDAwOworCityZXRyeToKKwlyZXQgPSBzdW40dl90b2RfZ2V0KCZ0aW1lKTsKKwlpZiAocmV0ID09IEhWX0VPSykKKwkJcmV0dXJuIHRpbWU7CisJaWYgKHJldCA9PSBIVl9FV09VTERCTE9DSykgeworCQlpZiAoLS1yZXRyaWVzID4gMCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNVTjRWOiB0b2RfZ2V0KCkgdGltZWQgb3V0LlxuIik7CisJCXJldHVybiAwOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICJTVU40VjogdG9kX2dldCgpIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW40dl9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJ0Y190aW1lX3RvX3RtKGh5cGVydmlzb3JfZ2V0X3RpbWUoKSwgdG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh5cGVydmlzb3Jfc2V0X3RpbWUodW5zaWduZWQgbG9uZyBzZWNzKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCWludCByZXRyaWVzID0gMTAwMDA7CisKK3JldHJ5OgorCXJldCA9IHN1bjR2X3RvZF9zZXQoc2Vjcyk7CisJaWYgKHJldCA9PSBIVl9FT0spCisJCXJldHVybiAwOworCWlmIChyZXQgPT0gSFZfRVdPVUxEQkxPQ0spIHsKKwkJaWYgKC0tcmV0cmllcyA+IDApIHsKKwkJCXVkZWxheSgxMDApOworCQkJZ290byByZXRyeTsKKwkJfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVU40VjogdG9kX3NldCgpIHRpbWVkIG91dC5cbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiU1VONFY6IHRvZF9zZXQoKSBub3Qgc3VwcG9ydGVkLlxuIik7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50IHN1bjR2X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIHNlY3M7CisJaW50IGVycjsKKworCWVyciA9IHJ0Y190bV90b190aW1lKHRtLCAmc2Vjcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBoeXBlcnZpc29yX3NldF90aW1lKHNlY3MpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgc3VuNHZfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gc3VuNHZfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHN1bjR2X3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3VuNHZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInN1bjR2IiwgJnBkZXYtPmRldiwKKwkJCQkgICAgICZzdW40dl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2V4aXQgc3VuNHZfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW40dl9ydGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtc3VuNHYiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJCT0gX19leGl0X3Aoc3VuNHZfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdW40dl9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnN1bjR2X3J0Y19kcml2ZXIsIHN1bjR2X3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdW40dl9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzdW40dl9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc3VuNHZfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoc3VuNHZfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNVTjRWIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1zeXNmcy5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXN5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwMDgzYwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy1zeXNmcy5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogUlRDIHN1YnN5c3RlbSwgc3lzZnMgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRvd2VyIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAicnRjLWNvcmUuaCIKKworCisvKiBkZXZpY2UgYXR0cmlidXRlcyAqLworCisvKgorICogTk9URTogIFJUQyB0aW1lcyBkaXNwbGF5ZWQgaW4gc3lzZnMgdXNlIHRoZSBSVEMncyB0aW1lem9uZS4gIFRoYXQncworICogaWRlYWxseSBVVEMuICBIb3dldmVyLCBQQ3MgdGhhdCBhbHNvIGJvb3QgdG8gTVMtV2luZG93cyBub3JtYWxseSB1c2UKKyAqIHRoZSBsb2NhbCB0aW1lIGFuZCBjaGFuZ2UgdG8gbWF0Y2ggZGF5bGlnaHQgc2F2aW5ncyB0aW1lLiAgVGhhdCBhZmZlY3RzCisgKiBhdHRyaWJ1dGVzIGluY2x1ZGluZyBkYXRlLCB0aW1lLCBzaW5jZV9lcG9jaCwgYW5kIHdha2VhbGFybS4KKyAqLworCitzdGF0aWMgc3NpemVfdAorcnRjX3N5c2ZzX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHRvX3J0Y19kZXZpY2UoZGV2KS0+bmFtZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitydGNfc3lzZnNfc2hvd19kYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IHJldHZhbDsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlyZXR2YWwgPSBydGNfcmVhZF90aW1lKHRvX3J0Y19kZXZpY2UoZGV2KSwgJnRtKTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJcmV0dmFsID0gc3ByaW50ZihidWYsICIlMDRkLSUwMmQtJTAyZFxuIiwKKwkJCXRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24gKyAxLCB0bS50bV9tZGF5KTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdAorcnRjX3N5c2ZzX3Nob3dfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3NpemVfdCByZXR2YWw7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCisJcmV0dmFsID0gcnRjX3JlYWRfdGltZSh0b19ydGNfZGV2aWNlKGRldiksICZ0bSk7CisJaWYgKHJldHZhbCA9PSAwKSB7CisJCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJTAyZDolMDJkOiUwMmRcbiIsCisJCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHNzaXplX3QKK3J0Y19zeXNmc19zaG93X3NpbmNlX2Vwb2NoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IHJldHZhbDsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlyZXR2YWwgPSBydGNfcmVhZF90aW1lKHRvX3J0Y19kZXZpY2UoZGV2KSwgJnRtKTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyB0aW1lOworCQlydGNfdG1fdG9fdGltZSgmdG0sICZ0aW1lKTsKKwkJcmV0dmFsID0gc3ByaW50ZihidWYsICIlbHVcbiIsIHRpbWUpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitydGNfc3lzZnNfc2hvd19tYXhfdXNlcl9mcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG9fcnRjX2RldmljZShkZXYpLT5tYXhfdXNlcl9mcmVxKTsKK30KKworc3RhdGljIHNzaXplX3QKK3J0Y19zeXNmc19zZXRfbWF4X3VzZXJfZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBuKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSB0b19ydGNfZGV2aWNlKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJaWYgKHZhbCA+PSA0MDk2IHx8IHZhbCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0Yy0+bWF4X3VzZXJfZnJlcSA9IChpbnQpdmFsOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzc2l6ZV90CitydGNfc3lzZnNfc2hvd19oY3Rvc3lzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKyNpZmRlZiBDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFCisJaWYgKHJ0Y19oY3Rvc3lzX3JldCA9PSAwICYmCisJCQlzdHJjbXAoZGV2X25hbWUoJnRvX3J0Y19kZXZpY2UoZGV2KS0+ZGV2KSwKKwkJCQlDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKSA9PSAwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKKwllbHNlCisjZW5kaWYKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBydGNfYXR0cnNbXSA9IHsKKwlfX0FUVFIobmFtZSwgU19JUlVHTywgcnRjX3N5c2ZzX3Nob3dfbmFtZSwgTlVMTCksCisJX19BVFRSKGRhdGUsIFNfSVJVR08sIHJ0Y19zeXNmc19zaG93X2RhdGUsIE5VTEwpLAorCV9fQVRUUih0aW1lLCBTX0lSVUdPLCBydGNfc3lzZnNfc2hvd190aW1lLCBOVUxMKSwKKwlfX0FUVFIoc2luY2VfZXBvY2gsIFNfSVJVR08sIHJ0Y19zeXNmc19zaG93X3NpbmNlX2Vwb2NoLCBOVUxMKSwKKwlfX0FUVFIobWF4X3VzZXJfZnJlcSwgU19JUlVHTyB8IFNfSVdVU1IsIHJ0Y19zeXNmc19zaG93X21heF91c2VyX2ZyZXEsCisJCQlydGNfc3lzZnNfc2V0X21heF91c2VyX2ZyZXEpLAorCV9fQVRUUihoY3Rvc3lzLCBTX0lSVUdPLCBydGNfc3lzZnNfc2hvd19oY3Rvc3lzLCBOVUxMKSwKKwl7IH0sCit9OworCitzdGF0aWMgc3NpemVfdAorcnRjX3N5c2ZzX3Nob3dfd2FrZWFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGFsYXJtOworCXN0cnVjdCBydGNfd2thbHJtIGFsbTsKKworCS8qIERvbid0IHNob3cgZGlzYWJsZWQgYWxhcm1zLiAgRm9yIHVuaWZvcm1pdHksIFJUQyBhbGFybXMgYXJlCisJICogY29uY2VwdHVhbGx5IG9uZS1zaG90LCBldmVuIHRob3VnaCBzb21lIGNvbW1vbiBSVENzIChvbiBQQ3MpCisJICogZG9uJ3QgYWN0dWFsbHkgd29yayB0aGF0IHdheS4KKwkgKgorCSAqIE5PVEU6IFJUQyBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgdGhlIGFsYXJtIGRvZXNuJ3QgbWF0Y2ggYW4KKwkgKiBleGFjdCBZWVlZLU1NLUREIEhIOk1NWzpTU10gZGF0ZSAqbXVzdCogZGlzYWJsZSB0aGVpciBSVEMKKwkgKiBhbGFybXMgYWZ0ZXIgdGhleSB0cmlnZ2VyLCB0byBlbnN1cmUgb25lLXNob3Qgc2VtYW50aWNzLgorCSAqLworCXJldHZhbCA9IHJ0Y19yZWFkX2FsYXJtKHRvX3J0Y19kZXZpY2UoZGV2KSwgJmFsbSk7CisJaWYgKHJldHZhbCA9PSAwICYmIGFsbS5lbmFibGVkKSB7CisJCXJ0Y190bV90b190aW1lKCZhbG0udGltZSwgJmFsYXJtKTsKKwkJcmV0dmFsID0gc3ByaW50ZihidWYsICIlbHVcbiIsIGFsYXJtKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdAorcnRjX3N5c2ZzX3NldF93YWtlYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKK3sKKwlzc2l6ZV90IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIG5vdywgYWxhcm07CisJc3RydWN0IHJ0Y193a2Fscm0gYWxtOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSB0b19ydGNfZGV2aWNlKGRldik7CisJY2hhciAqYnVmX3B0cjsKKwlpbnQgYWRqdXN0ID0gMDsKKworCS8qIE9ubHkgcmVxdWVzdCBhbGFybXMgdGhhdCB0cmlnZ2VyIGluIHRoZSBmdXR1cmUuICBEaXNhYmxlIHRoZW0KKwkgKiBieSB3cml0aW5nIGFub3RoZXIgdGltZSwgZS5nLiAwIG1lYW5pbmcgSmFuIDEgMTk3MCBVVEMuCisJICovCisJcmV0dmFsID0gcnRjX3JlYWRfdGltZShydGMsICZhbG0udGltZSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisJcnRjX3RtX3RvX3RpbWUoJmFsbS50aW1lLCAmbm93KTsKKworCWJ1Zl9wdHIgPSAoY2hhciAqKWJ1ZjsKKwlpZiAoKmJ1Zl9wdHIgPT0gJysnKSB7CisJCWJ1Zl9wdHIrKzsKKwkJYWRqdXN0ID0gMTsKKwl9CisJYWxhcm0gPSBzaW1wbGVfc3RydG91bChidWZfcHRyLCBOVUxMLCAwKTsKKwlpZiAoYWRqdXN0KSB7CisJCWFsYXJtICs9IG5vdzsKKwl9CisJaWYgKGFsYXJtID4gbm93KSB7CisJCS8qIEF2b2lkIGFjY2lkZW50YWxseSBjbG9iYmVyaW5nIGFjdGl2ZSBhbGFybXM7IHdlIGNhbid0CisJCSAqIGVudGlyZWx5IHByZXZlbnQgdGhhdCBoZXJlLCB3aXRob3V0IGV2ZW4gdGhlIG1pbmltYWwKKwkJICogbG9ja2luZyBmcm9tIHRoZSAvZGV2L3J0Y04gYXBpLgorCQkgKi8KKwkJcmV0dmFsID0gcnRjX3JlYWRfYWxhcm0ocnRjLCAmYWxtKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQlpZiAoYWxtLmVuYWJsZWQpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWFsbS5lbmFibGVkID0gMTsKKwl9IGVsc2UgeworCQlhbG0uZW5hYmxlZCA9IDA7CisKKwkJLyogUHJvdmlkZSBhIHZhbGlkIGZ1dHVyZSBhbGFybSB0aW1lLiAgTGludXggaXNuJ3QgRUZJLAorCQkgKiB0aGlzIHRpbWUgd29uJ3QgYmUgaWdub3JlZCB3aGVuIGRpc2FibGluZyB0aGUgYWxhcm0uCisJCSAqLworCQlhbGFybSA9IG5vdyArIDMwMDsKKwl9CisJcnRjX3RpbWVfdG9fdG0oYWxhcm0sICZhbG0udGltZSk7CisKKwlyZXR2YWwgPSBydGNfc2V0X2FsYXJtKHJ0YywgJmFsbSk7CisJcmV0dXJuIChyZXR2YWwgPCAwKSA/IHJldHZhbCA6IG47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIod2FrZWFsYXJtLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJcnRjX3N5c2ZzX3Nob3dfd2FrZWFsYXJtLCBydGNfc3lzZnNfc2V0X3dha2VhbGFybSk7CisKKworLyogVGhlIHJlYXNvbiB0byB0cmlnZ2VyIGFuIGFsYXJtIHdpdGggbm8gcHJvY2VzcyB3YXRjaGluZyBpdCAodmlhIHN5c2ZzKQorICogaXMgaXRzIHNpZGUgZWZmZWN0OiAgd2FraW5nIGZyb20gYSBzeXN0ZW0gc3RhdGUgbGlrZSBzdXNwZW5kLXRvLVJBTSBvcgorICogc3VzcGVuZC10by1kaXNrLiAgU286IG5vIGF0dHJpYnV0ZSB1bmxlc3MgdGhhdCBzaWRlIGVmZmVjdCBpcyBwb3NzaWJsZS4KKyAqIChVc2Vyc3BhY2UgbWF5IGRpc2FibGUgdGhhdCBtZWNoYW5pc20gbGF0ZXIuKQorICovCitzdGF0aWMgaW5saW5lIGludCBydGNfZG9lc193YWtlYWxhcm0oc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKK3sKKwlpZiAoIWRldmljZV9jYW5fd2FrZXVwKHJ0Yy0+ZGV2LnBhcmVudCkpCisJCXJldHVybiAwOworCXJldHVybiBydGMtPm9wcy0+c2V0X2FsYXJtICE9IE5VTEw7Cit9CisKKwordm9pZCBydGNfc3lzZnNfYWRkX2RldmljZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQoreworCWludCBlcnI7CisKKwkvKiBub3QgYWxsIFJUQ3Mgc3VwcG9ydCBib3RoIGFsYXJtcyBhbmQgd2FrZXVwICovCisJaWYgKCFydGNfZG9lc193YWtlYWxhcm0ocnRjKSkKKwkJcmV0dXJuOworCisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZydGMtPmRldiwgJmRldl9hdHRyX3dha2VhbGFybSk7CisJaWYgKGVycikKKwkJZGV2X2VycihydGMtPmRldi5wYXJlbnQsCisJCQkiZmFpbGVkIHRvIGNyZWF0ZSBhbGFybSBhdHRyaWJ1dGUsICVkXG4iLCBlcnIpOworfQorCit2b2lkIHJ0Y19zeXNmc19kZWxfZGV2aWNlKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCit7CisJLyogUkVWSVNJVCBkaWQgd2UgYWRkIGl0IHN1Y2Nlc3NmdWxseT8gKi8KKwlpZiAocnRjX2RvZXNfd2FrZWFsYXJtKHJ0YykpCisJCWRldmljZV9yZW1vdmVfZmlsZSgmcnRjLT5kZXYsICZkZXZfYXR0cl93YWtlYWxhcm0pOworfQorCit2b2lkIF9faW5pdCBydGNfc3lzZnNfaW5pdChzdHJ1Y3QgY2xhc3MgKnJ0Y19jbGFzcykKK3sKKwlydGNfY2xhc3MtPmRldl9hdHRycyA9IHJ0Y19hdHRyczsKK30KZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy10ZWdyYS5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXRlZ3JhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyNTlmZQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy10ZWdyYS5jCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogQW4gUlRDIGRyaXZlciBmb3IgdGhlIE5WSURJQSBUZWdyYSAyMDAgc2VyaWVzIGludGVybmFsIFJUQy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE5WSURJQSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworLyogc2V0IHRvIDEgPSBidXN5IGV2ZXJ5IGVpZ2h0IDMya0h6IGNsb2NrcyBkdXJpbmcgY29weSBvZiBzZWMrbXNlYyB0byBBSEIgKi8KKyNkZWZpbmUgVEVHUkFfUlRDX1JFR19CVVNZCQkJMHgwMDQKKyNkZWZpbmUgVEVHUkFfUlRDX1JFR19TRUNPTkRTCQkJMHgwMDgKKy8qIHdoZW4gbXNlYyBpcyByZWFkLCB0aGUgc2Vjb25kcyBhcmUgYnVmZmVyZWQgaW50byBzaGFkb3cgc2Vjb25kcy4gKi8KKyNkZWZpbmUgVEVHUkFfUlRDX1JFR19TSEFET1dfU0VDT05EUwkJMHgwMGMKKyNkZWZpbmUgVEVHUkFfUlRDX1JFR19NSUxMSV9TRUNPTkRTCQkweDAxMAorI2RlZmluZSBURUdSQV9SVENfUkVHX1NFQ09ORFNfQUxBUk0wCQkweDAxNAorI2RlZmluZSBURUdSQV9SVENfUkVHX1NFQ09ORFNfQUxBUk0xCQkweDAxOAorI2RlZmluZSBURUdSQV9SVENfUkVHX01JTExJX1NFQ09ORFNfQUxBUk0wCTB4MDFjCisjZGVmaW5lIFRFR1JBX1JUQ19SRUdfSU5UUl9NQVNLCQkJMHgwMjgKKy8qIHdyaXRlIDEgYml0cyB0byBjbGVhciBzdGF0dXMgYml0cyAqLworI2RlZmluZSBURUdSQV9SVENfUkVHX0lOVFJfU1RBVFVTCQkweDAyYworCisvKiBiaXRzIGluIElOVFJfTUFTSyAqLworI2RlZmluZSBURUdSQV9SVENfSU5UUl9NQVNLX01TRUNfQ0ROX0FMQVJNCSgxPDw0KQorI2RlZmluZSBURUdSQV9SVENfSU5UUl9NQVNLX1NFQ19DRE5fQUxBUk0JKDE8PDMpCisjZGVmaW5lIFRFR1JBX1JUQ19JTlRSX01BU0tfTVNFQ19BTEFSTQkJKDE8PDIpCisjZGVmaW5lIFRFR1JBX1JUQ19JTlRSX01BU0tfU0VDX0FMQVJNMQkJKDE8PDEpCisjZGVmaW5lIFRFR1JBX1JUQ19JTlRSX01BU0tfU0VDX0FMQVJNMAkJKDE8PDApCisKKy8qIGJpdHMgaW4gSU5UUl9TVEFUVVMgKi8KKyNkZWZpbmUgVEVHUkFfUlRDX0lOVFJfU1RBVFVTX01TRUNfQ0ROX0FMQVJNCSgxPDw0KQorI2RlZmluZSBURUdSQV9SVENfSU5UUl9TVEFUVVNfU0VDX0NETl9BTEFSTQkoMTw8MykKKyNkZWZpbmUgVEVHUkFfUlRDX0lOVFJfU1RBVFVTX01TRUNfQUxBUk0JKDE8PDIpCisjZGVmaW5lIFRFR1JBX1JUQ19JTlRSX1NUQVRVU19TRUNfQUxBUk0xCSgxPDwxKQorI2RlZmluZSBURUdSQV9SVENfSU5UUl9TVEFUVVNfU0VDX0FMQVJNMAkoMTw8MCkKKworc3RydWN0IHRlZ3JhX3J0Y19pbmZvIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCXN0cnVjdCBydGNfZGV2aWNlCSpydGNfZGV2OworCXZvaWQgX19pb21lbQkJKnJ0Y19iYXNlOyAvKiBOVUxMIGlmIG5vdCBpbml0aWFsaXplZC4gKi8KKwlpbnQJCQl0ZWdyYV9ydGNfaXJxOyAvKiBhbGFybSBhbmQgcGVyaW9kaWMgaXJxICovCisJc3BpbmxvY2tfdAkJdGVncmFfcnRjX2xvY2s7Cit9OworCisvKiBSVEMgaGFyZHdhcmUgaXMgYnVzeSB3aGVuIGl0IGlzIHVwZGF0aW5nIGl0cyB2YWx1ZXMgb3ZlciBBSEIgb25jZQorICogZXZlcnkgZWlnaHQgMzJrSHogY2xvY2tzICh+MjUwdVMpLgorICogb3V0c2lkZSBvZiB0aGVzZSB1cGRhdGVzIHRoZSBDUFUgaXMgZnJlZSB0byB3cml0ZS4KKyAqIENQVSBpcyBhbHdheXMgZnJlZSB0byByZWFkLgorICovCitzdGF0aWMgaW5saW5lIHUzMiB0ZWdyYV9ydGNfY2hlY2tfYnVzeShzdHJ1Y3QgdGVncmFfcnRjX2luZm8gKmluZm8pCit7CisJcmV0dXJuIHJlYWRsKGluZm8tPnJ0Y19iYXNlICsgVEVHUkFfUlRDX1JFR19CVVNZKSAmIDE7Cit9CisKKy8qIFdhaXQgZm9yIGhhcmR3YXJlIHRvIGJlIHJlYWR5IGZvciB3cml0aW5nLgorICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBtYXhpbWl6ZSB0aGUgYW1vdW50IG9mIHRpbWUgYmVmb3JlIHRoZSBuZXh0IHVwZGF0ZS4KKyAqIEl0IGRvZXMgdGhpcyBieSB3YWl0aW5nIGZvciB0aGUgUlRDIHRvIGJlY29tZSBidXN5IHdpdGggaXRzIHBlcmlvZGljIHVwZGF0ZSwKKyAqIHRoZW4gcmV0dXJuaW5nIG9uY2UgdGhlIFJUQyBmaXJzdCBiZWNvbWVzIG5vdCBidXN5LgorICogVGhpcyBwZXJpb2RpYyB1cGRhdGUgKHdoZXJlIHRoZSBzZWNvbmRzIGFuZCBtaWxsaXNlY29uZHMgYXJlIGNvcGllZCB0byB0aGUKKyAqIEFIQiBzaWRlKSBvY2N1cnMgZXZlcnkgZWlnaHQgMzJrSHogY2xvY2tzICh+MjUwdVMpLgorICogVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIG1ha2Ugc29tZSBhc3N1bXB0aW9ucyB3aXRob3V0CisgKiBpbnRyb2R1Y2luZyBhIHJhY2UsIGJlY2F1c2UgMjUwdVMgaXMgcGxlbnR5IG9mIHRpbWUgdG8gcmVhZC93cml0ZSBhIHZhbHVlLgorICovCitzdGF0aWMgaW50IHRlZ3JhX3J0Y193YWl0X3doaWxlX2J1c3koc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZWdyYV9ydGNfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaW50IHJldHJpZXMgPSA1MDA7IC8qIH40OTAgdXMgaXMgdGhlIHdvcnN0IGNhc2UsIH4yNTAgdXMgaXMgYmVzdC4gKi8KKworCS8qIGZpcnN0IHdhaXQgZm9yIHRoZSBSVEMgdG8gYmVjb21lIGJ1c3kuIHRoaXMgaXMgd2hlbiBpdAorCSAqIHBvc3RzIGl0cyB1cGRhdGVkIHNlY29uZHMrbXNlYyByZWdpc3RlcnMgdG8gQUhCIHNpZGUuICovCisJd2hpbGUgKHRlZ3JhX3J0Y19jaGVja19idXN5KGluZm8pKSB7CisJCWlmICghcmV0cmllcy0tKQorCQkJZ290byByZXRyeV9mYWlsZWQ7CisJCXVkZWxheSgxKTsKKwl9CisKKwkvKiBub3cgd2UgaGF2ZSBhYm91dCAyNTAgdXMgdG8gbWFuaXB1bGF0ZSByZWdpc3RlcnMgKi8KKwlyZXR1cm4gMDsKKworcmV0cnlfZmFpbGVkOgorCWRldl9lcnIoZGV2LCAid3JpdGUgZmFpbGVkOnJldHJ5IGNvdW50IGV4Y2VlZGVkLlxuIik7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHRlZ3JhX3J0Y19pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBzZWMsIG1zZWM7CisJdW5zaWduZWQgbG9uZyBzbF9pcnFfZmxhZ3M7CisKKwkvKiBSVEMgaGFyZHdhcmUgY29waWVzIHNlY29uZHMgdG8gc2hhZG93IHNlY29uZHMgd2hlbiBhIHJlYWQKKwkgKiBvZiBtaWxsaXNlY29uZHMgb2NjdXJzLiB1c2UgYSBsb2NrIHRvIGtlZXAgb3RoZXIgdGhyZWFkcyBvdXQuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnRlZ3JhX3J0Y19sb2NrLCBzbF9pcnFfZmxhZ3MpOworCisJbXNlYyA9IHJlYWRsKGluZm8tPnJ0Y19iYXNlICsgVEVHUkFfUlRDX1JFR19NSUxMSV9TRUNPTkRTKTsKKwlzZWMgPSByZWFkbChpbmZvLT5ydGNfYmFzZSArIFRFR1JBX1JUQ19SRUdfU0hBRE9XX1NFQ09ORFMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+dGVncmFfcnRjX2xvY2ssIHNsX2lycV9mbGFncyk7CisKKwlydGNfdGltZV90b190bShzZWMsIHRtKTsKKworCWRldl92ZGJnKGRldiwgInRpbWUgcmVhZCBhcyAlbHUuICVkLyVkLyVkICVkOiUwMnU6JTAydVxuIiwKKwkJc2VjLAorCQl0bS0+dG1fbW9uICsgMSwKKwkJdG0tPnRtX21kYXksCisJCXRtLT50bV95ZWFyICsgMTkwMCwKKwkJdG0tPnRtX2hvdXIsCisJCXRtLT50bV9taW4sCisJCXRtLT50bV9zZWMKKwkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgdGVncmFfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHNlYzsKKwlpbnQgcmV0OworCisJLyogY29udmVydCB0bSB0byBzZWNvbmRzLiAqLworCXJldCA9IHJ0Y192YWxpZF90bSh0bSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJ0Y190bV90b190aW1lKHRtLCAmc2VjKTsKKworCWRldl92ZGJnKGRldiwgInRpbWUgc2V0IHRvICVsdS4gJWQvJWQvJWQgJWQ6JTAydTolMDJ1XG4iLAorCQlzZWMsCisJCXRtLT50bV9tb24rMSwKKwkJdG0tPnRtX21kYXksCisJCXRtLT50bV95ZWFyKzE5MDAsCisJCXRtLT50bV9ob3VyLAorCQl0bS0+dG1fbWluLAorCQl0bS0+dG1fc2VjCisJKTsKKworCS8qIHNlY29uZHMgb25seSB3cml0dGVuIGlmIHdhaXQgc3VjY2VlZGVkLiAqLworCXJldCA9IHRlZ3JhX3J0Y193YWl0X3doaWxlX2J1c3koZGV2KTsKKwlpZiAoIXJldCkKKwkJd3JpdGVsKHNlYywgaW5mby0+cnRjX2Jhc2UgKyBURUdSQV9SVENfUkVHX1NFQ09ORFMpOworCisJZGV2X3ZkYmcoZGV2LCAidGltZSByZWFkIGJhY2sgYXMgJWRcbiIsCisJCXJlYWRsKGluZm8tPnJ0Y19iYXNlICsgVEVHUkFfUlRDX1JFR19TRUNPTkRTKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlZ3JhX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCB0ZWdyYV9ydGNfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIHRtcDsKKworCXNlYyA9IHJlYWRsKGluZm8tPnJ0Y19iYXNlICsgVEVHUkFfUlRDX1JFR19TRUNPTkRTX0FMQVJNMCk7CisKKwlpZiAoc2VjID09IDApIHsKKwkJLyogYWxhcm0gaXMgZGlzYWJsZWQuICovCisJCWFsYXJtLT5lbmFibGVkID0gMDsKKwkJYWxhcm0tPnRpbWUudG1fbW9uID0gLTE7CisJCWFsYXJtLT50aW1lLnRtX21kYXkgPSAtMTsKKwkJYWxhcm0tPnRpbWUudG1feWVhciA9IC0xOworCQlhbGFybS0+dGltZS50bV9ob3VyID0gLTE7CisJCWFsYXJtLT50aW1lLnRtX21pbiA9IC0xOworCQlhbGFybS0+dGltZS50bV9zZWMgPSAtMTsKKwl9IGVsc2UgeworCQkvKiBhbGFybSBpcyBlbmFibGVkLiAqLworCQlhbGFybS0+ZW5hYmxlZCA9IDE7CisJCXJ0Y190aW1lX3RvX3RtKHNlYywgJmFsYXJtLT50aW1lKTsKKwl9CisKKwl0bXAgPSByZWFkbChpbmZvLT5ydGNfYmFzZSArIFRFR1JBX1JUQ19SRUdfSU5UUl9TVEFUVVMpOworCWFsYXJtLT5wZW5kaW5nID0gKHRtcCAmIFRFR1JBX1JUQ19JTlRSX1NUQVRVU19TRUNfQUxBUk0wKSAhPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgdGVncmFfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBzbF9pcnFfZmxhZ3M7CisKKwl0ZWdyYV9ydGNfd2FpdF93aGlsZV9idXN5KGRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnRlZ3JhX3J0Y19sb2NrLCBzbF9pcnFfZmxhZ3MpOworCisJLyogcmVhZCB0aGUgb3JpZ2luYWwgdmFsdWUsIGFuZCBPUiBpbiB0aGUgZmxhZy4gKi8KKwlzdGF0dXMgPSByZWFkbChpbmZvLT5ydGNfYmFzZSArIFRFR1JBX1JUQ19SRUdfSU5UUl9NQVNLKTsKKwlpZiAoZW5hYmxlZCkKKwkJc3RhdHVzIHw9IFRFR1JBX1JUQ19JTlRSX01BU0tfU0VDX0FMQVJNMDsgLyogc2V0IGl0ICovCisJZWxzZQorCQlzdGF0dXMgJj0gflRFR1JBX1JUQ19JTlRSX01BU0tfU0VDX0FMQVJNMDsgLyogY2xlYXIgaXQgKi8KKworCXdyaXRlbChzdGF0dXMsIGluZm8tPnJ0Y19iYXNlICsgVEVHUkFfUlRDX1JFR19JTlRSX01BU0spOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+dGVncmFfcnRjX2xvY2ssIHNsX2lycV9mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCB0ZWdyYV9ydGNfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgc2VjOworCisJaWYgKGFsYXJtLT5lbmFibGVkKQorCQlydGNfdG1fdG9fdGltZSgmYWxhcm0tPnRpbWUsICZzZWMpOworCWVsc2UKKwkJc2VjID0gMDsKKworCXRlZ3JhX3J0Y193YWl0X3doaWxlX2J1c3koZGV2KTsKKwl3cml0ZWwoc2VjLCBpbmZvLT5ydGNfYmFzZSArIFRFR1JBX1JUQ19SRUdfU0VDT05EU19BTEFSTTApOworCWRldl92ZGJnKGRldiwgImFsYXJtIHJlYWQgYmFjayBhcyAlZFxuIiwKKwkJcmVhZGwoaW5mby0+cnRjX2Jhc2UgKyBURUdSQV9SVENfUkVHX1NFQ09ORFNfQUxBUk0wKSk7CisKKwkvKiBpZiBzdWNjZXNzZnVsbHkgd3JpdHRlbiBhbmQgYWxhcm0gaXMgZW5hYmxlZCAuLi4gKi8KKwlpZiAoc2VjKSB7CisJCXRlZ3JhX3J0Y19hbGFybV9pcnFfZW5hYmxlKGRldiwgMSk7CisKKwkJZGV2X3ZkYmcoZGV2LCAiYWxhcm0gc2V0IGFzICVsdS4gJWQvJWQvJWQgJWQ6JTAydTolMDJ1XG4iLAorCQkJc2VjLAorCQkJYWxhcm0tPnRpbWUudG1fbW9uKzEsCisJCQlhbGFybS0+dGltZS50bV9tZGF5LAorCQkJYWxhcm0tPnRpbWUudG1feWVhcisxOTAwLAorCQkJYWxhcm0tPnRpbWUudG1faG91ciwKKwkJCWFsYXJtLT50aW1lLnRtX21pbiwKKwkJCWFsYXJtLT50aW1lLnRtX3NlYyk7CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBhbGFybSBpZiAwIG9yIHdyaXRlIGVycm9yLiAqLworCQlkZXZfdmRiZyhkZXYsICJhbGFybSBkaXNhYmxlZFxuIik7CisJCXRlZ3JhX3J0Y19hbGFybV9pcnFfZW5hYmxlKGRldiwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAibmFtZVx0XHQ6ICVzXG4iLCBkZXZfbmFtZShkZXYpKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHRlZ3JhX3J0Y19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHRlZ3JhX3J0Y19pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCXVuc2lnbmVkIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHNsX2lycV9mbGFnczsKKworCXN0YXR1cyA9IHJlYWRsKGluZm8tPnJ0Y19iYXNlICsgVEVHUkFfUlRDX1JFR19JTlRSX1NUQVRVUyk7CisJaWYgKHN0YXR1cykgeworCQkvKiBjbGVhciB0aGUgaW50ZXJydXB0IG1hc2tzIGFuZCBzdGF0dXMgb24gYW55IGlycS4gKi8KKwkJdGVncmFfcnRjX3dhaXRfd2hpbGVfYnVzeShkZXYpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+dGVncmFfcnRjX2xvY2ssIHNsX2lycV9mbGFncyk7CisJCXdyaXRlbCgwLCBpbmZvLT5ydGNfYmFzZSArIFRFR1JBX1JUQ19SRUdfSU5UUl9NQVNLKTsKKwkJd3JpdGVsKHN0YXR1cywgaW5mby0+cnRjX2Jhc2UgKyBURUdSQV9SVENfUkVHX0lOVFJfU1RBVFVTKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+dGVncmFfcnRjX2xvY2ssIHNsX2lycV9mbGFncyk7CisJfQorCisJLyogY2hlY2sgaWYgQWxhcm0gKi8KKwlpZiAoKHN0YXR1cyAmIFRFR1JBX1JUQ19JTlRSX1NUQVRVU19TRUNfQUxBUk0wKSkKKwkJZXZlbnRzIHw9IFJUQ19JUlFGIHwgUlRDX0FGOworCisJLyogY2hlY2sgaWYgUGVyaW9kaWMgKi8KKwlpZiAoKHN0YXR1cyAmIFRFR1JBX1JUQ19JTlRSX1NUQVRVU19TRUNfQ0ROX0FMQVJNKSkKKwkJZXZlbnRzIHw9IFJUQ19JUlFGIHwgUlRDX1BGOworCisJcnRjX3VwZGF0ZV9pcnEoaW5mby0+cnRjX2RldiwgMSwgZXZlbnRzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHRlZ3JhX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHRlZ3JhX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gdGVncmFfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gdGVncmFfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IHRlZ3JhX3J0Y19zZXRfYWxhcm0sCisJLnByb2MJCT0gdGVncmFfcnRjX3Byb2MsCisJLmFsYXJtX2lycV9lbmFibGUgPSB0ZWdyYV9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRlZ3JhX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0ZWdyYV9ydGNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZWdyYV9ydGNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBkZXZpY2UuXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9mcmVlX2luZm87CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiVW5hYmxlIHRvIHJlcXVlc3QgbWVtIHJlZ2lvbiBmb3IgZGV2aWNlLlxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfZnJlZV9pbmZvOworCX0KKworCWluZm8tPnRlZ3JhX3J0Y19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpbmZvLT50ZWdyYV9ydGNfaXJxIDw9IDApIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9yZWxlYXNlX21lbV9yZWdpb247CisJfQorCisJaW5mby0+cnRjX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIWluZm8tPnJ0Y19iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBncmFiIElPcyBmb3IgZGV2aWNlLlxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVsZWFzZV9tZW1fcmVnaW9uOworCX0KKworCS8qIHNldCBjb250ZXh0IGluZm8uICovCisJaW5mby0+cGRldiA9IHBkZXY7CisJc3Bpbl9sb2NrX2luaXQoJmluZm8tPnRlZ3JhX3J0Y19sb2NrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCisJLyogY2xlYXIgb3V0IHRoZSBoYXJkd2FyZS4gKi8KKwl3cml0ZWwoMCwgaW5mby0+cnRjX2Jhc2UgKyBURUdSQV9SVENfUkVHX1NFQ09ORFNfQUxBUk0wKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgaW5mby0+cnRjX2Jhc2UgKyBURUdSQV9SVENfUkVHX0lOVFJfU1RBVFVTKTsKKwl3cml0ZWwoMCwgaW5mby0+cnRjX2Jhc2UgKyBURUdSQV9SVENfUkVHX0lOVFJfTUFTSyk7CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisKKwlpbmZvLT5ydGNfZGV2ID0gcnRjX2RldmljZV9yZWdpc3RlcigKKwkJcGRldi0+bmFtZSwgJnBkZXYtPmRldiwgJnRlZ3JhX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKGluZm8tPnJ0Y19kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIoaW5mby0+cnRjX2Rldik7CisJCWluZm8tPnJ0Y19kZXYgPSBOVUxMOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiVW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZSAoZXJyPSVkKS5cbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9pb3VubWFwOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKGluZm8tPnRlZ3JhX3J0Y19pcnEsIHRlZ3JhX3J0Y19pcnFfaGFuZGxlciwKKwkJSVJRRl9UUklHR0VSX0hJR0gsICJydGMgYWxhcm0iLCAmcGRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJVbmFibGUgdG8gcmVxdWVzdCBpbnRlcnJ1cHQgZm9yIGRldmljZSAoZXJyPSVkKS5cbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9kZXZfdW5yZWc7CisJfQorCisJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAiVGVncmEgaW50ZXJuYWwgUmVhbCBUaW1lIENsb2NrXG4iKTsKKworCXJldHVybiAwOworCitlcnJfZGV2X3VucmVnOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihpbmZvLT5ydGNfZGV2KTsKK2Vycl9pb3VubWFwOgorCWlvdW5tYXAoaW5mby0+cnRjX2Jhc2UpOworZXJyX3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKK2Vycl9mcmVlX2luZm86CisJa2ZyZWUoaW5mbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB0ZWdyYV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRlZ3JhX3J0Y19pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVCVVNZOworCisJZnJlZV9pcnEoaW5mby0+dGVncmFfcnRjX2lycSwgJnBkZXYtPmRldik7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPnJ0Y19kZXYpOworCWlvdW5tYXAoaW5mby0+cnRjX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWtmcmVlKGluZm8pOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB0ZWdyYV9ydGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgdGVncmFfcnRjX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXRlZ3JhX3J0Y193YWl0X3doaWxlX2J1c3koZGV2KTsKKworCS8qIG9ubHkgdXNlIEFMQVJNMCBhcyBhIHdha2Ugc291cmNlLiAqLworCXdyaXRlbCgweGZmZmZmZmZmLCBpbmZvLT5ydGNfYmFzZSArIFRFR1JBX1JUQ19SRUdfSU5UUl9TVEFUVVMpOworCXdyaXRlbChURUdSQV9SVENfSU5UUl9TVEFUVVNfU0VDX0FMQVJNMCwKKwkJaW5mby0+cnRjX2Jhc2UgKyBURUdSQV9SVENfUkVHX0lOVFJfTUFTSyk7CisKKwlkZXZfdmRiZyhkZXYsICJhbGFybSBzZWMgPSAlZFxuIiwKKwkJcmVhZGwoaW5mby0+cnRjX2Jhc2UgKyBURUdSQV9SVENfUkVHX1NFQ09ORFNfQUxBUk0wKSk7CisKKwlkZXZfdmRiZyhkZXYsICJTdXNwZW5kIChkZXZpY2VfbWF5X3dha2V1cD0lZCkgaXJxOiVkXG4iLAorCQlkZXZpY2VfbWF5X3dha2V1cChkZXYpLCBpbmZvLT50ZWdyYV9ydGNfaXJxKTsKKworCS8qIGxlYXZlIHRoZSBhbGFybXMgb24gYXMgYSB3YWtlIHNvdXJjZS4gKi8KKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKGluZm8tPnRlZ3JhX3J0Y19pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHRlZ3JhX3J0Y19pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZXZfdmRiZyhkZXYsICJSZXN1bWUgKGRldmljZV9tYXlfd2FrZXVwPSVkKVxuIiwKKwkJZGV2aWNlX21heV93YWtldXAoZGV2KSk7CisJLyogYWxhcm1zIHdlcmUgbGVmdCBvbiBhcyBhIHdha2Ugc291cmNlLCB0dXJuIHRoZW0gb2ZmLiAqLworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKGluZm8tPnRlZ3JhX3J0Y19pcnEpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdGVncmFfcnRjX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJZGV2X3ZkYmcoJnBkZXYtPmRldiwgImRpc2FibGluZyBpbnRlcnJ1cHRzLlxuIik7CisJdGVncmFfcnRjX2FsYXJtX2lycV9lbmFibGUoJnBkZXYtPmRldiwgMCk7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06dGVncmFfcnRjIik7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodGVncmFfcnRjX3JlbW92ZSksCisJLnNodXRkb3duCT0gdGVncmFfcnRjX3NodXRkb3duLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ0ZWdyYV9ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdGVncmFfcnRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB0ZWdyYV9ydGNfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZWdyYV9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnRlZ3JhX3J0Y19kcml2ZXIsIHRlZ3JhX3J0Y19wcm9iZSk7Cit9Cittb2R1bGVfaW5pdCh0ZWdyYV9ydGNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZWdyYV9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYV9ydGNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHRlZ3JhX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSm9uIE1heW8gPGptYXlvQG52aWRpYS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImRyaXZlciBmb3IgVGVncmEgaW50ZXJuYWwgUlRDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTk2MjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXRlc3QuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIEFuIFJUQyB0ZXN0IGRldmljZS9kcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUb3dlciBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0ZXN0MCA9IE5VTEwsICp0ZXN0MSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgdGVzdF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcnRjX3RpbWVfdG9fdG0oZ2V0X3NlY29uZHMoKSwgdG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3RfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQoreworCWRldl9pbmZvKGRldiwgIiVzLCBzZWNzID0gJWx1XG4iLCBfX2Z1bmNfXywgc2Vjcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRfZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisKKwlzZXFfcHJpbnRmKHNlcSwgInRlc3RcdFx0OiB5ZXNcbiIpOworCXNlcV9wcmludGYoc2VxLCAiaWRcdFx0OiAlZFxuIiwgcGxhdF9kZXYtPmlkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3RfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgdGVzdF9ydGNfb3BzID0geworCS5wcm9jID0gdGVzdF9ydGNfcHJvYywKKwkucmVhZF90aW1lID0gdGVzdF9ydGNfcmVhZF90aW1lLAorCS5yZWFkX2FsYXJtID0gdGVzdF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gdGVzdF9ydGNfc2V0X2FsYXJtLAorCS5zZXRfbW1zcyA9IHRlc3RfcnRjX3NldF9tbXNzLAorCS5hbGFybV9pcnFfZW5hYmxlID0gdGVzdF9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHRlc3RfaXJxX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIDQyKTsKK30KK3N0YXRpYyBzc2l6ZV90IHRlc3RfaXJxX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRfZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBsYXRfZGV2KTsKKworCXJldHZhbCA9IGNvdW50OworCWlmIChzdHJuY21wKGJ1ZiwgInRpY2siLCA0KSA9PSAwICYmIHJ0Yy0+cGllX2VuYWJsZWQpCisJCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgUlRDX1BGIHwgUlRDX0lSUUYpOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiYWxhcm0iLCA1KSA9PSAwKSB7CisJCXN0cnVjdCBydGNfd2thbHJtIGFscm07CisJCWludCBlcnIgPSBydGNfcmVhZF9hbGFybShydGMsICZhbHJtKTsKKworCQlpZiAoIWVyciAmJiBhbHJtLmVuYWJsZWQpCisJCQlydGNfdXBkYXRlX2lycShydGMsIDEsIFJUQ19BRiB8IFJUQ19JUlFGKTsKKworCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJ1cGRhdGUiLCA2KSA9PSAwICYmIHJ0Yy0+dWllX3J0Y3RpbWVyLmVuYWJsZWQpCisJCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgUlRDX1VGIHwgUlRDX0lSUUYpOworCWVsc2UKKwkJcmV0dmFsID0gLUVJTlZBTDsKKworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoaXJxLCBTX0lSVUdPIHwgU19JV1VTUiwgdGVzdF9pcnFfc2hvdywgdGVzdF9pcnFfc3RvcmUpOworCitzdGF0aWMgaW50IHRlc3RfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigidGVzdCIsICZwbGF0X2Rldi0+ZGV2LAorCQkJCQkJJnRlc3RfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQllcnIgPSBQVFJfRVJSKHJ0Yyk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfaXJxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXRfZGV2LCBydGMpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB0ZXN0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0X2RldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdF9kZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfaXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZXN0X2RyaXZlciA9IHsKKwkucHJvYmUJPSB0ZXN0X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0ZXN0X3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicnRjLXRlc3QiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGVzdF9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0ZXN0X2RyaXZlcikpKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCh0ZXN0MCA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicnRjLXRlc3QiLCAwKSkgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfZHJpdmVyX3VucmVnaXN0ZXI7CisJfQorCisJaWYgKCh0ZXN0MSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicnRjLXRlc3QiLCAxKSkgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfZnJlZV90ZXN0MDsKKwl9CisKKwlpZiAoKGVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQodGVzdDApKSkKKwkJZ290byBleGl0X2ZyZWVfdGVzdDE7CisKKwlpZiAoKGVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQodGVzdDEpKSkKKwkJZ290byBleGl0X2RldmljZV91bnJlZ2lzdGVyOworCisJcmV0dXJuIDA7CisKK2V4aXRfZGV2aWNlX3VucmVnaXN0ZXI6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodGVzdDApOworCitleGl0X2ZyZWVfdGVzdDE6CisJcGxhdGZvcm1fZGV2aWNlX3B1dCh0ZXN0MSk7CisKK2V4aXRfZnJlZV90ZXN0MDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHRlc3QwKTsKKworZXhpdF9kcml2ZXJfdW5yZWdpc3RlcjoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGVzdF9kcml2ZXIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0ZXN0MCk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodGVzdDEpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZXN0X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgdGVzdCBkcml2ZXIvZGV2aWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHRlc3RfaW5pdCk7Cittb2R1bGVfZXhpdCh0ZXN0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXRpbGUuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy10aWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2NWRhZgotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy10aWxlLmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKgorICogVGlsZXJhLXNwZWNpZmljIFJUQyBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisvKiBQbGF0Zm9ybSBkZXZpY2UgcG9pbnRlci4gKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0aWxlX3J0Y19wbGF0Zm9ybV9kZXZpY2U7CisKKy8qCisgKiBSVEMgcmVhZCByb3V0aW5lLiAgR2V0cyB0aW1lIGluZm8gZnJvbSBSVEMgY2hpcCB2aWEgaHlwZXJ2aXNvciBzeXNjYWxsLgorICovCitzdGF0aWMgaW50IHJlYWRfcnRjX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCUhWX1JUQ1RpbWUgaHZ0bSA9IGh2X2dldF9ydGMoKTsKKworCXRtLT50bV9zZWMgPSBodnRtLnRtX3NlYzsKKwl0bS0+dG1fbWluID0gaHZ0bS50bV9taW47CisJdG0tPnRtX2hvdXIgPSBodnRtLnRtX2hvdXI7CisJdG0tPnRtX21kYXkgPSBodnRtLnRtX21kYXk7CisJdG0tPnRtX21vbiA9IGh2dG0udG1fbW9uOworCXRtLT50bV95ZWFyID0gaHZ0bS50bV95ZWFyOworCXRtLT50bV93ZGF5ID0gMDsKKwl0bS0+dG1feWRheSA9IDA7CisJdG0tPnRtX2lzZHN0ID0gMDsKKworCWlmIChydGNfdmFsaWRfdG0odG0pIDwgMCkKKwkJZGV2X3dhcm4oZGV2LCAiUmVhZCBpbnZhbGlkIGRhdGUvdGltZSBmcm9tIFJUQ1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJUQyB3cml0ZSByb3V0aW5lLiAgU2VuZHMgdGltZSBpbmZvIHRvIGh5cGVydmlzb3IgdmlhIHN5c2NhbGwsIHRvIGJlCisgKiB3cml0dGVuIHRvIFJUQyBjaGlwLgorICovCitzdGF0aWMgaW50IHNldF9ydGNfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJSFZfUlRDVGltZSBodnRtOworCisJaHZ0bS50bV9zZWMgPSB0bS0+dG1fc2VjOworCWh2dG0udG1fbWluID0gdG0tPnRtX21pbjsKKwlodnRtLnRtX2hvdXIgPSB0bS0+dG1faG91cjsKKwlodnRtLnRtX21kYXkgPSB0bS0+dG1fbWRheTsKKwlodnRtLnRtX21vbiA9IHRtLT50bV9tb247CisJaHZ0bS50bV95ZWFyID0gdG0tPnRtX3llYXI7CisKKwlodl9zZXRfcnRjKGh2dG0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSVEMgcmVhZC93cml0ZSBvcHMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB0aWxlX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHJlYWRfcnRjX3RpbWUsCisJLnNldF90aW1lCT0gc2V0X3J0Y190aW1lLAorfTsKKworLyoKKyAqIERldmljZSBwcm9iZSByb3V0aW5lLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0aWxlX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInRpbGUiLAorCQkJCSAgJmRldi0+ZGV2LCAmdGlsZV9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERldmljZSBjbGVhbnVwIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IHRpbGVfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGlsZV9ydGNfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtdGlsZSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHRpbGVfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodGlsZV9ydGNfcmVtb3ZlKSwKK307CisKKy8qCisgKiBEcml2ZXIgaW5pdCByb3V0aW5lLgorICovCitzdGF0aWMgaW50IF9faW5pdCB0aWxlX3J0Y19kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRpbGVfcnRjX3BsYXRmb3JtX2RyaXZlcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXRpbGVfcnRjX3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicnRjLXRpbGUiLCAwKTsKKwlpZiAodGlsZV9ydGNfcGxhdGZvcm1fZGV2aWNlID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X2RyaXZlcl91bnJlZ2lzdGVyOworCX0KKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQodGlsZV9ydGNfcGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKKworCXJldHVybiAwOworCitleGl0X2RldmljZV9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dCh0aWxlX3J0Y19wbGF0Zm9ybV9kZXZpY2UpOworCitleGl0X2RyaXZlcl91bnJlZ2lzdGVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0aWxlX3J0Y19wbGF0Zm9ybV9kcml2ZXIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBEcml2ZXIgY2xlYW51cCByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgdGlsZV9ydGNfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGlsZV9ydGNfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGlsZV9ydGNfZHJpdmVyX2luaXQpOworbW9kdWxlX2V4aXQodGlsZV9ydGNfZHJpdmVyX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRpbGVyYS1zcGVjaWZpYyBSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy10aWxlIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtdHdsLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtdHdsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjZTE5NQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy10d2wuYwpAQCAtMCwwICsxLDYzMCBAQAorLyoKKyAqIHJ0Yy10d2wuYyAtLSBUV0wgUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMKKyAqIEF1dGhvcjogQWxleGFuZHJlIFJ1c2V2IDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBvcmlnaW5hbCBUSSBkcml2ZXIgdHdsNDAzMC1ydGMuYworICogICBDb3B5cmlnaHQgKEMpIDIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBCYXNlZCBvbiBydGMtb21hcC5jCisgKiAgIENvcHlyaWdodCAoQykgMjAwMyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgIEF1dGhvcjogR2VvcmdlIEcuIERhdmlzIDxnZGF2aXNAbXZpc3RhLmNvbT4gb3IgPHNvdXJjZUBtdmlzdGEuY29tPgorICogICBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgorCisKKy8qCisgKiBSVEMgYmxvY2sgcmVnaXN0ZXIgb2Zmc2V0cyAodXNlIFRXTF9NT0RVTEVfUlRDKQorICovCitlbnVtIHsKKwlSRUdfU0VDT05EU19SRUcgPSAwLAorCVJFR19NSU5VVEVTX1JFRywKKwlSRUdfSE9VUlNfUkVHLAorCVJFR19EQVlTX1JFRywKKwlSRUdfTU9OVEhTX1JFRywKKwlSRUdfWUVBUlNfUkVHLAorCVJFR19XRUVLU19SRUcsCisKKwlSRUdfQUxBUk1fU0VDT05EU19SRUcsCisJUkVHX0FMQVJNX01JTlVURVNfUkVHLAorCVJFR19BTEFSTV9IT1VSU19SRUcsCisJUkVHX0FMQVJNX0RBWVNfUkVHLAorCVJFR19BTEFSTV9NT05USFNfUkVHLAorCVJFR19BTEFSTV9ZRUFSU19SRUcsCisKKwlSRUdfUlRDX0NUUkxfUkVHLAorCVJFR19SVENfU1RBVFVTX1JFRywKKwlSRUdfUlRDX0lOVEVSUlVQVFNfUkVHLAorCisJUkVHX1JUQ19DT01QX0xTQl9SRUcsCisJUkVHX1JUQ19DT01QX01TQl9SRUcsCit9Oworc3RhdGljIGNvbnN0IHU4IHR3bDQwMzBfcnRjX3JlZ19tYXBbXSA9IHsKKwlbUkVHX1NFQ09ORFNfUkVHXSA9IDB4MDAsCisJW1JFR19NSU5VVEVTX1JFR10gPSAweDAxLAorCVtSRUdfSE9VUlNfUkVHXSA9IDB4MDIsCisJW1JFR19EQVlTX1JFR10gPSAweDAzLAorCVtSRUdfTU9OVEhTX1JFR10gPSAweDA0LAorCVtSRUdfWUVBUlNfUkVHXSA9IDB4MDUsCisJW1JFR19XRUVLU19SRUddID0gMHgwNiwKKworCVtSRUdfQUxBUk1fU0VDT05EU19SRUddID0gMHgwNywKKwlbUkVHX0FMQVJNX01JTlVURVNfUkVHXSA9IDB4MDgsCisJW1JFR19BTEFSTV9IT1VSU19SRUddID0gMHgwOSwKKwlbUkVHX0FMQVJNX0RBWVNfUkVHXSA9IDB4MEEsCisJW1JFR19BTEFSTV9NT05USFNfUkVHXSA9IDB4MEIsCisJW1JFR19BTEFSTV9ZRUFSU19SRUddID0gMHgwQywKKworCVtSRUdfUlRDX0NUUkxfUkVHXSA9IDB4MEQsCisJW1JFR19SVENfU1RBVFVTX1JFR10gPSAweDBFLAorCVtSRUdfUlRDX0lOVEVSUlVQVFNfUkVHXSA9IDB4MEYsCisKKwlbUkVHX1JUQ19DT01QX0xTQl9SRUddID0gMHgxMCwKKwlbUkVHX1JUQ19DT01QX01TQl9SRUddID0gMHgxMSwKK307CitzdGF0aWMgY29uc3QgdTggdHdsNjAzMF9ydGNfcmVnX21hcFtdID0geworCVtSRUdfU0VDT05EU19SRUddID0gMHgwMCwKKwlbUkVHX01JTlVURVNfUkVHXSA9IDB4MDEsCisJW1JFR19IT1VSU19SRUddID0gMHgwMiwKKwlbUkVHX0RBWVNfUkVHXSA9IDB4MDMsCisJW1JFR19NT05USFNfUkVHXSA9IDB4MDQsCisJW1JFR19ZRUFSU19SRUddID0gMHgwNSwKKwlbUkVHX1dFRUtTX1JFR10gPSAweDA2LAorCisJW1JFR19BTEFSTV9TRUNPTkRTX1JFR10gPSAweDA4LAorCVtSRUdfQUxBUk1fTUlOVVRFU19SRUddID0gMHgwOSwKKwlbUkVHX0FMQVJNX0hPVVJTX1JFR10gPSAweDBBLAorCVtSRUdfQUxBUk1fREFZU19SRUddID0gMHgwQiwKKwlbUkVHX0FMQVJNX01PTlRIU19SRUddID0gMHgwQywKKwlbUkVHX0FMQVJNX1lFQVJTX1JFR10gPSAweDBELAorCisJW1JFR19SVENfQ1RSTF9SRUddID0gMHgxMCwKKwlbUkVHX1JUQ19TVEFUVVNfUkVHXSA9IDB4MTEsCisJW1JFR19SVENfSU5URVJSVVBUU19SRUddID0gMHgxMiwKKworCVtSRUdfUlRDX0NPTVBfTFNCX1JFR10gPSAweDEzLAorCVtSRUdfUlRDX0NPTVBfTVNCX1JFR10gPSAweDE0LAorfTsKKworLyogUlRDX0NUUkxfUkVHIGJpdGZpZWxkcyAqLworI2RlZmluZSBCSVRfUlRDX0NUUkxfUkVHX1NUT1BfUlRDX00gICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQklUX1JUQ19DVFJMX1JFR19ST1VORF8zMFNfTSAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEJJVF9SVENfQ1RSTF9SRUdfQVVUT19DT01QX00gICAgICAgICAgICAgMHgwNAorI2RlZmluZSBCSVRfUlRDX0NUUkxfUkVHX01PREVfMTJfMjRfTSAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklUX1JUQ19DVFJMX1JFR19URVNUX01PREVfTSAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJJVF9SVENfQ1RSTF9SRUdfU0VUXzMyX0NPVU5URVJfTSAgICAgICAgMHgyMAorI2RlZmluZSBCSVRfUlRDX0NUUkxfUkVHX0dFVF9USU1FX00gICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQklUX1JUQ19DVFJMX1JFR19SVENfVl9PUFQgICAgICAgICAgICAgICAweDgwCisKKy8qIFJUQ19TVEFUVVNfUkVHIGJpdGZpZWxkcyAqLworI2RlZmluZSBCSVRfUlRDX1NUQVRVU19SRUdfUlVOX00gICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQklUX1JUQ19TVEFUVVNfUkVHXzFTX0VWRU5UX00gICAgICAgICAgICAweDA0CisjZGVmaW5lIEJJVF9SVENfU1RBVFVTX1JFR18xTV9FVkVOVF9NICAgICAgICAgICAgMHgwOAorI2RlZmluZSBCSVRfUlRDX1NUQVRVU19SRUdfMUhfRVZFTlRfTSAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQklUX1JUQ19TVEFUVVNfUkVHXzFEX0VWRU5UX00gICAgICAgICAgICAweDIwCisjZGVmaW5lIEJJVF9SVENfU1RBVFVTX1JFR19BTEFSTV9NICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBCSVRfUlRDX1NUQVRVU19SRUdfUE9XRVJfVVBfTSAgICAgICAgICAgIDB4ODAKKworLyogUlRDX0lOVEVSUlVQVFNfUkVHIGJpdGZpZWxkcyAqLworI2RlZmluZSBCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0VWRVJZX00gICAgICAgICAgIDB4MDMKKyNkZWZpbmUgQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9USU1FUl9NICAgICAgICAweDA0CisjZGVmaW5lIEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfQUxBUk1fTSAgICAgICAgMHgwOAorCisKKy8qIFJFR19TRUNPTkRTX1JFRyB0aHJvdWdoIFJFR19ZRUFSU19SRUcgaXMgaG93IG1hbnkgcmVnaXN0ZXJzPyAqLworI2RlZmluZSBBTExfVElNRV9SRUdTCQk2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdTggICpydGNfcmVnX21hcDsKKworLyoKKyAqIFN1cHBvcnRzIDEgYnl0ZSByZWFkIGZyb20gVFdMIFJUQyByZWdpc3Rlci4KKyAqLworc3RhdGljIGludCB0d2xfcnRjX3JlYWRfdTgodTggKmRhdGEsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTF9NT0RVTEVfUlRDLCBkYXRhLCAocnRjX3JlZ19tYXBbcmVnXSkpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoInR3bF9ydGM6IENvdWxkIG5vdCByZWFkIFRXTCIKKwkJICAgICAgICJyZWdpc3RlciAlWCAtIGVycm9yICVkXG4iLCByZWcsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFN1cHBvcnRzIDEgYnl0ZSB3cml0ZSB0byBUV0wgUlRDIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCB0d2xfcnRjX3dyaXRlX3U4KHU4IGRhdGEsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1JUQywgZGF0YSwgKHJ0Y19yZWdfbWFwW3JlZ10pKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJ0d2xfcnRjOiBDb3VsZCBub3Qgd3JpdGUgVFdMIgorCQkgICAgICAgInJlZ2lzdGVyICVYIC0gZXJyb3IgJWRcbiIsIHJlZywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2FjaGUgdGhlIHZhbHVlIGZvciB0aW1lci9hbGFybSBpbnRlcnJ1cHRzIHJlZ2lzdGVyOyB0aGlzIGlzCisgKiBvbmx5IGNoYW5nZWQgYnkgY2FsbGVycyBob2xkaW5nIHJ0YyBvcHMgbG9jayAob3IgcmVzdW1lKS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcnRjX2lycV9iaXRzOworCisvKgorICogRW5hYmxlIDEvc2Vjb25kIHVwZGF0ZSBhbmQvb3IgYWxhcm0gaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGludCBzZXRfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJaW50IHJldDsKKworCS8qIGlmIHRoZSBiaXQgaXMgc2V0LCByZXR1cm4gZnJvbSBoZXJlICovCisJaWYgKHJ0Y19pcnFfYml0cyAmIGJpdCkKKwkJcmV0dXJuIDA7CisKKwl2YWwgPSBydGNfaXJxX2JpdHMgfCBiaXQ7CisJdmFsICY9IH5CSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0VWRVJZX007CisJcmV0ID0gdHdsX3J0Y193cml0ZV91OCh2YWwsIFJFR19SVENfSU5URVJSVVBUU19SRUcpOworCWlmIChyZXQgPT0gMCkKKwkJcnRjX2lycV9iaXRzID0gdmFsOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERpc2FibGUgdXBkYXRlIGFuZC9vciBhbGFybSBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgaW50IG1hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJaW50IHJldDsKKworCS8qIGlmIHRoZSBiaXQgaXMgY2xlYXIsIHJldHVybiBmcm9tIGhlcmUgKi8KKwlpZiAoIShydGNfaXJxX2JpdHMgJiBiaXQpKQorCQlyZXR1cm4gMDsKKworCXZhbCA9IHJ0Y19pcnFfYml0cyAmIH5iaXQ7CisJcmV0ID0gdHdsX3J0Y193cml0ZV91OCh2YWwsIFJFR19SVENfSU5URVJSVVBUU19SRUcpOworCWlmIChyZXQgPT0gMCkKKwkJcnRjX2lycV9iaXRzID0gdmFsOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0d2xfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBlbmFibGVkKQoreworCWludCByZXQ7CisKKwlpZiAoZW5hYmxlZCkKKwkJcmV0ID0gc2V0X3J0Y19pcnFfYml0KEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfQUxBUk1fTSk7CisJZWxzZQorCQlyZXQgPSBtYXNrX3J0Y19pcnFfYml0KEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfQUxBUk1fTSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2V0cyBjdXJyZW50IFRXTCBSVEMgdGltZSBhbmQgZGF0ZSBwYXJhbWV0ZXJzLgorICoKKyAqIFRoZSBSVEMncyB0aW1lL2FsYXJtIHJlcHJlc2VudGF0aW9uIGlzIG5vdCB3aGF0IGdtdGltZSgzKSByZXF1aXJlcworICogTGludXggdG8gdXNlOgorICoKKyAqICAtIE1vbnRocyBhcmUgMS4uMTIgdnMgTGludXggMC0xMQorICogIC0gWWVhcnMgYXJlIDAuLjk5IHZzIExpbnV4IDE5MDAuLk4gKHdlIGFzc3VtZSAyMXN0IGNlbnR1cnkpCisgKi8KK3N0YXRpYyBpbnQgdHdsX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGNoYXIgcnRjX2RhdGFbQUxMX1RJTUVfUkVHUyArIDFdOworCWludCByZXQ7CisJdTggc2F2ZV9jb250cm9sOworCXU4IHJ0Y19jb250cm9sOworCisJcmV0ID0gdHdsX3J0Y19yZWFkX3U4KCZzYXZlX2NvbnRyb2wsIFJFR19SVENfQ1RSTF9SRUcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHJlYWRpbmcgQ1RSTF9SRUcsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogZm9yIHR3bDYwMzAvMzIgbWFrZSBzdXJlIEJJVF9SVENfQ1RSTF9SRUdfR0VUX1RJTUVfTSBpcyBjbGVhciAqLworCWlmICh0d2xfY2xhc3NfaXNfNjAzMCgpKSB7CisJCWlmIChzYXZlX2NvbnRyb2wgJiBCSVRfUlRDX0NUUkxfUkVHX0dFVF9USU1FX00pIHsKKwkJCXNhdmVfY29udHJvbCAmPSB+QklUX1JUQ19DVFJMX1JFR19HRVRfVElNRV9NOworCQkJcmV0ID0gdHdsX3J0Y193cml0ZV91OChzYXZlX2NvbnRyb2wsIFJFR19SVENfQ1RSTF9SRUcpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKGRldiwgIiVzIGNsciBHRVRfVElNRSwgZXJyb3IgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDb3B5IFJUQyBjb3VudGluZyByZWdpc3RlcnMgdG8gc3RhdGljIHJlZ2lzdGVycyBvciBsYXRjaGVzICovCisJcnRjX2NvbnRyb2wgPSBzYXZlX2NvbnRyb2wgfCBCSVRfUlRDX0NUUkxfUkVHX0dFVF9USU1FX007CisKKwkvKiBmb3IgdHdsNjAzMC8zMiBlbmFibGUgcmVhZCBhY2Nlc3MgdG8gc3RhdGljIHNoYWRvd2VkIHJlZ2lzdGVycyAqLworCWlmICh0d2xfY2xhc3NfaXNfNjAzMCgpKQorCQlydGNfY29udHJvbCB8PSBCSVRfUlRDX0NUUkxfUkVHX1JUQ19WX09QVDsKKworCXJldCA9IHR3bF9ydGNfd3JpdGVfdTgocnRjX2NvbnRyb2wsIFJFR19SVENfQ1RSTF9SRUcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHdyaXRpbmcgQ1RSTF9SRUcsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB0d2xfaTJjX3JlYWQoVFdMX01PRFVMRV9SVEMsIHJ0Y19kYXRhLAorCQkJKHJ0Y19yZWdfbWFwW1JFR19TRUNPTkRTX1JFR10pLCBBTExfVElNRV9SRUdTKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHJlYWRpbmcgZGF0YSwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGZvciB0d2w2MDMwIHJlc3RvcmUgb3JpZ2luYWwgc3RhdGUgb2YgcnRjIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlpZiAodHdsX2NsYXNzX2lzXzYwMzAoKSkgeworCQlyZXQgPSB0d2xfcnRjX3dyaXRlX3U4KHNhdmVfY29udHJvbCwgUkVHX1JUQ19DVFJMX1JFRyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIiVzOiByZXN0b3JlIENUUkxfUkVHLCBlcnJvciAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwl0bS0+dG1fc2VjID0gYmNkMmJpbihydGNfZGF0YVswXSk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4ocnRjX2RhdGFbMV0pOworCXRtLT50bV9ob3VyID0gYmNkMmJpbihydGNfZGF0YVsyXSk7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHJ0Y19kYXRhWzNdKTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbihydGNfZGF0YVs0XSkgLSAxOworCXRtLT50bV95ZWFyID0gYmNkMmJpbihydGNfZGF0YVs1XSkgKyAxMDA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR3bF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sOworCXVuc2lnbmVkIGNoYXIgcnRjX2RhdGFbQUxMX1RJTUVfUkVHUyArIDFdOworCWludCByZXQ7CisKKwlydGNfZGF0YVsxXSA9IGJpbjJiY2QodG0tPnRtX3NlYyk7CisJcnRjX2RhdGFbMl0gPSBiaW4yYmNkKHRtLT50bV9taW4pOworCXJ0Y19kYXRhWzNdID0gYmluMmJjZCh0bS0+dG1faG91cik7CisJcnRjX2RhdGFbNF0gPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKwlydGNfZGF0YVs1XSA9IGJpbjJiY2QodG0tPnRtX21vbiArIDEpOworCXJ0Y19kYXRhWzZdID0gYmluMmJjZCh0bS0+dG1feWVhciAtIDEwMCk7CisKKwkvKiBTdG9wIFJUQyB3aGlsZSB1cGRhdGluZyB0aGUgVEMgcmVnaXN0ZXJzICovCisJcmV0ID0gdHdsX3J0Y19yZWFkX3U4KCZzYXZlX2NvbnRyb2wsIFJFR19SVENfQ1RSTF9SRUcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXNhdmVfY29udHJvbCAmPSB+QklUX1JUQ19DVFJMX1JFR19TVE9QX1JUQ19NOworCXJldCA9IHR3bF9ydGNfd3JpdGVfdTgoc2F2ZV9jb250cm9sLCBSRUdfUlRDX0NUUkxfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiB1cGRhdGUgYWxsIHRoZSB0aW1lIHJlZ2lzdGVycyBpbiBvbmUgc2hvdCAqLworCXJldCA9IHR3bF9pMmNfd3JpdGUoVFdMX01PRFVMRV9SVEMsIHJ0Y19kYXRhLAorCQkocnRjX3JlZ19tYXBbUkVHX1NFQ09ORFNfUkVHXSksIEFMTF9USU1FX1JFR1MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicnRjX3NldF90aW1lIGVycm9yICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTdGFydCBiYWNrIFJUQyAqLworCXNhdmVfY29udHJvbCB8PSBCSVRfUlRDX0NUUkxfUkVHX1NUT1BfUlRDX007CisJcmV0ID0gdHdsX3J0Y193cml0ZV91OChzYXZlX2NvbnRyb2wsIFJFR19SVENfQ1RSTF9SRUcpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdldHMgY3VycmVudCBUV0wgUlRDIGFsYXJtIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgdHdsX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsbSkKK3sKKwl1bnNpZ25lZCBjaGFyIHJ0Y19kYXRhW0FMTF9USU1FX1JFR1MgKyAxXTsKKwlpbnQgcmV0OworCisJcmV0ID0gdHdsX2kyY19yZWFkKFRXTF9NT0RVTEVfUlRDLCBydGNfZGF0YSwKKwkJCShydGNfcmVnX21hcFtSRUdfQUxBUk1fU0VDT05EU19SRUddKSwgQUxMX1RJTUVfUkVHUyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJydGNfcmVhZF9hbGFybSBlcnJvciAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzb21lIG9mIHRoZXNlIGZpZWxkcyBtYXkgYmUgd2lsZGNhcmQvIm1hdGNoIGFsbCIgKi8KKwlhbG0tPnRpbWUudG1fc2VjID0gYmNkMmJpbihydGNfZGF0YVswXSk7CisJYWxtLT50aW1lLnRtX21pbiA9IGJjZDJiaW4ocnRjX2RhdGFbMV0pOworCWFsbS0+dGltZS50bV9ob3VyID0gYmNkMmJpbihydGNfZGF0YVsyXSk7CisJYWxtLT50aW1lLnRtX21kYXkgPSBiY2QyYmluKHJ0Y19kYXRhWzNdKTsKKwlhbG0tPnRpbWUudG1fbW9uID0gYmNkMmJpbihydGNfZGF0YVs0XSkgLSAxOworCWFsbS0+dGltZS50bV95ZWFyID0gYmNkMmJpbihydGNfZGF0YVs1XSkgKyAxMDA7CisKKwkvKiByZXBvcnQgY2FjaGVkIGFsYXJtIGVuYWJsZSBzdGF0ZSAqLworCWlmIChydGNfaXJxX2JpdHMgJiBCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX0FMQVJNX00pCisJCWFsbS0+ZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR3bF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsbSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFsYXJtX2RhdGFbQUxMX1RJTUVfUkVHUyArIDFdOworCWludCByZXQ7CisKKwlyZXQgPSB0d2xfcnRjX2FsYXJtX2lycV9lbmFibGUoZGV2LCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWFsYXJtX2RhdGFbMV0gPSBiaW4yYmNkKGFsbS0+dGltZS50bV9zZWMpOworCWFsYXJtX2RhdGFbMl0gPSBiaW4yYmNkKGFsbS0+dGltZS50bV9taW4pOworCWFsYXJtX2RhdGFbM10gPSBiaW4yYmNkKGFsbS0+dGltZS50bV9ob3VyKTsKKwlhbGFybV9kYXRhWzRdID0gYmluMmJjZChhbG0tPnRpbWUudG1fbWRheSk7CisJYWxhcm1fZGF0YVs1XSA9IGJpbjJiY2QoYWxtLT50aW1lLnRtX21vbiArIDEpOworCWFsYXJtX2RhdGFbNl0gPSBiaW4yYmNkKGFsbS0+dGltZS50bV95ZWFyIC0gMTAwKTsKKworCS8qIHVwZGF0ZSBhbGwgdGhlIGFsYXJtIHJlZ2lzdGVycyBpbiBvbmUgc2hvdCAqLworCXJldCA9IHR3bF9pMmNfd3JpdGUoVFdMX01PRFVMRV9SVEMsIGFsYXJtX2RhdGEsCisJCShydGNfcmVnX21hcFtSRUdfQUxBUk1fU0VDT05EU19SRUddKSwgQUxMX1RJTUVfUkVHUyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInJ0Y19zZXRfYWxhcm0gZXJyb3IgJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChhbG0tPmVuYWJsZWQpCisJCXJldCA9IHR3bF9ydGNfYWxhcm1faXJxX2VuYWJsZShkZXYsIDEpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0d2xfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpydGMpCit7CisJdW5zaWduZWQgbG9uZyBldmVudHM7CisJaW50IHJldCA9IElSUV9OT05FOworCWludCByZXM7CisJdTggcmRfcmVnOworCisJcmVzID0gdHdsX3J0Y19yZWFkX3U4KCZyZF9yZWcsIFJFR19SVENfU1RBVFVTX1JFRyk7CisJaWYgKHJlcykKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBGaWd1cmUgb3V0IHNvdXJjZSBvZiBpbnRlcnJ1cHQ6IEFMQVJNIG9yIFRJTUVSIGluIFJUQ19TVEFUVVNfUkVHLgorCSAqIG9ubHkgb25lIChBTEFSTSBvciBSVEMpIGludGVycnVwdCBzb3VyY2UgbWF5IGJlIGVuYWJsZWQKKwkgKiBhdCB0aW1lLCB3ZSBhbHNvIGNvdWxkIGNoZWNrIG91ciByZXN1bHRzCisJICogYnkgcmVhZGluZyBSVFNfSU5URVJSVVBUU19SRUdJU1RFUltJVF9USU1FUixJVF9BTEFSTV0KKwkgKi8KKwlpZiAocmRfcmVnICYgQklUX1JUQ19TVEFUVVNfUkVHX0FMQVJNX00pCisJCWV2ZW50cyA9IFJUQ19JUlFGIHwgUlRDX0FGOworCWVsc2UKKwkJZXZlbnRzID0gUlRDX0lSUUYgfCBSVENfUEY7CisKKwlyZXMgPSB0d2xfcnRjX3dyaXRlX3U4KEJJVF9SVENfU1RBVFVTX1JFR19BTEFSTV9NLAorCQkJCSAgIFJFR19SVENfU1RBVFVTX1JFRyk7CisJaWYgKHJlcykKKwkJZ290byBvdXQ7CisKKwlpZiAodHdsX2NsYXNzX2lzXzQwMzAoKSkgeworCQkvKiBDbGVhciBvbiBSZWFkIGVuYWJsZWQuIFJUQ19JVCBiaXQgb2YgVFdMNDAzMF9JTlRfUFdSX0lTUjEKKwkJICogbmVlZHMgMiByZWFkcyB0byBjbGVhciB0aGUgaW50ZXJydXB0LiBPbmUgcmVhZCBpcyBkb25lIGluCisJCSAqIGRvX3R3bF9wd3JpcnEoKS4gRG9pbmcgdGhlIHNlY29uZCByZWFkLCB0byBjbGVhcgorCQkgKiB0aGUgYml0LgorCQkgKgorCQkgKiBGSVhNRSB0aGUgcmVhc29uIFBXUl9JU1IxIG5lZWRzIGFuIGV4dHJhIHJlYWQgaXMgdGhhdAorCQkgKiBSVENfSUYgcmV0cmlnZ2VyZWQgdW50aWwgd2UgY2xlYXJlZCBSRUdfQUxBUk1fTSBhYm92ZS4KKwkJICogQnV0IHJlLXJlYWRpbmcgbGlrZSB0aGlzIGlzIGEgYmFkIGhhY2s7IGJ5IGRvaW5nIHNvIHdlCisJCSAqIHJpc2sgd3JvbmdseSBjbGVhcmluZyBzdGF0dXMgZm9yIHNvbWUgb3RoZXIgSVJRIChsb3NpbmcKKwkJICogdGhlIGludGVycnVwdCkuICBCZSBzbWFydGVyIGFib3V0IGhhbmRsaW5nIFJUQ19VRiAuLi4KKwkJICovCisJCXJlcyA9IHR3bF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9JTlQsCisJCQkmcmRfcmVnLCBUV0w0MDMwX0lOVF9QV1JfSVNSMSk7CisJCWlmIChyZXMpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBOb3RpZnkgUlRDIGNvcmUgb24gZXZlbnQgKi8KKwlydGNfdXBkYXRlX2lycShydGMsIDEsIGV2ZW50cyk7CisKKwlyZXQgPSBJUlFfSEFORExFRDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgdHdsX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHR3bF9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHR3bF9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0JPSB0d2xfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IHR3bF9ydGNfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gdHdsX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBfX2RldmluaXQgdHdsX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJdTggcmRfcmVnOworCisJaWYgKGlycSA8PSAwKQorCQlnb3RvIG91dDE7CisKKwlyZXQgPSB0d2xfcnRjX3JlYWRfdTgoJnJkX3JlZywgUkVHX1JUQ19TVEFUVVNfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQxOworCisJaWYgKHJkX3JlZyAmIEJJVF9SVENfU1RBVFVTX1JFR19QT1dFUl9VUF9NKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiUG93ZXIgdXAgcmVzZXQgZGV0ZWN0ZWQuXG4iKTsKKworCWlmIChyZF9yZWcgJiBCSVRfUlRDX1NUQVRVU19SRUdfQUxBUk1fTSkKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlBlbmRpbmcgQWxhcm0gaW50ZXJydXB0IGRldGVjdGVkLlxuIik7CisKKwkvKiBDbGVhciBSVEMgUG93ZXIgdXAgcmVzZXQgYW5kIHBlbmRpbmcgYWxhcm0gaW50ZXJydXB0cyAqLworCXJldCA9IHR3bF9ydGNfd3JpdGVfdTgocmRfcmVnLCBSRUdfUlRDX1NUQVRVU19SRUcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDE7CisKKwlpZiAodHdsX2NsYXNzX2lzXzYwMzAoKSkgeworCQl0d2w2MDMwX2ludGVycnVwdF91bm1hc2soVFdMNjAzMF9SVENfSU5UX01BU0ssCisJCQlSRUdfSU5UX01TS19MSU5FX0EpOworCQl0d2w2MDMwX2ludGVycnVwdF91bm1hc2soVFdMNjAzMF9SVENfSU5UX01BU0ssCisJCQlSRUdfSU5UX01TS19TVFNfQSk7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkVuYWJsaW5nIFRXTC1SVENcbiIpOworCXJldCA9IHR3bF9ydGNfd3JpdGVfdTgoQklUX1JUQ19DVFJMX1JFR19TVE9QX1JUQ19NLCBSRUdfUlRDX0NUUkxfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQxOworCisJLyogZW5zdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBib290bG9hZGVycyBjYW4gYmUgc3RyYW5nZSAqLworCXJldCA9IHR3bF9ydGNfd3JpdGVfdTgoMCwgUkVHX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisJaWYgKHJldCA8IDApCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRcbiIpOworCisJLyogaW5pdCBjYWNoZWQgSVJRIGVuYWJsZSBiaXRzICovCisJcmV0ID0gdHdsX3J0Y19yZWFkX3U4KCZydGNfaXJxX2JpdHMsIFJFR19SVENfSU5URVJSVVBUU19SRUcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDE7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsCisJCQkJICAmcGRldi0+ZGV2LCAmdHdsX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZWdpc3RlciBSVEMgZGV2aWNlLCBlcnIgJWxkXG4iLAorCQkJUFRSX0VSUihydGMpKTsKKwkJZ290byBvdXQxOworCX0KKworCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycSwgTlVMTCwgdHdsX3J0Y19pbnRlcnJ1cHQsCisJCQkJICAgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkgICBkZXZfbmFtZSgmcnRjLT5kZXYpLCBydGMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIklSUSBpcyBub3QgZnJlZS5cbiIpOworCQlnb3RvIG91dDI7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisJcmV0dXJuIDA7CisKK291dDI6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CitvdXQxOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEaXNhYmxlIGFsbCBUV0wgUlRDIG1vZHVsZSBpbnRlcnJ1cHRzLgorICogU2V0cyBzdGF0dXMgZmxhZyB0byBmcmVlLgorICovCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB0d2xfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCS8qIGxlYXZlIHJ0YyBydW5uaW5nLCBidXQgZGlzYWJsZSBpcnFzICovCisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJbWFza19ydGNfaXJxX2JpdChCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX0FMQVJNX00pOworCW1hc2tfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9USU1FUl9NKTsKKwlpZiAodHdsX2NsYXNzX2lzXzYwMzAoKSkgeworCQl0d2w2MDMwX2ludGVycnVwdF9tYXNrKFRXTDYwMzBfUlRDX0lOVF9NQVNLLAorCQkJUkVHX0lOVF9NU0tfTElORV9BKTsKKwkJdHdsNjAzMF9pbnRlcnJ1cHRfbWFzayhUV0w2MDMwX1JUQ19JTlRfTUFTSywKKwkJCVJFR19JTlRfTVNLX1NUU19BKTsKKwl9CisKKworCWZyZWVfaXJxKGlycSwgcnRjKTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0d2xfcnRjX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJLyogbWFzayB0aW1lciBpbnRlcnJ1cHRzLCBidXQgbGVhdmUgYWxhcm0gaW50ZXJydXB0cyBvbiB0byBlbmFibGUKKwkgICBwb3dlci1vbiB3aGVuIGFsYXJtIGlzIHRyaWdnZXJlZCAqLworCW1hc2tfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9USU1FUl9NKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBpcnFzdGF0OworCitzdGF0aWMgaW50IHR3bF9ydGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJaXJxc3RhdCA9IHJ0Y19pcnFfYml0czsKKworCW1hc2tfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9USU1FUl9NKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0d2xfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNldF9ydGNfaXJxX2JpdChpcnFzdGF0KTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgdHdsX3J0Y19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgdHdsX3J0Y19yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0d2xfcnRjX29mX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gInRpLHR3bDQwMzAtcnRjIiwgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdHdsX3J0Y19vZl9tYXRjaCk7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnR3bF9ydGMiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHdsNDAzMHJ0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IHR3bF9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh0d2xfcnRjX3JlbW92ZSksCisJLnNodXRkb3duCT0gdHdsX3J0Y19zaHV0ZG93biwKKwkuc3VzcGVuZAk9IHR3bF9ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHR3bF9ydGNfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCQk9ICJ0d2xfcnRjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gdHdsX3J0Y19vZl9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHdsX3J0Y19pbml0KHZvaWQpCit7CisJaWYgKHR3bF9jbGFzc19pc180MDMwKCkpCisJCXJ0Y19yZWdfbWFwID0gKHU4ICopIHR3bDQwMzBfcnRjX3JlZ19tYXA7CisJZWxzZQorCQlydGNfcmVnX21hcCA9ICh1OCAqKSB0d2w2MDMwX3J0Y19yZWdfbWFwOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdHdsNDAzMHJ0Y19kcml2ZXIpOworfQorbW9kdWxlX2luaXQodHdsX3J0Y19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHR3bF9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0d2w0MDMwcnRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0d2xfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgTW9udGFWaXN0YSBTb2Z0d2FyZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmJmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtdHg0OTM5LmMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBUWDQ5MzkgaW50ZXJuYWwgUlRDIGRyaXZlcgorICogQmFzZWQgb24gUkJUWDQ5eHggcGF0Y2ggZnJvbSBDRUxGIHBhdGNoIGFyY2hpdmUuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogKEMpIENvcHlyaWdodCBUT1NISUJBIENPUlBPUkFUSU9OIDIwMDUtMjAwNworICovCisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxhc20vdHh4OS90eDQ5MzkuaD4KKworc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZzsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKmdldF90eDQ5MzlydGNfcGxhdF9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZ2V0X2RydmRhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfY21kKHN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcsIGludCBjbWQpCit7CisJaW50IGkgPSAwOworCisJX19yYXdfd3JpdGVsKGNtZCwgJnJ0Y3JlZy0+Y3RsKTsKKwkvKiBUaGlzIG1pZ2h0IHRha2UgMzB1cyAobmV4dCAzMi43NjhLSHogY2xvY2spICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0JVU1kpIHsKKwkJLyogdGltZW91dCBvbiBhcHByb3guIDEwMHVzIChAIEdCVVMyMDBNSHopICovCisJCWlmIChpKysgPiAyMDAgKiAxMDApCisJCQlyZXR1cm4gLUVCVVNZOworCQljcHVfcmVsYXgoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisKKwlidWZbMF0gPSAwOworCWJ1ZlsxXSA9IDA7CisJYnVmWzJdID0gc2VjczsKKwlidWZbM10gPSBzZWNzID4+IDg7CisJYnVmWzRdID0gc2VjcyA+PiAxNjsKKwlidWZbNV0gPSBzZWNzID4+IDI0OworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5sb2NrKTsKKwlfX3Jhd193cml0ZWwoMCwgJnJ0Y3JlZy0+YWRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlfX3Jhd193cml0ZWwoYnVmW2ldLCAmcnRjcmVnLT5kYXQpOworCXJldCA9IHR4NDkzOV9ydGNfY21kKHJ0Y3JlZywKKwkJCSAgICAgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX1NFVFRJTUUgfAorCQkJICAgICAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQUxNRSkpOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBsb25nIHNlYzsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5sb2NrKTsKKwlyZXQgPSB0eDQ5MzlfcnRjX2NtZChydGNyZWcsCisJCQkgICAgIFRYNDkzOV9SVENDVExfQ09NTUFORF9HRVRUSU1FIHwKKwkJCSAgICAgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0FMTUUpKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKwlfX3Jhd193cml0ZWwoMiwgJnJ0Y3JlZy0+YWRyKTsKKwlmb3IgKGkgPSAyOyBpIDwgNjsgaSsrKQorCQlidWZbaV0gPSBfX3Jhd19yZWFkbCgmcnRjcmVnLT5kYXQpOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPmxvY2spOworCXNlYyA9IChidWZbNV0gPDwgMjQpIHwgKGJ1Zls0XSA8PCAxNikgfCAoYnVmWzNdIDw8IDgpIHwgYnVmWzJdOworCXJ0Y190aW1lX3RvX3RtKHNlYywgdG0pOworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIGNoYXIgYnVmWzZdOworCisJaWYgKGFscm0tPnRpbWUudG1fc2VjIDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX21pbiA8IDAgfHwKKwkgICAgYWxybS0+dGltZS50bV9ob3VyIDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX21kYXkgPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1fbW9uIDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX3llYXIgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlydGNfdG1fdG9fdGltZSgmYWxybS0+dGltZSwgJnNlYyk7CisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSAwOworCWJ1ZlsyXSA9IHNlYzsKKwlidWZbM10gPSBzZWMgPj4gODsKKwlidWZbNF0gPSBzZWMgPj4gMTY7CisJYnVmWzVdID0gc2VjID4+IDI0OworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5sb2NrKTsKKwlfX3Jhd193cml0ZWwoMCwgJnJ0Y3JlZy0+YWRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlfX3Jhd193cml0ZWwoYnVmW2ldLCAmcnRjcmVnLT5kYXQpOworCXJldCA9IHR4NDkzOV9ydGNfY21kKHJ0Y3JlZywgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX1NFVEFMQVJNIHwKKwkJCSAgICAgKGFscm0tPmVuYWJsZWQgPyBUWDQ5MzlfUlRDQ1RMX0FMTUUgOiAwKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyBzZWM7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisJdTMyIGN0bDsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5sb2NrKTsKKwlyZXQgPSB0eDQ5MzlfcnRjX2NtZChydGNyZWcsCisJCQkgICAgIFRYNDkzOV9SVENDVExfQ09NTUFORF9HRVRBTEFSTSB8CisJCQkgICAgIChfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpICYgVFg0OTM5X1JUQ0NUTF9BTE1FKSk7CisJaWYgKHJldCkgeworCQlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJX19yYXdfd3JpdGVsKDIsICZydGNyZWctPmFkcik7CisJZm9yIChpID0gMjsgaSA8IDY7IGkrKykKKwkJYnVmW2ldID0gX19yYXdfcmVhZGwoJnJ0Y3JlZy0+ZGF0KTsKKwljdGwgPSBfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpOworCWFscm0tPmVuYWJsZWQgPSAoY3RsICYgVFg0OTM5X1JUQ0NUTF9BTE1FKSA/IDEgOiAwOworCWFscm0tPnBlbmRpbmcgPSAoY3RsICYgVFg0OTM5X1JUQ0NUTF9BTE1EKSA/IDEgOiAwOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPmxvY2spOworCXNlYyA9IChidWZbNV0gPDwgMjQpIHwgKGJ1Zls0XSA8PCAxNikgfCAoYnVmWzNdIDw8IDgpIHwgYnVmWzJdOworCXJ0Y190aW1lX3RvX3RtKHNlYywgJmFscm0tPnRpbWUpOworCXJldHVybiBydGNfdmFsaWRfdG0oJmFscm0tPnRpbWUpOworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+bG9jayk7CisJdHg0OTM5X3J0Y19jbWQocGRhdGEtPnJ0Y3JlZywKKwkJICAgICAgIFRYNDkzOV9SVENDVExfQ09NTUFORF9OT1AgfAorCQkgICAgICAgKGVuYWJsZWQgPyBUWDQ5MzlfUlRDQ1RMX0FMTUUgOiAwKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0eDQ5MzlfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2X2lkKTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IFJUQ19JUlFGOworCisJc3Bpbl9sb2NrKCZwZGF0YS0+bG9jayk7CisJaWYgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0FMTUQpIHsKKwkJZXZlbnRzIHw9IFJUQ19BRjsKKwkJdHg0OTM5X3J0Y19jbWQocnRjcmVnLCBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfTk9QKTsKKwl9CisJc3Bpbl91bmxvY2soJnBkYXRhLT5sb2NrKTsKKwlpZiAobGlrZWx5KHBkYXRhLT5ydGMpKQorCQlydGNfdXBkYXRlX2lycShwZGF0YS0+cnRjLCAxLCBldmVudHMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHR4NDkzOV9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJCT0gdHg0OTM5X3J0Y19yZWFkX3RpbWUsCisJLnJlYWRfYWxhcm0JCT0gdHg0OTM5X3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JCT0gdHg0OTM5X3J0Y19zZXRfYWxhcm0sCisJLnNldF9tbXNzCQk9IHR4NDkzOV9ydGNfc2V0X21tc3MsCisJLmFsYXJtX2lycV9lbmFibGUJPSB0eDQ5MzlfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgc3NpemVfdCB0eDQ5MzlfcnRjX252cmFtX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCSAgICAgY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlzc2l6ZV90IGNvdW50OworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPmxvY2spOworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBUWDQ5MzlfUlRDX1JFR19SQU1TSVpFOworCSAgICAgY291bnQrKywgc2l6ZS0tKSB7CisJCV9fcmF3X3dyaXRlbChwb3MrKywgJnJ0Y3JlZy0+YWRyKTsKKwkJKmJ1ZisrID0gX19yYXdfcmVhZGwoJnJ0Y3JlZy0+ZGF0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+bG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCB0eDQ5MzlfcnRjX252cmFtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJICAgICAgY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlzc2l6ZV90IGNvdW50OworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPmxvY2spOworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBUWDQ5MzlfUlRDX1JFR19SQU1TSVpFOworCSAgICAgY291bnQrKywgc2l6ZS0tKSB7CisJCV9fcmF3X3dyaXRlbChwb3MrKywgJnJ0Y3JlZy0+YWRyKTsKKwkJX19yYXdfd3JpdGVsKCpidWYrKywgJnJ0Y3JlZy0+ZGF0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+bG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgdHg0OTM5X3J0Y19udnJhbV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJudnJhbSIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IFRYNDkzOV9SVENfUkVHX1JBTVNJWkUsCisJLnJlYWQgPSB0eDQ5MzlfcnRjX252cmFtX3JlYWQsCisJLndyaXRlID0gdHg0OTM5X3J0Y19udnJhbV93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkzOV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJxLCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlwZGF0YS0+cnRjcmVnID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghcGRhdGEtPnJ0Y3JlZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNwaW5fbG9ja19pbml0KCZwZGF0YS0+bG9jayk7CisJdHg0OTM5X3J0Y19jbWQocGRhdGEtPnJ0Y3JlZywgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX05PUCk7CisJaWYgKGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCB0eDQ5MzlfcnRjX2ludGVycnVwdCwKKwkJCSAgICAgMCwgcGRldi0+bmFtZSwgJnBkZXYtPmRldikgPCAwKQorCQlyZXR1cm4gLUVCVVNZOworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkgICZ0eDQ5MzlfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKwlwZGF0YS0+cnRjID0gcnRjOworCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZ0eDQ5MzlfcnRjX252cmFtX2F0dHIpOworCWlmIChyZXQpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHR4NDkzOV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmdHg0OTM5X3J0Y19udnJhbV9hdHRyKTsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7CisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPmxvY2spOworCXR4NDkzOV9ydGNfY21kKHBkYXRhLT5ydGNyZWcsIFRYNDkzOV9SVENDVExfQ09NTUFORF9OT1ApOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0eDQ5MzlfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHR4NDkzOV9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidHg0OTM5cnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkzOXJ0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmdHg0OTM5X3J0Y19kcml2ZXIsIHR4NDkzOV9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdHg0OTM5cnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHg0OTM5X3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0eDQ5MzlydGNfaW5pdCk7Cittb2R1bGVfZXhpdCh0eDQ5MzlydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUWDQ5MzkgaW50ZXJuYWwgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0eDQ5MzlydGMiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy12MzAyMC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXYzMDIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhNWQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy12MzAyMC5jCkBAIC0wLDAgKzEsNDAxIEBACisvKiBkcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiA4RCBUZWNobm9sb2dpZXMgaW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0IENvbXB1bGFiIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERyaXZlciBmb3IgdGhlIFYzMDIwIFJUQworICoKKyAqIENoYW5nZWxvZzoKKyAqCisgKiAgMTAtTWF5LTIwMDY6IFJhcGhhZWwgQXNzZW5hdCA8cmFwaEA4ZC5jb20+CisgKgkJCQktIENvbnZlcnRlZCB0byBwbGF0Zm9ybSBkcml2ZXIKKyAqCQkJCS0gVXNlIHRoZSBnZW5lcmljIHJ0YyBjbGFzcworICoKKyAqICA/Py0/Pz8tMjAwNDogU29tZW9uZSBhdCBDb21wdWxhYgorICogIAkJCS0gSW5pdGlhbCBkcml2ZXIgY3JlYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLXYzMDIwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI3VuZGVmIERFQlVHCisKK3N0cnVjdCB2MzAyMDsKKworc3RydWN0IHYzMDIwX2NoaXBfb3BzIHsKKwlpbnQgKCptYXBfaW8pKHN0cnVjdCB2MzAyMCAqY2hpcCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICAgICAgc3RydWN0IHYzMDIwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKKwl2b2lkICgqdW5tYXBfaW8pKHN0cnVjdCB2MzAyMCAqY2hpcCk7CisJdW5zaWduZWQgY2hhciAoKnJlYWRfYml0KShzdHJ1Y3QgdjMwMjAgKmNoaXApOworCXZvaWQgKCp3cml0ZV9iaXQpKHN0cnVjdCB2MzAyMCAqY2hpcCwgdW5zaWduZWQgY2hhciBiaXQpOworfTsKKworI2RlZmluZSBWMzAyMF9DUwkwCisjZGVmaW5lIFYzMDIwX1dSCTEKKyNkZWZpbmUgVjMwMjBfUkQJMgorI2RlZmluZSBWMzAyMF9JTwkzCisKK3N0cnVjdCB2MzAyMF9ncGlvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBncGlvOworfTsKKworc3RydWN0IHYzMDIwIHsKKwkvKiBNTUlPIGFjY2VzcyAqLworCXZvaWQgX19pb21lbSAqaW9hZGRyZXNzOworCWludCBsZWZ0c2hpZnQ7CisKKwkvKiBHUElPIGFjY2VzcyAqLworCXN0cnVjdCB2MzAyMF9ncGlvICpncGlvOworCisJc3RydWN0IHYzMDIwX2NoaXBfb3BzICpvcHM7CisKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworfTsKKworCitzdGF0aWMgaW50IHYzMDIwX21taW9fbWFwKHN0cnVjdCB2MzAyMCAqY2hpcCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgc3RydWN0IHYzMDIwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCWlmIChwZGV2LT5udW1fcmVzb3VyY2VzICE9IDEpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocGRldi0+cmVzb3VyY2VbMF0uZmxhZ3MgIT0gSU9SRVNPVVJDRV9NRU0pCisJCXJldHVybiAtRUJVU1k7CisKKwljaGlwLT5sZWZ0c2hpZnQgPSBwZGF0YS0+bGVmdHNoaWZ0OworCWNoaXAtPmlvYWRkcmVzcyA9IGlvcmVtYXAocGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIDEpOworCWlmIChjaGlwLT5pb2FkZHJlc3MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2MzAyMF9tbWlvX3VubWFwKHN0cnVjdCB2MzAyMCAqY2hpcCkKK3sKKwlpb3VubWFwKGNoaXAtPmlvYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHYzMDIwX21taW9fd3JpdGVfYml0KHN0cnVjdCB2MzAyMCAqY2hpcCwgdW5zaWduZWQgY2hhciBiaXQpCit7CisJd3JpdGVsKGJpdCA8PCBjaGlwLT5sZWZ0c2hpZnQsIGNoaXAtPmlvYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHYzMDIwX21taW9fcmVhZF9iaXQoc3RydWN0IHYzMDIwICpjaGlwKQoreworCXJldHVybiAhIShyZWFkbChjaGlwLT5pb2FkZHJlc3MpICYgKDEgPDwgY2hpcC0+bGVmdHNoaWZ0KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjMwMjBfY2hpcF9vcHMgdjMwMjBfbW1pb19vcHMgPSB7CisJLm1hcF9pbwkJPSB2MzAyMF9tbWlvX21hcCwKKwkudW5tYXBfaW8JPSB2MzAyMF9tbWlvX3VubWFwLAorCS5yZWFkX2JpdAk9IHYzMDIwX21taW9fcmVhZF9iaXQsCisJLndyaXRlX2JpdAk9IHYzMDIwX21taW9fd3JpdGVfYml0LAorfTsKKworc3RhdGljIHN0cnVjdCB2MzAyMF9ncGlvIHYzMDIwX2dwaW9bXSA9IHsKKwl7ICJSVEMgQ1MiLCAwIH0sCisJeyAiUlRDIFdSIiwgMCB9LAorCXsgIlJUQyBSRCIsIDAgfSwKKwl7ICJSVEMgSU8iLCAwIH0sCit9OworCitzdGF0aWMgaW50IHYzMDIwX2dwaW9fbWFwKHN0cnVjdCB2MzAyMCAqY2hpcCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgc3RydWN0IHYzMDIwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCWludCBpLCBlcnI7CisKKwl2MzAyMF9ncGlvW1YzMDIwX0NTXS5ncGlvID0gcGRhdGEtPmdwaW9fY3M7CisJdjMwMjBfZ3Bpb1tWMzAyMF9XUl0uZ3BpbyA9IHBkYXRhLT5ncGlvX3dyOworCXYzMDIwX2dwaW9bVjMwMjBfUkRdLmdwaW8gPSBwZGF0YS0+Z3Bpb19yZDsKKwl2MzAyMF9ncGlvW1YzMDIwX0lPXS5ncGlvID0gcGRhdGEtPmdwaW9faW87CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2MzAyMF9ncGlvKTsgaSsrKSB7CisJCWVyciA9IGdwaW9fcmVxdWVzdCh2MzAyMF9ncGlvW2ldLmdwaW8sIHYzMDIwX2dwaW9baV0ubmFtZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9yZXF1ZXN0OworCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dCh2MzAyMF9ncGlvW2ldLmdwaW8sIDEpOworCX0KKworCWNoaXAtPmdwaW8gPSB2MzAyMF9ncGlvOworCisJcmV0dXJuIDA7CisKK2Vycl9yZXF1ZXN0OgorCXdoaWxlICgtLWkgPj0gMCkKKwkJZ3Bpb19mcmVlKHYzMDIwX2dwaW9baV0uZ3Bpbyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB2MzAyMF9ncGlvX3VubWFwKHN0cnVjdCB2MzAyMCAqY2hpcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHYzMDIwX2dwaW8pOyBpKyspCisJCWdwaW9fZnJlZSh2MzAyMF9ncGlvW2ldLmdwaW8pOworfQorCitzdGF0aWMgdm9pZCB2MzAyMF9ncGlvX3dyaXRlX2JpdChzdHJ1Y3QgdjMwMjAgKmNoaXAsIHVuc2lnbmVkIGNoYXIgYml0KQoreworCWdwaW9fZGlyZWN0aW9uX291dHB1dChjaGlwLT5ncGlvW1YzMDIwX0lPXS5ncGlvLCBiaXQpOworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmdwaW9bVjMwMjBfQ1NdLmdwaW8sIDApOworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmdwaW9bVjMwMjBfV1JdLmdwaW8sIDApOworCXVkZWxheSgxKTsKKwlncGlvX3NldF92YWx1ZShjaGlwLT5ncGlvW1YzMDIwX1dSXS5ncGlvLCAxKTsKKwlncGlvX3NldF92YWx1ZShjaGlwLT5ncGlvW1YzMDIwX0NTXS5ncGlvLCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdjMwMjBfZ3Bpb19yZWFkX2JpdChzdHJ1Y3QgdjMwMjAgKmNoaXApCit7CisJaW50IGJpdDsKKworCWdwaW9fZGlyZWN0aW9uX2lucHV0KGNoaXAtPmdwaW9bVjMwMjBfSU9dLmdwaW8pOworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmdwaW9bVjMwMjBfQ1NdLmdwaW8sIDApOworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmdwaW9bVjMwMjBfUkRdLmdwaW8sIDApOworCXVkZWxheSgxKTsKKwliaXQgPSAhIWdwaW9fZ2V0X3ZhbHVlKGNoaXAtPmdwaW9bVjMwMjBfSU9dLmdwaW8pOworCXVkZWxheSgxKTsKKwlncGlvX3NldF92YWx1ZShjaGlwLT5ncGlvW1YzMDIwX1JEXS5ncGlvLCAxKTsKKwlncGlvX3NldF92YWx1ZShjaGlwLT5ncGlvW1YzMDIwX0NTXS5ncGlvLCAxKTsKKworCXJldHVybiBiaXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjMwMjBfY2hpcF9vcHMgdjMwMjBfZ3Bpb19vcHMgPSB7CisJLm1hcF9pbwkJPSB2MzAyMF9ncGlvX21hcCwKKwkudW5tYXBfaW8JPSB2MzAyMF9ncGlvX3VubWFwLAorCS5yZWFkX2JpdAk9IHYzMDIwX2dwaW9fcmVhZF9iaXQsCisJLndyaXRlX2JpdAk9IHYzMDIwX2dwaW9fd3JpdGVfYml0LAorfTsKKworc3RhdGljIHZvaWQgdjMwMjBfc2V0X3JlZyhzdHJ1Y3QgdjMwMjAgKmNoaXAsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCXVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCXRtcCA9IGFkZHJlc3M7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQljaGlwLT5vcHMtPndyaXRlX2JpdChjaGlwLCAodG1wICYgMSkpOworCQl0bXAgPj49IDE7CisJCXVkZWxheSgxKTsKKwl9CisKKwkvKiBDb21tYW5kcyBkb250IGhhdmUgZGF0YSAqLworCWlmICghVjMwMjBfSVNfQ09NTUFORChhZGRyZXNzKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQljaGlwLT5vcHMtPndyaXRlX2JpdChjaGlwLCAoZGF0YSAmIDEpKTsKKwkJCWRhdGEgPj49IDE7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHYzMDIwX2dldF9yZWcoc3RydWN0IHYzMDIwICpjaGlwLCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MpCit7CisJdW5zaWduZWQgaW50IGRhdGEgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQljaGlwLT5vcHMtPndyaXRlX2JpdChjaGlwLCAoYWRkcmVzcyAmIDEpKTsKKwkJYWRkcmVzcyA+Pj0gMTsKKwkJdWRlbGF5KDEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJZGF0YSA+Pj0gMTsKKwkJaWYgKGNoaXAtPm9wcy0+cmVhZF9iaXQoY2hpcCkpCisJCQlkYXRhIHw9IDB4ODA7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCB2MzAyMF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworCXN0cnVjdCB2MzAyMCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCB0bXA7CisKKwkvKiBDb3B5IHRoZSBjdXJyZW50IHRpbWUgdG8gcmFtLi4uICovCisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9DTURfQ0xPQ0syUkFNLCAwKTsKKworCS8qIC4uLmFuZCB0aGVuIHJlYWQgY29uc3RhbnQgdmFsdWVzLiAqLworCXRtcCA9IHYzMDIwX2dldF9yZWcoY2hpcCwgVjMwMjBfU0VDT05EUyk7CisJZHQtPnRtX3NlYwk9IGJjZDJiaW4odG1wKTsKKwl0bXAgPSB2MzAyMF9nZXRfcmVnKGNoaXAsIFYzMDIwX01JTlVURVMpOworCWR0LT50bV9taW4JPSBiY2QyYmluKHRtcCk7CisJdG1wID0gdjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9IT1VSUyk7CisJZHQtPnRtX2hvdXIJPSBiY2QyYmluKHRtcCk7CisJdG1wID0gdjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9NT05USF9EQVkpOworCWR0LT50bV9tZGF5CT0gYmNkMmJpbih0bXApOworCXRtcCA9IHYzMDIwX2dldF9yZWcoY2hpcCwgVjMwMjBfTU9OVEgpOworCWR0LT50bV9tb24gICAgPSBiY2QyYmluKHRtcCkgLSAxOworCXRtcCA9IHYzMDIwX2dldF9yZWcoY2hpcCwgVjMwMjBfV0VFS19EQVkpOworCWR0LT50bV93ZGF5CT0gYmNkMmJpbih0bXApOworCXRtcCA9IHYzMDIwX2dldF9yZWcoY2hpcCwgVjMwMjBfWUVBUik7CisJZHQtPnRtX3llYXIgPSBiY2QyYmluKHRtcCkrMTAwOworCisJZGV2X2RiZyhkZXYsICJcbiVzIDogUmVhZCBSVEMgdmFsdWVzXG4iLCBfX2Z1bmNfXyk7CisJZGV2X2RiZyhkZXYsICJ0bV9ob3VyOiAlaVxuIiwgZHQtPnRtX2hvdXIpOworCWRldl9kYmcoZGV2LCAidG1fbWluIDogJWlcbiIsIGR0LT50bV9taW4pOworCWRldl9kYmcoZGV2LCAidG1fc2VjIDogJWlcbiIsIGR0LT50bV9zZWMpOworCWRldl9kYmcoZGV2LCAidG1feWVhcjogJWlcbiIsIGR0LT50bV95ZWFyKTsKKwlkZXZfZGJnKGRldiwgInRtX21vbiA6ICVpXG4iLCBkdC0+dG1fbW9uKTsKKwlkZXZfZGJnKGRldiwgInRtX21kYXk6ICVpXG4iLCBkdC0+dG1fbWRheSk7CisJZGV2X2RiZyhkZXYsICJ0bV93ZGF5OiAlaVxuIiwgZHQtPnRtX3dkYXkpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB2MzAyMF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJc3RydWN0IHYzMDIwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlkZXZfZGJnKGRldiwgIlxuJXMgOiBTZXR0aW5nIFJUQyB2YWx1ZXNcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKGRldiwgInRtX3NlYyA6ICVpXG4iLCBkdC0+dG1fc2VjKTsKKwlkZXZfZGJnKGRldiwgInRtX21pbiA6ICVpXG4iLCBkdC0+dG1fbWluKTsKKwlkZXZfZGJnKGRldiwgInRtX2hvdXI6ICVpXG4iLCBkdC0+dG1faG91cik7CisJZGV2X2RiZyhkZXYsICJ0bV9tZGF5OiAlaVxuIiwgZHQtPnRtX21kYXkpOworCWRldl9kYmcoZGV2LCAidG1fd2RheTogJWlcbiIsIGR0LT50bV93ZGF5KTsKKwlkZXZfZGJnKGRldiwgInRtX3llYXI6ICVpXG4iLCBkdC0+dG1feWVhcik7CisKKwkvKiBXcml0ZSBhbGwgdGhlIHZhbHVlcyB0byByYW0uLi4gKi8KKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX1NFQ09ORFMsIAliaW4yYmNkKGR0LT50bV9zZWMpKTsKKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX01JTlVURVMsIAliaW4yYmNkKGR0LT50bV9taW4pKTsKKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX0hPVVJTLCAJYmluMmJjZChkdC0+dG1faG91cikpOworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfTU9OVEhfREFZLAliaW4yYmNkKGR0LT50bV9tZGF5KSk7CisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9NT05USCwgICAgIGJpbjJiY2QoZHQtPnRtX21vbiArIDEpKTsKKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX1dFRUtfREFZLCAJYmluMmJjZChkdC0+dG1fd2RheSkpOworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfWUVBUiwgCWJpbjJiY2QoZHQtPnRtX3llYXIgJSAxMDApKTsKKworCS8qIC4uLmFuZCBzZXQgdGhlIGNsb2NrLiAqLworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfQ01EX1JBTTJDTE9DSywgMCk7CisKKwkvKiBDb21wdWxhYiB1c2VkIHRoaXMgZGVsYXkgaGVyZS4gSSBkb250IGtub3cgd2h5LAorCSAqIHRoZSBkYXRhc2hlZXQgZG9lcyBub3Qgc3BlY2lmeSBhIGRlbGF5LiAqLworCS8qbWRlbGF5KDUpOyovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHYzMDIwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHYzMDIwX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSB2MzAyMF9zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHYzMDIwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHYzMDIwICpjaGlwOworCWludCByZXR2YWwgPSAtRUJVU1k7CisJaW50IGk7CisJaW50IHRlbXA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2YgKmNoaXAsIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocGRhdGEtPnVzZV9ncGlvKQorCQljaGlwLT5vcHMgPSAmdjMwMjBfZ3Bpb19vcHM7CisJZWxzZQorCQljaGlwLT5vcHMgPSAmdjMwMjBfbW1pb19vcHM7CisKKwlyZXR2YWwgPSBjaGlwLT5vcHMtPm1hcF9pbyhjaGlwLCBwZGV2LCBwZGF0YSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJfY2hpcDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgdjMwMjAgZXhwZWN0cyBhIGNvbW11bmljYXRpb24gY3ljbGUKKwkgKiBieSByZWFkaW5nIDggdGltZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl0ZW1wID0gY2hpcC0+b3BzLT5yZWFkX2JpdChjaGlwKTsKKworCS8qIFRlc3QgY2hpcCBieSBkb2luZyBhIHdyaXRlL3JlYWQgc2VxdWVuY2UKKwkgKiB0byB0aGUgY2hpcCByYW0gKi8KKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX1NFQ09ORFMsIDB4MzMpOworCWlmICh2MzAyMF9nZXRfcmVnKGNoaXAsIFYzMDIwX1NFQ09ORFMpICE9IDB4MzMpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfaW87CisJfQorCisJLyogTWFrZSBzdXJlIGZyZXF1ZW5jeSBtZWFzdXJlbWVudCBtb2RlLCB0ZXN0IG1vZGVzLCBhbmQgbG9jaworCSAqIGFyZSBhbGwgZGlzYWJsZWQgKi8KKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX1NUQVRVU18wLCAweDApOworCisJaWYgKHBkYXRhLT51c2VfZ3BpbykKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIkNoaXAgYXZhaWxhYmxlIGF0IEdQSU9zICIKKwkJCSAiJWQsICVkLCAlZCwgJWRcbiIsCisJCQkgY2hpcC0+Z3Bpb1tWMzAyMF9DU10uZ3BpbywgY2hpcC0+Z3Bpb1tWMzAyMF9XUl0uZ3BpbywKKwkJCSBjaGlwLT5ncGlvW1YzMDIwX1JEXS5ncGlvLCBjaGlwLT5ncGlvW1YzMDIwX0lPXS5ncGlvKTsKKwllbHNlCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJDaGlwIGF2YWlsYWJsZSBhdCAiCisJCQkgInBoeXNpY2FsIGFkZHJlc3MgMHglbGx4LCIKKwkJCSAiZGF0YSBjb25uZWN0ZWQgdG8gRCVkXG4iLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCisJCQkgY2hpcC0+bGVmdHNoaWZ0KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNoaXApOworCisJY2hpcC0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigidjMwMjAiLAorCQkJCSZwZGV2LT5kZXYsICZ2MzAyMF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihjaGlwLT5ydGMpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoY2hpcC0+cnRjKTsKKwkJZ290byBlcnJfaW87CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9pbzoKKwljaGlwLT5vcHMtPnVubWFwX2lvKGNoaXApOworZXJyX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJ0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2MzAyMCAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNoaXAtPnJ0YzsKKworCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCisJY2hpcC0+b3BzLT51bm1hcF9pbyhjaGlwKTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBydGNfZGV2aWNlX2RyaXZlciA9IHsKKwkucHJvYmUJPSBydGNfcHJvYmUsCisJLnJlbW92ZSA9IHJ0Y19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAidjMwMjAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihydGNfZGV2aWNlX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiVjMwMjAgUlRDIik7CitNT0RVTEVfQVVUSE9SKCJSYXBoYWVsIEFzc2VuYXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06djMwMjAiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjYwYTdjCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXZyNDF4eC5jCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogIERyaXZlciBmb3IgTkVDIFZSNDEwMCBzZXJpZXMgUmVhbCBUaW1lIENsb2NrIHVuaXQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA4ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGxpbnV4LW1pcHMub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK01PRFVMRV9BVVRIT1IoIllvaWNoaSBZdWFzYSA8eXVhc2FAbGludXgtbWlwcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5FQyBWUjQxMDAgc2VyaWVzIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworLyogUlRDIDEgcmVnaXN0ZXJzICovCisjZGVmaW5lIEVUSU1FTFJFRwkJMHgwMAorI2RlZmluZSBFVElNRU1SRUcJCTB4MDIKKyNkZWZpbmUgRVRJTUVIUkVHCQkweDA0CisvKiBSRlUgKi8KKyNkZWZpbmUgRUNNUExSRUcJCTB4MDgKKyNkZWZpbmUgRUNNUE1SRUcJCTB4MGEKKyNkZWZpbmUgRUNNUEhSRUcJCTB4MGMKKy8qIFJGVSAqLworI2RlZmluZSBSVENMMUxSRUcJCTB4MTAKKyNkZWZpbmUgUlRDTDFIUkVHCQkweDEyCisjZGVmaW5lIFJUQ0wxQ05UTFJFRwkJMHgxNAorI2RlZmluZSBSVENMMUNOVEhSRUcJCTB4MTYKKyNkZWZpbmUgUlRDTDJMUkVHCQkweDE4CisjZGVmaW5lIFJUQ0wySFJFRwkJMHgxYQorI2RlZmluZSBSVENMMkNOVExSRUcJCTB4MWMKKyNkZWZpbmUgUlRDTDJDTlRIUkVHCQkweDFlCisKKy8qIFJUQyAyIHJlZ2lzdGVycyAqLworI2RlZmluZSBUQ0xLTFJFRwkJMHgwMAorI2RlZmluZSBUQ0xLSFJFRwkJMHgwMgorI2RlZmluZSBUQ0xLQ05UTFJFRwkJMHgwNAorI2RlZmluZSBUQ0xLQ05USFJFRwkJMHgwNgorLyogUkZVICovCisjZGVmaW5lIFJUQ0lOVFJFRwkJMHgxZQorICNkZWZpbmUgVENMT0NLX0lOVAkJMHgwOAorICNkZWZpbmUgUlRDTE9ORzJfSU5UCQkweDA0CisgI2RlZmluZSBSVENMT05HMV9JTlQJCTB4MDIKKyAjZGVmaW5lIEVMQVBTRURUSU1FX0lOVAkweDAxCisKKyNkZWZpbmUgUlRDX0ZSRVFVRU5DWQkJMzI3NjgKKyNkZWZpbmUgTUFYX1BFUklPRElDX1JBVEUJNjU1MworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpydGMxX2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpydGMyX2Jhc2U7CisKKyNkZWZpbmUgcnRjMV9yZWFkKG9mZnNldCkJCXJlYWR3KHJ0YzFfYmFzZSArIChvZmZzZXQpKQorI2RlZmluZSBydGMxX3dyaXRlKG9mZnNldCwgdmFsdWUpCXdyaXRldygodmFsdWUpLCBydGMxX2Jhc2UgKyAob2Zmc2V0KSkKKworI2RlZmluZSBydGMyX3JlYWQob2Zmc2V0KQkJcmVhZHcocnRjMl9iYXNlICsgKG9mZnNldCkpCisjZGVmaW5lIHJ0YzJfd3JpdGUob2Zmc2V0LCB2YWx1ZSkJd3JpdGV3KCh2YWx1ZSksIHJ0YzJfYmFzZSArIChvZmZzZXQpKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlcG9jaCA9IDE5NzA7CS8qIEphbiAxIDE5NzAgMDA6MDA6MDAgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CitzdGF0aWMgY2hhciBydGNfbmFtZVtdID0gIlJUQyI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJpb2RpY19jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWxhcm1fZW5hYmxlZDsKK3N0YXRpYyBpbnQgYWllX2lycTsKK3N0YXRpYyBpbnQgcGllX2lycTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfZWxhcHNlZF9zZWNvbmQodm9pZCkKK3sKKworCXVuc2lnbmVkIGxvbmcgZmlyc3RfbG93LCBmaXJzdF9taWQsIGZpcnN0X2hpZ2g7CisKKwl1bnNpZ25lZCBsb25nIHNlY29uZF9sb3csIHNlY29uZF9taWQsIHNlY29uZF9oaWdoOworCisJZG8geworCQlmaXJzdF9sb3cgPSBydGMxX3JlYWQoRVRJTUVMUkVHKTsKKwkJZmlyc3RfbWlkID0gcnRjMV9yZWFkKEVUSU1FTVJFRyk7CisJCWZpcnN0X2hpZ2ggPSBydGMxX3JlYWQoRVRJTUVIUkVHKTsKKwkJc2Vjb25kX2xvdyA9IHJ0YzFfcmVhZChFVElNRUxSRUcpOworCQlzZWNvbmRfbWlkID0gcnRjMV9yZWFkKEVUSU1FTVJFRyk7CisJCXNlY29uZF9oaWdoID0gcnRjMV9yZWFkKEVUSU1FSFJFRyk7CisJfSB3aGlsZSAoZmlyc3RfbG93ICE9IHNlY29uZF9sb3cgfHwgZmlyc3RfbWlkICE9IHNlY29uZF9taWQgfHwKKwkgICAgICAgICBmaXJzdF9oaWdoICE9IHNlY29uZF9oaWdoKTsKKworCXJldHVybiAoZmlyc3RfaGlnaCA8PCAxNykgfCAoZmlyc3RfbWlkIDw8IDEpIHwgKGZpcnN0X2xvdyA+PiAxNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9lbGFwc2VkX3NlY29uZCh1bnNpZ25lZCBsb25nIHNlYykKK3sKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlydGMxX3dyaXRlKEVUSU1FTFJFRywgKHVpbnQxNl90KShzZWMgPDwgMTUpKTsKKwlydGMxX3dyaXRlKEVUSU1FTVJFRywgKHVpbnQxNl90KShzZWMgPj4gMSkpOworCXJ0YzFfd3JpdGUoRVRJTUVIUkVHLCAodWludDE2X3QpKHNlYyA+PiAxNykpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHZyNDF4eF9ydGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlydGMxX3dyaXRlKEVDTVBMUkVHLCAwKTsKKwlydGMxX3dyaXRlKEVDTVBNUkVHLCAwKTsKKwlydGMxX3dyaXRlKEVDTVBIUkVHLCAwKTsKKwlydGMxX3dyaXRlKFJUQ0wxTFJFRywgMCk7CisJcnRjMV93cml0ZShSVENMMUhSRUcsIDApOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlkaXNhYmxlX2lycShhaWVfaXJxKTsKKwlkaXNhYmxlX2lycShwaWVfaXJxKTsKK30KKworc3RhdGljIGludCB2cjQxeHhfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3sKKwl1bnNpZ25lZCBsb25nIGVwb2NoX3NlYywgZWxhcHNlZF9zZWM7CisKKwllcG9jaF9zZWMgPSBta3RpbWUoZXBvY2gsIDEsIDEsIDAsIDAsIDApOworCWVsYXBzZWRfc2VjID0gcmVhZF9lbGFwc2VkX3NlY29uZCgpOworCisJcnRjX3RpbWVfdG9fdG0oZXBvY2hfc2VjICsgZWxhcHNlZF9zZWMsIHRpbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnI0MXh4X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3sKKwl1bnNpZ25lZCBsb25nIGVwb2NoX3NlYywgY3VycmVudF9zZWM7CisKKwllcG9jaF9zZWMgPSBta3RpbWUoZXBvY2gsIDEsIDEsIDAsIDAsIDApOworCWN1cnJlbnRfc2VjID0gbWt0aW1lKHRpbWUtPnRtX3llYXIgKyAxOTAwLCB0aW1lLT50bV9tb24gKyAxLCB0aW1lLT50bV9tZGF5LAorCSAgICAgICAgICAgICAgICAgICAgIHRpbWUtPnRtX2hvdXIsIHRpbWUtPnRtX21pbiwgdGltZS0+dG1fc2VjKTsKKworCXdyaXRlX2VsYXBzZWRfc2Vjb25kKGN1cnJlbnRfc2VjIC0gZXBvY2hfc2VjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZyNDF4eF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp3a2Fscm0pCit7CisJdW5zaWduZWQgbG9uZyBsb3csIG1pZCwgaGlnaDsKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUgPSAmd2thbHJtLT50aW1lOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCisJbG93ID0gcnRjMV9yZWFkKEVDTVBMUkVHKTsKKwltaWQgPSBydGMxX3JlYWQoRUNNUE1SRUcpOworCWhpZ2ggPSBydGMxX3JlYWQoRUNNUEhSRUcpOworCXdrYWxybS0+ZW5hYmxlZCA9IGFsYXJtX2VuYWJsZWQ7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXJ0Y190aW1lX3RvX3RtKChoaWdoIDw8IDE3KSB8IChtaWQgPDwgMSkgfCAobG93ID4+IDE1KSwgdGltZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cjQxeHhfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp3a2Fscm0pCit7CisJdW5zaWduZWQgbG9uZyBhbGFybV9zZWM7CisJc3RydWN0IHJ0Y190aW1lICp0aW1lID0gJndrYWxybS0+dGltZTsKKworCWFsYXJtX3NlYyA9IG1rdGltZSh0aW1lLT50bV95ZWFyICsgMTkwMCwgdGltZS0+dG1fbW9uICsgMSwgdGltZS0+dG1fbWRheSwKKwkgICAgICAgICAgICAgICAgICAgdGltZS0+dG1faG91ciwgdGltZS0+dG1fbWluLCB0aW1lLT50bV9zZWMpOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCisJaWYgKGFsYXJtX2VuYWJsZWQpCisJCWRpc2FibGVfaXJxKGFpZV9pcnEpOworCisJcnRjMV93cml0ZShFQ01QTFJFRywgKHVpbnQxNl90KShhbGFybV9zZWMgPDwgMTUpKTsKKwlydGMxX3dyaXRlKEVDTVBNUkVHLCAodWludDE2X3QpKGFsYXJtX3NlYyA+PiAxKSk7CisJcnRjMV93cml0ZShFQ01QSFJFRywgKHVpbnQxNl90KShhbGFybV9zZWMgPj4gMTcpKTsKKworCWlmICh3a2Fscm0tPmVuYWJsZWQpCisJCWVuYWJsZV9pcnEoYWllX2lycSk7CisKKwlhbGFybV9lbmFibGVkID0gd2thbHJtLT5lbmFibGVkOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cjQxeHhfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19FUE9DSF9SRUFEOgorCQlyZXR1cm4gcHV0X3VzZXIoZXBvY2gsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZyk7CisJY2FzZSBSVENfRVBPQ0hfU0VUOgorCQkvKiBEb2Vzbid0IHN1cHBvcnQgYmVmb3JlIDE5MDAgKi8KKwkJaWYgKGFyZyA8IDE5MDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXBvY2ggPSBhcmc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnI0MXh4X3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWlmIChlbmFibGVkKSB7CisJCWlmICghYWxhcm1fZW5hYmxlZCkgeworCQkJZW5hYmxlX2lycShhaWVfaXJxKTsKKwkJCWFsYXJtX2VuYWJsZWQgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFsYXJtX2VuYWJsZWQpIHsKKwkJCWRpc2FibGVfaXJxKGFpZV9pcnEpOworCQkJYWxhcm1fZW5hYmxlZCA9IDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbGFwc2VkdGltZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGMyX3dyaXRlKFJUQ0lOVFJFRywgRUxBUFNFRFRJTUVfSU5UKTsKKworCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgUlRDX0FGKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHJ0Y2xvbmcxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gcGVyaW9kaWNfY291bnQ7CisKKwlydGMyX3dyaXRlKFJUQ0lOVFJFRywgUlRDTE9ORzFfSU5UKTsKKworCXJ0YzFfd3JpdGUoUlRDTDFMUkVHLCBjb3VudCk7CisJcnRjMV93cml0ZShSVENMMUhSRUcsIGNvdW50ID4+IDE2KTsKKworCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgUlRDX1BGKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHZyNDF4eF9ydGNfb3BzID0geworCS5yZWxlYXNlCT0gdnI0MXh4X3J0Y19yZWxlYXNlLAorCS5pb2N0bAkJPSB2cjQxeHhfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUJPSB2cjQxeHhfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSB2cjQxeHhfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gdnI0MXh4X3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSB2cjQxeHhfcnRjX3NldF9hbGFybSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJaW50IHJldHZhbDsKKworCWlmIChwZGV2LT5udW1fcmVzb3VyY2VzICE9IDQpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVCVVNZOworCisJcnRjMV9iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghcnRjMV9iYXNlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAoIXJlcykgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3J0YzFfaW91bm1hcDsKKwl9CisKKwlydGMyX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFydGMyX2Jhc2UpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIGVycl9ydGMxX2lvdW5tYXA7CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihydGNfbmFtZSwgJnBkZXYtPmRldiwgJnZyNDF4eF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBlcnJfaW91bm1hcF9hbGw7CisJfQorCisJcnRjLT5tYXhfdXNlcl9mcmVxID0gTUFYX1BFUklPRElDX1JBVEU7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlydGMxX3dyaXRlKEVDTVBMUkVHLCAwKTsKKwlydGMxX3dyaXRlKEVDTVBNUkVHLCAwKTsKKwlydGMxX3dyaXRlKEVDTVBIUkVHLCAwKTsKKwlydGMxX3dyaXRlKFJUQ0wxTFJFRywgMCk7CisJcnRjMV93cml0ZShSVENMMUhSRUcsIDApOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlhaWVfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoYWllX2lycSA8PSAwKSB7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byBlcnJfZGV2aWNlX3VucmVnaXN0ZXI7CisJfQorCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoYWllX2lycSwgZWxhcHNlZHRpbWVfaW50ZXJydXB0LCAwLAorCSAgICAgICAgICAgICAgICAgICAgICJlbGFwc2VkX3RpbWUiLCBwZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJfZGV2aWNlX3VucmVnaXN0ZXI7CisKKwlwaWVfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAocGllX2lycSA8PSAwKQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKHBpZV9pcnEsIHJ0Y2xvbmcxX2ludGVycnVwdCwgMCwKKwkJICAgICAgICAgICAgICJydGNsb25nMSIsIHBkZXYpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisKKwlkaXNhYmxlX2lycShhaWVfaXJxKTsKKwlkaXNhYmxlX2lycShwaWVfaXJxKTsKKworCXByaW50ayhLRVJOX0lORk8gInJ0YzogUmVhbCBUaW1lIENsb2NrIG9mIE5FQyBWUjQxMDAgc2VyaWVzXG4iKTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoYWllX2lycSwgcGRldik7CisKK2Vycl9kZXZpY2VfdW5yZWdpc3RlcjoKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworZXJyX2lvdW5tYXBfYWxsOgorCWlvdW5tYXAocnRjMl9iYXNlKTsKKwlydGMyX2Jhc2UgPSBOVUxMOworCitlcnJfcnRjMV9pb3VubWFwOgorCWlvdW5tYXAocnRjMV9iYXNlKTsKKwlydGMxX2Jhc2UgPSBOVUxMOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisKKwlydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJZnJlZV9pcnEoYWllX2lycSwgcGRldik7CisJZnJlZV9pcnEocGllX2lycSwgcGRldik7CisJaWYgKHJ0YzFfYmFzZSkKKwkJaW91bm1hcChydGMxX2Jhc2UpOworCWlmIChydGMyX2Jhc2UpCisJCWlvdW5tYXAocnRjMl9iYXNlKTsKKworCXJldHVybiAwOworfQorCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06UlRDIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJ0Y19wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHJ0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJ0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IHJ0Y19uYW1lLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihydGNfcGxhdGZvcm1fZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy12dDg1MDAuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy12dDg1MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDg3OGRhCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXZ0ODUwMC5jCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogZHJpdmVycy9ydGMvcnRjLXZ0ODUwMC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBBbGV4ZXkgQ2hhcmtvdiA8YWxjaGFya0BnbWFpbC5jb20+CisgKgorICogQmFzZWQgb24gcnRjLXB4YS5jCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBWVDg1MDBfUlRDX1RTCQkweDAwCS8qIFRpbWUgc2V0ICovCisjZGVmaW5lIFZUODUwMF9SVENfRFMJCTB4MDQJLyogRGF0ZSBzZXQgKi8KKyNkZWZpbmUgVlQ4NTAwX1JUQ19BUwkJMHgwOAkvKiBBbGFybSBzZXQgKi8KKyNkZWZpbmUgVlQ4NTAwX1JUQ19DUgkJMHgwYwkvKiBDb250cm9sICovCisjZGVmaW5lIFZUODUwMF9SVENfVFIJCTB4MTAJLyogVGltZSByZWFkICovCisjZGVmaW5lIFZUODUwMF9SVENfRFIJCTB4MTQJLyogRGF0ZSByZWFkICovCisjZGVmaW5lIFZUODUwMF9SVENfV1MJCTB4MTgJLyogV3JpdGUgc3RhdHVzICovCisjZGVmaW5lIFZUODUwMF9SVENfQ0wJCTB4MjAJLyogQ2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgVlQ4NTAwX1JUQ19JUwkJMHgyNAkvKiBJbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFZUODUwMF9SVENfU1QJCTB4MjgJLyogU3RhdHVzICovCisKKyNkZWZpbmUgSU5WQUxJRF9USU1FX0JJVAkoMSA8PCAzMSkKKworI2RlZmluZSBEQVRFX0NFTlRVUllfUwkJMTkKKyNkZWZpbmUgREFURV9ZRUFSX1MJCTExCisjZGVmaW5lIERBVEVfWUVBUl9NQVNLCQkoMHhmZiA8PCBEQVRFX1lFQVJfUykKKyNkZWZpbmUgREFURV9NT05USF9TCQk2CisjZGVmaW5lIERBVEVfTU9OVEhfTUFTSwkJKDB4MWYgPDwgREFURV9NT05USF9TKQorI2RlZmluZSBEQVRFX0RBWV9NQVNLCQkweDNmCisKKyNkZWZpbmUgVElNRV9ET1dfUwkJMjAKKyNkZWZpbmUgVElNRV9ET1dfTUFTSwkJKDB4MDcgPDwgVElNRV9ET1dfUykKKyNkZWZpbmUgVElNRV9IT1VSX1MJCTE0CisjZGVmaW5lIFRJTUVfSE9VUl9NQVNLCQkoMHgzZiA8PCBUSU1FX0hPVVJfUykKKyNkZWZpbmUgVElNRV9NSU5fUwkJNworI2RlZmluZSBUSU1FX01JTl9NQVNLCQkoMHg3ZiA8PCBUSU1FX01JTl9TKQorI2RlZmluZSBUSU1FX1NFQ19NQVNLCQkweDdmCisKKyNkZWZpbmUgQUxBUk1fREFZX1MJCTIwCisjZGVmaW5lIEFMQVJNX0RBWV9NQVNLCQkoMHgzZiA8PCBBTEFSTV9EQVlfUykKKworI2RlZmluZSBBTEFSTV9EQVlfQklUCQkoMSA8PCAyOSkKKyNkZWZpbmUgQUxBUk1fSE9VUl9CSVQJCSgxIDw8IDI4KQorI2RlZmluZSBBTEFSTV9NSU5fQklUCQkoMSA8PCAyNykKKyNkZWZpbmUgQUxBUk1fU0VDX0JJVAkJKDEgPDwgMjYpCisKKyNkZWZpbmUgQUxBUk1fRU5BQkxFX01BU0sJKEFMQVJNX0RBWV9CSVQgXAorCQkJCXwgQUxBUk1fSE9VUl9CSVQgXAorCQkJCXwgQUxBUk1fTUlOX0JJVCBcCisJCQkJfCBBTEFSTV9TRUNfQklUKQorCisjZGVmaW5lIFZUODUwMF9SVENfQ1JfRU5BQkxFCSgxIDw8IDApCS8qIEVuYWJsZSBSVEMgKi8KKyNkZWZpbmUgVlQ4NTAwX1JUQ19DUl8xMkgJKDEgPDwgMSkJLyogMTJoIHRpbWUgZm9ybWF0ICovCisjZGVmaW5lIFZUODUwMF9SVENfQ1JfU01fRU5BQkxFCSgxIDw8IDIpCS8qIEVuYWJsZSBwZXJpb2RpYyBpcnFzICovCisjZGVmaW5lIFZUODUwMF9SVENfQ1JfU01fU0VDCSgxIDw8IDMpCS8qIDA6IDFIei82MCwgMTogMUh6ICovCisjZGVmaW5lIFZUODUwMF9SVENfQ1JfQ0FMSUIJKDEgPDwgNCkJLyogRW5hYmxlIGNhbGlicmF0aW9uICovCisKKyNkZWZpbmUgVlQ4NTAwX1JUQ19JU19BTEFSTQkoMSA8PCAwKQkvKiBBbGFybSBpbnRlcnJ1cHQgc3RhdHVzICovCisKK3N0cnVjdCB2dDg1MDBfcnRjIHsKKwl2b2lkIF9faW9tZW0JCSpyZWdiYXNlOworCXN0cnVjdCByZXNvdXJjZQkJKnJlczsKKwlpbnQJCQlpcnFfYWxhcm07CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwlzcGlubG9ja190CQlsb2NrOwkJLyogUHJvdGVjdHMgdGhpcyBzdHJ1Y3R1cmUgKi8KK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2dDg1MDBfcnRjX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHZ0ODUwMF9ydGMgKnZ0ODUwMF9ydGMgPSBkZXZfaWQ7CisJdTMyIGlzcjsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwlzcGluX2xvY2soJnZ0ODUwMF9ydGMtPmxvY2spOworCisJLyogY2xlYXIgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlpc3IgPSByZWFkbCh2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19JUyk7CisJd3JpdGVsKGlzciwgdnQ4NTAwX3J0Yy0+cmVnYmFzZSArIFZUODUwMF9SVENfSVMpOworCisJc3Bpbl91bmxvY2soJnZ0ODUwMF9ydGMtPmxvY2spOworCisJaWYgKGlzciAmIFZUODUwMF9SVENfSVNfQUxBUk0pCisJCWV2ZW50cyB8PSBSVENfQUYgfCBSVENfSVJRRjsKKworCXJ0Y191cGRhdGVfaXJxKHZ0ODUwMF9ydGMtPnJ0YywgMSwgZXZlbnRzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB2dDg1MDBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHZ0ODUwMF9ydGMgKnZ0ODUwMF9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgZGF0ZSwgdGltZTsKKworCWRhdGUgPSByZWFkbCh2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19EUik7CisJdGltZSA9IHJlYWRsKHZ0ODUwMF9ydGMtPnJlZ2Jhc2UgKyBWVDg1MDBfUlRDX1RSKTsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHRpbWUgJiBUSU1FX1NFQ19NQVNLKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbigodGltZSAmIFRJTUVfTUlOX01BU0spID4+IFRJTUVfTUlOX1MpOworCXRtLT50bV9ob3VyID0gYmNkMmJpbigodGltZSAmIFRJTUVfSE9VUl9NQVNLKSA+PiBUSU1FX0hPVVJfUyk7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGRhdGUgJiBEQVRFX0RBWV9NQVNLKTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbigoZGF0ZSAmIERBVEVfTU9OVEhfTUFTSykgPj4gREFURV9NT05USF9TKSAtIDE7CisJdG0tPnRtX3llYXIgPSBiY2QyYmluKChkYXRlICYgREFURV9ZRUFSX01BU0spID4+IERBVEVfWUVBUl9TKQorCQkJKyAoKGRhdGUgPj4gREFURV9DRU5UVVJZX1MpICYgMSA/IDIwMCA6IDEwMCk7CisJdG0tPnRtX3dkYXkgPSAodGltZSAmIFRJTUVfRE9XX01BU0spID4+IFRJTUVfRE9XX1M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dDg1MDBfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgdnQ4NTAwX3J0YyAqdnQ4NTAwX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKHRtLT50bV95ZWFyIDwgMTAwKSB7CisJCWRldl93YXJuKGRldiwgIk9ubHkgeWVhcnMgMjAwMC0yMTk5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlICIKKwkJCSAgICAgICJoYXJkd2FyZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3cml0ZWwoKGJpbjJiY2QodG0tPnRtX3llYXIgLSAxMDApIDw8IERBVEVfWUVBUl9TKQorCQl8IChiaW4yYmNkKHRtLT50bV9tb24gKyAxKSA8PCBEQVRFX01PTlRIX1MpCisJCXwgKGJpbjJiY2QodG0tPnRtX21kYXkpKQorCQl8ICgodG0tPnRtX3llYXIgPj0gMjAwKSA8PCBEQVRFX0NFTlRVUllfUyksCisJCXZ0ODUwMF9ydGMtPnJlZ2Jhc2UgKyBWVDg1MDBfUlRDX0RTKTsKKwl3cml0ZWwoKGJpbjJiY2QodG0tPnRtX3dkYXkpIDw8IFRJTUVfRE9XX1MpCisJCXwgKGJpbjJiY2QodG0tPnRtX2hvdXIpIDw8IFRJTUVfSE9VUl9TKQorCQl8IChiaW4yYmNkKHRtLT50bV9taW4pIDw8IFRJTUVfTUlOX1MpCisJCXwgKGJpbjJiY2QodG0tPnRtX3NlYykpLAorCQl2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19UUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dDg1MDBfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgdnQ4NTAwX3J0YyAqdnQ4NTAwX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiBpc3IsIGFsYXJtOworCisJYWxhcm0gPSByZWFkbCh2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19BUyk7CisJaXNyID0gcmVhZGwodnQ4NTAwX3J0Yy0+cmVnYmFzZSArIFZUODUwMF9SVENfSVMpOworCisJYWxybS0+dGltZS50bV9tZGF5ID0gYmNkMmJpbigoYWxhcm0gJiBBTEFSTV9EQVlfTUFTSykgPj4gQUxBUk1fREFZX1MpOworCWFscm0tPnRpbWUudG1faG91ciA9IGJjZDJiaW4oKGFsYXJtICYgVElNRV9IT1VSX01BU0spID4+IFRJTUVfSE9VUl9TKTsKKwlhbHJtLT50aW1lLnRtX21pbiA9IGJjZDJiaW4oKGFsYXJtICYgVElNRV9NSU5fTUFTSykgPj4gVElNRV9NSU5fUyk7CisJYWxybS0+dGltZS50bV9zZWMgPSBiY2QyYmluKChhbGFybSAmIFRJTUVfU0VDX01BU0spKTsKKworCWFscm0tPmVuYWJsZWQgPSAoYWxhcm0gJiBBTEFSTV9FTkFCTEVfTUFTSykgPyAxIDogMDsKKwlhbHJtLT5wZW5kaW5nID0gKGlzciAmIFZUODUwMF9SVENfSVNfQUxBUk0pID8gMSA6IDA7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKCZhbHJtLT50aW1lKTsKK30KKworc3RhdGljIGludCB2dDg1MDBfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCB2dDg1MDBfcnRjICp2dDg1MDBfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwl3cml0ZWwoKGFscm0tPmVuYWJsZWQgPyBBTEFSTV9FTkFCTEVfTUFTSyA6IDApCisJCXwgKGJpbjJiY2QoYWxybS0+dGltZS50bV9tZGF5KSA8PCBBTEFSTV9EQVlfUykKKwkJfCAoYmluMmJjZChhbHJtLT50aW1lLnRtX2hvdXIpIDw8IFRJTUVfSE9VUl9TKQorCQl8IChiaW4yYmNkKGFscm0tPnRpbWUudG1fbWluKSA8PCBUSU1FX01JTl9TKQorCQl8IChiaW4yYmNkKGFscm0tPnRpbWUudG1fc2VjKSksCisJCXZ0ODUwMF9ydGMtPnJlZ2Jhc2UgKyBWVDg1MDBfUlRDX0FTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ0ODUwMF9hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IHZ0ODUwMF9ydGMgKnZ0ODUwMF9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRtcCA9IHJlYWRsKHZ0ODUwMF9ydGMtPnJlZ2Jhc2UgKyBWVDg1MDBfUlRDX0FTKTsKKworCWlmIChlbmFibGVkKQorCQl0bXAgfD0gQUxBUk1fRU5BQkxFX01BU0s7CisJZWxzZQorCQl0bXAgJj0gfkFMQVJNX0VOQUJMRV9NQVNLOworCisJd3JpdGVsKHRtcCwgdnQ4NTAwX3J0Yy0+cmVnYmFzZSArIFZUODUwMF9SVENfQVMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgdnQ4NTAwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZSA9IHZ0ODUwMF9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IHZ0ODUwMF9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSB2dDg1MDBfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IHZ0ODUwMF9ydGNfc2V0X2FsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gdnQ4NTAwX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2dDg1MDBfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZ0ODUwMF9ydGMgKnZ0ODUwMF9ydGM7CisJaW50IHJldDsKKworCXZ0ODUwMF9ydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdnQ4NTAwX3J0YyksIEdGUF9LRVJORUwpOworCWlmICghdnQ4NTAwX3J0YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmdnQ4NTAwX3J0Yy0+bG9jayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdnQ4NTAwX3J0Yyk7CisKKwl2dDg1MDBfcnRjLT5yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghdnQ4NTAwX3J0Yy0+cmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIEkvTyBtZW1vcnkgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwl2dDg1MDBfcnRjLT5pcnFfYWxhcm0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICh2dDg1MDBfcnRjLT5pcnFfYWxhcm0gPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGFsYXJtIElSUSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXZ0ODUwMF9ydGMtPnJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbih2dDg1MDBfcnRjLT5yZXMtPnN0YXJ0LAorCQkJCQkgICAgIHJlc291cmNlX3NpemUodnQ4NTAwX3J0Yy0+cmVzKSwKKwkJCQkJICAgICAidnQ4NTAwLXJ0YyIpOworCWlmICh2dDg1MDBfcnRjLT5yZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJL08gbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXZ0ODUwMF9ydGMtPnJlZ2Jhc2UgPSBpb3JlbWFwKHZ0ODUwMF9ydGMtPnJlcy0+c3RhcnQsCisJCQkJICAgICAgcmVzb3VyY2Vfc2l6ZSh2dDg1MDBfcnRjLT5yZXMpKTsKKwlpZiAoIXZ0ODUwMF9ydGMtPnJlZ2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIG1hcCBSVEMgSS9PIG1lbW9yeVxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisKKwkvKiBFbmFibGUgUlRDIGFuZCBzZXQgaXQgdG8gMjQtaG91ciBtb2RlICovCisJd3JpdGVsKFZUODUwMF9SVENfQ1JfRU5BQkxFLAorCSAgICAgICB2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19DUik7CisKKwl2dDg1MDBfcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJ2dDg1MDAtcnRjIiwgJnBkZXYtPmRldiwKKwkJCQkJICAgICAgJnZ0ODUwMF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUih2dDg1MDBfcnRjLT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIodnQ4NTAwX3J0Yy0+cnRjKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byByZWdpc3RlciBSVEMgZGV2aWNlIC0+ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl91bm1hcDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycSh2dDg1MDBfcnRjLT5pcnFfYWxhcm0sIHZ0ODUwMF9ydGNfaXJxLCAwLAorCQkJICAicnRjIGFsYXJtIiwgdnQ4NTAwX3J0Yyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAorCQkJdnQ4NTAwX3J0Yy0+aXJxX2FsYXJtLCByZXQpOworCQlnb3RvIGVycl91bnJlZzsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3VucmVnOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcih2dDg1MDBfcnRjLT5ydGMpOworZXJyX3VubWFwOgorCWlvdW5tYXAodnQ4NTAwX3J0Yy0+cmVnYmFzZSk7CitlcnJfcmVsZWFzZToKKwlyZWxlYXNlX21lbV9yZWdpb24odnQ4NTAwX3J0Yy0+cmVzLT5zdGFydCwKKwkJCSAgIHJlc291cmNlX3NpemUodnQ4NTAwX3J0Yy0+cmVzKSk7CitlcnJfZnJlZToKKwlrZnJlZSh2dDg1MDBfcnRjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB2dDg1MDBfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2dDg1MDBfcnRjICp2dDg1MDBfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlmcmVlX2lycSh2dDg1MDBfcnRjLT5pcnFfYWxhcm0sIHZ0ODUwMF9ydGMpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHZ0ODUwMF9ydGMtPnJ0Yyk7CisKKwkvKiBEaXNhYmxlIGFsYXJtIG1hdGNoaW5nICovCisJd3JpdGVsKDAsIHZ0ODUwMF9ydGMtPnJlZ2Jhc2UgKyBWVDg1MDBfUlRDX0lTKTsKKwlpb3VubWFwKHZ0ODUwMF9ydGMtPnJlZ2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbih2dDg1MDBfcnRjLT5yZXMtPnN0YXJ0LAorCQkJICAgcmVzb3VyY2Vfc2l6ZSh2dDg1MDBfcnRjLT5yZXMpKTsKKworCWtmcmVlKHZ0ODUwMF9ydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZ0ODUwMF9ydGNfZHJpdmVyID0geworCS5wcm9iZQkJPSB2dDg1MDBfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodnQ4NTAwX3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2dDg1MDAtcnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodnQ4NTAwX3J0Y19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJBbGV4ZXkgQ2hhcmtvdiA8YWxjaGFya0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBWVDg1MDAgU29DIFJlYWx0aW1lIENsb2NrIERyaXZlciAoUlRDKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp2dDg1MDAtcnRjIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtd204MzF4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMtd204MzF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjMDZmZQotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy13bTgzMXguYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqCVJlYWwgVGltZSBDbG9jayBkcml2ZXIgZm9yIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTgzMXgKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDkgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiAgQXV0aG9yOiBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworLyoKKyAqIFIxNjQxNiAoMHg0MDIwKSAtIFJUQyBXcml0ZSBDb3VudGVyCisgKi8KKyNkZWZpbmUgV004MzFYX1JUQ19XUl9DTlRfTUFTSyAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogUlRDX1dSX0NOVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTgzMVhfUlRDX1dSX0NOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSVENfV1JfQ05UIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODMxWF9SVENfV1JfQ05UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIFJUQ19XUl9DTlQgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNjQxNyAoMHg0MDIxKSAtIFJUQyBUaW1lIDEKKyAqLworI2RlZmluZSBXTTgzMVhfUlRDX1RJTUVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBSVENfVElNRSAtIFsxNTowXSAqLworI2RlZmluZSBXTTgzMVhfUlRDX1RJTUVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSVENfVElNRSAtIFsxNTowXSAqLworI2RlZmluZSBXTTgzMVhfUlRDX1RJTUVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBSVENfVElNRSAtIFsxNTowXSAqLworCisvKgorICogUjE2NDE4ICgweDQwMjIpIC0gUlRDIFRpbWUgMgorICovCisjZGVmaW5lIFdNODMxWF9SVENfVElNRV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIFJUQ19USU1FIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODMxWF9SVENfVElNRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJUQ19USU1FIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODMxWF9SVENfVElNRV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIFJUQ19USU1FIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTY0MTkgKDB4NDAyMykgLSBSVEMgQWxhcm0gMQorICovCisjZGVmaW5lIFdNODMxWF9SVENfQUxNX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIFJUQ19BTE0gLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004MzFYX1JUQ19BTE1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUlRDX0FMTSAtIFsxNTowXSAqLworI2RlZmluZSBXTTgzMVhfUlRDX0FMTV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBSVENfQUxNIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTY0MjAgKDB4NDAyNCkgLSBSVEMgQWxhcm0gMgorICovCisjZGVmaW5lIFdNODMxWF9SVENfQUxNX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIFJUQ19BTE0gLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004MzFYX1JUQ19BTE1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUlRDX0FMTSAtIFsxNTowXSAqLworI2RlZmluZSBXTTgzMVhfUlRDX0FMTV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBSVENfQUxNIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTY0MjEgKDB4NDAyNSkgLSBSVEMgQ29udHJvbAorICovCisjZGVmaW5lIFdNODMxWF9SVENfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIFJUQ19WQUxJRCAqLworI2RlZmluZSBXTTgzMVhfUlRDX1ZBTElEX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBSVENfVkFMSUQgKi8KKyNkZWZpbmUgV004MzFYX1JUQ19WQUxJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogUlRDX1ZBTElEICovCisjZGVmaW5lIFdNODMxWF9SVENfVkFMSURfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJUQ19WQUxJRCAqLworI2RlZmluZSBXTTgzMVhfUlRDX1NZTkNfQlVTWSAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBSVENfU1lOQ19CVVNZICovCisjZGVmaW5lIFdNODMxWF9SVENfU1lOQ19CVVNZX01BU0sgICAgICAgICAgICAgICAweDQwMDAgIC8qIFJUQ19TWU5DX0JVU1kgKi8KKyNkZWZpbmUgV004MzFYX1JUQ19TWU5DX0JVU1lfU0hJRlQgICAgICAgICAgICAgICAgICAxNCAgLyogUlRDX1NZTkNfQlVTWSAqLworI2RlZmluZSBXTTgzMVhfUlRDX1NZTkNfQlVTWV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBSVENfU1lOQ19CVVNZICovCisjZGVmaW5lIFdNODMxWF9SVENfQUxNX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIFJUQ19BTE1fRU5BICovCisjZGVmaW5lIFdNODMxWF9SVENfQUxNX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIFJUQ19BTE1fRU5BICovCisjZGVmaW5lIFdNODMxWF9SVENfQUxNX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgMTAgIC8qIFJUQ19BTE1fRU5BICovCisjZGVmaW5lIFdNODMxWF9SVENfQUxNX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJUQ19BTE1fRU5BICovCisjZGVmaW5lIFdNODMxWF9SVENfUElOVF9GUkVRX01BU0sgICAgICAgICAgICAgICAweDAwNzAgIC8qIFJUQ19QSU5UX0ZSRVEgLSBbNjo0XSAqLworI2RlZmluZSBXTTgzMVhfUlRDX1BJTlRfRlJFUV9TSElGVCAgICAgICAgICAgICAgICAgICA0ICAvKiBSVENfUElOVF9GUkVRIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004MzFYX1JUQ19QSU5UX0ZSRVFfV0lEVEggICAgICAgICAgICAgICAgICAgMyAgLyogUlRDX1BJTlRfRlJFUSAtIFs2OjRdICovCisKKy8qCisgKiBSMTY0MjIgKDB4NDAyNikgLSBSVEMgVHJpbQorICovCisjZGVmaW5lIFdNODMxWF9SVENfVFJJTV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAzRkYgIC8qIFJUQ19UUklNIC0gWzk6MF0gKi8KKyNkZWZpbmUgV004MzFYX1JUQ19UUklNX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUlRDX1RSSU0gLSBbOTowXSAqLworI2RlZmluZSBXTTgzMVhfUlRDX1RSSU1fV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBSVENfVFJJTSAtIFs5OjBdICovCisKKyNkZWZpbmUgV004MzFYX1NFVF9USU1FX1JFVFJJRVMJNQorI2RlZmluZSBXTTgzMVhfR0VUX1RJTUVfUkVUUklFUwk1CisKK3N0cnVjdCB3bTgzMXhfcnRjIHsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXg7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl1bnNpZ25lZCBpbnQgYWxhcm1fZW5hYmxlZDoxOworfTsKKworc3RhdGljIHZvaWQgd204MzF4X3J0Y19hZGRfcmFuZG9tbmVzcyhzdHJ1Y3Qgd204MzF4ICp3bTgzMXgpCit7CisJaW50IHJldDsKKwl1MTYgcmVnOworCisJLyoKKwkgKiBUaGUgd3JpdGUgY291bnRlciBjb250YWlucyBhIHBzZXVkby1yYW5kb20gbnVtYmVyIHdoaWNoIGlzCisJICogcmVnZW5lcmF0ZWQgZXZlcnkgdGltZSB3ZSBzZXQgdGhlIFJUQyBzbyBpdCBzaG91bGQgYmUgYQorCSAqIHVzZWZ1bCBwZXItc3lzdGVtIHNvdXJjZSBvZiBlbnRyb3B5LgorCSAqLworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9SVENfV1JJVEVfQ09VTlRFUik7CisJaWYgKHJldCA+PSAwKSB7CisJCXJlZyA9IHJldDsKKwkJYWRkX2RldmljZV9yYW5kb21uZXNzKCZyZWcsIHNpemVvZihyZWcpKTsKKwl9IGVsc2UgeworCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byByZWFkIFJUQyB3cml0ZSBjb3VudGVyOiAlZFxuIiwKKwkJCSByZXQpOworCX0KK30KKworLyoKKyAqIFJlYWQgY3VycmVudCB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IHdtODMxeF9ydGNfcmVhZHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCB3bTgzMXhfcnRjICp3bTgzMXhfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X3J0Yy0+d204MzF4OworCXUxNiB0aW1lMVsyXSwgdGltZTJbMl07CisJaW50IHJldDsKKwlpbnQgY291bnQgPSAwOworCisJLyogSGFzIHRoZSBSVEMgYmVlbiBwcm9ncmFtbWVkPyAqLworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9SVENfQ09OVFJPTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBSVEMgY29udHJvbDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWlmICghKHJldCAmIFdNODMxWF9SVENfVkFMSUQpKSB7CisJCWRldl9kYmcoZGV2LCAiUlRDIG5vdCB5ZXQgY29uZmlndXJlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJlYWQgdHdpY2UgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgYSBjb3JydXB0LCBwYXJ0aWFsbHkKKwkgKiBpbmNyZW1lbnRlZCwgdmFsdWUuCisJICovCisJZG8geworCQlyZXQgPSB3bTgzMXhfYnVsa19yZWFkKHdtODMxeCwgV004MzFYX1JUQ19USU1FXzEsCisJCQkJICAgICAgIDIsIHRpbWUxKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gd204MzF4X2J1bGtfcmVhZCh3bTgzMXgsIFdNODMxWF9SVENfVElNRV8xLAorCQkJCSAgICAgICAyLCB0aW1lMik7CisJCWlmIChyZXQgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZW1jbXAodGltZTEsIHRpbWUyLCBzaXplb2YodGltZTEpKSA9PSAwKSB7CisJCQl1MzIgdGltZSA9ICh0aW1lMVswXSA8PCAxNikgfCB0aW1lMVsxXTsKKworCQkJcnRjX3RpbWVfdG9fdG0odGltZSwgdG0pOworCQkJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7CisJCX0KKworCX0gd2hpbGUgKCsrY291bnQgPCBXTTgzMVhfR0VUX1RJTUVfUkVUUklFUyk7CisKKwlkZXZfZXJyKGRldiwgIlRpbWVkIG91dCByZWFkaW5nIGN1cnJlbnQgdGltZVxuIik7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIFNldCBjdXJyZW50IHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgd204MzF4X3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgdGltZSkKK3sKKwlzdHJ1Y3Qgd204MzF4X3J0YyAqd204MzF4X3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IHdtODMxeF9ydGMtPndtODMxeDsKKwlzdHJ1Y3QgcnRjX3RpbWUgbmV3X3RtOworCXVuc2lnbmVkIGxvbmcgbmV3X3RpbWU7CisJaW50IHJldDsKKwlpbnQgY291bnQgPSAwOworCisJcmV0ID0gd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9SVENfVElNRV8xLAorCQkJICAgICAgICh0aW1lID4+IDE2KSAmIDB4ZmZmZik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gd3JpdGUgVElNRV8xOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgV004MzFYX1JUQ19USU1FXzIsIHRpbWUgJiAweGZmZmYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHdyaXRlIFRJTUVfMjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIHVwZGF0ZSB0byBjb21wbGV0ZSAtIHNob3VsZCBoYXBwZW4gZmlyc3QgdGltZQorCSAqIHJvdW5kIGJ1dCBiZSBjb25zZXJ2YXRpdmUuCisJICovCisJZG8geworCQltc2xlZXAoMSk7CisKKwkJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX1JUQ19DT05UUk9MKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXQgPSBXTTgzMVhfUlRDX1NZTkNfQlVTWTsKKwl9IHdoaWxlICghKHJldCAmIFdNODMxWF9SVENfU1lOQ19CVVNZKSAmJgorCQkgKytjb3VudCA8IFdNODMxWF9TRVRfVElNRV9SRVRSSUVTKTsKKworCWlmIChyZXQgJiBXTTgzMVhfUlRDX1NZTkNfQlVTWSkgeworCQlkZXZfZXJyKGRldiwgIlRpbWVkIG91dCB3cml0aW5nIFJUQyB1cGRhdGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDaGVjayB0aGF0IHRoZSB1cGRhdGUgd2FzIGFjY2VwdGVkOyBzZWN1cml0eSBmZWF0dXJlcyBtYXkKKwkgKiBoYXZlIGNhdXNlZCB0aGUgdXBkYXRlIHRvIGJlIGlnbm9yZWQuCisJICovCisJcmV0ID0gd204MzF4X3J0Y19yZWFkdGltZShkZXYsICZuZXdfdG0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcnRjX3RtX3RvX3RpbWUoJm5ld190bSwgJm5ld190aW1lKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBjb252ZXJ0IHRpbWU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEFsbG93IGEgc2Vjb25kIG9mIGNoYW5nZSBpbiBjYXNlIG9mIHRpY2sgKi8KKwlpZiAobmV3X3RpbWUgLSB0aW1lID4gMSkgeworCQlkZXZfZXJyKGRldiwgIlJUQyB1cGRhdGUgbm90IHBlcm1pdHRlZCBieSBoYXJkd2FyZVxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgd204MzF4X3J0Y19yZWFkYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3Qgd204MzF4X3J0YyAqd204MzF4X3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisJdTE2IGRhdGFbMl07CisJdTMyIHRpbWU7CisKKwlyZXQgPSB3bTgzMXhfYnVsa19yZWFkKHdtODMxeF9ydGMtPndtODMxeCwgV004MzFYX1JUQ19BTEFSTV8xLAorCQkJICAgICAgIDIsIGRhdGEpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIGFsYXJtIHRpbWU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRpbWUgPSAoZGF0YVswXSA8PCAxNikgfCBkYXRhWzFdOworCisJcnRjX3RpbWVfdG9fdG0odGltZSwgJmFscm0tPnRpbWUpOworCisJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeF9ydGMtPndtODMxeCwgV004MzFYX1JUQ19DT05UUk9MKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIFJUQyBjb250cm9sOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmV0ICYgV004MzFYX1JUQ19BTE1fRU5BKQorCQlhbHJtLT5lbmFibGVkID0gMTsKKwllbHNlCisJCWFscm0tPmVuYWJsZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzF4X3J0Y19zdG9wX2FsYXJtKHN0cnVjdCB3bTgzMXhfcnRjICp3bTgzMXhfcnRjKQoreworCXdtODMxeF9ydGMtPmFsYXJtX2VuYWJsZWQgPSAwOworCisJcmV0dXJuIHdtODMxeF9zZXRfYml0cyh3bTgzMXhfcnRjLT53bTgzMXgsIFdNODMxWF9SVENfQ09OVFJPTCwKKwkJCSAgICAgICBXTTgzMVhfUlRDX0FMTV9FTkEsIDApOworfQorCitzdGF0aWMgaW50IHdtODMxeF9ydGNfc3RhcnRfYWxhcm0oc3RydWN0IHdtODMxeF9ydGMgKndtODMxeF9ydGMpCit7CisJd204MzF4X3J0Yy0+YWxhcm1fZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gd204MzF4X3NldF9iaXRzKHdtODMxeF9ydGMtPndtODMxeCwgV004MzFYX1JUQ19DT05UUk9MLAorCQkJICAgICAgIFdNODMxWF9SVENfQUxNX0VOQSwgV004MzFYX1JUQ19BTE1fRU5BKTsKK30KKworc3RhdGljIGludCB3bTgzMXhfcnRjX3NldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHdtODMxeF9ydGMgKndtODMxeF9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfcnRjLT53bTgzMXg7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSgmYWxybS0+dGltZSwgJnRpbWUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNvbnZlcnQgdGltZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gd204MzF4X3J0Y19zdG9wX2FsYXJtKHdtODMxeF9ydGMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHN0b3AgYWxhcm06ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHdtODMxeF9yZWdfd3JpdGUod204MzF4LCBXTTgzMVhfUlRDX0FMQVJNXzEsCisJCQkgICAgICAgKHRpbWUgPj4gMTYpICYgMHhmZmZmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byB3cml0ZSBBTEFSTV8xOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgV004MzFYX1JUQ19BTEFSTV8yLCB0aW1lICYgMHhmZmZmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byB3cml0ZSBBTEFSTV8yOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWxybS0+ZW5hYmxlZCkgeworCQlyZXQgPSB3bTgzMXhfcnRjX3N0YXJ0X2FsYXJtKHdtODMxeF9ydGMpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc3RhcnQgYWxhcm06ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODMxeF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCB3bTgzMXhfcnRjICp3bTgzMXhfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZW5hYmxlZCkKKwkJcmV0dXJuIHdtODMxeF9ydGNfc3RhcnRfYWxhcm0od204MzF4X3J0Yyk7CisJZWxzZQorCQlyZXR1cm4gd204MzF4X3J0Y19zdG9wX2FsYXJtKHdtODMxeF9ydGMpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204MzF4X2FsbV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd204MzF4X3J0YyAqd204MzF4X3J0YyA9IGRhdGE7CisKKwlydGNfdXBkYXRlX2lycSh3bTgzMXhfcnRjLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX0FGKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHdtODMxeF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgPSB3bTgzMXhfcnRjX3JlYWR0aW1lLAorCS5zZXRfbW1zcyA9IHdtODMxeF9ydGNfc2V0X21tc3MsCisJLnJlYWRfYWxhcm0gPSB3bTgzMXhfcnRjX3JlYWRhbGFybSwKKwkuc2V0X2FsYXJtID0gd204MzF4X3J0Y19zZXRhbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZSA9IHdtODMxeF9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qIFR1cm4gb2ZmIHRoZSBhbGFybSBpZiBpdCBzaG91bGQgbm90IGJlIGEgd2FrZSBzb3VyY2UuICovCitzdGF0aWMgaW50IHdtODMxeF9ydGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB3bTgzMXhfcnRjICp3bTgzMXhfcnRjID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWludCByZXQsIGVuYWJsZTsKKworCWlmICh3bTgzMXhfcnRjLT5hbGFybV9lbmFibGVkICYmIGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQllbmFibGUgPSBXTTgzMVhfUlRDX0FMTV9FTkE7CisJZWxzZQorCQllbmFibGUgPSAwOworCisJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeF9ydGMtPndtODMxeCwgV004MzFYX1JUQ19DT05UUk9MLAorCQkJICAgICAgV004MzFYX1JUQ19BTE1fRU5BLCBlbmFibGUpOworCWlmIChyZXQgIT0gMCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHVwZGF0ZSBSVEMgYWxhcm06ICVkXG4iLCByZXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEVuYWJsZSB0aGUgYWxhcm0gaWYgaXQgc2hvdWxkIGJlIGVuYWJsZWQgKGluIGNhc2UgaXQgd2FzIGRpc2FibGVkIHRvCisgKiBwcmV2ZW50IHVzZSBhcyBhIHdha2Ugc291cmNlKS4KKyAqLworc3RhdGljIGludCB3bTgzMXhfcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB3bTgzMXhfcnRjICp3bTgzMXhfcnRjID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWludCByZXQ7CisKKwlpZiAod204MzF4X3J0Yy0+YWxhcm1fZW5hYmxlZCkgeworCQlyZXQgPSB3bTgzMXhfcnRjX3N0YXJ0X2FsYXJtKHdtODMxeF9ydGMpOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byByZXN0YXJ0IFJUQyBhbGFybTogJWRcbiIsIHJldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBhbGFybSAqLworc3RhdGljIGludCB3bTgzMXhfcnRjX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB3bTgzMXhfcnRjICp3bTgzMXhfcnRjID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4X3J0Yy0+d204MzF4LCBXTTgzMVhfUlRDX0NPTlRST0wsCisJCQkgICAgICBXTTgzMVhfUlRDX0FMTV9FTkEsIDApOworCWlmIChyZXQgIT0gMCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHN0b3AgUlRDIGFsYXJtOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgd204MzF4X3J0Y19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgd204MzF4X3J0Y19yZXN1bWUgTlVMTAorI2RlZmluZSB3bTgzMXhfcnRjX2ZyZWV6ZSBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCB3bTgzMXhfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB3bTgzMXhfcnRjICp3bTgzMXhfcnRjOworCWludCBhbG1faXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIkFMTSIpOworCWludCByZXQgPSAwOworCisJd204MzF4X3J0YyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKndtODMxeF9ydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAod204MzF4X3J0YyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdtODMxeF9ydGMpOworCXdtODMxeF9ydGMtPndtODMxeCA9IHdtODMxeDsKKworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9SVENfQ09OVFJPTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgUlRDIGNvbnRyb2w6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKHJldCAmIFdNODMxWF9SVENfQUxNX0VOQSkKKwkJd204MzF4X3J0Yy0+YWxhcm1fZW5hYmxlZCA9IDE7CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisKKwl3bTgzMXhfcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJ3bTgzMXgiLCAmcGRldi0+ZGV2LAorCQkJCQkgICAgICAmd204MzF4X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHdtODMxeF9ydGMtPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUih3bTgzMXhfcnRjLT5ydGMpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShhbG1faXJxLCBOVUxMLCB3bTgzMXhfYWxtX2lycSwKKwkJCQkgICBJUlFGX1RSSUdHRVJfUklTSU5HLCAiUlRDIGFsYXJtIiwKKwkJCQkgICB3bTgzMXhfcnRjKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgYWxhcm0gSVJRICVkOiAlZFxuIiwKKwkJCWFsbV9pcnEsIHJldCk7CisJfQorCisJd204MzF4X3J0Y19hZGRfcmFuZG9tbmVzcyh3bTgzMXgpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB3bTgzMXhfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bTgzMXhfcnRjICp3bTgzMXhfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGFsbV9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiQUxNIik7CisKKwlmcmVlX2lycShhbG1faXJxLCB3bTgzMXhfcnRjKTsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIod204MzF4X3J0Yy0+cnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgd204MzF4X3J0Y19wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSB3bTgzMXhfcnRjX3N1c3BlbmQsCisJLnJlc3VtZSA9IHdtODMxeF9ydGNfcmVzdW1lLAorCisJLmZyZWV6ZSA9IHdtODMxeF9ydGNfZnJlZXplLAorCS50aGF3ID0gd204MzF4X3J0Y19yZXN1bWUsCisJLnJlc3RvcmUgPSB3bTgzMXhfcnRjX3Jlc3VtZSwKKworCS5wb3dlcm9mZiA9IHdtODMxeF9ydGNfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODMxeF9ydGNfZHJpdmVyID0geworCS5wcm9iZSA9IHdtODMxeF9ydGNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODMxeF9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3bTgzMXgtcnRjIiwKKwkJLnBtID0gJndtODMxeF9ydGNfcG1fb3BzLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdtODMxeF9ydGNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBkcml2ZXIgZm9yIHRoZSBXTTgzMXggc2VyaWVzIFBNSUNzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODMxeC1ydGMiKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy13bTgzNTAuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3J0Yy13bTgzNTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmU1MmQxCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXdtODM1MC5jCkBAIC0wLDAgKzEsNDk0IEBACisvKgorICoJUmVhbCBUaW1lIENsb2NrIGRyaXZlciBmb3IgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODM1MAorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwNywgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqICBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgV004MzUwX1NFVF9BTE1fUkVUUklFUwk1CisjZGVmaW5lIFdNODM1MF9TRVRfVElNRV9SRVRSSUVTCTUKKyNkZWZpbmUgV004MzUwX0dFVF9USU1FX1JFVFJJRVMJNQorCisjZGVmaW5lIHRvX3dtODM1MF9mcm9tX3J0Y19kZXYoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB3bTgzNTAsIHJ0Yy5wZGV2LmRldikKKworLyoKKyAqIFJlYWQgY3VycmVudCB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IHdtODM1MF9ydGNfcmVhZHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUxNiB0aW1lMVs0XSwgdGltZTJbNF07CisJaW50IHJldHJpZXMgPSBXTTgzNTBfR0VUX1RJTUVfUkVUUklFUywgcmV0OworCisJLyoKKwkgKiBSZWFkIHRoZSB0aW1lIHR3aWNlIGFuZCBjb21wYXJlLgorCSAqIElmIHRpbWUxID09IHRpbWUyLCB0aGVuIHRpbWUgaXMgdmFsaWQgZWxzZSByZXRyeS4KKwkgKi8KKwlkbyB7CisJCXJldCA9IHdtODM1MF9ibG9ja19yZWFkKHdtODM1MCwgV004MzUwX1JUQ19TRUNPTkRTX01JTlVURVMsCisJCQkJCTQsIHRpbWUxKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSB3bTgzNTBfYmxvY2tfcmVhZCh3bTgzNTAsIFdNODM1MF9SVENfU0VDT05EU19NSU5VVEVTLAorCQkJCQk0LCB0aW1lMik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAobWVtY21wKHRpbWUxLCB0aW1lMiwgc2l6ZW9mKHRpbWUxKSkgPT0gMCkgeworCQkJdG0tPnRtX3NlYyA9IHRpbWUxWzBdICYgV004MzUwX1JUQ19TRUNTX01BU0s7CisKKwkJCXRtLT50bV9taW4gPSAodGltZTFbMF0gJiBXTTgzNTBfUlRDX01JTlNfTUFTSykKKwkJCSAgICA+PiBXTTgzNTBfUlRDX01JTlNfU0hJRlQ7CisKKwkJCXRtLT50bV9ob3VyID0gdGltZTFbMV0gJiBXTTgzNTBfUlRDX0hSU19NQVNLOworCisJCQl0bS0+dG1fd2RheSA9ICgodGltZTFbMV0gPj4gV004MzUwX1JUQ19EQVlfU0hJRlQpCisJCQkJICAgICAgICYgMHg3KSAtIDE7CisKKwkJCXRtLT50bV9tb24gPSAoKHRpbWUxWzJdICYgV004MzUwX1JUQ19NVEhfTUFTSykKKwkJCQkgICAgICA+PiBXTTgzNTBfUlRDX01USF9TSElGVCkgLSAxOworCisJCQl0bS0+dG1fbWRheSA9ICh0aW1lMVsyXSAmIFdNODM1MF9SVENfREFURV9NQVNLKTsKKworCQkJdG0tPnRtX3llYXIgPSAoKHRpbWUxWzNdICYgV004MzUwX1JUQ19ZSFVORFJFRFNfTUFTSykKKwkJCQkgICAgICAgPj4gV004MzUwX1JUQ19ZSFVORFJFRFNfU0hJRlQpICogMTAwOworCQkJdG0tPnRtX3llYXIgKz0gdGltZTFbM10gJiBXTTgzNTBfUlRDX1lVTklUU19NQVNLOworCisJCQl0bS0+dG1feWRheSA9IHJ0Y195ZWFyX2RheXModG0tPnRtX21kYXksIHRtLT50bV9tb24sCisJCQkJCQkgICAgdG0tPnRtX3llYXIpOworCQkJdG0tPnRtX3llYXIgLT0gMTkwMDsKKworCQkJZGV2X2RiZyhkZXYsICJSZWFkICglZCBsZWZ0KTogJTA0eCAlMDR4ICUwNHggJTA0eFxuIiwKKwkJCQlyZXRyaWVzLAorCQkJCXRpbWUxWzBdLCB0aW1lMVsxXSwgdGltZTFbMl0sIHRpbWUxWzNdKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlIChyZXRyaWVzLS0pOworCisJZGV2X2VycihkZXYsICJ0aW1lZCBvdXQgcmVhZGluZyBSVEMgdGltZVxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBTZXQgY3VycmVudCB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IHdtODM1MF9ydGNfc2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTE2IHRpbWVbNF07CisJdTE2IHJ0Y19jdHJsOworCWludCByZXQsIHJldHJpZXMgPSBXTTgzNTBfU0VUX1RJTUVfUkVUUklFUzsKKworCXRpbWVbMF0gPSB0bS0+dG1fc2VjOworCXRpbWVbMF0gfD0gdG0tPnRtX21pbiA8PCBXTTgzNTBfUlRDX01JTlNfU0hJRlQ7CisJdGltZVsxXSA9IHRtLT50bV9ob3VyOworCXRpbWVbMV0gfD0gKHRtLT50bV93ZGF5ICsgMSkgPDwgV004MzUwX1JUQ19EQVlfU0hJRlQ7CisJdGltZVsyXSA9IHRtLT50bV9tZGF5OworCXRpbWVbMl0gfD0gKHRtLT50bV9tb24gKyAxKSA8PCBXTTgzNTBfUlRDX01USF9TSElGVDsKKwl0aW1lWzNdID0gKCh0bS0+dG1feWVhciArIDE5MDApIC8gMTAwKSA8PCBXTTgzNTBfUlRDX1lIVU5EUkVEU19TSElGVDsKKwl0aW1lWzNdIHw9ICh0bS0+dG1feWVhciArIDE5MDApICUgMTAwOworCisJZGV2X2RiZyhkZXYsICJTZXR0aW5nOiAlMDR4ICUwNHggJTA0eCAlMDR4XG4iLAorCQl0aW1lWzBdLCB0aW1lWzFdLCB0aW1lWzJdLCB0aW1lWzNdKTsKKworCS8qIFNldCBSVENfU0VUIHRvIHN0b3AgdGhlIGNsb2NrICovCisJcmV0ID0gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX1JUQ19USU1FX0NPTlRST0wsIFdNODM1MF9SVENfU0VUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdhaXQgdW50aWwgY29uZmlybWF0aW9uIG9mIHN0b3BwaW5nICovCisJZG8geworCQlydGNfY3RybCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9SVENfVElNRV9DT05UUk9MKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxKSk7CisJfSB3aGlsZSAoLS1yZXRyaWVzICYmICEocnRjX2N0cmwgJiBXTTgzNTBfUlRDX1NUUykpOworCisJaWYgKCFyZXRyaWVzKSB7CisJCWRldl9lcnIoZGV2LCAidGltZWQgb3V0IG9uIHNldCBjb25maXJtYXRpb25cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBXcml0ZSB0aW1lIHRvIFJUQyAqLworCXJldCA9IHdtODM1MF9ibG9ja193cml0ZSh3bTgzNTAsIFdNODM1MF9SVENfU0VDT05EU19NSU5VVEVTLCA0LCB0aW1lKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENsZWFyIFJUQ19TRVQgdG8gc3RhcnQgdGhlIGNsb2NrICovCisJcmV0ID0gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfUlRDX1RJTUVfQ09OVFJPTCwKKwkJCQlXTTgzNTBfUlRDX1NFVCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWQgYWxhcm0gdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCB3bTgzNTBfcnRjX3JlYWRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1MTYgdGltZVs0XTsKKwlpbnQgcmV0OworCisJcmV0ID0gd204MzUwX2Jsb2NrX3JlYWQod204MzUwLCBXTTgzNTBfQUxBUk1fU0VDT05EU19NSU5VVEVTLCA0LCB0aW1lKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXRtLT50bV9zZWMgPSB0aW1lWzBdICYgV004MzUwX1JUQ19BTE1TRUNTX01BU0s7CisJaWYgKHRtLT50bV9zZWMgPT0gV004MzUwX1JUQ19BTE1TRUNTX01BU0spCisJCXRtLT50bV9zZWMgPSAtMTsKKworCXRtLT50bV9taW4gPSB0aW1lWzBdICYgV004MzUwX1JUQ19BTE1NSU5TX01BU0s7CisJaWYgKHRtLT50bV9taW4gPT0gV004MzUwX1JUQ19BTE1NSU5TX01BU0spCisJCXRtLT50bV9taW4gPSAtMTsKKwllbHNlCisJCXRtLT50bV9taW4gPj49IFdNODM1MF9SVENfQUxNTUlOU19TSElGVDsKKworCXRtLT50bV9ob3VyID0gdGltZVsxXSAmIFdNODM1MF9SVENfQUxNSFJTX01BU0s7CisJaWYgKHRtLT50bV9ob3VyID09IFdNODM1MF9SVENfQUxNSFJTX01BU0spCisJCXRtLT50bV9ob3VyID0gLTE7CisKKwl0bS0+dG1fd2RheSA9ICgodGltZVsxXSA+PiBXTTgzNTBfUlRDX0FMTURBWV9TSElGVCkgJiAweDcpIC0gMTsKKwlpZiAodG0tPnRtX3dkYXkgPiA3KQorCQl0bS0+dG1fd2RheSA9IC0xOworCisJdG0tPnRtX21vbiA9IHRpbWVbMl0gJiBXTTgzNTBfUlRDX0FMTU1USF9NQVNLOworCWlmICh0bS0+dG1fbW9uID09IFdNODM1MF9SVENfQUxNTVRIX01BU0spCisJCXRtLT50bV9tb24gPSAtMTsKKwllbHNlCisJCXRtLT50bV9tb24gPSAodG0tPnRtX21vbiA+PiBXTTgzNTBfUlRDX0FMTU1USF9TSElGVCkgLSAxOworCisJdG0tPnRtX21kYXkgPSAodGltZVsyXSAmIFdNODM1MF9SVENfQUxNREFURV9NQVNLKTsKKwlpZiAodG0tPnRtX21kYXkgPT0gV004MzUwX1JUQ19BTE1EQVRFX01BU0spCisJCXRtLT50bV9tZGF5ID0gLTE7CisKKwl0bS0+dG1feWVhciA9IC0xOworCisJYWxybS0+ZW5hYmxlZCA9ICEodGltZVszXSAmIFdNODM1MF9SVENfQUxNU1RTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9ydGNfc3RvcF9hbGFybShzdHJ1Y3Qgd204MzUwICp3bTgzNTApCit7CisJaW50IHJldHJpZXMgPSBXTTgzNTBfU0VUX0FMTV9SRVRSSUVTOworCXUxNiBydGNfY3RybDsKKwlpbnQgcmV0OworCisJLyogU2V0IFJUQ19TRVQgdG8gc3RvcCB0aGUgY2xvY2sgKi8KKwlyZXQgPSB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfUlRDX1RJTUVfQ09OVFJPTCwKKwkJCSAgICAgIFdNODM1MF9SVENfQUxNU0VUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdhaXQgdW50aWwgY29uZmlybWF0aW9uIG9mIHN0b3BwaW5nICovCisJZG8geworCQlydGNfY3RybCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9SVENfVElNRV9DT05UUk9MKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxKSk7CisJfSB3aGlsZSAocmV0cmllcy0tICYmICEocnRjX2N0cmwgJiBXTTgzNTBfUlRDX0FMTVNUUykpOworCisJaWYgKCEocnRjX2N0cmwgJiBXTTgzNTBfUlRDX0FMTVNUUykpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX3J0Y19zdGFydF9hbGFybShzdHJ1Y3Qgd204MzUwICp3bTgzNTApCit7CisJaW50IHJldDsKKwlpbnQgcmV0cmllcyA9IFdNODM1MF9TRVRfQUxNX1JFVFJJRVM7CisJdTE2IHJ0Y19jdHJsOworCisJcmV0ID0gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfUlRDX1RJTUVfQ09OVFJPTCwKKwkJCQlXTTgzNTBfUlRDX0FMTVNFVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBXYWl0IHVudGlsIGNvbmZpcm1hdGlvbiAqLworCWRvIHsKKwkJcnRjX2N0cmwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfUlRDX1RJTUVfQ09OVFJPTCk7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMSkpOworCX0gd2hpbGUgKHJldHJpZXMtLSAmJiBydGNfY3RybCAmIFdNODM1MF9SVENfQUxNU1RTKTsKKworCWlmIChydGNfY3RybCAmIFdNODM1MF9SVENfQUxNU1RTKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGVuYWJsZWQpCisJCXJldHVybiB3bTgzNTBfcnRjX3N0YXJ0X2FsYXJtKHdtODM1MCk7CisJZWxzZQorCQlyZXR1cm4gd204MzUwX3J0Y19zdG9wX2FsYXJtKHdtODM1MCk7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX3J0Y19zZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1MTYgdGltZVszXTsKKwlpbnQgcmV0OworCisJbWVtc2V0KHRpbWUsIDAsIHNpemVvZih0aW1lKSk7CisKKwlpZiAodG0tPnRtX3NlYyAhPSAtMSkKKwkJdGltZVswXSB8PSB0bS0+dG1fc2VjOworCWVsc2UKKwkJdGltZVswXSB8PSBXTTgzNTBfUlRDX0FMTVNFQ1NfTUFTSzsKKworCWlmICh0bS0+dG1fbWluICE9IC0xKQorCQl0aW1lWzBdIHw9IHRtLT50bV9taW4gPDwgV004MzUwX1JUQ19BTE1NSU5TX1NISUZUOworCWVsc2UKKwkJdGltZVswXSB8PSBXTTgzNTBfUlRDX0FMTU1JTlNfTUFTSzsKKworCWlmICh0bS0+dG1faG91ciAhPSAtMSkKKwkJdGltZVsxXSB8PSB0bS0+dG1faG91cjsKKwllbHNlCisJCXRpbWVbMV0gfD0gV004MzUwX1JUQ19BTE1IUlNfTUFTSzsKKworCWlmICh0bS0+dG1fd2RheSAhPSAtMSkKKwkJdGltZVsxXSB8PSAodG0tPnRtX3dkYXkgKyAxKSA8PCBXTTgzNTBfUlRDX0FMTURBWV9TSElGVDsKKwllbHNlCisJCXRpbWVbMV0gfD0gV004MzUwX1JUQ19BTE1EQVlfTUFTSzsKKworCWlmICh0bS0+dG1fbWRheSAhPSAtMSkKKwkJdGltZVsyXSB8PSB0bS0+dG1fbWRheTsKKwllbHNlCisJCXRpbWVbMl0gfD0gV004MzUwX1JUQ19BTE1EQVRFX01BU0s7CisKKwlpZiAodG0tPnRtX21vbiAhPSAtMSkKKwkJdGltZVsyXSB8PSAodG0tPnRtX21vbiArIDEpIDw8IFdNODM1MF9SVENfQUxNTVRIX1NISUZUOworCWVsc2UKKwkJdGltZVsyXSB8PSBXTTgzNTBfUlRDX0FMTU1USF9NQVNLOworCisJcmV0ID0gd204MzUwX3J0Y19zdG9wX2FsYXJtKHdtODM1MCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBXcml0ZSB0aW1lIHRvIFJUQyAqLworCXJldCA9IHdtODM1MF9ibG9ja193cml0ZSh3bTgzNTAsIFdNODM1MF9BTEFSTV9TRUNPTkRTX01JTlVURVMsCisJCQkJIDMsIHRpbWUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFscm0tPmVuYWJsZWQpCisJCXJldCA9IHdtODM1MF9ydGNfc3RhcnRfYWxhcm0od204MzUwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTgzNTBfcnRjX2FsYXJtX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBkYXRhOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSB3bTgzNTAtPnJ0Yy5ydGM7CisJaW50IHJldDsKKworCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgUlRDX0lSUUYgfCBSVENfQUYpOworCisJLyogTWFrZSBpdCBvbmUgc2hvdCAqLworCXJldCA9IHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9SVENfVElNRV9DT05UUk9MLAorCQkJICAgICAgV004MzUwX1JUQ19BTE1TRVQpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCYod204MzUwLT5ydGMucGRldi0+ZGV2KSwKKwkJCSJGYWlsZWQgdG8gZGlzYWJsZSBhbGFybTogJWRcbiIsIHJldCk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204MzUwX3J0Y191cGRhdGVfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRhdGE7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHdtODM1MC0+cnRjLnJ0YzsKKworCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgUlRDX0lSUUYgfCBSVENfVUYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgd204MzUwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZSA9IHdtODM1MF9ydGNfcmVhZHRpbWUsCisJLnNldF90aW1lID0gd204MzUwX3J0Y19zZXR0aW1lLAorCS5yZWFkX2FsYXJtID0gd204MzUwX3J0Y19yZWFkYWxhcm0sCisJLnNldF9hbGFybSA9IHdtODM1MF9ydGNfc2V0YWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSB3bTgzNTBfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHdtODM1MF9ydGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgcmVnOworCisJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1JUQ19USU1FX0NPTlRST0wpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZ3bTgzNTAtPnJ0Yy5wZGV2LT5kZXYpICYmCisJICAgIHJlZyAmIFdNODM1MF9SVENfQUxNU1RTKSB7CisJCXJldCA9IHdtODM1MF9ydGNfc3RvcF9hbGFybSh3bTgzNTApOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc3RvcCBSVEMgYWxhcm06ICVkXG4iLAorCQkJCXJldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTgzNTBfcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKHdtODM1MC0+cnRjLmFsYXJtX2VuYWJsZWQpIHsKKwkJcmV0ID0gd204MzUwX3J0Y19zdGFydF9hbGFybSh3bTgzNTApOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byByZXN0YXJ0IFJUQyBhbGFybTogJWRcbiIsIHJldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHdtODM1MF9ydGNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHdtODM1MF9ydGNfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHdtODM1MF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgd204MzUwX3J0YyAqd21fcnRjID0gJndtODM1MC0+cnRjOworCWludCByZXQgPSAwOworCXUxNiB0aW1lY3RsLCBwb3dlcjU7CisKKwl0aW1lY3RsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1JUQ19USU1FX0NPTlRST0wpOworCWlmICh0aW1lY3RsICYgV004MzUwX1JUQ19CQ0QpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUlRDIEJDRCBtb2RlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHRpbWVjdGwgJiBXTTgzNTBfUlRDXzEySFIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUlRDIDEyIGhvdXIgbW9kZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZW5hYmxlIHRoZSBSVEMgaWYgaXQncyBub3QgYWxyZWFkeSBlbmFibGVkICovCisJcG93ZXI1ID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1BPV0VSX01HTVRfNSk7CisJaWYgKCEocG93ZXI1ICYgIFdNODM1MF9SVENfVElDS19FTkEpKSB7CisJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiU3RhcnRpbmcgUlRDXG4iKTsKKworCQl3bTgzNTBfcmVnX3VubG9jayh3bTgzNTApOworCisJCXJldCA9IHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzUsCisJCQkJICAgICAgV004MzUwX1JUQ19USUNLX0VOQSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIFJUQzogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJd204MzUwX3JlZ19sb2NrKHdtODM1MCk7CisJfQorCisJaWYgKHRpbWVjdGwgJiBXTTgzNTBfUlRDX1NUUykgeworCQlpbnQgcmV0cmllczsKKworCQlyZXQgPSB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9SVENfVElNRV9DT05UUk9MLAorCQkJCQlXTTgzNTBfUlRDX1NFVCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc3RhcnQ6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldHJpZXMgPSBXTTgzNTBfU0VUX1RJTUVfUkVUUklFUzsKKwkJZG8geworCQkJdGltZWN0bCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsCisJCQkJCQkgIFdNODM1MF9SVENfVElNRV9DT05UUk9MKTsKKwkJfSB3aGlsZSAodGltZWN0bCAmIFdNODM1MF9SVENfU1RTICYmIC0tcmV0cmllcyk7CisKKwkJaWYgKHJldHJpZXMgPT0gMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHN0YXJ0OiB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCisJd21fcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJ3bTgzNTAiLCAmcGRldi0+ZGV2LAorCQkJCQkgICZ3bTgzNTBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIod21fcnRjLT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIod21fcnRjLT5ydGMpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgUlRDOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9SVENfU0VDLAorCQkJICAgIHdtODM1MF9ydGNfdXBkYXRlX2hhbmRsZXIsIDAsCisJCQkgICAgIlJUQyBTZWNvbmRzIiwgd204MzUwKTsKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX1JUQ19TRUMpOworCisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfUlRDX0FMTSwKKwkJCSAgICB3bTgzNTBfcnRjX2FsYXJtX2hhbmRsZXIsIDAsCisJCQkgICAgIlJUQyBBbGFybSIsIHdtODM1MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd204MzUwX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgd204MzUwX3J0YyAqd21fcnRjID0gJndtODM1MC0+cnRjOworCisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9SVENfU0VDLCB3bTgzNTApOworCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfUlRDX0FMTSwgd204MzUwKTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcih3bV9ydGMtPnJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHdtODM1MF9ydGNfcG1fb3BzID0geworCS5zdXNwZW5kID0gd204MzUwX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUgPSB3bTgzNTBfcnRjX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODM1MF9ydGNfZHJpdmVyID0geworCS5wcm9iZSA9IHdtODM1MF9ydGNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODM1MF9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3bTgzNTAtcnRjIiwKKwkJLnBtID0gJndtODM1MF9ydGNfcG1fb3BzLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdtODM1MF9ydGNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBkcml2ZXIgZm9yIHRoZSBXTTgzNTAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06d204MzUwLXJ0YyIpOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXgxMjA1LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy9ydGMteDEyMDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDNiM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvcnRjLXgxMjA1LmMKQEAgLTAsMCArMSw2MzMgQEAKKy8qCisgKiBBbiBpMmMgZHJpdmVyIGZvciB0aGUgWGljb3IvSW50ZXJzaWwgWDEyMDUgUlRDCisgKiBDb3B5cmlnaHQgMjAwNCBLYXJlbiBTcGVhcmVsCisgKiBDb3B5cmlnaHQgMjAwNSBBbGVzc2FuZHJvIFp1bW1vCisgKgorICogcGxlYXNlIHNlbmQgYWxsIHJlcG9ydHMgdG86CisgKiAJS2FyZW4gU3BlYXJlbCA8a2FzMTExIGF0IGdtYWlsIGRvdCBjb20+CisgKglBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4KKyAqCisgKiBiYXNlZCBvbiBhIGxvdCBvZiBvdGhlciBSVEMgZHJpdmVycy4KKyAqCisgKiBJbmZvcm1hdGlvbiBhbmQgZGF0YXNoZWV0OgorICogaHR0cDovL3d3dy5pbnRlcnNpbC5jb20vY2RhL2RldmljZWluZm8vMCwxNDc3LFgxMjA1LDAwLmh0bWwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjAuOCIKKworLyogb2Zmc2V0cyBpbnRvIENDUiBhcmVhICovCisKKyNkZWZpbmUgQ0NSX1NFQwkJCTAKKyNkZWZpbmUgQ0NSX01JTgkJCTEKKyNkZWZpbmUgQ0NSX0hPVVIJCTIKKyNkZWZpbmUgQ0NSX01EQVkJCTMKKyNkZWZpbmUgQ0NSX01PTlRICQk0CisjZGVmaW5lIENDUl9ZRUFSCQk1CisjZGVmaW5lIENDUl9XREFZCQk2CisjZGVmaW5lIENDUl9ZMksJCQk3CisKKyNkZWZpbmUgWDEyMDVfUkVHX1NSCQkweDNGCS8qIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBYMTIwNV9SRUdfWTJLCQkweDM3CisjZGVmaW5lIFgxMjA1X1JFR19EVwkJMHgzNgorI2RlZmluZSBYMTIwNV9SRUdfWVIJCTB4MzUKKyNkZWZpbmUgWDEyMDVfUkVHX01PCQkweDM0CisjZGVmaW5lIFgxMjA1X1JFR19EVAkJMHgzMworI2RlZmluZSBYMTIwNV9SRUdfSFIJCTB4MzIKKyNkZWZpbmUgWDEyMDVfUkVHX01OCQkweDMxCisjZGVmaW5lIFgxMjA1X1JFR19TQwkJMHgzMAorI2RlZmluZSBYMTIwNV9SRUdfRFRSCQkweDEzCisjZGVmaW5lIFgxMjA1X1JFR19BVFIJCTB4MTIKKyNkZWZpbmUgWDEyMDVfUkVHX0lOVAkJMHgxMQorI2RlZmluZSBYMTIwNV9SRUdfMAkJMHgxMAorI2RlZmluZSBYMTIwNV9SRUdfWTJLMQkJMHgwRgorI2RlZmluZSBYMTIwNV9SRUdfRFdBMQkJMHgwRQorI2RlZmluZSBYMTIwNV9SRUdfWVJBMQkJMHgwRAorI2RlZmluZSBYMTIwNV9SRUdfTU9BMQkJMHgwQworI2RlZmluZSBYMTIwNV9SRUdfRFRBMQkJMHgwQgorI2RlZmluZSBYMTIwNV9SRUdfSFJBMQkJMHgwQQorI2RlZmluZSBYMTIwNV9SRUdfTU5BMQkJMHgwOQorI2RlZmluZSBYMTIwNV9SRUdfU0NBMQkJMHgwOAorI2RlZmluZSBYMTIwNV9SRUdfWTJLMAkJMHgwNworI2RlZmluZSBYMTIwNV9SRUdfRFdBMAkJMHgwNgorI2RlZmluZSBYMTIwNV9SRUdfWVJBMAkJMHgwNQorI2RlZmluZSBYMTIwNV9SRUdfTU9BMAkJMHgwNAorI2RlZmluZSBYMTIwNV9SRUdfRFRBMAkJMHgwMworI2RlZmluZSBYMTIwNV9SRUdfSFJBMAkJMHgwMgorI2RlZmluZSBYMTIwNV9SRUdfTU5BMAkJMHgwMQorI2RlZmluZSBYMTIwNV9SRUdfU0NBMAkJMHgwMAorCisjZGVmaW5lIFgxMjA1X0NDUl9CQVNFCQkweDMwCS8qIEJhc2UgYWRkcmVzcyBvZiBDQ1IgKi8KKyNkZWZpbmUgWDEyMDVfQUxNMF9CQVNFCQkweDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBBTEFSTTAgKi8KKworI2RlZmluZSBYMTIwNV9TUl9SVENGCQkweDAxCS8qIENsb2NrIGZhaWx1cmUgKi8KKyNkZWZpbmUgWDEyMDVfU1JfV0VMCQkweDAyCS8qIFdyaXRlIEVuYWJsZSBMYXRjaCAqLworI2RlZmluZSBYMTIwNV9TUl9SV0VMCQkweDA0CS8qIFJlZ2lzdGVyIFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBYMTIwNV9TUl9BTDAJCTB4MjAJLyogQWxhcm0gMCBtYXRjaCAqLworCisjZGVmaW5lIFgxMjA1X0RUUl9EVFIwCQkweDAxCisjZGVmaW5lIFgxMjA1X0RUUl9EVFIxCQkweDAyCisjZGVmaW5lIFgxMjA1X0RUUl9EVFIyCQkweDA0CisKKyNkZWZpbmUgWDEyMDVfSFJfTUlMCQkweDgwCS8qIFNldCBpbiBjY3IuaG91ciBmb3IgMjQgaHIgbW9kZSAqLworCisjZGVmaW5lIFgxMjA1X0lOVF9BTDBFCQkweDIwCS8qIEFsYXJtIDAgZW5hYmxlICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB4MTIwNV9kcml2ZXI7CisKKy8qCisgKiBJbiB0aGUgcm91dGluZXMgdGhhdCBkZWFsIGRpcmVjdGx5IHdpdGggdGhlIHgxMjA1IGhhcmR3YXJlLCB3ZSB1c2UKKyAqIHJ0Y190aW1lIC0tIG1vbnRoIDAtMTEsIGhvdXIgMC0yMywgeXIgPSBjYWxlbmRhciB5ZWFyLWVwb2NoCisgKiBFcG9jaCBpcyBpbml0aWFsaXplZCBhcyAyMDAwLiBUaW1lIGlzIHNldCB0byBVVEMuCisgKi8KK3N0YXRpYyBpbnQgeDEyMDVfZ2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0sCisJCQkJdW5zaWduZWQgY2hhciByZWdfYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGR0X2FkZHJbMl0gPSB7IDAsIHJlZ19iYXNlIH07CisJdW5zaWduZWQgY2hhciBidWZbOF07CisJaW50IGk7CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsgY2xpZW50LT5hZGRyLCAwLCAyLCBkdF9hZGRyIH0sCS8qIHNldHVwIHJlYWQgcHRyICovCisJCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgOCwgYnVmIH0sCS8qIHJlYWQgZGF0ZSAqLworCX07CisKKwkvKiByZWFkIGRhdGUgcmVnaXN0ZXJzICovCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZtc2dzWzBdLCAyKSAhPSAyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHJlYWQgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCSIlczogcmF3IHJlYWQgZGF0YSAtIHNlYz0lMDJ4LCBtaW49JTAyeCwgaHI9JTAyeCwgIgorCQkibWRheT0lMDJ4LCBtb249JTAyeCwgeWVhcj0lMDJ4LCB3ZGF5PSUwMngsIHkyaz0lMDJ4XG4iLAorCQlfX2Z1bmNfXywKKwkJYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAorCQlidWZbNF0sIGJ1Zls1XSwgYnVmWzZdLCBidWZbN10pOworCisJLyogTWFzayBvdXQgdGhlIGVuYWJsZSBiaXRzIGlmIHRoZXNlIGFyZSBhbGFybSByZWdpc3RlcnMgKi8KKwlpZiAocmVnX2Jhc2UgPCBYMTIwNV9DQ1JfQkFTRSkKKwkJZm9yIChpID0gMDsgaSA8PSA0OyBpKyspCisJCQlidWZbaV0gJj0gMHg3RjsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKGJ1ZltDQ1JfU0VDXSk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4oYnVmW0NDUl9NSU5dKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oYnVmW0NDUl9IT1VSXSAmIDB4M0YpOyAvKiBociBpcyAwLTIzICovCisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGJ1ZltDQ1JfTURBWV0pOworCXRtLT50bV9tb24gPSBiY2QyYmluKGJ1ZltDQ1JfTU9OVEhdKSAtIDE7IC8qIG1vbiBpcyAwLTExICovCisJdG0tPnRtX3llYXIgPSBiY2QyYmluKGJ1ZltDQ1JfWUVBUl0pCisJCQkrIChiY2QyYmluKGJ1ZltDQ1JfWTJLXSkgKiAxMDApIC0gMTkwMDsKKwl0bS0+dG1fd2RheSA9IGJ1ZltDQ1JfV0RBWV07CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiB0bSBpcyBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCwgIgorCQkibWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQlfX2Z1bmNfXywKKwkJdG0tPnRtX3NlYywgdG0tPnRtX21pbiwgdG0tPnRtX2hvdXIsCisJCXRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeDEyMDVfZ2V0X3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjaGFyICpzcikKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzcl9hZGRyWzJdID0geyAwLCBYMTIwNV9SRUdfU1IgfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeyBjbGllbnQtPmFkZHIsIDAsIDIsIHNyX2FkZHIgfSwJLyogc2V0dXAgcmVhZCBwdHIgKi8KKwkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAxLCBzciB9LAkvKiByZWFkIHN0YXR1cyAqLworCX07CisKKwkvKiByZWFkIHN0YXR1cyByZWdpc3RlciAqLworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnc1swXSwgMikgIT0gMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHgxMjA1X3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtLAorCQkJdTggcmVnX2Jhc2UsIHVuc2lnbmVkIGNoYXIgYWxtX2VuYWJsZSkKK3sKKwlpbnQgaSwgeGZlcjsKKwl1bnNpZ25lZCBjaGFyIHJkYXRhWzEwXSA9IHsgMCwgcmVnX2Jhc2UgfTsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSByZGF0YSArIDI7CisKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB3ZWxbM10gPSB7IDAsIFgxMjA1X1JFR19TUiwKKwkJCQkJCVgxMjA1X1NSX1dFTCB9OworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcndlbFszXSA9IHsgMCwgWDEyMDVfUkVHX1NSLAorCQkJCQkJWDEyMDVfU1JfV0VMIHwgWDEyMDVfU1JfUldFTCB9OworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGlzd2VbM10gPSB7IDAsIFgxMjA1X1JFR19TUiwgMCB9OworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCSIlczogc2VjPSVkIG1pbj0lZCBob3VyPSVkIG1kYXk9JWQgbW9uPSVkIHllYXI9JWQgd2RheT0lZFxuIiwKKwkJX19mdW5jX18sIHRtLT50bV9zZWMsIHRtLT50bV9taW4sIHRtLT50bV9ob3VyLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKKworCWJ1ZltDQ1JfU0VDXSA9IGJpbjJiY2QodG0tPnRtX3NlYyk7CisJYnVmW0NDUl9NSU5dID0gYmluMmJjZCh0bS0+dG1fbWluKTsKKworCS8qIHNldCBob3VyIGFuZCAyNGhyIGJpdCAqLworCWJ1ZltDQ1JfSE9VUl0gPSBiaW4yYmNkKHRtLT50bV9ob3VyKSB8IFgxMjA1X0hSX01JTDsKKworCWJ1ZltDQ1JfTURBWV0gPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsKKworCS8qIG1vbnRoLCAxIC0gMTIgKi8KKwlidWZbQ0NSX01PTlRIXSA9IGJpbjJiY2QodG0tPnRtX21vbiArIDEpOworCisJLyogeWVhciwgc2luY2UgdGhlIHJ0YyBlcG9jaCovCisJYnVmW0NDUl9ZRUFSXSA9IGJpbjJiY2QodG0tPnRtX3llYXIgJSAxMDApOworCWJ1ZltDQ1JfV0RBWV0gPSB0bS0+dG1fd2RheSAmIDB4MDc7CisJYnVmW0NDUl9ZMktdID0gYmluMmJjZCgodG0tPnRtX3llYXIgKyAxOTAwKSAvIDEwMCk7CisKKwkvKiBJZiB3cml0aW5nIGFsYXJtIHJlZ2lzdGVycywgc2V0IGNvbXBhcmUgYml0cyBvbiByZWdpc3RlcnMgMC00ICovCisJaWYgKHJlZ19iYXNlIDwgWDEyMDVfQ0NSX0JBU0UpCisJCWZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKQorCQkJYnVmW2ldIHw9IDB4ODA7CisKKwkvKiB0aGlzIHNlcXVlbmNlIGlzIHJlcXVpcmVkIHRvIHVubG9jayB0aGUgY2hpcCAqLworCWlmICgoeGZlciA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIHdlbCwgMykpICE9IDMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogd2VsIC0gJWRcbiIsIF9fZnVuY19fLCB4ZmVyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCh4ZmVyID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgcndlbCwgMykpICE9IDMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcndlbCAtICVkXG4iLCBfX2Z1bmNfXywgeGZlcik7CisJCXJldHVybiAtRUlPOworCX0KKworCXhmZXIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCByZGF0YSwgc2l6ZW9mKHJkYXRhKSk7CisJaWYgKHhmZXIgIT0gc2l6ZW9mKHJkYXRhKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSIlczogcmVzdWx0PSVkIGFkZHI9JTAyeCwgZGF0YT0lMDJ4XG4iLAorCQkJX19mdW5jX18sCisJCQkgeGZlciwgcmRhdGFbMV0sIHJkYXRhWzJdKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogSWYgd2Ugd3JvdGUgdG8gdGhlIG5vbnZvbGF0aWxlIHJlZ2lvbiwgd2FpdCAxMG1zZWMgZm9yIHdyaXRlIGN5Y2xlKi8KKwlpZiAocmVnX2Jhc2UgPCBYMTIwNV9DQ1JfQkFTRSkgeworCQl1bnNpZ25lZCBjaGFyIGFsMGVbM10gPSB7IDAsIFgxMjA1X1JFR19JTlQsIDAgfTsKKworCQltc2xlZXAoMTApOworCisJCS8qIC4uLmFuZCBzZXQgb3IgY2xlYXIgdGhlIEFMMEUgYml0IGluIHRoZSBJTlQgcmVnaXN0ZXIgKi8KKworCQkvKiBOZWVkIHRvIHNldCBSV0VMIGFnYWluIGFzIHRoZSB3cml0ZSBoYXMgY2xlYXJlZCBpdCAqLworCQl4ZmVyID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgcndlbCwgMyk7CisJCWlmICh4ZmVyICE9IDMpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSIlczogYWxvZSByd2VsIC0gJWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJeGZlcik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChhbG1fZW5hYmxlKQorCQkJYWwwZVsyXSA9IFgxMjA1X0lOVF9BTDBFOworCisJCXhmZXIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBhbDBlLCAzKTsKKwkJaWYgKHhmZXIgIT0gMykgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJIiVzOiBhbDBlIC0gJWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJeGZlcik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIGFuZCB3YWl0IDEwbXNlYyBhZ2FpbiBmb3IgdGhpcyB3cml0ZSB0byBjb21wbGV0ZSAqLworCQltc2xlZXAoMTApOworCX0KKworCS8qIGRpc2FibGUgZnVydGhlciB3cml0ZXMgKi8KKwlpZiAoKHhmZXIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkaXN3ZSwgMykpICE9IDMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogZGlzd2UgLSAlZFxuIiwgX19mdW5jX18sIHhmZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4MTIwNV9maXhfb3NjKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwltZW1zZXQoJnRtLCAwLCBzaXplb2YodG0pKTsKKworCWVyciA9IHgxMjA1X3NldF9kYXRldGltZShjbGllbnQsICZ0bSwgWDEyMDVfQ0NSX0JBU0UsIDApOworCWlmIChlcnIgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZXN0YXJ0IHRoZSBvc2NpbGxhdG9yXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgeDEyMDVfZ2V0X2R0cmltKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCAqdHJpbSkKK3sKKwl1bnNpZ25lZCBjaGFyIGR0cjsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBkdHJfYWRkclsyXSA9IHsgMCwgWDEyMDVfUkVHX0RUUiB9OworCisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7IGNsaWVudC0+YWRkciwgMCwgMiwgZHRyX2FkZHIgfSwJLyogc2V0dXAgcmVhZCBwdHIgKi8KKwkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAxLCAmZHRyIH0sIAkvKiByZWFkIGR0ciAqLworCX07CisKKwkvKiByZWFkIGR0ciByZWdpc3RlciAqLworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnc1swXSwgMikgIT0gMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IHJhdyBkdHI9JXhcbiIsIF9fZnVuY19fLCBkdHIpOworCisJKnRyaW0gPSAwOworCisJaWYgKGR0ciAmIFgxMjA1X0RUUl9EVFIwKQorCQkqdHJpbSArPSAyMDsKKworCWlmIChkdHIgJiBYMTIwNV9EVFJfRFRSMSkKKwkJKnRyaW0gKz0gMTA7CisKKwlpZiAoZHRyICYgWDEyMDVfRFRSX0RUUjIpCisJCSp0cmltID0gLSp0cmltOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeDEyMDVfZ2V0X2F0cmltKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCAqdHJpbSkKK3sKKwlzOCBhdHI7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgYXRyX2FkZHJbMl0gPSB7IDAsIFgxMjA1X1JFR19BVFIgfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeyBjbGllbnQtPmFkZHIsIDAsIDIsIGF0cl9hZGRyIH0sCS8qIHNldHVwIHJlYWQgcHRyICovCisJCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgMSwgJmF0ciB9LCAJLyogcmVhZCBhdHIgKi8KKwl9OworCisJLyogcmVhZCBhdHIgcmVnaXN0ZXIgKi8KKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgJm1zZ3NbMF0sIDIpICE9IDIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZCBlcnJvclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiByYXcgYXRyPSV4XG4iLCBfX2Z1bmNfXywgYXRyKTsKKworCS8qIGF0ciBpcyBhIHR3bydzIGNvbXBsZW1lbnQgdmFsdWUgb24gNiBiaXRzLAorCSAqIHBlcmZvcm0gc2lnbiBleHRlbnNpb24uIFRoZSBmb3JtdWxhIGlzCisJICogQ2F0ciA9IChhdHIgKiAwLjI1cEYpICsgMTEuMDBwRi4KKwkgKi8KKwlpZiAoYXRyICYgMHgyMCkKKwkJYXRyIHw9IDB4QzA7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiByYXcgYXRyPSV4ICglZClcbiIsIF9fZnVuY19fLCBhdHIsIGF0cik7CisKKwkqdHJpbSA9IChhdHIgKiAyNTApICsgMTEwMDA7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiByZWFsPSVkXG4iLCBfX2Z1bmNfXywgKnRyaW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB4MTIwNV9saW1pdAoreworCXVuc2lnbmVkIGNoYXIgcmVnLCBtYXNrLCBtaW4sIG1heDsKK307CisKK3N0YXRpYyBpbnQgeDEyMDVfdmFsaWRhdGVfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGksIHhmZXI7CisKKwkvKiBQcm9iZSBhcnJheS4gV2Ugd2lsbCByZWFkIHRoZSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkCisJICogYWRkcmVzcyBhbmQgY2hlY2sgaWYgdGhlIGdpdmVuIGJpdHMgYXJlIHplcm8uCisJICovCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHJvYmVfemVyb19wYXR0ZXJuW10gPSB7CisJCS8qIHJlZ2lzdGVyLCBtYXNrICovCisJCVgxMjA1X1JFR19TUiwJMHgxOCwKKwkJWDEyMDVfUkVHX0RUUiwJMHhGOCwKKwkJWDEyMDVfUkVHX0FUUiwJMHhDMCwKKwkJWDEyMDVfUkVHX0lOVCwJMHgxOCwKKwkJWDEyMDVfUkVHXzAsCTB4RkYsCisJfTsKKworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeDEyMDVfbGltaXQgcHJvYmVfbGltaXRzX3BhdHRlcm5bXSA9IHsKKwkJLyogcmVnaXN0ZXIsIG1hc2ssIG1pbiwgbWF4ICovCisJCXsgWDEyMDVfUkVHX1kySywJMHhGRiwJMTksCTIwCX0sCisJCXsgWDEyMDVfUkVHX0RXLAkJMHhGRiwJMCwJNgl9LAorCQl7IFgxMjA1X1JFR19ZUiwJCTB4RkYsCTAsCTk5CX0sCisJCXsgWDEyMDVfUkVHX01PLAkJMHhGRiwJMCwJMTIJfSwKKwkJeyBYMTIwNV9SRUdfRFQsCQkweEZGLAkwLAkzMQl9LAorCQl7IFgxMjA1X1JFR19IUiwJCTB4N0YsCTAsCTIzCX0sCisJCXsgWDEyMDVfUkVHX01OLAkJMHhGRiwJMCwJNTkJfSwKKwkJeyBYMTIwNV9SRUdfU0MsCQkweEZGLAkwLAk1OQl9LAorCQl7IFgxMjA1X1JFR19ZMksxLAkweEZGLAkxOSwJMjAJfSwKKwkJeyBYMTIwNV9SRUdfWTJLMCwJMHhGRiwJMTksCTIwCX0sCisJfTsKKworCS8qIGNoZWNrIHRoYXQgcmVnaXN0ZXJzIGhhdmUgYml0cyBhIDAgd2hlcmUgZXhwZWN0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm9iZV96ZXJvX3BhdHRlcm4pOyBpICs9IDIpIHsKKwkJdW5zaWduZWQgY2hhciBidWY7CisKKwkJdW5zaWduZWQgY2hhciBhZGRyWzJdID0geyAwLCBwcm9iZV96ZXJvX3BhdHRlcm5baV0gfTsKKworCQlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0geworCQkJeyBjbGllbnQtPmFkZHIsIDAsIDIsIGFkZHIgfSwKKwkJCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgMSwgJmJ1ZiB9LAorCQl9OworCisJCWlmICgoeGZlciA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpKSAhPSAyKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiJXM6IGNvdWxkIG5vdCByZWFkIHJlZ2lzdGVyICV4XG4iLAorCQkJCV9fZnVuY19fLCBwcm9iZV96ZXJvX3BhdHRlcm5baV0pOworCisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmICgoYnVmICYgcHJvYmVfemVyb19wYXR0ZXJuW2krMV0pICE9IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSIlczogcmVnaXN0ZXI9JTAyeCwgemVybyBwYXR0ZXJuPSVkLCB2YWx1ZT0leFxuIiwKKwkJCQlfX2Z1bmNfXywgcHJvYmVfemVyb19wYXR0ZXJuW2ldLCBpLCBidWYpOworCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qIGNoZWNrIGxpbWl0cyAob25seSByZWdpc3RlcnMgd2l0aCBiY2QgdmFsdWVzKSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByb2JlX2xpbWl0c19wYXR0ZXJuKTsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgcmVnLCB2YWx1ZTsKKworCQl1bnNpZ25lZCBjaGFyIGFkZHJbMl0gPSB7IDAsIHByb2JlX2xpbWl0c19wYXR0ZXJuW2ldLnJlZyB9OworCisJCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7CisJCQl7IGNsaWVudC0+YWRkciwgMCwgMiwgYWRkciB9LAorCQkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAxLCAmcmVnIH0sCisJCX07CisKKwkJaWYgKCh4ZmVyID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikpICE9IDIpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSIlczogY291bGQgbm90IHJlYWQgcmVnaXN0ZXIgJXhcbiIsCisJCQkJX19mdW5jX18sIHByb2JlX2xpbWl0c19wYXR0ZXJuW2ldLnJlZyk7CisKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJdmFsdWUgPSBiY2QyYmluKHJlZyAmIHByb2JlX2xpbWl0c19wYXR0ZXJuW2ldLm1hc2spOworCisJCWlmICh2YWx1ZSA+IHByb2JlX2xpbWl0c19wYXR0ZXJuW2ldLm1heCB8fAorCQkJdmFsdWUgPCBwcm9iZV9saW1pdHNfcGF0dGVybltpXS5taW4pIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkJCSIlczogcmVnaXN0ZXI9JXgsIGxpbSBwYXR0ZXJuPSVkLCB2YWx1ZT0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcHJvYmVfbGltaXRzX3BhdHRlcm5baV0ucmVnLAorCQkJCWksIHZhbHVlKTsKKworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4MTIwNV9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBpbnRyZWcsIHN0YXR1czsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBpbnRfYWRkclsyXSA9IHsgMCwgWDEyMDVfUkVHX0lOVCB9OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7IGNsaWVudC0+YWRkciwgMCwgMiwgaW50X2FkZHIgfSwgICAgICAgIC8qIHNldHVwIHJlYWQgcHRyICovCisJCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgMSwgJmludHJlZyB9LCAgLyogcmVhZCBJTlQgcmVnaXN0ZXIgKi8KKwl9OworCisJLyogcmVhZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgYW5kIHN0YXR1cyByZWdpc3RlciAqLworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnc1swXSwgMikgIT0gMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKwllcnIgPSB4MTIwNV9nZXRfc3RhdHVzKGNsaWVudCwgJnN0YXR1cyk7CisJaWYgKGVyciA9PSAwKSB7CisJCWFscm0tPnBlbmRpbmcgPSAoc3RhdHVzICYgWDEyMDVfU1JfQUwwKSA/IDEgOiAwOworCQlhbHJtLT5lbmFibGVkID0gKGludHJlZyAmIFgxMjA1X0lOVF9BTDBFKSA/IDEgOiAwOworCQllcnIgPSB4MTIwNV9nZXRfZGF0ZXRpbWUoY2xpZW50LCAmYWxybS0+dGltZSwgWDEyMDVfQUxNMF9CQVNFKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB4MTIwNV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJcmV0dXJuIHgxMjA1X3NldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksCisJCSZhbHJtLT50aW1lLCBYMTIwNV9BTE0wX0JBU0UsIGFscm0tPmVuYWJsZWQpOworfQorCitzdGF0aWMgaW50IHgxMjA1X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiB4MTIwNV9nZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLAorCQl0bSwgWDEyMDVfQ0NSX0JBU0UpOworfQorCitzdGF0aWMgaW50IHgxMjA1X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIHgxMjA1X3NldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksCisJCXRtLCBYMTIwNV9DQ1JfQkFTRSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgeDEyMDVfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlpbnQgZXJyLCBkdHJpbSwgYXRyaW07CisKKwlpZiAoKGVyciA9IHgxMjA1X2dldF9kdHJpbSh0b19pMmNfY2xpZW50KGRldiksICZkdHJpbSkpID09IDApCisJCXNlcV9wcmludGYoc2VxLCAiZGlnaXRhbF90cmltXHQ6ICVkIHBwbVxuIiwgZHRyaW0pOworCisJaWYgKChlcnIgPSB4MTIwNV9nZXRfYXRyaW0odG9faTJjX2NsaWVudChkZXYpLCAmYXRyaW0pKSA9PSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgImFuYWxvZ190cmltXHQ6ICVkLiUwMmQgcEZcbiIsCisJCQlhdHJpbSAvIDEwMDAsIGF0cmltICUgMTAwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB4MTIwNV9ydGNfb3BzID0geworCS5wcm9jCQk9IHgxMjA1X3J0Y19wcm9jLAorCS5yZWFkX3RpbWUJPSB4MTIwNV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHgxMjA1X3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IHgxMjA1X3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSB4MTIwNV9ydGNfc2V0X2FsYXJtLAorfTsKKworc3RhdGljIHNzaXplX3QgeDEyMDVfc3lzZnNfc2hvd19hdHJpbShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgZXJyLCBhdHJpbTsKKworCWVyciA9IHgxMjA1X2dldF9hdHJpbSh0b19pMmNfY2xpZW50KGRldiksICZhdHJpbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwMmQgcEZcbiIsIGF0cmltIC8gMTAwMCwgYXRyaW0gJSAxMDAwKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhdHJpbSwgU19JUlVHTywgeDEyMDVfc3lzZnNfc2hvd19hdHJpbSwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHgxMjA1X3N5c2ZzX3Nob3dfZHRyaW0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGVyciwgZHRyaW07CisKKwllcnIgPSB4MTIwNV9nZXRfZHRyaW0odG9faTJjX2NsaWVudChkZXYpLCAmZHRyaW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZCBwcG1cbiIsIGR0cmltKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihkdHJpbSwgU19JUlVHTywgeDEyMDVfc3lzZnNfc2hvd19kdHJpbSwgTlVMTCk7CisKK3N0YXRpYyBpbnQgeDEyMDVfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYXRyaW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHRyaW0pOworCWlmIChlcnIpCisJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9hdHJpbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB4MTIwNV9zeXNmc191bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYXRyaW0pOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9kdHJpbSk7Cit9CisKKworc3RhdGljIGludCB4MTIwNV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGNoYXIgc3I7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICh4MTIwNV92YWxpZGF0ZV9jbGllbnQoY2xpZW50KSA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoeDEyMDVfZHJpdmVyLmRyaXZlci5uYW1lLCAmY2xpZW50LT5kZXYsCisJCQkJJngxMjA1X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKworCWlmIChJU19FUlIocnRjKSkKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHJ0Yyk7CisKKwkvKiBDaGVjayBmb3IgcG93ZXIgZmFpbHVyZXMgYW5kIGV2ZW50dWFsbHkgZW5hYmxlIHRoZSBvc2MgKi8KKwlpZiAoKGVyciA9IHgxMjA1X2dldF9zdGF0dXMoY2xpZW50LCAmc3IpKSA9PSAwKSB7CisJCWlmIChzciAmIFgxMjA1X1NSX1JUQ0YpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJwb3dlciBmYWlsdXJlIGRldGVjdGVkLCAiCisJCQkJInBsZWFzZSBzZXQgdGhlIGNsb2NrXG4iKTsKKwkJCXVkZWxheSg1MCk7CisJCQl4MTIwNV9maXhfb3NjKGNsaWVudCk7CisJCX0KKwl9CisJZWxzZQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNvdWxkbid0IHJlYWQgc3RhdHVzXG4iKTsKKworCWVyciA9IHgxMjA1X3N5c2ZzX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CisJaWYgKGVycikKKwkJZ290byBleGl0X2RldnJlZzsKKworCXJldHVybiAwOworCitleGl0X2RldnJlZzoKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgeDEyMDVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJeDEyMDVfc3lzZnNfdW5yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgeDEyMDVfaWRbXSA9IHsKKwl7ICJ4MTIwNSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgeDEyMDVfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgeDEyMDVfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMteDEyMDUiLAorCX0sCisJLnByb2JlCQk9IHgxMjA1X3Byb2JlLAorCS5yZW1vdmUJCT0geDEyMDVfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHgxMjA1X2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoeDEyMDVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigKKwkiS2FyZW4gU3BlYXJlbCA8a2FzMTExIGF0IGdtYWlsIGRvdCBjb20+LCAiCisJIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWNvci9JbnRlcnNpbCBYMTIwNSBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy96eDIzNDI5MC1ydGMuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvcnRjL3p4MjM0MjkwLXJ0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MGY3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy96eDIzNDI5MC1ydGMuYwpAQCAtMCwwICsxLDExOTIgQEAKKy8qIGRyaXZlcnMvcnRjL3p4MjM0MjkwX3J0Yy5jDQorICoNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgU2FuZWNoaXBzIENvLiwgTHRkLg0KKyAqDQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcw0KKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KKyAqDQorICogengyMzQyOTAgSW50ZXJuYWwgUlRDIERyaXZlcg0KKyovDQorDQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCisjaW5jbHVkZSA8bGludXgvZnMuaD4NCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+DQorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4NCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+DQorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPg0KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4NCisjaW5jbHVkZSA8bGludXgvYmNkLmg+DQorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPg0KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+DQorI2luY2x1ZGUgPGxpbnV4L29mLmg+DQorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lycS5oPg0KKyNpbmNsdWRlIDxsaW51eC9tZmQvengyMzQyOTAuaD4NCisjaW5jbHVkZSA8YXNtL2lycS5oPg0KKyNpbmNsdWRlICJtYWNoL2lvbWFwLmgiDQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4NCisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+DQorI2luY2x1ZGUgInp4MjM0MjkwLXJ0Yy5oIg0KKw0KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4NCisNCisvLyNkZWZpbmUgR1BJT0ZVTkNfR1BJTyAwDQorLy8jZGVmaW5lIEdQSU9GVU5DX0ZVTkMgMQ0KKy8vI2RlZmluZSBQSU5fUE1VX0lOVAlaWDI5X0dQSU9fNDcNCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZ19ydGNkZXY7DQorDQorc3RhdGljIGludCB6eDIzNDI5MF9ydGNfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGVuYWJsZSk7DQoraW50IHp4MjM0MjkwX3J0Y19zZXR0aW1lcihpbnQgc2VjKTsNCitpbnQgengyMzQyOTBfcnRjX3NldF9zZWNvbmRfdGltZXIoaW50IHNlY29uZHMpOw0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfQklURlZBTCh2YXIsIGxzaCkgICAoICh2YXIpIDw8IChsc2gpICkNCisjZGVmaW5lIFpYMjM0MjkwX0JJVEZNQVNLKHdpZCwgbHNoKSAgKCAoKDFVIDw8ICh3aWQpKSAtIDEpIDw8IChsc2gpICkNCisjZGVmaW5lIFpYMjM0MjkwX0JJVEZFWFQodmFyLCB3aWQsIGxzaCkgICAoKHZhciAmIFpYMjM0MjkwX0JJVEZNQVNLKHdpZCwgbHNoKSkgPj4gKGxzaCkpDQorc3RhdGljIHN0cnVjdCBydGNfZGV2aWNlICpnX3J0YzsNCitpbnQgQ3ljbGVUaW1lcyA9IDA7DQoraW50IHN1cnBsdXMgPSAwOw0KK2ludCB0aW1lcl9yZW1haW49MDsNCisvLyNkZWZpbmUgWlgyMzQyOTBfR1BJT19OVU0gMTANCisNCit0eXBlZGVmIGVudW0NCit7DQorCVRJTUVSX0NPVU5UXzQwOTYJPSAwLA0KKwlUSU1FUl9DT1VOVF82NCAJCT0gMSwJLyogNjQgREVGQVVMVAkqLw0KKwlUSU1FUl9DT1VOVF8xIAkJPSAyLAkvKiAxCSovDQorCVRJTUVSX0NPVU5UXzFfNjAgCT0gMywJLyogMS82MAkqLw0KKw0KKwlUSU1FUl9DT1VOVF9NQVgNCit9engyMzQyOTBfdGltZXJjb3VudDsNCisNCit0eXBlZGVmIGVudW0NCit7DQorCUFMQVJNX01JTlVURQk9IDAsDQorCUFMQVJNX0hPVVIgCQk9IDEsDQorCUFMQVJNX0RBWSAJCT0gMiwNCisJQUxBUk1fV0VFS0RBWSAJPSAzLA0KKwlBTEFSTV9TRUNPTkQgCT0gNCwNCisJQUxBUk1fTUFYDQorfXp4MjM0MjkwX2FsYXJtX3R5cGU7DQorDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBaWDIzNDI5MF9TRVRfVElNRVIgPSggJ3InPDwyNHwndCc8PDE2fCdjJzw8OHwwKSwNCisgICAgWlgyMzQyOTBfR0VUX1RJTUVSLA0KKyAgICBaWDIzNDI5MF9USU1FUl9FTkFCTEVELA0KKyAgICBaWDIzNDI5MF9HRVRfVElNRVJfUkVNQUlOLA0KKyAgICBaWDIzNDI5MF9HRVRfVElNRVJfU1RBVFVTLA0KKyAgICBaWDIzNDI5MF9DWUNMRV9FTkFCTEUsDQorICAgIFpYMjM0MjkwX0ZVTkNUSU9OX01BWA0KKw0KK316eDIzNDI5MF9ydGNfdGltZXI7DQorDQordHlwZWRlZiBzdHJ1Y3QgX3p4MjM0MjkwX3J0Yw0KK3sNCisJc3RydWN0IHp4MjM0MjkwICp6eDIzNDI5MDsNCit9engyMzQyOTBfcnRjX2RhdGE7DQorDQorengyMzQyOTBfcnRjX2RhdGEgengyMzQyOTBfcnRjOw0KK3N0YXRpYyBpbnQgengyMzQyOTBfcnRjX2lycW5vICA9IE5PX0lSUTsNCisNCitzdGF0aWMgdm9sYXRpbGUgbG9uZyB0aW1lcl9zZW1hX2ZsYWc9MDsNCisjZGVmaW5lIFRJTUVSX1NFTUFfU1RBUlRfQklUCTAgLypzZXQgdGltZXIgYmVmb3JlIGdldCB0aW1lci4qLw0KKyNkZWZpbmUgVElNRVJfU0VNQV9XQUlUX0JJVAkxIC8qbXV0ZXggc2VtYXBob3JlLCB1cCBzZW1hcGhvcmUgbXVzdCBiZSBhZnRlciBkb3duIHNlbWFwaG9yZS4qLw0KKw0KK3N0cnVjdCBzZW1hcGhvcmUgdGltZXJTZW1hcGhvcmU7DQorDQorDQorc3RydWN0IHJ0Y190aW1lIHRlbXBUaW1lID0gezB9Ow0KKw0KK2ludCB6eDIzNDI5MF9ydGNfZ2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKTsNCitzdGF0aWMgaW50IHp4MjM0MjkwX3J0Y19nZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKTsNCisNCitzdGF0aWMgaW50IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3Rlcih1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgY2hhciBtYXNrKQ0KK3sNCisgICAgaW50IHJldCA9IDA7DQorICAgIHVuc2lnbmVkIGNoYXIgY29udGVudCA9IDA7DQorDQorCXJldCA9IHp4MjM0MjkwX3JlZ19yZWFkKHp4MjM0MjkwX3J0Yy56eDIzNDI5MCwgYWRkcik7DQorCWlmIChyZXQgPCAwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisJY29udGVudCA9ICh1bnNpZ25lZCBjaGFyKXJldDsNCisJY29udGVudCAmPSB+bWFzazsNCisgICAgY29udGVudCB8PSBkYXRhICYgbWFzazsNCisJcmV0ID0gengyMzQyOTBfcmVnX3dyaXRlKHp4MjM0MjkwX3J0Yy56eDIzNDI5MCwgYWRkciwgY29udGVudCk7DQorCWlmIChyZXQgIT0gMCkNCisJew0KKwkJcmV0dXJuIHJldDsNCisJfQ0KKw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCitzdGF0aWMgaW50IHp4MjM0MjkwX3J0Y19yZWFkX3JlZ2lzdGVyKHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyICpkZXN0KQ0KK3sNCisJaW50IHJldDsNCisNCisJcmV0ID0gengyMzQyOTBfcmVnX3JlYWQoengyMzQyOTBfcnRjLnp4MjM0MjkwLCByZWcpOw0KKwlpZiAocmV0IDwgMCkNCisJCXJldHVybiByZXQ7DQorDQorCSpkZXN0ID0gKHVuc2lnbmVkIGNoYXIpcmV0Ow0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorLy8rK2FkZGVkIGJ5IHlzDQorLy9zZW5kIGFsYXJtIGlycSBldmVudCB0byBhcHAgd2hlbiBhbGFybSBjb21lLg0KK3ZvaWQgenRlX3NlbmRfYWxhcm1faXJxX2V2ZW50KHZvaWQpDQorew0KKwljaGFyIGV2ZW50X3N0cmluZ1sxMDBdID0gezB9Ow0KKwljaGFyICplbnZwW10gPSB7IGV2ZW50X3N0cmluZywgTlVMTCB9Ow0KKw0KKyAgICBzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOw0KKwlzdHJ1Y3QgcnRjX3drYWxybSBhbHJtOw0KKwl1bnNpZ25lZCBsb25nIHNlYzsNCisvLwl0aW1lX3Qgc2VjOw0KKw0KKyAgICB6eDIzNDI5MF9ydGNfZ2V0dGltZShOVUxMLCAmcnRjX3RtKTsNCisJengyMzQyOTBfcnRjX2dldGFsYXJtKE5VTEwsICZhbHJtKTsNCisJYWxybS50aW1lLnRtX3llYXIgPSBydGNfdG0udG1feWVhcjsNCisJYWxybS50aW1lLnRtX21vbiA9IHJ0Y190bS50bV9tb247DQorICAgIHJ0Y190bV90b190aW1lKCYoYWxybS50aW1lKSwgJnNlYyk7DQorLyoNCisJcHJpbnRrKCJyZWFkIGFsYXJtICAlMDRkLiUwMmQuJTAyZCAlMDJkOiUwMmQ6JTAyZCB3ZGF5ICVkLCBzZWMgJWx1XG4iLA0KKwkJIGFscm0udGltZS50bV95ZWFyLCBhbHJtLnRpbWUudG1fbW9uLCBhbHJtLnRpbWUudG1fbWRheSwNCisJCSBhbHJtLnRpbWUudG1faG91ciwgYWxybS50aW1lLnRtX21pbiwgYWxybS50aW1lLnRtX3NlYywgYWxybS50aW1lLnRtX3dkYXksIHNlYyk7DQorKi8NCisNCisgICAJc3ByaW50ZihldmVudF9zdHJpbmcsIlBNSUMgUlRDIEFMQVJNIElSUSBDT01FLCBzZWM6JWx1Iiwgc2VjKTsNCisNCisJaWYoc3RybGVuKGV2ZW50X3N0cmluZykpDQorCQlrb2JqZWN0X3VldmVudF9lbnYoJmdfcnRjZGV2LT5kZXYua29iaiwgS09CSl9DSEFOR0UsZW52cCk7DQorfQ0KKw0KK3ZvaWQgenRlX3NlbmRfdGltZXJfaXJxX2V2ZW50KHZvaWQpDQorew0KKwljaGFyIGV2ZW50X3N0cmluZ1sxMDBdID0gezB9Ow0KKwljaGFyICplbnZwW10gPSB7IGV2ZW50X3N0cmluZywgTlVMTCB9Ow0KKy8vCXByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Yzogc2VuZF90aW1lcl9pcnFfZXZlbnRcbiIgKTsNCisNCisJc3ByaW50ZihldmVudF9zdHJpbmcsIlBNSUMgUlRDIFRJTUVSIElSUSBDT01FIik7DQorDQorCWlmKHN0cmxlbihldmVudF9zdHJpbmcpKQ0KKwkJa29iamVjdF91ZXZlbnRfZW52KCZnX3J0Y2Rldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFLGVudnApOw0KKw0KKwkvL3ByaW50ayhLRVJOX0lORk8gIlt5dXdlaV1zZW5kX3RpbWVyX2lycV9ldmVudC4gdWV2ZW50XG4iKTsNCit9DQordm9pZCB6dGVfc2VuZF9taW5faXJxX2V2ZW50KHZvaWQpDQorew0KKwljaGFyIGV2ZW50X3N0cmluZ1sxMDBdID0gezB9Ow0KKwljaGFyICplbnZwW10gPSB7IGV2ZW50X3N0cmluZywgTlVMTCB9Ow0KKy8vCXByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Yzogc2VuZF9taW5faXJxX2V2ZW50XG4iICk7DQorDQorCXNwcmludGYoZXZlbnRfc3RyaW5nLCJQTUlDIFJUQyBNSU4gSVJRIENPTUUiKTsNCisNCisJaWYoc3RybGVuKGV2ZW50X3N0cmluZykpDQorCQlrb2JqZWN0X3VldmVudF9lbnYoJmdfcnRjZGV2LT5kZXYua29iaiwgS09CSl9DSEFOR0UsZW52cCk7DQorDQorfQ0KK3ZvaWQgenRlX3NlbmRfaG91cl9pcnFfZXZlbnQodm9pZCkNCit7DQorCWNoYXIgZXZlbnRfc3RyaW5nWzEwMF0gPSB7MH07DQorCWNoYXIgKmVudnBbXSA9IHsgZXZlbnRfc3RyaW5nLCBOVUxMIH07DQorLy8JcHJpbnRrKEtFUk5fSU5GTyAiengyMzQyOTBfcnRjOiBzZW5kX2hvdXJfaXJxX2V2ZW50XG4iICk7DQorDQorCXNwcmludGYoZXZlbnRfc3RyaW5nLCJQTUlDIFJUQyBIT1VSIElSUSBDT01FIik7DQorDQorCWlmKHN0cmxlbihldmVudF9zdHJpbmcpKQ0KKwkJa29iamVjdF91ZXZlbnRfZW52KCZnX3J0Y2Rldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFLGVudnApOw0KKw0KK30NCisvLysrZW5kDQorDQorDQorDQorLyphbGFybSBhbmQgdGltZXIgY291bnRkb3duIGlycSovDQorc3RhdGljIGlycXJldHVybl90IHp4MjM0MjkwX3J0Y19hbGFybWlycShpbnQgaXJxLCB2b2lkICppZCkNCit7DQorCXN0cnVjdCBydGNfZGV2aWNlICpyZGV2ID0gaWQ7DQorCXVuc2lnbmVkIGNoYXIgcmVnX3ZhbCA9IDAsIG1hc2sgPSAwOw0KKwl1bnNpZ25lZCBjaGFyIHJlZ192YWxfY3RybDIgPSAwOw0KKw0KKwl6eDIzNDI5MF9ydGNfcmVhZF9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9SVENfQ1RSTDIsJnJlZ192YWxfY3RybDIpOw0KKwkvL3ByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Y19hbGFybWlycTpDeWNsZVRpbWVzPSVkLHN1cnBsdXM9JWQsdGltZXJGbGFnPSVkLlxuIixDeWNsZVRpbWVzLHN1cnBsdXMsdGltZXJGbGFnKTsNCisJLy9wcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGNfYWxhcm1pcnE6dmFsdWUoMHgzMSkgPSVkLlxuIixyZWdfdmFsX2N0cmwyKTsNCisNCisJLyphbGFybSBpbnQqLw0KKwlpZigocmVnX3ZhbF9jdHJsMiYweDA4KSA9PSAweDA4KQ0KKwkvL2lmKChyZWdfdmFsX2N0cmwyPj5aWDIzNDI5MF9SVENfQUZfTFNIKSYweDEgPT0gMHgxKQ0KKwl7DQorCSAgICAvKmNsZWFyIEFGIGJpdCovDQorCQltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX0FGX1dJRCwgWlgyMzQyOTBfUlRDX0FGX0xTSCk7DQorCQlyZWdfdmFsPSBaWDIzNDI5MF9CSVRGVkFMKDAsIFpYMjM0MjkwX1JUQ19BRl9MU0gpOw0KKwkJengyMzQyOTBfcnRjX3dyaXRlX3JlZ2lzdGVyKFpYMjM0MjkwX1JFR19BRERSX1JUQ19DVFJMMiwgcmVnX3ZhbCwgbWFzayk7DQorDQorCQlydGNfdXBkYXRlX2lycShyZGV2LCAxLCBSVENfQUYgfCBSVENfSVJRRik7DQorDQorCQl6dGVfc2VuZF9hbGFybV9pcnFfZXZlbnQoKTsNCisJfQ0KKwkvKnRpbWVyIGludCovDQorCWlmKChyZWdfdmFsX2N0cmwyJjB4MDQpID09IDB4MDQpDQorCS8vZWxzZSBpZigocmVnX3ZhbF9jdHJsMj4+WlgyMzQyOTBfUlRDX1RGX0xTSCkmMHgxID09IDB4MSkNCisJew0KKwkgICAgLypjbGVhciBURiBiaXQqLw0KKwkJbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKFpYMjM0MjkwX1JUQ19URl9XSUQsIFpYMjM0MjkwX1JUQ19URl9MU0gpOw0KKwkJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTCgwLCBaWDIzNDI5MF9SVENfVEZfTFNIKTsNCisJCXp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9SVENfQ1RSTDIsIHJlZ192YWwsIG1hc2spOw0KKw0KKwkJcnRjX3VwZGF0ZV9pcnEocmRldiwgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOw0KKw0KKy8vCQlwcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGNfYWxhcm1pcnEgLHJlbWFpbiBzZWNvbmRzPSVsZCxmbGFnPTB4JWx4XG4iLHRpbWVyX3JlbWFpbix0aW1lcl9zZW1hX2ZsYWcpOw0KKwkJaWYodGltZXJfcmVtYWluKXsNCisJCQl6eDIzNDI5MF9ydGNfc2V0X3NlY29uZF90aW1lcihtaW4odGltZXJfcmVtYWluLDI1NSkpOw0KKwkJCXRpbWVyX3JlbWFpbiAtPSBtaW4odGltZXJfcmVtYWluLDI1NSk7DQorCQl9DQorCQllbHNlew0KKwkJICAgIAlpZih0ZXN0X2FuZF9jbGVhcl9iaXQoVElNRVJfU0VNQV9XQUlUX0JJVCwgJnRpbWVyX3NlbWFfZmxhZykpew0KKwkJCQl1cCgmdGltZXJTZW1hcGhvcmUpOw0KKwkJCSAgICAgICBwcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGNfYWxhcm1pcnEgc2VtYXBob3JlLlxuIik7DQorCQkJfQ0KKwkJCXp0ZV9zZW5kX3RpbWVyX2lycV9ldmVudCgpOw0KKwkJCWNsZWFyX2JpdChUSU1FUl9TRU1BX1NUQVJUX0JJVCwgJnRpbWVyX3NlbWFfZmxhZyk7DQorCQl9DQorDQorCX0NCisNCisvLwlwcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGM6IGlycSA9ICVkLCBSRUcoMHgzMSkgPTB4JXguXG4iLCBpcnEsIHJlZ192YWxfY3RybDIpOw0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7DQorfQ0KKw0KK3N0YXRpYyBpcnFyZXR1cm5fdCB6eDIzNDI5MF9ydGNfbWluaXJxKGludCBpcnEsIHZvaWQgKmlkKQ0KK3sNCisJc3RydWN0IHJ0Y19kZXZpY2UgKnJkZXYgPSBpZDsNCisNCisJcnRjX3VwZGF0ZV9pcnEocmRldiwgMSwgUlRDX1VGIHwgUlRDX0lSUUYpOw0KKwl6dGVfc2VuZF9taW5faXJxX2V2ZW50KCk7DQorCXJldHVybiBJUlFfSEFORExFRDsNCit9DQorc3RhdGljIGlycXJldHVybl90IHp4MjM0MjkwX3J0Y19ob3VyaXJxKGludCBpcnEsIHZvaWQgKmlkKQ0KK3sNCisJc3RydWN0IHJ0Y19kZXZpY2UgKnJkZXYgPSBpZDsNCisNCisJcnRjX3VwZGF0ZV9pcnEocmRldiwgMSwgUlRDX1VGIHwgUlRDX0lSUUYpOw0KKwl6dGVfc2VuZF9ob3VyX2lycV9ldmVudCgpOw0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7DQorfQ0KKy8qYWxhcm0gZW5hYmxlL2Rpc2FibGUsIDE6ZGlzYWJsZSAwOmVuYWJsZSovDQoraW50IHp4MjM0MjkwX3J0Y19hbGFybV9lbmFibGUoengyMzQyOTBfYWxhcm1fdHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkNCit7DQorICAgIGludCByZXQgPSAwOw0KKyAgICB1bnNpZ25lZCBjaGFyIHJlZ19hZGRyPTAsIHJlZ192YWw9MCwgbWFzaz0wOw0KKwlzd2l0Y2godHlwZSkNCisJew0KKwkJY2FzZSBBTEFSTV9NSU5VVEU6DQorCQkJcmVnX2FkZHIgPSBaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9NSU5VVEU7DQorCQkJYnJlYWs7DQorCQljYXNlIEFMQVJNX0hPVVI6DQorCQkJcmVnX2FkZHIgPSBaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9IT1VSOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBBTEFSTV9EQVk6DQorCQkJcmVnX2FkZHIgPSBaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9EQVk7DQorCQkJYnJlYWs7DQorCQljYXNlIEFMQVJNX1dFRUtEQVk6DQorCQkJcmVnX2FkZHIgPSBaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9XRUVLOw0KKwkJCWJyZWFrOw0KKyAgICAgICAgY2FzZSBBTEFSTV9TRUNPTkQ6DQorCQkJcmVnX2FkZHIgPSBaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9TRUNPTkQ7DQorCQkJYnJlYWs7DQorCQlkZWZhdWx0Og0KKwkJCXJlZ19hZGRyID0gWlgyMzQyOTBfUkVHX0FERFJfQUxBUk1fTUlOVVRFOw0KKwkJCWJyZWFrOw0KKwl9DQorDQorCXJlZ192YWwgPSBaWDIzNDI5MF9CSVRGVkFMKGVuYWJsZWQsIFpYMjM0MjkwX1JUQ19BbEFSTV9BQ1RJVkFURURfTFNIKTsNCisJbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKFpYMjM0MjkwX1JUQ19BbEFSTV9BQ1RJVkFURURfV0lELCBaWDIzNDI5MF9SVENfQWxBUk1fQUNUSVZBVEVEX0xTSCk7DQorCXJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihyZWdfYWRkciwgcmVnX3ZhbCwgbWFzayk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KKy8qdGltZXIgY291bnRlciBzZXQqLw0KK2ludCB6eDIzNDI5MF9ydGNfc2V0X3RpbWVyY291bnRlcih1bnNpZ25lZCBjaGFyIGNudCkNCit7DQorICAgIGludCByZXQgPSAwOw0KKyAgICB1bnNpZ25lZCBjaGFyIHJlZ19hZGRyPTAsIHJlZ192YWw9MCwgbWFzaz0wOw0KKw0KKyAgICByZWdfYWRkciA9IFpYMjM0MjkwX1JFR19BRERSX1RJTUVSX0NOVDsNCisgICAgcmVnX3ZhbCA9IFpYMjM0MjkwX0JJVEZWQUwoY250LCBaWDIzNDI5MF9SVENfVElNRVJfQ05UX0xTSCk7DQorICAgIG1hc2sgPSBaWDIzNDI5MF9CSVRGTUFTSyhaWDIzNDI5MF9SVENfVElNRVJfQ05UX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVSX0NOVF9MU0gpOw0KKyAgICByZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIocmVnX2FkZHIsIHJlZ192YWwsIG1hc2spOw0KKw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCisvKg0KKwlUSU1FUl9DT1VOVF80MDk2CT0gMCwNCisJVElNRVJfQ09VTlRfNjQgCQk9IDEsDQorCVRJTUVSX0NPVU5UXzEgCQk9IDIsDQorCVRJTUVSX0NPVU5UXzFfNjAgCT0gMywNCisqLw0KK2ludCB6eDIzNDI5MF9ydGNfc2V0X2Nsb2NrX2ZyZXF1ZW5jeSh6eDIzNDI5MF90aW1lcmNvdW50IHRkKQ0KK3sNCisgICAgaW50IHJldCA9IDA7DQorICAgIHVuc2lnbmVkIGNoYXIgcmVnX2FkZHI9MCwgcmVnX3ZhbD0wLCBtYXNrPTA7DQorDQorICAgIHJlZ19hZGRyID0gWlgyMzQyOTBfUkVHX0FERFJfVElNRVJfQ1RSTDsNCisgICAgcmVnX3ZhbCA9IFpYMjM0MjkwX0JJVEZWQUwodGQsIFpYMjM0MjkwX1JUQ19USU1FUl9URF9MU0gpOw0KKyAgICBtYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX1RJTUVSX1REX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVSX1REX0xTSCk7DQorICAgIHJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihyZWdfYWRkciwgcmVnX3ZhbCwgbWFzayk7DQorDQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KK3N0YXRpYyBpbnQgengyMzQyOTBfcnRjX3NldGFpZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQ0KK3sNCisJaW50IHJldCA9IDA7DQorCWludCByZWdfdmFsPTAsIG1hc2s9MDsNCisNCisJcHJfZGVidWcoIiVzOiBhaWU9JWRcbiIsIF9fZnVuY19fLCBlbmFibGVkKTsNCisJaWYoMD09ZW5hYmxlZCkvL2Rpc2FibGUgYWxhcm0NCisJew0KKwkJengyMzQyOTBfcnRjX2FsYXJtX2VuYWJsZShBTEFSTV9TRUNPTkQsIDEpOwkJDQorCQl6eDIzNDI5MF9ydGNfYWxhcm1fZW5hYmxlKEFMQVJNX01JTlVURSwgMSk7CQkNCisJCXp4MjM0MjkwX3J0Y19hbGFybV9lbmFibGUoQUxBUk1fSE9VUiwgMSk7CQkNCisJCXp4MjM0MjkwX3J0Y19hbGFybV9lbmFibGUoQUxBUk1fREFZLCAxKTsJDQorCQl6eDIzNDI5MF9ydGNfYWxhcm1fZW5hYmxlKEFMQVJNX1dFRUtEQVksIDEpOw0KKwl9Ow0KKyAgICAvKmVuYWJsZS9kaXNhYmxlIEFJRSBiaXQqLw0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX0FJRV9XSUQsIFpYMjM0MjkwX1JUQ19BSUVfTFNIKTsNCisJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTChlbmFibGVkLCBaWDIzNDI5MF9SVENfQUlFX0xTSCk7DQorCXJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9SVENfQ1RSTDIsIHJlZ192YWwsIG1hc2spOw0KKyAgICBpZiAocmV0ICE9IDApDQorICAgIHsNCisgICAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisNCisgICAgLypjbGVhciBBRiBiaXQqLw0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX0FGX1dJRCwgWlgyMzQyOTBfUlRDX0FGX0xTSCk7DQorCXJlZ192YWw9IFpYMjM0MjkwX0JJVEZWQUwoMCwgWlgyMzQyOTBfUlRDX0FGX0xTSCk7DQorCXJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9SVENfQ1RSTDIsIHJlZ192YWwsIG1hc2spOw0KKyAgICBpZiAocmV0ICE9IDApDQorICAgIHsNCisgICAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisNCisgICAgLyptYXNrL3VubWFzayBhbGFybSBpbnQqLw0KKwkvKg0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX1dJRCwgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX0xTSCk7DQorCWlmKGVuYWJsZWQpDQorCXsNCisJCXJlZ192YWw9IFpYMjM0MjkwX0JJVEZWQUwoMCwgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX0xTSCk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZWdfdmFsPSBaWDIzNDI5MF9CSVRGVkFMKDEsIFpYMjM0MjkwX1JUQ19BTEFSTV9JTlRfTUFTS19MU0gpOw0KKwl9DQorDQorCXJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9JTlRCX01BU0ssIHJlZ192YWwsIG1hc2spOw0KKyAgICBpZiAocmV0ICE9IDApDQorICAgIHsNCisgICAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisJKi8NCisNCisJcmV0dXJuIHJldDsNCit9DQorDQorc3RhdGljIGludCB6eDIzNDI5MF9ydGNfc2V0dGllKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpDQorew0KKwlpbnQgcmV0ID0gMDsNCisJaW50IHJlZ192YWw9MCwgbWFzaz0wOw0KKyAgICAvKmVuYWJsZS9kaXNhYmxlIFRJRSBiaXQqLw0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX1RJRV9XSUQsIFpYMjM0MjkwX1JUQ19USUVfTFNIKTsNCisJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTChlbmFibGVkLCBaWDIzNDI5MF9SVENfVElFX0xTSCk7DQorCXJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9SVENfQ1RSTDIsIHJlZ192YWwsIG1hc2spOw0KKwlpZiAocmV0ICE9IDApDQorCXsNCisJCXJldHVybiByZXQ7DQorCX0NCisgICAgcmV0dXJuIDA7DQorfQ0KK3N0YXRpYyBpbnQgengyMzQyOTBfcnRjX3NldHVpZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQ0KK3sNCisJaW50IG5SZXQgPSAwOw0KKwlpbnQgIHJlZ192YWw9MCwgbWFzaz0wOw0KKwlwcl9kZWJ1ZygiJXM6IHVpZT0lZFxuIiwgX19mdW5jX18sIGVuYWJsZWQpOw0KKwkvKg0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX1RJTUVSX0lOVF9FTl9XSUQsIFpYMjM0MjkwX1JUQ19USU1FUl9JTlRfRU5fTFNIKTsNCisJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTChlbmFibGVkLCBaWDIzNDI5MF9SVENfVElNRVJfSU5UX0VOX0xTSCk7DQorCW5SZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfUlRDX0NUUkwyLCByZWdfdmFsLCBtYXNrKTsNCisJaWYgKG5SZXQgIT0gMCkNCisJew0KKwkJcmV0dXJuIG5SZXQ7DQorCX0NCisJKi8NCisJbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKFpYMjM0MjkwX1JUQ19PTkVfTUlOVVRFX0lOVF9NQVNLX1dJRCwgWlgyMzQyOTBfUlRDX09ORV9NSU5VVEVfSU5UX01BU0tfTFNIKTsNCisJaWYoZW5hYmxlZCkNCisJew0KKwkJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTCgwLCBaWDIzNDI5MF9SVENfT05FX01JTlVURV9JTlRfTUFTS19MU0gpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTCgxLCBaWDIzNDI5MF9SVENfT05FX01JTlVURV9JTlRfTUFTS19MU0gpOw0KKwl9DQorDQorCW5SZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfSU5UQl9NQVNLLCByZWdfdmFsLCBtYXNrKTsNCisNCisJbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKFpYMjM0MjkwX1JUQ19PTkVfSE9VUl9JTlRfTUFTS19XSUQsIFpYMjM0MjkwX1JUQ19PTkVfSE9VUl9JTlRfTUFTS19MU0gpOw0KKwlpZihlbmFibGVkKQ0KKwl7DQorCQlyZWdfdmFsPSBaWDIzNDI5MF9CSVRGVkFMKDAsIFpYMjM0MjkwX1JUQ19PTkVfSE9VUl9JTlRfTUFTS19MU0gpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTCgxLCBaWDIzNDI5MF9SVENfT05FX0hPVVJfSU5UX01BU0tfTFNIKTsNCisJfQ0KKw0KKwluUmV0ID0gengyMzQyOTBfcnRjX3dyaXRlX3JlZ2lzdGVyKFpYMjM0MjkwX1JFR19BRERSX0lOVEJfTUFTSywgcmVnX3ZhbCwgbWFzayk7DQorDQorCXJldHVybiBuUmV0Ow0KK30NCisNCitzdGF0aWMgaW50IHp4MjM0MjkwX3J0Y19nZXR2YWx1ZSh1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgY2hhciB3aWR0aCwgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0KKwlpbnQgblJldCA9IDA7DQorCXVuc2lnbmVkIGNoYXIgdmFsOw0KKwluUmV0ID0gengyMzQyOTBfcnRjX3JlYWRfcmVnaXN0ZXIocmVnLCBkZXN0KTsNCisJaWYgKG5SZXQgIT0gMCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIG5SZXQ7DQorICAgIH0NCisJdmFsID0gKmRlc3Q7DQorCXZhbCA9IFpYMjM0MjkwX0JJVEZFWFQodmFsLHdpZHRoLCBvZmZzZXQpOw0KKwkqZGVzdCA9IHZhbDsNCisJcmV0dXJuIG5SZXQ7DQorfQ0KKw0KK3N0YXRpYyBpbnQgengyMzQyOTBfcnRjX3NldHZhbHVlKHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBjaGFyIHdpZHRoLCB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCWludCBuUmV0ID0gMDsNCisJdW5zaWduZWQgY2hhciAgcmVnX3ZhbD0wLCBtYXNrPTA7DQorCXJlZ192YWwgPSBaWDIzNDI5MF9CSVRGVkFMKGRhdGEsIG9mZnNldCk7DQorICAgIG1hc2sgPSBaWDIzNDI5MF9CSVRGTUFTSyh3aWR0aCwgb2Zmc2V0KTsNCisJblJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihhZGRyLCByZWdfdmFsLCBtYXNrKTsNCisJcmV0dXJuIG5SZXQ7DQorfQ0KKw0KKw0KK2ludCB6eDIzNDI5MF9ydGNfZ2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQ0KK3sNCisJdW5zaWduZWQgY2hhciBkYXksIG1vbiwgeWVhciwgd2RheSwgc2VjLCBtaW4sIGhvdXI7DQorCXVuc2lnbmVkIGNoYXIgQ2VudHVyeUluZGljYXRlID0gMDsNCisJdW5zaWduZWQgaW50IGhhdmVfcmV0cmllZCA9IDA7DQorCWlmKHJ0Y190bSA9PSBOVUxMKQ0KKwl7DQorCQlyZXR1cm4gLTE7DQorCX0NCityZXRyeV9nZXRfdGltZToNCisNCisJengyMzQyOTBfcnRjX2dldHZhbHVlKFpYMjM0MjkwX1JFR19BRERSX1NFQ09ORFMsICZzZWMsIFpYMjM0MjkwX1JUQ19USU1FX1NFQ09ORFNfV0lELCBaWDIzNDI5MF9SVENfVElNRV9TRUNPTkRTX0xTSCk7DQorCXp4MjM0MjkwX3J0Y19nZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9NSU5VVEVTLCAmbWluLCBaWDIzNDI5MF9SVENfVElNRV9NSU5VVEVTX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVfTUlOVVRFU19MU0gpOw0KKyAgICB6eDIzNDI5MF9ydGNfZ2V0dmFsdWUoWlgyMzQyOTBfUkVHX0FERFJfSE9VUlMsICZob3VyLCBaWDIzNDI5MF9SVENfVElNRV9IT1VSU19XSUQsIFpYMjM0MjkwX1JUQ19USU1FX0hPVVJTX0xTSCk7DQorCXp4MjM0MjkwX3J0Y19nZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9EQVksICZkYXksIFpYMjM0MjkwX1JUQ19USU1FX0RBWVNfV0lELCBaWDIzNDI5MF9SVENfVElNRV9EQVlTX0xTSCk7DQorCXp4MjM0MjkwX3J0Y19nZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9NT05USCwgJm1vbiwgWlgyMzQyOTBfUlRDX1RJTUVfTU9OVEhTX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVfTU9OVEhTX0xTSCk7DQorCXp4MjM0MjkwX3J0Y19nZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9ZRUFSLCAmeWVhciwgWlgyMzQyOTBfUlRDX1RJTUVfWUVBUl9XSUQsIFpYMjM0MjkwX1JUQ19USU1FX1lFQVJfTFNIKTsNCisJengyMzQyOTBfcnRjX2dldHZhbHVlKFpYMjM0MjkwX1JFR19BRERSX1dFRUssICZ3ZGF5LCBaWDIzNDI5MF9SVENfVElNRV9XRUVLREFZX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVfV0VFS0RBWV9MU0gpOw0KKwl6eDIzNDI5MF9ydGNfZ2V0dmFsdWUoWlgyMzQyOTBfUkVHX0FERFJfTU9OVEgsICZDZW50dXJ5SW5kaWNhdGUsIFpYMjM0MjkwX1JUQ19USU1FX0NFTlRVUllfV0lELCBaWDIzNDI5MF9SVENfVElNRV9DRU5UVVJZX0xTSCk7DQorDQorDQorCWlmIChzZWMgPT0gMCAmJiAhaGF2ZV9yZXRyaWVkKQ0KKwl7DQorCQloYXZlX3JldHJpZWQgPSAxOw0KKwkJZ290byByZXRyeV9nZXRfdGltZTsNCisJfQ0KKwlydGNfdG0tPnRtX3NlYyA9IGJjZDJiaW4oc2VjKTsNCisJcnRjX3RtLT50bV9taW4gPSBiY2QyYmluKG1pbik7DQorCXJ0Y190bS0+dG1faG91ciA9IGJjZDJiaW4oaG91cik7DQorCXJ0Y190bS0+dG1fbWRheSA9IGJjZDJiaW4oZGF5KTsNCisJcnRjX3RtLT50bV9tb24gPSBiY2QyYmluKG1vbik7DQorCXJ0Y190bS0+dG1feWVhciA9IGJjZDJiaW4oeWVhcik7Ly8rMjAwMDsNCisgICAgcnRjX3RtLT50bV93ZGF5ID0gYmNkMmJpbih3ZGF5KTsNCisJcnRjX3RtLT50bV95ZGF5ID0gcnRjX3llYXJfZGF5cyhydGNfdG0tPnRtX21kYXksIHJ0Y190bS0+dG1fbW9uICwgcnRjX3RtLT50bV95ZWFyKTsNCisJaWYoQ2VudHVyeUluZGljYXRlID09IDApDQorCXsNCisgICAgCXJ0Y190bS0+dG1feWVhciArPSAxMDA7DQorCX0NCisJcnRjX3RtLT50bV9tb24gLT0gMTsNCisJcnRjX3RtLT50bV9pc2RzdCA9IDA7DQorCXByX2RlYnVnKCJyZWFkIHRpbWUgJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmRcbiIsDQorCQkgIHJ0Y190bS0+dG1feWVhciwgcnRjX3RtLT50bV9tb24rMSwgcnRjX3RtLT50bV9tZGF5LA0KKwkJIHJ0Y190bS0+dG1faG91ciwgcnRjX3RtLT50bV9taW4sIHJ0Y190bS0+dG1fc2VjKTsNCisNCisJcmV0dXJuIHJ0Y192YWxpZF90bShydGNfdG0pOw0KK30NCisNCitzdGF0aWMgaW50IHp4MjM0MjkwX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkNCit7DQorCWludCByZXQgPSAwOw0KKwl1bnNpZ25lZCBjaGFyIGRheSwgbW9uLCB5ZWFyLCB3ZGF5LCBzZWMsIG1pbiwgaG91ciwgQ2VudHVyeUluZGljYXRlOw0KKwl1bnNpZ25lZCBjaGFyICByZWdfdmFsPTAsIG1hc2s9MDsNCisJLy9pbnQgeWVhciA9IHRtLT50bV95ZWFyIC0gMTAwOw0KKwlwcl9kZWJ1Zygic2V0IHRpbWUgJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmRcbiIsDQorCQkgdG0tPnRtX3llYXIsIHRtLT50bV9tb24rMSwgdG0tPnRtX21kYXksDQorCQkgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOw0KKwlpZih0bS0+dG1feWVhciA+PSAyMDApDQorCXsNCisJCXJldHVybiAtMTsNCisNCisJfWVsc2UgaWYodG0tPnRtX3llYXIgPj0gMTAwKQ0KKyAgICB7DQorICAgICAgICB5ZWFyID0gdG0tPnRtX3llYXIgLSAxMDA7DQorICAgICAgICBDZW50dXJ5SW5kaWNhdGUgPSAwOyAgLyppbmRpY2F0ZSAyMSDKwLzNIDIweHgqLw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgeWVhciA9IHRtLT50bV95ZWFyOw0KKyAgICAgICAgQ2VudHVyeUluZGljYXRlID0gMTsgIC8qaW5kaWNhdGUgMjAgysC8zSAxOXh4Ki8NCisgICAgfQ0KKwkvKiB3ZSBnZXQgYXJvdW5kIHkyayBieSBzaW1wbHkgbm90IHN1cHBvcnRpbmcgaXQgKi8NCisJc2VjID0gYmluMmJjZCh0bS0+dG1fc2VjKTsNCisJcmVnX3ZhbCA9IFpYMjM0MjkwX0JJVEZWQUwoc2VjLCBaWDIzNDI5MF9SVENfVElNRV9TRUNPTkRTX0xTSCk7DQorICAgIG1hc2sgPSBaWDIzNDI5MF9CSVRGTUFTSyhaWDIzNDI5MF9SVENfVElNRV9TRUNPTkRTX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVfU0VDT05EU19MU0gpOw0KKwlyZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfU0VDT05EUywgcmVnX3ZhbCwgbWFzayk7DQorDQorCW1pbiA9IGJpbjJiY2QodG0tPnRtX21pbik7DQorCXJlZ192YWwgPSBaWDIzNDI5MF9CSVRGVkFMKG1pbiwgWlgyMzQyOTBfUlRDX1RJTUVfTUlOVVRFU19MU0gpOw0KKyAgICBtYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX1RJTUVfTUlOVVRFU19XSUQsIFpYMjM0MjkwX1JUQ19USU1FX01JTlVURVNfTFNIKTsNCisJcmV0ICArPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfTUlOVVRFUywgcmVnX3ZhbCwgbWFzayk7DQorDQorCWhvdXIgPSBiaW4yYmNkKHRtLT50bV9ob3VyKTsNCisJcmVnX3ZhbCA9IFpYMjM0MjkwX0JJVEZWQUwoaG91ciwgWlgyMzQyOTBfUlRDX1RJTUVfSE9VUlNfTFNIKTsNCisgICAgbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKFpYMjM0MjkwX1JUQ19USU1FX0hPVVJTX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVfSE9VUlNfTFNIKTsNCisJcmV0ICArPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfSE9VUlMsIHJlZ192YWwsIG1hc2spOw0KKw0KKwlkYXkgPSBiaW4yYmNkKHRtLT50bV9tZGF5KTsNCisJcmVnX3ZhbCA9IFpYMjM0MjkwX0JJVEZWQUwoZGF5LCBaWDIzNDI5MF9SVENfVElNRV9EQVlTX0xTSCk7DQorICAgIG1hc2sgPSBaWDIzNDI5MF9CSVRGTUFTSyhaWDIzNDI5MF9SVENfVElNRV9EQVlTX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVfREFZU19MU0gpOw0KKwlyZXQgICs9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9EQVksIHJlZ192YWwsIG1hc2spOw0KKw0KKwltb24gPSBiaW4yYmNkKHRtLT50bV9tb24rMSk7DQorCXJlZ192YWwgPSBaWDIzNDI5MF9CSVRGVkFMKG1vbiwgWlgyMzQyOTBfUlRDX1RJTUVfTU9OVEhTX0xTSCk7DQorICAgIG1hc2sgPSBaWDIzNDI5MF9CSVRGTUFTSyhaWDIzNDI5MF9SVENfVElNRV9NT05USFNfV0lELCBaWDIzNDI5MF9SVENfVElNRV9NT05USFNfTFNIKTsNCisJcmV0ICArPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfTU9OVEgsIHJlZ192YWwsIG1hc2spOw0KKw0KKyAgICByZWdfdmFsID0gWlgyMzQyOTBfQklURlZBTChDZW50dXJ5SW5kaWNhdGUsIFpYMjM0MjkwX1JUQ19USU1FX0NFTlRVUllfTFNIKTsNCisgICAgbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKFpYMjM0MjkwX1JUQ19USU1FX0NFTlRVUllfV0lELCBaWDIzNDI5MF9SVENfVElNRV9DRU5UVVJZX0xTSCk7DQorICAgIHJldCArPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfTU9OVEgsIHJlZ192YWwsIG1hc2spOw0KKw0KKwl5ZWFyID0gYmluMmJjZCh5ZWFyKTsNCisJcmVnX3ZhbCA9IFpYMjM0MjkwX0JJVEZWQUwoeWVhciwgWlgyMzQyOTBfUlRDX1RJTUVfWUVBUl9MU0gpOw0KKyAgICBtYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX1RJTUVfWUVBUl9XSUQsIFpYMjM0MjkwX1JUQ19USU1FX1lFQVJfTFNIKTsNCisJcmV0ICArPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfWUVBUiwgcmVnX3ZhbCwgbWFzayk7DQorDQorCXdkYXkgPSBiaW4yYmNkKHRtLT50bV93ZGF5KTsNCisJcmVnX3ZhbCA9IFpYMjM0MjkwX0JJVEZWQUwod2RheSwgWlgyMzQyOTBfUlRDX1RJTUVfV0VFS0RBWV9MU0gpOw0KKyAgICBtYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX1RJTUVfV0VFS0RBWV9XSUQsIFpYMjM0MjkwX1JUQ19USU1FX1dFRUtEQVlfTFNIKTsNCisJcmV0ICArPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfV0VFSywgcmVnX3ZhbCwgbWFzayk7DQorDQorCXJldHVybiByZXQ7DQorfQ0KKw0KK3N0YXRpYyBpbnQgengyMzQyOTBfcnRjX2dldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pDQorew0KKwlzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSA9ICZhbHJtLT50aW1lOw0KKwl1bnNpZ25lZCBjaGFyIHNlY29uZCwgZGF5LCB3ZGF5LCBtaW4sIGhvdXI7DQorCXVuc2lnbmVkIGNoYXIgIHJlZ192YWw9MCwgbWFzaz0wOw0KKwlpZihhbHJtID09IE5VTEwpDQorCXsNCisJCXJldHVybiAtMTsNCisJfQ0KKwl6eDIzNDI5MF9ydGNfZ2V0dmFsdWUoWlgyMzQyOTBfUkVHX0FERFJfQUxBUk1fU0VDT05ELCAmc2Vjb25kLCBaWDIzNDI5MF9SVENfQWxBUk1fU0VDT05EX1dJRCwgWlgyMzQyOTBfUlRDX0FsQVJNX1NFQ09ORF9MU0gpOw0KKwl6eDIzNDI5MF9ydGNfZ2V0dmFsdWUoWlgyMzQyOTBfUkVHX0FERFJfQUxBUk1fTUlOVVRFLCAmbWluLCBaWDIzNDI5MF9SVENfQWxBUk1fTUlOVVRFU19XSUQsIFpYMjM0MjkwX1JUQ19BbEFSTV9NSU5VVEVTX0xTSCk7DQorCXp4MjM0MjkwX3J0Y19nZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9IT1VSLCAmaG91ciwgWlgyMzQyOTBfUlRDX0FsQVJNX0hPVVJTX1dJRCwgWlgyMzQyOTBfUlRDX0FsQVJNX0hPVVJTX0xTSCk7DQorCXp4MjM0MjkwX3J0Y19nZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9EQVksICZkYXksIFpYMjM0MjkwX1JUQ19BbEFSTV9EQVlTX1dJRCwgWlgyMzQyOTBfUlRDX0FsQVJNX0RBWVNfTFNIKTsNCisJengyMzQyOTBfcnRjX2dldHZhbHVlKFpYMjM0MjkwX1JFR19BRERSX0FMQVJNX1dFRUssICZ3ZGF5LCBaWDIzNDI5MF9SVENfQWxBUk1fV0VFS0RBWV9XSUQsIFpYMjM0MjkwX1JUQ19BbEFSTV9XRUVLREFZX0xTSCk7DQorDQorCW1hc2sgPSBaWDIzNDI5MF9CSVRGTUFTSyhaWDIzNDI5MF9SVENfQUxBUk1fSU5UX0VOX1dJRCwgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9FTl9MU0gpOw0KKwl6eDIzNDI5MF9ydGNfcmVhZF9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9SVENfQ1RSTDIsICZyZWdfdmFsKTsNCisJYWxybS0+ZW5hYmxlZCA9IChyZWdfdmFsICYgbWFzayk/IDEgOiAwOw0KKw0KKwlwcl9kZWJ1ZygicmVhZCBhbGFybSAlZCwgJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmRcbiIsDQorCQkgYWxybS0+ZW5hYmxlZCwNCisJCSAxOTAwICsgYWxtX3RtLT50bV95ZWFyLCBhbG1fdG0tPnRtX21vbisxLCBhbG1fdG0tPnRtX21kYXksDQorCQkgYWxtX3RtLT50bV9ob3VyLCBhbG1fdG0tPnRtX21pbiwgYWxtX3RtLT50bV9zZWMpOw0KKwkvKiBkZWNvZGUgdGhlIGFsYXJtIGVuYWJsZSBmaWVsZCAqLw0KKyAgICBpZihhbHJtLT5lbmFibGVkKQ0KKyAgICB7DQorICAgICAgICAvL2FsbV90bS0+dG1fc2VjICA9IDA7IC8vYmNkMmJpbihhbG1fdG0tPnRtX3NlYyk7DQorICAgICAgICBhbG1fdG0tPnRtX3NlYyAgPSBiY2QyYmluKHNlY29uZCk7Ly95dXhpYW5nDQorICAgICAgICBhbG1fdG0tPnRtX21pbiAgPSBiY2QyYmluKG1pbik7DQorICAgICAgICBhbG1fdG0tPnRtX2hvdXIgPSBiY2QyYmluKGhvdXIpOw0KKyAgICAgICAgYWxtX3RtLT50bV9tZGF5ID0gYmNkMmJpbihkYXkpOw0KKwkJYWxtX3RtLT50bV93ZGF5ID0gYmNkMmJpbih3ZGF5KTsNCisgICAgfQ0KKyAgICBlbHNlDQorCXsNCisgICAgICAgIGFsbV90bS0+dG1fc2VjID0gLTE7DQorICAgICAgICBhbG1fdG0tPnRtX21pbiA9IC0xOw0KKyAgICAgICAgYWxtX3RtLT50bV9ob3VyID0gLTE7DQorICAgICAgICBhbG1fdG0tPnRtX21kYXkgPSAtMTsNCisgICAgICAgIGFsbV90bS0+dG1fbW9uID0gLTE7DQorICAgICAgICBhbG1fdG0tPnRtX3llYXIgPSAtMTsNCisgICAgfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGludCB6eDIzNDI5MF9ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkNCit7DQorCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsNCisJLy91bnNpZ25lZCBsb25nIGV4cGlyZXM7DQorCXVuc2lnbmVkIGNoYXIgc2VjLCBtaW4sIGhvdXIsIG1kYXksIHdkYXk7DQorCS8vcnRjX3RtX3RvX3RpbWUodG0sICZleHBpcmVzKTsNCisJLy9leHBpcmVzID0gcm91bmR1cChleHBpcmVzLCA2MCk7DQorCS8vcnRjX3RpbWVfdG9fdG0oZXhwaXJlcywgdG0pOw0KKwkvL3RtLT50bV9zZWMgPSAwOw0KKw0KKyAgICBpZiAodG0tPnRtX3NlYyA8IDYwICYmIHRtLT50bV9zZWMgPj0gMCkvL3l1eGlhbmcNCisJew0KKwkJc2VjID0gYmluMmJjZCh0bS0+dG1fc2VjKTsNCisJCXp4MjM0MjkwX3J0Y19zZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9TRUNPTkQsIHNlYywgWlgyMzQyOTBfUlRDX0FsQVJNX1NFQ09ORF9XSUQsIFpYMjM0MjkwX1JUQ19BbEFSTV9TRUNPTkRfTFNIKTsNCisJCXp4MjM0MjkwX3J0Y19hbGFybV9lbmFibGUoQUxBUk1fU0VDT05ELCAwKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXp4MjM0MjkwX3J0Y19hbGFybV9lbmFibGUoQUxBUk1fU0VDT05ELCAxKTsNCisJfQ0KKw0KKwlpZiAodG0tPnRtX21pbiA8IDYwICYmIHRtLT50bV9taW4gPj0gMCkNCisJew0KKwkJbWluID0gYmluMmJjZCh0bS0+dG1fbWluKTsNCisJCXp4MjM0MjkwX3J0Y19zZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9NSU5VVEUsIG1pbiwgWlgyMzQyOTBfUlRDX0FsQVJNX01JTlVURVNfV0lELCBaWDIzNDI5MF9SVENfQWxBUk1fTUlOVVRFU19MU0gpOw0KKwkJengyMzQyOTBfcnRjX2FsYXJtX2VuYWJsZShBTEFSTV9NSU5VVEUsIDApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJengyMzQyOTBfcnRjX2FsYXJtX2VuYWJsZShBTEFSTV9NSU5VVEUsIDEpOw0KKwl9DQorCWlmICh0bS0+dG1faG91ciA8IDI0ICYmIHRtLT50bV9ob3VyID49IDApDQorCXsNCisgICAgICAgIGhvdXIgPSBiaW4yYmNkKHRtLT50bV9ob3VyKTsNCisJCXp4MjM0MjkwX3J0Y19zZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9IT1VSLCBob3VyLCBaWDIzNDI5MF9SVENfQWxBUk1fSE9VUlNfV0lELCBaWDIzNDI5MF9SVENfQWxBUk1fSE9VUlNfTFNIKTsNCisJCXp4MjM0MjkwX3J0Y19hbGFybV9lbmFibGUoQUxBUk1fSE9VUiwgMCk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQl6eDIzNDI5MF9ydGNfYWxhcm1fZW5hYmxlKEFMQVJNX0hPVVIsIDEpOw0KKwl9DQorICAgIGlmKHRtLT50bV9tZGF5IDwgMzIgJiYgdG0tPnRtX21kYXkgPiAwKQ0KKyAgICB7DQorCQltZGF5ID0gYmluMmJjZCh0bS0+dG1fbWRheSk7DQorCQl6eDIzNDI5MF9ydGNfc2V0dmFsdWUoWlgyMzQyOTBfUkVHX0FERFJfQUxBUk1fREFZLCBtZGF5LCBaWDIzNDI5MF9SVENfQWxBUk1fREFZU19XSUQsIFpYMjM0MjkwX1JUQ19BbEFSTV9EQVlTX0xTSCk7DQorCQl6eDIzNDI5MF9ydGNfYWxhcm1fZW5hYmxlKEFMQVJNX0RBWSwgMCk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQl6eDIzNDI5MF9ydGNfYWxhcm1fZW5hYmxlKEFMQVJNX0RBWSwgMSk7DQorCX0NCisJaWYodG0tPnRtX3dkYXkgPCA3ICYmIHRtLT50bV93ZGF5ID49IDApDQorICAgIHsNCisJCXdkYXkgPSBiaW4yYmNkKHRtLT50bV93ZGF5KTsNCisJCXp4MjM0MjkwX3J0Y19zZXR2YWx1ZShaWDIzNDI5MF9SRUdfQUREUl9BTEFSTV9XRUVLLCB3ZGF5LCBaWDIzNDI5MF9SVENfQWxBUk1fV0VFS0RBWV9XSUQsIFpYMjM0MjkwX1JUQ19BbEFSTV9XRUVLREFZX0xTSCk7DQorCQl6eDIzNDI5MF9ydGNfYWxhcm1fZW5hYmxlKEFMQVJNX1dFRUtEQVksIDApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJengyMzQyOTBfcnRjX2FsYXJtX2VuYWJsZShBTEFSTV9XRUVLREFZLCAxKTsNCisJfQ0KKwl6eDIzNDI5MF9ydGNfc2V0YWllKGRldiwgYWxybS0+ZW5hYmxlZCk7DQorCXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50IHp4MjM0MjkwX3J0Y19yZXF1ZXN0X2lycShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQ0KK3sNCisJaW50IHJldCA9IC0xOw0KKyAgICAvL3p4MjM0MjkwX3J0Yy56eDIzNDI5MC0+aXJxX2Jhc2UgPSBQTUlDX0lOVF9TVEFSVDsNCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoengyMzQyOTBfcnRjLnp4MjM0MjkwLT5pcnFfYmFzZSArIFpYMjM0MjkwX0lOVF9SVENfQUxSTSwNCisJCU5VTEwsIHp4MjM0MjkwX3J0Y19hbGFybWlycSwJMCwgInp4MjM0MjkwLXJ0YyBhbGFybSIsIHJ0Yyk7DQorCWlmIChyZXQpDQorCXsNCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIklSUSVkIGVycm9yICVkXG4iLCB6eDIzNDI5MF9ydGMuengyMzQyOTAtPmlycV9iYXNlICsgWlgyMzQyOTBfSU5UX1JUQ19BTFJNLCByZXQpOw0KKwkJZ290byBlcnJfYWxhcm1faXJxOw0KKwl9DQorCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHp4MjM0MjkwX3J0Yy56eDIzNDI5MC0+aXJxX2Jhc2UgKyBaWDIzNDI5MF9JTlRfUlRDX0hPVVIsDQorCQkJTlVMTCwgengyMzQyOTBfcnRjX2hvdXJpcnEsCTAsICJ6eDIzNDI5MC1ydGMgaG91ciIsIHJ0Yyk7DQorCWlmIChyZXQpDQorCXsNCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIklSUSVkIGVycm9yICVkXG4iLCB6eDIzNDI5MF9ydGMuengyMzQyOTAtPmlycV9iYXNlICsgWlgyMzQyOTBfSU5UX1JUQ19IT1VSLCByZXQpOw0KKwkJZ290byBlcnJfaG91cl9pcnE7DQorCX0NCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoengyMzQyOTBfcnRjLnp4MjM0MjkwLT5pcnFfYmFzZSArIFpYMjM0MjkwX0lOVF9SVENfTUlOLA0KKwkJTlVMTCwgengyMzQyOTBfcnRjX21pbmlycSwJMCwgInp4MjM0MjkwLXJ0YyBtaW4iLCBydGMpOw0KKwlpZiAocmV0KQ0KKwl7DQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJUlElZCBlcnJvciAlZFxuIiwgengyMzQyOTBfcnRjLnp4MjM0MjkwLT5pcnFfYmFzZSArIFpYMjM0MjkwX0lOVF9SVENfTUlOLCByZXQpOw0KKwkJZ290byBlcnJfbWluX2lycTsNCisJfQ0KKw0KKwlyZXR1cm4gMDsNCisNCisgZXJyX21pbl9pcnE6DQorCWZyZWVfaXJxKHp4MjM0MjkwX3J0Yy56eDIzNDI5MC0+aXJxX2Jhc2UgKyBaWDIzNDI5MF9JTlRfUlRDX01JTiwgcnRjKTsNCisgZXJyX2hvdXJfaXJxOg0KKwlmcmVlX2lycSh6eDIzNDI5MF9ydGMuengyMzQyOTAtPmlycV9iYXNlICsgWlgyMzQyOTBfSU5UX1JUQ19IT1VSLCBydGMpOw0KKyBlcnJfYWxhcm1faXJxOg0KKwlmcmVlX2lycSh6eDIzNDI5MF9ydGMuengyMzQyOTAtPmlycV9iYXNlICsgWlgyMzQyOTBfSU5UX1JUQ19BTFJNLCBydGMpOw0KKw0KKwlyZXR1cm4gcmV0Ow0KK30NCisNCisjaWYgMQ0KKw0KK3N0YXRpYyBpbnQgengyMzQyOTBfcnRjX3NldF9zZWNvbmRfYWxhcm1faW50KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpDQorew0KKwlpbnQgblJldCA9IDA7DQorDQorCWludCByZXQgPSAwOw0KKwlpbnQgcmVnX2FkZHI9MCwgIG1hc2s9MDsNCisJdW5zaWduZWQgY2hhciByZWdfdmFsPTA7DQorCWludCBiSXNPbiA9IDA7DQorDQorICAgICNpZiAwDQorCXByX2RlYnVnKCIlczogYWllPSVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlZCk7DQorCW1hc2sgPSBaWDIzNDI5MF9CSVRGTUFTSyhaWDIzNDI5MF9SVENfQUxBUk1fSU5UX0VOX1dJRCwgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9FTl9MU0gpOw0KKwlyZWdfdmFsPSBaWDIzNDI5MF9CSVRGVkFMKGVuYWJsZWQsIFpYMjM0MjkwX1JUQ19BTEFSTV9JTlRfRU5fTFNIKTsNCisJblJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9SVENfQ1RSTDIsIHJlZ192YWwsIG1hc2spOw0KKyAgICBpZiAoblJldCAhPSAwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gblJldDsNCisgICAgfQ0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX0FMQVJNX0FGX1dJRCwgWlgyMzQyOTBfUlRDX0FMQVJNX0FGX0xTSCk7DQorCXJlZ192YWw9IFpYMjM0MjkwX0JJVEZWQUwoMCwgWlgyMzQyOTBfUlRDX0FMQVJNX0FGX0xTSCk7DQorCXp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9SVENfQ1RSTDIsIHJlZ192YWwsIG1hc2spOw0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX1dJRCwgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX0xTSCk7DQorCWlmKGVuYWJsZWQpDQorCXsNCisJCXJlZ192YWw9IFpYMjM0MjkwX0JJVEZWQUwoMCwgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX0xTSCk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZWdfdmFsPSBaWDIzNDI5MF9CSVRGVkFMKDEsIFpYMjM0MjkwX1JUQ19BTEFSTV9JTlRfTUFTS19MU0gpOw0KKwl9DQorCW5SZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfSU5UQl9NQVNLLCByZWdfdmFsLCBtYXNrKTsNCisgICAgI2VuZGlmDQorICAgIGlmKGVuYWJsZWQpDQorICAgICAgICBiSXNPbiA9IDA7Ly9hY3RpdmUNCisgICAgZWxzZQ0KKyAgICAgICAgYklzT24gPSAxOy8vaW5hY3RpdmUNCisNCisgICAgcmVnX2FkZHIgPSBaWDIzNDI5MF9SRUdfQUREUl9JTlRCX01BU0s7DQorICAgIHJlZ192YWwgPSBaWDIzNDI5MF9CSVRGVkFMKGVuYWJsZWQsIFpYMjM0MjkwX1JUQ19BTEFSTV9JTlRfTUFTS19MU0gpOw0KKyAgICBtYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX1dJRCwgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX0xTSCk7DQorICAgIHJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihyZWdfYWRkcixyZWdfdmFsLCBtYXNrKTsNCisgICAgengyMzQyOTBfcnRjX3JlYWRfcmVnaXN0ZXIoMHgwMywgJnJlZ192YWwpOw0KKw0KKy8vICAgIHByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Y19pb2N0bDoweDAzID0gJXguXG4iLHJlZ192YWwpOw0KKyNpZiAwDQorICAgIHJlZ19hZGRyID0gWlgyMzQyOTBfUkVHX0FERFJfUlRDX0NUUkwyOw0KKyAgICByZWdfdmFsID0gWlgyMzQyOTBfQklURlZBTChlbmFibGVkLCBaWDIzNDI5MF9SVENfQUxBUk1fSU5UX0VOX0xTSCk7DQorICAgIG1hc2sgPSBaWDIzNDI5MF9CSVRGTUFTSyhaWDIzNDI5MF9SVENfQUxBUk1fSU5UX0VOX1dJRCwgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9FTl9MU0gpOw0KKyAgICByZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoc2x2X2FkZHIscmVnX3ZhbCwgbWFzayk7DQorICAgIHJlZ19hZGRyID0gWlgyMzQyOTBfUkVHX0FERFJfUlRDX0NUUkwyOw0KKyAgICByZWdfdmFsID0gWlgyMzQyOTBfQklURlZBTChlbmFibGVkLCAyKTsNCisgICAgbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKDEsIDIpOw0KKyAgICByZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoc2x2X2FkZHIscmVnX3ZhbCwgbWFzayk7DQorI2VuZGlmDQorCXJldHVybiBuUmV0Ow0KK30NCisNCisvL3N0YXRpYyBERUNMQVJFX01VVEVYKHRpbWVyU2VtYXBob3JlKTsNCisNCisNCisNCitpbnQgengyMzQyOTBfcnRjX2dldHRpbWVyKHZvaWQpDQorew0KKwlpbnQgcmV0ID0gLUVQRVJNOw0KKw0KKwlpZighdGVzdF9hbmRfc2V0X2JpdChUSU1FUl9TRU1BX1dBSVRfQklULCAmdGltZXJfc2VtYV9mbGFnKSkNCisJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmdGltZXJTZW1hcGhvcmUpOw0KKw0KKwljbGVhcl9iaXQoVElNRVJfU0VNQV9XQUlUX0JJVCwgJnRpbWVyX3NlbWFfZmxhZyk7DQorDQorCWlmKCFyZXQpew0KKy8vCQlwcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGNfZ2V0dGltZXI6Z2V0IHNlbWFwaG9yZSBzdWNjZXNzLlxuIik7DQorDQorCQl6eDIzNDI5MF9ydGNfZW5hYmxlKGdfcnRjLT5kZXYucGFyZW50LCAwKTsNCisJCXp4MjM0MjkwX3J0Y19zZXR0aWUoZ19ydGMtPmRldi5wYXJlbnQsIDApOw0KKwkJengyMzQyOTBfcnRjX3NldF9zZWNvbmRfYWxhcm1faW50KGdfcnRjLT5kZXYucGFyZW50LCAxKTsNCisNCisJCS8vengyMzQyOTBfcnRjX3NldF9jbG9ja19mcmVxdWVuY3koVElNRVJfQ09VTlRfMSk7DQorCXJldHVybiAwOw0KKwl9DQorICAgIGVsc2V7DQorIC8vICAgICAgIHByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Y19nZXR0aW1lcjpnZXQgc2VtYXBob3JlIHJldCBpcyAlZC5cbiIsIHJldCk7DQorDQorICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICB9DQorfQ0KKw0KK2ludCB6eDIzNDI5MF9ydGNfc2V0X3NlY29uZF90aW1lcihpbnQgc2Vjb25kcykNCit7DQorCWludCBtYXNrID0gMDsNCisJdW5zaWduZWQgY2hhciByZWdfdmFsPTA7DQorCS8vaW50IHZhbHVlID0gMDsNCisNCisJbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKFpYMjM0MjkwX1JUQ19USU1FUl9JTlRfRU5fV0lELCAyKTsNCisJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTCgwLCAyKTsNCisJengyMzQyOTBfcnRjX3dyaXRlX3JlZ2lzdGVyKFpYMjM0MjkwX1JFR19BRERSX1JUQ19DVFJMMiwgcmVnX3ZhbCwgbWFzayk7DQorCXp4MjM0MjkwX3J0Y19zZXRfdGltZXJjb3VudGVyKHNlY29uZHMpOw0KKwl6eDIzNDI5MF9ydGNfc2V0X2Nsb2NrX2ZyZXF1ZW5jeShUSU1FUl9DT1VOVF8xKTsNCisJengyMzQyOTBfcnRjX2VuYWJsZShnX3J0Yy0+ZGV2LnBhcmVudCwgMSk7DQorCXp4MjM0MjkwX3J0Y19zZXR0aWUoZ19ydGMtPmRldi5wYXJlbnQsIDEpOw0KKwl6eDIzNDI5MF9ydGNfc2V0X3NlY29uZF9hbGFybV9pbnQoZ19ydGMtPmRldi5wYXJlbnQsIDApOw0KKyNpZiAwDQorCXp4MjM0MjkwX3J0Y19yZWFkX3JlZ2lzdGVyKDB4MDEsICZ2YWx1ZSk7DQorCXByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Y19pb2N0bDoweDAxID0gJXguXG4iLHZhbHVlKTsNCisJengyMzQyOTBfcnRjX3JlYWRfcmVnaXN0ZXIoMHgwMywgJnZhbHVlKTsNCisJcHJpbnRrKEtFUk5fSU5GTyAiengyMzQyOTBfcnRjX2lvY3RsOjB4MDMgPSAleC5cbiIsdmFsdWUpOw0KKwl6eDIzNDI5MF9ydGNfcmVhZF9yZWdpc3RlcigweDA1LCAmdmFsdWUpOw0KKwlwcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGNfaW9jdGw6MHgwNSA9ICV4LlxuIix2YWx1ZSk7DQorCXp4MjM0MjkwX3J0Y19yZWFkX3JlZ2lzdGVyKDB4MzAsICZ2YWx1ZSk7DQorCXByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Y19pb2N0bDoweDMwID0gJXguXG4iLHZhbHVlKTsNCisJengyMzQyOTBfcnRjX3JlYWRfcmVnaXN0ZXIoMHgzMSwgJnZhbHVlKTsNCisJcHJpbnRrKEtFUk5fSU5GTyAiengyMzQyOTBfcnRjX2lvY3RsOjB4MzEgPSAleC5cbiIsdmFsdWUpOw0KKwl6eDIzNDI5MF9ydGNfcmVhZF9yZWdpc3RlcigweDNFLCAmdmFsdWUpOw0KKwlwcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGNfaW9jdGw6MHgzRSA9ICV4LlxuIix2YWx1ZSk7DQorCXp4MjM0MjkwX3J0Y19yZWFkX3JlZ2lzdGVyKDB4M0YsICZ2YWx1ZSk7DQorCXByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Y19pb2N0bDoweDNGID0gJXguXG4iLHZhbHVlKTsNCisjZW5kaWYNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3ZvaWQgcHJpbnRmX3J0Y19sb2codm9pZCkNCit7DQorICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUgPSAwOw0KKw0KKyAgICB6eDIzNDI5MF9ydGNfcmVhZF9yZWdpc3RlcigweDAxLCAmdmFsdWUpOw0KKyAgICBwcmludGsoS0VSTl9JTkZPICJwcmludGZfcnRjX2xvZzoweDAxID0gJXguXG4iLHZhbHVlKTsNCisgICAgengyMzQyOTBfcnRjX3JlYWRfcmVnaXN0ZXIoMHgwMywgJnZhbHVlKTsNCisgICAgcHJpbnRrKEtFUk5fSU5GTyAicHJpbnRmX3J0Y19sb2c6MHgwMyA9ICV4LlxuIix2YWx1ZSk7DQorICAgIHp4MjM0MjkwX3J0Y19yZWFkX3JlZ2lzdGVyKDB4MDUsICZ2YWx1ZSk7DQorICAgIHByaW50ayhLRVJOX0lORk8gInByaW50Zl9ydGNfbG9nOjB4MDUgPSAleC5cbiIsdmFsdWUpOw0KKyAgICB6eDIzNDI5MF9ydGNfcmVhZF9yZWdpc3RlcigweDMwLCAmdmFsdWUpOw0KKyAgICBwcmludGsoS0VSTl9JTkZPICJwcmludGZfcnRjX2xvZzoweDMwID0gJXguXG4iLHZhbHVlKTsNCisgICAgengyMzQyOTBfcnRjX3JlYWRfcmVnaXN0ZXIoMHgzMSwgJnZhbHVlKTsNCisgICAgcHJpbnRrKEtFUk5fSU5GTyAicHJpbnRmX3J0Y19sb2c6MHgzMSA9ICV4LlxuIix2YWx1ZSk7DQorICAgIHp4MjM0MjkwX3J0Y19yZWFkX3JlZ2lzdGVyKDB4M0UsICZ2YWx1ZSk7DQorICAgIHByaW50ayhLRVJOX0lORk8gInByaW50Zl9ydGNfbG9nOjB4M0UgPSAleC5cbiIsdmFsdWUpOw0KKyAgICB6eDIzNDI5MF9ydGNfcmVhZF9yZWdpc3RlcigweDNGLCAmdmFsdWUpOw0KKyAgICBwcmludGsoS0VSTl9JTkZPICJwcmludGZfcnRjX2xvZzoweDNGID0gJXguXG4iLHZhbHVlKTsNCit9DQorDQorc3RhdGljIGludCB6eDIzNDI5MF9ydGNfc2V0X2FsYXJtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQ0KK3sNCisJaW50IG5SZXQgPSAwOw0KKwlpbnQgIHJlZ192YWw9MCwgbWFzaz0wOw0KKw0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9FTl9XSUQsIFpYMjM0MjkwX1JUQ19BTEFSTV9JTlRfRU5fTFNIKTsNCisJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTChlbmFibGVkLCBaWDIzNDI5MF9SVENfQUxBUk1fSU5UX0VOX0xTSCk7DQorDQorCW5SZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfUlRDX0NUUkwyLCByZWdfdmFsLCBtYXNrKTsNCisNCisJbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKDEsIDApOw0KKwlyZWdfdmFsPSBaWDIzNDI5MF9CSVRGVkFMKDAsIDApOw0KKw0KKwluUmV0ID0gengyMzQyOTBfcnRjX3dyaXRlX3JlZ2lzdGVyKDB4MDMsIHJlZ192YWwsIG1hc2spOw0KKw0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soMiwgMik7DQorCXJlZ192YWw9IFpYMjM0MjkwX0JJVEZWQUwoMCwgMik7DQorDQorCW5SZXQgPSB6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoMHgzMSwgcmVnX3ZhbCwgbWFzayk7DQorCXJldHVybiAwOw0KK30NCisNCisNCitpbnQgengyMzQyOTBfcnRjX2Rpc2FibGVfdGltZXJfYWxhcm0odm9pZCkNCit7DQorCXp4MjM0MjkwX3J0Y19lbmFibGUoZ19ydGMtPmRldi5wYXJlbnQsIDApOw0KKwl6eDIzNDI5MF9ydGNfc2V0dGllKGdfcnRjLT5kZXYucGFyZW50LCAwKTsNCisJengyMzQyOTBfcnRjX3NldF9hbGFybV9lbmFibGUoZ19ydGMtPmRldi5wYXJlbnQsIDApOw0KKwl6eDIzNDI5MF9ydGNfYWxhcm1fZW5hYmxlKEFMQVJNX01JTlVURSwxKTsNCisJengyMzQyOTBfcnRjX2FsYXJtX2VuYWJsZShBTEFSTV9IT1VSLDEpOw0KKwl6eDIzNDI5MF9ydGNfYWxhcm1fZW5hYmxlKEFMQVJNX0RBWSwxKTsNCisJengyMzQyOTBfcnRjX2FsYXJtX2VuYWJsZShBTEFSTV9XRUVLREFZLDEpOw0KKwlyZXR1cm4gMDsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwoengyMzQyOTBfcnRjX2Rpc2FibGVfdGltZXJfYWxhcm0pOw0KKw0KKy8qKioqZ2V0IHZhbHVlIG9mIHJ0YyB0aW1lciBjbnQgKioqKi8NCit1bnNpZ25lZCBjaGFyIHp4MjM0MjkwX3J0Y19nZXR0aW1lcl9jbnRfcmVtYWluKHZvaWQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHRpbWVyY250X3JlbWFpbj0wOw0KKwl6eDIzNDI5MF9ydGNfZ2V0dmFsdWUoWlgyMzQyOTBfUkVHX0FERFJfVElNRVJfQ05ULCAmdGltZXJjbnRfcmVtYWluLCBaWDIzNDI5MF9SVENfVElNRVJfQ05UX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVSX0NOVF9MU0gpOw0KKwlyZXR1cm4gdGltZXJjbnRfcmVtYWluOw0KK30NCisNCisNCisNCisNCitzdGF0aWMgaW50IHp4MjM0MjkwX3J0Y19pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsengyMzQyOTBfcnRjX3RpbWVyIGNtZCx1bnNpZ25lZCBsb25nIGFyZykNCit7DQorICAgIAlpbnQgZXJyID0gMDsNCisgICAgCXVuc2lnbmVkIGludCBzZWNvbmRzOw0KKwl1bnNpZ25lZCBjaGFyIHRpbWVyY250X3JlbWFpbiA9IDA7DQorCXVuc2lnbmVkIGludCBzZWNvbmRzX3JlbWFpbiA9IDA7DQorCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsNCisvLwlwcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGNfaW9jdGw6Y21kPSVkWyVjJWMlYyVkXWFyZz0lbGQuXG4iLGNtZCwgKGNtZD4+MjQpJjB4ZmYsKGNtZD4+MTYpJjB4ZmYsKGNtZD4+OCkmMHhmZixjbWQmMHhmZixhcmcpOw0KKyAgICBzd2l0Y2goY21kKQ0KKyAgICB7DQorICAgICAgICBjYXNlIFpYMjM0MjkwX1NFVF9USU1FUjoNCisgICAgICAgIHsNCisJCXNlY29uZHMgPSBhcmc7DQorDQorCQlpZihzZWNvbmRzKXsNCisJCQlzZXRfYml0KFRJTUVSX1NFTUFfU1RBUlRfQklULCAmdGltZXJfc2VtYV9mbGFnKTsNCisNCisJCQl0aW1lcl9yZW1haW4gPQlzZWNvbmRzOw0KKw0KKwkJCXp4MjM0MjkwX3J0Y19zZXRfc2Vjb25kX3RpbWVyKG1pbih0aW1lcl9yZW1haW4sMjU1KSk7DQorCQkJdGltZXJfcmVtYWluIC09IG1pbih0aW1lcl9yZW1haW4sMjU1KTsNCisvLwkJCXByaW50ayhLRVJOX0lORk8gIlpYMjM0MjkwX1NFVF9USU1FUjpzZXQgdGltZXI9JWQsIHJlbWFpbj0lZC5cbiIsIHNlY29uZHMsdGltZXJfcmVtYWluKTsNCisJCX0NCisNCisgICAgICAgICAgICBlbHNlLyogaWYoc2Vjb25kcyA9PSAwKSovew0KKy8vCQkJcHJpbnRrKEtFUk5fSU5GTyAiWlgyMzQyOTBfU0VUX1RJTUVSKHNlY29uZHMgPT0gJWxkKTp0aW1lclNlbWFwaG9yZT0weCV4LlxuIixzZWNvbmRzLHRpbWVyU2VtYXBob3JlKTsNCisJCQl6eDIzNDI5MF9ydGNfZW5hYmxlKGdfcnRjLT5kZXYucGFyZW50LCAwKTsNCisJCQl6eDIzNDI5MF9ydGNfc2V0dGllKGdfcnRjLT5kZXYucGFyZW50LCAwKTsNCisvLwkJCXByaW50Zl9ydGNfbG9nKCk7DQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChUSU1FUl9TRU1BX1dBSVRfQklULCAmdGltZXJfc2VtYV9mbGFnKSkNCisJCQkJdXAoJnRpbWVyU2VtYXBob3JlKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgIGNsZWFyX2JpdChUSU1FUl9TRU1BX1NUQVJUX0JJVCwgJnRpbWVyX3NlbWFfZmxhZyk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHNlY29uZHMgPSAwOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2lmIDENCisgICAgICAgIGNhc2UgWlgyMzQyOTBfR0VUX1RJTUVSOg0KKyAgICAgICAgew0KKw0KKyAgICAgICAgIAlpZih0ZXN0X2JpdChUSU1FUl9TRU1BX1NUQVJUX0JJVCwgJnRpbWVyX3NlbWFfZmxhZykpew0KKwkJCQllcnIgPSB6eDIzNDI5MF9ydGNfZ2V0dGltZXIoKTsNCisvLwkJCQlwcmludGsoS0VSTl9JTkZPICJaWDIzNDI5MF9HRVRfVElNRVIucmV0PSVkXG4iLGVycik7DQorCQkJfQ0KKwkJCS8vZWxzZQ0KKwkJCS8vCXByaW50ayhLRVJOX0lORk8gIlpYMjM0MjkwX0dFVF9USU1FUi5oYXMgbm90IHNldHRpbmcgdGltZXIsIHJldHVybj0lZFxuIixlcnIpOw0KKw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZGlmDQorDQorICAgICAgICBjYXNlIFpYMjM0MjkwX1RJTUVSX0VOQUJMRUQ6DQorICAgICAgICB7DQorCQlzZWNvbmRzID0gYXJnOw0KKwkvLwlwcmludGsoS0VSTl9JTkZPICJaWDIzNDI5MF9USU1FUl9FTkFCTEVEOmNtZD0lZCxzZW5jb25kcz0lZC5cbiIsIGNtZCxzZWNvbmRzKTsNCisJCWlmKHNlY29uZHMgPT0gMCkgew0KKwkJCXp4MjM0MjkwX3J0Y19lbmFibGUoZ19ydGMtPmRldi5wYXJlbnQsIDApOw0KKwkJCXp4MjM0MjkwX3J0Y19zZXR0aWUoZ19ydGMtPmRldi5wYXJlbnQsIDApOw0KKy8vCQkJcHJpbnRmX3J0Y19sb2coKTsNCisJCQlpZih0ZXN0X2FuZF9jbGVhcl9iaXQoVElNRVJfU0VNQV9XQUlUX0JJVCwgJnRpbWVyX3NlbWFfZmxhZykpDQorCQkJCXVwKCZ0aW1lclNlbWFwaG9yZSk7DQorDQorCQkJY2xlYXJfYml0KFRJTUVSX1NFTUFfU1RBUlRfQklULCAmdGltZXJfc2VtYV9mbGFnKTsNCisJCX0NCisJCWJyZWFrOw0KKyAgICAgICAgfQ0KKwljYXNlIFpYMjM0MjkwX0dFVF9USU1FUl9SRU1BSU46DQorCXsNCisJCXRpbWVyY250X3JlbWFpbiA9IHp4MjM0MjkwX3J0Y19nZXR0aW1lcl9jbnRfcmVtYWluKCk7DQorDQorCQlzZWNvbmRzX3JlbWFpbiA9IHRpbWVyX3JlbWFpbiArIHRpbWVyY250X3JlbWFpbjsNCisJLy8JcHJpbnRrKEtFUk5fSU5GTyAiWlgyMzQyOTBfR0VUX1RJTUVSX1JFTUFJTjpjbWQ9JWQucmVtYWluPSVkXG4iLCBjbWQsc2Vjb25kc19yZW1haW4pOw0KKwkJZXJyID0gcHV0X3VzZXIoc2Vjb25kc19yZW1haW4sKHVuc2lnbmVkIGxvbmcgX191c2VyICopdWFyZyk7DQorCQlicmVhazsNCisJfQ0KKwljYXNlIFpYMjM0MjkwX0NZQ0xFX0VOQUJMRToNCisgICAgew0KKwkJc2Vjb25kcyA9IGFyZzsNCisJLy8JcHJpbnRrKEtFUk5fSU5GTyAiWlgyMzQyOTBfQ1lDTEVfRU5BQkxFOmNtZD0lZCxlbmFibGU9JWQuXG4iLCBjbWQsc2Vjb25kcyk7DQorCQl6eDIzNDI5MF9ydGNfc2V0dWllKGdfcnRjLT5kZXYucGFyZW50LCBzZWNvbmRzKTsNCisJCWJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6DQorCQllcnI9RU5PSU9DVExDTUQ7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorc3RhdGljIGludCB6eDIzNDI5MF9ydGNfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGVuYWJsZSkNCit7DQorCWludCByZXQgPSAwOw0KKwlpbnQgIHJlZ192YWw9MCwgbWFzaz0wOw0KKw0KKwlyZWdfdmFsID0gWlgyMzQyOTBfQklURlZBTChlbmFibGUsIFpYMjM0MjkwX1JUQ19USU1FUl9FTl9MU0gpOw0KKwltYXNrID0gWlgyMzQyOTBfQklURk1BU0soWlgyMzQyOTBfUlRDX1RJTUVSX0VOX1dJRCwgWlgyMzQyOTBfUlRDX1RJTUVSX0VOX0xTSCk7DQorCXJldCA9IHp4MjM0MjkwX3J0Y193cml0ZV9yZWdpc3RlcihaWDIzNDI5MF9SRUdfQUREUl9USU1FUl9DVFJMLCByZWdfdmFsLCBtYXNrKTsNCisNCisJcmV0dXJuIHJldDsNCit9DQorDQorLyogyejWw1JUQ8Tasr+1ubzGyrG2qMqxxvcs08PT2sq1z9a52Lv6uvO2qMqxv6q7+iAqLw0KK2ludCB6eDIzNDI5MF9ydGNfc2V0dGltZXIoaW50IHNlYykNCit7DQorCWludCBtYXNrID0gMDsNCisJdW5zaWduZWQgY2hhciByZWdfdmFsPTA7DQorCS8vaW50IHZhbHVlID0gMDsNCisNCisJbWFzayA9IFpYMjM0MjkwX0JJVEZNQVNLKFpYMjM0MjkwX1JUQ19USU1FUl9JTlRfRU5fV0lELCAyKTsNCisJcmVnX3ZhbD0gWlgyMzQyOTBfQklURlZBTCgwLCAyKTsNCisJengyMzQyOTBfcnRjX3dyaXRlX3JlZ2lzdGVyKFpYMjM0MjkwX1JFR19BRERSX1JUQ19DVFJMMiwgcmVnX3ZhbCwgbWFzayk7DQorCXp4MjM0MjkwX3J0Y19zZXRfdGltZXJjb3VudGVyKHNlYyk7DQorCXp4MjM0MjkwX3J0Y19lbmFibGUoZ19ydGMtPmRldi5wYXJlbnQsIDEpOw0KKwl6eDIzNDI5MF9ydGNfc2V0dGllKGdfcnRjLT5kZXYucGFyZW50LCAxKTsNCisJengyMzQyOTBfcnRjX3NldGFpZShnX3J0Yy0+ZGV2LnBhcmVudCwgMCk7DQorICAgICNpZiAwDQorICAgIHp4MjM0MjkwX3J0Y19yZWFkX3JlZ2lzdGVyKDB4MzAsICZ2YWx1ZSk7DQorICAgIHByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Y19pb2N0bDoweDMwID0gJXguXG4iLHZhbHVlKTsNCisgICAgengyMzQyOTBfcnRjX3JlYWRfcmVnaXN0ZXIoMHgzMSwgJnZhbHVlKTsNCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiengyMzQyOTBfcnRjX2lvY3RsOjB4MzEgPSAleC5cbiIsdmFsdWUpOw0KKyAgICB6eDIzNDI5MF9ydGNfcmVhZF9yZWdpc3RlcigweDNFLCAmdmFsdWUpOw0KKyAgICBwcmludGsoS0VSTl9JTkZPICJ6eDIzNDI5MF9ydGNfaW9jdGw6MHgzRSA9ICV4LlxuIix2YWx1ZSk7DQorICAgIHp4MjM0MjkwX3J0Y19yZWFkX3JlZ2lzdGVyKDB4M0YsICZ2YWx1ZSk7DQorICAgIHByaW50ayhLRVJOX0lORk8gInp4MjM0MjkwX3J0Y19pb2N0bDoweDNGID0gJXguXG4iLHZhbHVlKTsNCisJLy9wcmludGsoInp4MjM0MjkwX3J0Y19zZXR0aW1lciBpcyBjYWxsZWQhIFxuIik7DQorICAgICNlbmRpZg0KKyAgICByZXR1cm4gMDsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwoengyMzQyOTBfcnRjX3NldHRpbWVyKTsNCisNCisjZW5kaWYNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgengyMzQyOTBfcnRjb3BzID0gew0KKwkucmVhZF90aW1lCT0gengyMzQyOTBfcnRjX2dldHRpbWUsDQorCS5zZXRfdGltZQk9IHp4MjM0MjkwX3J0Y19zZXR0aW1lLA0KKwkucmVhZF9hbGFybQk9IHp4MjM0MjkwX3J0Y19nZXRhbGFybSwNCisJLnNldF9hbGFybQk9IHp4MjM0MjkwX3J0Y19zZXRhbGFybSwNCisJLmFsYXJtX2lycV9lbmFibGUgPSB6eDIzNDI5MF9ydGNfc2V0YWllLA0KKwkuaW9jdGwgPSB6eDIzNDI5MF9ydGNfaW9jdGwsDQorfTsNCitzdGF0aWMgaW50IHp4MjM0MjkwX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsNCisJc3RydWN0IHJ0Y190aW1lIHJ0Y190bTsNCisJaW50IHJldDsNCisJZ19ydGNkZXYgPSBwZGV2Ow0KKwl6eDIzNDI5MF9ydGMuengyMzQyOTAgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7DQorCWlmKE5VTEw9PXp4MjM0MjkwX3J0Yy56eDIzNDI5MCkNCisJCXJldHVybiAtRUlOVkFMOw0KKwkNCisJengyMzQyOTBfcnRjX3NldF90aW1lcmNvdW50ZXIoMTI4KTsNCisJengyMzQyOTBfcnRjX3NldF9jbG9ja19mcmVxdWVuY3koVElNRVJfQ09VTlRfMSk7DQorCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsNCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiengyMzQyOTAiLCAmcGRldi0+ZGV2LCAmengyMzQyOTBfcnRjb3BzLCBUSElTX01PRFVMRSk7IC8qIHJlZ2lzdGVyIFJUQyBhbmQgZXhpdCAqLw0KKwlpZiAoSVNfRVJSKHJ0YykpDQorCXsNCisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhdHRhY2ggcnRjXG4iKTsNCisJCXJldCA9IFBUUl9FUlIocnRjKTsNCisJCWdvdG8gZXJyX25vcnRjOw0KKwl9DQorCWdfcnRjID0gcnRjOw0KKwl6eDIzNDI5MF9ydGNfZ2V0dGltZShOVUxMLCAmcnRjX3RtKTsgLyogQ2hlY2sgUlRDIFRpbWUgKi8NCisJdGVtcFRpbWUgPSBydGNfdG07DQorCWlmIChydGNfdmFsaWRfdG0oJnJ0Y190bSkgPCAwKQ0KKwl7DQorCQlydGNfdG0udG1feWVhcgk9IDEwMDsNCisJCXJ0Y190bS50bV9tb24JPSAwOw0KKwkJcnRjX3RtLnRtX21kYXkJPSAxOw0KKwkJcnRjX3RtLnRtX2hvdXIJPSAwOw0KKwkJcnRjX3RtLnRtX21pbgk9IDA7DQorCQlydGNfdG0udG1fc2VjCT0gMDsNCisJCXJ0Y190bS50bV93ZGF5PSA2Ow0KKwkJengyMzQyOTBfcnRjX3NldHRpbWUoTlVMTCwgJnJ0Y190bSk7DQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAid2FybmluZzogaW52YWxpZCBSVEMgdmFsdWUgc28gaW5pdGlhbGl6aW5nIGl0XG4iKTsNCisJfQ0KKwllbHNlDQorCXsNCisJICAgIHJ0Y190bSA9IHJ0Y19rdGltZV90b190bShydGNfdG1fdG9fa3RpbWUocnRjX3RtKSk7DQorCQl6eDIzNDI5MF9ydGNfc2V0dGltZShOVUxMLCAmcnRjX3RtKTsNCisJfQ0KKwlydGMtPm1heF91c2VyX2ZyZXEgPSA2NDsgLy8zMjc2ODsvLzMyayBjbG9jaw0KKwl6eDIzNDI5MF9ydGNfaXJxbm8gPSB6eDIzNDI5MF9ydGMuengyMzQyOTAtPmNoaXBfaXJxOw0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOw0KKwlyZXQgPSB6eDIzNDI5MF9ydGNfcmVxdWVzdF9pcnEocGRldiwgcnRjKTsNCisJaWYgKHJldCkNCisJew0KKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVJRIHJlcXVlc3QgZXJyb3IhXG4iKTsNCisJCWdvdG8gZXJyX2lycTsNCisJfQ0KKwl6eDIzNDI5MF9ydGNfd3JpdGVfcmVnaXN0ZXIoWlgyMzQyOTBfUkVHX0FERFJfUlRDX0NUUkwxLCAwLCAweGZmKTsNCisJengyMzQyOTBfcnRjX3NldHVpZSgmcGRldi0+ZGV2LCAwKTsNCisJengyMzQyOTBfcnRjX2VuYWJsZSgmcGRldi0+ZGV2LCAwKTsNCisJc2VtYV9pbml0KCZ0aW1lclNlbWFwaG9yZSwwKTsNCisgICAgLy96eDIzNDI5MF9ydGNfaW9jdGwoTlVMTCxaWDIzNDI5MF9TRVRfVElNRVIsMjApOw0KKwlyZXR1cm4gMDsNCisgZXJyX2lycToNCisgCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOw0KKyBlcnJfbm9ydGM6DQorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOw0KKwlyZXR1cm4gcmV0Ow0KK30NCitzdGF0aWMgaW50ICB6eDIzNDI5MF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQorew0KKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7DQorDQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOw0KKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsNCisJengyMzQyOTBfcnRjX3NldHVpZSgmcGRldi0+ZGV2LCAwKTsNCisJengyMzQyOTBfcnRjLnp4MjM0MjkwID0gTlVMTDsNCisNCisJcmV0dXJuIDA7DQorfQ0KK3N0YXRpYyBpbnQgIHp4MjM0MjkwX3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCit7DQorCWludCBpcnE9MDsNCisJc3RydWN0IHp4MjM0MjkwX2JvYXJkICpwbWljX3BsYXRfZGF0YSA9IHp4MjM0MjkwX3J0Yy56eDIzNDI5MC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOw0KKwlpcnE9Z3Bpb190b19pcnEocG1pY19wbGF0X2RhdGEtPmlycV9ncGlvX251bSk7DQorCWVuYWJsZV9pcnEoaXJxKTsNCisJengyMzQyOTBfcnRjX3NldHVpZSgmcGRldi0+ZGV2LCAxKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KK3N0YXRpYyBpbnQgengyMzQyOTBfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQ0KK3sNCisJaW50IGlycT0wOw0KKwlzdHJ1Y3QgengyMzQyOTBfYm9hcmQgKnBtaWNfcGxhdF9kYXRhID0gengyMzQyOTBfcnRjLnp4MjM0MjkwLT5kZXYtPnBsYXRmb3JtX2RhdGE7DQorCS8vaXJxPWdwaW9fdG9faXJxKFBJTl9QTVVfSU5UKTsNCisJaXJxPWdwaW9fdG9faXJxKHBtaWNfcGxhdF9kYXRhLT5pcnFfZ3Bpb19udW0pOw0KKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsNCisJengyMzQyOTBfcnRjX3NldHVpZSgmcGRldi0+ZGV2LCAwKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKw0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHp4MjM0MjkwX3J0Y19kcml2ZXIgPQ0KK3sNCisJLnByb2JlCQk9IHp4MjM0MjkwX3J0Y19wcm9iZSwNCisJLnJlbW92ZQkJPSB6eDIzNDI5MF9ydGNfcmVtb3ZlLA0KKwkuc3VzcGVuZAk9IHp4MjM0MjkwX3J0Y19zdXNwZW5kLA0KKwkucmVzdW1lCQk9IHp4MjM0MjkwX3J0Y19yZXN1bWUsDQorCS5kcml2ZXIJCT0gew0KKwkJLm5hbWUJPSAiengyMzQyOTAtcnRjIiwNCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLA0KKwl9LA0KK307DQorDQorDQorbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih6eDIzNDI5MF9ydGNfZHJpdmVyKTsNCisNCitNT0RVTEVfREVTQ1JJUFRJT04oIlpYMjM0MjkwIFJUQyBEcml2ZXIiKTsNCitNT0RVTEVfQVVUSE9SKCJ5dXhpYW5nIik7DQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOw0KK01PRFVMRV9BTElBUygicGxhdGZvcm06engyMzQyOTAtcnRjIik7DQorDQpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvengyMzQyOTAtcnRjLmggYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL3J0Yy96eDIzNDI5MC1ydGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjMzYzZlCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9ydGMvengyMzQyOTAtcnRjLmgKQEAgLTAsMCArMSwxMjcgQEAKKyNpZm5kZWYgX19aWDIzNDI5MF9SVENfSA0KKyNkZWZpbmUgX19aWDIzNDI5MF9SVENfSA0KKw0KKy8vdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4Ow0KKy8vdHlwZWRlZiBpbnQgVUlOVDE2Ow0KKw0KKy8vI2RlZmluZSBaWDIzNDI5MF9SVENfSVJRICAgICAgICAgICAgODEgLy8gIDQ5KzMyDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfT05FX0hPVVJfSU5UX01BU0tfTFNIICAgICAgICAgICAgICAoNCkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19PTkVfSE9VUl9JTlRfTUFTS19XSUQgICAgICAgICAgICAgICgxKQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX09ORV9NSU5VVEVfSU5UX01BU0tfTFNIICAgICAgICAgICAgKDMpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfT05FX01JTlVURV9JTlRfTUFTS19XSUQgICAgICAgICAgICAoMSkNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19BTEFSTV9JTlRfTUFTS19MU0ggICAgICAgICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FMQVJNX0lOVF9NQVNLX1dJRCAgICAgICAgICAgICAgICAgKDEpDQorDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQUxBUk1fSU5UX0VOX0xTSCAgICAgICAgICAgICAgICAgICAoMSkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19BTEFSTV9JTlRfRU5fV0lEICAgICAgICAgICAgICAgICAgICgxKQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX1RJTUVSX0lOVF9FTl9MU0ggICAgICAgICAgICAgICAgICAgKDApDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVElNRVJfSU5UX0VOX1dJRCAgICAgICAgICAgICAgICAgICAoMSkNCisNCisNCisvKlJUQyBUSU1FIFNFQ09ORFMgTUlOIEhPVSBEQVkgTU9OIFlFQVIgV0VFS0RBWSovDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVElNRV9TRUNPTkRTX0xTSCAgICAgICAgICAgICAgICAgICAoMCkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX1NFQ09ORFNfV0lEICAgICAgICAgICAgICAgICAgICg3KQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX1RJTUVfTUlOVVRFU19MU0ggICAgICAgICAgICAgICAgICAgKDApDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVElNRV9NSU5VVEVTX1dJRCAgICAgICAgICAgICAgICAgICAoNykNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX0hPVVJTX0xTSCAgICAgICAgICAgICAoMCkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX0hPVVJTX1dJRCAgICAgICAgICAgICAoNikNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX0RBWVNfTFNIICAgICAgICAgICAgICAoMCkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX0RBWVNfV0lEICAgICAgICAgICAgICAoNikNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX01PTlRIU19MU0ggICAgICAgICAgICAoMCkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX01PTlRIU19XSUQgICAgICAgICAgICAoNSkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX0NFTlRVUllfTFNIICAgICAgICAgICAoNykNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX0NFTlRVUllfV0lEICAgICAgICAgICAoMSkNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX1lFQVJfTFNIICAgICAgICAgICAgICAoMCkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX1lFQVJfV0lEICAgICAgICAgICAgICAoOCkNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX1dFRUtEQVlfTFNIICAgICAgICAgICAoMCkNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19USU1FX1dFRUtEQVlfV0lEICAgICAgICAgICAoMykNCisNCisvKlJUQyBBTEFSTSAgTUlOIEhPVSBEQVkgIFdFRUtEQVkqLw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX01JTlVURVNfTFNIICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX01JTlVURVNfV0lEICAgICAgICAgICg3KQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX0hPVVJTX0xTSCAgICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX0hPVVJTX1dJRCAgICAgICAgICAgICg2KQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX0RBWVNfTFNIICAgICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX0RBWVNfV0lEICAgICAgICAgICAgICg2KQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX1dFRUtEQVlfTFNIICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX1dFRUtEQVlfV0lEICAgICAgICAgICgzKQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX1NFQ09ORF9MU0ggICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX1NFQ09ORF9XSUQgICAgICAgICAgICg3KQ0KKw0KKy8qUlRDIEFMQVJNMSBJR05PUkUqLw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNMV9TRUNPTkRTSUdOT1JFX0xTSCAgICAgICAgICAgKDcpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQWxBUk0xX1NFQ09ORFNJR05PUkVfV0lEICAgICAgICAgICAoMSkNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19BbEFSTTFfTUlOVVRFU0lHTk9SRV9MU0ggICAgICAgICAgICg3KQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNMV9NSU5VVEVTSUdOT1JFX1dJRCAgICAgICAgICAgKDEpDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQWxBUk0xX0hPVVJTSUdOT1JFX0xTSCAgICAgICAgICAgICAoNykNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19BbEFSTTFfSE9VUlNJR05PUkVfV0lEICAgICAgICAgICAgICgxKQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNMV9EQVlTSUdOT1JFX0xTSCAgICAgICAgICAgICAgKDcpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQWxBUk0xX0RBWVNJR05PUkVfV0lEICAgICAgICAgICAgICAoMSkNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19BbEFSTTFfTU9OVEhTSUdOT1JFX0xTSCAgICAgICAgICAgICg3KQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNMV9NT05USFNJR05PUkVfV0lEICAgICAgICAgICAgKDEpDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQWxBUk0xX1lFQVJJR05PUkVfTFNIICAgICAgICAgICAgICAoNykNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19BbEFSTTFfWUVBUklHTk9SRV9XSUQgICAgICAgICAgICAgICgxKQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNMV9XRUVLREFZSUdOT1JFX0xTSCAgICAgICAgICAgKDcpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQWxBUk0xX1dFRUtEQVlJR05PUkVfV0lEICAgICAgICAgICAoMSkNCisNCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19BTEFSTV9BRl9MU0ggICAgICAgICAgICAgICAgICAgICAgICgzKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FMQVJNX0FGX1dJRCAgICAgICAgICAgICAgICAgICAgICAgKDEpDQorLypSVEMgQUxBUk0gRW5hYmxlKi8NCisjZGVmaW5lIFpYMjM0MjkwX1JUQ19BbEFSTV9BQ1RJVkFURURfTFNIICAgICAgICAgICAgICAgICg3KQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX0FsQVJNX0FDVElWQVRFRF9XSUQgICAgICAgICAgICAgICAgKDEpDQorDQorLyogUlRDIFRJTUVSIEVOQUJMRSAqLw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX1RJTUVSX0VOX0xTSCAgICAgICAgICAgICAgICg3KQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX1RJTUVSX0VOX1dJRCAgICAgICAgICAgICAgICgxKQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX1RJTUVSX1REX0xTSCAgICAgICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX1RJTUVSX1REX1dJRCAgICAgICAgICAgICAgICgyKQ0KKw0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX1RJTUVSX0NOVF9MU0ggICAgICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWlgyMzQyOTBfUlRDX1RJTUVSX0NOVF9XSUQgICAgICAgICAgICAgICg4KQ0KKw0KKy8qUlRDIFVOTE9DSyovDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVU5MT0NLX0xTSCAgICAgICAgICAgICAgICAgKDIpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVU5MT0NLX1dJRCAgICAgICAgICAgICAgICAgKDEpDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfREFUQUxBVENIX0xTSCAgICAgICAgICAgICAgKDMpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfREFUQUxBVENIX1dJRCAgICAgICAgICAgICAgKDEpDQorDQorI2RlZmluZSBaWDIzNDI5MF9NT05JVE9SX0ZMQV9MU0ggICAgICAgICAgICAgICAgKDApDQorI2RlZmluZSBaWDIzNDI5MF9NT05JVE9SX0ZMQV9XSUQgICAgICAgICAgICAgICAgKDEpDQorDQorLypyZWcgMHgzMSovDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVElFX0xTSCAgICAgICAgICAgICAgICAgICAgKDApDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVElFX1dJRCAgICAgICAgICAgICAgICAgICAgKDEpDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQUlFX0xTSCAgICAgICAgICAgICAgICAgICAgKDEpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQUlFX1dJRCAgICAgICAgICAgICAgICAgICAgKDEpDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVEZfTFNIICAgICAgICAgICAgICAgICAgICAgKDIpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfVEZfV0lEICAgICAgICAgICAgICAgICAgICAgKDEpDQorDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQUZfTFNIICAgICAgICAgICAgICAgICAgICAgKDMpDQorI2RlZmluZSBaWDIzNDI5MF9SVENfQUZfV0lEICAgICAgICAgICAgICAgICAgICAgKDEpDQorI2VuZGlmDQo=