ZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwMTFkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCkBAIC0wLDAgKzEsMTM0OCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Jsb2NrL2xvb3AuYworICoKKyAqICBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDMvMjkvOTMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MyBieSBUaGVvZG9yZSBUcydvLiAgUmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlIGlzCisgKiBwZXJtaXR0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIERFUyBlbmNyeXB0aW9uIHBsdXMgc29tZSBtaW5vciBjaGFuZ2VzIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgMzAtTUFZLTE5OTMKKyAqIG1vcmUgREVTIGVuY3J5cHRpb24gcGx1cyBJREVBIGVuY3J5cHRpb24gYnkgTmljaG9sYXMgSi4gTGVvbiwgSnVuZSAyMCwgMTk5NgorICoKKyAqIE1vZHVsYXJpemVkIGFuZCB1cGRhdGVkIGZvciAxLjEuMTYga2VybmVsIC0gTWl0Y2ggRHNvdXphIDI4dGggTWF5IDE5OTQKKyAqIEFkYXB0ZWQgZm9yIDEuMy41OSBrZXJuZWwgLSBBbmRyaWVzIEJyb3V3ZXIsIDEgRmViIDE5OTYKKyAqCisgKiBGaXhlZCBkb19sb29wX3JlcXVlc3QoKSByZS1lbnRyYW5jeSAtIFZpbmNlbnQuUmVuYXJkaWFzQHdhdy5jb20gTWFyIDIwLCAxOTk3CisgKgorICogQWRkZWQgZGV2ZnMgc3VwcG9ydCAtIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiAxNi1KYW4tMTk5OAorICoKKyAqIEhhbmRsZSBzcGFyc2UgYmFja2luZyBmaWxlcyBjb3JyZWN0bHkgLSBLZW5uIEh1bWJvcmcsIEp1biAyOCwgMTk5OAorICoKKyAqIExvYWRhYmxlIG1vZHVsZXMgYW5kIG90aGVyIGZpeGVzIGJ5IEFLLCAxOTk4CisgKgorICogTWFrZSByZWFsIGJsb2NrIG51bWJlciBhdmFpbGFibGUgdG8gZG93bnN0cmVhbSB0cmFuc2ZlciBmdW5jdGlvbnMsIGVuYWJsZXMKKyAqIENCQyAoYW5kIHJlbGF0aXZlcykgbW9kZSBlbmNyeXB0aW9uIHJlcXVpcmluZyB1bmlxdWUgSVZzIHBlciBkYXRhIGJsb2NrLgorICogUmVlZCBILiBQZXR0eSwgcmhwQGRyYXBlci5uZXQKKyAqCisgKiBNYXhpbXVtIG51bWJlciBvZiBsb29wIGRldmljZXMgbm93IGR5bmFtaWMgdmlhIG1heF9sb29wIG1vZHVsZSBwYXJhbWV0ZXIuCisgKiBSdXNzZWxsIEtyb2xsIDxya3JvbGxAZXhwbG9pdHMub3JnPiAxOTk5MDcwMQorICoKKyAqIE1heGltdW0gbnVtYmVyIG9mIGxvb3AgZGV2aWNlcyB3aGVuIGNvbXBpbGVkLWluIG5vdyBzZWxlY3RhYmxlIGJ5IHBhc3NpbmcKKyAqIG1heF9sb29wPTwxLTI1NT4gdG8gdGhlIGtlcm5lbCBvbiBib290LgorICogRXJpayBJLiBCb2xz+CwgPGVyaWtpQGhpbW9sZGUubm8+LCBPY3QgMzEsIDE5OTkKKyAqCisgKiBDb21wbGV0ZWx5IHJld3JpdGUgcmVxdWVzdCBoYW5kbGluZyB0byBiZSBtYWtlX3JlcXVlc3RfZm4gc3R5bGUgYW5kCisgKiBub24gYmxvY2tpbmcsIHB1c2hpbmcgd29yayB0byBhIGhlbHBlciB0aHJlYWQuIExvdHMgb2YgZml4ZXMgZnJvbQorICogQWwgVmlybyB0b28uCisgKiBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPiwgTm92IDIwMDAKKyAqCisgKiBTdXBwb3J0IHVwIHRvIDI1NiBsb29wIGRldmljZXMKKyAqIEhlaW56IE1hdWVsc2hhZ2VuIDxtZ2VAc2lzdGluYS5jb20+LCBGZWIgMjAwMgorICoKKyAqIFN1cHBvcnQgZm9yIGZhbGxpbmcgYmFjayBvbiB0aGUgd3JpdGUgZmlsZSBvcGVyYXRpb24gd2hlbiB0aGUgYWRkcmVzcyBzcGFjZQorICogb3BlcmF0aW9ucyBwcmVwYXJlX3dyaXRlIGFuZC9vciBjb21taXRfd3JpdGUgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlCisgKiBiYWNraW5nIGZpbGVzeXN0ZW0uCisgKiBBbnRvbiBBbHRhcGFybWFrb3YsIDE2IEZlYiAyMDA1CisgKgorICogU3RpbGwgVG8gRml4OgorICogLSBBZHZpc29yeSBsb2NraW5nIGlzIGlnbm9yZWQgaGVyZS4KKyAqIC0gU2hvdWxkIHVzZSBhbiBvd24gQ0FQXyogY2F0ZWdvcnkgaW5zdGVhZCBvZiBDQVBfU1lTX0FETUlOCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xvb3AuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBpbnZhbGlkYXRlX2JkZXYoKSAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW50IG1heF9sb29wID0gODsKK3N0YXRpYyBzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvb3BfZGV2Oworc3RhdGljIHN0cnVjdCBnZW5kaXNrICoqZGlza3M7CisKKy8qCisgKiBUcmFuc2ZlciBmdW5jdGlvbnMKKyAqLworc3RhdGljIGludCB0cmFuc2Zlcl9ub25lKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGludCBjbWQsCisJCQkgc3RydWN0IHBhZ2UgKnJhd19wYWdlLCB1bnNpZ25lZCByYXdfb2ZmLAorCQkJIHN0cnVjdCBwYWdlICpsb29wX3BhZ2UsIHVuc2lnbmVkIGxvb3Bfb2ZmLAorCQkJIGludCBzaXplLCBzZWN0b3JfdCByZWFsX2Jsb2NrKQoreworCWNoYXIgKnJhd19idWYgPSBrbWFwX2F0b21pYyhyYXdfcGFnZSwgS01fVVNFUjApICsgcmF3X29mZjsKKwljaGFyICpsb29wX2J1ZiA9IGttYXBfYXRvbWljKGxvb3BfcGFnZSwgS01fVVNFUjEpICsgbG9vcF9vZmY7CisKKwlpZiAoY21kID09IFJFQUQpCisJCW1lbWNweShsb29wX2J1ZiwgcmF3X2J1Ziwgc2l6ZSk7CisJZWxzZQorCQltZW1jcHkocmF3X2J1ZiwgbG9vcF9idWYsIHNpemUpOworCisJa3VubWFwX2F0b21pYyhyYXdfYnVmLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhsb29wX2J1ZiwgS01fVVNFUjEpOworCWNvbmRfcmVzY2hlZCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyYW5zZmVyX3hvcihzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBpbnQgY21kLAorCQkJc3RydWN0IHBhZ2UgKnJhd19wYWdlLCB1bnNpZ25lZCByYXdfb2ZmLAorCQkJc3RydWN0IHBhZ2UgKmxvb3BfcGFnZSwgdW5zaWduZWQgbG9vcF9vZmYsCisJCQlpbnQgc2l6ZSwgc2VjdG9yX3QgcmVhbF9ibG9jaykKK3sKKwljaGFyICpyYXdfYnVmID0ga21hcF9hdG9taWMocmF3X3BhZ2UsIEtNX1VTRVIwKSArIHJhd19vZmY7CisJY2hhciAqbG9vcF9idWYgPSBrbWFwX2F0b21pYyhsb29wX3BhZ2UsIEtNX1VTRVIxKSArIGxvb3Bfb2ZmOworCWNoYXIgKmluLCAqb3V0LCAqa2V5OworCWludCBpLCBrZXlzaXplOworCisJaWYgKGNtZCA9PSBSRUFEKSB7CisJCWluID0gcmF3X2J1ZjsKKwkJb3V0ID0gbG9vcF9idWY7CisJfSBlbHNlIHsKKwkJaW4gPSBsb29wX2J1ZjsKKwkJb3V0ID0gcmF3X2J1ZjsKKwl9CisKKwlrZXkgPSBsby0+bG9fZW5jcnlwdF9rZXk7CisJa2V5c2l6ZSA9IGxvLT5sb19lbmNyeXB0X2tleV9zaXplOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCSpvdXQrKyA9ICppbisrIF4ga2V5WyhpICYgNTExKSAlIGtleXNpemVdOworCisJa3VubWFwX2F0b21pYyhyYXdfYnVmLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhsb29wX2J1ZiwgS01fVVNFUjEpOworCWNvbmRfcmVzY2hlZCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhvcl9pbml0KHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGNvbnN0IHN0cnVjdCBsb29wX2luZm82NCAqaW5mbykKK3sKKwlpZiAodW5saWtlbHkoaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA8PSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlIG5vbmVfZnVuY3MgPSB7CisJLm51bWJlciA9IExPX0NSWVBUX05PTkUsCisJLnRyYW5zZmVyID0gdHJhbnNmZXJfbm9uZSwKK307IAkKKworc3RhdGljIHN0cnVjdCBsb29wX2Z1bmNfdGFibGUgeG9yX2Z1bmNzID0geworCS5udW1iZXIgPSBMT19DUllQVF9YT1IsCisJLnRyYW5zZmVyID0gdHJhbnNmZXJfeG9yLAorCS5pbml0ID0geG9yX2luaXQKK307IAkKKworLyogeGZlcl9mdW5jc1swXSBpcyBzcGVjaWFsIC0gaXRzIHJlbGVhc2UgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkICovCitzdGF0aWMgc3RydWN0IGxvb3BfZnVuY190YWJsZSAqeGZlcl9mdW5jc1tNQVhfTE9fQ1JZUFRdID0geworCSZub25lX2Z1bmNzLAorCSZ4b3JfZnVuY3MKK307CisKK3N0YXRpYyBsb2ZmX3QgZ2V0X2xvb3Bfc2l6ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlsb2ZmX3Qgc2l6ZSwgb2Zmc2V0LCBsb29wc2l6ZTsKKworCS8qIENvbXB1dGUgbG9vcHNpemUgaW4gYnl0ZXMgKi8KKwlzaXplID0gaV9zaXplX3JlYWQoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KTsKKwlvZmZzZXQgPSBsby0+bG9fb2Zmc2V0OworCWxvb3BzaXplID0gc2l6ZSAtIG9mZnNldDsKKwlpZiAobG8tPmxvX3NpemVsaW1pdCA+IDAgJiYgbG8tPmxvX3NpemVsaW1pdCA8IGxvb3BzaXplKQorCQlsb29wc2l6ZSA9IGxvLT5sb19zaXplbGltaXQ7CisKKwkvKgorCSAqIFVuZm9ydHVuYXRlbHksIGlmIHdlIHdhbnQgdG8gZG8gSS9PIG9uIHRoZSBkZXZpY2UsCisJICogdGhlIG51bWJlciBvZiA1MTItYnl0ZSBzZWN0b3JzIGhhcyB0byBmaXQgaW50byBhIHNlY3Rvcl90LgorCSAqLworCXJldHVybiBsb29wc2l6ZSA+PiA5OworfQorCitzdGF0aWMgaW50CitmaWd1cmVfbG9vcF9zaXplKHN0cnVjdCBsb29wX2RldmljZSAqbG8pCit7CisJbG9mZl90IHNpemUgPSBnZXRfbG9vcF9zaXplKGxvLCBsby0+bG9fYmFja2luZ19maWxlKTsKKwlzZWN0b3JfdCB4ID0gKHNlY3Rvcl90KXNpemU7CisKKwlpZiAodW5saWtlbHkoKGxvZmZfdCl4ICE9IHNpemUpKQorCQlyZXR1cm4gLUVGQklHOworCisJc2V0X2NhcGFjaXR5KGRpc2tzW2xvLT5sb19udW1iZXJdLCB4KTsKKwlyZXR1cm4gMDsJCQkJCQorfQorCitzdGF0aWMgaW5saW5lIGludAorbG9fZG9fdHJhbnNmZXIoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgaW50IGNtZCwKKwkgICAgICAgc3RydWN0IHBhZ2UgKnJwYWdlLCB1bnNpZ25lZCByb2ZmcywKKwkgICAgICAgc3RydWN0IHBhZ2UgKmxwYWdlLCB1bnNpZ25lZCBsb2ZmcywKKwkgICAgICAgaW50IHNpemUsIHNlY3Rvcl90IHJibG9jaykKK3sKKwlpZiAodW5saWtlbHkoIWxvLT50cmFuc2ZlcikpCisJCXJldHVybiAwOworCisJcmV0dXJuIGxvLT50cmFuc2ZlcihsbywgY21kLCBycGFnZSwgcm9mZnMsIGxwYWdlLCBsb2Zmcywgc2l6ZSwgcmJsb2NrKTsKK30KKworLyoqCisgKiBkb19sb19zZW5kX2FvcHMgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCisgKgorICogVGhpcyBpcyB0aGUgZmFzdCB2ZXJzaW9uIGZvciBiYWNraW5nIGZpbGVzeXN0ZW1zIHdoaWNoIGltcGxlbWVudCB0aGUgYWRkcmVzcworICogc3BhY2Ugb3BlcmF0aW9ucyBwcmVwYXJlX3dyaXRlIGFuZCBjb21taXRfd3JpdGUuCisgKi8KK3N0YXRpYyBpbnQgZG9fbG9fc2VuZF9hb3BzKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBiaW9fdmVjICpidmVjLAorCQlpbnQgYnNpemUsIGxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsgLyoga3Vkb3MgdG8gTkZzY2tpbmdTICovCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYW9wcyA9IG1hcHBpbmctPmFfb3BzOworCXBnb2ZmX3QgaW5kZXg7CisJdW5zaWduZWQgb2Zmc2V0LCBidl9vZmZzOworCWludCBsZW4sIHJldCA9IDA7CisKKwlkb3duKCZtYXBwaW5nLT5ob3N0LT5pX3NlbSk7CisJaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlvZmZzZXQgPSBwb3MgJiAoKHBnb2ZmX3QpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJYnZfb2ZmcyA9IGJ2ZWMtPmJ2X29mZnNldDsKKwlsZW4gPSBidmVjLT5idl9sZW47CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc2VjdG9yX3QgSVY7CisJCXVuc2lnbmVkIHNpemU7CisJCWludCB0cmFuc2Zlcl9yZXN1bHQ7CisKKwkJSVYgPSAoKHNlY3Rvcl90KWluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSkpKyhvZmZzZXQgPj4gOSk7CisJCXNpemUgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisJCWlmIChzaXplID4gbGVuKQorCQkJc2l6ZSA9IGxlbjsKKwkJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJCWlmICh1bmxpa2VseSghcGFnZSkpCisJCQlnb3RvIGZhaWw7CisJCWlmICh1bmxpa2VseShhb3BzLT5wcmVwYXJlX3dyaXRlKGZpbGUsIHBhZ2UsIG9mZnNldCwKKwkJCQlvZmZzZXQgKyBzaXplKSkpCisJCQlnb3RvIHVubG9jazsKKwkJdHJhbnNmZXJfcmVzdWx0ID0gbG9fZG9fdHJhbnNmZXIobG8sIFdSSVRFLCBwYWdlLCBvZmZzZXQsCisJCQkJYnZlYy0+YnZfcGFnZSwgYnZfb2Zmcywgc2l6ZSwgSVYpOworCQlpZiAodW5saWtlbHkodHJhbnNmZXJfcmVzdWx0KSkgeworCQkJY2hhciAqa2FkZHI7CisKKwkJCS8qCisJCQkgKiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBidXQgd2Ugc3RpbGwgd3JpdGUgdGhlIGRhdGEgdG8KKwkJCSAqIGtlZXAgcHJlcGFyZS9jb21taXQgY2FsbHMgYmFsYW5jZWQuCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAibG9vcDogdHJhbnNmZXIgZXJyb3IgYmxvY2sgJWxsdVxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluZGV4KTsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBzaXplKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJfQorCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJaWYgKHVubGlrZWx5KGFvcHMtPmNvbW1pdF93cml0ZShmaWxlLCBwYWdlLCBvZmZzZXQsCisJCQkJb2Zmc2V0ICsgc2l6ZSkpKQorCQkJZ290byB1bmxvY2s7CisJCWlmICh1bmxpa2VseSh0cmFuc2Zlcl9yZXN1bHQpKQorCQkJZ290byB1bmxvY2s7CisJCWJ2X29mZnMgKz0gc2l6ZTsKKwkJbGVuIC09IHNpemU7CisJCW9mZnNldCA9IDA7CisJCWluZGV4Kys7CisJCXBvcyArPSBzaXplOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KK291dDoKKwl1cCgmbWFwcGluZy0+aG9zdC0+aV9zZW0pOworCXJldHVybiByZXQ7Cit1bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworZmFpbDoKKwlyZXQgPSAtMTsKKwlnb3RvIG91dDsKK30KKworLyoqCisgKiBfX2RvX2xvX3NlbmRfd3JpdGUgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCisgKgorICogVGhpcyBoZWxwZXIganVzdCBmYWN0b3JzIG91dCBjb21tb24gY29kZSBiZXR3ZWVuIGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlKCkKKyAqIGFuZCBkb19sb19zZW5kX3dyaXRlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fZG9fbG9fc2VuZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdTggX191c2VyICpidWYsIGNvbnN0IGludCBsZW4sIGxvZmZfdCBwb3MpCit7CisJc3NpemVfdCBidzsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisKKwlzZXRfZnMoZ2V0X2RzKCkpOworCWJ3ID0gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSwgYnVmLCBsZW4sICZwb3MpOworCXNldF9mcyhvbGRfZnMpOworCWlmIChsaWtlbHkoYncgPT0gbGVuKSkKKwkJcmV0dXJuIDA7CisJcHJpbnRrKEtFUk5fRVJSICJsb29wOiBXcml0ZSBlcnJvciBhdCBieXRlIG9mZnNldCAlbGx1LCBsZW5ndGggJWkuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwb3MsIGxlbik7CisJaWYgKGJ3ID49IDApCisJCWJ3ID0gLUVJTzsKKwlyZXR1cm4gYnc7Cit9CisKKy8qKgorICogZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGUgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCisgKgorICogVGhpcyBpcyB0aGUgZmFzdCwgbm9uLXRyYW5zZm9ybWluZyB2ZXJzaW9uIGZvciBiYWNraW5nIGZpbGVzeXN0ZW1zIHdoaWNoIGRvCisgKiBub3QgaW1wbGVtZW50IHRoZSBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgcHJlcGFyZV93cml0ZSBhbmQgY29tbWl0X3dyaXRlLgorICogSXQgdXNlcyB0aGUgd3JpdGUgZmlsZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHByZXNlbnQgb24gYWxsIHdyaXRlYWJsZQorICogZmlsZXN5c3RlbXMuCisgKi8KK3N0YXRpYyBpbnQgZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywKKwkJc3RydWN0IGJpb192ZWMgKmJ2ZWMsIGludCBic2l6ZSwgbG9mZl90IHBvcywgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3NpemVfdCBidyA9IF9fZG9fbG9fc2VuZF93cml0ZShsby0+bG9fYmFja2luZ19maWxlLAorCQkJKHU4IF9fdXNlciAqKWttYXAoYnZlYy0+YnZfcGFnZSkgKyBidmVjLT5idl9vZmZzZXQsCisJCQlidmVjLT5idl9sZW4sIHBvcyk7CisJa3VubWFwKGJ2ZWMtPmJ2X3BhZ2UpOworCWNvbmRfcmVzY2hlZCgpOworCXJldHVybiBidzsKK30KKworLyoqCisgKiBkb19sb19zZW5kX3dyaXRlIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQorICoKKyAqIFRoaXMgaXMgdGhlIHNsb3csIHRyYW5zZm9ybWluZyB2ZXJzaW9uIGZvciBmaWxlc3lzdGVtcyB3aGljaCBkbyBub3QKKyAqIGltcGxlbWVudCB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIHByZXBhcmVfd3JpdGUgYW5kIGNvbW1pdF93cml0ZS4gIEl0CisgKiB1c2VzIHRoZSB3cml0ZSBmaWxlIG9wZXJhdGlvbiB3aGljaCBzaG91bGQgYmUgcHJlc2VudCBvbiBhbGwgd3JpdGVhYmxlCisgKiBmaWxlc3lzdGVtcy4KKyAqCisgKiBVc2luZyBmb3BzLT53cml0ZSBpcyBzbG93ZXIgdGhhbiB1c2luZyBhb3BzLT57cHJlcGFyZSxjb21taXR9X3dyaXRlIGluIHRoZQorICogdHJhbnNmb3JtaW5nIGNhc2UgYmVjYXVzZSB3ZSBuZWVkIHRvIGRvdWJsZSBidWZmZXIgdGhlIGRhdGEgYXMgd2UgY2Fubm90IGRvCisgKiB0aGUgdHJhbnNmb3JtYXRpb25zIGluIHBsYWNlIGFzIHdlIGRvIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlCisgKiBkZXN0aW5hdGlvbiBwYWdlcyBvZiB0aGUgYmFja2luZyBmaWxlLgorICovCitzdGF0aWMgaW50IGRvX2xvX3NlbmRfd3JpdGUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpb192ZWMgKmJ2ZWMsCisJCWludCBic2l6ZSwgbG9mZl90IHBvcywgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaW50IHJldCA9IGxvX2RvX3RyYW5zZmVyKGxvLCBXUklURSwgcGFnZSwgMCwgYnZlYy0+YnZfcGFnZSwKKwkJCWJ2ZWMtPmJ2X29mZnNldCwgYnZlYy0+YnZfbGVuLCBwb3MgPj4gOSk7CisJaWYgKGxpa2VseSghcmV0KSkKKwkJcmV0dXJuIF9fZG9fbG9fc2VuZF93cml0ZShsby0+bG9fYmFja2luZ19maWxlLAorCQkJCSh1OCBfX3VzZXIgKilwYWdlX2FkZHJlc3MocGFnZSksIGJ2ZWMtPmJ2X2xlbiwKKwkJCQlwb3MpOworCXByaW50ayhLRVJOX0VSUiAibG9vcDogVHJhbnNmZXIgZXJyb3IgYXQgYnl0ZSBvZmZzZXQgJWxsdSwgIgorCQkJImxlbmd0aCAlaS5cbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpcG9zLCBidmVjLT5idl9sZW4pOworCWlmIChyZXQgPiAwKQorCQlyZXQgPSAtRUlPOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbG9fc2VuZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8sIGludCBic2l6ZSwKKwkJbG9mZl90IHBvcykKK3sKKwlpbnQgKCpkb19sb19zZW5kKShzdHJ1Y3QgbG9vcF9kZXZpY2UgKiwgc3RydWN0IGJpb192ZWMgKiwgaW50LCBsb2ZmX3QsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCWludCBpLCByZXQgPSAwOworCisJZG9fbG9fc2VuZCA9IGRvX2xvX3NlbmRfYW9wczsKKwlpZiAoIShsby0+bG9fZmxhZ3MgJiBMT19GTEFHU19VU0VfQU9QUykpIHsKKwkJZG9fbG9fc2VuZCA9IGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlOworCQlpZiAobG8tPnRyYW5zZmVyICE9IHRyYW5zZmVyX25vbmUpIHsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9OT0lPIHwgX19HRlBfSElHSE1FTSk7CisJCQlpZiAodW5saWtlbHkoIXBhZ2UpKQorCQkJCWdvdG8gZmFpbDsKKwkJCWttYXAocGFnZSk7CisJCQlkb19sb19zZW5kID0gZG9fbG9fc2VuZF93cml0ZTsKKwkJfQorCX0KKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKKwkJcmV0ID0gZG9fbG9fc2VuZChsbywgYnZlYywgYnNpemUsIHBvcywgcGFnZSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXBvcyArPSBidmVjLT5idl9sZW47CisJfQorCWlmIChwYWdlKSB7CisJCWt1bm1hcChwYWdlKTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJfQorb3V0OgorCXJldHVybiByZXQ7CitmYWlsOgorCXByaW50ayhLRVJOX0VSUiAibG9vcDogRmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBwYWdlIGZvciB3cml0ZS5cbiIpOworCXJldCA9IC1FTk9NRU07CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBsb19yZWFkX2RhdGEgeworCXN0cnVjdCBsb29wX2RldmljZSAqbG87CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgb2Zmc2V0OworCWludCBic2l6ZTsKK307CisKK3N0YXRpYyBpbnQKK2xvX3JlYWRfYWN0b3IocmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBwYWdlICpwYWdlLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IGRlc2MtPmNvdW50OworCXN0cnVjdCBsb19yZWFkX2RhdGEgKnAgPSBkZXNjLT5hcmcuZGF0YTsKKwlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gcC0+bG87CisJc2VjdG9yX3QgSVY7CisKKwlJViA9ICgoc2VjdG9yX3QpIHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSkpKyhvZmZzZXQgPj4gOSk7CisKKwlpZiAoc2l6ZSA+IGNvdW50KQorCQlzaXplID0gY291bnQ7CisKKwlpZiAobG9fZG9fdHJhbnNmZXIobG8sIFJFQUQsIHBhZ2UsIG9mZnNldCwgcC0+cGFnZSwgcC0+b2Zmc2V0LCBzaXplLCBJVikpIHsKKwkJc2l6ZSA9IDA7CisJCXByaW50ayhLRVJOX0VSUiAibG9vcDogdHJhbnNmZXIgZXJyb3IgYmxvY2sgJWxkXG4iLAorCQkgICAgICAgcGFnZS0+aW5kZXgpOworCQlkZXNjLT5lcnJvciA9IC1FSU5WQUw7CisJfQorCisJZmx1c2hfZGNhY2hlX3BhZ2UocC0+cGFnZSk7CisKKwlkZXNjLT5jb3VudCA9IGNvdW50IC0gc2l6ZTsKKwlkZXNjLT53cml0dGVuICs9IHNpemU7CisJcC0+b2Zmc2V0ICs9IHNpemU7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2xvX3JlY2VpdmUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywKKwkgICAgICBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgaW50IGJzaXplLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBsb19yZWFkX2RhdGEgY29va2llOworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCByZXR2YWw7CisKKwljb29raWUubG8gPSBsbzsKKwljb29raWUucGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CisJY29va2llLm9mZnNldCA9IGJ2ZWMtPmJ2X29mZnNldDsKKwljb29raWUuYnNpemUgPSBic2l6ZTsKKwlmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKKwlyZXR2YWwgPSBmaWxlLT5mX29wLT5zZW5kZmlsZShmaWxlLCAmcG9zLCBidmVjLT5idl9sZW4sCisJCQlsb19yZWFkX2FjdG9yLCAmY29va2llKTsKKwlyZXR1cm4gKHJldHZhbCA8IDApPyByZXR2YWw6IDA7Cit9CisKK3N0YXRpYyBpbnQKK2xvX3JlY2VpdmUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpbyAqYmlvLCBpbnQgYnNpemUsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJaW50IGksIHJldCA9IDA7CisKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKKwkJcmV0ID0gZG9fbG9fcmVjZWl2ZShsbywgYnZlYywgYnNpemUsIHBvcyk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXBvcyArPSBidmVjLT5idl9sZW47CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fYmlvX2ZpbGViYWNrZWQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpbyAqYmlvKQoreworCWxvZmZfdCBwb3M7CisJaW50IHJldDsKKworCXBvcyA9ICgobG9mZl90KSBiaW8tPmJpX3NlY3RvciA8PCA5KSArIGxvLT5sb19vZmZzZXQ7CisJaWYgKGJpb19ydyhiaW8pID09IFdSSVRFKQorCQlyZXQgPSBsb19zZW5kKGxvLCBiaW8sIGxvLT5sb19ibG9ja3NpemUsIHBvcyk7CisJZWxzZQorCQlyZXQgPSBsb19yZWNlaXZlKGxvLCBiaW8sIGxvLT5sb19ibG9ja3NpemUsIHBvcyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFkZCBiaW8gdG8gYmFjayBvZiBwZW5kaW5nIGxpc3QKKyAqLworc3RhdGljIHZvaWQgbG9vcF9hZGRfYmlvKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBiaW8gKmJpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvLT5sb19sb2NrLCBmbGFncyk7CisJaWYgKGxvLT5sb19iaW90YWlsKSB7CisJCWxvLT5sb19iaW90YWlsLT5iaV9uZXh0ID0gYmlvOworCQlsby0+bG9fYmlvdGFpbCA9IGJpbzsKKwl9IGVsc2UKKwkJbG8tPmxvX2JpbyA9IGxvLT5sb19iaW90YWlsID0gYmlvOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvLT5sb19sb2NrLCBmbGFncyk7CisKKwl1cCgmbG8tPmxvX2JoX211dGV4KTsKK30KKworLyoKKyAqIEdyYWIgZmlyc3QgcGVuZGluZyBidWZmZXIKKyAqLworc3RhdGljIHN0cnVjdCBiaW8gKmxvb3BfZ2V0X2JpbyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQoreworCXN0cnVjdCBiaW8gKmJpbzsKKworCXNwaW5fbG9ja19pcnEoJmxvLT5sb19sb2NrKTsKKwlpZiAoKGJpbyA9IGxvLT5sb19iaW8pKSB7CisJCWlmIChiaW8gPT0gbG8tPmxvX2Jpb3RhaWwpCisJCQlsby0+bG9fYmlvdGFpbCA9IE5VTEw7CisJCWxvLT5sb19iaW8gPSBiaW8tPmJpX25leHQ7CisJCWJpby0+YmlfbmV4dCA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOworCisJcmV0dXJuIGJpbzsKK30KKworc3RhdGljIGludCBsb29wX21ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKm9sZF9iaW8pCit7CisJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IHEtPnF1ZXVlZGF0YTsKKwlpbnQgcncgPSBiaW9fcncob2xkX2Jpbyk7CisKKwlpZiAoIWxvKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9ja19pcnEoJmxvLT5sb19sb2NrKTsKKwlpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQorCQlnb3RvIGluYWN0aXZlOworCWF0b21pY19pbmMoJmxvLT5sb19wZW5kaW5nKTsKKwlzcGluX3VubG9ja19pcnEoJmxvLT5sb19sb2NrKTsKKworCWlmIChydyA9PSBXUklURSkgeworCQlpZiAobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUkVBRF9PTkxZKQorCQkJZ290byBlcnI7CisJfSBlbHNlIGlmIChydyA9PSBSRUFEQSkgeworCQlydyA9IFJFQUQ7CisJfSBlbHNlIGlmIChydyAhPSBSRUFEKSB7CisJCXByaW50ayhLRVJOX0VSUiAibG9vcDogdW5rbm93biBjb21tYW5kICgleClcbiIsIHJ3KTsKKwkJZ290byBlcnI7CisJfQorCWxvb3BfYWRkX2Jpbyhsbywgb2xkX2Jpbyk7CisJcmV0dXJuIDA7CitlcnI6CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmxvLT5sb19wZW5kaW5nKSkKKwkJdXAoJmxvLT5sb19iaF9tdXRleCk7CitvdXQ6CisJYmlvX2lvX2Vycm9yKG9sZF9iaW8sIG9sZF9iaW8tPmJpX3NpemUpOworCXJldHVybiAwOworaW5hY3RpdmU6CisJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBraWNrIG9mZiBpbyBvbiB0aGUgdW5kZXJseWluZyBhZGRyZXNzIHNwYWNlCisgKi8KK3N0YXRpYyB2b2lkIGxvb3BfdW5wbHVnKHJlcXVlc3RfcXVldWVfdCAqcSkKK3sKKwlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gcS0+cXVldWVkYXRhOworCisJY2xlYXJfYml0KFFVRVVFX0ZMQUdfUExVR0dFRCwgJnEtPnF1ZXVlX2ZsYWdzKTsKKwlibGtfcnVuX2FkZHJlc3Nfc3BhY2UobG8tPmxvX2JhY2tpbmdfZmlsZS0+Zl9tYXBwaW5nKTsKK30KKworc3RydWN0IHN3aXRjaF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiB3YWl0OworfTsKKworc3RhdGljIHZvaWQgZG9fbG9vcF9zd2l0Y2goc3RydWN0IGxvb3BfZGV2aWNlICosIHN0cnVjdCBzd2l0Y2hfcmVxdWVzdCAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIGxvb3BfaGFuZGxlX2JpbyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW50IHJldDsKKworCWlmICh1bmxpa2VseSghYmlvLT5iaV9iZGV2KSkgeworCQlkb19sb29wX3N3aXRjaChsbywgYmlvLT5iaV9wcml2YXRlKTsKKwkJYmlvX3B1dChiaW8pOworCX0gZWxzZSB7CisJCXJldCA9IGRvX2Jpb19maWxlYmFja2VkKGxvLCBiaW8pOworCQliaW9fZW5kaW8oYmlvLCBiaW8tPmJpX3NpemUsIHJldCk7CisJfQorfQorCisvKgorICogd29ya2VyIHRocmVhZCB0aGF0IGhhbmRsZXMgcmVhZHMvd3JpdGVzIHRvIGZpbGUgYmFja2VkIGxvb3AgZGV2aWNlcywKKyAqIHRvIGF2b2lkIGJsb2NraW5nIGluIG91ciBtYWtlX3JlcXVlc3RfZm4uIGl0IGFsc28gZG9lcyBsb29wIGRlY3J5cHRpbmcKKyAqIG9uIHJlYWRzIGZvciBibG9jayBiYWNrZWQgbG9vcCwgYXMgdGhhdCBpcyB0b28gaGVhdnkgdG8gZG8gZnJvbQorICogYl9lbmRfaW8gY29udGV4dCB3aGVyZSBpcnFzIG1heSBiZSBkaXNhYmxlZC4KKyAqLworc3RhdGljIGludCBsb29wX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBkYXRhOworCXN0cnVjdCBiaW8gKmJpbzsKKworCWRhZW1vbml6ZSgibG9vcCVkIiwgbG8tPmxvX251bWJlcik7CisKKwkvKgorCSAqIGxvb3AgY2FuIGJlIHVzZWQgaW4gYW4gZW5jcnlwdGVkIGRldmljZSwKKwkgKiBoZW5jZSwgaXQgbXVzdG4ndCBiZSBzdG9wcGVkIGF0IGFsbAorCSAqIGJlY2F1c2UgaXQgY291bGQgYmUgaW5kaXJlY3RseSB1c2VkIGR1cmluZyBzdXNwZW5zaW9uCisJICovCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CisKKwlsby0+bG9fc3RhdGUgPSBMb19ib3VuZDsKKwlhdG9taWNfaW5jKCZsby0+bG9fcGVuZGluZyk7CisKKwkvKgorCSAqIHVwIHNlbSwgd2UgYXJlIHJ1bm5pbmcKKwkgKi8KKwl1cCgmbG8tPmxvX3NlbSk7CisKKwlmb3IgKDs7KSB7CisJCWRvd25faW50ZXJydXB0aWJsZSgmbG8tPmxvX2JoX211dGV4KTsKKwkJLyoKKwkJICogY291bGQgYmUgdXBwZWQgYmVjYXVzZSBvZiB0ZWFyLWRvd24sIG5vdCBiZWNhdXNlIG9mCisJCSAqIHBlbmRpbmcgd29yaworCQkgKi8KKwkJaWYgKCFhdG9taWNfcmVhZCgmbG8tPmxvX3BlbmRpbmcpKQorCQkJYnJlYWs7CisKKwkJYmlvID0gbG9vcF9nZXRfYmlvKGxvKTsKKwkJaWYgKCFiaW8pIHsKKwkJCXByaW50aygibG9vcDogbWlzc2luZyBiaW9cbiIpOworCQkJY29udGludWU7CisJCX0KKwkJbG9vcF9oYW5kbGVfYmlvKGxvLCBiaW8pOworCisJCS8qCisJCSAqIHVwcGVkIGJvdGggZm9yIHBlbmRpbmcgd29yayBhbmQgdGVhci1kb3duLCBsb19wZW5kaW5nCisJCSAqIHdpbGwgaGl0IHplcm8gdGhlbgorCQkgKi8KKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmxvLT5sb19wZW5kaW5nKSkKKwkJCWJyZWFrOworCX0KKworCXVwKCZsby0+bG9fc2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxvb3Bfc3dpdGNoIHBlcmZvcm1zIHRoZSBoYXJkIHdvcmsgb2Ygc3dpdGNoaW5nIGEgYmFja2luZyBzdG9yZS4KKyAqIEZpcnN0IGl0IG5lZWRzIHRvIGZsdXNoIGV4aXN0aW5nIElPLCBpdCBkb2VzIHRoaXMgYnkgc2VuZGluZyBhIG1hZ2ljCisgKiBCSU8gZG93biB0aGUgcGlwZS4gVGhlIGNvbXBsZXRpb24gb2YgdGhpcyBCSU8gZG9lcyB0aGUgYWN0dWFsIHN3aXRjaC4KKyAqLworc3RhdGljIGludCBsb29wX3N3aXRjaChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3dpdGNoX3JlcXVlc3QgdzsKKwlzdHJ1Y3QgYmlvICpiaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgMSk7CisJaWYgKCFiaW8pCisJCXJldHVybiAtRU5PTUVNOworCWluaXRfY29tcGxldGlvbigmdy53YWl0KTsKKwl3LmZpbGUgPSBmaWxlOworCWJpby0+YmlfcHJpdmF0ZSA9ICZ3OworCWJpby0+YmlfYmRldiA9IE5VTEw7CisJbG9vcF9tYWtlX3JlcXVlc3QobG8tPmxvX3F1ZXVlLCBiaW8pOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJncud2FpdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEbyB0aGUgYWN0dWFsIHN3aXRjaDsgY2FsbGVkIGZyb20gdGhlIEJJTyBjb21wbGV0aW9uIHJvdXRpbmUKKyAqLworc3RhdGljIHZvaWQgZG9fbG9vcF9zd2l0Y2goc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IHN3aXRjaF9yZXF1ZXN0ICpwKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gcC0+ZmlsZTsKKwlzdHJ1Y3QgZmlsZSAqb2xkX2ZpbGUgPSBsby0+bG9fYmFja2luZ19maWxlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCisJbWFwcGluZ19zZXRfZ2ZwX21hc2sob2xkX2ZpbGUtPmZfbWFwcGluZywgbG8tPm9sZF9nZnBfbWFzayk7CisJbG8tPmxvX2JhY2tpbmdfZmlsZSA9IGZpbGU7CisJbG8tPmxvX2Jsb2Nrc2l6ZSA9IG1hcHBpbmctPmhvc3QtPmlfYmxrc2l6ZTsKKwlsby0+b2xkX2dmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKKwltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBsby0+b2xkX2dmcF9tYXNrICYgfihfX0dGUF9JT3xfX0dGUF9GUykpOworCWNvbXBsZXRlKCZwLT53YWl0KTsKK30KKworCisvKgorICogbG9vcF9jaGFuZ2VfZmQgc3dpdGNoZWQgdGhlIGJhY2tpbmcgc3RvcmUgb2YgYSBsb29wYmFjayBkZXZpY2UgdG8KKyAqIGEgbmV3IGZpbGUuIFRoaXMgaXMgdXNlZnVsIGZvciBvcGVyYXRpbmcgc3lzdGVtIGluc3RhbGxlcnMgdG8gZnJlZSB1cAorICogdGhlIG9yaWdpbmFsIGZpbGUgYW5kIGluIEhpZ2ggQXZhaWxhYmlsaXR5IGVudmlyb25tZW50cyB0byBzd2l0Y2ggdG8KKyAqIGFuIGFsdGVybmF0aXZlIGxvY2F0aW9uIGZvciB0aGUgY29udGVudCBpbiBjYXNlIG9mIHNlcnZlciBtZWx0ZG93bi4KKyAqIFRoaXMgY2FuIG9ubHkgd29yayBpZiB0aGUgbG9vcCBkZXZpY2UgaXMgdXNlZCByZWFkLW9ubHksIGFuZCBpZiB0aGUKKyAqIG5ldyBiYWNraW5nIHN0b3JlIGlzIHRoZSBzYW1lIHNpemUgYW5kIHR5cGUgYXMgdGhlIG9sZCBiYWNraW5nIHN0b3JlLgorICovCitzdGF0aWMgaW50IGxvb3BfY2hhbmdlX2ZkKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBmaWxlICpsb19maWxlLAorCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgaW50IGFyZykKK3sKKwlzdHJ1Y3QgZmlsZQkqZmlsZSwgKm9sZF9maWxlOworCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJaW50CQllcnJvcjsKKworCWVycm9yID0gLUVOWElPOworCWlmIChsby0+bG9fc3RhdGUgIT0gTG9fYm91bmQpCisJCWdvdG8gb3V0OworCisJLyogdGhlIGxvb3AgZGV2aWNlIGhhcyB0byBiZSByZWFkLW9ubHkgKi8KKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCEobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUkVBRF9PTkxZKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FQkFERjsKKwlmaWxlID0gZmdldChhcmcpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlvbGRfZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CisKKwllcnJvciA9IC1FSU5WQUw7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0X3B1dGY7CisKKwkvKiBuZXcgYmFja2luZyBzdG9yZSBuZWVkcyB0byBzdXBwb3J0IGxvb3AgKGVnIHNlbmRmaWxlKSAqLworCWlmICghaW5vZGUtPmlfZm9wLT5zZW5kZmlsZSkKKwkJZ290byBvdXRfcHV0ZjsKKworCS8qIHNpemUgb2YgdGhlIG5ldyBiYWNraW5nIHN0b3JlIG5lZWRzIHRvIGJlIHRoZSBzYW1lICovCisJaWYgKGdldF9sb29wX3NpemUobG8sIGZpbGUpICE9IGdldF9sb29wX3NpemUobG8sIG9sZF9maWxlKSkKKwkJZ290byBvdXRfcHV0ZjsKKworCS8qIGFuZCAuLi4gc3dpdGNoICovCisJZXJyb3IgPSBsb29wX3N3aXRjaChsbywgZmlsZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9wdXRmOworCisJZnB1dChvbGRfZmlsZSk7CisJcmV0dXJuIDA7CisKKyBvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2xvb3BfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpbm9kZSAqaSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKworCXJldHVybiBpICYmIFNfSVNCTEsoaS0+aV9tb2RlKSAmJiBNQUpPUihpLT5pX3JkZXYpID09IExPT1BfTUFKT1I7Cit9CisKK3N0YXRpYyBpbnQgbG9vcF9zZXRfZmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGZpbGUgKmxvX2ZpbGUsCisJCSAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBpbnQgYXJnKQoreworCXN0cnVjdCBmaWxlCSpmaWxlLCAqZjsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXVuc2lnbmVkIGxvX2Jsb2Nrc2l6ZTsKKwlpbnQJCWxvX2ZsYWdzID0gMDsKKwlpbnQJCWVycm9yOworCWxvZmZfdAkJc2l6ZTsKKworCS8qIFRoaXMgaXMgc2FmZSwgc2luY2Ugd2UgaGF2ZSBhIHJlZmVyZW5jZSBmcm9tIG9wZW4oKS4gKi8KKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoYXJnKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUJVU1k7CisJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb191bmJvdW5kKQorCQlnb3RvIG91dF9wdXRmOworCisJLyogQXZvaWQgcmVjdXJzaW9uICovCisJZiA9IGZpbGU7CisJd2hpbGUgKGlzX2xvb3BfZGV2aWNlKGYpKSB7CisJCXN0cnVjdCBsb29wX2RldmljZSAqbDsKKworCQlpZiAoZi0+Zl9tYXBwaW5nLT5ob3N0LT5pX3JkZXYgPT0gbG9fZmlsZS0+Zl9tYXBwaW5nLT5ob3N0LT5pX3JkZXYpCisJCQlnb3RvIG91dF9wdXRmOworCisJCWwgPSBmLT5mX21hcHBpbmctPmhvc3QtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlpZiAobC0+bG9fc3RhdGUgPT0gTG9fdW5ib3VuZCkgeworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBvdXRfcHV0ZjsKKwkJfQorCQlmID0gbC0+bG9fYmFja2luZ19maWxlOworCX0KKworCW1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisJaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zICphb3BzID0gbWFwcGluZy0+YV9vcHM7CisJCS8qCisJCSAqIElmIHdlIGNhbid0IHJlYWQgLSBzb3JyeS4gSWYgd2Ugb25seSBjYW4ndCB3cml0ZSAtIHdlbGwsCisJCSAqIGl0J3MgZ29pbmcgdG8gYmUgcmVhZC1vbmx5LgorCQkgKi8KKwkJaWYgKCFmaWxlLT5mX29wLT5zZW5kZmlsZSkKKwkJCWdvdG8gb3V0X3B1dGY7CisJCWlmIChhb3BzLT5wcmVwYXJlX3dyaXRlICYmIGFvcHMtPmNvbW1pdF93cml0ZSkKKwkJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1VTRV9BT1BTOworCQlpZiAoIShsb19mbGFncyAmIExPX0ZMQUdTX1VTRV9BT1BTKSAmJiAhZmlsZS0+Zl9vcC0+d3JpdGUpCisJCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CisKKwkJbG9fYmxvY2tzaXplID0gaW5vZGUtPmlfYmxrc2l6ZTsKKwkJZXJyb3IgPSAwOworCX0gZWxzZSB7CisJCWdvdG8gb3V0X3B1dGY7CisJfQorCisJc2l6ZSA9IGdldF9sb29wX3NpemUobG8sIGZpbGUpOworCisJaWYgKChsb2ZmX3QpKHNlY3Rvcl90KXNpemUgIT0gc2l6ZSkgeworCQllcnJvciA9IC1FRkJJRzsKKwkJZ290byBvdXRfcHV0ZjsKKwl9CisKKwlpZiAoIShsb19maWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1JFQURfT05MWTsKKworCXNldF9kZXZpY2Vfcm8oYmRldiwgKGxvX2ZsYWdzICYgTE9fRkxBR1NfUkVBRF9PTkxZKSAhPSAwKTsKKworCWxvLT5sb19ibG9ja3NpemUgPSBsb19ibG9ja3NpemU7CisJbG8tPmxvX2RldmljZSA9IGJkZXY7CisJbG8tPmxvX2ZsYWdzID0gbG9fZmxhZ3M7CisJbG8tPmxvX2JhY2tpbmdfZmlsZSA9IGZpbGU7CisJbG8tPnRyYW5zZmVyID0gTlVMTDsKKwlsby0+aW9jdGwgPSBOVUxMOworCWxvLT5sb19zaXplbGltaXQgPSAwOworCWxvLT5vbGRfZ2ZwX21hc2sgPSBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpOworCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2sgJiB+KF9fR0ZQX0lPfF9fR0ZQX0ZTKSk7CisKKwlsby0+bG9fYmlvID0gbG8tPmxvX2Jpb3RhaWwgPSBOVUxMOworCisJLyoKKwkgKiBzZXQgcXVldWUgbWFrZV9yZXF1ZXN0X2ZuLCBhbmQgYWRkIGxpbWl0cyBiYXNlZCBvbiBsb3dlciBsZXZlbAorCSAqIGRldmljZQorCSAqLworCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QobG8tPmxvX3F1ZXVlLCBsb29wX21ha2VfcmVxdWVzdCk7CisJbG8tPmxvX3F1ZXVlLT5xdWV1ZWRhdGEgPSBsbzsKKwlsby0+bG9fcXVldWUtPnVucGx1Z19mbiA9IGxvb3BfdW5wbHVnOworCisJc2V0X2NhcGFjaXR5KGRpc2tzW2xvLT5sb19udW1iZXJdLCBzaXplKTsKKwliZF9zZXRfc2l6ZShiZGV2LCBzaXplIDw8IDkpOworCisJc2V0X2Jsb2Nrc2l6ZShiZGV2LCBsb19ibG9ja3NpemUpOworCisJa2VybmVsX3RocmVhZChsb29wX3RocmVhZCwgbG8sIENMT05FX0tFUk5FTCk7CisJZG93bigmbG8tPmxvX3NlbSk7CisJcmV0dXJuIDA7CisKKyBvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworIG91dDoKKwkvKiBUaGlzIGlzIHNhZmU6IG9wZW4oKSBpcyBzdGlsbCBob2xkaW5nIGEgcmVmZXJlbmNlLiAqLworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorbG9vcF9yZWxlYXNlX3hmZXIoc3RydWN0IGxvb3BfZGV2aWNlICpsbykKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICp4ZmVyID0gbG8tPmxvX2VuY3J5cHRpb247CisKKwlpZiAoeGZlcikgeworCQlpZiAoeGZlci0+cmVsZWFzZSkKKwkJCWVyciA9IHhmZXItPnJlbGVhc2UobG8pOworCQlsby0+dHJhbnNmZXIgPSBOVUxMOworCQlsby0+bG9fZW5jcnlwdGlvbiA9IE5VTEw7CisJCW1vZHVsZV9wdXQoeGZlci0+b3duZXIpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Citsb29wX2luaXRfeGZlcihzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICp4ZmVyLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgbG9vcF9pbmZvNjQgKmkpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoeGZlcikgeworCQlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IHhmZXItPm93bmVyOworCisJCWlmICghdHJ5X21vZHVsZV9nZXQob3duZXIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh4ZmVyLT5pbml0KQorCQkJZXJyID0geGZlci0+aW5pdChsbywgaSk7CisJCWlmIChlcnIpCisJCQltb2R1bGVfcHV0KG93bmVyKTsKKwkJZWxzZQorCQkJbG8tPmxvX2VuY3J5cHRpb24gPSB4ZmVyOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxvb3BfY2xyX2ZkKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IGZpbGUgKmZpbHAgPSBsby0+bG9fYmFja2luZ19maWxlOworCWludCBnZnAgPSBsby0+b2xkX2dmcF9tYXNrOworCisJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmIChsby0+bG9fcmVmY250ID4gMSkJLyogd2UgbmVlZGVkIG9uZSBmZCBmb3IgdGhlIGlvY3RsICovCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoZmlscCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJmxvLT5sb19sb2NrKTsKKwlsby0+bG9fc3RhdGUgPSBMb19ydW5kb3duOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZsby0+bG9fcGVuZGluZykpCisJCXVwKCZsby0+bG9fYmhfbXV0ZXgpOworCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOworCisJZG93bigmbG8tPmxvX3NlbSk7CisKKwlsby0+bG9fYmFja2luZ19maWxlID0gTlVMTDsKKworCWxvb3BfcmVsZWFzZV94ZmVyKGxvKTsKKwlsby0+dHJhbnNmZXIgPSBOVUxMOworCWxvLT5pb2N0bCA9IE5VTEw7CisJbG8tPmxvX2RldmljZSA9IE5VTEw7CisJbG8tPmxvX2VuY3J5cHRpb24gPSBOVUxMOworCWxvLT5sb19vZmZzZXQgPSAwOworCWxvLT5sb19zaXplbGltaXQgPSAwOworCWxvLT5sb19lbmNyeXB0X2tleV9zaXplID0gMDsKKwlsby0+bG9fZmxhZ3MgPSAwOworCW1lbXNldChsby0+bG9fZW5jcnlwdF9rZXksIDAsIExPX0tFWV9TSVpFKTsKKwltZW1zZXQobG8tPmxvX2NyeXB0X25hbWUsIDAsIExPX05BTUVfU0laRSk7CisJbWVtc2V0KGxvLT5sb19maWxlX25hbWUsIDAsIExPX05BTUVfU0laRSk7CisJaW52YWxpZGF0ZV9iZGV2KGJkZXYsIDApOworCXNldF9jYXBhY2l0eShkaXNrc1tsby0+bG9fbnVtYmVyXSwgMCk7CisJYmRfc2V0X3NpemUoYmRldiwgMCk7CisJbWFwcGluZ19zZXRfZ2ZwX21hc2soZmlscC0+Zl9tYXBwaW5nLCBnZnApOworCWxvLT5sb19zdGF0ZSA9IExvX3VuYm91bmQ7CisJZnB1dChmaWxwKTsKKwkvKiBUaGlzIGlzIHNhZmU6IG9wZW4oKSBpcyBzdGlsbCBob2xkaW5nIGEgcmVmZXJlbmNlLiAqLworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citsb29wX3NldF9zdGF0dXMoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvKQoreworCWludCBlcnI7CisJc3RydWN0IGxvb3BfZnVuY190YWJsZSAqeGZlcjsKKworCWlmIChsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSAmJiBsby0+bG9fa2V5X293bmVyICE9IGN1cnJlbnQtPnVpZCAmJgorCSAgICAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQorCQlyZXR1cm4gLUVOWElPOworCWlmICgodW5zaWduZWQgaW50KSBpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplID4gTE9fS0VZX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbG9vcF9yZWxlYXNlX3hmZXIobG8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoaW5mby0+bG9fZW5jcnlwdF90eXBlKSB7CisJCXVuc2lnbmVkIGludCB0eXBlID0gaW5mby0+bG9fZW5jcnlwdF90eXBlOworCisJCWlmICh0eXBlID49IE1BWF9MT19DUllQVCkKKwkJCXJldHVybiAtRUlOVkFMOworCQl4ZmVyID0geGZlcl9mdW5jc1t0eXBlXTsKKwkJaWYgKHhmZXIgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZQorCQl4ZmVyID0gTlVMTDsKKworCWVyciA9IGxvb3BfaW5pdF94ZmVyKGxvLCB4ZmVyLCBpbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGxvLT5sb19vZmZzZXQgIT0gaW5mby0+bG9fb2Zmc2V0IHx8CisJICAgIGxvLT5sb19zaXplbGltaXQgIT0gaW5mby0+bG9fc2l6ZWxpbWl0KSB7CisJCWxvLT5sb19vZmZzZXQgPSBpbmZvLT5sb19vZmZzZXQ7CisJCWxvLT5sb19zaXplbGltaXQgPSBpbmZvLT5sb19zaXplbGltaXQ7CisJCWlmIChmaWd1cmVfbG9vcF9zaXplKGxvKSkKKwkJCXJldHVybiAtRUZCSUc7CisJfQorCisJbWVtY3B5KGxvLT5sb19maWxlX25hbWUsIGluZm8tPmxvX2ZpbGVfbmFtZSwgTE9fTkFNRV9TSVpFKTsKKwltZW1jcHkobG8tPmxvX2NyeXB0X25hbWUsIGluZm8tPmxvX2NyeXB0X25hbWUsIExPX05BTUVfU0laRSk7CisJbG8tPmxvX2ZpbGVfbmFtZVtMT19OQU1FX1NJWkUtMV0gPSAwOworCWxvLT5sb19jcnlwdF9uYW1lW0xPX05BTUVfU0laRS0xXSA9IDA7CisKKwlpZiAoIXhmZXIpCisJCXhmZXIgPSAmbm9uZV9mdW5jczsKKwlsby0+dHJhbnNmZXIgPSB4ZmVyLT50cmFuc2ZlcjsKKwlsby0+aW9jdGwgPSB4ZmVyLT5pb2N0bDsKKworCWxvLT5sb19lbmNyeXB0X2tleV9zaXplID0gaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZTsKKwlsby0+bG9faW5pdFswXSA9IGluZm8tPmxvX2luaXRbMF07CisJbG8tPmxvX2luaXRbMV0gPSBpbmZvLT5sb19pbml0WzFdOworCWlmIChpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplKSB7CisJCW1lbWNweShsby0+bG9fZW5jcnlwdF9rZXksIGluZm8tPmxvX2VuY3J5cHRfa2V5LAorCQkgICAgICAgaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSk7CisJCWxvLT5sb19rZXlfb3duZXIgPSBjdXJyZW50LT51aWQ7CisJfQkKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citsb29wX2dldF9zdGF0dXMoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgZXJyb3I7CisKKwlpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQorCQlyZXR1cm4gLUVOWElPOworCWVycm9yID0gdmZzX2dldGF0dHIoZmlsZS0+Zl92ZnNtbnQsIGZpbGUtPmZfZGVudHJ5LCAmc3RhdCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCWluZm8tPmxvX251bWJlciA9IGxvLT5sb19udW1iZXI7CisJaW5mby0+bG9fZGV2aWNlID0gaHVnZV9lbmNvZGVfZGV2KHN0YXQuZGV2KTsKKwlpbmZvLT5sb19pbm9kZSA9IHN0YXQuaW5vOworCWluZm8tPmxvX3JkZXZpY2UgPSBodWdlX2VuY29kZV9kZXYobG8tPmxvX2RldmljZSA/IHN0YXQucmRldiA6IHN0YXQuZGV2KTsKKwlpbmZvLT5sb19vZmZzZXQgPSBsby0+bG9fb2Zmc2V0OworCWluZm8tPmxvX3NpemVsaW1pdCA9IGxvLT5sb19zaXplbGltaXQ7CisJaW5mby0+bG9fZmxhZ3MgPSBsby0+bG9fZmxhZ3M7CisJbWVtY3B5KGluZm8tPmxvX2ZpbGVfbmFtZSwgbG8tPmxvX2ZpbGVfbmFtZSwgTE9fTkFNRV9TSVpFKTsKKwltZW1jcHkoaW5mby0+bG9fY3J5cHRfbmFtZSwgbG8tPmxvX2NyeXB0X25hbWUsIExPX05BTUVfU0laRSk7CisJaW5mby0+bG9fZW5jcnlwdF90eXBlID0KKwkJbG8tPmxvX2VuY3J5cHRpb24gPyBsby0+bG9fZW5jcnlwdGlvbi0+bnVtYmVyIDogMDsKKwlpZiAobG8tPmxvX2VuY3J5cHRfa2V5X3NpemUgJiYgY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplID0gbG8tPmxvX2VuY3J5cHRfa2V5X3NpemU7CisJCW1lbWNweShpbmZvLT5sb19lbmNyeXB0X2tleSwgbG8tPmxvX2VuY3J5cHRfa2V5LAorCQkgICAgICAgbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2xvb3BfaW5mbzY0X2Zyb21fb2xkKGNvbnN0IHN0cnVjdCBsb29wX2luZm8gKmluZm8sIHN0cnVjdCBsb29wX2luZm82NCAqaW5mbzY0KQoreworCW1lbXNldChpbmZvNjQsIDAsIHNpemVvZigqaW5mbzY0KSk7CisJaW5mbzY0LT5sb19udW1iZXIgPSBpbmZvLT5sb19udW1iZXI7CisJaW5mbzY0LT5sb19kZXZpY2UgPSBpbmZvLT5sb19kZXZpY2U7CisJaW5mbzY0LT5sb19pbm9kZSA9IGluZm8tPmxvX2lub2RlOworCWluZm82NC0+bG9fcmRldmljZSA9IGluZm8tPmxvX3JkZXZpY2U7CisJaW5mbzY0LT5sb19vZmZzZXQgPSBpbmZvLT5sb19vZmZzZXQ7CisJaW5mbzY0LT5sb19zaXplbGltaXQgPSAwOworCWluZm82NC0+bG9fZW5jcnlwdF90eXBlID0gaW5mby0+bG9fZW5jcnlwdF90eXBlOworCWluZm82NC0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IGluZm8tPmxvX2VuY3J5cHRfa2V5X3NpemU7CisJaW5mbzY0LT5sb19mbGFncyA9IGluZm8tPmxvX2ZsYWdzOworCWluZm82NC0+bG9faW5pdFswXSA9IGluZm8tPmxvX2luaXRbMF07CisJaW5mbzY0LT5sb19pbml0WzFdID0gaW5mby0+bG9faW5pdFsxXTsKKwlpZiAoaW5mby0+bG9fZW5jcnlwdF90eXBlID09IExPX0NSWVBUX0NSWVBUT0FQSSkKKwkJbWVtY3B5KGluZm82NC0+bG9fY3J5cHRfbmFtZSwgaW5mby0+bG9fbmFtZSwgTE9fTkFNRV9TSVpFKTsKKwllbHNlCisJCW1lbWNweShpbmZvNjQtPmxvX2ZpbGVfbmFtZSwgaW5mby0+bG9fbmFtZSwgTE9fTkFNRV9TSVpFKTsKKwltZW1jcHkoaW5mbzY0LT5sb19lbmNyeXB0X2tleSwgaW5mby0+bG9fZW5jcnlwdF9rZXksIExPX0tFWV9TSVpFKTsKK30KKworc3RhdGljIGludAorbG9vcF9pbmZvNjRfdG9fb2xkKGNvbnN0IHN0cnVjdCBsb29wX2luZm82NCAqaW5mbzY0LCBzdHJ1Y3QgbG9vcF9pbmZvICppbmZvKQoreworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwlpbmZvLT5sb19udW1iZXIgPSBpbmZvNjQtPmxvX251bWJlcjsKKwlpbmZvLT5sb19kZXZpY2UgPSBpbmZvNjQtPmxvX2RldmljZTsKKwlpbmZvLT5sb19pbm9kZSA9IGluZm82NC0+bG9faW5vZGU7CisJaW5mby0+bG9fcmRldmljZSA9IGluZm82NC0+bG9fcmRldmljZTsKKwlpbmZvLT5sb19vZmZzZXQgPSBpbmZvNjQtPmxvX29mZnNldDsKKwlpbmZvLT5sb19lbmNyeXB0X3R5cGUgPSBpbmZvNjQtPmxvX2VuY3J5cHRfdHlwZTsKKwlpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplID0gaW5mbzY0LT5sb19lbmNyeXB0X2tleV9zaXplOworCWluZm8tPmxvX2ZsYWdzID0gaW5mbzY0LT5sb19mbGFnczsKKwlpbmZvLT5sb19pbml0WzBdID0gaW5mbzY0LT5sb19pbml0WzBdOworCWluZm8tPmxvX2luaXRbMV0gPSBpbmZvNjQtPmxvX2luaXRbMV07CisJaWYgKGluZm8tPmxvX2VuY3J5cHRfdHlwZSA9PSBMT19DUllQVF9DUllQVE9BUEkpCisJCW1lbWNweShpbmZvLT5sb19uYW1lLCBpbmZvNjQtPmxvX2NyeXB0X25hbWUsIExPX05BTUVfU0laRSk7CisJZWxzZQorCQltZW1jcHkoaW5mby0+bG9fbmFtZSwgaW5mbzY0LT5sb19maWxlX25hbWUsIExPX05BTUVfU0laRSk7CisJbWVtY3B5KGluZm8tPmxvX2VuY3J5cHRfa2V5LCBpbmZvNjQtPmxvX2VuY3J5cHRfa2V5LCBMT19LRVlfU0laRSk7CisKKwkvKiBlcnJvciBpbiBjYXNlIHZhbHVlcyB3ZXJlIHRydW5jYXRlZCAqLworCWlmIChpbmZvLT5sb19kZXZpY2UgIT0gaW5mbzY0LT5sb19kZXZpY2UgfHwKKwkgICAgaW5mby0+bG9fcmRldmljZSAhPSBpbmZvNjQtPmxvX3JkZXZpY2UgfHwKKwkgICAgaW5mby0+bG9faW5vZGUgIT0gaW5mbzY0LT5sb19pbm9kZSB8fAorCSAgICBpbmZvLT5sb19vZmZzZXQgIT0gaW5mbzY0LT5sb19vZmZzZXQpCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2xvb3Bfc2V0X3N0YXR1c19vbGQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgY29uc3Qgc3RydWN0IGxvb3BfaW5mbyBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgbG9vcF9pbmZvIGluZm87CisJc3RydWN0IGxvb3BfaW5mbzY0IGluZm82NDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YgKHN0cnVjdCBsb29wX2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbG9vcF9pbmZvNjRfZnJvbV9vbGQoJmluZm8sICZpbmZvNjQpOworCXJldHVybiBsb29wX3NldF9zdGF0dXMobG8sICZpbmZvNjQpOworfQorCitzdGF0aWMgaW50Citsb29wX3NldF9zdGF0dXM2NChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBjb25zdCBzdHJ1Y3QgbG9vcF9pbmZvNjQgX191c2VyICphcmcpCit7CisJc3RydWN0IGxvb3BfaW5mbzY0IGluZm82NDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbzY0LCBhcmcsIHNpemVvZiAoc3RydWN0IGxvb3BfaW5mbzY0KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBsb29wX3NldF9zdGF0dXMobG8sICZpbmZvNjQpOworfQorCitzdGF0aWMgaW50Citsb29wX2dldF9zdGF0dXNfb2xkKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBsb29wX2luZm8gX191c2VyICphcmcpIHsKKwlzdHJ1Y3QgbG9vcF9pbmZvIGluZm87CisJc3RydWN0IGxvb3BfaW5mbzY0IGluZm82NDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghYXJnKQorCQllcnIgPSAtRUlOVkFMOworCWlmICghZXJyKQorCQllcnIgPSBsb29wX2dldF9zdGF0dXMobG8sICZpbmZvNjQpOworCWlmICghZXJyKQorCQllcnIgPSBsb29wX2luZm82NF90b19vbGQoJmluZm82NCwgJmluZm8pOworCWlmICghZXJyICYmIGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQllcnIgPSAtRUZBVUxUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorbG9vcF9nZXRfc3RhdHVzNjQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGxvb3BfaW5mbzY0IF9fdXNlciAqYXJnKSB7CisJc3RydWN0IGxvb3BfaW5mbzY0IGluZm82NDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghYXJnKQorCQllcnIgPSAtRUlOVkFMOworCWlmICghZXJyKQorCQllcnIgPSBsb29wX2dldF9zdGF0dXMobG8sICZpbmZvNjQpOworCWlmICghZXJyICYmIGNvcHlfdG9fdXNlcihhcmcsICZpbmZvNjQsIHNpemVvZihpbmZvNjQpKSkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG9faW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisKKwlkb3duKCZsby0+bG9fY3RsX211dGV4KTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTE9PUF9TRVRfRkQ6CisJCWVyciA9IGxvb3Bfc2V0X2ZkKGxvLCBmaWxlLCBpbm9kZS0+aV9iZGV2LCBhcmcpOworCQlicmVhazsKKwljYXNlIExPT1BfQ0hBTkdFX0ZEOgorCQllcnIgPSBsb29wX2NoYW5nZV9mZChsbywgZmlsZSwgaW5vZGUtPmlfYmRldiwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBMT09QX0NMUl9GRDoKKwkJZXJyID0gbG9vcF9jbHJfZmQobG8sIGlub2RlLT5pX2JkZXYpOworCQlicmVhazsKKwljYXNlIExPT1BfU0VUX1NUQVRVUzoKKwkJZXJyID0gbG9vcF9zZXRfc3RhdHVzX29sZChsbywgKHN0cnVjdCBsb29wX2luZm8gX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTE9PUF9HRVRfU1RBVFVTOgorCQllcnIgPSBsb29wX2dldF9zdGF0dXNfb2xkKGxvLCAoc3RydWN0IGxvb3BfaW5mbyBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBMT09QX1NFVF9TVEFUVVM2NDoKKwkJZXJyID0gbG9vcF9zZXRfc3RhdHVzNjQobG8sIChzdHJ1Y3QgbG9vcF9pbmZvNjQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTE9PUF9HRVRfU1RBVFVTNjQ6CisJCWVyciA9IGxvb3BfZ2V0X3N0YXR1czY0KGxvLCAoc3RydWN0IGxvb3BfaW5mbzY0IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSBsby0+aW9jdGwgPyBsby0+aW9jdGwobG8sIGNtZCwgYXJnKSA6IC1FSU5WQUw7CisJfQorCXVwKCZsby0+bG9fY3RsX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKworCWRvd24oJmxvLT5sb19jdGxfbXV0ZXgpOworCWxvLT5sb19yZWZjbnQrKzsKKwl1cCgmbG8tPmxvX2N0bF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwlkb3duKCZsby0+bG9fY3RsX211dGV4KTsKKwktLWxvLT5sb19yZWZjbnQ7CisJdXAoJmxvLT5sb19jdGxfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgbG9fZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlsb19vcGVuLAorCS5yZWxlYXNlID0JbG9fcmVsZWFzZSwKKwkuaW9jdGwgPQlsb19pb2N0bCwKK307CisKKy8qCisgKiBBbmQgbm93IHRoZSBtb2R1bGVzIGNvZGUgYW5kIGtlcm5lbCBpbnRlcmZhY2UuCisgKi8KK21vZHVsZV9wYXJhbShtYXhfbG9vcCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2xvb3AsICJNYXhpbXVtIG51bWJlciBvZiBsb29wIGRldmljZXMgKDEtMjU2KSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0JMT0NLREVWX01BSk9SKExPT1BfTUFKT1IpOworCitpbnQgbG9vcF9yZWdpc3Rlcl90cmFuc2ZlcihzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICpmdW5jcykKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IGZ1bmNzLT5udW1iZXI7CisKKwlpZiAobiA+PSBNQVhfTE9fQ1JZUFQgfHwgeGZlcl9mdW5jc1tuXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJeGZlcl9mdW5jc1tuXSA9IGZ1bmNzOworCXJldHVybiAwOworfQorCitpbnQgbG9vcF91bnJlZ2lzdGVyX3RyYW5zZmVyKGludCBudW1iZXIpCit7CisJdW5zaWduZWQgaW50IG4gPSBudW1iZXI7CisJc3RydWN0IGxvb3BfZGV2aWNlICpsbzsKKwlzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICp4ZmVyOworCisJaWYgKG4gPT0gMCB8fCBuID49IE1BWF9MT19DUllQVCB8fCAoeGZlciA9IHhmZXJfZnVuY3Nbbl0pID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJeGZlcl9mdW5jc1tuXSA9IE5VTEw7CisKKwlmb3IgKGxvID0gJmxvb3BfZGV2WzBdOyBsbyA8ICZsb29wX2RldlttYXhfbG9vcF07IGxvKyspIHsKKwkJZG93bigmbG8tPmxvX2N0bF9tdXRleCk7CisKKwkJaWYgKGxvLT5sb19lbmNyeXB0aW9uID09IHhmZXIpCisJCQlsb29wX3JlbGVhc2VfeGZlcihsbyk7CisKKwkJdXAoJmxvLT5sb19jdGxfbXV0ZXgpOworCX0KKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGxvb3BfcmVnaXN0ZXJfdHJhbnNmZXIpOworRVhQT1JUX1NZTUJPTChsb29wX3VucmVnaXN0ZXJfdHJhbnNmZXIpOworCitzdGF0aWMgaW50IF9faW5pdCBsb29wX2luaXQodm9pZCkKK3sKKwlpbnQJaTsKKworCWlmIChtYXhfbG9vcCA8IDEgfHwgbWF4X2xvb3AgPiAyNTYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9vcDogaW52YWxpZCBtYXhfbG9vcCAobXVzdCBiZSBiZXR3ZWVuIgorCQkJCSAgICAiIDEgYW5kIDI1NiksIHVzaW5nIGRlZmF1bHQgKDgpXG4iKTsKKwkJbWF4X2xvb3AgPSA4OworCX0KKworCWlmIChyZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKSkKKwkJcmV0dXJuIC1FSU87CisKKwlsb29wX2RldiA9IGttYWxsb2MobWF4X2xvb3AgKiBzaXplb2Yoc3RydWN0IGxvb3BfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb29wX2RldikKKwkJZ290byBvdXRfbWVtMTsKKwltZW1zZXQobG9vcF9kZXYsIDAsIG1heF9sb29wICogc2l6ZW9mKHN0cnVjdCBsb29wX2RldmljZSkpOworCisJZGlza3MgPSBrbWFsbG9jKG1heF9sb29wICogc2l6ZW9mKHN0cnVjdCBnZW5kaXNrICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRpc2tzKQorCQlnb3RvIG91dF9tZW0yOworCisJZm9yIChpID0gMDsgaSA8IG1heF9sb29wOyBpKyspIHsKKwkJZGlza3NbaV0gPSBhbGxvY19kaXNrKDEpOworCQlpZiAoIWRpc2tzW2ldKQorCQkJZ290byBvdXRfbWVtMzsKKwl9CisKKwlkZXZmc19ta19kaXIoImxvb3AiKTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfbG9vcDsgaSsrKSB7CisJCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSAmbG9vcF9kZXZbaV07CisJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGlza3NbaV07CisKKwkJbWVtc2V0KGxvLCAwLCBzaXplb2YoKmxvKSk7CisJCWxvLT5sb19xdWV1ZSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFsby0+bG9fcXVldWUpCisJCQlnb3RvIG91dF9tZW00OworCQlpbml0X01VVEVYKCZsby0+bG9fY3RsX211dGV4KTsKKwkJaW5pdF9NVVRFWF9MT0NLRUQoJmxvLT5sb19zZW0pOworCQlpbml0X01VVEVYX0xPQ0tFRCgmbG8tPmxvX2JoX211dGV4KTsKKwkJbG8tPmxvX251bWJlciA9IGk7CisJCXNwaW5fbG9ja19pbml0KCZsby0+bG9fbG9jayk7CisJCWRpc2stPm1ham9yID0gTE9PUF9NQUpPUjsKKwkJZGlzay0+Zmlyc3RfbWlub3IgPSBpOworCQlkaXNrLT5mb3BzID0gJmxvX2ZvcHM7CisJCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAibG9vcCVkIiwgaSk7CisJCXNwcmludGYoZGlzay0+ZGV2ZnNfbmFtZSwgImxvb3AvJWQiLCBpKTsKKwkJZGlzay0+cHJpdmF0ZV9kYXRhID0gbG87CisJCWRpc2stPnF1ZXVlID0gbG8tPmxvX3F1ZXVlOworCX0KKworCS8qIFdlIGNhbm5vdCBmYWlsIGFmdGVyIHdlIGNhbGwgdGhpcywgc28gYW5vdGhlciBsb29wISovCisJZm9yIChpID0gMDsgaSA8IG1heF9sb29wOyBpKyspCisJCWFkZF9kaXNrKGRpc2tzW2ldKTsKKwlwcmludGsoS0VSTl9JTkZPICJsb29wOiBsb2FkZWQgKG1heCAlZCBkZXZpY2VzKVxuIiwgbWF4X2xvb3ApOworCXJldHVybiAwOworCitvdXRfbWVtNDoKKwl3aGlsZSAoaS0tKQorCQlibGtfcHV0X3F1ZXVlKGxvb3BfZGV2W2ldLmxvX3F1ZXVlKTsKKwlkZXZmc19yZW1vdmUoImxvb3AiKTsKKwlpID0gbWF4X2xvb3A7CitvdXRfbWVtMzoKKwl3aGlsZSAoaS0tKQorCQlwdXRfZGlzayhkaXNrc1tpXSk7CisJa2ZyZWUoZGlza3MpOworb3V0X21lbTI6CisJa2ZyZWUobG9vcF9kZXYpOworb3V0X21lbTE6CisJdW5yZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKTsKKwlwcmludGsoS0VSTl9FUlIgImxvb3A6IHJhbiBvdXQgb2YgbWVtb3J5XG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgbG9vcF9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2xvb3A7IGkrKykgeworCQlkZWxfZ2VuZGlzayhkaXNrc1tpXSk7CisJCWJsa19wdXRfcXVldWUobG9vcF9kZXZbaV0ubG9fcXVldWUpOworCQlwdXRfZGlzayhkaXNrc1tpXSk7CisJfQorCWRldmZzX3JlbW92ZSgibG9vcCIpOworCWlmICh1bnJlZ2lzdGVyX2Jsa2RldihMT09QX01BSk9SLCAibG9vcCIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb29wOiBjYW5ub3QgdW5yZWdpc3RlciBibGtkZXZcbiIpOworCisJa2ZyZWUoZGlza3MpOworCWtmcmVlKGxvb3BfZGV2KTsKK30KKworbW9kdWxlX2luaXQobG9vcF9pbml0KTsKK21vZHVsZV9leGl0KGxvb3BfZXhpdCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBtYXhfbG9vcF9zZXR1cChjaGFyICpzdHIpCit7CisJbWF4X2xvb3AgPSBzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm1heF9sb29wPSIsIG1heF9sb29wX3NldHVwKTsKKyNlbmRpZgo=