LyoKICogIGxpbnV4L2RyaXZlcnMvYmxvY2svbG9vcC5jCiAqCiAqICBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDMvMjkvOTMKICoKICogQ29weXJpZ2h0IDE5OTMgYnkgVGhlb2RvcmUgVHMnby4gIFJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSBpcwogKiBwZXJtaXR0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgogKgogKiBERVMgZW5jcnlwdGlvbiBwbHVzIHNvbWUgbWlub3IgY2hhbmdlcyBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIDMwLU1BWS0xOTkzCiAqIG1vcmUgREVTIGVuY3J5cHRpb24gcGx1cyBJREVBIGVuY3J5cHRpb24gYnkgTmljaG9sYXMgSi4gTGVvbiwgSnVuZSAyMCwgMTk5NgogKgogKiBNb2R1bGFyaXplZCBhbmQgdXBkYXRlZCBmb3IgMS4xLjE2IGtlcm5lbCAtIE1pdGNoIERzb3V6YSAyOHRoIE1heSAxOTk0CiAqIEFkYXB0ZWQgZm9yIDEuMy41OSBrZXJuZWwgLSBBbmRyaWVzIEJyb3V3ZXIsIDEgRmViIDE5OTYKICoKICogRml4ZWQgZG9fbG9vcF9yZXF1ZXN0KCkgcmUtZW50cmFuY3kgLSBWaW5jZW50LlJlbmFyZGlhc0B3YXcuY29tIE1hciAyMCwgMTk5NwogKgogKiBBZGRlZCBkZXZmcyBzdXBwb3J0IC0gUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+IDE2LUphbi0xOTk4CiAqCiAqIEhhbmRsZSBzcGFyc2UgYmFja2luZyBmaWxlcyBjb3JyZWN0bHkgLSBLZW5uIEh1bWJvcmcsIEp1biAyOCwgMTk5OAogKgogKiBMb2FkYWJsZSBtb2R1bGVzIGFuZCBvdGhlciBmaXhlcyBieSBBSywgMTk5OAogKgogKiBNYWtlIHJlYWwgYmxvY2sgbnVtYmVyIGF2YWlsYWJsZSB0byBkb3duc3RyZWFtIHRyYW5zZmVyIGZ1bmN0aW9ucywgZW5hYmxlcwogKiBDQkMgKGFuZCByZWxhdGl2ZXMpIG1vZGUgZW5jcnlwdGlvbiByZXF1aXJpbmcgdW5pcXVlIElWcyBwZXIgZGF0YSBibG9jay4KICogUmVlZCBILiBQZXR0eSwgcmhwQGRyYXBlci5uZXQKICoKICogTWF4aW11bSBudW1iZXIgb2YgbG9vcCBkZXZpY2VzIG5vdyBkeW5hbWljIHZpYSBtYXhfbG9vcCBtb2R1bGUgcGFyYW1ldGVyLgogKiBSdXNzZWxsIEtyb2xsIDxya3JvbGxAZXhwbG9pdHMub3JnPiAxOTk5MDcwMQogKgogKiBNYXhpbXVtIG51bWJlciBvZiBsb29wIGRldmljZXMgd2hlbiBjb21waWxlZC1pbiBub3cgc2VsZWN0YWJsZSBieSBwYXNzaW5nCiAqIG1heF9sb29wPTwxLTI1NT4gdG8gdGhlIGtlcm5lbCBvbiBib290LgogKiBFcmlrIEkuIEJvbHP4LCA8ZXJpa2lAaGltb2xkZS5ubz4sIE9jdCAzMSwgMTk5OQogKgogKiBDb21wbGV0ZWx5IHJld3JpdGUgcmVxdWVzdCBoYW5kbGluZyB0byBiZSBtYWtlX3JlcXVlc3RfZm4gc3R5bGUgYW5kCiAqIG5vbiBibG9ja2luZywgcHVzaGluZyB3b3JrIHRvIGEgaGVscGVyIHRocmVhZC4gTG90cyBvZiBmaXhlcyBmcm9tCiAqIEFsIFZpcm8gdG9vLgogKiBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPiwgTm92IDIwMDAKICoKICogU3VwcG9ydCB1cCB0byAyNTYgbG9vcCBkZXZpY2VzCiAqIEhlaW56IE1hdWVsc2hhZ2VuIDxtZ2VAc2lzdGluYS5jb20+LCBGZWIgMjAwMgogKgogKiBTdXBwb3J0IGZvciBmYWxsaW5nIGJhY2sgb24gdGhlIHdyaXRlIGZpbGUgb3BlcmF0aW9uIHdoZW4gdGhlIGFkZHJlc3Mgc3BhY2UKICogb3BlcmF0aW9ucyBwcmVwYXJlX3dyaXRlIGFuZC9vciBjb21taXRfd3JpdGUgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlCiAqIGJhY2tpbmcgZmlsZXN5c3RlbS4KICogQW50b24gQWx0YXBhcm1ha292LCAxNiBGZWIgMjAwNQogKgogKiBTdGlsbCBUbyBGaXg6CiAqIC0gQWR2aXNvcnkgbG9ja2luZyBpcyBpZ25vcmVkIGhlcmUuCiAqIC0gU2hvdWxkIHVzZSBhbiBvd24gQ0FQXyogY2F0ZWdvcnkgaW5zdGVhZCBvZiBDQVBfU1lTX0FETUlOCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgvZmlsZS5oPgojaW5jbHVkZSA8bGludXgvc3RhdC5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgojaW5jbHVkZSA8bGludXgvc3dhcC5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvbG9vcC5oPgojaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgaW52YWxpZGF0ZV9iZGV2KCkgKi8KI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgojaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgoKI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CgpzdGF0aWMgaW50IG1heF9sb29wID0gODsKc3RhdGljIHN0cnVjdCBsb29wX2RldmljZSAqbG9vcF9kZXY7CnN0YXRpYyBzdHJ1Y3QgZ2VuZGlzayAqKmRpc2tzOwoKLyoKICogVHJhbnNmZXIgZnVuY3Rpb25zCiAqLwpzdGF0aWMgaW50IHRyYW5zZmVyX25vbmUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgaW50IGNtZCwKCQkJIHN0cnVjdCBwYWdlICpyYXdfcGFnZSwgdW5zaWduZWQgcmF3X29mZiwKCQkJIHN0cnVjdCBwYWdlICpsb29wX3BhZ2UsIHVuc2lnbmVkIGxvb3Bfb2ZmLAoJCQkgaW50IHNpemUsIHNlY3Rvcl90IHJlYWxfYmxvY2spCnsKCWNoYXIgKnJhd19idWYgPSBrbWFwX2F0b21pYyhyYXdfcGFnZSwgS01fVVNFUjApICsgcmF3X29mZjsKCWNoYXIgKmxvb3BfYnVmID0ga21hcF9hdG9taWMobG9vcF9wYWdlLCBLTV9VU0VSMSkgKyBsb29wX29mZjsKCglpZiAoY21kID09IFJFQUQpCgkJbWVtY3B5KGxvb3BfYnVmLCByYXdfYnVmLCBzaXplKTsKCWVsc2UKCQltZW1jcHkocmF3X2J1ZiwgbG9vcF9idWYsIHNpemUpOwoKCWt1bm1hcF9hdG9taWMocmF3X2J1ZiwgS01fVVNFUjApOwoJa3VubWFwX2F0b21pYyhsb29wX2J1ZiwgS01fVVNFUjEpOwoJY29uZF9yZXNjaGVkKCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB0cmFuc2Zlcl94b3Ioc3RydWN0IGxvb3BfZGV2aWNlICpsbywgaW50IGNtZCwKCQkJc3RydWN0IHBhZ2UgKnJhd19wYWdlLCB1bnNpZ25lZCByYXdfb2ZmLAoJCQlzdHJ1Y3QgcGFnZSAqbG9vcF9wYWdlLCB1bnNpZ25lZCBsb29wX29mZiwKCQkJaW50IHNpemUsIHNlY3Rvcl90IHJlYWxfYmxvY2spCnsKCWNoYXIgKnJhd19idWYgPSBrbWFwX2F0b21pYyhyYXdfcGFnZSwgS01fVVNFUjApICsgcmF3X29mZjsKCWNoYXIgKmxvb3BfYnVmID0ga21hcF9hdG9taWMobG9vcF9wYWdlLCBLTV9VU0VSMSkgKyBsb29wX29mZjsKCWNoYXIgKmluLCAqb3V0LCAqa2V5OwoJaW50IGksIGtleXNpemU7CgoJaWYgKGNtZCA9PSBSRUFEKSB7CgkJaW4gPSByYXdfYnVmOwoJCW91dCA9IGxvb3BfYnVmOwoJfSBlbHNlIHsKCQlpbiA9IGxvb3BfYnVmOwoJCW91dCA9IHJhd19idWY7Cgl9CgoJa2V5ID0gbG8tPmxvX2VuY3J5cHRfa2V5OwoJa2V5c2l6ZSA9IGxvLT5sb19lbmNyeXB0X2tleV9zaXplOwoJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKCQkqb3V0KysgPSAqaW4rKyBeIGtleVsoaSAmIDUxMSkgJSBrZXlzaXplXTsKCglrdW5tYXBfYXRvbWljKHJhd19idWYsIEtNX1VTRVIwKTsKCWt1bm1hcF9hdG9taWMobG9vcF9idWYsIEtNX1VTRVIxKTsKCWNvbmRfcmVzY2hlZCgpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgeG9yX2luaXQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvKQp7CglpZiAodW5saWtlbHkoaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA8PSAwKSkKCQlyZXR1cm4gLUVJTlZBTDsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGxvb3BfZnVuY190YWJsZSBub25lX2Z1bmNzID0gewoJLm51bWJlciA9IExPX0NSWVBUX05PTkUsCgkudHJhbnNmZXIgPSB0cmFuc2Zlcl9ub25lLAp9OyAJCgpzdGF0aWMgc3RydWN0IGxvb3BfZnVuY190YWJsZSB4b3JfZnVuY3MgPSB7CgkubnVtYmVyID0gTE9fQ1JZUFRfWE9SLAoJLnRyYW5zZmVyID0gdHJhbnNmZXJfeG9yLAoJLmluaXQgPSB4b3JfaW5pdAp9OyAJCgovKiB4ZmVyX2Z1bmNzWzBdIGlzIHNwZWNpYWwgLSBpdHMgcmVsZWFzZSBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgKi8Kc3RhdGljIHN0cnVjdCBsb29wX2Z1bmNfdGFibGUgKnhmZXJfZnVuY3NbTUFYX0xPX0NSWVBUXSA9IHsKCSZub25lX2Z1bmNzLAoJJnhvcl9mdW5jcwp9OwoKc3RhdGljIGxvZmZfdCBnZXRfbG9vcF9zaXplKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBmaWxlICpmaWxlKQp7Cglsb2ZmX3Qgc2l6ZSwgb2Zmc2V0LCBsb29wc2l6ZTsKCgkvKiBDb21wdXRlIGxvb3BzaXplIGluIGJ5dGVzICovCglzaXplID0gaV9zaXplX3JlYWQoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KTsKCW9mZnNldCA9IGxvLT5sb19vZmZzZXQ7Cglsb29wc2l6ZSA9IHNpemUgLSBvZmZzZXQ7CglpZiAobG8tPmxvX3NpemVsaW1pdCA+IDAgJiYgbG8tPmxvX3NpemVsaW1pdCA8IGxvb3BzaXplKQoJCWxvb3BzaXplID0gbG8tPmxvX3NpemVsaW1pdDsKCgkvKgoJICogVW5mb3J0dW5hdGVseSwgaWYgd2Ugd2FudCB0byBkbyBJL08gb24gdGhlIGRldmljZSwKCSAqIHRoZSBudW1iZXIgb2YgNTEyLWJ5dGUgc2VjdG9ycyBoYXMgdG8gZml0IGludG8gYSBzZWN0b3JfdC4KCSAqLwoJcmV0dXJuIGxvb3BzaXplID4+IDk7Cn0KCnN0YXRpYyBpbnQKZmlndXJlX2xvb3Bfc2l6ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQp7Cglsb2ZmX3Qgc2l6ZSA9IGdldF9sb29wX3NpemUobG8sIGxvLT5sb19iYWNraW5nX2ZpbGUpOwoJc2VjdG9yX3QgeCA9IChzZWN0b3JfdClzaXplOwoKCWlmICh1bmxpa2VseSgobG9mZl90KXggIT0gc2l6ZSkpCgkJcmV0dXJuIC1FRkJJRzsKCglzZXRfY2FwYWNpdHkoZGlza3NbbG8tPmxvX251bWJlcl0sIHgpOwoJcmV0dXJuIDA7CQkJCQkKfQoKc3RhdGljIGlubGluZSBpbnQKbG9fZG9fdHJhbnNmZXIoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgaW50IGNtZCwKCSAgICAgICBzdHJ1Y3QgcGFnZSAqcnBhZ2UsIHVuc2lnbmVkIHJvZmZzLAoJICAgICAgIHN0cnVjdCBwYWdlICpscGFnZSwgdW5zaWduZWQgbG9mZnMsCgkgICAgICAgaW50IHNpemUsIHNlY3Rvcl90IHJibG9jaykKewoJaWYgKHVubGlrZWx5KCFsby0+dHJhbnNmZXIpKQoJCXJldHVybiAwOwoKCXJldHVybiBsby0+dHJhbnNmZXIobG8sIGNtZCwgcnBhZ2UsIHJvZmZzLCBscGFnZSwgbG9mZnMsIHNpemUsIHJibG9jayk7Cn0KCi8qKgogKiBkb19sb19zZW5kX2FvcHMgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCiAqCiAqIFRoaXMgaXMgdGhlIGZhc3QgdmVyc2lvbiBmb3IgYmFja2luZyBmaWxlc3lzdGVtcyB3aGljaCBpbXBsZW1lbnQgdGhlIGFkZHJlc3MKICogc3BhY2Ugb3BlcmF0aW9ucyBwcmVwYXJlX3dyaXRlIGFuZCBjb21taXRfd3JpdGUuCiAqLwpzdGF0aWMgaW50IGRvX2xvX3NlbmRfYW9wcyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKCQlpbnQgYnNpemUsIGxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQp7CglzdHJ1Y3QgZmlsZSAqZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7IC8qIGt1ZG9zIHRvIE5Gc2NraW5nUyAqLwoJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7Cgljb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zICphb3BzID0gbWFwcGluZy0+YV9vcHM7CglwZ29mZl90IGluZGV4OwoJdW5zaWduZWQgb2Zmc2V0LCBidl9vZmZzOwoJaW50IGxlbiwgcmV0OwoKCW11dGV4X2xvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwoJaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKCW9mZnNldCA9IHBvcyAmICgocGdvZmZfdClQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKCWJ2X29mZnMgPSBidmVjLT5idl9vZmZzZXQ7CglsZW4gPSBidmVjLT5idl9sZW47Cgl3aGlsZSAobGVuID4gMCkgewoJCXNlY3Rvcl90IElWOwoJCXVuc2lnbmVkIHNpemU7CgkJaW50IHRyYW5zZmVyX3Jlc3VsdDsKCgkJSVYgPSAoKHNlY3Rvcl90KWluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSkpKyhvZmZzZXQgPj4gOSk7CgkJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKCQlpZiAoc2l6ZSA+IGxlbikKCQkJc2l6ZSA9IGxlbjsKCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKCQlpZiAodW5saWtlbHkoIXBhZ2UpKQoJCQlnb3RvIGZhaWw7CgkJcmV0ID0gYW9wcy0+cHJlcGFyZV93cml0ZShmaWxlLCBwYWdlLCBvZmZzZXQsCgkJCQkJICBvZmZzZXQgKyBzaXplKTsKCQlpZiAodW5saWtlbHkocmV0KSkgewoJCQlpZiAocmV0ID09IEFPUF9UUlVOQ0FURURfUEFHRSkgewoJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwoJCQkJY29udGludWU7CgkJCX0KCQkJZ290byB1bmxvY2s7CgkJfQoJCXRyYW5zZmVyX3Jlc3VsdCA9IGxvX2RvX3RyYW5zZmVyKGxvLCBXUklURSwgcGFnZSwgb2Zmc2V0LAoJCQkJYnZlYy0+YnZfcGFnZSwgYnZfb2Zmcywgc2l6ZSwgSVYpOwoJCWlmICh1bmxpa2VseSh0cmFuc2Zlcl9yZXN1bHQpKSB7CgkJCWNoYXIgKmthZGRyOwoKCQkJLyoKCQkJICogVGhlIHRyYW5zZmVyIGZhaWxlZCwgYnV0IHdlIHN0aWxsIHdyaXRlIHRoZSBkYXRhIHRvCgkJCSAqIGtlZXAgcHJlcGFyZS9jb21taXQgY2FsbHMgYmFsYW5jZWQuCgkJCSAqLwoJCQlwcmludGsoS0VSTl9FUlIgImxvb3A6IHRyYW5zZmVyIGVycm9yIGJsb2NrICVsbHVcbiIsCgkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluZGV4KTsKCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CgkJCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwgc2l6ZSk7CgkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKCQl9CgkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CgkJcmV0ID0gYW9wcy0+Y29tbWl0X3dyaXRlKGZpbGUsIHBhZ2UsIG9mZnNldCwKCQkJCQkgb2Zmc2V0ICsgc2l6ZSk7CgkJaWYgKHVubGlrZWx5KHJldCkpIHsKCQkJaWYgKHJldCA9PSBBT1BfVFJVTkNBVEVEX1BBR0UpIHsKCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWdvdG8gdW5sb2NrOwoJCX0KCQlpZiAodW5saWtlbHkodHJhbnNmZXJfcmVzdWx0KSkKCQkJZ290byB1bmxvY2s7CgkJYnZfb2ZmcyArPSBzaXplOwoJCWxlbiAtPSBzaXplOwoJCW9mZnNldCA9IDA7CgkJaW5kZXgrKzsKCQlwb3MgKz0gc2l6ZTsKCQl1bmxvY2tfcGFnZShwYWdlKTsKCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Cgl9CglyZXQgPSAwOwpvdXQ6CgltdXRleF91bmxvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwoJcmV0dXJuIHJldDsKdW5sb2NrOgoJdW5sb2NrX3BhZ2UocGFnZSk7CglwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CmZhaWw6CglyZXQgPSAtMTsKCWdvdG8gb3V0Owp9CgovKioKICogX19kb19sb19zZW5kX3dyaXRlIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQogKgogKiBUaGlzIGhlbHBlciBqdXN0IGZhY3RvcnMgb3V0IGNvbW1vbiBjb2RlIGJldHdlZW4gZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGUoKQogKiBhbmQgZG9fbG9fc2VuZF93cml0ZSgpLgogKi8Kc3RhdGljIGludCBfX2RvX2xvX3NlbmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCgkJdTggX191c2VyICpidWYsIGNvbnN0IGludCBsZW4sIGxvZmZfdCBwb3MpCnsKCXNzaXplX3QgYnc7CgltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CgoJc2V0X2ZzKGdldF9kcygpKTsKCWJ3ID0gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSwgYnVmLCBsZW4sICZwb3MpOwoJc2V0X2ZzKG9sZF9mcyk7CglpZiAobGlrZWx5KGJ3ID09IGxlbikpCgkJcmV0dXJuIDA7CglwcmludGsoS0VSTl9FUlIgImxvb3A6IFdyaXRlIGVycm9yIGF0IGJ5dGUgb2Zmc2V0ICVsbHUsIGxlbmd0aCAlaS5cbiIsCgkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcG9zLCBsZW4pOwoJaWYgKGJ3ID49IDApCgkJYncgPSAtRUlPOwoJcmV0dXJuIGJ3Owp9CgovKioKICogZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGUgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCiAqCiAqIFRoaXMgaXMgdGhlIGZhc3QsIG5vbi10cmFuc2Zvcm1pbmcgdmVyc2lvbiBmb3IgYmFja2luZyBmaWxlc3lzdGVtcyB3aGljaCBkbwogKiBub3QgaW1wbGVtZW50IHRoZSBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgcHJlcGFyZV93cml0ZSBhbmQgY29tbWl0X3dyaXRlLgogKiBJdCB1c2VzIHRoZSB3cml0ZSBmaWxlIG9wZXJhdGlvbiB3aGljaCBzaG91bGQgYmUgcHJlc2VudCBvbiBhbGwgd3JpdGVhYmxlCiAqIGZpbGVzeXN0ZW1zLgogKi8Kc3RhdGljIGludCBkb19sb19zZW5kX2RpcmVjdF93cml0ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLAoJCXN0cnVjdCBiaW9fdmVjICpidmVjLCBpbnQgYnNpemUsIGxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQp7Cglzc2l6ZV90IGJ3ID0gX19kb19sb19zZW5kX3dyaXRlKGxvLT5sb19iYWNraW5nX2ZpbGUsCgkJCSh1OCBfX3VzZXIgKilrbWFwKGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0LAoJCQlidmVjLT5idl9sZW4sIHBvcyk7CglrdW5tYXAoYnZlYy0+YnZfcGFnZSk7Cgljb25kX3Jlc2NoZWQoKTsKCXJldHVybiBidzsKfQoKLyoqCiAqIGRvX2xvX3NlbmRfd3JpdGUgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCiAqCiAqIFRoaXMgaXMgdGhlIHNsb3csIHRyYW5zZm9ybWluZyB2ZXJzaW9uIGZvciBmaWxlc3lzdGVtcyB3aGljaCBkbyBub3QKICogaW1wbGVtZW50IHRoZSBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgcHJlcGFyZV93cml0ZSBhbmQgY29tbWl0X3dyaXRlLiAgSXQKICogdXNlcyB0aGUgd3JpdGUgZmlsZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHByZXNlbnQgb24gYWxsIHdyaXRlYWJsZQogKiBmaWxlc3lzdGVtcy4KICoKICogVXNpbmcgZm9wcy0+d3JpdGUgaXMgc2xvd2VyIHRoYW4gdXNpbmcgYW9wcy0+e3ByZXBhcmUsY29tbWl0fV93cml0ZSBpbiB0aGUKICogdHJhbnNmb3JtaW5nIGNhc2UgYmVjYXVzZSB3ZSBuZWVkIHRvIGRvdWJsZSBidWZmZXIgdGhlIGRhdGEgYXMgd2UgY2Fubm90IGRvCiAqIHRoZSB0cmFuc2Zvcm1hdGlvbnMgaW4gcGxhY2UgYXMgd2UgZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUKICogZGVzdGluYXRpb24gcGFnZXMgb2YgdGhlIGJhY2tpbmcgZmlsZS4KICovCnN0YXRpYyBpbnQgZG9fbG9fc2VuZF93cml0ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKCQlpbnQgYnNpemUsIGxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQp7CglpbnQgcmV0ID0gbG9fZG9fdHJhbnNmZXIobG8sIFdSSVRFLCBwYWdlLCAwLCBidmVjLT5idl9wYWdlLAoJCQlidmVjLT5idl9vZmZzZXQsIGJ2ZWMtPmJ2X2xlbiwgcG9zID4+IDkpOwoJaWYgKGxpa2VseSghcmV0KSkKCQlyZXR1cm4gX19kb19sb19zZW5kX3dyaXRlKGxvLT5sb19iYWNraW5nX2ZpbGUsCgkJCQkodTggX191c2VyICopcGFnZV9hZGRyZXNzKHBhZ2UpLCBidmVjLT5idl9sZW4sCgkJCQlwb3MpOwoJcHJpbnRrKEtFUk5fRVJSICJsb29wOiBUcmFuc2ZlciBlcnJvciBhdCBieXRlIG9mZnNldCAlbGx1LCAiCgkJCSJsZW5ndGggJWkuXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXBvcywgYnZlYy0+YnZfbGVuKTsKCWlmIChyZXQgPiAwKQoJCXJldCA9IC1FSU87CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGxvX3NlbmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpbyAqYmlvLCBpbnQgYnNpemUsCgkJbG9mZl90IHBvcykKewoJaW50ICgqZG9fbG9fc2VuZCkoc3RydWN0IGxvb3BfZGV2aWNlICosIHN0cnVjdCBiaW9fdmVjICosIGludCwgbG9mZl90LAoJCQlzdHJ1Y3QgcGFnZSAqcGFnZSk7CglzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKCWludCBpLCByZXQgPSAwOwoKCWRvX2xvX3NlbmQgPSBkb19sb19zZW5kX2FvcHM7CglpZiAoIShsby0+bG9fZmxhZ3MgJiBMT19GTEFHU19VU0VfQU9QUykpIHsKCQlkb19sb19zZW5kID0gZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGU7CgkJaWYgKGxvLT50cmFuc2ZlciAhPSB0cmFuc2Zlcl9ub25lKSB7CgkJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9OT0lPIHwgX19HRlBfSElHSE1FTSk7CgkJCWlmICh1bmxpa2VseSghcGFnZSkpCgkJCQlnb3RvIGZhaWw7CgkJCWttYXAocGFnZSk7CgkJCWRvX2xvX3NlbmQgPSBkb19sb19zZW5kX3dyaXRlOwoJCX0KCX0KCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgewoJCXJldCA9IGRvX2xvX3NlbmQobG8sIGJ2ZWMsIGJzaXplLCBwb3MsIHBhZ2UpOwoJCWlmIChyZXQgPCAwKQoJCQlicmVhazsKCQlwb3MgKz0gYnZlYy0+YnZfbGVuOwoJfQoJaWYgKHBhZ2UpIHsKCQlrdW5tYXAocGFnZSk7CgkJX19mcmVlX3BhZ2UocGFnZSk7Cgl9Cm91dDoKCXJldHVybiByZXQ7CmZhaWw6CglwcmludGsoS0VSTl9FUlIgImxvb3A6IEZhaWxlZCB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgcGFnZSBmb3Igd3JpdGUuXG4iKTsKCXJldCA9IC1FTk9NRU07Cglnb3RvIG91dDsKfQoKc3RydWN0IGxvX3JlYWRfZGF0YSB7CglzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvOwoJc3RydWN0IHBhZ2UgKnBhZ2U7Cgl1bnNpZ25lZCBvZmZzZXQ7CglpbnQgYnNpemU7Cn07CgpzdGF0aWMgaW50CmxvX3JlYWRfYWN0b3IocmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBwYWdlICpwYWdlLAoJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJdW5zaWduZWQgbG9uZyBjb3VudCA9IGRlc2MtPmNvdW50OwoJc3RydWN0IGxvX3JlYWRfZGF0YSAqcCA9IGRlc2MtPmFyZy5kYXRhOwoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IHAtPmxvOwoJc2VjdG9yX3QgSVY7CgoJSVYgPSAoKHNlY3Rvcl90KSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIDkpKSsob2Zmc2V0ID4+IDkpOwoKCWlmIChzaXplID4gY291bnQpCgkJc2l6ZSA9IGNvdW50OwoKCWlmIChsb19kb190cmFuc2ZlcihsbywgUkVBRCwgcGFnZSwgb2Zmc2V0LCBwLT5wYWdlLCBwLT5vZmZzZXQsIHNpemUsIElWKSkgewoJCXNpemUgPSAwOwoJCXByaW50ayhLRVJOX0VSUiAibG9vcDogdHJhbnNmZXIgZXJyb3IgYmxvY2sgJWxkXG4iLAoJCSAgICAgICBwYWdlLT5pbmRleCk7CgkJZGVzYy0+ZXJyb3IgPSAtRUlOVkFMOwoJfQoKCWZsdXNoX2RjYWNoZV9wYWdlKHAtPnBhZ2UpOwoKCWRlc2MtPmNvdW50ID0gY291bnQgLSBzaXplOwoJZGVzYy0+d3JpdHRlbiArPSBzaXplOwoJcC0+b2Zmc2V0ICs9IHNpemU7CglyZXR1cm4gc2l6ZTsKfQoKc3RhdGljIGludApkb19sb19yZWNlaXZlKHN0cnVjdCBsb29wX2RldmljZSAqbG8sCgkgICAgICBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgaW50IGJzaXplLCBsb2ZmX3QgcG9zKQp7CglzdHJ1Y3QgbG9fcmVhZF9kYXRhIGNvb2tpZTsKCXN0cnVjdCBmaWxlICpmaWxlOwoJaW50IHJldHZhbDsKCgljb29raWUubG8gPSBsbzsKCWNvb2tpZS5wYWdlID0gYnZlYy0+YnZfcGFnZTsKCWNvb2tpZS5vZmZzZXQgPSBidmVjLT5idl9vZmZzZXQ7Cgljb29raWUuYnNpemUgPSBic2l6ZTsKCWZpbGUgPSBsby0+bG9fYmFja2luZ19maWxlOwoJcmV0dmFsID0gZmlsZS0+Zl9vcC0+c2VuZGZpbGUoZmlsZSwgJnBvcywgYnZlYy0+YnZfbGVuLAoJCQlsb19yZWFkX2FjdG9yLCAmY29va2llKTsKCXJldHVybiAocmV0dmFsIDwgMCk/IHJldHZhbDogMDsKfQoKc3RhdGljIGludApsb19yZWNlaXZlKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBiaW8gKmJpbywgaW50IGJzaXplLCBsb2ZmX3QgcG9zKQp7CglzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKCWludCBpLCByZXQgPSAwOwoKCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgewoJCXJldCA9IGRvX2xvX3JlY2VpdmUobG8sIGJ2ZWMsIGJzaXplLCBwb3MpOwoJCWlmIChyZXQgPCAwKQoJCQlicmVhazsKCQlwb3MgKz0gYnZlYy0+YnZfbGVuOwoJfQoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBkb19iaW9fZmlsZWJhY2tlZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8pCnsKCWxvZmZfdCBwb3M7CglpbnQgcmV0OwoKCXBvcyA9ICgobG9mZl90KSBiaW8tPmJpX3NlY3RvciA8PCA5KSArIGxvLT5sb19vZmZzZXQ7CglpZiAoYmlvX3J3KGJpbykgPT0gV1JJVEUpCgkJcmV0ID0gbG9fc2VuZChsbywgYmlvLCBsby0+bG9fYmxvY2tzaXplLCBwb3MpOwoJZWxzZQoJCXJldCA9IGxvX3JlY2VpdmUobG8sIGJpbywgbG8tPmxvX2Jsb2Nrc2l6ZSwgcG9zKTsKCXJldHVybiByZXQ7Cn0KCi8qCiAqIEFkZCBiaW8gdG8gYmFjayBvZiBwZW5kaW5nIGxpc3QKICovCnN0YXRpYyB2b2lkIGxvb3BfYWRkX2JpbyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8pCnsKCWlmIChsby0+bG9fYmlvdGFpbCkgewoJCWxvLT5sb19iaW90YWlsLT5iaV9uZXh0ID0gYmlvOwoJCWxvLT5sb19iaW90YWlsID0gYmlvOwoJfSBlbHNlCgkJbG8tPmxvX2JpbyA9IGxvLT5sb19iaW90YWlsID0gYmlvOwp9CgovKgogKiBHcmFiIGZpcnN0IHBlbmRpbmcgYnVmZmVyCiAqLwpzdGF0aWMgc3RydWN0IGJpbyAqbG9vcF9nZXRfYmlvKHN0cnVjdCBsb29wX2RldmljZSAqbG8pCnsKCXN0cnVjdCBiaW8gKmJpbzsKCglpZiAoKGJpbyA9IGxvLT5sb19iaW8pKSB7CgkJaWYgKGJpbyA9PSBsby0+bG9fYmlvdGFpbCkKCQkJbG8tPmxvX2Jpb3RhaWwgPSBOVUxMOwoJCWxvLT5sb19iaW8gPSBiaW8tPmJpX25leHQ7CgkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKCX0KCglyZXR1cm4gYmlvOwp9CgpzdGF0aWMgaW50IGxvb3BfbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqb2xkX2JpbykKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IHEtPnF1ZXVlZGF0YTsKCWludCBydyA9IGJpb19ydyhvbGRfYmlvKTsKCglpZiAocncgPT0gUkVBREEpCgkJcncgPSBSRUFEOwoKCUJVR19PTighbG8gfHwgKHJ3ICE9IFJFQUQgJiYgcncgIT0gV1JJVEUpKTsKCglzcGluX2xvY2tfaXJxKCZsby0+bG9fbG9jayk7CglpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQoJCWdvdG8gb3V0OwoJaWYgKHVubGlrZWx5KHJ3ID09IFdSSVRFICYmIChsby0+bG9fZmxhZ3MgJiBMT19GTEFHU19SRUFEX09OTFkpKSkKCQlnb3RvIG91dDsKCWxvb3BfYWRkX2Jpbyhsbywgb2xkX2Jpbyk7Cgl3YWtlX3VwKCZsby0+bG9fZXZlbnQpOwoJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7CglyZXR1cm4gMDsKCm91dDoKCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoJYmlvX2lvX2Vycm9yKG9sZF9iaW8sIG9sZF9iaW8tPmJpX3NpemUpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIGtpY2sgb2ZmIGlvIG9uIHRoZSB1bmRlcmx5aW5nIGFkZHJlc3Mgc3BhY2UKICovCnN0YXRpYyB2b2lkIGxvb3BfdW5wbHVnKHJlcXVlc3RfcXVldWVfdCAqcSkKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IHEtPnF1ZXVlZGF0YTsKCgljbGVhcl9iaXQoUVVFVUVfRkxBR19QTFVHR0VELCAmcS0+cXVldWVfZmxhZ3MpOwoJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGxvLT5sb19iYWNraW5nX2ZpbGUtPmZfbWFwcGluZyk7Cn0KCnN0cnVjdCBzd2l0Y2hfcmVxdWVzdCB7CglzdHJ1Y3QgZmlsZSAqZmlsZTsKCXN0cnVjdCBjb21wbGV0aW9uIHdhaXQ7Cn07CgpzdGF0aWMgdm9pZCBkb19sb29wX3N3aXRjaChzdHJ1Y3QgbG9vcF9kZXZpY2UgKiwgc3RydWN0IHN3aXRjaF9yZXF1ZXN0ICopOwoKc3RhdGljIGlubGluZSB2b2lkIGxvb3BfaGFuZGxlX2JpbyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8pCnsKCWlmICh1bmxpa2VseSghYmlvLT5iaV9iZGV2KSkgewoJCWRvX2xvb3Bfc3dpdGNoKGxvLCBiaW8tPmJpX3ByaXZhdGUpOwoJCWJpb19wdXQoYmlvKTsKCX0gZWxzZSB7CgkJaW50IHJldCA9IGRvX2Jpb19maWxlYmFja2VkKGxvLCBiaW8pOwoJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgcmV0KTsKCX0KfQoKLyoKICogd29ya2VyIHRocmVhZCB0aGF0IGhhbmRsZXMgcmVhZHMvd3JpdGVzIHRvIGZpbGUgYmFja2VkIGxvb3AgZGV2aWNlcywKICogdG8gYXZvaWQgYmxvY2tpbmcgaW4gb3VyIG1ha2VfcmVxdWVzdF9mbi4gaXQgYWxzbyBkb2VzIGxvb3AgZGVjcnlwdGluZwogKiBvbiByZWFkcyBmb3IgYmxvY2sgYmFja2VkIGxvb3AsIGFzIHRoYXQgaXMgdG9vIGhlYXZ5IHRvIGRvIGZyb20KICogYl9lbmRfaW8gY29udGV4dCB3aGVyZSBpcnFzIG1heSBiZSBkaXNhYmxlZC4KICoKICogTG9vcCBleHBsYW5hdGlvbjogIGxvb3BfY2xyX2ZkKCkgc2V0cyBsb19zdGF0ZSB0byBMb19ydW5kb3duIGJlZm9yZQogKiBjYWxsaW5nIGt0aHJlYWRfc3RvcCgpLiAgVGhlcmVmb3JlIG9uY2Uga3RocmVhZF9zaG91bGRfc3RvcCgpIGlzCiAqIHRydWUsIG1ha2VfcmVxdWVzdCB3aWxsIG5vdCBwbGFjZSBhbnkgbW9yZSByZXF1ZXN0cy4gIFRoZXJlZm9yZQogKiBvbmNlIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSBpcyB0cnVlIGFuZCBsb19iaW8gaXMgTlVMTCwgd2UgYXJlCiAqIGRvbmUgd2l0aCB0aGUgbG9vcC4KICovCnN0YXRpYyBpbnQgbG9vcF90aHJlYWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGRhdGE7CglzdHJ1Y3QgYmlvICpiaW87CgoJLyoKCSAqIGxvb3AgY2FuIGJlIHVzZWQgaW4gYW4gZW5jcnlwdGVkIGRldmljZSwKCSAqIGhlbmNlLCBpdCBtdXN0bid0IGJlIHN0b3BwZWQgYXQgYWxsCgkgKiBiZWNhdXNlIGl0IGNvdWxkIGJlIGluZGlyZWN0bHkgdXNlZCBkdXJpbmcgc3VzcGVuc2lvbgoJICovCgljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKCglzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CgoJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgbG8tPmxvX2JpbykgewoKCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobG8tPmxvX2V2ZW50LAoJCQkJbG8tPmxvX2JpbyB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwoKCQlpZiAoIWxvLT5sb19iaW8pCgkJCWNvbnRpbnVlOwoJCXNwaW5fbG9ja19pcnEoJmxvLT5sb19sb2NrKTsKCQliaW8gPSBsb29wX2dldF9iaW8obG8pOwoJCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoKCQlCVUdfT04oIWJpbyk7CgkJbG9vcF9oYW5kbGVfYmlvKGxvLCBiaW8pOwoJfQoKCXJldHVybiAwOwp9CgovKgogKiBsb29wX3N3aXRjaCBwZXJmb3JtcyB0aGUgaGFyZCB3b3JrIG9mIHN3aXRjaGluZyBhIGJhY2tpbmcgc3RvcmUuCiAqIEZpcnN0IGl0IG5lZWRzIHRvIGZsdXNoIGV4aXN0aW5nIElPLCBpdCBkb2VzIHRoaXMgYnkgc2VuZGluZyBhIG1hZ2ljCiAqIEJJTyBkb3duIHRoZSBwaXBlLiBUaGUgY29tcGxldGlvbiBvZiB0aGlzIEJJTyBkb2VzIHRoZSBhY3R1YWwgc3dpdGNoLgogKi8Kc3RhdGljIGludCBsb29wX3N3aXRjaChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHN3aXRjaF9yZXF1ZXN0IHc7CglzdHJ1Y3QgYmlvICpiaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgMSk7CglpZiAoIWJpbykKCQlyZXR1cm4gLUVOT01FTTsKCWluaXRfY29tcGxldGlvbigmdy53YWl0KTsKCXcuZmlsZSA9IGZpbGU7CgliaW8tPmJpX3ByaXZhdGUgPSAmdzsKCWJpby0+YmlfYmRldiA9IE5VTEw7Cglsb29wX21ha2VfcmVxdWVzdChsby0+bG9fcXVldWUsIGJpbyk7Cgl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3LndhaXQpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIERvIHRoZSBhY3R1YWwgc3dpdGNoOyBjYWxsZWQgZnJvbSB0aGUgQklPIGNvbXBsZXRpb24gcm91dGluZQogKi8Kc3RhdGljIHZvaWQgZG9fbG9vcF9zd2l0Y2goc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IHN3aXRjaF9yZXF1ZXN0ICpwKQp7CglzdHJ1Y3QgZmlsZSAqZmlsZSA9IHAtPmZpbGU7CglzdHJ1Y3QgZmlsZSAqb2xkX2ZpbGUgPSBsby0+bG9fYmFja2luZ19maWxlOwoJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CgoJbWFwcGluZ19zZXRfZ2ZwX21hc2sob2xkX2ZpbGUtPmZfbWFwcGluZywgbG8tPm9sZF9nZnBfbWFzayk7Cglsby0+bG9fYmFja2luZ19maWxlID0gZmlsZTsKCWxvLT5sb19ibG9ja3NpemUgPSBTX0lTQkxLKG1hcHBpbmctPmhvc3QtPmlfbW9kZSkgPwoJCW1hcHBpbmctPmhvc3QtPmlfYmRldi0+YmRfYmxvY2tfc2l6ZSA6IFBBR0VfU0laRTsKCWxvLT5vbGRfZ2ZwX21hc2sgPSBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpOwoJbWFwcGluZ19zZXRfZ2ZwX21hc2sobWFwcGluZywgbG8tPm9sZF9nZnBfbWFzayAmIH4oX19HRlBfSU98X19HRlBfRlMpKTsKCWNvbXBsZXRlKCZwLT53YWl0KTsKfQoKCi8qCiAqIGxvb3BfY2hhbmdlX2ZkIHN3aXRjaGVkIHRoZSBiYWNraW5nIHN0b3JlIG9mIGEgbG9vcGJhY2sgZGV2aWNlIHRvCiAqIGEgbmV3IGZpbGUuIFRoaXMgaXMgdXNlZnVsIGZvciBvcGVyYXRpbmcgc3lzdGVtIGluc3RhbGxlcnMgdG8gZnJlZSB1cAogKiB0aGUgb3JpZ2luYWwgZmlsZSBhbmQgaW4gSGlnaCBBdmFpbGFiaWxpdHkgZW52aXJvbm1lbnRzIHRvIHN3aXRjaCB0bwogKiBhbiBhbHRlcm5hdGl2ZSBsb2NhdGlvbiBmb3IgdGhlIGNvbnRlbnQgaW4gY2FzZSBvZiBzZXJ2ZXIgbWVsdGRvd24uCiAqIFRoaXMgY2FuIG9ubHkgd29yayBpZiB0aGUgbG9vcCBkZXZpY2UgaXMgdXNlZCByZWFkLW9ubHksIGFuZCBpZiB0aGUKICogbmV3IGJhY2tpbmcgc3RvcmUgaXMgdGhlIHNhbWUgc2l6ZSBhbmQgdHlwZSBhcyB0aGUgb2xkIGJhY2tpbmcgc3RvcmUuCiAqLwpzdGF0aWMgaW50IGxvb3BfY2hhbmdlX2ZkKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBmaWxlICpsb19maWxlLAoJCSAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBpbnQgYXJnKQp7CglzdHJ1Y3QgZmlsZQkqZmlsZSwgKm9sZF9maWxlOwoJc3RydWN0IGlub2RlCSppbm9kZTsKCWludAkJZXJyb3I7CgoJZXJyb3IgPSAtRU5YSU87CglpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQoJCWdvdG8gb3V0OwoKCS8qIHRoZSBsb29wIGRldmljZSBoYXMgdG8gYmUgcmVhZC1vbmx5ICovCgllcnJvciA9IC1FSU5WQUw7CglpZiAoIShsby0+bG9fZmxhZ3MgJiBMT19GTEFHU19SRUFEX09OTFkpKQoJCWdvdG8gb3V0OwoKCWVycm9yID0gLUVCQURGOwoJZmlsZSA9IGZnZXQoYXJnKTsKCWlmICghZmlsZSkKCQlnb3RvIG91dDsKCglpbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKCW9sZF9maWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKCgllcnJvciA9IC1FSU5WQUw7CgoJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmICFTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCWdvdG8gb3V0X3B1dGY7CgoJLyogbmV3IGJhY2tpbmcgc3RvcmUgbmVlZHMgdG8gc3VwcG9ydCBsb29wIChlZyBzZW5kZmlsZSkgKi8KCWlmICghaW5vZGUtPmlfZm9wLT5zZW5kZmlsZSkKCQlnb3RvIG91dF9wdXRmOwoKCS8qIHNpemUgb2YgdGhlIG5ldyBiYWNraW5nIHN0b3JlIG5lZWRzIHRvIGJlIHRoZSBzYW1lICovCglpZiAoZ2V0X2xvb3Bfc2l6ZShsbywgZmlsZSkgIT0gZ2V0X2xvb3Bfc2l6ZShsbywgb2xkX2ZpbGUpKQoJCWdvdG8gb3V0X3B1dGY7CgoJLyogYW5kIC4uLiBzd2l0Y2ggKi8KCWVycm9yID0gbG9vcF9zd2l0Y2gobG8sIGZpbGUpOwoJaWYgKGVycm9yKQoJCWdvdG8gb3V0X3B1dGY7CgoJZnB1dChvbGRfZmlsZSk7CglyZXR1cm4gMDsKCiBvdXRfcHV0ZjoKCWZwdXQoZmlsZSk7CiBvdXQ6CglyZXR1cm4gZXJyb3I7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGlzX2xvb3BfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgaW5vZGUgKmkgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CgoJcmV0dXJuIGkgJiYgU19JU0JMSyhpLT5pX21vZGUpICYmIE1BSk9SKGktPmlfcmRldikgPT0gTE9PUF9NQUpPUjsKfQoKc3RhdGljIGludCBsb29wX3NldF9mZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgZmlsZSAqbG9fZmlsZSwKCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgaW50IGFyZykKewoJc3RydWN0IGZpbGUJKmZpbGUsICpmOwoJc3RydWN0IGlub2RlCSppbm9kZTsKCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwoJdW5zaWduZWQgbG9fYmxvY2tzaXplOwoJaW50CQlsb19mbGFncyA9IDA7CglpbnQJCWVycm9yOwoJbG9mZl90CQlzaXplOwoKCS8qIFRoaXMgaXMgc2FmZSwgc2luY2Ugd2UgaGF2ZSBhIHJlZmVyZW5jZSBmcm9tIG9wZW4oKS4gKi8KCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CgoJZXJyb3IgPSAtRUJBREY7CglmaWxlID0gZmdldChhcmcpOwoJaWYgKCFmaWxlKQoJCWdvdG8gb3V0OwoKCWVycm9yID0gLUVCVVNZOwoJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb191bmJvdW5kKQoJCWdvdG8gb3V0X3B1dGY7CgoJLyogQXZvaWQgcmVjdXJzaW9uICovCglmID0gZmlsZTsKCXdoaWxlIChpc19sb29wX2RldmljZShmKSkgewoJCXN0cnVjdCBsb29wX2RldmljZSAqbDsKCgkJaWYgKGYtPmZfbWFwcGluZy0+aG9zdC0+aV9yZGV2ID09IGxvX2ZpbGUtPmZfbWFwcGluZy0+aG9zdC0+aV9yZGV2KQoJCQlnb3RvIG91dF9wdXRmOwoKCQlsID0gZi0+Zl9tYXBwaW5nLT5ob3N0LT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKCQlpZiAobC0+bG9fc3RhdGUgPT0gTG9fdW5ib3VuZCkgewoJCQllcnJvciA9IC1FSU5WQUw7CgkJCWdvdG8gb3V0X3B1dGY7CgkJfQoJCWYgPSBsLT5sb19iYWNraW5nX2ZpbGU7Cgl9CgoJbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKCWlub2RlID0gbWFwcGluZy0+aG9zdDsKCglpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCgkJbG9fZmxhZ3MgfD0gTE9fRkxBR1NfUkVBRF9PTkxZOwoKCWVycm9yID0gLUVJTlZBTDsKCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKCQljb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zICphb3BzID0gbWFwcGluZy0+YV9vcHM7CgkJLyoKCQkgKiBJZiB3ZSBjYW4ndCByZWFkIC0gc29ycnkuIElmIHdlIG9ubHkgY2FuJ3Qgd3JpdGUgLSB3ZWxsLAoJCSAqIGl0J3MgZ29pbmcgdG8gYmUgcmVhZC1vbmx5LgoJCSAqLwoJCWlmICghZmlsZS0+Zl9vcC0+c2VuZGZpbGUpCgkJCWdvdG8gb3V0X3B1dGY7CgkJaWYgKGFvcHMtPnByZXBhcmVfd3JpdGUgJiYgYW9wcy0+Y29tbWl0X3dyaXRlKQoJCQlsb19mbGFncyB8PSBMT19GTEFHU19VU0VfQU9QUzsKCQlpZiAoIShsb19mbGFncyAmIExPX0ZMQUdTX1VTRV9BT1BTKSAmJiAhZmlsZS0+Zl9vcC0+d3JpdGUpCgkJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1JFQURfT05MWTsKCgkJbG9fYmxvY2tzaXplID0gU19JU0JMSyhpbm9kZS0+aV9tb2RlKSA/CgkJCWlub2RlLT5pX2JkZXYtPmJkX2Jsb2NrX3NpemUgOiBQQUdFX1NJWkU7CgoJCWVycm9yID0gMDsKCX0gZWxzZSB7CgkJZ290byBvdXRfcHV0ZjsKCX0KCglzaXplID0gZ2V0X2xvb3Bfc2l6ZShsbywgZmlsZSk7CgoJaWYgKChsb2ZmX3QpKHNlY3Rvcl90KXNpemUgIT0gc2l6ZSkgewoJCWVycm9yID0gLUVGQklHOwoJCWdvdG8gb3V0X3B1dGY7Cgl9CgoJaWYgKCEobG9fZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQoJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1JFQURfT05MWTsKCglzZXRfZGV2aWNlX3JvKGJkZXYsIChsb19mbGFncyAmIExPX0ZMQUdTX1JFQURfT05MWSkgIT0gMCk7CgoJbG8tPmxvX2Jsb2Nrc2l6ZSA9IGxvX2Jsb2Nrc2l6ZTsKCWxvLT5sb19kZXZpY2UgPSBiZGV2OwoJbG8tPmxvX2ZsYWdzID0gbG9fZmxhZ3M7Cglsby0+bG9fYmFja2luZ19maWxlID0gZmlsZTsKCWxvLT50cmFuc2ZlciA9IHRyYW5zZmVyX25vbmU7Cglsby0+aW9jdGwgPSBOVUxMOwoJbG8tPmxvX3NpemVsaW1pdCA9IDA7Cglsby0+b2xkX2dmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2sgJiB+KF9fR0ZQX0lPfF9fR0ZQX0ZTKSk7CgoJbG8tPmxvX2JpbyA9IGxvLT5sb19iaW90YWlsID0gTlVMTDsKCgkvKgoJICogc2V0IHF1ZXVlIG1ha2VfcmVxdWVzdF9mbiwgYW5kIGFkZCBsaW1pdHMgYmFzZWQgb24gbG93ZXIgbGV2ZWwKCSAqIGRldmljZQoJICovCglibGtfcXVldWVfbWFrZV9yZXF1ZXN0KGxvLT5sb19xdWV1ZSwgbG9vcF9tYWtlX3JlcXVlc3QpOwoJbG8tPmxvX3F1ZXVlLT5xdWV1ZWRhdGEgPSBsbzsKCWxvLT5sb19xdWV1ZS0+dW5wbHVnX2ZuID0gbG9vcF91bnBsdWc7CgoJc2V0X2NhcGFjaXR5KGRpc2tzW2xvLT5sb19udW1iZXJdLCBzaXplKTsKCWJkX3NldF9zaXplKGJkZXYsIHNpemUgPDwgOSk7CgoJc2V0X2Jsb2Nrc2l6ZShiZGV2LCBsb19ibG9ja3NpemUpOwoKCWxvLT5sb190aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShsb29wX3RocmVhZCwgbG8sICJsb29wJWQiLAoJCQkJCQlsby0+bG9fbnVtYmVyKTsKCWlmIChJU19FUlIobG8tPmxvX3RocmVhZCkpIHsKCQllcnJvciA9IFBUUl9FUlIobG8tPmxvX3RocmVhZCk7CgkJZ290byBvdXRfY2xyOwoJfQoJbG8tPmxvX3N0YXRlID0gTG9fYm91bmQ7Cgl3YWtlX3VwX3Byb2Nlc3MobG8tPmxvX3RocmVhZCk7CglyZXR1cm4gMDsKCm91dF9jbHI6Cglsby0+bG9fdGhyZWFkID0gTlVMTDsKCWxvLT5sb19kZXZpY2UgPSBOVUxMOwoJbG8tPmxvX2JhY2tpbmdfZmlsZSA9IE5VTEw7Cglsby0+bG9fZmxhZ3MgPSAwOwoJc2V0X2NhcGFjaXR5KGRpc2tzW2xvLT5sb19udW1iZXJdLCAwKTsKCWludmFsaWRhdGVfYmRldihiZGV2LCAwKTsKCWJkX3NldF9zaXplKGJkZXYsIDApOwoJbWFwcGluZ19zZXRfZ2ZwX21hc2sobWFwcGluZywgbG8tPm9sZF9nZnBfbWFzayk7Cglsby0+bG9fc3RhdGUgPSBMb191bmJvdW5kOwogb3V0X3B1dGY6CglmcHV0KGZpbGUpOwogb3V0OgoJLyogVGhpcyBpcyBzYWZlOiBvcGVuKCkgaXMgc3RpbGwgaG9sZGluZyBhIHJlZmVyZW5jZS4gKi8KCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwoJcmV0dXJuIGVycm9yOwp9CgpzdGF0aWMgaW50Cmxvb3BfcmVsZWFzZV94ZmVyKHN0cnVjdCBsb29wX2RldmljZSAqbG8pCnsKCWludCBlcnIgPSAwOwoJc3RydWN0IGxvb3BfZnVuY190YWJsZSAqeGZlciA9IGxvLT5sb19lbmNyeXB0aW9uOwoKCWlmICh4ZmVyKSB7CgkJaWYgKHhmZXItPnJlbGVhc2UpCgkJCWVyciA9IHhmZXItPnJlbGVhc2UobG8pOwoJCWxvLT50cmFuc2ZlciA9IE5VTEw7CgkJbG8tPmxvX2VuY3J5cHRpb24gPSBOVUxMOwoJCW1vZHVsZV9wdXQoeGZlci0+b3duZXIpOwoJfQoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludApsb29wX2luaXRfeGZlcihzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICp4ZmVyLAoJICAgICAgIGNvbnN0IHN0cnVjdCBsb29wX2luZm82NCAqaSkKewoJaW50IGVyciA9IDA7CgoJaWYgKHhmZXIpIHsKCQlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IHhmZXItPm93bmVyOwoKCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KG93bmVyKSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKHhmZXItPmluaXQpCgkJCWVyciA9IHhmZXItPmluaXQobG8sIGkpOwoJCWlmIChlcnIpCgkJCW1vZHVsZV9wdXQob3duZXIpOwoJCWVsc2UKCQkJbG8tPmxvX2VuY3J5cHRpb24gPSB4ZmVyOwoJfQoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBsb29wX2Nscl9mZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQp7CglzdHJ1Y3QgZmlsZSAqZmlscCA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CglnZnBfdCBnZnAgPSBsby0+b2xkX2dmcF9tYXNrOwoKCWlmIChsby0+bG9fc3RhdGUgIT0gTG9fYm91bmQpCgkJcmV0dXJuIC1FTlhJTzsKCglpZiAobG8tPmxvX3JlZmNudCA+IDEpCS8qIHdlIG5lZWRlZCBvbmUgZmQgZm9yIHRoZSBpb2N0bCAqLwoJCXJldHVybiAtRUJVU1k7CgoJaWYgKGZpbHAgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCglzcGluX2xvY2tfaXJxKCZsby0+bG9fbG9jayk7Cglsby0+bG9fc3RhdGUgPSBMb19ydW5kb3duOwoJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7CgoJa3RocmVhZF9zdG9wKGxvLT5sb190aHJlYWQpOwoKCWxvLT5sb19iYWNraW5nX2ZpbGUgPSBOVUxMOwoKCWxvb3BfcmVsZWFzZV94ZmVyKGxvKTsKCWxvLT50cmFuc2ZlciA9IE5VTEw7Cglsby0+aW9jdGwgPSBOVUxMOwoJbG8tPmxvX2RldmljZSA9IE5VTEw7Cglsby0+bG9fZW5jcnlwdGlvbiA9IE5VTEw7Cglsby0+bG9fb2Zmc2V0ID0gMDsKCWxvLT5sb19zaXplbGltaXQgPSAwOwoJbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPSAwOwoJbG8tPmxvX2ZsYWdzID0gMDsKCWxvLT5sb190aHJlYWQgPSBOVUxMOwoJbWVtc2V0KGxvLT5sb19lbmNyeXB0X2tleSwgMCwgTE9fS0VZX1NJWkUpOwoJbWVtc2V0KGxvLT5sb19jcnlwdF9uYW1lLCAwLCBMT19OQU1FX1NJWkUpOwoJbWVtc2V0KGxvLT5sb19maWxlX25hbWUsIDAsIExPX05BTUVfU0laRSk7CglpbnZhbGlkYXRlX2JkZXYoYmRldiwgMCk7CglzZXRfY2FwYWNpdHkoZGlza3NbbG8tPmxvX251bWJlcl0sIDApOwoJYmRfc2V0X3NpemUoYmRldiwgMCk7CgltYXBwaW5nX3NldF9nZnBfbWFzayhmaWxwLT5mX21hcHBpbmcsIGdmcCk7Cglsby0+bG9fc3RhdGUgPSBMb191bmJvdW5kOwoJZnB1dChmaWxwKTsKCS8qIFRoaXMgaXMgc2FmZTogb3BlbigpIGlzIHN0aWxsIGhvbGRpbmcgYSByZWZlcmVuY2UuICovCgltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50Cmxvb3Bfc2V0X3N0YXR1cyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBjb25zdCBzdHJ1Y3QgbG9vcF9pbmZvNjQgKmluZm8pCnsKCWludCBlcnI7CglzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICp4ZmVyOwoKCWlmIChsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSAmJiBsby0+bG9fa2V5X293bmVyICE9IGN1cnJlbnQtPnVpZCAmJgoJICAgICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQoJCXJldHVybiAtRVBFUk07CglpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQoJCXJldHVybiAtRU5YSU87CglpZiAoKHVuc2lnbmVkIGludCkgaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA+IExPX0tFWV9TSVpFKQoJCXJldHVybiAtRUlOVkFMOwoKCWVyciA9IGxvb3BfcmVsZWFzZV94ZmVyKGxvKTsKCWlmIChlcnIpCgkJcmV0dXJuIGVycjsKCglpZiAoaW5mby0+bG9fZW5jcnlwdF90eXBlKSB7CgkJdW5zaWduZWQgaW50IHR5cGUgPSBpbmZvLT5sb19lbmNyeXB0X3R5cGU7CgoJCWlmICh0eXBlID49IE1BWF9MT19DUllQVCkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJeGZlciA9IHhmZXJfZnVuY3NbdHlwZV07CgkJaWYgKHhmZXIgPT0gTlVMTCkKCQkJcmV0dXJuIC1FSU5WQUw7Cgl9IGVsc2UKCQl4ZmVyID0gTlVMTDsKCgllcnIgPSBsb29wX2luaXRfeGZlcihsbywgeGZlciwgaW5mbyk7CglpZiAoZXJyKQoJCXJldHVybiBlcnI7CgoJaWYgKGxvLT5sb19vZmZzZXQgIT0gaW5mby0+bG9fb2Zmc2V0IHx8CgkgICAgbG8tPmxvX3NpemVsaW1pdCAhPSBpbmZvLT5sb19zaXplbGltaXQpIHsKCQlsby0+bG9fb2Zmc2V0ID0gaW5mby0+bG9fb2Zmc2V0OwoJCWxvLT5sb19zaXplbGltaXQgPSBpbmZvLT5sb19zaXplbGltaXQ7CgkJaWYgKGZpZ3VyZV9sb29wX3NpemUobG8pKQoJCQlyZXR1cm4gLUVGQklHOwoJfQoKCW1lbWNweShsby0+bG9fZmlsZV9uYW1lLCBpbmZvLT5sb19maWxlX25hbWUsIExPX05BTUVfU0laRSk7CgltZW1jcHkobG8tPmxvX2NyeXB0X25hbWUsIGluZm8tPmxvX2NyeXB0X25hbWUsIExPX05BTUVfU0laRSk7Cglsby0+bG9fZmlsZV9uYW1lW0xPX05BTUVfU0laRS0xXSA9IDA7Cglsby0+bG9fY3J5cHRfbmFtZVtMT19OQU1FX1NJWkUtMV0gPSAwOwoKCWlmICgheGZlcikKCQl4ZmVyID0gJm5vbmVfZnVuY3M7Cglsby0+dHJhbnNmZXIgPSB4ZmVyLT50cmFuc2ZlcjsKCWxvLT5pb2N0bCA9IHhmZXItPmlvY3RsOwoKCWxvLT5sb19lbmNyeXB0X2tleV9zaXplID0gaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZTsKCWxvLT5sb19pbml0WzBdID0gaW5mby0+bG9faW5pdFswXTsKCWxvLT5sb19pbml0WzFdID0gaW5mby0+bG9faW5pdFsxXTsKCWlmIChpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplKSB7CgkJbWVtY3B5KGxvLT5sb19lbmNyeXB0X2tleSwgaW5mby0+bG9fZW5jcnlwdF9rZXksCgkJICAgICAgIGluZm8tPmxvX2VuY3J5cHRfa2V5X3NpemUpOwoJCWxvLT5sb19rZXlfb3duZXIgPSBjdXJyZW50LT51aWQ7Cgl9CQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50Cmxvb3BfZ2V0X3N0YXR1cyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgbG9vcF9pbmZvNjQgKmluZm8pCnsKCXN0cnVjdCBmaWxlICpmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKCXN0cnVjdCBrc3RhdCBzdGF0OwoJaW50IGVycm9yOwoKCWlmIChsby0+bG9fc3RhdGUgIT0gTG9fYm91bmQpCgkJcmV0dXJuIC1FTlhJTzsKCWVycm9yID0gdmZzX2dldGF0dHIoZmlsZS0+Zl92ZnNtbnQsIGZpbGUtPmZfZGVudHJ5LCAmc3RhdCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwoJaW5mby0+bG9fbnVtYmVyID0gbG8tPmxvX251bWJlcjsKCWluZm8tPmxvX2RldmljZSA9IGh1Z2VfZW5jb2RlX2RldihzdGF0LmRldik7CglpbmZvLT5sb19pbm9kZSA9IHN0YXQuaW5vOwoJaW5mby0+bG9fcmRldmljZSA9IGh1Z2VfZW5jb2RlX2Rldihsby0+bG9fZGV2aWNlID8gc3RhdC5yZGV2IDogc3RhdC5kZXYpOwoJaW5mby0+bG9fb2Zmc2V0ID0gbG8tPmxvX29mZnNldDsKCWluZm8tPmxvX3NpemVsaW1pdCA9IGxvLT5sb19zaXplbGltaXQ7CglpbmZvLT5sb19mbGFncyA9IGxvLT5sb19mbGFnczsKCW1lbWNweShpbmZvLT5sb19maWxlX25hbWUsIGxvLT5sb19maWxlX25hbWUsIExPX05BTUVfU0laRSk7CgltZW1jcHkoaW5mby0+bG9fY3J5cHRfbmFtZSwgbG8tPmxvX2NyeXB0X25hbWUsIExPX05BTUVfU0laRSk7CglpbmZvLT5sb19lbmNyeXB0X3R5cGUgPQoJCWxvLT5sb19lbmNyeXB0aW9uID8gbG8tPmxvX2VuY3J5cHRpb24tPm51bWJlciA6IDA7CglpZiAobG8tPmxvX2VuY3J5cHRfa2V5X3NpemUgJiYgY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewoJCWluZm8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPSBsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZTsKCQltZW1jcHkoaW5mby0+bG9fZW5jcnlwdF9rZXksIGxvLT5sb19lbmNyeXB0X2tleSwKCQkgICAgICAgbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUpOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCmxvb3BfaW5mbzY0X2Zyb21fb2xkKGNvbnN0IHN0cnVjdCBsb29wX2luZm8gKmluZm8sIHN0cnVjdCBsb29wX2luZm82NCAqaW5mbzY0KQp7CgltZW1zZXQoaW5mbzY0LCAwLCBzaXplb2YoKmluZm82NCkpOwoJaW5mbzY0LT5sb19udW1iZXIgPSBpbmZvLT5sb19udW1iZXI7CglpbmZvNjQtPmxvX2RldmljZSA9IGluZm8tPmxvX2RldmljZTsKCWluZm82NC0+bG9faW5vZGUgPSBpbmZvLT5sb19pbm9kZTsKCWluZm82NC0+bG9fcmRldmljZSA9IGluZm8tPmxvX3JkZXZpY2U7CglpbmZvNjQtPmxvX29mZnNldCA9IGluZm8tPmxvX29mZnNldDsKCWluZm82NC0+bG9fc2l6ZWxpbWl0ID0gMDsKCWluZm82NC0+bG9fZW5jcnlwdF90eXBlID0gaW5mby0+bG9fZW5jcnlwdF90eXBlOwoJaW5mbzY0LT5sb19lbmNyeXB0X2tleV9zaXplID0gaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZTsKCWluZm82NC0+bG9fZmxhZ3MgPSBpbmZvLT5sb19mbGFnczsKCWluZm82NC0+bG9faW5pdFswXSA9IGluZm8tPmxvX2luaXRbMF07CglpbmZvNjQtPmxvX2luaXRbMV0gPSBpbmZvLT5sb19pbml0WzFdOwoJaWYgKGluZm8tPmxvX2VuY3J5cHRfdHlwZSA9PSBMT19DUllQVF9DUllQVE9BUEkpCgkJbWVtY3B5KGluZm82NC0+bG9fY3J5cHRfbmFtZSwgaW5mby0+bG9fbmFtZSwgTE9fTkFNRV9TSVpFKTsKCWVsc2UKCQltZW1jcHkoaW5mbzY0LT5sb19maWxlX25hbWUsIGluZm8tPmxvX25hbWUsIExPX05BTUVfU0laRSk7CgltZW1jcHkoaW5mbzY0LT5sb19lbmNyeXB0X2tleSwgaW5mby0+bG9fZW5jcnlwdF9rZXksIExPX0tFWV9TSVpFKTsKfQoKc3RhdGljIGludApsb29wX2luZm82NF90b19vbGQoY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvNjQsIHN0cnVjdCBsb29wX2luZm8gKmluZm8pCnsKCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKCWluZm8tPmxvX251bWJlciA9IGluZm82NC0+bG9fbnVtYmVyOwoJaW5mby0+bG9fZGV2aWNlID0gaW5mbzY0LT5sb19kZXZpY2U7CglpbmZvLT5sb19pbm9kZSA9IGluZm82NC0+bG9faW5vZGU7CglpbmZvLT5sb19yZGV2aWNlID0gaW5mbzY0LT5sb19yZGV2aWNlOwoJaW5mby0+bG9fb2Zmc2V0ID0gaW5mbzY0LT5sb19vZmZzZXQ7CglpbmZvLT5sb19lbmNyeXB0X3R5cGUgPSBpbmZvNjQtPmxvX2VuY3J5cHRfdHlwZTsKCWluZm8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPSBpbmZvNjQtPmxvX2VuY3J5cHRfa2V5X3NpemU7CglpbmZvLT5sb19mbGFncyA9IGluZm82NC0+bG9fZmxhZ3M7CglpbmZvLT5sb19pbml0WzBdID0gaW5mbzY0LT5sb19pbml0WzBdOwoJaW5mby0+bG9faW5pdFsxXSA9IGluZm82NC0+bG9faW5pdFsxXTsKCWlmIChpbmZvLT5sb19lbmNyeXB0X3R5cGUgPT0gTE9fQ1JZUFRfQ1JZUFRPQVBJKQoJCW1lbWNweShpbmZvLT5sb19uYW1lLCBpbmZvNjQtPmxvX2NyeXB0X25hbWUsIExPX05BTUVfU0laRSk7CgllbHNlCgkJbWVtY3B5KGluZm8tPmxvX25hbWUsIGluZm82NC0+bG9fZmlsZV9uYW1lLCBMT19OQU1FX1NJWkUpOwoJbWVtY3B5KGluZm8tPmxvX2VuY3J5cHRfa2V5LCBpbmZvNjQtPmxvX2VuY3J5cHRfa2V5LCBMT19LRVlfU0laRSk7CgoJLyogZXJyb3IgaW4gY2FzZSB2YWx1ZXMgd2VyZSB0cnVuY2F0ZWQgKi8KCWlmIChpbmZvLT5sb19kZXZpY2UgIT0gaW5mbzY0LT5sb19kZXZpY2UgfHwKCSAgICBpbmZvLT5sb19yZGV2aWNlICE9IGluZm82NC0+bG9fcmRldmljZSB8fAoJICAgIGluZm8tPmxvX2lub2RlICE9IGluZm82NC0+bG9faW5vZGUgfHwKCSAgICBpbmZvLT5sb19vZmZzZXQgIT0gaW5mbzY0LT5sb19vZmZzZXQpCgkJcmV0dXJuIC1FT1ZFUkZMT1c7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbG9vcF9zZXRfc3RhdHVzX29sZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBjb25zdCBzdHJ1Y3QgbG9vcF9pbmZvIF9fdXNlciAqYXJnKQp7CglzdHJ1Y3QgbG9vcF9pbmZvIGluZm87CglzdHJ1Y3QgbG9vcF9pbmZvNjQgaW5mbzY0OwoKCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YgKHN0cnVjdCBsb29wX2luZm8pKSkKCQlyZXR1cm4gLUVGQVVMVDsKCWxvb3BfaW5mbzY0X2Zyb21fb2xkKCZpbmZvLCAmaW5mbzY0KTsKCXJldHVybiBsb29wX3NldF9zdGF0dXMobG8sICZpbmZvNjQpOwp9CgpzdGF0aWMgaW50Cmxvb3Bfc2V0X3N0YXR1czY0KHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGNvbnN0IHN0cnVjdCBsb29wX2luZm82NCBfX3VzZXIgKmFyZykKewoJc3RydWN0IGxvb3BfaW5mbzY0IGluZm82NDsKCglpZiAoY29weV9mcm9tX3VzZXIoJmluZm82NCwgYXJnLCBzaXplb2YgKHN0cnVjdCBsb29wX2luZm82NCkpKQoJCXJldHVybiAtRUZBVUxUOwoJcmV0dXJuIGxvb3Bfc2V0X3N0YXR1cyhsbywgJmluZm82NCk7Cn0KCnN0YXRpYyBpbnQKbG9vcF9nZXRfc3RhdHVzX29sZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgbG9vcF9pbmZvIF9fdXNlciAqYXJnKSB7CglzdHJ1Y3QgbG9vcF9pbmZvIGluZm87CglzdHJ1Y3QgbG9vcF9pbmZvNjQgaW5mbzY0OwoJaW50IGVyciA9IDA7CgoJaWYgKCFhcmcpCgkJZXJyID0gLUVJTlZBTDsKCWlmICghZXJyKQoJCWVyciA9IGxvb3BfZ2V0X3N0YXR1cyhsbywgJmluZm82NCk7CglpZiAoIWVycikKCQllcnIgPSBsb29wX2luZm82NF90b19vbGQoJmluZm82NCwgJmluZm8pOwoJaWYgKCFlcnIgJiYgY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCgkJZXJyID0gLUVGQVVMVDsKCglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50Cmxvb3BfZ2V0X3N0YXR1czY0KHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBsb29wX2luZm82NCBfX3VzZXIgKmFyZykgewoJc3RydWN0IGxvb3BfaW5mbzY0IGluZm82NDsKCWludCBlcnIgPSAwOwoKCWlmICghYXJnKQoJCWVyciA9IC1FSU5WQUw7CglpZiAoIWVycikKCQllcnIgPSBsb29wX2dldF9zdGF0dXMobG8sICZpbmZvNjQpOwoJaWYgKCFlcnIgJiYgY29weV90b191c2VyKGFyZywgJmluZm82NCwgc2l6ZW9mKGluZm82NCkpKQoJCWVyciA9IC1FRkFVTFQ7CgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBsb19pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAoJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CglpbnQgZXJyOwoKCW11dGV4X2xvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoJc3dpdGNoIChjbWQpIHsKCWNhc2UgTE9PUF9TRVRfRkQ6CgkJZXJyID0gbG9vcF9zZXRfZmQobG8sIGZpbGUsIGlub2RlLT5pX2JkZXYsIGFyZyk7CgkJYnJlYWs7CgljYXNlIExPT1BfQ0hBTkdFX0ZEOgoJCWVyciA9IGxvb3BfY2hhbmdlX2ZkKGxvLCBmaWxlLCBpbm9kZS0+aV9iZGV2LCBhcmcpOwoJCWJyZWFrOwoJY2FzZSBMT09QX0NMUl9GRDoKCQllcnIgPSBsb29wX2Nscl9mZChsbywgaW5vZGUtPmlfYmRldik7CgkJYnJlYWs7CgljYXNlIExPT1BfU0VUX1NUQVRVUzoKCQllcnIgPSBsb29wX3NldF9zdGF0dXNfb2xkKGxvLCAoc3RydWN0IGxvb3BfaW5mbyBfX3VzZXIgKikgYXJnKTsKCQlicmVhazsKCWNhc2UgTE9PUF9HRVRfU1RBVFVTOgoJCWVyciA9IGxvb3BfZ2V0X3N0YXR1c19vbGQobG8sIChzdHJ1Y3QgbG9vcF9pbmZvIF9fdXNlciAqKSBhcmcpOwoJCWJyZWFrOwoJY2FzZSBMT09QX1NFVF9TVEFUVVM2NDoKCQllcnIgPSBsb29wX3NldF9zdGF0dXM2NChsbywgKHN0cnVjdCBsb29wX2luZm82NCBfX3VzZXIgKikgYXJnKTsKCQlicmVhazsKCWNhc2UgTE9PUF9HRVRfU1RBVFVTNjQ6CgkJZXJyID0gbG9vcF9nZXRfc3RhdHVzNjQobG8sIChzdHJ1Y3QgbG9vcF9pbmZvNjQgX191c2VyICopIGFyZyk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWVyciA9IGxvLT5pb2N0bCA/IGxvLT5pb2N0bChsbywgY21kLCBhcmcpIDogLUVJTlZBTDsKCX0KCW11dGV4X3VubG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CglyZXR1cm4gZXJyOwp9CgojaWZkZWYgQ09ORklHX0NPTVBBVApzdHJ1Y3QgY29tcGF0X2xvb3BfaW5mbyB7Cgljb21wYXRfaW50X3QJbG9fbnVtYmVyOyAgICAgIC8qIGlvY3RsIHIvbyAqLwoJY29tcGF0X2Rldl90CWxvX2RldmljZTsgICAgICAvKiBpb2N0bCByL28gKi8KCWNvbXBhdF91bG9uZ190CWxvX2lub2RlOyAgICAgICAvKiBpb2N0bCByL28gKi8KCWNvbXBhdF9kZXZfdAlsb19yZGV2aWNlOyAgICAgLyogaW9jdGwgci9vICovCgljb21wYXRfaW50X3QJbG9fb2Zmc2V0OwoJY29tcGF0X2ludF90CWxvX2VuY3J5cHRfdHlwZTsKCWNvbXBhdF9pbnRfdAlsb19lbmNyeXB0X2tleV9zaXplOyAgICAvKiBpb2N0bCB3L28gKi8KCWNvbXBhdF9pbnRfdAlsb19mbGFnczsgICAgICAgLyogaW9jdGwgci9vICovCgljaGFyCQlsb19uYW1lW0xPX05BTUVfU0laRV07Cgl1bnNpZ25lZCBjaGFyCWxvX2VuY3J5cHRfa2V5W0xPX0tFWV9TSVpFXTsgLyogaW9jdGwgdy9vICovCgljb21wYXRfdWxvbmdfdAlsb19pbml0WzJdOwoJY2hhcgkJcmVzZXJ2ZWRbNF07Cn07CgovKgogKiBUcmFuc2ZlciAzMi1iaXQgY29tcGF0aWJpbGl0eSBzdHJ1Y3R1cmUgaW4gdXNlcnNwYWNlIHRvIDY0LWJpdCBsb29wIGluZm8KICogLSBub2lubGluZWQgdG8gcmVkdWNlIHN0YWNrIHNwYWNlIHVzYWdlIGluIG1haW4gcGFydCBvZiBkcml2ZXIKICovCnN0YXRpYyBub2lubGluZSBpbnQKbG9vcF9pbmZvNjRfZnJvbV9jb21wYXQoY29uc3Qgc3RydWN0IGNvbXBhdF9sb29wX2luZm8gKmFyZywKCQkJc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvNjQpCnsKCXN0cnVjdCBjb21wYXRfbG9vcF9pbmZvIGluZm87CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJbWVtc2V0KGluZm82NCwgMCwgc2l6ZW9mKCppbmZvNjQpKTsKCWluZm82NC0+bG9fbnVtYmVyID0gaW5mby5sb19udW1iZXI7CglpbmZvNjQtPmxvX2RldmljZSA9IGluZm8ubG9fZGV2aWNlOwoJaW5mbzY0LT5sb19pbm9kZSA9IGluZm8ubG9faW5vZGU7CglpbmZvNjQtPmxvX3JkZXZpY2UgPSBpbmZvLmxvX3JkZXZpY2U7CglpbmZvNjQtPmxvX29mZnNldCA9IGluZm8ubG9fb2Zmc2V0OwoJaW5mbzY0LT5sb19zaXplbGltaXQgPSAwOwoJaW5mbzY0LT5sb19lbmNyeXB0X3R5cGUgPSBpbmZvLmxvX2VuY3J5cHRfdHlwZTsKCWluZm82NC0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IGluZm8ubG9fZW5jcnlwdF9rZXlfc2l6ZTsKCWluZm82NC0+bG9fZmxhZ3MgPSBpbmZvLmxvX2ZsYWdzOwoJaW5mbzY0LT5sb19pbml0WzBdID0gaW5mby5sb19pbml0WzBdOwoJaW5mbzY0LT5sb19pbml0WzFdID0gaW5mby5sb19pbml0WzFdOwoJaWYgKGluZm8ubG9fZW5jcnlwdF90eXBlID09IExPX0NSWVBUX0NSWVBUT0FQSSkKCQltZW1jcHkoaW5mbzY0LT5sb19jcnlwdF9uYW1lLCBpbmZvLmxvX25hbWUsIExPX05BTUVfU0laRSk7CgllbHNlCgkJbWVtY3B5KGluZm82NC0+bG9fZmlsZV9uYW1lLCBpbmZvLmxvX25hbWUsIExPX05BTUVfU0laRSk7CgltZW1jcHkoaW5mbzY0LT5sb19lbmNyeXB0X2tleSwgaW5mby5sb19lbmNyeXB0X2tleSwgTE9fS0VZX1NJWkUpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIFRyYW5zZmVyIDY0LWJpdCBsb29wIGluZm8gdG8gMzItYml0IGNvbXBhdGliaWxpdHkgc3RydWN0dXJlIGluIHVzZXJzcGFjZQogKiAtIG5vaW5saW5lZCB0byByZWR1Y2Ugc3RhY2sgc3BhY2UgdXNhZ2UgaW4gbWFpbiBwYXJ0IG9mIGRyaXZlcgogKi8Kc3RhdGljIG5vaW5saW5lIGludApsb29wX2luZm82NF90b19jb21wYXQoY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvNjQsCgkJICAgICAgc3RydWN0IGNvbXBhdF9sb29wX2luZm8gX191c2VyICphcmcpCnsKCXN0cnVjdCBjb21wYXRfbG9vcF9pbmZvIGluZm87CgoJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwoJaW5mby5sb19udW1iZXIgPSBpbmZvNjQtPmxvX251bWJlcjsKCWluZm8ubG9fZGV2aWNlID0gaW5mbzY0LT5sb19kZXZpY2U7CglpbmZvLmxvX2lub2RlID0gaW5mbzY0LT5sb19pbm9kZTsKCWluZm8ubG9fcmRldmljZSA9IGluZm82NC0+bG9fcmRldmljZTsKCWluZm8ubG9fb2Zmc2V0ID0gaW5mbzY0LT5sb19vZmZzZXQ7CglpbmZvLmxvX2VuY3J5cHRfdHlwZSA9IGluZm82NC0+bG9fZW5jcnlwdF90eXBlOwoJaW5mby5sb19lbmNyeXB0X2tleV9zaXplID0gaW5mbzY0LT5sb19lbmNyeXB0X2tleV9zaXplOwoJaW5mby5sb19mbGFncyA9IGluZm82NC0+bG9fZmxhZ3M7CglpbmZvLmxvX2luaXRbMF0gPSBpbmZvNjQtPmxvX2luaXRbMF07CglpbmZvLmxvX2luaXRbMV0gPSBpbmZvNjQtPmxvX2luaXRbMV07CglpZiAoaW5mby5sb19lbmNyeXB0X3R5cGUgPT0gTE9fQ1JZUFRfQ1JZUFRPQVBJKQoJCW1lbWNweShpbmZvLmxvX25hbWUsIGluZm82NC0+bG9fY3J5cHRfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCWVsc2UKCQltZW1jcHkoaW5mby5sb19uYW1lLCBpbmZvNjQtPmxvX2ZpbGVfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCW1lbWNweShpbmZvLmxvX2VuY3J5cHRfa2V5LCBpbmZvNjQtPmxvX2VuY3J5cHRfa2V5LCBMT19LRVlfU0laRSk7CgoJLyogZXJyb3IgaW4gY2FzZSB2YWx1ZXMgd2VyZSB0cnVuY2F0ZWQgKi8KCWlmIChpbmZvLmxvX2RldmljZSAhPSBpbmZvNjQtPmxvX2RldmljZSB8fAoJICAgIGluZm8ubG9fcmRldmljZSAhPSBpbmZvNjQtPmxvX3JkZXZpY2UgfHwKCSAgICBpbmZvLmxvX2lub2RlICE9IGluZm82NC0+bG9faW5vZGUgfHwKCSAgICBpbmZvLmxvX29mZnNldCAhPSBpbmZvNjQtPmxvX29mZnNldCB8fAoJICAgIGluZm8ubG9faW5pdFswXSAhPSBpbmZvNjQtPmxvX2luaXRbMF0gfHwKCSAgICBpbmZvLmxvX2luaXRbMV0gIT0gaW5mbzY0LT5sb19pbml0WzFdKQoJCXJldHVybiAtRU9WRVJGTE9XOwoKCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKCQlyZXR1cm4gLUVGQVVMVDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50Cmxvb3Bfc2V0X3N0YXR1c19jb21wYXQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywKCQkgICAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9sb29wX2luZm8gX191c2VyICphcmcpCnsKCXN0cnVjdCBsb29wX2luZm82NCBpbmZvNjQ7CglpbnQgcmV0OwoKCXJldCA9IGxvb3BfaW5mbzY0X2Zyb21fY29tcGF0KGFyZywgJmluZm82NCk7CglpZiAocmV0IDwgMCkKCQlyZXR1cm4gcmV0OwoJcmV0dXJuIGxvb3Bfc2V0X3N0YXR1cyhsbywgJmluZm82NCk7Cn0KCnN0YXRpYyBpbnQKbG9vcF9nZXRfc3RhdHVzX2NvbXBhdChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLAoJCSAgICAgICBzdHJ1Y3QgY29tcGF0X2xvb3BfaW5mbyBfX3VzZXIgKmFyZykKewoJc3RydWN0IGxvb3BfaW5mbzY0IGluZm82NDsKCWludCBlcnIgPSAwOwoKCWlmICghYXJnKQoJCWVyciA9IC1FSU5WQUw7CglpZiAoIWVycikKCQllcnIgPSBsb29wX2dldF9zdGF0dXMobG8sICZpbmZvNjQpOwoJaWYgKCFlcnIpCgkJZXJyID0gbG9vcF9pbmZvNjRfdG9fY29tcGF0KCZpbmZvNjQsIGFyZyk7CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgbG9uZyBsb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CglzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwoJaW50IGVycjsKCglsb2NrX2tlcm5lbCgpOwoJc3dpdGNoKGNtZCkgewoJY2FzZSBMT09QX1NFVF9TVEFUVVM6CgkJbXV0ZXhfbG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CgkJZXJyID0gbG9vcF9zZXRfc3RhdHVzX2NvbXBhdCgKCQkJbG8sIChjb25zdCBzdHJ1Y3QgY29tcGF0X2xvb3BfaW5mbyBfX3VzZXIgKikgYXJnKTsKCQltdXRleF91bmxvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoJCWJyZWFrOwoJY2FzZSBMT09QX0dFVF9TVEFUVVM6CgkJbXV0ZXhfbG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CgkJZXJyID0gbG9vcF9nZXRfc3RhdHVzX2NvbXBhdCgKCQkJbG8sIChzdHJ1Y3QgY29tcGF0X2xvb3BfaW5mbyBfX3VzZXIgKikgYXJnKTsKCQltdXRleF91bmxvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoJCWJyZWFrOwoJY2FzZSBMT09QX0NMUl9GRDoKCWNhc2UgTE9PUF9HRVRfU1RBVFVTNjQ6CgljYXNlIExPT1BfU0VUX1NUQVRVUzY0OgoJCWFyZyA9ICh1bnNpZ25lZCBsb25nKSBjb21wYXRfcHRyKGFyZyk7CgljYXNlIExPT1BfU0VUX0ZEOgoJY2FzZSBMT09QX0NIQU5HRV9GRDoKCQllcnIgPSBsb19pb2N0bChpbm9kZSwgZmlsZSwgY21kLCBhcmcpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQllcnIgPSAtRU5PSU9DVExDTUQ7CgkJYnJlYWs7Cgl9Cgl1bmxvY2tfa2VybmVsKCk7CglyZXR1cm4gZXJyOwp9CiNlbmRpZgoKc3RhdGljIGludCBsb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwoKCW11dGV4X2xvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoJbG8tPmxvX3JlZmNudCsrOwoJbXV0ZXhfdW5sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBsb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwoKCW11dGV4X2xvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoJLS1sby0+bG9fcmVmY250OwoJbXV0ZXhfdW5sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBsb19mb3BzID0gewoJLm93bmVyID0JVEhJU19NT0RVTEUsCgkub3BlbiA9CQlsb19vcGVuLAoJLnJlbGVhc2UgPQlsb19yZWxlYXNlLAoJLmlvY3RsID0JbG9faW9jdGwsCiNpZmRlZiBDT05GSUdfQ09NUEFUCgkuY29tcGF0X2lvY3RsID0JbG9fY29tcGF0X2lvY3RsLAojZW5kaWYKfTsKCi8qCiAqIEFuZCBub3cgdGhlIG1vZHVsZXMgY29kZSBhbmQga2VybmVsIGludGVyZmFjZS4KICovCm1vZHVsZV9wYXJhbShtYXhfbG9vcCwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhtYXhfbG9vcCwgIk1heGltdW0gbnVtYmVyIG9mIGxvb3AgZGV2aWNlcyAoMS0yNTYpIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FMSUFTX0JMT0NLREVWX01BSk9SKExPT1BfTUFKT1IpOwoKaW50IGxvb3BfcmVnaXN0ZXJfdHJhbnNmZXIoc3RydWN0IGxvb3BfZnVuY190YWJsZSAqZnVuY3MpCnsKCXVuc2lnbmVkIGludCBuID0gZnVuY3MtPm51bWJlcjsKCglpZiAobiA+PSBNQVhfTE9fQ1JZUFQgfHwgeGZlcl9mdW5jc1tuXSkKCQlyZXR1cm4gLUVJTlZBTDsKCXhmZXJfZnVuY3Nbbl0gPSBmdW5jczsKCXJldHVybiAwOwp9CgppbnQgbG9vcF91bnJlZ2lzdGVyX3RyYW5zZmVyKGludCBudW1iZXIpCnsKCXVuc2lnbmVkIGludCBuID0gbnVtYmVyOwoJc3RydWN0IGxvb3BfZGV2aWNlICpsbzsKCXN0cnVjdCBsb29wX2Z1bmNfdGFibGUgKnhmZXI7CgoJaWYgKG4gPT0gMCB8fCBuID49IE1BWF9MT19DUllQVCB8fCAoeGZlciA9IHhmZXJfZnVuY3Nbbl0pID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJeGZlcl9mdW5jc1tuXSA9IE5VTEw7CgoJZm9yIChsbyA9ICZsb29wX2RldlswXTsgbG8gPCAmbG9vcF9kZXZbbWF4X2xvb3BdOyBsbysrKSB7CgkJbXV0ZXhfbG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CgoJCWlmIChsby0+bG9fZW5jcnlwdGlvbiA9PSB4ZmVyKQoJCQlsb29wX3JlbGVhc2VfeGZlcihsbyk7CgoJCW11dGV4X3VubG9jaygmbG8tPmxvX2N0bF9tdXRleCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCkVYUE9SVF9TWU1CT0wobG9vcF9yZWdpc3Rlcl90cmFuc2Zlcik7CkVYUE9SVF9TWU1CT0wobG9vcF91bnJlZ2lzdGVyX3RyYW5zZmVyKTsKCnN0YXRpYyBpbnQgX19pbml0IGxvb3BfaW5pdCh2b2lkKQp7CglpbnQJaTsKCglpZiAobWF4X2xvb3AgPCAxIHx8IG1heF9sb29wID4gMjU2KSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9vcDogaW52YWxpZCBtYXhfbG9vcCAobXVzdCBiZSBiZXR3ZWVuIgoJCQkJICAgICIgMSBhbmQgMjU2KSwgdXNpbmcgZGVmYXVsdCAoOClcbiIpOwoJCW1heF9sb29wID0gODsKCX0KCglpZiAocmVnaXN0ZXJfYmxrZGV2KExPT1BfTUFKT1IsICJsb29wIikpCgkJcmV0dXJuIC1FSU87CgoJbG9vcF9kZXYgPSBrbWFsbG9jKG1heF9sb29wICogc2l6ZW9mKHN0cnVjdCBsb29wX2RldmljZSksIEdGUF9LRVJORUwpOwoJaWYgKCFsb29wX2RldikKCQlnb3RvIG91dF9tZW0xOwoJbWVtc2V0KGxvb3BfZGV2LCAwLCBtYXhfbG9vcCAqIHNpemVvZihzdHJ1Y3QgbG9vcF9kZXZpY2UpKTsKCglkaXNrcyA9IGttYWxsb2MobWF4X2xvb3AgKiBzaXplb2Yoc3RydWN0IGdlbmRpc2sgKiksIEdGUF9LRVJORUwpOwoJaWYgKCFkaXNrcykKCQlnb3RvIG91dF9tZW0yOwoKCWZvciAoaSA9IDA7IGkgPCBtYXhfbG9vcDsgaSsrKSB7CgkJZGlza3NbaV0gPSBhbGxvY19kaXNrKDEpOwoJCWlmICghZGlza3NbaV0pCgkJCWdvdG8gb3V0X21lbTM7Cgl9CgoJZm9yIChpID0gMDsgaSA8IG1heF9sb29wOyBpKyspIHsKCQlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gJmxvb3BfZGV2W2ldOwoJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGlza3NbaV07CgoJCW1lbXNldChsbywgMCwgc2l6ZW9mKCpsbykpOwoJCWxvLT5sb19xdWV1ZSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKCQlpZiAoIWxvLT5sb19xdWV1ZSkKCQkJZ290byBvdXRfbWVtNDsKCQltdXRleF9pbml0KCZsby0+bG9fY3RsX211dGV4KTsKCQlsby0+bG9fbnVtYmVyID0gaTsKCQlsby0+bG9fdGhyZWFkID0gTlVMTDsKCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZsby0+bG9fZXZlbnQpOwoJCXNwaW5fbG9ja19pbml0KCZsby0+bG9fbG9jayk7CgkJZGlzay0+bWFqb3IgPSBMT09QX01BSk9SOwoJCWRpc2stPmZpcnN0X21pbm9yID0gaTsKCQlkaXNrLT5mb3BzID0gJmxvX2ZvcHM7CgkJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJsb29wJWQiLCBpKTsKCQlkaXNrLT5wcml2YXRlX2RhdGEgPSBsbzsKCQlkaXNrLT5xdWV1ZSA9IGxvLT5sb19xdWV1ZTsKCX0KCgkvKiBXZSBjYW5ub3QgZmFpbCBhZnRlciB3ZSBjYWxsIHRoaXMsIHNvIGFub3RoZXIgbG9vcCEqLwoJZm9yIChpID0gMDsgaSA8IG1heF9sb29wOyBpKyspCgkJYWRkX2Rpc2soZGlza3NbaV0pOwoJcHJpbnRrKEtFUk5fSU5GTyAibG9vcDogbG9hZGVkIChtYXggJWQgZGV2aWNlcylcbiIsIG1heF9sb29wKTsKCXJldHVybiAwOwoKb3V0X21lbTQ6Cgl3aGlsZSAoaS0tKQoJCWJsa19jbGVhbnVwX3F1ZXVlKGxvb3BfZGV2W2ldLmxvX3F1ZXVlKTsKCWkgPSBtYXhfbG9vcDsKb3V0X21lbTM6Cgl3aGlsZSAoaS0tKQoJCXB1dF9kaXNrKGRpc2tzW2ldKTsKCWtmcmVlKGRpc2tzKTsKb3V0X21lbTI6CglrZnJlZShsb29wX2Rldik7Cm91dF9tZW0xOgoJdW5yZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKTsKCXByaW50ayhLRVJOX0VSUiAibG9vcDogcmFuIG91dCBvZiBtZW1vcnlcbiIpOwoJcmV0dXJuIC1FTk9NRU07Cn0KCnN0YXRpYyB2b2lkIGxvb3BfZXhpdCh2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgbWF4X2xvb3A7IGkrKykgewoJCWRlbF9nZW5kaXNrKGRpc2tzW2ldKTsKCQlibGtfY2xlYW51cF9xdWV1ZShsb29wX2RldltpXS5sb19xdWV1ZSk7CgkJcHV0X2Rpc2soZGlza3NbaV0pOwoJfQoJaWYgKHVucmVnaXN0ZXJfYmxrZGV2KExPT1BfTUFKT1IsICJsb29wIikpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9vcDogY2Fubm90IHVucmVnaXN0ZXIgYmxrZGV2XG4iKTsKCglrZnJlZShkaXNrcyk7CglrZnJlZShsb29wX2Rldik7Cn0KCm1vZHVsZV9pbml0KGxvb3BfaW5pdCk7Cm1vZHVsZV9leGl0KGxvb3BfZXhpdCk7CgojaWZuZGVmIE1PRFVMRQpzdGF0aWMgaW50IF9faW5pdCBtYXhfbG9vcF9zZXR1cChjaGFyICpzdHIpCnsKCW1heF9sb29wID0gc2ltcGxlX3N0cnRvbChzdHIsIE5VTEwsIDApOwoJcmV0dXJuIDE7Cn0KCl9fc2V0dXAoIm1heF9sb29wPSIsIG1heF9sb29wX3NldHVwKTsKI2VuZGlmCg==