LyoKICogIGxpbnV4L2RyaXZlcnMvYmxvY2svbG9vcC5jCiAqCiAqICBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDMvMjkvOTMKICoKICogQ29weXJpZ2h0IDE5OTMgYnkgVGhlb2RvcmUgVHMnby4gIFJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSBpcwogKiBwZXJtaXR0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgogKgogKiBERVMgZW5jcnlwdGlvbiBwbHVzIHNvbWUgbWlub3IgY2hhbmdlcyBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIDMwLU1BWS0xOTkzCiAqIG1vcmUgREVTIGVuY3J5cHRpb24gcGx1cyBJREVBIGVuY3J5cHRpb24gYnkgTmljaG9sYXMgSi4gTGVvbiwgSnVuZSAyMCwgMTk5NgogKgogKiBNb2R1bGFyaXplZCBhbmQgdXBkYXRlZCBmb3IgMS4xLjE2IGtlcm5lbCAtIE1pdGNoIERzb3V6YSAyOHRoIE1heSAxOTk0CiAqIEFkYXB0ZWQgZm9yIDEuMy41OSBrZXJuZWwgLSBBbmRyaWVzIEJyb3V3ZXIsIDEgRmViIDE5OTYKICoKICogRml4ZWQgZG9fbG9vcF9yZXF1ZXN0KCkgcmUtZW50cmFuY3kgLSBWaW5jZW50LlJlbmFyZGlhc0B3YXcuY29tIE1hciAyMCwgMTk5NwogKgogKiBBZGRlZCBkZXZmcyBzdXBwb3J0IC0gUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+IDE2LUphbi0xOTk4CiAqCiAqIEhhbmRsZSBzcGFyc2UgYmFja2luZyBmaWxlcyBjb3JyZWN0bHkgLSBLZW5uIEh1bWJvcmcsIEp1biAyOCwgMTk5OAogKgogKiBMb2FkYWJsZSBtb2R1bGVzIGFuZCBvdGhlciBmaXhlcyBieSBBSywgMTk5OAogKgogKiBNYWtlIHJlYWwgYmxvY2sgbnVtYmVyIGF2YWlsYWJsZSB0byBkb3duc3RyZWFtIHRyYW5zZmVyIGZ1bmN0aW9ucywgZW5hYmxlcwogKiBDQkMgKGFuZCByZWxhdGl2ZXMpIG1vZGUgZW5jcnlwdGlvbiByZXF1aXJpbmcgdW5pcXVlIElWcyBwZXIgZGF0YSBibG9jay4KICogUmVlZCBILiBQZXR0eSwgcmhwQGRyYXBlci5uZXQKICoKICogTWF4aW11bSBudW1iZXIgb2YgbG9vcCBkZXZpY2VzIG5vdyBkeW5hbWljIHZpYSBtYXhfbG9vcCBtb2R1bGUgcGFyYW1ldGVyLgogKiBSdXNzZWxsIEtyb2xsIDxya3JvbGxAZXhwbG9pdHMub3JnPiAxOTk5MDcwMQogKgogKiBNYXhpbXVtIG51bWJlciBvZiBsb29wIGRldmljZXMgd2hlbiBjb21waWxlZC1pbiBub3cgc2VsZWN0YWJsZSBieSBwYXNzaW5nCiAqIG1heF9sb29wPTwxLTI1NT4gdG8gdGhlIGtlcm5lbCBvbiBib290LgogKiBFcmlrIEkuIEJvbHP4LCA8ZXJpa2lAaGltb2xkZS5ubz4sIE9jdCAzMSwgMTk5OQogKgogKiBDb21wbGV0ZWx5IHJld3JpdGUgcmVxdWVzdCBoYW5kbGluZyB0byBiZSBtYWtlX3JlcXVlc3RfZm4gc3R5bGUgYW5kCiAqIG5vbiBibG9ja2luZywgcHVzaGluZyB3b3JrIHRvIGEgaGVscGVyIHRocmVhZC4gTG90cyBvZiBmaXhlcyBmcm9tCiAqIEFsIFZpcm8gdG9vLgogKiBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPiwgTm92IDIwMDAKICoKICogU3VwcG9ydCB1cCB0byAyNTYgbG9vcCBkZXZpY2VzCiAqIEhlaW56IE1hdWVsc2hhZ2VuIDxtZ2VAc2lzdGluYS5jb20+LCBGZWIgMjAwMgogKgogKiBTdXBwb3J0IGZvciBmYWxsaW5nIGJhY2sgb24gdGhlIHdyaXRlIGZpbGUgb3BlcmF0aW9uIHdoZW4gdGhlIGFkZHJlc3Mgc3BhY2UKICogb3BlcmF0aW9ucyBwcmVwYXJlX3dyaXRlIGFuZC9vciBjb21taXRfd3JpdGUgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlCiAqIGJhY2tpbmcgZmlsZXN5c3RlbS4KICogQW50b24gQWx0YXBhcm1ha292LCAxNiBGZWIgMjAwNQogKgogKiBTdGlsbCBUbyBGaXg6CiAqIC0gQWR2aXNvcnkgbG9ja2luZyBpcyBpZ25vcmVkIGhlcmUuCiAqIC0gU2hvdWxkIHVzZSBhbiBvd24gQ0FQXyogY2F0ZWdvcnkgaW5zdGVhZCBvZiBDQVBfU1lTX0FETUlOCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgvZmlsZS5oPgojaW5jbHVkZSA8bGludXgvc3RhdC5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgojaW5jbHVkZSA8bGludXgvc3dhcC5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvbG9vcC5oPgojaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgaW52YWxpZGF0ZV9iZGV2KCkgKi8KI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgojaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgojaW5jbHVkZSA8bGludXgvc3BsaWNlLmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCnN0YXRpYyBMSVNUX0hFQUQobG9vcF9kZXZpY2VzKTsKc3RhdGljIERFRklORV9NVVRFWChsb29wX2RldmljZXNfbXV0ZXgpOwoKLyoKICogVHJhbnNmZXIgZnVuY3Rpb25zCiAqLwpzdGF0aWMgaW50IHRyYW5zZmVyX25vbmUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgaW50IGNtZCwKCQkJIHN0cnVjdCBwYWdlICpyYXdfcGFnZSwgdW5zaWduZWQgcmF3X29mZiwKCQkJIHN0cnVjdCBwYWdlICpsb29wX3BhZ2UsIHVuc2lnbmVkIGxvb3Bfb2ZmLAoJCQkgaW50IHNpemUsIHNlY3Rvcl90IHJlYWxfYmxvY2spCnsKCWNoYXIgKnJhd19idWYgPSBrbWFwX2F0b21pYyhyYXdfcGFnZSwgS01fVVNFUjApICsgcmF3X29mZjsKCWNoYXIgKmxvb3BfYnVmID0ga21hcF9hdG9taWMobG9vcF9wYWdlLCBLTV9VU0VSMSkgKyBsb29wX29mZjsKCglpZiAoY21kID09IFJFQUQpCgkJbWVtY3B5KGxvb3BfYnVmLCByYXdfYnVmLCBzaXplKTsKCWVsc2UKCQltZW1jcHkocmF3X2J1ZiwgbG9vcF9idWYsIHNpemUpOwoKCWt1bm1hcF9hdG9taWMocmF3X2J1ZiwgS01fVVNFUjApOwoJa3VubWFwX2F0b21pYyhsb29wX2J1ZiwgS01fVVNFUjEpOwoJY29uZF9yZXNjaGVkKCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB0cmFuc2Zlcl94b3Ioc3RydWN0IGxvb3BfZGV2aWNlICpsbywgaW50IGNtZCwKCQkJc3RydWN0IHBhZ2UgKnJhd19wYWdlLCB1bnNpZ25lZCByYXdfb2ZmLAoJCQlzdHJ1Y3QgcGFnZSAqbG9vcF9wYWdlLCB1bnNpZ25lZCBsb29wX29mZiwKCQkJaW50IHNpemUsIHNlY3Rvcl90IHJlYWxfYmxvY2spCnsKCWNoYXIgKnJhd19idWYgPSBrbWFwX2F0b21pYyhyYXdfcGFnZSwgS01fVVNFUjApICsgcmF3X29mZjsKCWNoYXIgKmxvb3BfYnVmID0ga21hcF9hdG9taWMobG9vcF9wYWdlLCBLTV9VU0VSMSkgKyBsb29wX29mZjsKCWNoYXIgKmluLCAqb3V0LCAqa2V5OwoJaW50IGksIGtleXNpemU7CgoJaWYgKGNtZCA9PSBSRUFEKSB7CgkJaW4gPSByYXdfYnVmOwoJCW91dCA9IGxvb3BfYnVmOwoJfSBlbHNlIHsKCQlpbiA9IGxvb3BfYnVmOwoJCW91dCA9IHJhd19idWY7Cgl9CgoJa2V5ID0gbG8tPmxvX2VuY3J5cHRfa2V5OwoJa2V5c2l6ZSA9IGxvLT5sb19lbmNyeXB0X2tleV9zaXplOwoJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKCQkqb3V0KysgPSAqaW4rKyBeIGtleVsoaSAmIDUxMSkgJSBrZXlzaXplXTsKCglrdW5tYXBfYXRvbWljKHJhd19idWYsIEtNX1VTRVIwKTsKCWt1bm1hcF9hdG9taWMobG9vcF9idWYsIEtNX1VTRVIxKTsKCWNvbmRfcmVzY2hlZCgpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgeG9yX2luaXQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvKQp7CglpZiAodW5saWtlbHkoaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA8PSAwKSkKCQlyZXR1cm4gLUVJTlZBTDsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGxvb3BfZnVuY190YWJsZSBub25lX2Z1bmNzID0gewoJLm51bWJlciA9IExPX0NSWVBUX05PTkUsCgkudHJhbnNmZXIgPSB0cmFuc2Zlcl9ub25lLAp9OyAJCgpzdGF0aWMgc3RydWN0IGxvb3BfZnVuY190YWJsZSB4b3JfZnVuY3MgPSB7CgkubnVtYmVyID0gTE9fQ1JZUFRfWE9SLAoJLnRyYW5zZmVyID0gdHJhbnNmZXJfeG9yLAoJLmluaXQgPSB4b3JfaW5pdAp9OyAJCgovKiB4ZmVyX2Z1bmNzWzBdIGlzIHNwZWNpYWwgLSBpdHMgcmVsZWFzZSBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgKi8Kc3RhdGljIHN0cnVjdCBsb29wX2Z1bmNfdGFibGUgKnhmZXJfZnVuY3NbTUFYX0xPX0NSWVBUXSA9IHsKCSZub25lX2Z1bmNzLAoJJnhvcl9mdW5jcwp9OwoKc3RhdGljIGxvZmZfdCBnZXRfbG9vcF9zaXplKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBmaWxlICpmaWxlKQp7Cglsb2ZmX3Qgc2l6ZSwgb2Zmc2V0LCBsb29wc2l6ZTsKCgkvKiBDb21wdXRlIGxvb3BzaXplIGluIGJ5dGVzICovCglzaXplID0gaV9zaXplX3JlYWQoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KTsKCW9mZnNldCA9IGxvLT5sb19vZmZzZXQ7Cglsb29wc2l6ZSA9IHNpemUgLSBvZmZzZXQ7CglpZiAobG8tPmxvX3NpemVsaW1pdCA+IDAgJiYgbG8tPmxvX3NpemVsaW1pdCA8IGxvb3BzaXplKQoJCWxvb3BzaXplID0gbG8tPmxvX3NpemVsaW1pdDsKCgkvKgoJICogVW5mb3J0dW5hdGVseSwgaWYgd2Ugd2FudCB0byBkbyBJL08gb24gdGhlIGRldmljZSwKCSAqIHRoZSBudW1iZXIgb2YgNTEyLWJ5dGUgc2VjdG9ycyBoYXMgdG8gZml0IGludG8gYSBzZWN0b3JfdC4KCSAqLwoJcmV0dXJuIGxvb3BzaXplID4+IDk7Cn0KCnN0YXRpYyBpbnQKZmlndXJlX2xvb3Bfc2l6ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQp7Cglsb2ZmX3Qgc2l6ZSA9IGdldF9sb29wX3NpemUobG8sIGxvLT5sb19iYWNraW5nX2ZpbGUpOwoJc2VjdG9yX3QgeCA9IChzZWN0b3JfdClzaXplOwoKCWlmICh1bmxpa2VseSgobG9mZl90KXggIT0gc2l6ZSkpCgkJcmV0dXJuIC1FRkJJRzsKCglzZXRfY2FwYWNpdHkobG8tPmxvX2Rpc2ssIHgpOwoJcmV0dXJuIDA7CQkJCQkKfQoKc3RhdGljIGlubGluZSBpbnQKbG9fZG9fdHJhbnNmZXIoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgaW50IGNtZCwKCSAgICAgICBzdHJ1Y3QgcGFnZSAqcnBhZ2UsIHVuc2lnbmVkIHJvZmZzLAoJICAgICAgIHN0cnVjdCBwYWdlICpscGFnZSwgdW5zaWduZWQgbG9mZnMsCgkgICAgICAgaW50IHNpemUsIHNlY3Rvcl90IHJibG9jaykKewoJaWYgKHVubGlrZWx5KCFsby0+dHJhbnNmZXIpKQoJCXJldHVybiAwOwoKCXJldHVybiBsby0+dHJhbnNmZXIobG8sIGNtZCwgcnBhZ2UsIHJvZmZzLCBscGFnZSwgbG9mZnMsIHNpemUsIHJibG9jayk7Cn0KCi8qKgogKiBkb19sb19zZW5kX2FvcHMgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCiAqCiAqIFRoaXMgaXMgdGhlIGZhc3QgdmVyc2lvbiBmb3IgYmFja2luZyBmaWxlc3lzdGVtcyB3aGljaCBpbXBsZW1lbnQgdGhlIGFkZHJlc3MKICogc3BhY2Ugb3BlcmF0aW9ucyBwcmVwYXJlX3dyaXRlIGFuZCBjb21taXRfd3JpdGUuCiAqLwpzdGF0aWMgaW50IGRvX2xvX3NlbmRfYW9wcyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKCQlpbnQgYnNpemUsIGxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQp7CglzdHJ1Y3QgZmlsZSAqZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7IC8qIGt1ZG9zIHRvIE5Gc2NraW5nUyAqLwoJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7Cgljb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zICphb3BzID0gbWFwcGluZy0+YV9vcHM7CglwZ29mZl90IGluZGV4OwoJdW5zaWduZWQgb2Zmc2V0LCBidl9vZmZzOwoJaW50IGxlbiwgcmV0OwoKCW11dGV4X2xvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwoJaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKCW9mZnNldCA9IHBvcyAmICgocGdvZmZfdClQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKCWJ2X29mZnMgPSBidmVjLT5idl9vZmZzZXQ7CglsZW4gPSBidmVjLT5idl9sZW47Cgl3aGlsZSAobGVuID4gMCkgewoJCXNlY3Rvcl90IElWOwoJCXVuc2lnbmVkIHNpemU7CgkJaW50IHRyYW5zZmVyX3Jlc3VsdDsKCgkJSVYgPSAoKHNlY3Rvcl90KWluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSkpKyhvZmZzZXQgPj4gOSk7CgkJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKCQlpZiAoc2l6ZSA+IGxlbikKCQkJc2l6ZSA9IGxlbjsKCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKCQlpZiAodW5saWtlbHkoIXBhZ2UpKQoJCQlnb3RvIGZhaWw7CgkJcmV0ID0gYW9wcy0+cHJlcGFyZV93cml0ZShmaWxlLCBwYWdlLCBvZmZzZXQsCgkJCQkJICBvZmZzZXQgKyBzaXplKTsKCQlpZiAodW5saWtlbHkocmV0KSkgewoJCQlpZiAocmV0ID09IEFPUF9UUlVOQ0FURURfUEFHRSkgewoJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwoJCQkJY29udGludWU7CgkJCX0KCQkJZ290byB1bmxvY2s7CgkJfQoJCXRyYW5zZmVyX3Jlc3VsdCA9IGxvX2RvX3RyYW5zZmVyKGxvLCBXUklURSwgcGFnZSwgb2Zmc2V0LAoJCQkJYnZlYy0+YnZfcGFnZSwgYnZfb2Zmcywgc2l6ZSwgSVYpOwoJCWlmICh1bmxpa2VseSh0cmFuc2Zlcl9yZXN1bHQpKSB7CgkJCS8qCgkJCSAqIFRoZSB0cmFuc2ZlciBmYWlsZWQsIGJ1dCB3ZSBzdGlsbCB3cml0ZSB0aGUgZGF0YSB0bwoJCQkgKiBrZWVwIHByZXBhcmUvY29tbWl0IGNhbGxzIGJhbGFuY2VkLgoJCQkgKi8KCQkJcHJpbnRrKEtFUk5fRVJSICJsb29wOiB0cmFuc2ZlciBlcnJvciBibG9jayAlbGx1XG4iLAoJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbmRleCk7CgkJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIG9mZnNldCwgc2l6ZSwgS01fVVNFUjApOwoJCX0KCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKCQlyZXQgPSBhb3BzLT5jb21taXRfd3JpdGUoZmlsZSwgcGFnZSwgb2Zmc2V0LAoJCQkJCSBvZmZzZXQgKyBzaXplKTsKCQlpZiAodW5saWtlbHkocmV0KSkgewoJCQlpZiAocmV0ID09IEFPUF9UUlVOQ0FURURfUEFHRSkgewoJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwoJCQkJY29udGludWU7CgkJCX0KCQkJZ290byB1bmxvY2s7CgkJfQoJCWlmICh1bmxpa2VseSh0cmFuc2Zlcl9yZXN1bHQpKQoJCQlnb3RvIHVubG9jazsKCQlidl9vZmZzICs9IHNpemU7CgkJbGVuIC09IHNpemU7CgkJb2Zmc2V0ID0gMDsKCQlpbmRleCsrOwoJCXBvcyArPSBzaXplOwoJCXVubG9ja19wYWdlKHBhZ2UpOwoJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKCX0KCXJldCA9IDA7Cm91dDoKCW11dGV4X3VubG9jaygmbWFwcGluZy0+aG9zdC0+aV9tdXRleCk7CglyZXR1cm4gcmV0Owp1bmxvY2s6Cgl1bmxvY2tfcGFnZShwYWdlKTsKCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKZmFpbDoKCXJldCA9IC0xOwoJZ290byBvdXQ7Cn0KCi8qKgogKiBfX2RvX2xvX3NlbmRfd3JpdGUgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCiAqCiAqIFRoaXMgaGVscGVyIGp1c3QgZmFjdG9ycyBvdXQgY29tbW9uIGNvZGUgYmV0d2VlbiBkb19sb19zZW5kX2RpcmVjdF93cml0ZSgpCiAqIGFuZCBkb19sb19zZW5kX3dyaXRlKCkuCiAqLwpzdGF0aWMgaW50IF9fZG9fbG9fc2VuZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKCQl1OCAqYnVmLCBjb25zdCBpbnQgbGVuLCBsb2ZmX3QgcG9zKQp7Cglzc2l6ZV90IGJ3OwoJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOwoKCXNldF9mcyhnZXRfZHMoKSk7CglidyA9IGZpbGUtPmZfb3AtPndyaXRlKGZpbGUsIGJ1ZiwgbGVuLCAmcG9zKTsKCXNldF9mcyhvbGRfZnMpOwoJaWYgKGxpa2VseShidyA9PSBsZW4pKQoJCXJldHVybiAwOwoJcHJpbnRrKEtFUk5fRVJSICJsb29wOiBXcml0ZSBlcnJvciBhdCBieXRlIG9mZnNldCAlbGx1LCBsZW5ndGggJWkuXG4iLAoJCQkodW5zaWduZWQgbG9uZyBsb25nKXBvcywgbGVuKTsKCWlmIChidyA+PSAwKQoJCWJ3ID0gLUVJTzsKCXJldHVybiBidzsKfQoKLyoqCiAqIGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQogKgogKiBUaGlzIGlzIHRoZSBmYXN0LCBub24tdHJhbnNmb3JtaW5nIHZlcnNpb24gZm9yIGJhY2tpbmcgZmlsZXN5c3RlbXMgd2hpY2ggZG8KICogbm90IGltcGxlbWVudCB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIHByZXBhcmVfd3JpdGUgYW5kIGNvbW1pdF93cml0ZS4KICogSXQgdXNlcyB0aGUgd3JpdGUgZmlsZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHByZXNlbnQgb24gYWxsIHdyaXRlYWJsZQogKiBmaWxlc3lzdGVtcy4KICovCnN0YXRpYyBpbnQgZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywKCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgaW50IGJzaXplLCBsb2ZmX3QgcG9zLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKewoJc3NpemVfdCBidyA9IF9fZG9fbG9fc2VuZF93cml0ZShsby0+bG9fYmFja2luZ19maWxlLAoJCQlrbWFwKGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0LAoJCQlidmVjLT5idl9sZW4sIHBvcyk7CglrdW5tYXAoYnZlYy0+YnZfcGFnZSk7Cgljb25kX3Jlc2NoZWQoKTsKCXJldHVybiBidzsKfQoKLyoqCiAqIGRvX2xvX3NlbmRfd3JpdGUgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCiAqCiAqIFRoaXMgaXMgdGhlIHNsb3csIHRyYW5zZm9ybWluZyB2ZXJzaW9uIGZvciBmaWxlc3lzdGVtcyB3aGljaCBkbyBub3QKICogaW1wbGVtZW50IHRoZSBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgcHJlcGFyZV93cml0ZSBhbmQgY29tbWl0X3dyaXRlLiAgSXQKICogdXNlcyB0aGUgd3JpdGUgZmlsZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHByZXNlbnQgb24gYWxsIHdyaXRlYWJsZQogKiBmaWxlc3lzdGVtcy4KICoKICogVXNpbmcgZm9wcy0+d3JpdGUgaXMgc2xvd2VyIHRoYW4gdXNpbmcgYW9wcy0+e3ByZXBhcmUsY29tbWl0fV93cml0ZSBpbiB0aGUKICogdHJhbnNmb3JtaW5nIGNhc2UgYmVjYXVzZSB3ZSBuZWVkIHRvIGRvdWJsZSBidWZmZXIgdGhlIGRhdGEgYXMgd2UgY2Fubm90IGRvCiAqIHRoZSB0cmFuc2Zvcm1hdGlvbnMgaW4gcGxhY2UgYXMgd2UgZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUKICogZGVzdGluYXRpb24gcGFnZXMgb2YgdGhlIGJhY2tpbmcgZmlsZS4KICovCnN0YXRpYyBpbnQgZG9fbG9fc2VuZF93cml0ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKCQlpbnQgYnNpemUsIGxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQp7CglpbnQgcmV0ID0gbG9fZG9fdHJhbnNmZXIobG8sIFdSSVRFLCBwYWdlLCAwLCBidmVjLT5idl9wYWdlLAoJCQlidmVjLT5idl9vZmZzZXQsIGJ2ZWMtPmJ2X2xlbiwgcG9zID4+IDkpOwoJaWYgKGxpa2VseSghcmV0KSkKCQlyZXR1cm4gX19kb19sb19zZW5kX3dyaXRlKGxvLT5sb19iYWNraW5nX2ZpbGUsCgkJCQlwYWdlX2FkZHJlc3MocGFnZSksIGJ2ZWMtPmJ2X2xlbiwKCQkJCXBvcyk7CglwcmludGsoS0VSTl9FUlIgImxvb3A6IFRyYW5zZmVyIGVycm9yIGF0IGJ5dGUgb2Zmc2V0ICVsbHUsICIKCQkJImxlbmd0aCAlaS5cbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpcG9zLCBidmVjLT5idl9sZW4pOwoJaWYgKHJldCA+IDApCgkJcmV0ID0gLUVJTzsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgbG9fc2VuZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8sIGludCBic2l6ZSwKCQlsb2ZmX3QgcG9zKQp7CglpbnQgKCpkb19sb19zZW5kKShzdHJ1Y3QgbG9vcF9kZXZpY2UgKiwgc3RydWN0IGJpb192ZWMgKiwgaW50LCBsb2ZmX3QsCgkJCXN0cnVjdCBwYWdlICpwYWdlKTsKCXN0cnVjdCBiaW9fdmVjICpidmVjOwoJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwoJaW50IGksIHJldCA9IDA7CgoJZG9fbG9fc2VuZCA9IGRvX2xvX3NlbmRfYW9wczsKCWlmICghKGxvLT5sb19mbGFncyAmIExPX0ZMQUdTX1VTRV9BT1BTKSkgewoJCWRvX2xvX3NlbmQgPSBkb19sb19zZW5kX2RpcmVjdF93cml0ZTsKCQlpZiAobG8tPnRyYW5zZmVyICE9IHRyYW5zZmVyX25vbmUpIHsKCQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PSU8gfCBfX0dGUF9ISUdITUVNKTsKCQkJaWYgKHVubGlrZWx5KCFwYWdlKSkKCQkJCWdvdG8gZmFpbDsKCQkJa21hcChwYWdlKTsKCQkJZG9fbG9fc2VuZCA9IGRvX2xvX3NlbmRfd3JpdGU7CgkJfQoJfQoJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CgkJcmV0ID0gZG9fbG9fc2VuZChsbywgYnZlYywgYnNpemUsIHBvcywgcGFnZSk7CgkJaWYgKHJldCA8IDApCgkJCWJyZWFrOwoJCXBvcyArPSBidmVjLT5idl9sZW47Cgl9CglpZiAocGFnZSkgewoJCWt1bm1hcChwYWdlKTsKCQlfX2ZyZWVfcGFnZShwYWdlKTsKCX0Kb3V0OgoJcmV0dXJuIHJldDsKZmFpbDoKCXByaW50ayhLRVJOX0VSUiAibG9vcDogRmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBwYWdlIGZvciB3cml0ZS5cbiIpOwoJcmV0ID0gLUVOT01FTTsKCWdvdG8gb3V0Owp9CgpzdHJ1Y3QgbG9fcmVhZF9kYXRhIHsKCXN0cnVjdCBsb29wX2RldmljZSAqbG87CglzdHJ1Y3QgcGFnZSAqcGFnZTsKCXVuc2lnbmVkIG9mZnNldDsKCWludCBic2l6ZTsKfTsKCnN0YXRpYyBpbnQKbG9fc3BsaWNlX2FjdG9yKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmLAoJCXN0cnVjdCBzcGxpY2VfZGVzYyAqc2QpCnsKCXN0cnVjdCBsb19yZWFkX2RhdGEgKnAgPSBzZC0+dS5kYXRhOwoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IHAtPmxvOwoJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidWYtPnBhZ2U7CglzZWN0b3JfdCBJVjsKCXNpemVfdCBzaXplOwoJaW50IHJldDsKCglyZXQgPSBidWYtPm9wcy0+Y29uZmlybShwaXBlLCBidWYpOwoJaWYgKHVubGlrZWx5KHJldCkpCgkJcmV0dXJuIHJldDsKCglJViA9ICgoc2VjdG9yX3QpIHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSkpICsKCQkJCQkJCShidWYtPm9mZnNldCA+PiA5KTsKCXNpemUgPSBzZC0+bGVuOwoJaWYgKHNpemUgPiBwLT5ic2l6ZSkKCQlzaXplID0gcC0+YnNpemU7CgoJaWYgKGxvX2RvX3RyYW5zZmVyKGxvLCBSRUFELCBwYWdlLCBidWYtPm9mZnNldCwgcC0+cGFnZSwgcC0+b2Zmc2V0LCBzaXplLCBJVikpIHsKCQlwcmludGsoS0VSTl9FUlIgImxvb3A6IHRyYW5zZmVyIGVycm9yIGJsb2NrICVsZFxuIiwKCQkgICAgICAgcGFnZS0+aW5kZXgpOwoJCXNpemUgPSAtRUlOVkFMOwoJfQoKCWZsdXNoX2RjYWNoZV9wYWdlKHAtPnBhZ2UpOwoKCWlmIChzaXplID4gMCkKCQlwLT5vZmZzZXQgKz0gc2l6ZTsKCglyZXR1cm4gc2l6ZTsKfQoKc3RhdGljIGludApsb19kaXJlY3Rfc3BsaWNlX2FjdG9yKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHN0cnVjdCBzcGxpY2VfZGVzYyAqc2QpCnsKCXJldHVybiBfX3NwbGljZV9mcm9tX3BpcGUocGlwZSwgc2QsIGxvX3NwbGljZV9hY3Rvcik7Cn0KCnN0YXRpYyBpbnQKZG9fbG9fcmVjZWl2ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLAoJICAgICAgc3RydWN0IGJpb192ZWMgKmJ2ZWMsIGludCBic2l6ZSwgbG9mZl90IHBvcykKewoJc3RydWN0IGxvX3JlYWRfZGF0YSBjb29raWU7CglzdHJ1Y3Qgc3BsaWNlX2Rlc2Mgc2Q7CglzdHJ1Y3QgZmlsZSAqZmlsZTsKCWxvbmcgcmV0dmFsOwoKCWNvb2tpZS5sbyA9IGxvOwoJY29va2llLnBhZ2UgPSBidmVjLT5idl9wYWdlOwoJY29va2llLm9mZnNldCA9IGJ2ZWMtPmJ2X29mZnNldDsKCWNvb2tpZS5ic2l6ZSA9IGJzaXplOwoKCXNkLmxlbiA9IDA7CglzZC50b3RhbF9sZW4gPSBidmVjLT5idl9sZW47CglzZC5mbGFncyA9IDA7CglzZC5wb3MgPSBwb3M7CglzZC51LmRhdGEgPSAmY29va2llOwoKCWZpbGUgPSBsby0+bG9fYmFja2luZ19maWxlOwoJcmV0dmFsID0gc3BsaWNlX2RpcmVjdF90b19hY3RvcihmaWxlLCAmc2QsIGxvX2RpcmVjdF9zcGxpY2VfYWN0b3IpOwoKCWlmIChyZXR2YWwgPCAwKQoJCXJldHVybiByZXR2YWw7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbG9fcmVjZWl2ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8sIGludCBic2l6ZSwgbG9mZl90IHBvcykKewoJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CglpbnQgaSwgcmV0ID0gMDsKCgliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKCQlyZXQgPSBkb19sb19yZWNlaXZlKGxvLCBidmVjLCBic2l6ZSwgcG9zKTsKCQlpZiAocmV0IDwgMCkKCQkJYnJlYWs7CgkJcG9zICs9IGJ2ZWMtPmJ2X2xlbjsKCX0KCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgZG9fYmlvX2ZpbGViYWNrZWQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpbyAqYmlvKQp7Cglsb2ZmX3QgcG9zOwoJaW50IHJldDsKCglwb3MgPSAoKGxvZmZfdCkgYmlvLT5iaV9zZWN0b3IgPDwgOSkgKyBsby0+bG9fb2Zmc2V0OwoJaWYgKGJpb19ydyhiaW8pID09IFdSSVRFKQoJCXJldCA9IGxvX3NlbmQobG8sIGJpbywgbG8tPmxvX2Jsb2Nrc2l6ZSwgcG9zKTsKCWVsc2UKCQlyZXQgPSBsb19yZWNlaXZlKGxvLCBiaW8sIGxvLT5sb19ibG9ja3NpemUsIHBvcyk7CglyZXR1cm4gcmV0Owp9CgovKgogKiBBZGQgYmlvIHRvIGJhY2sgb2YgcGVuZGluZyBsaXN0CiAqLwpzdGF0aWMgdm9pZCBsb29wX2FkZF9iaW8oc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpbyAqYmlvKQp7CglpZiAobG8tPmxvX2Jpb3RhaWwpIHsKCQlsby0+bG9fYmlvdGFpbC0+YmlfbmV4dCA9IGJpbzsKCQlsby0+bG9fYmlvdGFpbCA9IGJpbzsKCX0gZWxzZQoJCWxvLT5sb19iaW8gPSBsby0+bG9fYmlvdGFpbCA9IGJpbzsKfQoKLyoKICogR3JhYiBmaXJzdCBwZW5kaW5nIGJ1ZmZlcgogKi8Kc3RhdGljIHN0cnVjdCBiaW8gKmxvb3BfZ2V0X2JpbyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQp7CglzdHJ1Y3QgYmlvICpiaW87CgoJaWYgKChiaW8gPSBsby0+bG9fYmlvKSkgewoJCWlmIChiaW8gPT0gbG8tPmxvX2Jpb3RhaWwpCgkJCWxvLT5sb19iaW90YWlsID0gTlVMTDsKCQlsby0+bG9fYmlvID0gYmlvLT5iaV9uZXh0OwoJCWJpby0+YmlfbmV4dCA9IE5VTEw7Cgl9CgoJcmV0dXJuIGJpbzsKfQoKc3RhdGljIGludCBsb29wX21ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKm9sZF9iaW8pCnsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBxLT5xdWV1ZWRhdGE7CglpbnQgcncgPSBiaW9fcncob2xkX2Jpbyk7CgoJaWYgKHJ3ID09IFJFQURBKQoJCXJ3ID0gUkVBRDsKCglCVUdfT04oIWxvIHx8IChydyAhPSBSRUFEICYmIHJ3ICE9IFdSSVRFKSk7CgoJc3Bpbl9sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKCQlnb3RvIG91dDsKCWlmICh1bmxpa2VseShydyA9PSBXUklURSAmJiAobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUkVBRF9PTkxZKSkpCgkJZ290byBvdXQ7Cglsb29wX2FkZF9iaW8obG8sIG9sZF9iaW8pOwoJd2FrZV91cCgmbG8tPmxvX2V2ZW50KTsKCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoJcmV0dXJuIDA7CgpvdXQ6CglzcGluX3VubG9ja19pcnEoJmxvLT5sb19sb2NrKTsKCWJpb19pb19lcnJvcihvbGRfYmlvLCBvbGRfYmlvLT5iaV9zaXplKTsKCXJldHVybiAwOwp9CgovKgogKiBraWNrIG9mZiBpbyBvbiB0aGUgdW5kZXJseWluZyBhZGRyZXNzIHNwYWNlCiAqLwpzdGF0aWMgdm9pZCBsb29wX3VucGx1ZyhyZXF1ZXN0X3F1ZXVlX3QgKnEpCnsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBxLT5xdWV1ZWRhdGE7CgoJY2xlYXJfYml0KFFVRVVFX0ZMQUdfUExVR0dFRCwgJnEtPnF1ZXVlX2ZsYWdzKTsKCWJsa19ydW5fYWRkcmVzc19zcGFjZShsby0+bG9fYmFja2luZ19maWxlLT5mX21hcHBpbmcpOwp9CgpzdHJ1Y3Qgc3dpdGNoX3JlcXVlc3QgewoJc3RydWN0IGZpbGUgKmZpbGU7CglzdHJ1Y3QgY29tcGxldGlvbiB3YWl0Owp9OwoKc3RhdGljIHZvaWQgZG9fbG9vcF9zd2l0Y2goc3RydWN0IGxvb3BfZGV2aWNlICosIHN0cnVjdCBzd2l0Y2hfcmVxdWVzdCAqKTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBsb29wX2hhbmRsZV9iaW8oc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpbyAqYmlvKQp7CglpZiAodW5saWtlbHkoIWJpby0+YmlfYmRldikpIHsKCQlkb19sb29wX3N3aXRjaChsbywgYmlvLT5iaV9wcml2YXRlKTsKCQliaW9fcHV0KGJpbyk7Cgl9IGVsc2UgewoJCWludCByZXQgPSBkb19iaW9fZmlsZWJhY2tlZChsbywgYmlvKTsKCQliaW9fZW5kaW8oYmlvLCBiaW8tPmJpX3NpemUsIHJldCk7Cgl9Cn0KCi8qCiAqIHdvcmtlciB0aHJlYWQgdGhhdCBoYW5kbGVzIHJlYWRzL3dyaXRlcyB0byBmaWxlIGJhY2tlZCBsb29wIGRldmljZXMsCiAqIHRvIGF2b2lkIGJsb2NraW5nIGluIG91ciBtYWtlX3JlcXVlc3RfZm4uIGl0IGFsc28gZG9lcyBsb29wIGRlY3J5cHRpbmcKICogb24gcmVhZHMgZm9yIGJsb2NrIGJhY2tlZCBsb29wLCBhcyB0aGF0IGlzIHRvbyBoZWF2eSB0byBkbyBmcm9tCiAqIGJfZW5kX2lvIGNvbnRleHQgd2hlcmUgaXJxcyBtYXkgYmUgZGlzYWJsZWQuCiAqCiAqIExvb3AgZXhwbGFuYXRpb246ICBsb29wX2Nscl9mZCgpIHNldHMgbG9fc3RhdGUgdG8gTG9fcnVuZG93biBiZWZvcmUKICogY2FsbGluZyBrdGhyZWFkX3N0b3AoKS4gIFRoZXJlZm9yZSBvbmNlIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSBpcwogKiB0cnVlLCBtYWtlX3JlcXVlc3Qgd2lsbCBub3QgcGxhY2UgYW55IG1vcmUgcmVxdWVzdHMuICBUaGVyZWZvcmUKICogb25jZSBrdGhyZWFkX3Nob3VsZF9zdG9wKCkgaXMgdHJ1ZSBhbmQgbG9fYmlvIGlzIE5VTEwsIHdlIGFyZQogKiBkb25lIHdpdGggdGhlIGxvb3AuCiAqLwpzdGF0aWMgaW50IGxvb3BfdGhyZWFkKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBkYXRhOwoJc3RydWN0IGJpbyAqYmlvOwoKCS8qCgkgKiBsb29wIGNhbiBiZSB1c2VkIGluIGFuIGVuY3J5cHRlZCBkZXZpY2UsCgkgKiBoZW5jZSwgaXQgbXVzdG4ndCBiZSBzdG9wcGVkIGF0IGFsbAoJICogYmVjYXVzZSBpdCBjb3VsZCBiZSBpbmRpcmVjdGx5IHVzZWQgZHVyaW5nIHN1c3BlbnNpb24KCSAqLwoJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CgoJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOwoKCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IGxvLT5sb19iaW8pIHsKCgkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGxvLT5sb19ldmVudCwKCQkJCWxvLT5sb19iaW8gfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKCgkJaWYgKCFsby0+bG9fYmlvKQoJCQljb250aW51ZTsKCQlzcGluX2xvY2tfaXJxKCZsby0+bG9fbG9jayk7CgkJYmlvID0gbG9vcF9nZXRfYmlvKGxvKTsKCQlzcGluX3VubG9ja19pcnEoJmxvLT5sb19sb2NrKTsKCgkJQlVHX09OKCFiaW8pOwoJCWxvb3BfaGFuZGxlX2JpbyhsbywgYmlvKTsKCX0KCglyZXR1cm4gMDsKfQoKLyoKICogbG9vcF9zd2l0Y2ggcGVyZm9ybXMgdGhlIGhhcmQgd29yayBvZiBzd2l0Y2hpbmcgYSBiYWNraW5nIHN0b3JlLgogKiBGaXJzdCBpdCBuZWVkcyB0byBmbHVzaCBleGlzdGluZyBJTywgaXQgZG9lcyB0aGlzIGJ5IHNlbmRpbmcgYSBtYWdpYwogKiBCSU8gZG93biB0aGUgcGlwZS4gVGhlIGNvbXBsZXRpb24gb2YgdGhpcyBCSU8gZG9lcyB0aGUgYWN0dWFsIHN3aXRjaC4KICovCnN0YXRpYyBpbnQgbG9vcF9zd2l0Y2goc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBzd2l0Y2hfcmVxdWVzdCB3OwoJc3RydWN0IGJpbyAqYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIDEpOwoJaWYgKCFiaW8pCgkJcmV0dXJuIC1FTk9NRU07Cglpbml0X2NvbXBsZXRpb24oJncud2FpdCk7Cgl3LmZpbGUgPSBmaWxlOwoJYmlvLT5iaV9wcml2YXRlID0gJnc7CgliaW8tPmJpX2JkZXYgPSBOVUxMOwoJbG9vcF9tYWtlX3JlcXVlc3QobG8tPmxvX3F1ZXVlLCBiaW8pOwoJd2FpdF9mb3JfY29tcGxldGlvbigmdy53YWl0KTsKCXJldHVybiAwOwp9CgovKgogKiBEbyB0aGUgYWN0dWFsIHN3aXRjaDsgY2FsbGVkIGZyb20gdGhlIEJJTyBjb21wbGV0aW9uIHJvdXRpbmUKICovCnN0YXRpYyB2b2lkIGRvX2xvb3Bfc3dpdGNoKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBzd2l0Y2hfcmVxdWVzdCAqcCkKewoJc3RydWN0IGZpbGUgKmZpbGUgPSBwLT5maWxlOwoJc3RydWN0IGZpbGUgKm9sZF9maWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwoKCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG9sZF9maWxlLT5mX21hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2spOwoJbG8tPmxvX2JhY2tpbmdfZmlsZSA9IGZpbGU7Cglsby0+bG9fYmxvY2tzaXplID0gU19JU0JMSyhtYXBwaW5nLT5ob3N0LT5pX21vZGUpID8KCQltYXBwaW5nLT5ob3N0LT5pX2JkZXYtPmJkX2Jsb2NrX3NpemUgOiBQQUdFX1NJWkU7Cglsby0+b2xkX2dmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2sgJiB+KF9fR0ZQX0lPfF9fR0ZQX0ZTKSk7Cgljb21wbGV0ZSgmcC0+d2FpdCk7Cn0KCgovKgogKiBsb29wX2NoYW5nZV9mZCBzd2l0Y2hlZCB0aGUgYmFja2luZyBzdG9yZSBvZiBhIGxvb3BiYWNrIGRldmljZSB0bwogKiBhIG5ldyBmaWxlLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3BlcmF0aW5nIHN5c3RlbSBpbnN0YWxsZXJzIHRvIGZyZWUgdXAKICogdGhlIG9yaWdpbmFsIGZpbGUgYW5kIGluIEhpZ2ggQXZhaWxhYmlsaXR5IGVudmlyb25tZW50cyB0byBzd2l0Y2ggdG8KICogYW4gYWx0ZXJuYXRpdmUgbG9jYXRpb24gZm9yIHRoZSBjb250ZW50IGluIGNhc2Ugb2Ygc2VydmVyIG1lbHRkb3duLgogKiBUaGlzIGNhbiBvbmx5IHdvcmsgaWYgdGhlIGxvb3AgZGV2aWNlIGlzIHVzZWQgcmVhZC1vbmx5LCBhbmQgaWYgdGhlCiAqIG5ldyBiYWNraW5nIHN0b3JlIGlzIHRoZSBzYW1lIHNpemUgYW5kIHR5cGUgYXMgdGhlIG9sZCBiYWNraW5nIHN0b3JlLgogKi8Kc3RhdGljIGludCBsb29wX2NoYW5nZV9mZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgZmlsZSAqbG9fZmlsZSwKCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgaW50IGFyZykKewoJc3RydWN0IGZpbGUJKmZpbGUsICpvbGRfZmlsZTsKCXN0cnVjdCBpbm9kZQkqaW5vZGU7CglpbnQJCWVycm9yOwoKCWVycm9yID0gLUVOWElPOwoJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKCQlnb3RvIG91dDsKCgkvKiB0aGUgbG9vcCBkZXZpY2UgaGFzIHRvIGJlIHJlYWQtb25seSAqLwoJZXJyb3IgPSAtRUlOVkFMOwoJaWYgKCEobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUkVBRF9PTkxZKSkKCQlnb3RvIG91dDsKCgllcnJvciA9IC1FQkFERjsKCWZpbGUgPSBmZ2V0KGFyZyk7CglpZiAoIWZpbGUpCgkJZ290byBvdXQ7CgoJaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CglvbGRfZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CgoJZXJyb3IgPSAtRUlOVkFMOwoKCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQlnb3RvIG91dF9wdXRmOwoKCS8qIG5ldyBiYWNraW5nIHN0b3JlIG5lZWRzIHRvIHN1cHBvcnQgbG9vcCAoZWcgc3BsaWNlX3JlYWQpICovCglpZiAoIWlub2RlLT5pX2ZvcC0+c3BsaWNlX3JlYWQpCgkJZ290byBvdXRfcHV0ZjsKCgkvKiBzaXplIG9mIHRoZSBuZXcgYmFja2luZyBzdG9yZSBuZWVkcyB0byBiZSB0aGUgc2FtZSAqLwoJaWYgKGdldF9sb29wX3NpemUobG8sIGZpbGUpICE9IGdldF9sb29wX3NpemUobG8sIG9sZF9maWxlKSkKCQlnb3RvIG91dF9wdXRmOwoKCS8qIGFuZCAuLi4gc3dpdGNoICovCgllcnJvciA9IGxvb3Bfc3dpdGNoKGxvLCBmaWxlKTsKCWlmIChlcnJvcikKCQlnb3RvIG91dF9wdXRmOwoKCWZwdXQob2xkX2ZpbGUpOwoJcmV0dXJuIDA7Cgogb3V0X3B1dGY6CglmcHV0KGZpbGUpOwogb3V0OgoJcmV0dXJuIGVycm9yOwp9CgpzdGF0aWMgaW5saW5lIGludCBpc19sb29wX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IGlub2RlICppID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwoKCXJldHVybiBpICYmIFNfSVNCTEsoaS0+aV9tb2RlKSAmJiBNQUpPUihpLT5pX3JkZXYpID09IExPT1BfTUFKT1I7Cn0KCnN0YXRpYyBpbnQgbG9vcF9zZXRfZmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGZpbGUgKmxvX2ZpbGUsCgkJICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGludCBhcmcpCnsKCXN0cnVjdCBmaWxlCSpmaWxlLCAqZjsKCXN0cnVjdCBpbm9kZQkqaW5vZGU7CglzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKCXVuc2lnbmVkIGxvX2Jsb2Nrc2l6ZTsKCWludAkJbG9fZmxhZ3MgPSAwOwoJaW50CQllcnJvcjsKCWxvZmZfdAkJc2l6ZTsKCgkvKiBUaGlzIGlzIHNhZmUsIHNpbmNlIHdlIGhhdmUgYSByZWZlcmVuY2UgZnJvbSBvcGVuKCkuICovCglfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwoKCWVycm9yID0gLUVCQURGOwoJZmlsZSA9IGZnZXQoYXJnKTsKCWlmICghZmlsZSkKCQlnb3RvIG91dDsKCgllcnJvciA9IC1FQlVTWTsKCWlmIChsby0+bG9fc3RhdGUgIT0gTG9fdW5ib3VuZCkKCQlnb3RvIG91dF9wdXRmOwoKCS8qIEF2b2lkIHJlY3Vyc2lvbiAqLwoJZiA9IGZpbGU7Cgl3aGlsZSAoaXNfbG9vcF9kZXZpY2UoZikpIHsKCQlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmw7CgoJCWlmIChmLT5mX21hcHBpbmctPmhvc3QtPmlfcmRldiA9PSBsb19maWxlLT5mX21hcHBpbmctPmhvc3QtPmlfcmRldikKCQkJZ290byBvdXRfcHV0ZjsKCgkJbCA9IGYtPmZfbWFwcGluZy0+aG9zdC0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CgkJaWYgKGwtPmxvX3N0YXRlID09IExvX3VuYm91bmQpIHsKCQkJZXJyb3IgPSAtRUlOVkFMOwoJCQlnb3RvIG91dF9wdXRmOwoJCX0KCQlmID0gbC0+bG9fYmFja2luZ19maWxlOwoJfQoKCW1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7Cglpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CgoJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQoJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1JFQURfT05MWTsKCgllcnJvciA9IC1FSU5WQUw7CglpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CgkJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYW9wcyA9IG1hcHBpbmctPmFfb3BzOwoJCS8qCgkJICogSWYgd2UgY2FuJ3QgcmVhZCAtIHNvcnJ5LiBJZiB3ZSBvbmx5IGNhbid0IHdyaXRlIC0gd2VsbCwKCQkgKiBpdCdzIGdvaW5nIHRvIGJlIHJlYWQtb25seS4KCQkgKi8KCQlpZiAoIWZpbGUtPmZfb3AtPnNwbGljZV9yZWFkKQoJCQlnb3RvIG91dF9wdXRmOwoJCWlmIChhb3BzLT5wcmVwYXJlX3dyaXRlICYmIGFvcHMtPmNvbW1pdF93cml0ZSkKCQkJbG9fZmxhZ3MgfD0gTE9fRkxBR1NfVVNFX0FPUFM7CgkJaWYgKCEobG9fZmxhZ3MgJiBMT19GTEFHU19VU0VfQU9QUykgJiYgIWZpbGUtPmZfb3AtPndyaXRlKQoJCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CgoJCWxvX2Jsb2Nrc2l6ZSA9IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkgPwoJCQlpbm9kZS0+aV9iZGV2LT5iZF9ibG9ja19zaXplIDogUEFHRV9TSVpFOwoKCQllcnJvciA9IDA7Cgl9IGVsc2UgewoJCWdvdG8gb3V0X3B1dGY7Cgl9CgoJc2l6ZSA9IGdldF9sb29wX3NpemUobG8sIGZpbGUpOwoKCWlmICgobG9mZl90KShzZWN0b3JfdClzaXplICE9IHNpemUpIHsKCQllcnJvciA9IC1FRkJJRzsKCQlnb3RvIG91dF9wdXRmOwoJfQoKCWlmICghKGxvX2ZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CgoJc2V0X2RldmljZV9ybyhiZGV2LCAobG9fZmxhZ3MgJiBMT19GTEFHU19SRUFEX09OTFkpICE9IDApOwoKCWxvLT5sb19ibG9ja3NpemUgPSBsb19ibG9ja3NpemU7Cglsby0+bG9fZGV2aWNlID0gYmRldjsKCWxvLT5sb19mbGFncyA9IGxvX2ZsYWdzOwoJbG8tPmxvX2JhY2tpbmdfZmlsZSA9IGZpbGU7Cglsby0+dHJhbnNmZXIgPSB0cmFuc2Zlcl9ub25lOwoJbG8tPmlvY3RsID0gTlVMTDsKCWxvLT5sb19zaXplbGltaXQgPSAwOwoJbG8tPm9sZF9nZnBfbWFzayA9IG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZyk7CgltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBsby0+b2xkX2dmcF9tYXNrICYgfihfX0dGUF9JT3xfX0dGUF9GUykpOwoKCWxvLT5sb19iaW8gPSBsby0+bG9fYmlvdGFpbCA9IE5VTEw7CgoJLyoKCSAqIHNldCBxdWV1ZSBtYWtlX3JlcXVlc3RfZm4sIGFuZCBhZGQgbGltaXRzIGJhc2VkIG9uIGxvd2VyIGxldmVsCgkgKiBkZXZpY2UKCSAqLwoJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChsby0+bG9fcXVldWUsIGxvb3BfbWFrZV9yZXF1ZXN0KTsKCWxvLT5sb19xdWV1ZS0+cXVldWVkYXRhID0gbG87Cglsby0+bG9fcXVldWUtPnVucGx1Z19mbiA9IGxvb3BfdW5wbHVnOwoKCXNldF9jYXBhY2l0eShsby0+bG9fZGlzaywgc2l6ZSk7CgliZF9zZXRfc2l6ZShiZGV2LCBzaXplIDw8IDkpOwoKCXNldF9ibG9ja3NpemUoYmRldiwgbG9fYmxvY2tzaXplKTsKCglsby0+bG9fdGhyZWFkID0ga3RocmVhZF9jcmVhdGUobG9vcF90aHJlYWQsIGxvLCAibG9vcCVkIiwKCQkJCQkJbG8tPmxvX251bWJlcik7CglpZiAoSVNfRVJSKGxvLT5sb190aHJlYWQpKSB7CgkJZXJyb3IgPSBQVFJfRVJSKGxvLT5sb190aHJlYWQpOwoJCWdvdG8gb3V0X2NscjsKCX0KCWxvLT5sb19zdGF0ZSA9IExvX2JvdW5kOwoJd2FrZV91cF9wcm9jZXNzKGxvLT5sb190aHJlYWQpOwoJcmV0dXJuIDA7CgpvdXRfY2xyOgoJbG8tPmxvX3RocmVhZCA9IE5VTEw7Cglsby0+bG9fZGV2aWNlID0gTlVMTDsKCWxvLT5sb19iYWNraW5nX2ZpbGUgPSBOVUxMOwoJbG8tPmxvX2ZsYWdzID0gMDsKCXNldF9jYXBhY2l0eShsby0+bG9fZGlzaywgMCk7CglpbnZhbGlkYXRlX2JkZXYoYmRldik7CgliZF9zZXRfc2l6ZShiZGV2LCAwKTsKCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2spOwoJbG8tPmxvX3N0YXRlID0gTG9fdW5ib3VuZDsKIG91dF9wdXRmOgoJZnB1dChmaWxlKTsKIG91dDoKCS8qIFRoaXMgaXMgc2FmZTogb3BlbigpIGlzIHN0aWxsIGhvbGRpbmcgYSByZWZlcmVuY2UuICovCgltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKCXJldHVybiBlcnJvcjsKfQoKc3RhdGljIGludApsb29wX3JlbGVhc2VfeGZlcihzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQp7CglpbnQgZXJyID0gMDsKCXN0cnVjdCBsb29wX2Z1bmNfdGFibGUgKnhmZXIgPSBsby0+bG9fZW5jcnlwdGlvbjsKCglpZiAoeGZlcikgewoJCWlmICh4ZmVyLT5yZWxlYXNlKQoJCQllcnIgPSB4ZmVyLT5yZWxlYXNlKGxvKTsKCQlsby0+dHJhbnNmZXIgPSBOVUxMOwoJCWxvLT5sb19lbmNyeXB0aW9uID0gTlVMTDsKCQltb2R1bGVfcHV0KHhmZXItPm93bmVyKTsKCX0KCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQKbG9vcF9pbml0X3hmZXIoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGxvb3BfZnVuY190YWJsZSAqeGZlciwKCSAgICAgICBjb25zdCBzdHJ1Y3QgbG9vcF9pbmZvNjQgKmkpCnsKCWludCBlcnIgPSAwOwoKCWlmICh4ZmVyKSB7CgkJc3RydWN0IG1vZHVsZSAqb3duZXIgPSB4ZmVyLT5vd25lcjsKCgkJaWYgKCF0cnlfbW9kdWxlX2dldChvd25lcikpCgkJCXJldHVybiAtRUlOVkFMOwoJCWlmICh4ZmVyLT5pbml0KQoJCQllcnIgPSB4ZmVyLT5pbml0KGxvLCBpKTsKCQlpZiAoZXJyKQoJCQltb2R1bGVfcHV0KG93bmVyKTsKCQllbHNlCgkJCWxvLT5sb19lbmNyeXB0aW9uID0geGZlcjsKCX0KCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQgbG9vcF9jbHJfZmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKewoJc3RydWN0IGZpbGUgKmZpbHAgPSBsby0+bG9fYmFja2luZ19maWxlOwoJZ2ZwX3QgZ2ZwID0gbG8tPm9sZF9nZnBfbWFzazsKCglpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQoJCXJldHVybiAtRU5YSU87CgoJaWYgKGxvLT5sb19yZWZjbnQgPiAxKQkvKiB3ZSBuZWVkZWQgb25lIGZkIGZvciB0aGUgaW9jdGwgKi8KCQlyZXR1cm4gLUVCVVNZOwoKCWlmIChmaWxwID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJc3Bpbl9sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoJbG8tPmxvX3N0YXRlID0gTG9fcnVuZG93bjsKCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoKCWt0aHJlYWRfc3RvcChsby0+bG9fdGhyZWFkKTsKCglsby0+bG9fYmFja2luZ19maWxlID0gTlVMTDsKCglsb29wX3JlbGVhc2VfeGZlcihsbyk7Cglsby0+dHJhbnNmZXIgPSBOVUxMOwoJbG8tPmlvY3RsID0gTlVMTDsKCWxvLT5sb19kZXZpY2UgPSBOVUxMOwoJbG8tPmxvX2VuY3J5cHRpb24gPSBOVUxMOwoJbG8tPmxvX29mZnNldCA9IDA7Cglsby0+bG9fc2l6ZWxpbWl0ID0gMDsKCWxvLT5sb19lbmNyeXB0X2tleV9zaXplID0gMDsKCWxvLT5sb19mbGFncyA9IDA7Cglsby0+bG9fdGhyZWFkID0gTlVMTDsKCW1lbXNldChsby0+bG9fZW5jcnlwdF9rZXksIDAsIExPX0tFWV9TSVpFKTsKCW1lbXNldChsby0+bG9fY3J5cHRfbmFtZSwgMCwgTE9fTkFNRV9TSVpFKTsKCW1lbXNldChsby0+bG9fZmlsZV9uYW1lLCAwLCBMT19OQU1FX1NJWkUpOwoJaW52YWxpZGF0ZV9iZGV2KGJkZXYpOwoJc2V0X2NhcGFjaXR5KGxvLT5sb19kaXNrLCAwKTsKCWJkX3NldF9zaXplKGJkZXYsIDApOwoJbWFwcGluZ19zZXRfZ2ZwX21hc2soZmlscC0+Zl9tYXBwaW5nLCBnZnApOwoJbG8tPmxvX3N0YXRlID0gTG9fdW5ib3VuZDsKCWZwdXQoZmlscCk7CgkvKiBUaGlzIGlzIHNhZmU6IG9wZW4oKSBpcyBzdGlsbCBob2xkaW5nIGEgcmVmZXJlbmNlLiAqLwoJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludApsb29wX3NldF9zdGF0dXMoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvKQp7CglpbnQgZXJyOwoJc3RydWN0IGxvb3BfZnVuY190YWJsZSAqeGZlcjsKCglpZiAobG8tPmxvX2VuY3J5cHRfa2V5X3NpemUgJiYgbG8tPmxvX2tleV9vd25lciAhPSBjdXJyZW50LT51aWQgJiYKCSAgICAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKCQlyZXR1cm4gLUVQRVJNOwoJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKCQlyZXR1cm4gLUVOWElPOwoJaWYgKCh1bnNpZ25lZCBpbnQpIGluZm8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPiBMT19LRVlfU0laRSkKCQlyZXR1cm4gLUVJTlZBTDsKCgllcnIgPSBsb29wX3JlbGVhc2VfeGZlcihsbyk7CglpZiAoZXJyKQoJCXJldHVybiBlcnI7CgoJaWYgKGluZm8tPmxvX2VuY3J5cHRfdHlwZSkgewoJCXVuc2lnbmVkIGludCB0eXBlID0gaW5mby0+bG9fZW5jcnlwdF90eXBlOwoKCQlpZiAodHlwZSA+PSBNQVhfTE9fQ1JZUFQpCgkJCXJldHVybiAtRUlOVkFMOwoJCXhmZXIgPSB4ZmVyX2Z1bmNzW3R5cGVdOwoJCWlmICh4ZmVyID09IE5VTEwpCgkJCXJldHVybiAtRUlOVkFMOwoJfSBlbHNlCgkJeGZlciA9IE5VTEw7CgoJZXJyID0gbG9vcF9pbml0X3hmZXIobG8sIHhmZXIsIGluZm8pOwoJaWYgKGVycikKCQlyZXR1cm4gZXJyOwoKCWlmIChsby0+bG9fb2Zmc2V0ICE9IGluZm8tPmxvX29mZnNldCB8fAoJICAgIGxvLT5sb19zaXplbGltaXQgIT0gaW5mby0+bG9fc2l6ZWxpbWl0KSB7CgkJbG8tPmxvX29mZnNldCA9IGluZm8tPmxvX29mZnNldDsKCQlsby0+bG9fc2l6ZWxpbWl0ID0gaW5mby0+bG9fc2l6ZWxpbWl0OwoJCWlmIChmaWd1cmVfbG9vcF9zaXplKGxvKSkKCQkJcmV0dXJuIC1FRkJJRzsKCX0KCgltZW1jcHkobG8tPmxvX2ZpbGVfbmFtZSwgaW5mby0+bG9fZmlsZV9uYW1lLCBMT19OQU1FX1NJWkUpOwoJbWVtY3B5KGxvLT5sb19jcnlwdF9uYW1lLCBpbmZvLT5sb19jcnlwdF9uYW1lLCBMT19OQU1FX1NJWkUpOwoJbG8tPmxvX2ZpbGVfbmFtZVtMT19OQU1FX1NJWkUtMV0gPSAwOwoJbG8tPmxvX2NyeXB0X25hbWVbTE9fTkFNRV9TSVpFLTFdID0gMDsKCglpZiAoIXhmZXIpCgkJeGZlciA9ICZub25lX2Z1bmNzOwoJbG8tPnRyYW5zZmVyID0geGZlci0+dHJhbnNmZXI7Cglsby0+aW9jdGwgPSB4ZmVyLT5pb2N0bDsKCglsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IGluZm8tPmxvX2VuY3J5cHRfa2V5X3NpemU7Cglsby0+bG9faW5pdFswXSA9IGluZm8tPmxvX2luaXRbMF07Cglsby0+bG9faW5pdFsxXSA9IGluZm8tPmxvX2luaXRbMV07CglpZiAoaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSkgewoJCW1lbWNweShsby0+bG9fZW5jcnlwdF9rZXksIGluZm8tPmxvX2VuY3J5cHRfa2V5LAoJCSAgICAgICBpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplKTsKCQlsby0+bG9fa2V5X293bmVyID0gY3VycmVudC0+dWlkOwoJfQkKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludApsb29wX2dldF9zdGF0dXMoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvKQp7CglzdHJ1Y3QgZmlsZSAqZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CglzdHJ1Y3Qga3N0YXQgc3RhdDsKCWludCBlcnJvcjsKCglpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQoJCXJldHVybiAtRU5YSU87CgllcnJvciA9IHZmc19nZXRhdHRyKGZpbGUtPmZfcGF0aC5tbnQsIGZpbGUtPmZfcGF0aC5kZW50cnksICZzdGF0KTsKCWlmIChlcnJvcikKCQlyZXR1cm4gZXJyb3I7CgltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CglpbmZvLT5sb19udW1iZXIgPSBsby0+bG9fbnVtYmVyOwoJaW5mby0+bG9fZGV2aWNlID0gaHVnZV9lbmNvZGVfZGV2KHN0YXQuZGV2KTsKCWluZm8tPmxvX2lub2RlID0gc3RhdC5pbm87CglpbmZvLT5sb19yZGV2aWNlID0gaHVnZV9lbmNvZGVfZGV2KGxvLT5sb19kZXZpY2UgPyBzdGF0LnJkZXYgOiBzdGF0LmRldik7CglpbmZvLT5sb19vZmZzZXQgPSBsby0+bG9fb2Zmc2V0OwoJaW5mby0+bG9fc2l6ZWxpbWl0ID0gbG8tPmxvX3NpemVsaW1pdDsKCWluZm8tPmxvX2ZsYWdzID0gbG8tPmxvX2ZsYWdzOwoJbWVtY3B5KGluZm8tPmxvX2ZpbGVfbmFtZSwgbG8tPmxvX2ZpbGVfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCW1lbWNweShpbmZvLT5sb19jcnlwdF9uYW1lLCBsby0+bG9fY3J5cHRfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCWluZm8tPmxvX2VuY3J5cHRfdHlwZSA9CgkJbG8tPmxvX2VuY3J5cHRpb24gPyBsby0+bG9fZW5jcnlwdGlvbi0+bnVtYmVyIDogMDsKCWlmIChsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSAmJiBjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CgkJaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IGxvLT5sb19lbmNyeXB0X2tleV9zaXplOwoJCW1lbWNweShpbmZvLT5sb19lbmNyeXB0X2tleSwgbG8tPmxvX2VuY3J5cHRfa2V5LAoJCSAgICAgICBsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKbG9vcF9pbmZvNjRfZnJvbV9vbGQoY29uc3Qgc3RydWN0IGxvb3BfaW5mbyAqaW5mbywgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvNjQpCnsKCW1lbXNldChpbmZvNjQsIDAsIHNpemVvZigqaW5mbzY0KSk7CglpbmZvNjQtPmxvX251bWJlciA9IGluZm8tPmxvX251bWJlcjsKCWluZm82NC0+bG9fZGV2aWNlID0gaW5mby0+bG9fZGV2aWNlOwoJaW5mbzY0LT5sb19pbm9kZSA9IGluZm8tPmxvX2lub2RlOwoJaW5mbzY0LT5sb19yZGV2aWNlID0gaW5mby0+bG9fcmRldmljZTsKCWluZm82NC0+bG9fb2Zmc2V0ID0gaW5mby0+bG9fb2Zmc2V0OwoJaW5mbzY0LT5sb19zaXplbGltaXQgPSAwOwoJaW5mbzY0LT5sb19lbmNyeXB0X3R5cGUgPSBpbmZvLT5sb19lbmNyeXB0X3R5cGU7CglpbmZvNjQtPmxvX2VuY3J5cHRfa2V5X3NpemUgPSBpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplOwoJaW5mbzY0LT5sb19mbGFncyA9IGluZm8tPmxvX2ZsYWdzOwoJaW5mbzY0LT5sb19pbml0WzBdID0gaW5mby0+bG9faW5pdFswXTsKCWluZm82NC0+bG9faW5pdFsxXSA9IGluZm8tPmxvX2luaXRbMV07CglpZiAoaW5mby0+bG9fZW5jcnlwdF90eXBlID09IExPX0NSWVBUX0NSWVBUT0FQSSkKCQltZW1jcHkoaW5mbzY0LT5sb19jcnlwdF9uYW1lLCBpbmZvLT5sb19uYW1lLCBMT19OQU1FX1NJWkUpOwoJZWxzZQoJCW1lbWNweShpbmZvNjQtPmxvX2ZpbGVfbmFtZSwgaW5mby0+bG9fbmFtZSwgTE9fTkFNRV9TSVpFKTsKCW1lbWNweShpbmZvNjQtPmxvX2VuY3J5cHRfa2V5LCBpbmZvLT5sb19lbmNyeXB0X2tleSwgTE9fS0VZX1NJWkUpOwp9CgpzdGF0aWMgaW50Cmxvb3BfaW5mbzY0X3RvX29sZChjb25zdCBzdHJ1Y3QgbG9vcF9pbmZvNjQgKmluZm82NCwgc3RydWN0IGxvb3BfaW5mbyAqaW5mbykKewoJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwoJaW5mby0+bG9fbnVtYmVyID0gaW5mbzY0LT5sb19udW1iZXI7CglpbmZvLT5sb19kZXZpY2UgPSBpbmZvNjQtPmxvX2RldmljZTsKCWluZm8tPmxvX2lub2RlID0gaW5mbzY0LT5sb19pbm9kZTsKCWluZm8tPmxvX3JkZXZpY2UgPSBpbmZvNjQtPmxvX3JkZXZpY2U7CglpbmZvLT5sb19vZmZzZXQgPSBpbmZvNjQtPmxvX29mZnNldDsKCWluZm8tPmxvX2VuY3J5cHRfdHlwZSA9IGluZm82NC0+bG9fZW5jcnlwdF90eXBlOwoJaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IGluZm82NC0+bG9fZW5jcnlwdF9rZXlfc2l6ZTsKCWluZm8tPmxvX2ZsYWdzID0gaW5mbzY0LT5sb19mbGFnczsKCWluZm8tPmxvX2luaXRbMF0gPSBpbmZvNjQtPmxvX2luaXRbMF07CglpbmZvLT5sb19pbml0WzFdID0gaW5mbzY0LT5sb19pbml0WzFdOwoJaWYgKGluZm8tPmxvX2VuY3J5cHRfdHlwZSA9PSBMT19DUllQVF9DUllQVE9BUEkpCgkJbWVtY3B5KGluZm8tPmxvX25hbWUsIGluZm82NC0+bG9fY3J5cHRfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCWVsc2UKCQltZW1jcHkoaW5mby0+bG9fbmFtZSwgaW5mbzY0LT5sb19maWxlX25hbWUsIExPX05BTUVfU0laRSk7CgltZW1jcHkoaW5mby0+bG9fZW5jcnlwdF9rZXksIGluZm82NC0+bG9fZW5jcnlwdF9rZXksIExPX0tFWV9TSVpFKTsKCgkvKiBlcnJvciBpbiBjYXNlIHZhbHVlcyB3ZXJlIHRydW5jYXRlZCAqLwoJaWYgKGluZm8tPmxvX2RldmljZSAhPSBpbmZvNjQtPmxvX2RldmljZSB8fAoJICAgIGluZm8tPmxvX3JkZXZpY2UgIT0gaW5mbzY0LT5sb19yZGV2aWNlIHx8CgkgICAgaW5mby0+bG9faW5vZGUgIT0gaW5mbzY0LT5sb19pbm9kZSB8fAoJICAgIGluZm8tPmxvX29mZnNldCAhPSBpbmZvNjQtPmxvX29mZnNldCkKCQlyZXR1cm4gLUVPVkVSRkxPVzsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludApsb29wX3NldF9zdGF0dXNfb2xkKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGNvbnN0IHN0cnVjdCBsb29wX2luZm8gX191c2VyICphcmcpCnsKCXN0cnVjdCBsb29wX2luZm8gaW5mbzsKCXN0cnVjdCBsb29wX2luZm82NCBpbmZvNjQ7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZiAoc3RydWN0IGxvb3BfaW5mbykpKQoJCXJldHVybiAtRUZBVUxUOwoJbG9vcF9pbmZvNjRfZnJvbV9vbGQoJmluZm8sICZpbmZvNjQpOwoJcmV0dXJuIGxvb3Bfc2V0X3N0YXR1cyhsbywgJmluZm82NCk7Cn0KCnN0YXRpYyBpbnQKbG9vcF9zZXRfc3RhdHVzNjQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0IF9fdXNlciAqYXJnKQp7CglzdHJ1Y3QgbG9vcF9pbmZvNjQgaW5mbzY0OwoKCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbzY0LCBhcmcsIHNpemVvZiAoc3RydWN0IGxvb3BfaW5mbzY0KSkpCgkJcmV0dXJuIC1FRkFVTFQ7CglyZXR1cm4gbG9vcF9zZXRfc3RhdHVzKGxvLCAmaW5mbzY0KTsKfQoKc3RhdGljIGludApsb29wX2dldF9zdGF0dXNfb2xkKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBsb29wX2luZm8gX191c2VyICphcmcpIHsKCXN0cnVjdCBsb29wX2luZm8gaW5mbzsKCXN0cnVjdCBsb29wX2luZm82NCBpbmZvNjQ7CglpbnQgZXJyID0gMDsKCglpZiAoIWFyZykKCQllcnIgPSAtRUlOVkFMOwoJaWYgKCFlcnIpCgkJZXJyID0gbG9vcF9nZXRfc3RhdHVzKGxvLCAmaW5mbzY0KTsKCWlmICghZXJyKQoJCWVyciA9IGxvb3BfaW5mbzY0X3RvX29sZCgmaW5mbzY0LCAmaW5mbyk7CglpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKCQllcnIgPSAtRUZBVUxUOwoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQKbG9vcF9nZXRfc3RhdHVzNjQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGxvb3BfaW5mbzY0IF9fdXNlciAqYXJnKSB7CglzdHJ1Y3QgbG9vcF9pbmZvNjQgaW5mbzY0OwoJaW50IGVyciA9IDA7CgoJaWYgKCFhcmcpCgkJZXJyID0gLUVJTlZBTDsKCWlmICghZXJyKQoJCWVyciA9IGxvb3BfZ2V0X3N0YXR1cyhsbywgJmluZm82NCk7CglpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbzY0LCBzaXplb2YoaW5mbzY0KSkpCgkJZXJyID0gLUVGQVVMVDsKCglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50IGxvX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCgl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKCWludCBlcnI7CgoJbXV0ZXhfbG9jaygmbG8tPmxvX2N0bF9tdXRleCk7Cglzd2l0Y2ggKGNtZCkgewoJY2FzZSBMT09QX1NFVF9GRDoKCQllcnIgPSBsb29wX3NldF9mZChsbywgZmlsZSwgaW5vZGUtPmlfYmRldiwgYXJnKTsKCQlicmVhazsKCWNhc2UgTE9PUF9DSEFOR0VfRkQ6CgkJZXJyID0gbG9vcF9jaGFuZ2VfZmQobG8sIGZpbGUsIGlub2RlLT5pX2JkZXYsIGFyZyk7CgkJYnJlYWs7CgljYXNlIExPT1BfQ0xSX0ZEOgoJCWVyciA9IGxvb3BfY2xyX2ZkKGxvLCBpbm9kZS0+aV9iZGV2KTsKCQlicmVhazsKCWNhc2UgTE9PUF9TRVRfU1RBVFVTOgoJCWVyciA9IGxvb3Bfc2V0X3N0YXR1c19vbGQobG8sIChzdHJ1Y3QgbG9vcF9pbmZvIF9fdXNlciAqKSBhcmcpOwoJCWJyZWFrOwoJY2FzZSBMT09QX0dFVF9TVEFUVVM6CgkJZXJyID0gbG9vcF9nZXRfc3RhdHVzX29sZChsbywgKHN0cnVjdCBsb29wX2luZm8gX191c2VyICopIGFyZyk7CgkJYnJlYWs7CgljYXNlIExPT1BfU0VUX1NUQVRVUzY0OgoJCWVyciA9IGxvb3Bfc2V0X3N0YXR1czY0KGxvLCAoc3RydWN0IGxvb3BfaW5mbzY0IF9fdXNlciAqKSBhcmcpOwoJCWJyZWFrOwoJY2FzZSBMT09QX0dFVF9TVEFUVVM2NDoKCQllcnIgPSBsb29wX2dldF9zdGF0dXM2NChsbywgKHN0cnVjdCBsb29wX2luZm82NCBfX3VzZXIgKikgYXJnKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJZXJyID0gbG8tPmlvY3RsID8gbG8tPmlvY3RsKGxvLCBjbWQsIGFyZykgOiAtRUlOVkFMOwoJfQoJbXV0ZXhfdW5sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCXJldHVybiBlcnI7Cn0KCiNpZmRlZiBDT05GSUdfQ09NUEFUCnN0cnVjdCBjb21wYXRfbG9vcF9pbmZvIHsKCWNvbXBhdF9pbnRfdAlsb19udW1iZXI7ICAgICAgLyogaW9jdGwgci9vICovCgljb21wYXRfZGV2X3QJbG9fZGV2aWNlOyAgICAgIC8qIGlvY3RsIHIvbyAqLwoJY29tcGF0X3Vsb25nX3QJbG9faW5vZGU7ICAgICAgIC8qIGlvY3RsIHIvbyAqLwoJY29tcGF0X2Rldl90CWxvX3JkZXZpY2U7ICAgICAvKiBpb2N0bCByL28gKi8KCWNvbXBhdF9pbnRfdAlsb19vZmZzZXQ7Cgljb21wYXRfaW50X3QJbG9fZW5jcnlwdF90eXBlOwoJY29tcGF0X2ludF90CWxvX2VuY3J5cHRfa2V5X3NpemU7ICAgIC8qIGlvY3RsIHcvbyAqLwoJY29tcGF0X2ludF90CWxvX2ZsYWdzOyAgICAgICAvKiBpb2N0bCByL28gKi8KCWNoYXIJCWxvX25hbWVbTE9fTkFNRV9TSVpFXTsKCXVuc2lnbmVkIGNoYXIJbG9fZW5jcnlwdF9rZXlbTE9fS0VZX1NJWkVdOyAvKiBpb2N0bCB3L28gKi8KCWNvbXBhdF91bG9uZ190CWxvX2luaXRbMl07CgljaGFyCQlyZXNlcnZlZFs0XTsKfTsKCi8qCiAqIFRyYW5zZmVyIDMyLWJpdCBjb21wYXRpYmlsaXR5IHN0cnVjdHVyZSBpbiB1c2Vyc3BhY2UgdG8gNjQtYml0IGxvb3AgaW5mbwogKiAtIG5vaW5saW5lZCB0byByZWR1Y2Ugc3RhY2sgc3BhY2UgdXNhZ2UgaW4gbWFpbiBwYXJ0IG9mIGRyaXZlcgogKi8Kc3RhdGljIG5vaW5saW5lIGludApsb29wX2luZm82NF9mcm9tX2NvbXBhdChjb25zdCBzdHJ1Y3QgY29tcGF0X2xvb3BfaW5mbyBfX3VzZXIgKmFyZywKCQkJc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvNjQpCnsKCXN0cnVjdCBjb21wYXRfbG9vcF9pbmZvIGluZm87CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJbWVtc2V0KGluZm82NCwgMCwgc2l6ZW9mKCppbmZvNjQpKTsKCWluZm82NC0+bG9fbnVtYmVyID0gaW5mby5sb19udW1iZXI7CglpbmZvNjQtPmxvX2RldmljZSA9IGluZm8ubG9fZGV2aWNlOwoJaW5mbzY0LT5sb19pbm9kZSA9IGluZm8ubG9faW5vZGU7CglpbmZvNjQtPmxvX3JkZXZpY2UgPSBpbmZvLmxvX3JkZXZpY2U7CglpbmZvNjQtPmxvX29mZnNldCA9IGluZm8ubG9fb2Zmc2V0OwoJaW5mbzY0LT5sb19zaXplbGltaXQgPSAwOwoJaW5mbzY0LT5sb19lbmNyeXB0X3R5cGUgPSBpbmZvLmxvX2VuY3J5cHRfdHlwZTsKCWluZm82NC0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IGluZm8ubG9fZW5jcnlwdF9rZXlfc2l6ZTsKCWluZm82NC0+bG9fZmxhZ3MgPSBpbmZvLmxvX2ZsYWdzOwoJaW5mbzY0LT5sb19pbml0WzBdID0gaW5mby5sb19pbml0WzBdOwoJaW5mbzY0LT5sb19pbml0WzFdID0gaW5mby5sb19pbml0WzFdOwoJaWYgKGluZm8ubG9fZW5jcnlwdF90eXBlID09IExPX0NSWVBUX0NSWVBUT0FQSSkKCQltZW1jcHkoaW5mbzY0LT5sb19jcnlwdF9uYW1lLCBpbmZvLmxvX25hbWUsIExPX05BTUVfU0laRSk7CgllbHNlCgkJbWVtY3B5KGluZm82NC0+bG9fZmlsZV9uYW1lLCBpbmZvLmxvX25hbWUsIExPX05BTUVfU0laRSk7CgltZW1jcHkoaW5mbzY0LT5sb19lbmNyeXB0X2tleSwgaW5mby5sb19lbmNyeXB0X2tleSwgTE9fS0VZX1NJWkUpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIFRyYW5zZmVyIDY0LWJpdCBsb29wIGluZm8gdG8gMzItYml0IGNvbXBhdGliaWxpdHkgc3RydWN0dXJlIGluIHVzZXJzcGFjZQogKiAtIG5vaW5saW5lZCB0byByZWR1Y2Ugc3RhY2sgc3BhY2UgdXNhZ2UgaW4gbWFpbiBwYXJ0IG9mIGRyaXZlcgogKi8Kc3RhdGljIG5vaW5saW5lIGludApsb29wX2luZm82NF90b19jb21wYXQoY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvNjQsCgkJICAgICAgc3RydWN0IGNvbXBhdF9sb29wX2luZm8gX191c2VyICphcmcpCnsKCXN0cnVjdCBjb21wYXRfbG9vcF9pbmZvIGluZm87CgoJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwoJaW5mby5sb19udW1iZXIgPSBpbmZvNjQtPmxvX251bWJlcjsKCWluZm8ubG9fZGV2aWNlID0gaW5mbzY0LT5sb19kZXZpY2U7CglpbmZvLmxvX2lub2RlID0gaW5mbzY0LT5sb19pbm9kZTsKCWluZm8ubG9fcmRldmljZSA9IGluZm82NC0+bG9fcmRldmljZTsKCWluZm8ubG9fb2Zmc2V0ID0gaW5mbzY0LT5sb19vZmZzZXQ7CglpbmZvLmxvX2VuY3J5cHRfdHlwZSA9IGluZm82NC0+bG9fZW5jcnlwdF90eXBlOwoJaW5mby5sb19lbmNyeXB0X2tleV9zaXplID0gaW5mbzY0LT5sb19lbmNyeXB0X2tleV9zaXplOwoJaW5mby5sb19mbGFncyA9IGluZm82NC0+bG9fZmxhZ3M7CglpbmZvLmxvX2luaXRbMF0gPSBpbmZvNjQtPmxvX2luaXRbMF07CglpbmZvLmxvX2luaXRbMV0gPSBpbmZvNjQtPmxvX2luaXRbMV07CglpZiAoaW5mby5sb19lbmNyeXB0X3R5cGUgPT0gTE9fQ1JZUFRfQ1JZUFRPQVBJKQoJCW1lbWNweShpbmZvLmxvX25hbWUsIGluZm82NC0+bG9fY3J5cHRfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCWVsc2UKCQltZW1jcHkoaW5mby5sb19uYW1lLCBpbmZvNjQtPmxvX2ZpbGVfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCW1lbWNweShpbmZvLmxvX2VuY3J5cHRfa2V5LCBpbmZvNjQtPmxvX2VuY3J5cHRfa2V5LCBMT19LRVlfU0laRSk7CgoJLyogZXJyb3IgaW4gY2FzZSB2YWx1ZXMgd2VyZSB0cnVuY2F0ZWQgKi8KCWlmIChpbmZvLmxvX2RldmljZSAhPSBpbmZvNjQtPmxvX2RldmljZSB8fAoJICAgIGluZm8ubG9fcmRldmljZSAhPSBpbmZvNjQtPmxvX3JkZXZpY2UgfHwKCSAgICBpbmZvLmxvX2lub2RlICE9IGluZm82NC0+bG9faW5vZGUgfHwKCSAgICBpbmZvLmxvX29mZnNldCAhPSBpbmZvNjQtPmxvX29mZnNldCB8fAoJICAgIGluZm8ubG9faW5pdFswXSAhPSBpbmZvNjQtPmxvX2luaXRbMF0gfHwKCSAgICBpbmZvLmxvX2luaXRbMV0gIT0gaW5mbzY0LT5sb19pbml0WzFdKQoJCXJldHVybiAtRU9WRVJGTE9XOwoKCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKCQlyZXR1cm4gLUVGQVVMVDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50Cmxvb3Bfc2V0X3N0YXR1c19jb21wYXQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywKCQkgICAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9sb29wX2luZm8gX191c2VyICphcmcpCnsKCXN0cnVjdCBsb29wX2luZm82NCBpbmZvNjQ7CglpbnQgcmV0OwoKCXJldCA9IGxvb3BfaW5mbzY0X2Zyb21fY29tcGF0KGFyZywgJmluZm82NCk7CglpZiAocmV0IDwgMCkKCQlyZXR1cm4gcmV0OwoJcmV0dXJuIGxvb3Bfc2V0X3N0YXR1cyhsbywgJmluZm82NCk7Cn0KCnN0YXRpYyBpbnQKbG9vcF9nZXRfc3RhdHVzX2NvbXBhdChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLAoJCSAgICAgICBzdHJ1Y3QgY29tcGF0X2xvb3BfaW5mbyBfX3VzZXIgKmFyZykKewoJc3RydWN0IGxvb3BfaW5mbzY0IGluZm82NDsKCWludCBlcnIgPSAwOwoKCWlmICghYXJnKQoJCWVyciA9IC1FSU5WQUw7CglpZiAoIWVycikKCQllcnIgPSBsb29wX2dldF9zdGF0dXMobG8sICZpbmZvNjQpOwoJaWYgKCFlcnIpCgkJZXJyID0gbG9vcF9pbmZvNjRfdG9fY29tcGF0KCZpbmZvNjQsIGFyZyk7CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgbG9uZyBsb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CglpbnQgZXJyOwoKCWxvY2tfa2VybmVsKCk7Cglzd2l0Y2goY21kKSB7CgljYXNlIExPT1BfU0VUX1NUQVRVUzoKCQltdXRleF9sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCQllcnIgPSBsb29wX3NldF9zdGF0dXNfY29tcGF0KAoJCQlsbywgKGNvbnN0IHN0cnVjdCBjb21wYXRfbG9vcF9pbmZvIF9fdXNlciAqKSBhcmcpOwoJCW11dGV4X3VubG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CgkJYnJlYWs7CgljYXNlIExPT1BfR0VUX1NUQVRVUzoKCQltdXRleF9sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCQllcnIgPSBsb29wX2dldF9zdGF0dXNfY29tcGF0KAoJCQlsbywgKHN0cnVjdCBjb21wYXRfbG9vcF9pbmZvIF9fdXNlciAqKSBhcmcpOwoJCW11dGV4X3VubG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CgkJYnJlYWs7CgljYXNlIExPT1BfQ0xSX0ZEOgoJY2FzZSBMT09QX0dFVF9TVEFUVVM2NDoKCWNhc2UgTE9PUF9TRVRfU1RBVFVTNjQ6CgkJYXJnID0gKHVuc2lnbmVkIGxvbmcpIGNvbXBhdF9wdHIoYXJnKTsKCWNhc2UgTE9PUF9TRVRfRkQ6CgljYXNlIExPT1BfQ0hBTkdFX0ZEOgoJCWVyciA9IGxvX2lvY3RsKGlub2RlLCBmaWxlLCBjbWQsIGFyZyk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWVyciA9IC1FTk9JT0NUTENNRDsKCQlicmVhazsKCX0KCXVubG9ja19rZXJuZWwoKTsKCXJldHVybiBlcnI7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGxvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CgoJbXV0ZXhfbG9jaygmbG8tPmxvX2N0bF9tdXRleCk7Cglsby0+bG9fcmVmY250Kys7CgltdXRleF91bmxvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGxvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CgoJbXV0ZXhfbG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CgktLWxvLT5sb19yZWZjbnQ7CgltdXRleF91bmxvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGxvX2ZvcHMgPSB7Cgkub3duZXIgPQlUSElTX01PRFVMRSwKCS5vcGVuID0JCWxvX29wZW4sCgkucmVsZWFzZSA9CWxvX3JlbGVhc2UsCgkuaW9jdGwgPQlsb19pb2N0bCwKI2lmZGVmIENPTkZJR19DT01QQVQKCS5jb21wYXRfaW9jdGwgPQlsb19jb21wYXRfaW9jdGwsCiNlbmRpZgp9OwoKLyoKICogQW5kIG5vdyB0aGUgbW9kdWxlcyBjb2RlIGFuZCBrZXJuZWwgaW50ZXJmYWNlLgogKi8Kc3RhdGljIGludCBtYXhfbG9vcDsKbW9kdWxlX3BhcmFtKG1heF9sb29wLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1heF9sb29wLCAiTWF4aW11bSBudW1iZXIgb2YgbG9vcCBkZXZpY2VzIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FMSUFTX0JMT0NLREVWX01BSk9SKExPT1BfTUFKT1IpOwoKaW50IGxvb3BfcmVnaXN0ZXJfdHJhbnNmZXIoc3RydWN0IGxvb3BfZnVuY190YWJsZSAqZnVuY3MpCnsKCXVuc2lnbmVkIGludCBuID0gZnVuY3MtPm51bWJlcjsKCglpZiAobiA+PSBNQVhfTE9fQ1JZUFQgfHwgeGZlcl9mdW5jc1tuXSkKCQlyZXR1cm4gLUVJTlZBTDsKCXhmZXJfZnVuY3Nbbl0gPSBmdW5jczsKCXJldHVybiAwOwp9CgppbnQgbG9vcF91bnJlZ2lzdGVyX3RyYW5zZmVyKGludCBudW1iZXIpCnsKCXVuc2lnbmVkIGludCBuID0gbnVtYmVyOwoJc3RydWN0IGxvb3BfZGV2aWNlICpsbzsKCXN0cnVjdCBsb29wX2Z1bmNfdGFibGUgKnhmZXI7CgoJaWYgKG4gPT0gMCB8fCBuID49IE1BWF9MT19DUllQVCB8fCAoeGZlciA9IHhmZXJfZnVuY3Nbbl0pID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJeGZlcl9mdW5jc1tuXSA9IE5VTEw7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShsbywgJmxvb3BfZGV2aWNlcywgbG9fbGlzdCkgewoJCW11dGV4X2xvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoKCQlpZiAobG8tPmxvX2VuY3J5cHRpb24gPT0geGZlcikKCQkJbG9vcF9yZWxlYXNlX3hmZXIobG8pOwoKCQltdXRleF91bmxvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwoJfQoKCXJldHVybiAwOwp9CgpFWFBPUlRfU1lNQk9MKGxvb3BfcmVnaXN0ZXJfdHJhbnNmZXIpOwpFWFBPUlRfU1lNQk9MKGxvb3BfdW5yZWdpc3Rlcl90cmFuc2Zlcik7CgpzdGF0aWMgc3RydWN0IGxvb3BfZGV2aWNlICpsb29wX2FsbG9jKGludCBpKQp7CglzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvOwoJc3RydWN0IGdlbmRpc2sgKmRpc2s7CgoJbG8gPSBremFsbG9jKHNpemVvZigqbG8pLCBHRlBfS0VSTkVMKTsKCWlmICghbG8pCgkJZ290byBvdXQ7CgoJbG8tPmxvX3F1ZXVlID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwoJaWYgKCFsby0+bG9fcXVldWUpCgkJZ290byBvdXRfZnJlZV9kZXY7CgoJZGlzayA9IGxvLT5sb19kaXNrID0gYWxsb2NfZGlzaygxKTsKCWlmICghZGlzaykKCQlnb3RvIG91dF9mcmVlX3F1ZXVlOwoKCW11dGV4X2luaXQoJmxvLT5sb19jdGxfbXV0ZXgpOwoJbG8tPmxvX251bWJlcgkJPSBpOwoJbG8tPmxvX3RocmVhZAkJPSBOVUxMOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmbG8tPmxvX2V2ZW50KTsKCXNwaW5fbG9ja19pbml0KCZsby0+bG9fbG9jayk7CglkaXNrLT5tYWpvcgkJPSBMT09QX01BSk9SOwoJZGlzay0+Zmlyc3RfbWlub3IJPSBpOwoJZGlzay0+Zm9wcwkJPSAmbG9fZm9wczsKCWRpc2stPnByaXZhdGVfZGF0YQk9IGxvOwoJZGlzay0+cXVldWUJCT0gbG8tPmxvX3F1ZXVlOwoJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJsb29wJWQiLCBpKTsKCXJldHVybiBsbzsKCm91dF9mcmVlX3F1ZXVlOgoJYmxrX2NsZWFudXBfcXVldWUobG8tPmxvX3F1ZXVlKTsKb3V0X2ZyZWVfZGV2OgoJa2ZyZWUobG8pOwpvdXQ6CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQgbG9vcF9mcmVlKHN0cnVjdCBsb29wX2RldmljZSAqbG8pCnsKCWJsa19jbGVhbnVwX3F1ZXVlKGxvLT5sb19xdWV1ZSk7CglwdXRfZGlzayhsby0+bG9fZGlzayk7CglsaXN0X2RlbCgmbG8tPmxvX2xpc3QpOwoJa2ZyZWUobG8pOwp9CgpzdGF0aWMgc3RydWN0IGxvb3BfZGV2aWNlICpsb29wX2luaXRfb25lKGludCBpKQp7CglzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkobG8sICZsb29wX2RldmljZXMsIGxvX2xpc3QpIHsKCQlpZiAobG8tPmxvX251bWJlciA9PSBpKQoJCQlyZXR1cm4gbG87Cgl9CgoJbG8gPSBsb29wX2FsbG9jKGkpOwoJaWYgKGxvKSB7CgkJYWRkX2Rpc2sobG8tPmxvX2Rpc2spOwoJCWxpc3RfYWRkX3RhaWwoJmxvLT5sb19saXN0LCAmbG9vcF9kZXZpY2VzKTsKCX0KCXJldHVybiBsbzsKfQoKc3RhdGljIHZvaWQgbG9vcF9kZWxfb25lKHN0cnVjdCBsb29wX2RldmljZSAqbG8pCnsKCWRlbF9nZW5kaXNrKGxvLT5sb19kaXNrKTsKCWxvb3BfZnJlZShsbyk7Cn0KCnN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqbG9vcF9wcm9iZShkZXZfdCBkZXYsIGludCAqcGFydCwgdm9pZCAqZGF0YSkKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbzsKCXN0cnVjdCBrb2JqZWN0ICprb2JqOwoKCW11dGV4X2xvY2soJmxvb3BfZGV2aWNlc19tdXRleCk7CglsbyA9IGxvb3BfaW5pdF9vbmUoZGV2ICYgTUlOT1JNQVNLKTsKCWtvYmogPSBsbyA/IGdldF9kaXNrKGxvLT5sb19kaXNrKSA6IEVSUl9QVFIoLUVOT01FTSk7CgltdXRleF91bmxvY2soJmxvb3BfZGV2aWNlc19tdXRleCk7CgoJKnBhcnQgPSAwOwoJcmV0dXJuIGtvYmo7Cn0KCnN0YXRpYyBpbnQgX19pbml0IGxvb3BfaW5pdCh2b2lkKQp7CglpbnQgaSwgbnI7Cgl1bnNpZ25lZCBsb25nIHJhbmdlOwoJc3RydWN0IGxvb3BfZGV2aWNlICpsbywgKm5leHQ7CgoJLyoKCSAqIGxvb3AgbW9kdWxlIG5vdyBoYXMgYSBmZWF0dXJlIHRvIGluc3RhbnRpYXRlIHVuZGVybHlpbmcgZGV2aWNlCgkgKiBzdHJ1Y3R1cmUgb24tZGVtYW5kLCBwcm92aWRlZCB0aGF0IHRoZXJlIGlzIGFuIGFjY2VzcyBkZXYgbm9kZS4KCSAqIEhvd2V2ZXIsIHRoaXMgd2lsbCBub3Qgd29yayB3ZWxsIHdpdGggdXNlciBzcGFjZSB0b29sIHRoYXQgZG9lc24ndAoJICoga25vdyBhYm91dCBzdWNoICJmZWF0dXJlIi4gIEluIG9yZGVyIHRvIG5vdCBicmVhayBhbnkgZXhpc3RpbmcKCSAqIHRvb2wsIHdlIGRvIHRoZSBmb2xsb3dpbmc6CgkgKgoJICogKDEpIGlmIG1heF9sb29wIGlzIHNwZWNpZmllZCwgY3JlYXRlIHRoYXQgbWFueSB1cGZyb250LCBhbmQgdGhpcwoJICogICAgIGFsc28gYmVjb21lcyBhIGhhcmQgbGltaXQuCgkgKiAoMikgaWYgbWF4X2xvb3AgaXMgbm90IHNwZWNpZmllZCwgY3JlYXRlIDggbG9vcCBkZXZpY2Ugb24gbW9kdWxlCgkgKiAgICAgbG9hZCwgdXNlciBjYW4gZnVydGhlciBleHRlbmQgbG9vcCBkZXZpY2UgYnkgY3JlYXRlIGRldiBub2RlCgkgKiAgICAgdGhlbXNlbHZlcyBhbmQgaGF2ZSBrZXJuZWwgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZSBhY3R1YWwKCSAqICAgICBkZXZpY2Ugb24tZGVtYW5kLgoJICovCglpZiAobWF4X2xvb3AgPiAxVUwgPDwgTUlOT1JCSVRTKQoJCXJldHVybiAtRUlOVkFMOwoKCWlmIChtYXhfbG9vcCkgewoJCW5yID0gbWF4X2xvb3A7CgkJcmFuZ2UgPSBtYXhfbG9vcDsKCX0gZWxzZSB7CgkJbnIgPSA4OwoJCXJhbmdlID0gMVVMIDw8IE1JTk9SQklUUzsKCX0KCglpZiAocmVnaXN0ZXJfYmxrZGV2KExPT1BfTUFKT1IsICJsb29wIikpCgkJcmV0dXJuIC1FSU87CgoJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKCQlsbyA9IGxvb3BfYWxsb2MoaSk7CgkJaWYgKCFsbykKCQkJZ290byBFbm9tZW07CgkJbGlzdF9hZGRfdGFpbCgmbG8tPmxvX2xpc3QsICZsb29wX2RldmljZXMpOwoJfQoKCS8qIHBvaW50IG9mIG5vIHJldHVybiAqLwoKCWxpc3RfZm9yX2VhY2hfZW50cnkobG8sICZsb29wX2RldmljZXMsIGxvX2xpc3QpCgkJYWRkX2Rpc2sobG8tPmxvX2Rpc2spOwoKCWJsa19yZWdpc3Rlcl9yZWdpb24oTUtERVYoTE9PUF9NQUpPUiwgMCksIHJhbmdlLAoJCQkJICBUSElTX01PRFVMRSwgbG9vcF9wcm9iZSwgTlVMTCwgTlVMTCk7CgoJcHJpbnRrKEtFUk5fSU5GTyAibG9vcDogbW9kdWxlIGxvYWRlZFxuIik7CglyZXR1cm4gMDsKCkVub21lbToKCXByaW50ayhLRVJOX0lORk8gImxvb3A6IG91dCBvZiBtZW1vcnlcbiIpOwoKCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsbywgbmV4dCwgJmxvb3BfZGV2aWNlcywgbG9fbGlzdCkKCQlsb29wX2ZyZWUobG8pOwoKCXVucmVnaXN0ZXJfYmxrZGV2KExPT1BfTUFKT1IsICJsb29wIik7CglyZXR1cm4gLUVOT01FTTsKfQoKc3RhdGljIHZvaWQgX19leGl0IGxvb3BfZXhpdCh2b2lkKQp7Cgl1bnNpZ25lZCBsb25nIHJhbmdlOwoJc3RydWN0IGxvb3BfZGV2aWNlICpsbywgKm5leHQ7CgoJcmFuZ2UgPSBtYXhfbG9vcCA/IG1heF9sb29wIDogIDFVTCA8PCBNSU5PUkJJVFM7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvLCBuZXh0LCAmbG9vcF9kZXZpY2VzLCBsb19saXN0KQoJCWxvb3BfZGVsX29uZShsbyk7CgoJYmxrX3VucmVnaXN0ZXJfcmVnaW9uKE1LREVWKExPT1BfTUFKT1IsIDApLCByYW5nZSk7CglpZiAodW5yZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb29wOiBjYW5ub3QgdW5yZWdpc3RlciBibGtkZXZcbiIpOwp9Cgptb2R1bGVfaW5pdChsb29wX2luaXQpOwptb2R1bGVfZXhpdChsb29wX2V4aXQpOwoKI2lmbmRlZiBNT0RVTEUKc3RhdGljIGludCBfX2luaXQgbWF4X2xvb3Bfc2V0dXAoY2hhciAqc3RyKQp7CgltYXhfbG9vcCA9IHNpbXBsZV9zdHJ0b2woc3RyLCBOVUxMLCAwKTsKCXJldHVybiAxOwp9CgpfX3NldHVwKCJtYXhfbG9vcD0iLCBtYXhfbG9vcF9zZXR1cCk7CiNlbmRpZgo=