LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgogKgogKi8KI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+CiNpbmNsdWRlICJkcm1QLmgiCiNpbmNsdWRlICJkcm0uaCIKI2luY2x1ZGUgImk5MTVfZHJtLmgiCiNpbmNsdWRlICJpOTE1X2Rydi5oIgojaW5jbHVkZSAiaW50ZWxfYmlvcy5oIgoKI2RlZmluZQlTTEFWRV9BRERSMQkweDcwCiNkZWZpbmUJU0xBVkVfQUREUjIJMHg3MgoKc3RhdGljIGludCBwYW5lbF90eXBlOwoKc3RhdGljIHZvaWQgKgpmaW5kX3NlY3Rpb24oc3RydWN0IGJkYl9oZWFkZXIgKmJkYiwgaW50IHNlY3Rpb25faWQpCnsKCXU4ICpiYXNlID0gKHU4ICopYmRiOwoJaW50IGluZGV4ID0gMDsKCXUxNiB0b3RhbCwgY3VycmVudF9zaXplOwoJdTggY3VycmVudF9pZDsKCgkvKiBza2lwIHRvIGZpcnN0IHNlY3Rpb24gKi8KCWluZGV4ICs9IGJkYi0+aGVhZGVyX3NpemU7Cgl0b3RhbCA9IGJkYi0+YmRiX3NpemU7CgoJLyogd2FsayB0aGUgc2VjdGlvbnMgbG9va2luZyBmb3Igc2VjdGlvbl9pZCAqLwoJd2hpbGUgKGluZGV4IDwgdG90YWwpIHsKCQljdXJyZW50X2lkID0gKihiYXNlICsgaW5kZXgpOwoJCWluZGV4Kys7CgkJY3VycmVudF9zaXplID0gKigodTE2ICopKGJhc2UgKyBpbmRleCkpOwoJCWluZGV4ICs9IDI7CgkJaWYgKGN1cnJlbnRfaWQgPT0gc2VjdGlvbl9pZCkKCQkJcmV0dXJuIGJhc2UgKyBpbmRleDsKCQlpbmRleCArPSBjdXJyZW50X3NpemU7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB1MTYKZ2V0X2Jsb2Nrc2l6ZSh2b2lkICpwKQp7Cgl1MTYgKmJsb2NrX3B0ciwgYmxvY2tfc2l6ZTsKCglibG9ja19wdHIgPSAodTE2ICopKChjaGFyICopcCAtIDIpOwoJYmxvY2tfc2l6ZSA9ICpibG9ja19wdHI7CglyZXR1cm4gYmxvY2tfc2l6ZTsKfQoKc3RhdGljIHZvaWQKZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGUsCgkJCXN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmR2b190aW1pbmcpCnsKCXBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ID0gKGR2b190aW1pbmctPmhhY3RpdmVfaGkgPDwgOCkgfAoJCWR2b190aW1pbmctPmhhY3RpdmVfbG87CglwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPmhzeW5jX29mZl9oaSA8PCA4KSB8IGR2b190aW1pbmctPmhzeW5jX29mZl9sbyk7CglwYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQgPSBwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCArCgkJZHZvX3RpbWluZy0+aHN5bmNfcHVsc2Vfd2lkdGg7CglwYW5lbF9maXhlZF9tb2RlLT5odG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheSArCgkJKChkdm9fdGltaW5nLT5oYmxhbmtfaGkgPDwgOCkgfCBkdm9fdGltaW5nLT5oYmxhbmtfbG8pOwoKCXBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ID0gKGR2b190aW1pbmctPnZhY3RpdmVfaGkgPDwgOCkgfAoJCWR2b190aW1pbmctPnZhY3RpdmVfbG87CglwYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ICsKCQlkdm9fdGltaW5nLT52c3luY19vZmY7CglwYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQgPSBwYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydCArCgkJZHZvX3RpbWluZy0+dnN5bmNfcHVsc2Vfd2lkdGg7CglwYW5lbF9maXhlZF9tb2RlLT52dG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheSArCgkJKChkdm9fdGltaW5nLT52YmxhbmtfaGkgPDwgOCkgfCBkdm9fdGltaW5nLT52YmxhbmtfbG8pOwoJcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2sgPSBkdm9fdGltaW5nLT5jbG9jayAqIDEwOwoJcGFuZWxfZml4ZWRfbW9kZS0+dHlwZSA9IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwoKCWlmIChkdm9fdGltaW5nLT5oc3luY19wb3NpdGl2ZSkKCQlwYW5lbF9maXhlZF9tb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX1BIU1lOQzsKCWVsc2UKCQlwYW5lbF9maXhlZF9tb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX05IU1lOQzsKCglpZiAoZHZvX3RpbWluZy0+dnN5bmNfcG9zaXRpdmUpCgkJcGFuZWxfZml4ZWRfbW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR19QVlNZTkM7CgllbHNlCgkJcGFuZWxfZml4ZWRfbW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR19OVlNZTkM7CgoJLyogU29tZSBWQlRzIGhhdmUgYm9ndXMgaC92dG90YWwgdmFsdWVzICovCglpZiAocGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfZW5kID4gcGFuZWxfZml4ZWRfbW9kZS0+aHRvdGFsKQoJCXBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCArIDE7CglpZiAocGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kID4gcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsKQoJCXBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX2VuZCArIDE7CgoJZHJtX21vZGVfc2V0X25hbWUocGFuZWxfZml4ZWRfbW9kZSk7Cn0KCi8qIFRyeSB0byBmaW5kIGludGVncmF0ZWQgcGFuZWwgZGF0YSAqLwpzdGF0aWMgdm9pZApwYXJzZV9sZnBfcGFuZWxfZGF0YShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJCSAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2x2ZHNfb3B0aW9ucyAqbHZkc19vcHRpb25zOwoJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhICpsdmRzX2xmcF9kYXRhOwoJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX3B0cnMgKmx2ZHNfbGZwX2RhdGFfcHRyczsKCXN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YV9lbnRyeSAqZW50cnk7CglzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICpkdm9fdGltaW5nOwoJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGU7CglpbnQgbGZwX2RhdGFfc2l6ZSwgZHZvX3RpbWluZ19vZmZzZXQ7CglpbnQgaSwgdGVtcF9kb3duY2xvY2s7CglzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqdGVtcF9tb2RlOwoKCWx2ZHNfb3B0aW9ucyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9MVkRTX09QVElPTlMpOwoJaWYgKCFsdmRzX29wdGlvbnMpCgkJcmV0dXJuOwoKCWRldl9wcml2LT5sdmRzX2RpdGhlciA9IGx2ZHNfb3B0aW9ucy0+cGl4ZWxfZGl0aGVyOwoJaWYgKGx2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZSA9PSAweGZmKQoJCXJldHVybjsKCglwYW5lbF90eXBlID0gbHZkc19vcHRpb25zLT5wYW5lbF90eXBlOwoKCWx2ZHNfbGZwX2RhdGEgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfTFZEU19MRlBfREFUQSk7CglpZiAoIWx2ZHNfbGZwX2RhdGEpCgkJcmV0dXJuOwoKCWx2ZHNfbGZwX2RhdGFfcHRycyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9MVkRTX0xGUF9EQVRBX1BUUlMpOwoJaWYgKCFsdmRzX2xmcF9kYXRhX3B0cnMpCgkJcmV0dXJuOwoKCWRldl9wcml2LT5sdmRzX3ZidCA9IDE7CgoJbGZwX2RhdGFfc2l6ZSA9IGx2ZHNfbGZwX2RhdGFfcHRycy0+cHRyWzFdLmR2b190aW1pbmdfb2Zmc2V0IC0KCQlsdmRzX2xmcF9kYXRhX3B0cnMtPnB0clswXS5kdm9fdGltaW5nX29mZnNldDsKCWVudHJ5ID0gKHN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YV9lbnRyeSAqKQoJCSgodWludDhfdCAqKWx2ZHNfbGZwX2RhdGEtPmRhdGEgKyAobGZwX2RhdGFfc2l6ZSAqCgkJCQkJCSAgIGx2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZSkpOwoJZHZvX3RpbWluZ19vZmZzZXQgPSBsdmRzX2xmcF9kYXRhX3B0cnMtPnB0clswXS5kdm9fdGltaW5nX29mZnNldCAtCgkJbHZkc19sZnBfZGF0YV9wdHJzLT5wdHJbMF0uZnBfdGltaW5nX29mZnNldDsKCgkvKgoJICogdGhlIHNpemUgb2YgZnBfdGltaW5nIHZhcmllcyBvbiB0aGUgZGlmZmVyZW50IHBsYXRmb3JtLgoJICogU28gY2FsY3VsYXRlIHRoZSBEVk8gdGltaW5nIHJlbGF0aXZlIG9mZnNldCBpbiBMVkRTIGRhdGEKCSAqIGVudHJ5IHRvIGdldCB0aGUgRFZPIHRpbWluZyBlbnRyeQoJICovCglkdm9fdGltaW5nID0gKHN0cnVjdCBsdmRzX2R2b190aW1pbmcgKikKCQkJKCh1bnNpZ25lZCBjaGFyICopZW50cnkgKyBkdm9fdGltaW5nX29mZnNldCk7CgoJcGFuZWxfZml4ZWRfbW9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpwYW5lbF9maXhlZF9tb2RlKSwgR0ZQX0tFUk5FTCk7CglpZiAoIXBhbmVsX2ZpeGVkX21vZGUpCgkJcmV0dXJuOwoKCWZpbGxfZGV0YWlsX3RpbWluZ19kYXRhKHBhbmVsX2ZpeGVkX21vZGUsIGR2b190aW1pbmcpOwoKCWRldl9wcml2LT5sZnBfbHZkc192YnRfbW9kZSA9IHBhbmVsX2ZpeGVkX21vZGU7CgoJRFJNX0RFQlVHX0tNUygiRm91bmQgcGFuZWwgbW9kZSBpbiBCSU9TIFZCVCB0YWJsZXM6XG4iKTsKCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUocGFuZWxfZml4ZWRfbW9kZSk7CgoJdGVtcF9tb2RlID0ga3phbGxvYyhzaXplb2YoKnRlbXBfbW9kZSksIEdGUF9LRVJORUwpOwoJdGVtcF9kb3duY2xvY2sgPSBwYW5lbF9maXhlZF9tb2RlLT5jbG9jazsKCS8qCgkgKiBlbnVtZXJhdGUgdGhlIExWRFMgcGFuZWwgdGltaW5nIGluZm8gZW50cnkgaW4gVkJUIHRvIGNoZWNrIHdoZXRoZXIKCSAqIHRoZSBMVkRTIGRvd25jbG9jayBpcyBmb3VuZC4KCSAqLwoJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKCQllbnRyeSA9IChzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfZW50cnkgKikKCQkJKCh1aW50OF90ICopbHZkc19sZnBfZGF0YS0+ZGF0YSArIChsZnBfZGF0YV9zaXplICogaSkpOwoJCWR2b190aW1pbmcgPSAoc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqKQoJCQkoKHVuc2lnbmVkIGNoYXIgKillbnRyeSArIGR2b190aW1pbmdfb2Zmc2V0KTsKCgkJZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEodGVtcF9tb2RlLCBkdm9fdGltaW5nKTsKCgkJaWYgKHRlbXBfbW9kZS0+aGRpc3BsYXkgPT0gcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgJiYKCQl0ZW1wX21vZGUtPmhzeW5jX3N0YXJ0ID09IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ICYmCgkJdGVtcF9tb2RlLT5oc3luY19lbmQgPT0gcGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfZW5kICYmCgkJdGVtcF9tb2RlLT5odG90YWwgPT0gcGFuZWxfZml4ZWRfbW9kZS0+aHRvdGFsICYmCgkJdGVtcF9tb2RlLT52ZGlzcGxheSA9PSBwYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheSAmJgoJCXRlbXBfbW9kZS0+dnN5bmNfc3RhcnQgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfc3RhcnQgJiYKCQl0ZW1wX21vZGUtPnZzeW5jX2VuZCA9PSBwYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQgJiYKCQl0ZW1wX21vZGUtPnZ0b3RhbCA9PSBwYW5lbF9maXhlZF9tb2RlLT52dG90YWwgJiYKCQl0ZW1wX21vZGUtPmNsb2NrIDwgdGVtcF9kb3duY2xvY2spIHsKCQkJLyoKCQkJICogZG93bmNsb2NrIGlzIGFscmVhZHkgZm91bmQuIEJ1dCB3ZSBleHBlY3QKCQkJICogdG8gZmluZCB0aGUgbG93ZXIgZG93bmNsb2NrLgoJCQkgKi8KCQkJdGVtcF9kb3duY2xvY2sgPSB0ZW1wX21vZGUtPmNsb2NrOwoJCX0KCQkvKiBjbGVhciBpdCB0byB6ZXJvICovCgkJbWVtc2V0KHRlbXBfbW9kZSwgMCwgc2l6ZW9mKCp0ZW1wX21vZGUpKTsKCX0KCWtmcmVlKHRlbXBfbW9kZSk7CglpZiAodGVtcF9kb3duY2xvY2sgPCBwYW5lbF9maXhlZF9tb2RlLT5jbG9jayAmJgoJICAgIGk5MTVfbHZkc19kb3duY2xvY2spIHsKCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2tfYXZhaWwgPSAxOwoJCWRldl9wcml2LT5sdmRzX2Rvd25jbG9jayA9IHRlbXBfZG93bmNsb2NrOwoJCURSTV9ERUJVR19LTVMoIkxWRFMgZG93bmNsb2NrIGlzIGZvdW5kIGluIFZCVC4gIiwKCQkJCSJOb3JtYWwgQ2xvY2sgJWRLSHosIGRvd25jbG9jayAlZEtIelxuIiwKCQkJCXRlbXBfZG93bmNsb2NrLCBwYW5lbF9maXhlZF9tb2RlLT5jbG9jayk7Cgl9CglyZXR1cm47Cn0KCi8qIFRyeSB0byBmaW5kIHNkdm8gcGFuZWwgZGF0YSAqLwpzdGF0aWMgdm9pZApwYXJzZV9zZHZvX3BhbmVsX2RhdGEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBiZGJfc2R2b19sdmRzX29wdGlvbnMgKnNkdm9fbHZkc19vcHRpb25zOwoJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqZHZvX3RpbWluZzsKCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwYW5lbF9maXhlZF9tb2RlOwoKCXNkdm9fbHZkc19vcHRpb25zID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX1NEVk9fTFZEU19PUFRJT05TKTsKCWlmICghc2R2b19sdmRzX29wdGlvbnMpCgkJcmV0dXJuOwoKCWR2b190aW1pbmcgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfU0RWT19QQU5FTF9EVERTKTsKCWlmICghZHZvX3RpbWluZykKCQlyZXR1cm47CgoJcGFuZWxfZml4ZWRfbW9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpwYW5lbF9maXhlZF9tb2RlKSwgR0ZQX0tFUk5FTCk7CgoJaWYgKCFwYW5lbF9maXhlZF9tb2RlKQoJCXJldHVybjsKCglmaWxsX2RldGFpbF90aW1pbmdfZGF0YShwYW5lbF9maXhlZF9tb2RlLAoJCQlkdm9fdGltaW5nICsgc2R2b19sdmRzX29wdGlvbnMtPnBhbmVsX3R5cGUpOwoKCWRldl9wcml2LT5zZHZvX2x2ZHNfdmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOwoKCXJldHVybjsKfQoKc3RhdGljIHZvaWQKcGFyc2VfZ2VuZXJhbF9mZWF0dXJlcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJICAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OwoJc3RydWN0IGJkYl9nZW5lcmFsX2ZlYXR1cmVzICpnZW5lcmFsOwoKCWdlbmVyYWwgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9GRUFUVVJFUyk7CglpZiAoZ2VuZXJhbCkgewoJCWRldl9wcml2LT5pbnRfdHZfc3VwcG9ydCA9IGdlbmVyYWwtPmludF90dl9zdXBwb3J0OwoJCWRldl9wcml2LT5pbnRfY3J0X3N1cHBvcnQgPSBnZW5lcmFsLT5pbnRfY3J0X3N1cHBvcnQ7CgkJZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYyA9IGdlbmVyYWwtPmVuYWJsZV9zc2M7CgoJCWlmIChkZXZfcHJpdi0+bHZkc191c2Vfc3NjKSB7CgkJCWlmIChJU19JODVYKGRldikpCgkJCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9CgkJCQkJZ2VuZXJhbC0+c3NjX2ZyZXEgPyA2NiA6IDQ4OwoJCQllbHNlIGlmIChJU19HRU41KGRldikgfHwgSVNfR0VONihkZXYpKQoJCQkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPQoJCQkJCWdlbmVyYWwtPnNzY19mcmVxID8gMTAwIDogMTIwOwoJCQllbHNlCgkJCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9CgkJCQkJZ2VuZXJhbC0+c3NjX2ZyZXEgPyAxMDAgOiA5NjsKCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2dlbmVyYWxfZGVmaW5pdGlvbnMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCQkgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBiZGJfZ2VuZXJhbF9kZWZpbml0aW9ucyAqZ2VuZXJhbDsKCglnZW5lcmFsID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0dFTkVSQUxfREVGSU5JVElPTlMpOwoJaWYgKGdlbmVyYWwpIHsKCQl1MTYgYmxvY2tfc2l6ZSA9IGdldF9ibG9ja3NpemUoZ2VuZXJhbCk7CgkJaWYgKGJsb2NrX3NpemUgPj0gc2l6ZW9mKCpnZW5lcmFsKSkgewoJCQlpbnQgYnVzX3BpbiA9IGdlbmVyYWwtPmNydF9kZGNfZ21idXNfcGluOwoJCQlEUk1fREVCVUdfS01TKCJjcnRfZGRjX2J1c19waW46ICVkXG4iLCBidXNfcGluKTsKCQkJaWYgKGJ1c19waW4gPj0gMSAmJiBidXNfcGluIDw9IDYpCgkJCQlkZXZfcHJpdi0+Y3J0X2RkY19waW4gPSBidXNfcGluOwoJCX0gZWxzZSB7CgkJCURSTV9ERUJVR19LTVMoIkJEQl9HRCB0b28gc21hbGwgKCVkKS4gSW52YWxpZC5cbiIsCgkJCQkgIGJsb2NrX3NpemUpOwoJCX0KCX0KfQoKc3RhdGljIHZvaWQKcGFyc2Vfc2R2b19kZXZpY2VfbWFwcGluZyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJCSAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgKnBfbWFwcGluZzsKCXN0cnVjdCBiZGJfZ2VuZXJhbF9kZWZpbml0aW9ucyAqcF9kZWZzOwoJc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcgKnBfY2hpbGQ7CglpbnQgaSwgY2hpbGRfZGV2aWNlX251bSwgY291bnQ7Cgl1MTYJYmxvY2tfc2l6ZTsKCglwX2RlZnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9ERUZJTklUSU9OUyk7CglpZiAoIXBfZGVmcykgewoJCURSTV9ERUJVR19LTVMoIk5vIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jayBpcyBmb3VuZCwgdW5hYmxlIHRvIGNvbnN0cnVjdCBzZHZvIG1hcHBpbmcuXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBqdWRnZSB3aGV0aGVyIHRoZSBzaXplIG9mIGNoaWxkIGRldmljZSBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLgoJICogSWYgdGhlIGNoaWxkIGRldmljZSBzaXplIG9idGFpbmVkIGZyb20gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrCgkgKiBpcyBkaWZmZXJlbnQgd2l0aCBzaXplb2Yoc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcpLCBza2lwIHRoZQoJICogcGFyc2luZyBvZiBzZHZvIGRldmljZSBpbmZvCgkgKi8KCWlmIChwX2RlZnMtPmNoaWxkX2Rldl9zaXplICE9IHNpemVvZigqcF9jaGlsZCkpIHsKCQkvKiBkaWZmZXJlbnQgY2hpbGQgZGV2IHNpemUgLiBJZ25vcmUgaXQgKi8KCQlEUk1fREVCVUdfS01TKCJkaWZmZXJlbnQgY2hpbGQgc2l6ZSBpcyBmb3VuZC4gSW52YWxpZC5cbiIpOwoJCXJldHVybjsKCX0KCS8qIGdldCB0aGUgYmxvY2sgc2l6ZSBvZiBnZW5lcmFsIGRlZmluaXRpb25zICovCglibG9ja19zaXplID0gZ2V0X2Jsb2Nrc2l6ZShwX2RlZnMpOwoJLyogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGQgZGV2aWNlICovCgljaGlsZF9kZXZpY2VfbnVtID0gKGJsb2NrX3NpemUgLSBzaXplb2YoKnBfZGVmcykpIC8KCQkJCXNpemVvZigqcF9jaGlsZCk7Cgljb3VudCA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgY2hpbGRfZGV2aWNlX251bTsgaSsrKSB7CgkJcF9jaGlsZCA9ICYocF9kZWZzLT5kZXZpY2VzW2ldKTsKCQlpZiAoIXBfY2hpbGQtPmRldmljZV90eXBlKSB7CgkJCS8qIHNraXAgdGhlIGRldmljZSBibG9jayBpZiBkZXZpY2UgdHlwZSBpcyBpbnZhbGlkICovCgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAocF9jaGlsZC0+c2xhdmVfYWRkciAhPSBTTEFWRV9BRERSMSAmJgoJCQlwX2NoaWxkLT5zbGF2ZV9hZGRyICE9IFNMQVZFX0FERFIyKSB7CgkJCS8qCgkJCSAqIElmIHRoZSBzbGF2ZSBhZGRyZXNzIGlzIG5laXRoZXIgMHg3MCBub3IgMHg3MiwKCQkJICogaXQgaXMgbm90IGEgU0RWTyBkZXZpY2UuIFNraXAgaXQuCgkJCSAqLwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0IgJiYKCQkJcF9jaGlsZC0+ZHZvX3BvcnQgIT0gREVWSUNFX1BPUlRfRFZPQykgewoJCQkvKiBza2lwIHRoZSBpbmNvcnJlY3QgU0RWTyBwb3J0ICovCgkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIHBvcnQuIFNraXAgaXQgXG4iKTsKCQkJY29udGludWU7CgkJfQoJCURSTV9ERUJVR19LTVMoInRoZSBTRFZPIGRldmljZSB3aXRoIHNsYXZlIGFkZHIgJTJ4IGlzIGZvdW5kIG9uIgoJCQkJIiAlcyBwb3J0XG4iLAoJCQkJcF9jaGlsZC0+c2xhdmVfYWRkciwKCQkJCShwX2NoaWxkLT5kdm9fcG9ydCA9PSBERVZJQ0VfUE9SVF9EVk9CKSA/CgkJCQkJIlNEVk9CIiA6ICJTRFZPQyIpOwoJCXBfbWFwcGluZyA9ICYoZGV2X3ByaXYtPnNkdm9fbWFwcGluZ3NbcF9jaGlsZC0+ZHZvX3BvcnQgLSAxXSk7CgkJaWYgKCFwX21hcHBpbmctPmluaXRpYWxpemVkKSB7CgkJCXBfbWFwcGluZy0+ZHZvX3BvcnQgPSBwX2NoaWxkLT5kdm9fcG9ydDsKCQkJcF9tYXBwaW5nLT5zbGF2ZV9hZGRyID0gcF9jaGlsZC0+c2xhdmVfYWRkcjsKCQkJcF9tYXBwaW5nLT5kdm9fd2lyaW5nID0gcF9jaGlsZC0+ZHZvX3dpcmluZzsKCQkJcF9tYXBwaW5nLT5kZGNfcGluID0gcF9jaGlsZC0+ZGRjX3BpbjsKCQkJcF9tYXBwaW5nLT5pMmNfcGluID0gcF9jaGlsZC0+aTJjX3BpbjsKCQkJcF9tYXBwaW5nLT5pMmNfc3BlZWQgPSBwX2NoaWxkLT5pMmNfc3BlZWQ7CgkJCXBfbWFwcGluZy0+aW5pdGlhbGl6ZWQgPSAxOwoJCQlEUk1fREVCVUdfS01TKCJTRFZPIGRldmljZTogZHZvPSV4LCBhZGRyPSV4LCB3aXJpbmc9JWQsIGRkY19waW49JWQsIGkyY19waW49JWQsIGkyY19zcGVlZD0lZFxuIiwKCQkJCSAgICAgIHBfbWFwcGluZy0+ZHZvX3BvcnQsCgkJCQkgICAgICBwX21hcHBpbmctPnNsYXZlX2FkZHIsCgkJCQkgICAgICBwX21hcHBpbmctPmR2b193aXJpbmcsCgkJCQkgICAgICBwX21hcHBpbmctPmRkY19waW4sCgkJCQkgICAgICBwX21hcHBpbmctPmkyY19waW4sCgkJCQkgICAgICBwX21hcHBpbmctPmkyY19zcGVlZCk7CgkJfSBlbHNlIHsKCQkJRFJNX0RFQlVHX0tNUygiTWF5YmUgb25lIFNEVk8gcG9ydCBpcyBzaGFyZWQgYnkgIgoJCQkJCSAidHdvIFNEVk8gZGV2aWNlLlxuIik7CgkJfQoJCWlmIChwX2NoaWxkLT5zbGF2ZTJfYWRkcikgewoJCQkvKiBNYXliZSB0aGlzIGlzIGEgU0RWTyBkZXZpY2Ugd2l0aCBtdWx0aXBsZSBpbnB1dHMgKi8KCQkJLyogQW5kIHRoZSBtYXBwaW5nIGluZm8gaXMgbm90IGFkZGVkICovCgkJCURSTV9ERUJVR19LTVMoInRoZXJlIGV4aXN0cyB0aGUgc2xhdmUyX2FkZHIuIE1heWJlIHRoaXMiCgkJCQkiIGlzIGEgU0RWTyBkZXZpY2Ugd2l0aCBtdWx0aXBsZSBpbnB1dHMuXG4iKTsKCQl9CgkJY291bnQrKzsKCX0KCglpZiAoIWNvdW50KSB7CgkJLyogTm8gU0RWTyBkZXZpY2UgaW5mbyBpcyBmb3VuZCAqLwoJCURSTV9ERUJVR19LTVMoIk5vIFNEVk8gZGV2aWNlIGluZm8gaXMgZm91bmQgaW4gVkJUXG4iKTsKCX0KCXJldHVybjsKfQoKc3RhdGljIHZvaWQKcGFyc2VfZHJpdmVyX2ZlYXR1cmVzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CglzdHJ1Y3QgYmRiX2RyaXZlcl9mZWF0dXJlcyAqZHJpdmVyOwoKCWRyaXZlciA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9EUklWRVJfRkVBVFVSRVMpOwoJaWYgKCFkcml2ZXIpCgkJcmV0dXJuOwoKCWlmIChTVVBQT1JUU19FRFAoZGV2KSAmJgoJICAgIGRyaXZlci0+bHZkc19jb25maWcgPT0gQkRCX0RSSVZFUl9GRUFUVVJFX0VEUCkKCQlkZXZfcHJpdi0+ZWRwLnN1cHBvcnQgPSAxOwoKCWlmIChkcml2ZXItPmR1YWxfZnJlcXVlbmN5KQoJCWRldl9wcml2LT5yZW5kZXJfcmVjbG9ja19hdmFpbCA9IHRydWU7Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2VkcChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBiZGJfZWRwICplZHA7CglzdHJ1Y3QgZWRwX3Bvd2VyX3NlcSAqZWRwX3BwczsKCXN0cnVjdCBlZHBfbGlua19wYXJhbXMgKmVkcF9saW5rX3BhcmFtczsKCgllZHAgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfRURQKTsKCWlmICghZWRwKSB7CgkJaWYgKFNVUFBPUlRTX0VEUChkZXZfcHJpdi0+ZGV2KSAmJiBkZXZfcHJpdi0+ZWRwLnN1cHBvcnQpIHsKCQkJRFJNX0RFQlVHX0tNUygiTm8gZURQIEJEQiBmb3VuZCBidXQgZURQIHBhbmVsICIKCQkJCSAgICAgICJzdXBwb3J0ZWQsIGFzc3VtZSAlZGJwcCBwYW5lbCBjb2xvciAiCgkJCQkgICAgICAiZGVwdGguXG4iLAoJCQkJICAgICAgZGV2X3ByaXYtPmVkcC5icHApOwoJCX0KCQlyZXR1cm47Cgl9CgoJc3dpdGNoICgoZWRwLT5jb2xvcl9kZXB0aCA+PiAocGFuZWxfdHlwZSAqIDIpKSAmIDMpIHsKCWNhc2UgRURQXzE4QlBQOgoJCWRldl9wcml2LT5lZHAuYnBwID0gMTg7CgkJYnJlYWs7CgljYXNlIEVEUF8yNEJQUDoKCQlkZXZfcHJpdi0+ZWRwLmJwcCA9IDI0OwoJCWJyZWFrOwoJY2FzZSBFRFBfMzBCUFA6CgkJZGV2X3ByaXYtPmVkcC5icHAgPSAzMDsKCQlicmVhazsKCX0KCgkvKiBHZXQgdGhlIGVEUCBzZXF1ZW5jaW5nIGFuZCBsaW5rIGluZm8gKi8KCWVkcF9wcHMgPSAmZWRwLT5wb3dlcl9zZXFzW3BhbmVsX3R5cGVdOwoJZWRwX2xpbmtfcGFyYW1zID0gJmVkcC0+bGlua19wYXJhbXNbcGFuZWxfdHlwZV07CgoJZGV2X3ByaXYtPmVkcC5wcHMgPSAqZWRwX3BwczsKCglkZXZfcHJpdi0+ZWRwLnJhdGUgPSBlZHBfbGlua19wYXJhbXMtPnJhdGUgPyBEUF9MSU5LX0JXXzJfNyA6CgkJRFBfTElOS19CV18xXzYyOwoJc3dpdGNoIChlZHBfbGlua19wYXJhbXMtPmxhbmVzKSB7CgljYXNlIDA6CgkJZGV2X3ByaXYtPmVkcC5sYW5lcyA9IDE7CgkJYnJlYWs7CgljYXNlIDE6CgkJZGV2X3ByaXYtPmVkcC5sYW5lcyA9IDI7CgkJYnJlYWs7CgljYXNlIDM6CglkZWZhdWx0OgoJCWRldl9wcml2LT5lZHAubGFuZXMgPSA0OwoJCWJyZWFrOwoJfQoJc3dpdGNoIChlZHBfbGlua19wYXJhbXMtPnByZWVtcGhhc2lzKSB7CgljYXNlIDA6CgkJZGV2X3ByaXYtPmVkcC5wcmVlbXBoYXNpcyA9IERQX1RSQUlOX1BSRV9FTVBIQVNJU18wOwoJCWJyZWFrOwoJY2FzZSAxOgoJCWRldl9wcml2LT5lZHAucHJlZW1waGFzaXMgPSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfM181OwoJCWJyZWFrOwoJY2FzZSAyOgoJCWRldl9wcml2LT5lZHAucHJlZW1waGFzaXMgPSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfNjsKCQlicmVhazsKCWNhc2UgMzoKCQlkZXZfcHJpdi0+ZWRwLnByZWVtcGhhc2lzID0gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzlfNTsKCQlicmVhazsKCX0KCXN3aXRjaCAoZWRwX2xpbmtfcGFyYW1zLT52c3dpbmcpIHsKCWNhc2UgMDoKCQlkZXZfcHJpdi0+ZWRwLnZzd2luZyA9IERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNDAwOwoJCWJyZWFrOwoJY2FzZSAxOgoJCWRldl9wcml2LT5lZHAudnN3aW5nID0gRFBfVFJBSU5fVk9MVEFHRV9TV0lOR182MDA7CgkJYnJlYWs7CgljYXNlIDI6CgkJZGV2X3ByaXYtPmVkcC52c3dpbmcgPSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzgwMDsKCQlicmVhazsKCWNhc2UgMzoKCQlkZXZfcHJpdi0+ZWRwLnZzd2luZyA9IERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfMTIwMDsKCQlicmVhazsKCX0KfQoKc3RhdGljIHZvaWQKcGFyc2VfZGV2aWNlX21hcHBpbmcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMgKnBfZGVmczsKCXN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnICpwX2NoaWxkLCAqY2hpbGRfZGV2X3B0cjsKCWludCBpLCBjaGlsZF9kZXZpY2VfbnVtLCBjb3VudDsKCXUxNglibG9ja19zaXplOwoKCXBfZGVmcyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9HRU5FUkFMX0RFRklOSVRJT05TKTsKCWlmICghcF9kZWZzKSB7CgkJRFJNX0RFQlVHX0tNUygiTm8gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrIGlzIGZvdW5kLCBubyBkZXZpY2VzIGRlZmluZWQuXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBqdWRnZSB3aGV0aGVyIHRoZSBzaXplIG9mIGNoaWxkIGRldmljZSBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLgoJICogSWYgdGhlIGNoaWxkIGRldmljZSBzaXplIG9idGFpbmVkIGZyb20gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrCgkgKiBpcyBkaWZmZXJlbnQgd2l0aCBzaXplb2Yoc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcpLCBza2lwIHRoZQoJICogcGFyc2luZyBvZiBzZHZvIGRldmljZSBpbmZvCgkgKi8KCWlmIChwX2RlZnMtPmNoaWxkX2Rldl9zaXplICE9IHNpemVvZigqcF9jaGlsZCkpIHsKCQkvKiBkaWZmZXJlbnQgY2hpbGQgZGV2IHNpemUgLiBJZ25vcmUgaXQgKi8KCQlEUk1fREVCVUdfS01TKCJkaWZmZXJlbnQgY2hpbGQgc2l6ZSBpcyBmb3VuZC4gSW52YWxpZC5cbiIpOwoJCXJldHVybjsKCX0KCS8qIGdldCB0aGUgYmxvY2sgc2l6ZSBvZiBnZW5lcmFsIGRlZmluaXRpb25zICovCglibG9ja19zaXplID0gZ2V0X2Jsb2Nrc2l6ZShwX2RlZnMpOwoJLyogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGQgZGV2aWNlICovCgljaGlsZF9kZXZpY2VfbnVtID0gKGJsb2NrX3NpemUgLSBzaXplb2YoKnBfZGVmcykpIC8KCQkJCXNpemVvZigqcF9jaGlsZCk7Cgljb3VudCA9IDA7CgkvKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZCBkZXZpY2UgdGhhdCBpcyBwcmVzZW50ICovCglmb3IgKGkgPSAwOyBpIDwgY2hpbGRfZGV2aWNlX251bTsgaSsrKSB7CgkJcF9jaGlsZCA9ICYocF9kZWZzLT5kZXZpY2VzW2ldKTsKCQlpZiAoIXBfY2hpbGQtPmRldmljZV90eXBlKSB7CgkJCS8qIHNraXAgdGhlIGRldmljZSBibG9jayBpZiBkZXZpY2UgdHlwZSBpcyBpbnZhbGlkICovCgkJCWNvbnRpbnVlOwoJCX0KCQljb3VudCsrOwoJfQoJaWYgKCFjb3VudCkgewoJCURSTV9ERUJVR19LTVMoIm5vIGNoaWxkIGRldiBpcyBwYXJzZWQgZnJvbSBWQlQgXG4iKTsKCQlyZXR1cm47Cgl9CglkZXZfcHJpdi0+Y2hpbGRfZGV2ID0ga3phbGxvYyhzaXplb2YoKnBfY2hpbGQpICogY291bnQsIEdGUF9LRVJORUwpOwoJaWYgKCFkZXZfcHJpdi0+Y2hpbGRfZGV2KSB7CgkJRFJNX0RFQlVHX0tNUygiTm8gbWVtb3J5IHNwYWNlIGZvciBjaGlsZCBkZXZpY2VcbiIpOwoJCXJldHVybjsKCX0KCglkZXZfcHJpdi0+Y2hpbGRfZGV2X251bSA9IGNvdW50OwoJY291bnQgPSAwOwoJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgewoJCXBfY2hpbGQgPSAmKHBfZGVmcy0+ZGV2aWNlc1tpXSk7CgkJaWYgKCFwX2NoaWxkLT5kZXZpY2VfdHlwZSkgewoJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLwoJCQljb250aW51ZTsKCQl9CgkJY2hpbGRfZGV2X3B0ciA9IGRldl9wcml2LT5jaGlsZF9kZXYgKyBjb3VudDsKCQljb3VudCsrOwoJCW1lbWNweSgodm9pZCAqKWNoaWxkX2Rldl9wdHIsICh2b2lkICopcF9jaGlsZCwKCQkJCQlzaXplb2YoKnBfY2hpbGQpKTsKCX0KCXJldHVybjsKfQoKc3RhdGljIHZvaWQKaW5pdF92YnRfZGVmYXVsdHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQp7CglkZXZfcHJpdi0+Y3J0X2RkY19waW4gPSBHTUJVU19QT1JUX1ZHQUREQzsKCgkvKiBMRlAgcGFuZWwgZGF0YSAqLwoJZGV2X3ByaXYtPmx2ZHNfZGl0aGVyID0gMTsKCWRldl9wcml2LT5sdmRzX3ZidCA9IDA7CgoJLyogU0RWTyBwYW5lbCBkYXRhICovCglkZXZfcHJpdi0+c2R2b19sdmRzX3ZidF9tb2RlID0gTlVMTDsKCgkvKiBnZW5lcmFsIGZlYXR1cmVzICovCglkZXZfcHJpdi0+aW50X3R2X3N1cHBvcnQgPSAxOwoJZGV2X3ByaXYtPmludF9jcnRfc3VwcG9ydCA9IDE7CglkZXZfcHJpdi0+bHZkc191c2Vfc3NjID0gMDsKCgkvKiBlRFAgZGF0YSAqLwoJZGV2X3ByaXYtPmVkcC5icHAgPSAxODsKfQoKLyoqCiAqIGludGVsX3BhcnNlX2Jpb3MgLSBmaW5kIFZCVCBhbmQgaW5pdGlhbGl6ZSBzZXR0aW5ncyBmcm9tIHRoZSBCSU9TCiAqIEBkZXY6IERSTSBkZXZpY2UKICoKICogTG9hZHMgdGhlIFZpZGVvIEJJT1MgYW5kIGNoZWNrcyB0aGF0IHRoZSBWQlQgZXhpc3RzLiAgU2V0cyBzY3JhdGNoIHJlZ2lzdGVycwogKiB0byBhcHByb3ByaWF0ZSB2YWx1ZXMuCiAqCiAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBub256ZXJvIG9uIGZhaWx1cmUuCiAqLwpib29sCmludGVsX3BhcnNlX2Jpb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OwoJc3RydWN0IGJkYl9oZWFkZXIgKmJkYiA9IE5VTEw7Cgl1OCBfX2lvbWVtICpiaW9zID0gTlVMTDsKCglpbml0X3ZidF9kZWZhdWx0cyhkZXZfcHJpdik7CgoJLyogWFhYIFNob3VsZCB0aGlzIHZhbGlkYXRpb24gYmUgbW92ZWQgdG8gaW50ZWxfb3ByZWdpb24uYz8gKi8KCWlmIChkZXZfcHJpdi0+b3ByZWdpb24udmJ0KSB7CgkJc3RydWN0IHZidF9oZWFkZXIgKnZidCA9IGRldl9wcml2LT5vcHJlZ2lvbi52YnQ7CgkJaWYgKG1lbWNtcCh2YnQtPnNpZ25hdHVyZSwgIiRWQlQiLCA0KSA9PSAwKSB7CgkJCURSTV9ERUJVR19EUklWRVIoIlVzaW5nIFZCVCBmcm9tIE9wUmVnaW9uOiAlMjBzXG4iLAoJCQkJCSB2YnQtPnNpZ25hdHVyZSk7CgkJCWJkYiA9IChzdHJ1Y3QgYmRiX2hlYWRlciAqKSgoY2hhciAqKXZidCArIHZidC0+YmRiX29mZnNldCk7CgkJfSBlbHNlCgkJCWRldl9wcml2LT5vcHJlZ2lvbi52YnQgPSBOVUxMOwoJfQoKCWlmIChiZGIgPT0gTlVMTCkgewoJCXN0cnVjdCB2YnRfaGVhZGVyICp2YnQgPSBOVUxMOwoJCXNpemVfdCBzaXplOwoJCWludCBpOwoKCQliaW9zID0gcGNpX21hcF9yb20ocGRldiwgJnNpemUpOwoJCWlmICghYmlvcykKCQkJcmV0dXJuIC0xOwoKCQkvKiBTY291ciBtZW1vcnkgbG9va2luZyBmb3IgdGhlIFZCVCBzaWduYXR1cmUgKi8KCQlmb3IgKGkgPSAwOyBpICsgNCA8IHNpemU7IGkrKykgewoJCQlpZiAoIW1lbWNtcChiaW9zICsgaSwgIiRWQlQiLCA0KSkgewoJCQkJdmJ0ID0gKHN0cnVjdCB2YnRfaGVhZGVyICopKGJpb3MgKyBpKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlpZiAoIXZidCkgewoJCQlEUk1fRVJST1IoIlZCVCBzaWduYXR1cmUgbWlzc2luZ1xuIik7CgkJCXBjaV91bm1hcF9yb20ocGRldiwgYmlvcyk7CgkJCXJldHVybiAtMTsKCQl9CgoJCWJkYiA9IChzdHJ1Y3QgYmRiX2hlYWRlciAqKShiaW9zICsgaSArIHZidC0+YmRiX29mZnNldCk7Cgl9CgoJLyogR3JhYiB1c2VmdWwgZ2VuZXJhbCBkZWZpbml0aW9ucyAqLwoJcGFyc2VfZ2VuZXJhbF9mZWF0dXJlcyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2dlbmVyYWxfZGVmaW5pdGlvbnMoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9sZnBfcGFuZWxfZGF0YShkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX3Nkdm9fcGFuZWxfZGF0YShkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX3Nkdm9fZGV2aWNlX21hcHBpbmcoZGV2X3ByaXYsIGJkYik7CglwYXJzZV9kZXZpY2VfbWFwcGluZyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2RyaXZlcl9mZWF0dXJlcyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2VkcChkZXZfcHJpdiwgYmRiKTsKCglpZiAoYmlvcykKCQlwY2lfdW5tYXBfcm9tKHBkZXYsIGJpb3MpOwoKCXJldHVybiAwOwp9CgovKiBFbnN1cmUgdGhhdCB2aXRhbCByZWdpc3RlcnMgaGF2ZSBiZWVuIGluaXRpYWxpc2VkLCBldmVuIGlmIHRoZSBCSU9TCiAqIGlzIGFic2VudCBvciBqdXN0IGZhaWxpbmcgdG8gZG8gaXRzIGpvYi4KICovCnZvaWQgaW50ZWxfc2V0dXBfYmlvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoKCSAvKiBTZXQgdGhlIFBhbmVsIFBvd2VyIE9uL09mZiB0aW1pbmdzIGlmIHVuaW5pdGlhbGl6ZWQuICovCglpZiAoKEk5MTVfUkVBRChQUF9PTl9ERUxBWVMpID09IDApICYmIChJOTE1X1JFQUQoUFBfT0ZGX0RFTEFZUykgPT0gMCkpIHsKCQkvKiBTZXQgVDIgdG8gNDBtcyBhbmQgVDUgdG8gMjAwbXMgKi8KCQlJOTE1X1dSSVRFKFBQX09OX0RFTEFZUywgMHgwMTkwMDdkMCk7CgoJCS8qIFNldCBUMyB0byAzNW1zIGFuZCBUeCB0byAyMDBtcyAqLwoJCUk5MTVfV1JJVEUoUFBfT0ZGX0RFTEFZUywgMHgwMTVlMDdkMCk7Cgl9Cn0K