LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgogKgogKi8KI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+CiNpbmNsdWRlICJkcm1QLmgiCiNpbmNsdWRlICJkcm0uaCIKI2luY2x1ZGUgImk5MTVfZHJtLmgiCiNpbmNsdWRlICJpOTE1X2Rydi5oIgojaW5jbHVkZSAiaW50ZWxfYmlvcy5oIgoKI2RlZmluZQlTTEFWRV9BRERSMQkweDcwCiNkZWZpbmUJU0xBVkVfQUREUjIJMHg3MgoKc3RhdGljIGludCBwYW5lbF90eXBlOwoKc3RhdGljIHZvaWQgKgpmaW5kX3NlY3Rpb24oc3RydWN0IGJkYl9oZWFkZXIgKmJkYiwgaW50IHNlY3Rpb25faWQpCnsKCXU4ICpiYXNlID0gKHU4ICopYmRiOwoJaW50IGluZGV4ID0gMDsKCXUxNiB0b3RhbCwgY3VycmVudF9zaXplOwoJdTggY3VycmVudF9pZDsKCgkvKiBza2lwIHRvIGZpcnN0IHNlY3Rpb24gKi8KCWluZGV4ICs9IGJkYi0+aGVhZGVyX3NpemU7Cgl0b3RhbCA9IGJkYi0+YmRiX3NpemU7CgoJLyogd2FsayB0aGUgc2VjdGlvbnMgbG9va2luZyBmb3Igc2VjdGlvbl9pZCAqLwoJd2hpbGUgKGluZGV4IDwgdG90YWwpIHsKCQljdXJyZW50X2lkID0gKihiYXNlICsgaW5kZXgpOwoJCWluZGV4Kys7CgkJY3VycmVudF9zaXplID0gKigodTE2ICopKGJhc2UgKyBpbmRleCkpOwoJCWluZGV4ICs9IDI7CgkJaWYgKGN1cnJlbnRfaWQgPT0gc2VjdGlvbl9pZCkKCQkJcmV0dXJuIGJhc2UgKyBpbmRleDsKCQlpbmRleCArPSBjdXJyZW50X3NpemU7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB1MTYKZ2V0X2Jsb2Nrc2l6ZSh2b2lkICpwKQp7Cgl1MTYgKmJsb2NrX3B0ciwgYmxvY2tfc2l6ZTsKCglibG9ja19wdHIgPSAodTE2ICopKChjaGFyICopcCAtIDIpOwoJYmxvY2tfc2l6ZSA9ICpibG9ja19wdHI7CglyZXR1cm4gYmxvY2tfc2l6ZTsKfQoKc3RhdGljIHZvaWQKZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGUsCgkJCWNvbnN0IHN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmR2b190aW1pbmcpCnsKCXBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ID0gKGR2b190aW1pbmctPmhhY3RpdmVfaGkgPDwgOCkgfAoJCWR2b190aW1pbmctPmhhY3RpdmVfbG87CglwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPmhzeW5jX29mZl9oaSA8PCA4KSB8IGR2b190aW1pbmctPmhzeW5jX29mZl9sbyk7CglwYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQgPSBwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCArCgkJZHZvX3RpbWluZy0+aHN5bmNfcHVsc2Vfd2lkdGg7CglwYW5lbF9maXhlZF9tb2RlLT5odG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheSArCgkJKChkdm9fdGltaW5nLT5oYmxhbmtfaGkgPDwgOCkgfCBkdm9fdGltaW5nLT5oYmxhbmtfbG8pOwoKCXBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ID0gKGR2b190aW1pbmctPnZhY3RpdmVfaGkgPDwgOCkgfAoJCWR2b190aW1pbmctPnZhY3RpdmVfbG87CglwYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ICsKCQlkdm9fdGltaW5nLT52c3luY19vZmY7CglwYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQgPSBwYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydCArCgkJZHZvX3RpbWluZy0+dnN5bmNfcHVsc2Vfd2lkdGg7CglwYW5lbF9maXhlZF9tb2RlLT52dG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheSArCgkJKChkdm9fdGltaW5nLT52YmxhbmtfaGkgPDwgOCkgfCBkdm9fdGltaW5nLT52YmxhbmtfbG8pOwoJcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2sgPSBkdm9fdGltaW5nLT5jbG9jayAqIDEwOwoJcGFuZWxfZml4ZWRfbW9kZS0+dHlwZSA9IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwoKCWlmIChkdm9fdGltaW5nLT5oc3luY19wb3NpdGl2ZSkKCQlwYW5lbF9maXhlZF9tb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX1BIU1lOQzsKCWVsc2UKCQlwYW5lbF9maXhlZF9tb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX05IU1lOQzsKCglpZiAoZHZvX3RpbWluZy0+dnN5bmNfcG9zaXRpdmUpCgkJcGFuZWxfZml4ZWRfbW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR19QVlNZTkM7CgllbHNlCgkJcGFuZWxfZml4ZWRfbW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR19OVlNZTkM7CgoJLyogU29tZSBWQlRzIGhhdmUgYm9ndXMgaC92dG90YWwgdmFsdWVzICovCglpZiAocGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfZW5kID4gcGFuZWxfZml4ZWRfbW9kZS0+aHRvdGFsKQoJCXBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCArIDE7CglpZiAocGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kID4gcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsKQoJCXBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX2VuZCArIDE7CgoJZHJtX21vZGVfc2V0X25hbWUocGFuZWxfZml4ZWRfbW9kZSk7Cn0KCnN0YXRpYyBib29sCmx2ZHNfZHZvX3RpbWluZ19lcXVhbF9zaXplKGNvbnN0IHN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmEsCgkJCSAgIGNvbnN0IHN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmIpCnsKCWlmIChhLT5oYWN0aXZlX2hpICE9IGItPmhhY3RpdmVfaGkgfHwKCSAgICBhLT5oYWN0aXZlX2xvICE9IGItPmhhY3RpdmVfbG8pCgkJcmV0dXJuIGZhbHNlOwoKCWlmIChhLT5oc3luY19vZmZfaGkgIT0gYi0+aHN5bmNfb2ZmX2hpIHx8CgkgICAgYS0+aHN5bmNfb2ZmX2xvICE9IGItPmhzeW5jX29mZl9sbykKCQlyZXR1cm4gZmFsc2U7CgoJaWYgKGEtPmhzeW5jX3B1bHNlX3dpZHRoICE9IGItPmhzeW5jX3B1bHNlX3dpZHRoKQoJCXJldHVybiBmYWxzZTsKCglpZiAoYS0+aGJsYW5rX2hpICE9IGItPmhibGFua19oaSB8fAoJICAgIGEtPmhibGFua19sbyAhPSBiLT5oYmxhbmtfbG8pCgkJcmV0dXJuIGZhbHNlOwoKCWlmIChhLT52YWN0aXZlX2hpICE9IGItPnZhY3RpdmVfaGkgfHwKCSAgICBhLT52YWN0aXZlX2xvICE9IGItPnZhY3RpdmVfbG8pCgkJcmV0dXJuIGZhbHNlOwoKCWlmIChhLT52c3luY19vZmYgIT0gYi0+dnN5bmNfb2ZmKQoJCXJldHVybiBmYWxzZTsKCglpZiAoYS0+dnN5bmNfcHVsc2Vfd2lkdGggIT0gYi0+dnN5bmNfcHVsc2Vfd2lkdGgpCgkJcmV0dXJuIGZhbHNlOwoKCWlmIChhLT52YmxhbmtfaGkgIT0gYi0+dmJsYW5rX2hpIHx8CgkgICAgYS0+dmJsYW5rX2xvICE9IGItPnZibGFua19sbykKCQlyZXR1cm4gZmFsc2U7CgoJcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICoKZ2V0X2x2ZHNfZHZvX3RpbWluZyhjb25zdCBzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGEgKmx2ZHNfbGZwX2RhdGEsCgkJICAgIGNvbnN0IHN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YV9wdHJzICpsdmRzX2xmcF9kYXRhX3B0cnMsCgkJICAgIGludCBpbmRleCkKewoJLyoKCSAqIHRoZSBzaXplIG9mIGZwX3RpbWluZyB2YXJpZXMgb24gdGhlIGRpZmZlcmVudCBwbGF0Zm9ybS4KCSAqIFNvIGNhbGN1bGF0ZSB0aGUgRFZPIHRpbWluZyByZWxhdGl2ZSBvZmZzZXQgaW4gTFZEUyBkYXRhCgkgKiBlbnRyeSB0byBnZXQgdGhlIERWTyB0aW1pbmcgZW50cnkKCSAqLwoKCWludCBsZnBfZGF0YV9zaXplID0KCQlsdmRzX2xmcF9kYXRhX3B0cnMtPnB0clsxXS5kdm9fdGltaW5nX29mZnNldCAtCgkJbHZkc19sZnBfZGF0YV9wdHJzLT5wdHJbMF0uZHZvX3RpbWluZ19vZmZzZXQ7CglpbnQgZHZvX3RpbWluZ19vZmZzZXQgPQoJCWx2ZHNfbGZwX2RhdGFfcHRycy0+cHRyWzBdLmR2b190aW1pbmdfb2Zmc2V0IC0KCQlsdmRzX2xmcF9kYXRhX3B0cnMtPnB0clswXS5mcF90aW1pbmdfb2Zmc2V0OwoJY2hhciAqZW50cnkgPSAoY2hhciAqKWx2ZHNfbGZwX2RhdGEtPmRhdGEgKyBsZnBfZGF0YV9zaXplICogaW5kZXg7CgoJcmV0dXJuIChzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICopKGVudHJ5ICsgZHZvX3RpbWluZ19vZmZzZXQpOwp9CgovKiBUcnkgdG8gZmluZCBpbnRlZ3JhdGVkIHBhbmVsIGRhdGEgKi8Kc3RhdGljIHZvaWQKcGFyc2VfbGZwX3BhbmVsX2RhdGEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCQkgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJY29uc3Qgc3RydWN0IGJkYl9sdmRzX29wdGlvbnMgKmx2ZHNfb3B0aW9uczsKCWNvbnN0IHN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YSAqbHZkc19sZnBfZGF0YTsKCWNvbnN0IHN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YV9wdHJzICpsdmRzX2xmcF9kYXRhX3B0cnM7Cgljb25zdCBzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICpwYW5lbF9kdm9fdGltaW5nOwoJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGU7CglpbnQgaSwgZG93bmNsb2NrOwoKCWx2ZHNfb3B0aW9ucyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9MVkRTX09QVElPTlMpOwoJaWYgKCFsdmRzX29wdGlvbnMpCgkJcmV0dXJuOwoKCWRldl9wcml2LT5sdmRzX2RpdGhlciA9IGx2ZHNfb3B0aW9ucy0+cGl4ZWxfZGl0aGVyOwoJaWYgKGx2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZSA9PSAweGZmKQoJCXJldHVybjsKCglwYW5lbF90eXBlID0gbHZkc19vcHRpb25zLT5wYW5lbF90eXBlOwoKCWx2ZHNfbGZwX2RhdGEgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfTFZEU19MRlBfREFUQSk7CglpZiAoIWx2ZHNfbGZwX2RhdGEpCgkJcmV0dXJuOwoKCWx2ZHNfbGZwX2RhdGFfcHRycyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9MVkRTX0xGUF9EQVRBX1BUUlMpOwoJaWYgKCFsdmRzX2xmcF9kYXRhX3B0cnMpCgkJcmV0dXJuOwoKCWRldl9wcml2LT5sdmRzX3ZidCA9IDE7CgoJcGFuZWxfZHZvX3RpbWluZyA9IGdldF9sdmRzX2R2b190aW1pbmcobHZkc19sZnBfZGF0YSwKCQkJCQkgICAgICAgbHZkc19sZnBfZGF0YV9wdHJzLAoJCQkJCSAgICAgICBsdmRzX29wdGlvbnMtPnBhbmVsX3R5cGUpOwoKCXBhbmVsX2ZpeGVkX21vZGUgPSBremFsbG9jKHNpemVvZigqcGFuZWxfZml4ZWRfbW9kZSksIEdGUF9LRVJORUwpOwoJaWYgKCFwYW5lbF9maXhlZF9tb2RlKQoJCXJldHVybjsKCglmaWxsX2RldGFpbF90aW1pbmdfZGF0YShwYW5lbF9maXhlZF9tb2RlLCBwYW5lbF9kdm9fdGltaW5nKTsKCglkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOwoKCURSTV9ERUJVR19LTVMoIkZvdW5kIHBhbmVsIG1vZGUgaW4gQklPUyBWQlQgdGFibGVzOlxuIik7Cglkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHBhbmVsX2ZpeGVkX21vZGUpOwoKCS8qCgkgKiBJdGVyYXRlIG92ZXIgdGhlIExWRFMgcGFuZWwgdGltaW5nIGluZm8gdG8gZmluZCB0aGUgbG93ZXN0IGNsb2NrCgkgKiBmb3IgdGhlIG5hdGl2ZSByZXNvbHV0aW9uLgoJICovCglkb3duY2xvY2sgPSBwYW5lbF9kdm9fdGltaW5nLT5jbG9jazsKCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CgkJY29uc3Qgc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqZHZvX3RpbWluZzsKCgkJZHZvX3RpbWluZyA9IGdldF9sdmRzX2R2b190aW1pbmcobHZkc19sZnBfZGF0YSwKCQkJCQkJIGx2ZHNfbGZwX2RhdGFfcHRycywKCQkJCQkJIGkpOwoJCWlmIChsdmRzX2R2b190aW1pbmdfZXF1YWxfc2l6ZShkdm9fdGltaW5nLCBwYW5lbF9kdm9fdGltaW5nKSAmJgoJCSAgICBkdm9fdGltaW5nLT5jbG9jayA8IGRvd25jbG9jaykKCQkJZG93bmNsb2NrID0gZHZvX3RpbWluZy0+Y2xvY2s7Cgl9CgoJaWYgKGRvd25jbG9jayA8IHBhbmVsX2R2b190aW1pbmctPmNsb2NrICYmIGk5MTVfbHZkc19kb3duY2xvY2spIHsKCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2tfYXZhaWwgPSAxOwoJCWRldl9wcml2LT5sdmRzX2Rvd25jbG9jayA9IGRvd25jbG9jayAqIDEwOwoJCURSTV9ERUJVR19LTVMoIkxWRFMgZG93bmNsb2NrIGlzIGZvdW5kIGluIFZCVC4gIgoJCQkgICAgICAiTm9ybWFsIENsb2NrICVkS0h6LCBkb3duY2xvY2sgJWRLSHpcbiIsCgkJCSAgICAgIHBhbmVsX2ZpeGVkX21vZGUtPmNsb2NrLCAxMCpkb3duY2xvY2spOwoJfQp9CgovKiBUcnkgdG8gZmluZCBzZHZvIHBhbmVsIGRhdGEgKi8Kc3RhdGljIHZvaWQKcGFyc2Vfc2R2b19wYW5lbF9kYXRhKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICpkdm9fdGltaW5nOwoJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGU7CglpbnQgaW5kZXg7CgoJaW5kZXggPSBpOTE1X3ZidF9zZHZvX3BhbmVsX3R5cGU7CglpZiAoaW5kZXggPT0gLTEpIHsKCQlzdHJ1Y3QgYmRiX3Nkdm9fbHZkc19vcHRpb25zICpzZHZvX2x2ZHNfb3B0aW9uczsKCgkJc2R2b19sdmRzX29wdGlvbnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfU0RWT19MVkRTX09QVElPTlMpOwoJCWlmICghc2R2b19sdmRzX29wdGlvbnMpCgkJCXJldHVybjsKCgkJaW5kZXggPSBzZHZvX2x2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZTsKCX0KCglkdm9fdGltaW5nID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX1NEVk9fUEFORUxfRFREUyk7CglpZiAoIWR2b190aW1pbmcpCgkJcmV0dXJuOwoKCXBhbmVsX2ZpeGVkX21vZGUgPSBremFsbG9jKHNpemVvZigqcGFuZWxfZml4ZWRfbW9kZSksIEdGUF9LRVJORUwpOwoJaWYgKCFwYW5lbF9maXhlZF9tb2RlKQoJCXJldHVybjsKCglmaWxsX2RldGFpbF90aW1pbmdfZGF0YShwYW5lbF9maXhlZF9tb2RlLCBkdm9fdGltaW5nICsgaW5kZXgpOwoKCWRldl9wcml2LT5zZHZvX2x2ZHNfdmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOwoKCURSTV9ERUJVR19LTVMoIkZvdW5kIFNEVk8gcGFuZWwgbW9kZSBpbiBCSU9TIFZCVCB0YWJsZXM6XG4iKTsKCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUocGFuZWxfZml4ZWRfbW9kZSk7Cn0KCnN0YXRpYyBpbnQgaW50ZWxfYmlvc19zc2NfZnJlcXVlbmN5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCgkJCQkgICAgYm9vbCBhbHRlcm5hdGUpCnsKCXN3aXRjaCAoSU5URUxfSU5GTyhkZXYpLT5nZW4pIHsKCWNhc2UgMjoKCQlyZXR1cm4gYWx0ZXJuYXRlID8gNjYgOiA0ODsKCWNhc2UgMzoKCWNhc2UgNDoKCQlyZXR1cm4gYWx0ZXJuYXRlID8gMTAwIDogOTY7CglkZWZhdWx0OgoJCXJldHVybiBhbHRlcm5hdGUgPyAxMDAgOiAxMjA7Cgl9Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2dlbmVyYWxfZmVhdHVyZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKCXN0cnVjdCBiZGJfZ2VuZXJhbF9mZWF0dXJlcyAqZ2VuZXJhbDsKCglnZW5lcmFsID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0dFTkVSQUxfRkVBVFVSRVMpOwoJaWYgKGdlbmVyYWwpIHsKCQlkZXZfcHJpdi0+aW50X3R2X3N1cHBvcnQgPSBnZW5lcmFsLT5pbnRfdHZfc3VwcG9ydDsKCQlkZXZfcHJpdi0+aW50X2NydF9zdXBwb3J0ID0gZ2VuZXJhbC0+aW50X2NydF9zdXBwb3J0OwoJCWRldl9wcml2LT5sdmRzX3VzZV9zc2MgPSBnZW5lcmFsLT5lbmFibGVfc3NjOwoJCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0KCQkJaW50ZWxfYmlvc19zc2NfZnJlcXVlbmN5KGRldiwgZ2VuZXJhbC0+c3NjX2ZyZXEpOwoJfQp9CgpzdGF0aWMgdm9pZApwYXJzZV9nZW5lcmFsX2RlZmluaXRpb25zKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkJICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMgKmdlbmVyYWw7CgoJZ2VuZXJhbCA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9HRU5FUkFMX0RFRklOSVRJT05TKTsKCWlmIChnZW5lcmFsKSB7CgkJdTE2IGJsb2NrX3NpemUgPSBnZXRfYmxvY2tzaXplKGdlbmVyYWwpOwoJCWlmIChibG9ja19zaXplID49IHNpemVvZigqZ2VuZXJhbCkpIHsKCQkJaW50IGJ1c19waW4gPSBnZW5lcmFsLT5jcnRfZGRjX2dtYnVzX3BpbjsKCQkJRFJNX0RFQlVHX0tNUygiY3J0X2RkY19idXNfcGluOiAlZFxuIiwgYnVzX3Bpbik7CgkJCWlmIChidXNfcGluID49IDEgJiYgYnVzX3BpbiA8PSA2KQoJCQkJZGV2X3ByaXYtPmNydF9kZGNfcGluID0gYnVzX3BpbjsKCQl9IGVsc2UgewoJCQlEUk1fREVCVUdfS01TKCJCREJfR0QgdG9vIHNtYWxsICglZCkuIEludmFsaWQuXG4iLAoJCQkJICBibG9ja19zaXplKTsKCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX3Nkdm9fZGV2aWNlX21hcHBpbmcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCQkgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBzZHZvX2RldmljZV9tYXBwaW5nICpwX21hcHBpbmc7CglzdHJ1Y3QgYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMgKnBfZGVmczsKCXN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnICpwX2NoaWxkOwoJaW50IGksIGNoaWxkX2RldmljZV9udW0sIGNvdW50OwoJdTE2CWJsb2NrX3NpemU7CgoJcF9kZWZzID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0dFTkVSQUxfREVGSU5JVElPTlMpOwoJaWYgKCFwX2RlZnMpIHsKCQlEUk1fREVCVUdfS01TKCJObyBnZW5lcmFsIGRlZmluaXRpb24gYmxvY2sgaXMgZm91bmQsIHVuYWJsZSB0byBjb25zdHJ1Y3Qgc2R2byBtYXBwaW5nLlxuIik7CgkJcmV0dXJuOwoJfQoJLyoganVkZ2Ugd2hldGhlciB0aGUgc2l6ZSBvZiBjaGlsZCBkZXZpY2UgbWVldHMgdGhlIHJlcXVpcmVtZW50cy4KCSAqIElmIHRoZSBjaGlsZCBkZXZpY2Ugc2l6ZSBvYnRhaW5lZCBmcm9tIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jawoJICogaXMgZGlmZmVyZW50IHdpdGggc2l6ZW9mKHN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnKSwgc2tpcCB0aGUKCSAqIHBhcnNpbmcgb2Ygc2R2byBkZXZpY2UgaW5mbwoJICovCglpZiAocF9kZWZzLT5jaGlsZF9kZXZfc2l6ZSAhPSBzaXplb2YoKnBfY2hpbGQpKSB7CgkJLyogZGlmZmVyZW50IGNoaWxkIGRldiBzaXplIC4gSWdub3JlIGl0ICovCgkJRFJNX0RFQlVHX0tNUygiZGlmZmVyZW50IGNoaWxkIHNpemUgaXMgZm91bmQuIEludmFsaWQuXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBnZXQgdGhlIGJsb2NrIHNpemUgb2YgZ2VuZXJhbCBkZWZpbml0aW9ucyAqLwoJYmxvY2tfc2l6ZSA9IGdldF9ibG9ja3NpemUocF9kZWZzKTsKCS8qIGdldCB0aGUgbnVtYmVyIG9mIGNoaWxkIGRldmljZSAqLwoJY2hpbGRfZGV2aWNlX251bSA9IChibG9ja19zaXplIC0gc2l6ZW9mKCpwX2RlZnMpKSAvCgkJCQlzaXplb2YoKnBfY2hpbGQpOwoJY291bnQgPSAwOwoJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgewoJCXBfY2hpbGQgPSAmKHBfZGVmcy0+ZGV2aWNlc1tpXSk7CgkJaWYgKCFwX2NoaWxkLT5kZXZpY2VfdHlwZSkgewoJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHBfY2hpbGQtPnNsYXZlX2FkZHIgIT0gU0xBVkVfQUREUjEgJiYKCQkJcF9jaGlsZC0+c2xhdmVfYWRkciAhPSBTTEFWRV9BRERSMikgewoJCQkvKgoJCQkgKiBJZiB0aGUgc2xhdmUgYWRkcmVzcyBpcyBuZWl0aGVyIDB4NzAgbm9yIDB4NzIsCgkJCSAqIGl0IGlzIG5vdCBhIFNEVk8gZGV2aWNlLiBTa2lwIGl0LgoJCQkgKi8KCQkJY29udGludWU7CgkJfQoJCWlmIChwX2NoaWxkLT5kdm9fcG9ydCAhPSBERVZJQ0VfUE9SVF9EVk9CICYmCgkJCXBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0MpIHsKCQkJLyogc2tpcCB0aGUgaW5jb3JyZWN0IFNEVk8gcG9ydCAqLwoJCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgU0RWTyBwb3J0LiBTa2lwIGl0IFxuIik7CgkJCWNvbnRpbnVlOwoJCX0KCQlEUk1fREVCVUdfS01TKCJ0aGUgU0RWTyBkZXZpY2Ugd2l0aCBzbGF2ZSBhZGRyICUyeCBpcyBmb3VuZCBvbiIKCQkJCSIgJXMgcG9ydFxuIiwKCQkJCXBfY2hpbGQtPnNsYXZlX2FkZHIsCgkJCQkocF9jaGlsZC0+ZHZvX3BvcnQgPT0gREVWSUNFX1BPUlRfRFZPQikgPwoJCQkJCSJTRFZPQiIgOiAiU0RWT0MiKTsKCQlwX21hcHBpbmcgPSAmKGRldl9wcml2LT5zZHZvX21hcHBpbmdzW3BfY2hpbGQtPmR2b19wb3J0IC0gMV0pOwoJCWlmICghcF9tYXBwaW5nLT5pbml0aWFsaXplZCkgewoJCQlwX21hcHBpbmctPmR2b19wb3J0ID0gcF9jaGlsZC0+ZHZvX3BvcnQ7CgkJCXBfbWFwcGluZy0+c2xhdmVfYWRkciA9IHBfY2hpbGQtPnNsYXZlX2FkZHI7CgkJCXBfbWFwcGluZy0+ZHZvX3dpcmluZyA9IHBfY2hpbGQtPmR2b193aXJpbmc7CgkJCXBfbWFwcGluZy0+ZGRjX3BpbiA9IHBfY2hpbGQtPmRkY19waW47CgkJCXBfbWFwcGluZy0+aTJjX3BpbiA9IHBfY2hpbGQtPmkyY19waW47CgkJCXBfbWFwcGluZy0+aTJjX3NwZWVkID0gcF9jaGlsZC0+aTJjX3NwZWVkOwoJCQlwX21hcHBpbmctPmluaXRpYWxpemVkID0gMTsKCQkJRFJNX0RFQlVHX0tNUygiU0RWTyBkZXZpY2U6IGR2bz0leCwgYWRkcj0leCwgd2lyaW5nPSVkLCBkZGNfcGluPSVkLCBpMmNfcGluPSVkLCBpMmNfc3BlZWQ9JWRcbiIsCgkJCQkgICAgICBwX21hcHBpbmctPmR2b19wb3J0LAoJCQkJICAgICAgcF9tYXBwaW5nLT5zbGF2ZV9hZGRyLAoJCQkJICAgICAgcF9tYXBwaW5nLT5kdm9fd2lyaW5nLAoJCQkJICAgICAgcF9tYXBwaW5nLT5kZGNfcGluLAoJCQkJICAgICAgcF9tYXBwaW5nLT5pMmNfcGluLAoJCQkJICAgICAgcF9tYXBwaW5nLT5pMmNfc3BlZWQpOwoJCX0gZWxzZSB7CgkJCURSTV9ERUJVR19LTVMoIk1heWJlIG9uZSBTRFZPIHBvcnQgaXMgc2hhcmVkIGJ5ICIKCQkJCQkgInR3byBTRFZPIGRldmljZS5cbiIpOwoJCX0KCQlpZiAocF9jaGlsZC0+c2xhdmUyX2FkZHIpIHsKCQkJLyogTWF5YmUgdGhpcyBpcyBhIFNEVk8gZGV2aWNlIHdpdGggbXVsdGlwbGUgaW5wdXRzICovCgkJCS8qIEFuZCB0aGUgbWFwcGluZyBpbmZvIGlzIG5vdCBhZGRlZCAqLwoJCQlEUk1fREVCVUdfS01TKCJ0aGVyZSBleGlzdHMgdGhlIHNsYXZlMl9hZGRyLiBNYXliZSB0aGlzIgoJCQkJIiBpcyBhIFNEVk8gZGV2aWNlIHdpdGggbXVsdGlwbGUgaW5wdXRzLlxuIik7CgkJfQoJCWNvdW50Kys7Cgl9CgoJaWYgKCFjb3VudCkgewoJCS8qIE5vIFNEVk8gZGV2aWNlIGluZm8gaXMgZm91bmQgKi8KCQlEUk1fREVCVUdfS01TKCJObyBTRFZPIGRldmljZSBpbmZvIGlzIGZvdW5kIGluIFZCVFxuIik7Cgl9CglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2RyaXZlcl9mZWF0dXJlcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJICAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OwoJc3RydWN0IGJkYl9kcml2ZXJfZmVhdHVyZXMgKmRyaXZlcjsKCglkcml2ZXIgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfRFJJVkVSX0ZFQVRVUkVTKTsKCWlmICghZHJpdmVyKQoJCXJldHVybjsKCglpZiAoU1VQUE9SVFNfRURQKGRldikgJiYKCSAgICBkcml2ZXItPmx2ZHNfY29uZmlnID09IEJEQl9EUklWRVJfRkVBVFVSRV9FRFApCgkJZGV2X3ByaXYtPmVkcC5zdXBwb3J0ID0gMTsKCglpZiAoZHJpdmVyLT5kdWFsX2ZyZXF1ZW5jeSkKCQlkZXZfcHJpdi0+cmVuZGVyX3JlY2xvY2tfYXZhaWwgPSB0cnVlOwp9CgpzdGF0aWMgdm9pZApwYXJzZV9lZHAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2VkcCAqZWRwOwoJc3RydWN0IGVkcF9wb3dlcl9zZXEgKmVkcF9wcHM7CglzdHJ1Y3QgZWRwX2xpbmtfcGFyYW1zICplZHBfbGlua19wYXJhbXM7CgoJZWRwID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0VEUCk7CglpZiAoIWVkcCkgewoJCWlmIChTVVBQT1JUU19FRFAoZGV2X3ByaXYtPmRldikgJiYgZGV2X3ByaXYtPmVkcC5zdXBwb3J0KSB7CgkJCURSTV9ERUJVR19LTVMoIk5vIGVEUCBCREIgZm91bmQgYnV0IGVEUCBwYW5lbCAiCgkJCQkgICAgICAic3VwcG9ydGVkLCBhc3N1bWUgJWRicHAgcGFuZWwgY29sb3IgIgoJCQkJICAgICAgImRlcHRoLlxuIiwKCQkJCSAgICAgIGRldl9wcml2LT5lZHAuYnBwKTsKCQl9CgkJcmV0dXJuOwoJfQoKCXN3aXRjaCAoKGVkcC0+Y29sb3JfZGVwdGggPj4gKHBhbmVsX3R5cGUgKiAyKSkgJiAzKSB7CgljYXNlIEVEUF8xOEJQUDoKCQlkZXZfcHJpdi0+ZWRwLmJwcCA9IDE4OwoJCWJyZWFrOwoJY2FzZSBFRFBfMjRCUFA6CgkJZGV2X3ByaXYtPmVkcC5icHAgPSAyNDsKCQlicmVhazsKCWNhc2UgRURQXzMwQlBQOgoJCWRldl9wcml2LT5lZHAuYnBwID0gMzA7CgkJYnJlYWs7Cgl9CgoJLyogR2V0IHRoZSBlRFAgc2VxdWVuY2luZyBhbmQgbGluayBpbmZvICovCgllZHBfcHBzID0gJmVkcC0+cG93ZXJfc2Vxc1twYW5lbF90eXBlXTsKCWVkcF9saW5rX3BhcmFtcyA9ICZlZHAtPmxpbmtfcGFyYW1zW3BhbmVsX3R5cGVdOwoKCWRldl9wcml2LT5lZHAucHBzID0gKmVkcF9wcHM7CgoJZGV2X3ByaXYtPmVkcC5yYXRlID0gZWRwX2xpbmtfcGFyYW1zLT5yYXRlID8gRFBfTElOS19CV18yXzcgOgoJCURQX0xJTktfQldfMV82MjsKCXN3aXRjaCAoZWRwX2xpbmtfcGFyYW1zLT5sYW5lcykgewoJY2FzZSAwOgoJCWRldl9wcml2LT5lZHAubGFuZXMgPSAxOwoJCWJyZWFrOwoJY2FzZSAxOgoJCWRldl9wcml2LT5lZHAubGFuZXMgPSAyOwoJCWJyZWFrOwoJY2FzZSAzOgoJZGVmYXVsdDoKCQlkZXZfcHJpdi0+ZWRwLmxhbmVzID0gNDsKCQlicmVhazsKCX0KCXN3aXRjaCAoZWRwX2xpbmtfcGFyYW1zLT5wcmVlbXBoYXNpcykgewoJY2FzZSAwOgoJCWRldl9wcml2LT5lZHAucHJlZW1waGFzaXMgPSBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfMDsKCQlicmVhazsKCWNhc2UgMToKCQlkZXZfcHJpdi0+ZWRwLnByZWVtcGhhc2lzID0gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzNfNTsKCQlicmVhazsKCWNhc2UgMjoKCQlkZXZfcHJpdi0+ZWRwLnByZWVtcGhhc2lzID0gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzY7CgkJYnJlYWs7CgljYXNlIDM6CgkJZGV2X3ByaXYtPmVkcC5wcmVlbXBoYXNpcyA9IERQX1RSQUlOX1BSRV9FTVBIQVNJU185XzU7CgkJYnJlYWs7Cgl9Cglzd2l0Y2ggKGVkcF9saW5rX3BhcmFtcy0+dnN3aW5nKSB7CgljYXNlIDA6CgkJZGV2X3ByaXYtPmVkcC52c3dpbmcgPSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMDsKCQlicmVhazsKCWNhc2UgMToKCQlkZXZfcHJpdi0+ZWRwLnZzd2luZyA9IERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNjAwOwoJCWJyZWFrOwoJY2FzZSAyOgoJCWRldl9wcml2LT5lZHAudnN3aW5nID0gRFBfVFJBSU5fVk9MVEFHRV9TV0lOR184MDA7CgkJYnJlYWs7CgljYXNlIDM6CgkJZGV2X3ByaXYtPmVkcC52c3dpbmcgPSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzEyMDA7CgkJYnJlYWs7Cgl9Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2RldmljZV9tYXBwaW5nKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGJkYl9nZW5lcmFsX2RlZmluaXRpb25zICpwX2RlZnM7CglzdHJ1Y3QgY2hpbGRfZGV2aWNlX2NvbmZpZyAqcF9jaGlsZCwgKmNoaWxkX2Rldl9wdHI7CglpbnQgaSwgY2hpbGRfZGV2aWNlX251bSwgY291bnQ7Cgl1MTYJYmxvY2tfc2l6ZTsKCglwX2RlZnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9ERUZJTklUSU9OUyk7CglpZiAoIXBfZGVmcykgewoJCURSTV9ERUJVR19LTVMoIk5vIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jayBpcyBmb3VuZCwgbm8gZGV2aWNlcyBkZWZpbmVkLlxuIik7CgkJcmV0dXJuOwoJfQoJLyoganVkZ2Ugd2hldGhlciB0aGUgc2l6ZSBvZiBjaGlsZCBkZXZpY2UgbWVldHMgdGhlIHJlcXVpcmVtZW50cy4KCSAqIElmIHRoZSBjaGlsZCBkZXZpY2Ugc2l6ZSBvYnRhaW5lZCBmcm9tIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jawoJICogaXMgZGlmZmVyZW50IHdpdGggc2l6ZW9mKHN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnKSwgc2tpcCB0aGUKCSAqIHBhcnNpbmcgb2Ygc2R2byBkZXZpY2UgaW5mbwoJICovCglpZiAocF9kZWZzLT5jaGlsZF9kZXZfc2l6ZSAhPSBzaXplb2YoKnBfY2hpbGQpKSB7CgkJLyogZGlmZmVyZW50IGNoaWxkIGRldiBzaXplIC4gSWdub3JlIGl0ICovCgkJRFJNX0RFQlVHX0tNUygiZGlmZmVyZW50IGNoaWxkIHNpemUgaXMgZm91bmQuIEludmFsaWQuXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBnZXQgdGhlIGJsb2NrIHNpemUgb2YgZ2VuZXJhbCBkZWZpbml0aW9ucyAqLwoJYmxvY2tfc2l6ZSA9IGdldF9ibG9ja3NpemUocF9kZWZzKTsKCS8qIGdldCB0aGUgbnVtYmVyIG9mIGNoaWxkIGRldmljZSAqLwoJY2hpbGRfZGV2aWNlX251bSA9IChibG9ja19zaXplIC0gc2l6ZW9mKCpwX2RlZnMpKSAvCgkJCQlzaXplb2YoKnBfY2hpbGQpOwoJY291bnQgPSAwOwoJLyogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGQgZGV2aWNlIHRoYXQgaXMgcHJlc2VudCAqLwoJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgewoJCXBfY2hpbGQgPSAmKHBfZGVmcy0+ZGV2aWNlc1tpXSk7CgkJaWYgKCFwX2NoaWxkLT5kZXZpY2VfdHlwZSkgewoJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLwoJCQljb250aW51ZTsKCQl9CgkJY291bnQrKzsKCX0KCWlmICghY291bnQpIHsKCQlEUk1fREVCVUdfS01TKCJubyBjaGlsZCBkZXYgaXMgcGFyc2VkIGZyb20gVkJUIFxuIik7CgkJcmV0dXJuOwoJfQoJZGV2X3ByaXYtPmNoaWxkX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpwX2NoaWxkKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKCWlmICghZGV2X3ByaXYtPmNoaWxkX2RldikgewoJCURSTV9ERUJVR19LTVMoIk5vIG1lbW9yeSBzcGFjZSBmb3IgY2hpbGQgZGV2aWNlXG4iKTsKCQlyZXR1cm47Cgl9CgoJZGV2X3ByaXYtPmNoaWxkX2Rldl9udW0gPSBjb3VudDsKCWNvdW50ID0gMDsKCWZvciAoaSA9IDA7IGkgPCBjaGlsZF9kZXZpY2VfbnVtOyBpKyspIHsKCQlwX2NoaWxkID0gJihwX2RlZnMtPmRldmljZXNbaV0pOwoJCWlmICghcF9jaGlsZC0+ZGV2aWNlX3R5cGUpIHsKCQkJLyogc2tpcCB0aGUgZGV2aWNlIGJsb2NrIGlmIGRldmljZSB0eXBlIGlzIGludmFsaWQgKi8KCQkJY29udGludWU7CgkJfQoJCWNoaWxkX2Rldl9wdHIgPSBkZXZfcHJpdi0+Y2hpbGRfZGV2ICsgY291bnQ7CgkJY291bnQrKzsKCQltZW1jcHkoKHZvaWQgKiljaGlsZF9kZXZfcHRyLCAodm9pZCAqKXBfY2hpbGQsCgkJCQkJc2l6ZW9mKCpwX2NoaWxkKSk7Cgl9CglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkCmluaXRfdmJ0X2RlZmF1bHRzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CgoJZGV2X3ByaXYtPmNydF9kZGNfcGluID0gR01CVVNfUE9SVF9WR0FEREM7CgoJLyogTEZQIHBhbmVsIGRhdGEgKi8KCWRldl9wcml2LT5sdmRzX2RpdGhlciA9IDE7CglkZXZfcHJpdi0+bHZkc192YnQgPSAwOwoKCS8qIFNEVk8gcGFuZWwgZGF0YSAqLwoJZGV2X3ByaXYtPnNkdm9fbHZkc192YnRfbW9kZSA9IE5VTEw7CgoJLyogZ2VuZXJhbCBmZWF0dXJlcyAqLwoJZGV2X3ByaXYtPmludF90dl9zdXBwb3J0ID0gMTsKCWRldl9wcml2LT5pbnRfY3J0X3N1cHBvcnQgPSAxOwoKCS8qIERlZmF1bHQgdG8gdXNpbmcgU1NDICovCglkZXZfcHJpdi0+bHZkc191c2Vfc3NjID0gMTsKCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0gaW50ZWxfYmlvc19zc2NfZnJlcXVlbmN5KGRldiwgMSk7CglEUk1fREVCVUcoIlNldCBkZWZhdWx0IHRvIFNTQyBhdCAlZE1IelxuIiwgZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEpOwoKCS8qIGVEUCBkYXRhICovCglkZXZfcHJpdi0+ZWRwLmJwcCA9IDE4Owp9CgovKioKICogaW50ZWxfcGFyc2VfYmlvcyAtIGZpbmQgVkJUIGFuZCBpbml0aWFsaXplIHNldHRpbmdzIGZyb20gdGhlIEJJT1MKICogQGRldjogRFJNIGRldmljZQogKgogKiBMb2FkcyB0aGUgVmlkZW8gQklPUyBhbmQgY2hlY2tzIHRoYXQgdGhlIFZCVCBleGlzdHMuICBTZXRzIHNjcmF0Y2ggcmVnaXN0ZXJzCiAqIHRvIGFwcHJvcHJpYXRlIHZhbHVlcy4KICoKICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZmFpbHVyZS4KICovCmJvb2wKaW50ZWxfcGFyc2VfYmlvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBkZXY7CglzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiID0gTlVMTDsKCXU4IF9faW9tZW0gKmJpb3MgPSBOVUxMOwoKCWluaXRfdmJ0X2RlZmF1bHRzKGRldl9wcml2KTsKCgkvKiBYWFggU2hvdWxkIHRoaXMgdmFsaWRhdGlvbiBiZSBtb3ZlZCB0byBpbnRlbF9vcHJlZ2lvbi5jPyAqLwoJaWYgKGRldl9wcml2LT5vcHJlZ2lvbi52YnQpIHsKCQlzdHJ1Y3QgdmJ0X2hlYWRlciAqdmJ0ID0gZGV2X3ByaXYtPm9wcmVnaW9uLnZidDsKCQlpZiAobWVtY21wKHZidC0+c2lnbmF0dXJlLCAiJFZCVCIsIDQpID09IDApIHsKCQkJRFJNX0RFQlVHX0RSSVZFUigiVXNpbmcgVkJUIGZyb20gT3BSZWdpb246ICUyMHNcbiIsCgkJCQkJIHZidC0+c2lnbmF0dXJlKTsKCQkJYmRiID0gKHN0cnVjdCBiZGJfaGVhZGVyICopKChjaGFyICopdmJ0ICsgdmJ0LT5iZGJfb2Zmc2V0KTsKCQl9IGVsc2UKCQkJZGV2X3ByaXYtPm9wcmVnaW9uLnZidCA9IE5VTEw7Cgl9CgoJaWYgKGJkYiA9PSBOVUxMKSB7CgkJc3RydWN0IHZidF9oZWFkZXIgKnZidCA9IE5VTEw7CgkJc2l6ZV90IHNpemU7CgkJaW50IGk7CgoJCWJpb3MgPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7CgkJaWYgKCFiaW9zKQoJCQlyZXR1cm4gLTE7CgoJCS8qIFNjb3VyIG1lbW9yeSBsb29raW5nIGZvciB0aGUgVkJUIHNpZ25hdHVyZSAqLwoJCWZvciAoaSA9IDA7IGkgKyA0IDwgc2l6ZTsgaSsrKSB7CgkJCWlmICghbWVtY21wKGJpb3MgKyBpLCAiJFZCVCIsIDQpKSB7CgkJCQl2YnQgPSAoc3RydWN0IHZidF9oZWFkZXIgKikoYmlvcyArIGkpOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlmICghdmJ0KSB7CgkJCURSTV9FUlJPUigiVkJUIHNpZ25hdHVyZSBtaXNzaW5nXG4iKTsKCQkJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJYmRiID0gKHN0cnVjdCBiZGJfaGVhZGVyICopKGJpb3MgKyBpICsgdmJ0LT5iZGJfb2Zmc2V0KTsKCX0KCgkvKiBHcmFiIHVzZWZ1bCBnZW5lcmFsIGRlZmluaXRpb25zICovCglwYXJzZV9nZW5lcmFsX2ZlYXR1cmVzKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZ2VuZXJhbF9kZWZpbml0aW9ucyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2xmcF9wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOwoJcGFyc2Vfc2R2b19wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOwoJcGFyc2Vfc2R2b19kZXZpY2VfbWFwcGluZyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2RldmljZV9tYXBwaW5nKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZHJpdmVyX2ZlYXR1cmVzKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZWRwKGRldl9wcml2LCBiZGIpOwoKCWlmIChiaW9zKQoJCXBjaV91bm1hcF9yb20ocGRldiwgYmlvcyk7CgoJcmV0dXJuIDA7Cn0KCi8qIEVuc3VyZSB0aGF0IHZpdGFsIHJlZ2lzdGVycyBoYXZlIGJlZW4gaW5pdGlhbGlzZWQsIGV2ZW4gaWYgdGhlIEJJT1MKICogaXMgYWJzZW50IG9yIGp1c3QgZmFpbGluZyB0byBkbyBpdHMgam9iLgogKi8Kdm9pZCBpbnRlbF9zZXR1cF9iaW9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CgoJIC8qIFNldCB0aGUgUGFuZWwgUG93ZXIgT24vT2ZmIHRpbWluZ3MgaWYgdW5pbml0aWFsaXplZC4gKi8KCWlmICgoSTkxNV9SRUFEKFBQX09OX0RFTEFZUykgPT0gMCkgJiYgKEk5MTVfUkVBRChQUF9PRkZfREVMQVlTKSA9PSAwKSkgewoJCS8qIFNldCBUMiB0byA0MG1zIGFuZCBUNSB0byAyMDBtcyAqLwoJCUk5MTVfV1JJVEUoUFBfT05fREVMQVlTLCAweDAxOTAwN2QwKTsKCgkJLyogU2V0IFQzIHRvIDM1bXMgYW5kIFR4IHRvIDIwMG1zICovCgkJSTkxNV9XUklURShQUF9PRkZfREVMQVlTLCAweDAxNWUwN2QwKTsKCX0KfQo=