From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Garnier Subject: [RFC v3 20/27] x86/ftrace: Adapt function tracing for PIE support Date: Wed, 4 Oct 2017 14:19:56 -0700 Message-ID: <20171004212003.28296-21-thgarnie@google.com> References: <20171004212003.28296-1-thgarnie@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: linux-arch@vger.kernel.org, kvm@vger.kernel.org, linux-pm@vger.kernel.org, x86@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-sparse@vger.kernel.org, linux-crypto@vger.kernel.org, kernel-hardening@lists.openwall.com, xen-devel@lists.xenproject.org To: Herbert Xu , "David S . Miller" , Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , Peter Zijlstra , Josh Poimboeuf , Thomas Garnier , Arnd Bergmann , Kees Cook , Matthias Kaehlcke , Tom Lendacky , Andy Lutomirski , "Kirill A . Shutemov" , Borislav Petkov , "Rafael J . Wysocki" , Len Brown , Pavel Machek , Juergen Gross , Chris Wright , Alok Kataria , Rusty Russell , Tejun Heo , Christoph Lameter , Bor Return-path: In-Reply-To: <20171004212003.28296-1-thgarnie@google.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" List-Id: linux-crypto.vger.kernel.org V2hlbiB1c2luZyAtZlBJRS9QSUMgd2l0aCBmdW5jdGlvbiB0cmFjaW5nLCB0aGUgY29tcGlsZXIg Z2VuZXJhdGVzIGEKY2FsbCB0aHJvdWdoIHRoZSBHT1QgKGNhbGwgKl9fZmVudHJ5X19AR09UUENS RUwpLiBUaGlzIGluc3RydWN0aW9uCnRha2VzIDYgYnl0ZXMgaW5zdGVhZCBvZiA1IG9uIHRoZSB1 c3VhbCByZWxhdGl2ZSBjYWxsLgoKV2l0aCB0aGlzIGNoYW5nZSwgZnVuY3Rpb24gdHJhY2luZyBz dXBwb3J0cyA2IGJ5dGVzIG9uIHRyYWNlYWJsZQpmdW5jdGlvbiBhbmQgY2FuIHN0aWxsIHJlcGxh Y2UgcmVsYXRpdmUgY2FsbHMgb24gdGhlIGZ0cmFjZSBhc3NlbWJseQpmdW5jdGlvbnMuCgpQb3Np dGlvbiBJbmRlcGVuZGVudCBFeGVjdXRhYmxlIChQSUUpIHN1cHBvcnQgd2lsbCBhbGxvdyB0byBl eHRlbmRlZCB0aGUKS0FTTFIgcmFuZG9taXphdGlvbiByYW5nZSBiZWxvdyB0aGUgLTJHIG1lbW9y eSBsaW1pdC4KClNpZ25lZC1vZmYtYnk6IFRob21hcyBHYXJuaWVyIDx0aGdhcm5pZUBnb29nbGUu Y29tPgotLS0KIGFyY2gveDg2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oICAgfCAgMjMgKysrKystCiBh cmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIHwgICA0ICsKIGFyY2gveDg2L2tlcm5lbC9m dHJhY2UuYyAgICAgICAgfCAxNjggKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0t LS0tLQogYXJjaC94ODYva2VybmVsL21vZHVsZS5sZHMgICAgICB8ICAgMyArCiA0IGZpbGVzIGNo YW5nZWQsIDEzOSBpbnNlcnRpb25zKCspLCA1OSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEw MDY0NCBhcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmxkcwoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lu Y2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnRyYWNlLmgKaW5kZXgg ZWNjZDBhYzZiYzM4Li5iOGJiY2M3ZmFkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUv YXNtL2Z0cmFjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oCkBAIC0xLDYg KzEsNyBAQAogI2lmbmRlZiBfQVNNX1g4Nl9GVFJBQ0VfSAogI2RlZmluZSBfQVNNX1g4Nl9GVFJB Q0VfSAogCisKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCiAjaWZkZWYgQ0NfVVNJTkdf RkVOVFJZCiAjIGRlZmluZSBNQ09VTlRfQUREUgkJKCh1bnNpZ25lZCBsb25nKShfX2ZlbnRyeV9f KSkKQEAgLTgsNyArOSwxOSBAQAogIyBkZWZpbmUgTUNPVU5UX0FERFIJCSgodW5zaWduZWQgbG9u ZykobWNvdW50KSkKICMgZGVmaW5lIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogI2VuZGlm Ci0jZGVmaW5lIE1DT1VOVF9JTlNOX1NJWkUJNSAvKiBzaXplb2YgbWNvdW50IGNhbGwgKi8KKwor I2RlZmluZSBNQ09VTlRfUkVMSU5TTl9TSVpFCTUgLyogc2l6ZW9mIHJlbGF0aXZlIChjYWxsIG9y IGp1bXApICovCisjZGVmaW5lIE1DT1VOVF9HT1RDQUxMX1NJWkUJNiAvKiBzaXplb2YgY2FsbCAq Z290ICovCisKKy8qCisgKiBNQ09VTlRfSU5TTl9TSVpFIGlzIHRoZSBoaWdoZXN0IHNpemUgb2Yg aW5zdHJ1Y3Rpb25zIGJhc2VkIG9uIHRoZQorICogY29uZmlndXJhdGlvbi4KKyAqLworI2lmZGVm IENPTkZJR19YODZfUElFCisjZGVmaW5lIE1DT1VOVF9JTlNOX1NJWkUJTUNPVU5UX0dPVENBTExf U0laRQorI2Vsc2UKKyNkZWZpbmUgTUNPVU5UX0lOU05fU0laRQlNQ09VTlRfUkVMSU5TTl9TSVpF CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQogI2RlZmluZSBBUkNIX1NV UFBPUlRTX0ZUUkFDRV9PUFMgMQpAQCAtMTcsNiArMzAsOCBAQAogI2RlZmluZSBIQVZFX0ZVTkNU SU9OX0dSQVBIX1JFVF9BRERSX1BUUgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUg PGFzbS9zZWN0aW9ucy5oPgorCiBleHRlcm4gdm9pZCBtY291bnQodm9pZCk7CiBleHRlcm4gYXRv bWljX3QgbW9kaWZ5aW5nX2Z0cmFjZV9jb2RlOwogZXh0ZXJuIHZvaWQgX19mZW50cnlfXyh2b2lk KTsKQEAgLTI0LDkgKzM5LDExIEBAIGV4dGVybiB2b2lkIF9fZmVudHJ5X18odm9pZCk7CiBzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZnRyYWNlX2NhbGxfYWRqdXN0KHVuc2lnbmVkIGxvbmcg YWRkcikKIHsKIAkvKgotCSAqIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1jb3VudCBjYWxs IGluc3RydWN0aW9uLgotCSAqIHJlY29yZG1jb3VudCBkb2VzIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0 IGNhbGN1bGF0aW9uLgorCSAqIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1jb3VudCBjYWxs IGluc3RydWN0aW9uLiBQSUUgaGFzIGFsd2F5cyBhCisJICogYnl0ZSBhZGRlZCB0byB0aGUgc3Rh cnQgb2YgdGhlIGZ1bmN0aW9uLgogCSAqLworCWlmIChJU19FTkFCTEVEKENPTkZJR19YODZfUElF KSkKKwkJYWRkciAtPSAxOwogCXJldHVybiBhZGRyOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4 Ni9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2VjdGlvbnMu aAppbmRleCAyZjc1ZjMwY2IyZjYuLjZiMmQ0OTZjZjFhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYv aW5jbHVkZS9hc20vc2VjdGlvbnMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWN0aW9u cy5oCkBAIC0xMSw0ICsxMSw4IEBAIGV4dGVybiBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5 IF9fc3RvcF9fX2V4X3RhYmxlW107CiBleHRlcm4gY2hhciBfX2VuZF9yb2RhdGFfaHBhZ2VfYWxp Z25bXTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X1BJRSkKK2V4dGVybiBjaGFy IF9fc3RhcnRfZ290W10sIF9fZW5kX2dvdFtdOworI2VuZGlmCisKICNlbmRpZgkvKiBfQVNNX1g4 Nl9TRUNUSU9OU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMgYi9h cmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMKaW5kZXggOWJlZjFiYmViYTYzLi40MWQ4YzRjNDMwNmQg MTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJu ZWwvZnRyYWNlLmMKQEAgLTU4LDEyICs1OCwxNyBAQCBzdGF0aWMgaW50IGZ0cmFjZV9jYWxjX29m ZnNldChsb25nIGlwLCBsb25nIGFkZHIpCiAJcmV0dXJuIChpbnQpKGFkZHIgLSBpcCk7CiB9CiAK LXN0YXRpYyB1bnNpZ25lZCBjaGFyICpmdHJhY2VfY2FsbF9yZXBsYWNlKHVuc2lnbmVkIGxvbmcg aXAsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpmdHJhY2VfY2Fs bF9yZXBsYWNlKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJICB1 bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAlzdGF0aWMgdW5pb24gZnRyYWNlX2NvZGVfdW5pb24gY2Fs YzsKIAorCS8qIE9uIFBJRSwgZmlsbCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIHdpdGggbm9wcyAq LworCWlmIChJU19FTkFCTEVEKENPTkZJR19YODZfUElFKSkKKwkJbWVtc2V0KGNhbGMuY29kZSwg aWRlYWxfbm9wc1sxXVswXSwgc2l6ZW9mKGNhbGMuY29kZSkpOworCiAJY2FsYy5lOAkJPSAweGU4 OwotCWNhbGMub2Zmc2V0CT0gZnRyYWNlX2NhbGNfb2Zmc2V0KGlwICsgTUNPVU5UX0lOU05fU0la RSwgYWRkcik7CisJY2FsYy5vZmZzZXQJPSBmdHJhY2VfY2FsY19vZmZzZXQoaXAgKyBNQ09VTlRf UkVMSU5TTl9TSVpFLCBhZGRyKTsKIAogCS8qCiAJICogTm8gbG9ja2luZyBuZWVkZWQsIHRoaXMg bXVzdCBiZSBjYWxsZWQgdmlhIGtzdG9wX21hY2hpbmUKQEAgLTcyLDYgKzc3LDQ0IEBAIHN0YXRp YyB1bnNpZ25lZCBjaGFyICpmdHJhY2VfY2FsbF9yZXBsYWNlKHVuc2lnbmVkIGxvbmcgaXAsIHVu c2lnbmVkIGxvbmcgYWRkcikKIAlyZXR1cm4gY2FsYy5jb2RlOwogfQogCisjaWZkZWYgQ09ORklH X1g4Nl9QSUUKK3VuaW9uIGZ0cmFjZV9jb2RlX2dvdF91bmlvbiB7CisJY2hhciBjb2RlW01DT1VO VF9JTlNOX1NJWkVdOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IGZmMTU7CisJCWludCBv ZmZzZXQ7CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK307CisKKy8qIFVzZWQgdG8gaWRl bnRpZnkgYSBtY291bnQgR09UIGNhbGwgb24gUElFICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAq ZnRyYWNlX29yaWdpbmFsX2NhbGwoc3RydWN0IG1vZHVsZSogbW9kLCB1bnNpZ25lZCBsb25nIGlw LAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSAgIHVuc2lnbmVkIGludCBzaXpl KQoreworCXN0YXRpYyB1bmlvbiBmdHJhY2VfY29kZV9nb3RfdW5pb24gY2FsYzsKKwl1bnNpZ25l ZCBsb25nIGdvdGFkZHI7CisKKwljYWxjLmZmMTUgPSAweDE1ZmY7CisKKwlnb3RhZGRyID0gbW9k dWxlX2ZpbmRfZ290X2VudHJ5KG1vZCwgYWRkcik7CisJaWYgKCFnb3RhZGRyKSB7CisJCXByX2Vy cigiRmFpbGVkIHRvIGZpbmQgR09UIGVudHJ5IGZvciAweCVseFxuIiwgYWRkcik7CisJCXJldHVy biBOVUxMOworCX0KKworCWNhbGMub2Zmc2V0ID0gZnRyYWNlX2NhbGNfb2Zmc2V0KGlwICsgTUNP VU5UX0dPVENBTExfU0laRSwgZ290YWRkcik7CisJcmV0dXJuIGNhbGMuY29kZTsKK30KKyNlbHNl CitzdGF0aWMgdW5zaWduZWQgY2hhciAqZnRyYWNlX29yaWdpbmFsX2NhbGwoc3RydWN0IG1vZHVs ZSogbW9kLCB1bnNpZ25lZCBsb25nIGlwLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJ CQkJCSAgIHVuc2lnbmVkIGludCBzaXplKQoreworCXJldHVybiBmdHJhY2VfY2FsbF9yZXBsYWNl KGlwLCBhZGRyLCBzaXplKTsKK30KKworI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50CiB3aXRo aW4odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25n IGVuZCkKIHsKQEAgLTk0LDE2ICsxMzcsMTggQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdGV4dF9p cF9hZGRyKHVuc2lnbmVkIGxvbmcgaXApCiAJcmV0dXJuIGlwOwogfQogCi1zdGF0aWMgY29uc3Qg dW5zaWduZWQgY2hhciAqZnRyYWNlX25vcF9yZXBsYWNlKHZvaWQpCitzdGF0aWMgY29uc3QgdW5z aWduZWQgY2hhciAqZnRyYWNlX25vcF9yZXBsYWNlKHVuc2lnbmVkIGludCBzaXplKQogewotCXJl dHVybiBpZGVhbF9ub3BzW05PUF9BVE9NSUM1XTsKKwlyZXR1cm4gaWRlYWxfbm9wc1tzaXplID09 IDUgPyBOT1BfQVRPTUlDNSA6IHNpemVdOwogfQogCiBzdGF0aWMgaW50Ci1mdHJhY2VfbW9kaWZ5 X2NvZGVfZGlyZWN0KHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGNvbnN0IGNoYXIgKm9sZF9j b2RlLAotCQkgICB1bnNpZ25lZCBjb25zdCBjaGFyICpuZXdfY29kZSkKK2Z0cmFjZV9tb2RpZnlf Y29kZV9kaXJlY3Qoc3RydWN0IGR5bl9mdHJhY2UgKnJlYywgdW5zaWduZWQgY29uc3QgY2hhciAq b2xkX2NvZGUsCisJCQkgIHVuc2lnbmVkIGNvbnN0IGNoYXIgKm5ld19jb2RlKQogewogCXVuc2ln bmVkIGNoYXIgcmVwbGFjZWRbTUNPVU5UX0lOU05fU0laRV07CisJdW5zaWduZWQgbG9uZyBpcCA9 IHJlYy0+aXA7CisJdW5zaWduZWQgaW50IHNpemUgPSBNQ09VTlRfSU5TTl9TSVpFOwogCiAJZnRy YWNlX2V4cGVjdGVkID0gb2xkX2NvZGU7CiAKQEAgLTExNiwxNyArMTYxLDE3IEBAIGZ0cmFjZV9t b2RpZnlfY29kZV9kaXJlY3QodW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgY29uc3QgY2hhciAq b2xkX2NvZGUsCiAJICovCiAKIAkvKiByZWFkIHRoZSB0ZXh0IHdlIHdhbnQgdG8gbW9kaWZ5ICov Ci0JaWYgKHByb2JlX2tlcm5lbF9yZWFkKHJlcGxhY2VkLCAodm9pZCAqKWlwLCBNQ09VTlRfSU5T Tl9TSVpFKSkKKwlpZiAocHJvYmVfa2VybmVsX3JlYWQocmVwbGFjZWQsICh2b2lkICopaXAsIHNp emUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIE1ha2Ugc3VyZSBpdCBpcyB3aGF0IHdlIGV4 cGVjdCBpdCB0byBiZSAqLwotCWlmIChtZW1jbXAocmVwbGFjZWQsIG9sZF9jb2RlLCBNQ09VTlRf SU5TTl9TSVpFKSAhPSAwKQorCWlmIChtZW1jbXAocmVwbGFjZWQsIG9sZF9jb2RlLCBzaXplKSAh PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlwID0gdGV4dF9pcF9hZGRyKGlwKTsKIAogCS8q IHJlcGxhY2UgdGhlIHRleHQgd2l0aCB0aGUgbmV3IHRleHQgKi8KLQlpZiAocHJvYmVfa2VybmVs X3dyaXRlKCh2b2lkICopaXAsIG5ld19jb2RlLCBNQ09VTlRfSU5TTl9TSVpFKSkKKwlpZiAocHJv YmVfa2VybmVsX3dyaXRlKCh2b2lkICopaXAsIG5ld19jb2RlLCBzaXplKSkKIAkJcmV0dXJuIC1F UEVSTTsKIAogCXN5bmNfY29yZSgpOwpAQCAtMTM5LDkgKzE4NCw3IEBAIGludCBmdHJhY2VfbWFr ZV9ub3Aoc3RydWN0IG1vZHVsZSAqbW9kLAogewogCXVuc2lnbmVkIGNvbnN0IGNoYXIgKm5ldywg Km9sZDsKIAl1bnNpZ25lZCBsb25nIGlwID0gcmVjLT5pcDsKLQotCW9sZCA9IGZ0cmFjZV9jYWxs X3JlcGxhY2UoaXAsIGFkZHIpOwotCW5ldyA9IGZ0cmFjZV9ub3BfcmVwbGFjZSgpOworCXVuc2ln bmVkIGludCBzaXplID0gTUNPVU5UX0lOU05fU0laRTsKIAogCS8qCiAJICogT24gYm9vdCB1cCwg YW5kIHdoZW4gbW9kdWxlcyBhcmUgbG9hZGVkLCB0aGUgTUNPVU5UX0FERFIKQEAgLTE1MSwxNCAr MTk0LDIwIEBAIGludCBmdHJhY2VfbWFrZV9ub3Aoc3RydWN0IG1vZHVsZSAqbW9kLAogCSAqIFdl IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgYnJlYWtwb2ludCB2ZXJzaW9uIGluIHRoaXMgY2FzZSwK IAkgKiBqdXN0IG1vZGlmeSB0aGUgY29kZSBkaXJlY3RseS4KIAkgKi8KLQlpZiAoYWRkciA9PSBN Q09VTlRfQUREUikKLQkJcmV0dXJuIGZ0cmFjZV9tb2RpZnlfY29kZV9kaXJlY3QocmVjLT5pcCwg b2xkLCBuZXcpOworCWlmIChhZGRyICE9IE1DT1VOVF9BRERSKSB7CisJCWZ0cmFjZV9leHBlY3Rl ZCA9IE5VTEw7CiAKLQlmdHJhY2VfZXhwZWN0ZWQgPSBOVUxMOworCQkvKiBOb3JtYWwgY2FzZXMg dXNlIGFkZF9icmtfb25fbm9wICovCisJCVdBUk5fT05DRSgxLCAiaW52YWxpZCB1c2Ugb2YgZnRy YWNlX21ha2Vfbm9wIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCS8qIE5vcm1hbCBjYXNl cyB1c2UgYWRkX2Jya19vbl9ub3AgKi8KLQlXQVJOX09OQ0UoMSwgImludmFsaWQgdXNlIG9mIGZ0 cmFjZV9tYWtlX25vcCIpOwotCXJldHVybiAtRUlOVkFMOworCW9sZCA9IGZ0cmFjZV9vcmlnaW5h bF9jYWxsKG1vZCwgaXAsIGFkZHIsIHNpemUpOworCWlmICghb2xkKQorCQlyZXR1cm4gLUVJTlZB TDsKKwluZXcgPSBmdHJhY2Vfbm9wX3JlcGxhY2Uoc2l6ZSk7CisKKwlyZXR1cm4gZnRyYWNlX21v ZGlmeV9jb2RlX2RpcmVjdChyZWMsIG9sZCwgbmV3KTsKIH0KIAogaW50IGZ0cmFjZV9tYWtlX2Nh bGwoc3RydWN0IGR5bl9mdHJhY2UgKnJlYywgdW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtMTY2LDEx ICsyMTUsMTEgQEAgaW50IGZ0cmFjZV9tYWtlX2NhbGwoc3RydWN0IGR5bl9mdHJhY2UgKnJlYywg dW5zaWduZWQgbG9uZyBhZGRyKQogCXVuc2lnbmVkIGNvbnN0IGNoYXIgKm5ldywgKm9sZDsKIAl1 bnNpZ25lZCBsb25nIGlwID0gcmVjLT5pcDsKIAotCW9sZCA9IGZ0cmFjZV9ub3BfcmVwbGFjZSgp OwotCW5ldyA9IGZ0cmFjZV9jYWxsX3JlcGxhY2UoaXAsIGFkZHIpOworCW9sZCA9IGZ0cmFjZV9u b3BfcmVwbGFjZShNQ09VTlRfSU5TTl9TSVpFKTsKKwluZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNl KGlwLCBhZGRyLCBNQ09VTlRfSU5TTl9TSVpFKTsKIAogCS8qIFNob3VsZCBvbmx5IGJlIGNhbGxl ZCB3aGVuIG1vZHVsZSBpcyBsb2FkZWQgKi8KLQlyZXR1cm4gZnRyYWNlX21vZGlmeV9jb2RlX2Rp cmVjdChyZWMtPmlwLCBvbGQsIG5ldyk7CisJcmV0dXJuIGZ0cmFjZV9tb2RpZnlfY29kZV9kaXJl Y3QocmVjLCBvbGQsIG5ldyk7CiB9CiAKIC8qCkBAIC0yMzMsNyArMjgyLDcgQEAgc3RhdGljIGlu dCB1cGRhdGVfZnRyYWNlX2Z1bmModW5zaWduZWQgbG9uZyBpcCwgdm9pZCAqbmV3KQogCXVuc2ln bmVkIGNoYXIgb2xkW01DT1VOVF9JTlNOX1NJWkVdOwogCWludCByZXQ7CiAKLQltZW1jcHkob2xk LCAodm9pZCAqKWlwLCBNQ09VTlRfSU5TTl9TSVpFKTsKKwltZW1jcHkob2xkLCAodm9pZCAqKWlw LCBNQ09VTlRfUkVMSU5TTl9TSVpFKTsKIAogCWZ0cmFjZV91cGRhdGVfZnVuYyA9IGlwOwogCS8q IE1ha2Ugc3VyZSB0aGUgYnJlYWtwb2ludHMgc2VlIHRoZSBmdHJhY2VfdXBkYXRlX2Z1bmMgdXBk YXRlICovCkBAIC0yNTUsMTMgKzMwNCwxNCBAQCBpbnQgZnRyYWNlX3VwZGF0ZV9mdHJhY2VfZnVu YyhmdHJhY2VfZnVuY190IGZ1bmMpCiAJdW5zaWduZWQgY2hhciAqbmV3OwogCWludCByZXQ7CiAK LQluZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCAodW5zaWduZWQgbG9uZylmdW5jKTsKKwlu ZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCAodW5zaWduZWQgbG9uZylmdW5jLCBNQ09VTlRf UkVMSU5TTl9TSVpFKTsKIAlyZXQgPSB1cGRhdGVfZnRyYWNlX2Z1bmMoaXAsIG5ldyk7CiAKIAkv KiBBbHNvIHVwZGF0ZSB0aGUgcmVncyBjYWxsYmFjayBmdW5jdGlvbiAqLwogCWlmICghcmV0KSB7 CiAJCWlwID0gKHVuc2lnbmVkIGxvbmcpKCZmdHJhY2VfcmVnc19jYWxsKTsKLQkJbmV3ID0gZnRy YWNlX2NhbGxfcmVwbGFjZShpcCwgKHVuc2lnbmVkIGxvbmcpZnVuYyk7CisJCW5ldyA9IGZ0cmFj ZV9jYWxsX3JlcGxhY2UoaXAsICh1bnNpZ25lZCBsb25nKWZ1bmMsCisJCQkJCSAgTUNPVU5UX1JF TElOU05fU0laRSk7CiAJCXJldCA9IHVwZGF0ZV9mdHJhY2VfZnVuYyhpcCwgbmV3KTsKIAl9CiAK QEAgLTMwOSwxOCArMzU5LDE4IEBAIHN0YXRpYyBpbnQgZnRyYWNlX3dyaXRlKHVuc2lnbmVkIGxv bmcgaXAsIGNvbnN0IGNoYXIgKnZhbCwgaW50IHNpemUpCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRp YyBpbnQgYWRkX2JyZWFrKHVuc2lnbmVkIGxvbmcgaXAsIGNvbnN0IGNoYXIgKm9sZCkKK3N0YXRp YyBpbnQgYWRkX2JyZWFrKHVuc2lnbmVkIGxvbmcgaXAsIGNvbnN0IGNoYXIgKm9sZCwgdW5zaWdu ZWQgaW50IHNpemUpCiB7CiAJdW5zaWduZWQgY2hhciByZXBsYWNlZFtNQ09VTlRfSU5TTl9TSVpF XTsKIAl1bnNpZ25lZCBjaGFyIGJyayA9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT047CiAKLQlpZiAo cHJvYmVfa2VybmVsX3JlYWQocmVwbGFjZWQsICh2b2lkICopaXAsIE1DT1VOVF9JTlNOX1NJWkUp KQorCWlmIChwcm9iZV9rZXJuZWxfcmVhZChyZXBsYWNlZCwgKHZvaWQgKilpcCwgc2l6ZSkpCiAJ CXJldHVybiAtRUZBVUxUOwogCiAJZnRyYWNlX2V4cGVjdGVkID0gb2xkOwogCiAJLyogTWFrZSBz dXJlIGl0IGlzIHdoYXQgd2UgZXhwZWN0IGl0IHRvIGJlICovCi0JaWYgKG1lbWNtcChyZXBsYWNl ZCwgb2xkLCBNQ09VTlRfSU5TTl9TSVpFKSAhPSAwKQorCWlmIChtZW1jbXAocmVwbGFjZWQsIG9s ZCwgc2l6ZSkgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gZnRyYWNlX3dyaXRl KGlwLCAmYnJrLCAxKTsKQEAgLTMzMCwyMCArMzgwLDIyIEBAIHN0YXRpYyBpbnQgYWRkX2Jya19v bl9jYWxsKHN0cnVjdCBkeW5fZnRyYWNlICpyZWMsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAl1 bnNpZ25lZCBjb25zdCBjaGFyICpvbGQ7CiAJdW5zaWduZWQgbG9uZyBpcCA9IHJlYy0+aXA7CisJ dW5zaWduZWQgaW50IHNpemUgPSBNQ09VTlRfSU5TTl9TSVpFOwogCi0Jb2xkID0gZnRyYWNlX2Nh bGxfcmVwbGFjZShpcCwgYWRkcik7CisJb2xkID0gZnRyYWNlX2NhbGxfcmVwbGFjZShpcCwgYWRk ciwgc2l6ZSk7CiAKLQlyZXR1cm4gYWRkX2JyZWFrKHJlYy0+aXAsIG9sZCk7CisJcmV0dXJuIGFk ZF9icmVhayhyZWMtPmlwLCBvbGQsIHNpemUpOwogfQogCiAKIHN0YXRpYyBpbnQgYWRkX2Jya19v bl9ub3Aoc3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIHsKIAl1bnNpZ25lZCBjb25zdCBjaGFyICpv bGQ7CisJdW5zaWduZWQgaW50IHNpemUgPSBNQ09VTlRfSU5TTl9TSVpFOwogCi0Jb2xkID0gZnRy YWNlX25vcF9yZXBsYWNlKCk7CisJb2xkID0gZnRyYWNlX25vcF9yZXBsYWNlKHNpemUpOwogCi0J cmV0dXJuIGFkZF9icmVhayhyZWMtPmlwLCBvbGQpOworCXJldHVybiBhZGRfYnJlYWsocmVjLT5p cCwgb2xkLCBzaXplKTsKIH0KIAogc3RhdGljIGludCBhZGRfYnJlYWtwb2ludHMoc3RydWN0IGR5 bl9mdHJhY2UgKnJlYywgaW50IGVuYWJsZSkKQEAgLTM4NiwyMiArNDM4LDIzIEBAIHN0YXRpYyBp bnQgcmVtb3ZlX2JyZWFrcG9pbnQoc3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIAljb25zdCB1bnNp Z25lZCBjaGFyICpub3A7CiAJdW5zaWduZWQgbG9uZyBmdHJhY2VfYWRkcjsKIAl1bnNpZ25lZCBs b25nIGlwID0gcmVjLT5pcDsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IE1DT1VOVF9JTlNOX1NJWkU7 CiAKIAkvKiBJZiB3ZSBmYWlsIHRoZSByZWFkLCBqdXN0IGdpdmUgdXAgKi8KLQlpZiAocHJvYmVf a2VybmVsX3JlYWQoaW5zLCAodm9pZCAqKWlwLCBNQ09VTlRfSU5TTl9TSVpFKSkKKwlpZiAocHJv YmVfa2VybmVsX3JlYWQoaW5zLCAodm9pZCAqKWlwLCBzaXplKSkKIAkJcmV0dXJuIC1FRkFVTFQ7 CiAKIAkvKiBJZiB0aGlzIGRvZXMgbm90IGhhdmUgYSBicmVha3BvaW50LCB3ZSBhcmUgZG9uZSAq LwogCWlmIChpbnNbMF0gIT0gYnJrKQogCQlyZXR1cm4gMDsKIAotCW5vcCA9IGZ0cmFjZV9ub3Bf cmVwbGFjZSgpOworCW5vcCA9IGZ0cmFjZV9ub3BfcmVwbGFjZShzaXplKTsKIAogCS8qCiAJICog SWYgdGhlIGxhc3QgNCBieXRlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gZG8gbm90IG1hdGNoCiAJICog YSBub3AsIHRoZW4gd2UgYXNzdW1lIHRoYXQgdGhpcyBpcyBhIGNhbGwgdG8gZnRyYWNlX2FkZHIu CiAJICovCi0JaWYgKG1lbWNtcCgmaW5zWzFdLCAmbm9wWzFdLCBNQ09VTlRfSU5TTl9TSVpFIC0g MSkgIT0gMCkgeworCWlmIChtZW1jbXAoJmluc1sxXSwgJm5vcFsxXSwgc2l6ZSAtIDEpICE9IDAp IHsKIAkJLyoKIAkJICogRm9yIGV4dHJhIHBhcmFub2lkaXNtLCB3ZSBjaGVjayBpZiB0aGUgYnJl YWtwb2ludCBpcyBvbgogCQkgKiBhIGNhbGwgdGhhdCB3b3VsZCBhY3R1YWxseSBqdW1wIHRvIHRo ZSBmdHJhY2VfYWRkci4KQEAgLTQwOSwxOCArNDYyLDE4IEBAIHN0YXRpYyBpbnQgcmVtb3ZlX2Jy ZWFrcG9pbnQoc3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIAkJICogYSBkaXNhc3Rlci4KIAkJICov CiAJCWZ0cmFjZV9hZGRyID0gZnRyYWNlX2dldF9hZGRyX25ldyhyZWMpOwotCQlub3AgPSBmdHJh Y2VfY2FsbF9yZXBsYWNlKGlwLCBmdHJhY2VfYWRkcik7CisJCW5vcCA9IGZ0cmFjZV9jYWxsX3Jl cGxhY2UoaXAsIGZ0cmFjZV9hZGRyLCBzaXplKTsKIAotCQlpZiAobWVtY21wKCZpbnNbMV0sICZu b3BbMV0sIE1DT1VOVF9JTlNOX1NJWkUgLSAxKSA9PSAwKQorCQlpZiAobWVtY21wKCZpbnNbMV0s ICZub3BbMV0sIHNpemUgLSAxKSA9PSAwKQogCQkJZ290byB1cGRhdGU7CiAKIAkJLyogQ2hlY2sg Ym90aCBmdHJhY2VfYWRkciBhbmQgZnRyYWNlX29sZF9hZGRyICovCiAJCWZ0cmFjZV9hZGRyID0g ZnRyYWNlX2dldF9hZGRyX2N1cnIocmVjKTsKLQkJbm9wID0gZnRyYWNlX2NhbGxfcmVwbGFjZShp cCwgZnRyYWNlX2FkZHIpOworCQlub3AgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCBmdHJhY2Vf YWRkciwgc2l6ZSk7CiAKIAkJZnRyYWNlX2V4cGVjdGVkID0gbm9wOwogCi0JCWlmIChtZW1jbXAo Jmluc1sxXSwgJm5vcFsxXSwgTUNPVU5UX0lOU05fU0laRSAtIDEpICE9IDApCisJCWlmIChtZW1j bXAoJmluc1sxXSwgJm5vcFsxXSwgc2l6ZSAtIDEpICE9IDApCiAJCQlyZXR1cm4gLUVJTlZBTDsK IAl9CiAKQEAgLTQyOCwzMCArNDgxLDMzIEBAIHN0YXRpYyBpbnQgcmVtb3ZlX2JyZWFrcG9pbnQo c3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIAlyZXR1cm4gZnRyYWNlX3dyaXRlKGlwLCBub3AsIDEp OwogfQogCi1zdGF0aWMgaW50IGFkZF91cGRhdGVfY29kZSh1bnNpZ25lZCBsb25nIGlwLCB1bnNp Z25lZCBjb25zdCBjaGFyICpuZXcpCitzdGF0aWMgaW50IGFkZF91cGRhdGVfY29kZSh1bnNpZ25l ZCBsb25nIGlwLCB1bnNpZ25lZCBjb25zdCBjaGFyICpuZXcsCisJCQkgICB1bnNpZ25lZCBpbnQg c2l6ZSkKIHsKIAkvKiBza2lwIGJyZWFrcG9pbnQgKi8KIAlpcCsrOwogCW5ldysrOwotCXJldHVy biBmdHJhY2Vfd3JpdGUoaXAsIG5ldywgTUNPVU5UX0lOU05fU0laRSAtIDEpOworCXJldHVybiBm dHJhY2Vfd3JpdGUoaXAsIG5ldywgc2l6ZSAtIDEpOwogfQogCiBzdGF0aWMgaW50IGFkZF91cGRh dGVfY2FsbChzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJ dW5zaWduZWQgbG9uZyBpcCA9IHJlYy0+aXA7CisJdW5zaWduZWQgaW50IHNpemUgPSBNQ09VTlRf SU5TTl9TSVpFOwogCXVuc2lnbmVkIGNvbnN0IGNoYXIgKm5ldzsKIAotCW5ldyA9IGZ0cmFjZV9j YWxsX3JlcGxhY2UoaXAsIGFkZHIpOwotCXJldHVybiBhZGRfdXBkYXRlX2NvZGUoaXAsIG5ldyk7 CisJbmV3ID0gZnRyYWNlX2NhbGxfcmVwbGFjZShpcCwgYWRkciwgc2l6ZSk7CisJcmV0dXJuIGFk ZF91cGRhdGVfY29kZShpcCwgbmV3LCBzaXplKTsKIH0KIAogc3RhdGljIGludCBhZGRfdXBkYXRl X25vcChzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjKQogewogCXVuc2lnbmVkIGxvbmcgaXAgPSByZWMt PmlwOworCXVuc2lnbmVkIGludCBzaXplID0gTUNPVU5UX0lOU05fU0laRTsKIAl1bnNpZ25lZCBj b25zdCBjaGFyICpuZXc7CiAKLQluZXcgPSBmdHJhY2Vfbm9wX3JlcGxhY2UoKTsKLQlyZXR1cm4g YWRkX3VwZGF0ZV9jb2RlKGlwLCBuZXcpOworCW5ldyA9IGZ0cmFjZV9ub3BfcmVwbGFjZShzaXpl KTsKKwlyZXR1cm4gYWRkX3VwZGF0ZV9jb2RlKGlwLCBuZXcsIHNpemUpOwogfQogCiBzdGF0aWMg aW50IGFkZF91cGRhdGUoc3RydWN0IGR5bl9mdHJhY2UgKnJlYywgaW50IGVuYWJsZSkKQEAgLTQ4 NSw3ICs1NDEsNyBAQCBzdGF0aWMgaW50IGZpbmlzaF91cGRhdGVfY2FsbChzdHJ1Y3QgZHluX2Z0 cmFjZSAqcmVjLCB1bnNpZ25lZCBsb25nIGFkZHIpCiAJdW5zaWduZWQgbG9uZyBpcCA9IHJlYy0+ aXA7CiAJdW5zaWduZWQgY29uc3QgY2hhciAqbmV3OwogCi0JbmV3ID0gZnRyYWNlX2NhbGxfcmVw bGFjZShpcCwgYWRkcik7CisJbmV3ID0gZnRyYWNlX2NhbGxfcmVwbGFjZShpcCwgYWRkciwgTUNP VU5UX0lOU05fU0laRSk7CiAKIAlyZXR1cm4gZnRyYWNlX3dyaXRlKGlwLCBuZXcsIDEpOwogfQpA QCAtNDk1LDcgKzU1MSw3IEBAIHN0YXRpYyBpbnQgZmluaXNoX3VwZGF0ZV9ub3Aoc3RydWN0IGR5 bl9mdHJhY2UgKnJlYykKIAl1bnNpZ25lZCBsb25nIGlwID0gcmVjLT5pcDsKIAl1bnNpZ25lZCBj b25zdCBjaGFyICpuZXc7CiAKLQluZXcgPSBmdHJhY2Vfbm9wX3JlcGxhY2UoKTsKKwluZXcgPSBm dHJhY2Vfbm9wX3JlcGxhY2UoTUNPVU5UX0lOU05fU0laRSk7CiAKIAlyZXR1cm4gZnRyYWNlX3dy aXRlKGlwLCBuZXcsIDEpOwogfQpAQCAtNjE5LDEzICs2NzUsMTMgQEAgZnRyYWNlX21vZGlmeV9j b2RlKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGNvbnN0IGNoYXIgKm9sZF9jb2RlLAogewog CWludCByZXQ7CiAKLQlyZXQgPSBhZGRfYnJlYWsoaXAsIG9sZF9jb2RlKTsKKwlyZXQgPSBhZGRf YnJlYWsoaXAsIG9sZF9jb2RlLCBNQ09VTlRfUkVMSU5TTl9TSVpFKTsKIAlpZiAocmV0KQogCQln b3RvIG91dDsKIAogCXJ1bl9zeW5jKCk7CiAKLQlyZXQgPSBhZGRfdXBkYXRlX2NvZGUoaXAsIG5l d19jb2RlKTsKKwlyZXQgPSBhZGRfdXBkYXRlX2NvZGUoaXAsIG5ld19jb2RlLCBNQ09VTlRfUkVM SU5TTl9TSVpFKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxfdXBkYXRlOwogCkBAIC02NzAsNyAr NzI2LDcgQEAgc3RhdGljIHVuc2lnbmVkIGNoYXIgKmZ0cmFjZV9qbXBfcmVwbGFjZSh1bnNpZ25l ZCBsb25nIGlwLCB1bnNpZ25lZCBsb25nIGFkZHIpCiAKIAkvKiBKbXAgbm90IGEgY2FsbCAoaWdu b3JlIHRoZSAuZTgpICovCiAJY2FsYy5lOAkJPSAweGU5OwotCWNhbGMub2Zmc2V0CT0gZnRyYWNl X2NhbGNfb2Zmc2V0KGlwICsgTUNPVU5UX0lOU05fU0laRSwgYWRkcik7CisJY2FsYy5vZmZzZXQJ PSBmdHJhY2VfY2FsY19vZmZzZXQoaXAgKyBNQ09VTlRfUkVMSU5TTl9TSVpFLCBhZGRyKTsKIAog CS8qCiAJICogZnRyYWNlIGV4dGVybmFsIGxvY2tzIHN5bmNocm9uaXplIHRoZSBhY2Nlc3MgdG8g dGhlIHN0YXRpYyB2YXJpYWJsZS4KQEAgLTc2NiwxMSArODIyLDExIEBAIGNyZWF0ZV90cmFtcG9s aW5lKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMsIHVuc2lnbmVkIGludCAqdHJhbXBfc2l6ZSkKIAkg KiB0aGUgam1wIHRvIGZ0cmFjZV9lcGlsb2d1ZSwgYXMgd2VsbCBhcyB0aGUgYWRkcmVzcyBvZgog CSAqIHRoZSBmdHJhY2Vfb3BzIHRoaXMgdHJhbXBvbGluZSBpcyB1c2VkIGZvci4KIAkgKi8KLQl0 cmFtcG9saW5lID0gYWxsb2NfdHJhbXAoc2l6ZSArIE1DT1VOVF9JTlNOX1NJWkUgKyBzaXplb2Yo dm9pZCAqKSk7CisJdHJhbXBvbGluZSA9IGFsbG9jX3RyYW1wKHNpemUgKyBNQ09VTlRfUkVMSU5T Tl9TSVpFICsgc2l6ZW9mKHZvaWQgKikpOwogCWlmICghdHJhbXBvbGluZSkKIAkJcmV0dXJuIDA7 CiAKLQkqdHJhbXBfc2l6ZSA9IHNpemUgKyBNQ09VTlRfSU5TTl9TSVpFICsgc2l6ZW9mKHZvaWQg Kik7CisJKnRyYW1wX3NpemUgPSBzaXplICsgTUNPVU5UX1JFTElOU05fU0laRSArIHNpemVvZih2 b2lkICopOwogCiAJLyogQ29weSBmdHJhY2VfY2FsbGVyIG9udG8gdGhlIHRyYW1wb2xpbmUgbWVt b3J5ICovCiAJcmV0ID0gcHJvYmVfa2VybmVsX3JlYWQodHJhbXBvbGluZSwgKHZvaWQgKilzdGFy dF9vZmZzZXQsIHNpemUpOwpAQCAtNzgzLDcgKzgzOSw3IEBAIGNyZWF0ZV90cmFtcG9saW5lKHN0 cnVjdCBmdHJhY2Vfb3BzICpvcHMsIHVuc2lnbmVkIGludCAqdHJhbXBfc2l6ZSkKIAogCS8qIFRo ZSB0cmFtcG9saW5lIGVuZHMgd2l0aCBhIGptcCB0byBmdHJhY2VfZXBpbG9ndWUgKi8KIAlqbXAg PSBmdHJhY2Vfam1wX3JlcGxhY2UoaXAsICh1bnNpZ25lZCBsb25nKWZ0cmFjZV9lcGlsb2d1ZSk7 Ci0JbWVtY3B5KHRyYW1wb2xpbmUgKyBzaXplLCBqbXAsIE1DT1VOVF9JTlNOX1NJWkUpOworCW1l bWNweSh0cmFtcG9saW5lICsgc2l6ZSwgam1wLCBNQ09VTlRfUkVMSU5TTl9TSVpFKTsKIAogCS8q CiAJICogVGhlIGFkZHJlc3Mgb2YgdGhlIGZ0cmFjZV9vcHMgdGhhdCBpcyB1c2VkIGZvciB0aGlz IHRyYW1wb2xpbmUKQEAgLTc5Myw3ICs4NDksNyBAQCBjcmVhdGVfdHJhbXBvbGluZShzdHJ1Y3Qg ZnRyYWNlX29wcyAqb3BzLCB1bnNpZ25lZCBpbnQgKnRyYW1wX3NpemUpCiAJICogdGhlIGdsb2Jh bCBmdW5jdGlvbl90cmFjZV9vcCB2YXJpYWJsZS4KIAkgKi8KIAotCXB0ciA9ICh1bnNpZ25lZCBs b25nICopKHRyYW1wb2xpbmUgKyBzaXplICsgTUNPVU5UX0lOU05fU0laRSk7CisJcHRyID0gKHVu c2lnbmVkIGxvbmcgKikodHJhbXBvbGluZSArIHNpemUgKyBNQ09VTlRfUkVMSU5TTl9TSVpFKTsK IAkqcHRyID0gKHVuc2lnbmVkIGxvbmcpb3BzOwogCiAJb3Bfb2Zmc2V0IC09IHN0YXJ0X29mZnNl dDsKQEAgLTg2OCw3ICs5MjQsNyBAQCB2b2lkIGFyY2hfZnRyYWNlX3VwZGF0ZV90cmFtcG9saW5l KHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMpCiAJZnVuYyA9IGZ0cmFjZV9vcHNfZ2V0X2Z1bmMob3Bz KTsKIAogCS8qIERvIGEgc2FmZSBtb2RpZnkgaW4gY2FzZSB0aGUgdHJhbXBvbGluZSBpcyBleGVj dXRpbmcgKi8KLQluZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCAodW5zaWduZWQgbG9uZylm dW5jKTsKKwluZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCAodW5zaWduZWQgbG9uZylmdW5j LCBNQ09VTlRfUkVMSU5TTl9TSVpFKTsKIAlyZXQgPSB1cGRhdGVfZnRyYWNlX2Z1bmMoaXAsIG5l dyk7CiAJc2V0X21lbW9yeV9ybyhvcHMtPnRyYW1wb2xpbmUsIG5wYWdlcyk7CiAKQEAgLTg4Miw3 ICs5MzgsNyBAQCBzdGF0aWMgdm9pZCAqYWRkcl9mcm9tX2NhbGwodm9pZCAqcHRyKQogCXVuaW9u IGZ0cmFjZV9jb2RlX3VuaW9uIGNhbGM7CiAJaW50IHJldDsKIAotCXJldCA9IHByb2JlX2tlcm5l bF9yZWFkKCZjYWxjLCBwdHIsIE1DT1VOVF9JTlNOX1NJWkUpOworCXJldCA9IHByb2JlX2tlcm5l bF9yZWFkKCZjYWxjLCBwdHIsIE1DT1VOVF9SRUxJTlNOX1NJWkUpOwogCWlmIChXQVJOX09OX09O Q0UocmV0IDwgMCkpCiAJCXJldHVybiBOVUxMOwogCkBAIC04OTIsNyArOTQ4LDcgQEAgc3RhdGlj IHZvaWQgKmFkZHJfZnJvbV9jYWxsKHZvaWQgKnB0cikKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0J cmV0dXJuIHB0ciArIE1DT1VOVF9JTlNOX1NJWkUgKyBjYWxjLm9mZnNldDsKKwlyZXR1cm4gcHRy ICsgTUNPVU5UX1JFTElOU05fU0laRSArIGNhbGMub2Zmc2V0OwogfQogCiB2b2lkIHByZXBhcmVf ZnRyYWNlX3JldHVybih1bnNpZ25lZCBsb25nIHNlbGZfYWRkciwgdW5zaWduZWQgbG9uZyAqcGFy ZW50LApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21vZHVsZS5sZHMgYi9hcmNoL3g4Ni9r ZXJuZWwvbW9kdWxlLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAu LmZkNmU5NWE0YjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUu bGRzCkBAIC0wLDAgKzEsMyBAQAorU0VDVElPTlMgeworCS5nb3QgKE5PTE9BRCkgOiB7IEJZVEUo MCkgfQorfQotLSAKMi4xNC4yLjkyMC5nY2YwYzY3OTc5Yy1nb29nCgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApY ZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Garnier Subject: [RFC v3 20/27] x86/ftrace: Adapt function tracing for PIE support Date: Wed, 4 Oct 2017 14:19:56 -0700 Message-ID: <20171004212003.28296-21-thgarnie@google.com> References: <20171004212003.28296-1-thgarnie@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20171004212003.28296-1-thgarnie@google.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Herbert Xu , "David S . Miller" , Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , Peter Zijlstra , Josh Poimboeuf , Thomas Garnier , Arnd Bergmann , Kees Cook , Matthias Kaehlcke , Tom Lendacky , Andy Lutomirski , "Kirill A . Shutemov" , Borislav Petkov , "Rafael J . Wysocki" , Len Brown , Pavel Machek , Juergen Gross , Chris Wright , Alok Kataria , Rusty Russell , Tejun Heo , Christoph Lameter Bor Cc: linux-arch@vger.kernel.org, kvm@vger.kernel.org, linux-pm@vger.kernel.org, x86@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-sparse@vger.kernel.org, linux-crypto@vger.kernel.org, kernel-hardening@lists.openwall.com, xen-devel@lists.xenproject.org List-Id: linux-sparse@vger.kernel.org V2hlbiB1c2luZyAtZlBJRS9QSUMgd2l0aCBmdW5jdGlvbiB0cmFjaW5nLCB0aGUgY29tcGlsZXIg Z2VuZXJhdGVzIGEKY2FsbCB0aHJvdWdoIHRoZSBHT1QgKGNhbGwgKl9fZmVudHJ5X19AR09UUENS RUwpLiBUaGlzIGluc3RydWN0aW9uCnRha2VzIDYgYnl0ZXMgaW5zdGVhZCBvZiA1IG9uIHRoZSB1 c3VhbCByZWxhdGl2ZSBjYWxsLgoKV2l0aCB0aGlzIGNoYW5nZSwgZnVuY3Rpb24gdHJhY2luZyBz dXBwb3J0cyA2IGJ5dGVzIG9uIHRyYWNlYWJsZQpmdW5jdGlvbiBhbmQgY2FuIHN0aWxsIHJlcGxh Y2UgcmVsYXRpdmUgY2FsbHMgb24gdGhlIGZ0cmFjZSBhc3NlbWJseQpmdW5jdGlvbnMuCgpQb3Np dGlvbiBJbmRlcGVuZGVudCBFeGVjdXRhYmxlIChQSUUpIHN1cHBvcnQgd2lsbCBhbGxvdyB0byBl eHRlbmRlZCB0aGUKS0FTTFIgcmFuZG9taXphdGlvbiByYW5nZSBiZWxvdyB0aGUgLTJHIG1lbW9y eSBsaW1pdC4KClNpZ25lZC1vZmYtYnk6IFRob21hcyBHYXJuaWVyIDx0aGdhcm5pZUBnb29nbGUu Y29tPgotLS0KIGFyY2gveDg2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oICAgfCAgMjMgKysrKystCiBh cmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIHwgICA0ICsKIGFyY2gveDg2L2tlcm5lbC9m dHJhY2UuYyAgICAgICAgfCAxNjggKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0t LS0tLQogYXJjaC94ODYva2VybmVsL21vZHVsZS5sZHMgICAgICB8ICAgMyArCiA0IGZpbGVzIGNo YW5nZWQsIDEzOSBpbnNlcnRpb25zKCspLCA1OSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEw MDY0NCBhcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmxkcwoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lu Y2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnRyYWNlLmgKaW5kZXgg ZWNjZDBhYzZiYzM4Li5iOGJiY2M3ZmFkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUv YXNtL2Z0cmFjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oCkBAIC0xLDYg KzEsNyBAQAogI2lmbmRlZiBfQVNNX1g4Nl9GVFJBQ0VfSAogI2RlZmluZSBfQVNNX1g4Nl9GVFJB Q0VfSAogCisKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCiAjaWZkZWYgQ0NfVVNJTkdf RkVOVFJZCiAjIGRlZmluZSBNQ09VTlRfQUREUgkJKCh1bnNpZ25lZCBsb25nKShfX2ZlbnRyeV9f KSkKQEAgLTgsNyArOSwxOSBAQAogIyBkZWZpbmUgTUNPVU5UX0FERFIJCSgodW5zaWduZWQgbG9u ZykobWNvdW50KSkKICMgZGVmaW5lIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogI2VuZGlm Ci0jZGVmaW5lIE1DT1VOVF9JTlNOX1NJWkUJNSAvKiBzaXplb2YgbWNvdW50IGNhbGwgKi8KKwor I2RlZmluZSBNQ09VTlRfUkVMSU5TTl9TSVpFCTUgLyogc2l6ZW9mIHJlbGF0aXZlIChjYWxsIG9y IGp1bXApICovCisjZGVmaW5lIE1DT1VOVF9HT1RDQUxMX1NJWkUJNiAvKiBzaXplb2YgY2FsbCAq Z290ICovCisKKy8qCisgKiBNQ09VTlRfSU5TTl9TSVpFIGlzIHRoZSBoaWdoZXN0IHNpemUgb2Yg aW5zdHJ1Y3Rpb25zIGJhc2VkIG9uIHRoZQorICogY29uZmlndXJhdGlvbi4KKyAqLworI2lmZGVm IENPTkZJR19YODZfUElFCisjZGVmaW5lIE1DT1VOVF9JTlNOX1NJWkUJTUNPVU5UX0dPVENBTExf U0laRQorI2Vsc2UKKyNkZWZpbmUgTUNPVU5UX0lOU05fU0laRQlNQ09VTlRfUkVMSU5TTl9TSVpF CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQogI2RlZmluZSBBUkNIX1NV UFBPUlRTX0ZUUkFDRV9PUFMgMQpAQCAtMTcsNiArMzAsOCBAQAogI2RlZmluZSBIQVZFX0ZVTkNU SU9OX0dSQVBIX1JFVF9BRERSX1BUUgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUg PGFzbS9zZWN0aW9ucy5oPgorCiBleHRlcm4gdm9pZCBtY291bnQodm9pZCk7CiBleHRlcm4gYXRv bWljX3QgbW9kaWZ5aW5nX2Z0cmFjZV9jb2RlOwogZXh0ZXJuIHZvaWQgX19mZW50cnlfXyh2b2lk KTsKQEAgLTI0LDkgKzM5LDExIEBAIGV4dGVybiB2b2lkIF9fZmVudHJ5X18odm9pZCk7CiBzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZnRyYWNlX2NhbGxfYWRqdXN0KHVuc2lnbmVkIGxvbmcg YWRkcikKIHsKIAkvKgotCSAqIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1jb3VudCBjYWxs IGluc3RydWN0aW9uLgotCSAqIHJlY29yZG1jb3VudCBkb2VzIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0 IGNhbGN1bGF0aW9uLgorCSAqIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1jb3VudCBjYWxs IGluc3RydWN0aW9uLiBQSUUgaGFzIGFsd2F5cyBhCisJICogYnl0ZSBhZGRlZCB0byB0aGUgc3Rh cnQgb2YgdGhlIGZ1bmN0aW9uLgogCSAqLworCWlmIChJU19FTkFCTEVEKENPTkZJR19YODZfUElF KSkKKwkJYWRkciAtPSAxOwogCXJldHVybiBhZGRyOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4 Ni9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2VjdGlvbnMu aAppbmRleCAyZjc1ZjMwY2IyZjYuLjZiMmQ0OTZjZjFhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYv aW5jbHVkZS9hc20vc2VjdGlvbnMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWN0aW9u cy5oCkBAIC0xMSw0ICsxMSw4IEBAIGV4dGVybiBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5 IF9fc3RvcF9fX2V4X3RhYmxlW107CiBleHRlcm4gY2hhciBfX2VuZF9yb2RhdGFfaHBhZ2VfYWxp Z25bXTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X1BJRSkKK2V4dGVybiBjaGFy IF9fc3RhcnRfZ290W10sIF9fZW5kX2dvdFtdOworI2VuZGlmCisKICNlbmRpZgkvKiBfQVNNX1g4 Nl9TRUNUSU9OU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMgYi9h cmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMKaW5kZXggOWJlZjFiYmViYTYzLi40MWQ4YzRjNDMwNmQg MTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJu ZWwvZnRyYWNlLmMKQEAgLTU4LDEyICs1OCwxNyBAQCBzdGF0aWMgaW50IGZ0cmFjZV9jYWxjX29m ZnNldChsb25nIGlwLCBsb25nIGFkZHIpCiAJcmV0dXJuIChpbnQpKGFkZHIgLSBpcCk7CiB9CiAK LXN0YXRpYyB1bnNpZ25lZCBjaGFyICpmdHJhY2VfY2FsbF9yZXBsYWNlKHVuc2lnbmVkIGxvbmcg aXAsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpmdHJhY2VfY2Fs bF9yZXBsYWNlKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJICB1 bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAlzdGF0aWMgdW5pb24gZnRyYWNlX2NvZGVfdW5pb24gY2Fs YzsKIAorCS8qIE9uIFBJRSwgZmlsbCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIHdpdGggbm9wcyAq LworCWlmIChJU19FTkFCTEVEKENPTkZJR19YODZfUElFKSkKKwkJbWVtc2V0KGNhbGMuY29kZSwg aWRlYWxfbm9wc1sxXVswXSwgc2l6ZW9mKGNhbGMuY29kZSkpOworCiAJY2FsYy5lOAkJPSAweGU4 OwotCWNhbGMub2Zmc2V0CT0gZnRyYWNlX2NhbGNfb2Zmc2V0KGlwICsgTUNPVU5UX0lOU05fU0la RSwgYWRkcik7CisJY2FsYy5vZmZzZXQJPSBmdHJhY2VfY2FsY19vZmZzZXQoaXAgKyBNQ09VTlRf UkVMSU5TTl9TSVpFLCBhZGRyKTsKIAogCS8qCiAJICogTm8gbG9ja2luZyBuZWVkZWQsIHRoaXMg bXVzdCBiZSBjYWxsZWQgdmlhIGtzdG9wX21hY2hpbmUKQEAgLTcyLDYgKzc3LDQ0IEBAIHN0YXRp YyB1bnNpZ25lZCBjaGFyICpmdHJhY2VfY2FsbF9yZXBsYWNlKHVuc2lnbmVkIGxvbmcgaXAsIHVu c2lnbmVkIGxvbmcgYWRkcikKIAlyZXR1cm4gY2FsYy5jb2RlOwogfQogCisjaWZkZWYgQ09ORklH X1g4Nl9QSUUKK3VuaW9uIGZ0cmFjZV9jb2RlX2dvdF91bmlvbiB7CisJY2hhciBjb2RlW01DT1VO VF9JTlNOX1NJWkVdOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IGZmMTU7CisJCWludCBv ZmZzZXQ7CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK307CisKKy8qIFVzZWQgdG8gaWRl bnRpZnkgYSBtY291bnQgR09UIGNhbGwgb24gUElFICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAq ZnRyYWNlX29yaWdpbmFsX2NhbGwoc3RydWN0IG1vZHVsZSogbW9kLCB1bnNpZ25lZCBsb25nIGlw LAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSAgIHVuc2lnbmVkIGludCBzaXpl KQoreworCXN0YXRpYyB1bmlvbiBmdHJhY2VfY29kZV9nb3RfdW5pb24gY2FsYzsKKwl1bnNpZ25l ZCBsb25nIGdvdGFkZHI7CisKKwljYWxjLmZmMTUgPSAweDE1ZmY7CisKKwlnb3RhZGRyID0gbW9k dWxlX2ZpbmRfZ290X2VudHJ5KG1vZCwgYWRkcik7CisJaWYgKCFnb3RhZGRyKSB7CisJCXByX2Vy cigiRmFpbGVkIHRvIGZpbmQgR09UIGVudHJ5IGZvciAweCVseFxuIiwgYWRkcik7CisJCXJldHVy biBOVUxMOworCX0KKworCWNhbGMub2Zmc2V0ID0gZnRyYWNlX2NhbGNfb2Zmc2V0KGlwICsgTUNP VU5UX0dPVENBTExfU0laRSwgZ290YWRkcik7CisJcmV0dXJuIGNhbGMuY29kZTsKK30KKyNlbHNl CitzdGF0aWMgdW5zaWduZWQgY2hhciAqZnRyYWNlX29yaWdpbmFsX2NhbGwoc3RydWN0IG1vZHVs ZSogbW9kLCB1bnNpZ25lZCBsb25nIGlwLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJ CQkJCSAgIHVuc2lnbmVkIGludCBzaXplKQoreworCXJldHVybiBmdHJhY2VfY2FsbF9yZXBsYWNl KGlwLCBhZGRyLCBzaXplKTsKK30KKworI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50CiB3aXRo aW4odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25n IGVuZCkKIHsKQEAgLTk0LDE2ICsxMzcsMTggQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdGV4dF9p cF9hZGRyKHVuc2lnbmVkIGxvbmcgaXApCiAJcmV0dXJuIGlwOwogfQogCi1zdGF0aWMgY29uc3Qg dW5zaWduZWQgY2hhciAqZnRyYWNlX25vcF9yZXBsYWNlKHZvaWQpCitzdGF0aWMgY29uc3QgdW5z aWduZWQgY2hhciAqZnRyYWNlX25vcF9yZXBsYWNlKHVuc2lnbmVkIGludCBzaXplKQogewotCXJl dHVybiBpZGVhbF9ub3BzW05PUF9BVE9NSUM1XTsKKwlyZXR1cm4gaWRlYWxfbm9wc1tzaXplID09 IDUgPyBOT1BfQVRPTUlDNSA6IHNpemVdOwogfQogCiBzdGF0aWMgaW50Ci1mdHJhY2VfbW9kaWZ5 X2NvZGVfZGlyZWN0KHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGNvbnN0IGNoYXIgKm9sZF9j b2RlLAotCQkgICB1bnNpZ25lZCBjb25zdCBjaGFyICpuZXdfY29kZSkKK2Z0cmFjZV9tb2RpZnlf Y29kZV9kaXJlY3Qoc3RydWN0IGR5bl9mdHJhY2UgKnJlYywgdW5zaWduZWQgY29uc3QgY2hhciAq b2xkX2NvZGUsCisJCQkgIHVuc2lnbmVkIGNvbnN0IGNoYXIgKm5ld19jb2RlKQogewogCXVuc2ln bmVkIGNoYXIgcmVwbGFjZWRbTUNPVU5UX0lOU05fU0laRV07CisJdW5zaWduZWQgbG9uZyBpcCA9 IHJlYy0+aXA7CisJdW5zaWduZWQgaW50IHNpemUgPSBNQ09VTlRfSU5TTl9TSVpFOwogCiAJZnRy YWNlX2V4cGVjdGVkID0gb2xkX2NvZGU7CiAKQEAgLTExNiwxNyArMTYxLDE3IEBAIGZ0cmFjZV9t b2RpZnlfY29kZV9kaXJlY3QodW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgY29uc3QgY2hhciAq b2xkX2NvZGUsCiAJICovCiAKIAkvKiByZWFkIHRoZSB0ZXh0IHdlIHdhbnQgdG8gbW9kaWZ5ICov Ci0JaWYgKHByb2JlX2tlcm5lbF9yZWFkKHJlcGxhY2VkLCAodm9pZCAqKWlwLCBNQ09VTlRfSU5T Tl9TSVpFKSkKKwlpZiAocHJvYmVfa2VybmVsX3JlYWQocmVwbGFjZWQsICh2b2lkICopaXAsIHNp emUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIE1ha2Ugc3VyZSBpdCBpcyB3aGF0IHdlIGV4 cGVjdCBpdCB0byBiZSAqLwotCWlmIChtZW1jbXAocmVwbGFjZWQsIG9sZF9jb2RlLCBNQ09VTlRf SU5TTl9TSVpFKSAhPSAwKQorCWlmIChtZW1jbXAocmVwbGFjZWQsIG9sZF9jb2RlLCBzaXplKSAh PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlwID0gdGV4dF9pcF9hZGRyKGlwKTsKIAogCS8q IHJlcGxhY2UgdGhlIHRleHQgd2l0aCB0aGUgbmV3IHRleHQgKi8KLQlpZiAocHJvYmVfa2VybmVs X3dyaXRlKCh2b2lkICopaXAsIG5ld19jb2RlLCBNQ09VTlRfSU5TTl9TSVpFKSkKKwlpZiAocHJv YmVfa2VybmVsX3dyaXRlKCh2b2lkICopaXAsIG5ld19jb2RlLCBzaXplKSkKIAkJcmV0dXJuIC1F UEVSTTsKIAogCXN5bmNfY29yZSgpOwpAQCAtMTM5LDkgKzE4NCw3IEBAIGludCBmdHJhY2VfbWFr ZV9ub3Aoc3RydWN0IG1vZHVsZSAqbW9kLAogewogCXVuc2lnbmVkIGNvbnN0IGNoYXIgKm5ldywg Km9sZDsKIAl1bnNpZ25lZCBsb25nIGlwID0gcmVjLT5pcDsKLQotCW9sZCA9IGZ0cmFjZV9jYWxs X3JlcGxhY2UoaXAsIGFkZHIpOwotCW5ldyA9IGZ0cmFjZV9ub3BfcmVwbGFjZSgpOworCXVuc2ln bmVkIGludCBzaXplID0gTUNPVU5UX0lOU05fU0laRTsKIAogCS8qCiAJICogT24gYm9vdCB1cCwg YW5kIHdoZW4gbW9kdWxlcyBhcmUgbG9hZGVkLCB0aGUgTUNPVU5UX0FERFIKQEAgLTE1MSwxNCAr MTk0LDIwIEBAIGludCBmdHJhY2VfbWFrZV9ub3Aoc3RydWN0IG1vZHVsZSAqbW9kLAogCSAqIFdl IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgYnJlYWtwb2ludCB2ZXJzaW9uIGluIHRoaXMgY2FzZSwK IAkgKiBqdXN0IG1vZGlmeSB0aGUgY29kZSBkaXJlY3RseS4KIAkgKi8KLQlpZiAoYWRkciA9PSBN Q09VTlRfQUREUikKLQkJcmV0dXJuIGZ0cmFjZV9tb2RpZnlfY29kZV9kaXJlY3QocmVjLT5pcCwg b2xkLCBuZXcpOworCWlmIChhZGRyICE9IE1DT1VOVF9BRERSKSB7CisJCWZ0cmFjZV9leHBlY3Rl ZCA9IE5VTEw7CiAKLQlmdHJhY2VfZXhwZWN0ZWQgPSBOVUxMOworCQkvKiBOb3JtYWwgY2FzZXMg dXNlIGFkZF9icmtfb25fbm9wICovCisJCVdBUk5fT05DRSgxLCAiaW52YWxpZCB1c2Ugb2YgZnRy YWNlX21ha2Vfbm9wIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCS8qIE5vcm1hbCBjYXNl cyB1c2UgYWRkX2Jya19vbl9ub3AgKi8KLQlXQVJOX09OQ0UoMSwgImludmFsaWQgdXNlIG9mIGZ0 cmFjZV9tYWtlX25vcCIpOwotCXJldHVybiAtRUlOVkFMOworCW9sZCA9IGZ0cmFjZV9vcmlnaW5h bF9jYWxsKG1vZCwgaXAsIGFkZHIsIHNpemUpOworCWlmICghb2xkKQorCQlyZXR1cm4gLUVJTlZB TDsKKwluZXcgPSBmdHJhY2Vfbm9wX3JlcGxhY2Uoc2l6ZSk7CisKKwlyZXR1cm4gZnRyYWNlX21v ZGlmeV9jb2RlX2RpcmVjdChyZWMsIG9sZCwgbmV3KTsKIH0KIAogaW50IGZ0cmFjZV9tYWtlX2Nh bGwoc3RydWN0IGR5bl9mdHJhY2UgKnJlYywgdW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtMTY2LDEx ICsyMTUsMTEgQEAgaW50IGZ0cmFjZV9tYWtlX2NhbGwoc3RydWN0IGR5bl9mdHJhY2UgKnJlYywg dW5zaWduZWQgbG9uZyBhZGRyKQogCXVuc2lnbmVkIGNvbnN0IGNoYXIgKm5ldywgKm9sZDsKIAl1 bnNpZ25lZCBsb25nIGlwID0gcmVjLT5pcDsKIAotCW9sZCA9IGZ0cmFjZV9ub3BfcmVwbGFjZSgp OwotCW5ldyA9IGZ0cmFjZV9jYWxsX3JlcGxhY2UoaXAsIGFkZHIpOworCW9sZCA9IGZ0cmFjZV9u b3BfcmVwbGFjZShNQ09VTlRfSU5TTl9TSVpFKTsKKwluZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNl KGlwLCBhZGRyLCBNQ09VTlRfSU5TTl9TSVpFKTsKIAogCS8qIFNob3VsZCBvbmx5IGJlIGNhbGxl ZCB3aGVuIG1vZHVsZSBpcyBsb2FkZWQgKi8KLQlyZXR1cm4gZnRyYWNlX21vZGlmeV9jb2RlX2Rp cmVjdChyZWMtPmlwLCBvbGQsIG5ldyk7CisJcmV0dXJuIGZ0cmFjZV9tb2RpZnlfY29kZV9kaXJl Y3QocmVjLCBvbGQsIG5ldyk7CiB9CiAKIC8qCkBAIC0yMzMsNyArMjgyLDcgQEAgc3RhdGljIGlu dCB1cGRhdGVfZnRyYWNlX2Z1bmModW5zaWduZWQgbG9uZyBpcCwgdm9pZCAqbmV3KQogCXVuc2ln bmVkIGNoYXIgb2xkW01DT1VOVF9JTlNOX1NJWkVdOwogCWludCByZXQ7CiAKLQltZW1jcHkob2xk LCAodm9pZCAqKWlwLCBNQ09VTlRfSU5TTl9TSVpFKTsKKwltZW1jcHkob2xkLCAodm9pZCAqKWlw LCBNQ09VTlRfUkVMSU5TTl9TSVpFKTsKIAogCWZ0cmFjZV91cGRhdGVfZnVuYyA9IGlwOwogCS8q IE1ha2Ugc3VyZSB0aGUgYnJlYWtwb2ludHMgc2VlIHRoZSBmdHJhY2VfdXBkYXRlX2Z1bmMgdXBk YXRlICovCkBAIC0yNTUsMTMgKzMwNCwxNCBAQCBpbnQgZnRyYWNlX3VwZGF0ZV9mdHJhY2VfZnVu YyhmdHJhY2VfZnVuY190IGZ1bmMpCiAJdW5zaWduZWQgY2hhciAqbmV3OwogCWludCByZXQ7CiAK LQluZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCAodW5zaWduZWQgbG9uZylmdW5jKTsKKwlu ZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCAodW5zaWduZWQgbG9uZylmdW5jLCBNQ09VTlRf UkVMSU5TTl9TSVpFKTsKIAlyZXQgPSB1cGRhdGVfZnRyYWNlX2Z1bmMoaXAsIG5ldyk7CiAKIAkv KiBBbHNvIHVwZGF0ZSB0aGUgcmVncyBjYWxsYmFjayBmdW5jdGlvbiAqLwogCWlmICghcmV0KSB7 CiAJCWlwID0gKHVuc2lnbmVkIGxvbmcpKCZmdHJhY2VfcmVnc19jYWxsKTsKLQkJbmV3ID0gZnRy YWNlX2NhbGxfcmVwbGFjZShpcCwgKHVuc2lnbmVkIGxvbmcpZnVuYyk7CisJCW5ldyA9IGZ0cmFj ZV9jYWxsX3JlcGxhY2UoaXAsICh1bnNpZ25lZCBsb25nKWZ1bmMsCisJCQkJCSAgTUNPVU5UX1JF TElOU05fU0laRSk7CiAJCXJldCA9IHVwZGF0ZV9mdHJhY2VfZnVuYyhpcCwgbmV3KTsKIAl9CiAK QEAgLTMwOSwxOCArMzU5LDE4IEBAIHN0YXRpYyBpbnQgZnRyYWNlX3dyaXRlKHVuc2lnbmVkIGxv bmcgaXAsIGNvbnN0IGNoYXIgKnZhbCwgaW50IHNpemUpCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRp YyBpbnQgYWRkX2JyZWFrKHVuc2lnbmVkIGxvbmcgaXAsIGNvbnN0IGNoYXIgKm9sZCkKK3N0YXRp YyBpbnQgYWRkX2JyZWFrKHVuc2lnbmVkIGxvbmcgaXAsIGNvbnN0IGNoYXIgKm9sZCwgdW5zaWdu ZWQgaW50IHNpemUpCiB7CiAJdW5zaWduZWQgY2hhciByZXBsYWNlZFtNQ09VTlRfSU5TTl9TSVpF XTsKIAl1bnNpZ25lZCBjaGFyIGJyayA9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT047CiAKLQlpZiAo cHJvYmVfa2VybmVsX3JlYWQocmVwbGFjZWQsICh2b2lkICopaXAsIE1DT1VOVF9JTlNOX1NJWkUp KQorCWlmIChwcm9iZV9rZXJuZWxfcmVhZChyZXBsYWNlZCwgKHZvaWQgKilpcCwgc2l6ZSkpCiAJ CXJldHVybiAtRUZBVUxUOwogCiAJZnRyYWNlX2V4cGVjdGVkID0gb2xkOwogCiAJLyogTWFrZSBz dXJlIGl0IGlzIHdoYXQgd2UgZXhwZWN0IGl0IHRvIGJlICovCi0JaWYgKG1lbWNtcChyZXBsYWNl ZCwgb2xkLCBNQ09VTlRfSU5TTl9TSVpFKSAhPSAwKQorCWlmIChtZW1jbXAocmVwbGFjZWQsIG9s ZCwgc2l6ZSkgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gZnRyYWNlX3dyaXRl KGlwLCAmYnJrLCAxKTsKQEAgLTMzMCwyMCArMzgwLDIyIEBAIHN0YXRpYyBpbnQgYWRkX2Jya19v bl9jYWxsKHN0cnVjdCBkeW5fZnRyYWNlICpyZWMsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAl1 bnNpZ25lZCBjb25zdCBjaGFyICpvbGQ7CiAJdW5zaWduZWQgbG9uZyBpcCA9IHJlYy0+aXA7CisJ dW5zaWduZWQgaW50IHNpemUgPSBNQ09VTlRfSU5TTl9TSVpFOwogCi0Jb2xkID0gZnRyYWNlX2Nh bGxfcmVwbGFjZShpcCwgYWRkcik7CisJb2xkID0gZnRyYWNlX2NhbGxfcmVwbGFjZShpcCwgYWRk ciwgc2l6ZSk7CiAKLQlyZXR1cm4gYWRkX2JyZWFrKHJlYy0+aXAsIG9sZCk7CisJcmV0dXJuIGFk ZF9icmVhayhyZWMtPmlwLCBvbGQsIHNpemUpOwogfQogCiAKIHN0YXRpYyBpbnQgYWRkX2Jya19v bl9ub3Aoc3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIHsKIAl1bnNpZ25lZCBjb25zdCBjaGFyICpv bGQ7CisJdW5zaWduZWQgaW50IHNpemUgPSBNQ09VTlRfSU5TTl9TSVpFOwogCi0Jb2xkID0gZnRy YWNlX25vcF9yZXBsYWNlKCk7CisJb2xkID0gZnRyYWNlX25vcF9yZXBsYWNlKHNpemUpOwogCi0J cmV0dXJuIGFkZF9icmVhayhyZWMtPmlwLCBvbGQpOworCXJldHVybiBhZGRfYnJlYWsocmVjLT5p cCwgb2xkLCBzaXplKTsKIH0KIAogc3RhdGljIGludCBhZGRfYnJlYWtwb2ludHMoc3RydWN0IGR5 bl9mdHJhY2UgKnJlYywgaW50IGVuYWJsZSkKQEAgLTM4NiwyMiArNDM4LDIzIEBAIHN0YXRpYyBp bnQgcmVtb3ZlX2JyZWFrcG9pbnQoc3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIAljb25zdCB1bnNp Z25lZCBjaGFyICpub3A7CiAJdW5zaWduZWQgbG9uZyBmdHJhY2VfYWRkcjsKIAl1bnNpZ25lZCBs b25nIGlwID0gcmVjLT5pcDsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IE1DT1VOVF9JTlNOX1NJWkU7 CiAKIAkvKiBJZiB3ZSBmYWlsIHRoZSByZWFkLCBqdXN0IGdpdmUgdXAgKi8KLQlpZiAocHJvYmVf a2VybmVsX3JlYWQoaW5zLCAodm9pZCAqKWlwLCBNQ09VTlRfSU5TTl9TSVpFKSkKKwlpZiAocHJv YmVfa2VybmVsX3JlYWQoaW5zLCAodm9pZCAqKWlwLCBzaXplKSkKIAkJcmV0dXJuIC1FRkFVTFQ7 CiAKIAkvKiBJZiB0aGlzIGRvZXMgbm90IGhhdmUgYSBicmVha3BvaW50LCB3ZSBhcmUgZG9uZSAq LwogCWlmIChpbnNbMF0gIT0gYnJrKQogCQlyZXR1cm4gMDsKIAotCW5vcCA9IGZ0cmFjZV9ub3Bf cmVwbGFjZSgpOworCW5vcCA9IGZ0cmFjZV9ub3BfcmVwbGFjZShzaXplKTsKIAogCS8qCiAJICog SWYgdGhlIGxhc3QgNCBieXRlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gZG8gbm90IG1hdGNoCiAJICog YSBub3AsIHRoZW4gd2UgYXNzdW1lIHRoYXQgdGhpcyBpcyBhIGNhbGwgdG8gZnRyYWNlX2FkZHIu CiAJICovCi0JaWYgKG1lbWNtcCgmaW5zWzFdLCAmbm9wWzFdLCBNQ09VTlRfSU5TTl9TSVpFIC0g MSkgIT0gMCkgeworCWlmIChtZW1jbXAoJmluc1sxXSwgJm5vcFsxXSwgc2l6ZSAtIDEpICE9IDAp IHsKIAkJLyoKIAkJICogRm9yIGV4dHJhIHBhcmFub2lkaXNtLCB3ZSBjaGVjayBpZiB0aGUgYnJl YWtwb2ludCBpcyBvbgogCQkgKiBhIGNhbGwgdGhhdCB3b3VsZCBhY3R1YWxseSBqdW1wIHRvIHRo ZSBmdHJhY2VfYWRkci4KQEAgLTQwOSwxOCArNDYyLDE4IEBAIHN0YXRpYyBpbnQgcmVtb3ZlX2Jy ZWFrcG9pbnQoc3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIAkJICogYSBkaXNhc3Rlci4KIAkJICov CiAJCWZ0cmFjZV9hZGRyID0gZnRyYWNlX2dldF9hZGRyX25ldyhyZWMpOwotCQlub3AgPSBmdHJh Y2VfY2FsbF9yZXBsYWNlKGlwLCBmdHJhY2VfYWRkcik7CisJCW5vcCA9IGZ0cmFjZV9jYWxsX3Jl cGxhY2UoaXAsIGZ0cmFjZV9hZGRyLCBzaXplKTsKIAotCQlpZiAobWVtY21wKCZpbnNbMV0sICZu b3BbMV0sIE1DT1VOVF9JTlNOX1NJWkUgLSAxKSA9PSAwKQorCQlpZiAobWVtY21wKCZpbnNbMV0s ICZub3BbMV0sIHNpemUgLSAxKSA9PSAwKQogCQkJZ290byB1cGRhdGU7CiAKIAkJLyogQ2hlY2sg Ym90aCBmdHJhY2VfYWRkciBhbmQgZnRyYWNlX29sZF9hZGRyICovCiAJCWZ0cmFjZV9hZGRyID0g ZnRyYWNlX2dldF9hZGRyX2N1cnIocmVjKTsKLQkJbm9wID0gZnRyYWNlX2NhbGxfcmVwbGFjZShp cCwgZnRyYWNlX2FkZHIpOworCQlub3AgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCBmdHJhY2Vf YWRkciwgc2l6ZSk7CiAKIAkJZnRyYWNlX2V4cGVjdGVkID0gbm9wOwogCi0JCWlmIChtZW1jbXAo Jmluc1sxXSwgJm5vcFsxXSwgTUNPVU5UX0lOU05fU0laRSAtIDEpICE9IDApCisJCWlmIChtZW1j bXAoJmluc1sxXSwgJm5vcFsxXSwgc2l6ZSAtIDEpICE9IDApCiAJCQlyZXR1cm4gLUVJTlZBTDsK IAl9CiAKQEAgLTQyOCwzMCArNDgxLDMzIEBAIHN0YXRpYyBpbnQgcmVtb3ZlX2JyZWFrcG9pbnQo c3RydWN0IGR5bl9mdHJhY2UgKnJlYykKIAlyZXR1cm4gZnRyYWNlX3dyaXRlKGlwLCBub3AsIDEp OwogfQogCi1zdGF0aWMgaW50IGFkZF91cGRhdGVfY29kZSh1bnNpZ25lZCBsb25nIGlwLCB1bnNp Z25lZCBjb25zdCBjaGFyICpuZXcpCitzdGF0aWMgaW50IGFkZF91cGRhdGVfY29kZSh1bnNpZ25l ZCBsb25nIGlwLCB1bnNpZ25lZCBjb25zdCBjaGFyICpuZXcsCisJCQkgICB1bnNpZ25lZCBpbnQg c2l6ZSkKIHsKIAkvKiBza2lwIGJyZWFrcG9pbnQgKi8KIAlpcCsrOwogCW5ldysrOwotCXJldHVy biBmdHJhY2Vfd3JpdGUoaXAsIG5ldywgTUNPVU5UX0lOU05fU0laRSAtIDEpOworCXJldHVybiBm dHJhY2Vfd3JpdGUoaXAsIG5ldywgc2l6ZSAtIDEpOwogfQogCiBzdGF0aWMgaW50IGFkZF91cGRh dGVfY2FsbChzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJ dW5zaWduZWQgbG9uZyBpcCA9IHJlYy0+aXA7CisJdW5zaWduZWQgaW50IHNpemUgPSBNQ09VTlRf SU5TTl9TSVpFOwogCXVuc2lnbmVkIGNvbnN0IGNoYXIgKm5ldzsKIAotCW5ldyA9IGZ0cmFjZV9j YWxsX3JlcGxhY2UoaXAsIGFkZHIpOwotCXJldHVybiBhZGRfdXBkYXRlX2NvZGUoaXAsIG5ldyk7 CisJbmV3ID0gZnRyYWNlX2NhbGxfcmVwbGFjZShpcCwgYWRkciwgc2l6ZSk7CisJcmV0dXJuIGFk ZF91cGRhdGVfY29kZShpcCwgbmV3LCBzaXplKTsKIH0KIAogc3RhdGljIGludCBhZGRfdXBkYXRl X25vcChzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjKQogewogCXVuc2lnbmVkIGxvbmcgaXAgPSByZWMt PmlwOworCXVuc2lnbmVkIGludCBzaXplID0gTUNPVU5UX0lOU05fU0laRTsKIAl1bnNpZ25lZCBj b25zdCBjaGFyICpuZXc7CiAKLQluZXcgPSBmdHJhY2Vfbm9wX3JlcGxhY2UoKTsKLQlyZXR1cm4g YWRkX3VwZGF0ZV9jb2RlKGlwLCBuZXcpOworCW5ldyA9IGZ0cmFjZV9ub3BfcmVwbGFjZShzaXpl KTsKKwlyZXR1cm4gYWRkX3VwZGF0ZV9jb2RlKGlwLCBuZXcsIHNpemUpOwogfQogCiBzdGF0aWMg aW50IGFkZF91cGRhdGUoc3RydWN0IGR5bl9mdHJhY2UgKnJlYywgaW50IGVuYWJsZSkKQEAgLTQ4 NSw3ICs1NDEsNyBAQCBzdGF0aWMgaW50IGZpbmlzaF91cGRhdGVfY2FsbChzdHJ1Y3QgZHluX2Z0 cmFjZSAqcmVjLCB1bnNpZ25lZCBsb25nIGFkZHIpCiAJdW5zaWduZWQgbG9uZyBpcCA9IHJlYy0+ aXA7CiAJdW5zaWduZWQgY29uc3QgY2hhciAqbmV3OwogCi0JbmV3ID0gZnRyYWNlX2NhbGxfcmVw bGFjZShpcCwgYWRkcik7CisJbmV3ID0gZnRyYWNlX2NhbGxfcmVwbGFjZShpcCwgYWRkciwgTUNP VU5UX0lOU05fU0laRSk7CiAKIAlyZXR1cm4gZnRyYWNlX3dyaXRlKGlwLCBuZXcsIDEpOwogfQpA QCAtNDk1LDcgKzU1MSw3IEBAIHN0YXRpYyBpbnQgZmluaXNoX3VwZGF0ZV9ub3Aoc3RydWN0IGR5 bl9mdHJhY2UgKnJlYykKIAl1bnNpZ25lZCBsb25nIGlwID0gcmVjLT5pcDsKIAl1bnNpZ25lZCBj b25zdCBjaGFyICpuZXc7CiAKLQluZXcgPSBmdHJhY2Vfbm9wX3JlcGxhY2UoKTsKKwluZXcgPSBm dHJhY2Vfbm9wX3JlcGxhY2UoTUNPVU5UX0lOU05fU0laRSk7CiAKIAlyZXR1cm4gZnRyYWNlX3dy aXRlKGlwLCBuZXcsIDEpOwogfQpAQCAtNjE5LDEzICs2NzUsMTMgQEAgZnRyYWNlX21vZGlmeV9j b2RlKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGNvbnN0IGNoYXIgKm9sZF9jb2RlLAogewog CWludCByZXQ7CiAKLQlyZXQgPSBhZGRfYnJlYWsoaXAsIG9sZF9jb2RlKTsKKwlyZXQgPSBhZGRf YnJlYWsoaXAsIG9sZF9jb2RlLCBNQ09VTlRfUkVMSU5TTl9TSVpFKTsKIAlpZiAocmV0KQogCQln b3RvIG91dDsKIAogCXJ1bl9zeW5jKCk7CiAKLQlyZXQgPSBhZGRfdXBkYXRlX2NvZGUoaXAsIG5l d19jb2RlKTsKKwlyZXQgPSBhZGRfdXBkYXRlX2NvZGUoaXAsIG5ld19jb2RlLCBNQ09VTlRfUkVM SU5TTl9TSVpFKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxfdXBkYXRlOwogCkBAIC02NzAsNyAr NzI2LDcgQEAgc3RhdGljIHVuc2lnbmVkIGNoYXIgKmZ0cmFjZV9qbXBfcmVwbGFjZSh1bnNpZ25l ZCBsb25nIGlwLCB1bnNpZ25lZCBsb25nIGFkZHIpCiAKIAkvKiBKbXAgbm90IGEgY2FsbCAoaWdu b3JlIHRoZSAuZTgpICovCiAJY2FsYy5lOAkJPSAweGU5OwotCWNhbGMub2Zmc2V0CT0gZnRyYWNl X2NhbGNfb2Zmc2V0KGlwICsgTUNPVU5UX0lOU05fU0laRSwgYWRkcik7CisJY2FsYy5vZmZzZXQJ PSBmdHJhY2VfY2FsY19vZmZzZXQoaXAgKyBNQ09VTlRfUkVMSU5TTl9TSVpFLCBhZGRyKTsKIAog CS8qCiAJICogZnRyYWNlIGV4dGVybmFsIGxvY2tzIHN5bmNocm9uaXplIHRoZSBhY2Nlc3MgdG8g dGhlIHN0YXRpYyB2YXJpYWJsZS4KQEAgLTc2NiwxMSArODIyLDExIEBAIGNyZWF0ZV90cmFtcG9s aW5lKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMsIHVuc2lnbmVkIGludCAqdHJhbXBfc2l6ZSkKIAkg KiB0aGUgam1wIHRvIGZ0cmFjZV9lcGlsb2d1ZSwgYXMgd2VsbCBhcyB0aGUgYWRkcmVzcyBvZgog CSAqIHRoZSBmdHJhY2Vfb3BzIHRoaXMgdHJhbXBvbGluZSBpcyB1c2VkIGZvci4KIAkgKi8KLQl0 cmFtcG9saW5lID0gYWxsb2NfdHJhbXAoc2l6ZSArIE1DT1VOVF9JTlNOX1NJWkUgKyBzaXplb2Yo dm9pZCAqKSk7CisJdHJhbXBvbGluZSA9IGFsbG9jX3RyYW1wKHNpemUgKyBNQ09VTlRfUkVMSU5T Tl9TSVpFICsgc2l6ZW9mKHZvaWQgKikpOwogCWlmICghdHJhbXBvbGluZSkKIAkJcmV0dXJuIDA7 CiAKLQkqdHJhbXBfc2l6ZSA9IHNpemUgKyBNQ09VTlRfSU5TTl9TSVpFICsgc2l6ZW9mKHZvaWQg Kik7CisJKnRyYW1wX3NpemUgPSBzaXplICsgTUNPVU5UX1JFTElOU05fU0laRSArIHNpemVvZih2 b2lkICopOwogCiAJLyogQ29weSBmdHJhY2VfY2FsbGVyIG9udG8gdGhlIHRyYW1wb2xpbmUgbWVt b3J5ICovCiAJcmV0ID0gcHJvYmVfa2VybmVsX3JlYWQodHJhbXBvbGluZSwgKHZvaWQgKilzdGFy dF9vZmZzZXQsIHNpemUpOwpAQCAtNzgzLDcgKzgzOSw3IEBAIGNyZWF0ZV90cmFtcG9saW5lKHN0 cnVjdCBmdHJhY2Vfb3BzICpvcHMsIHVuc2lnbmVkIGludCAqdHJhbXBfc2l6ZSkKIAogCS8qIFRo ZSB0cmFtcG9saW5lIGVuZHMgd2l0aCBhIGptcCB0byBmdHJhY2VfZXBpbG9ndWUgKi8KIAlqbXAg PSBmdHJhY2Vfam1wX3JlcGxhY2UoaXAsICh1bnNpZ25lZCBsb25nKWZ0cmFjZV9lcGlsb2d1ZSk7 Ci0JbWVtY3B5KHRyYW1wb2xpbmUgKyBzaXplLCBqbXAsIE1DT1VOVF9JTlNOX1NJWkUpOworCW1l bWNweSh0cmFtcG9saW5lICsgc2l6ZSwgam1wLCBNQ09VTlRfUkVMSU5TTl9TSVpFKTsKIAogCS8q CiAJICogVGhlIGFkZHJlc3Mgb2YgdGhlIGZ0cmFjZV9vcHMgdGhhdCBpcyB1c2VkIGZvciB0aGlz IHRyYW1wb2xpbmUKQEAgLTc5Myw3ICs4NDksNyBAQCBjcmVhdGVfdHJhbXBvbGluZShzdHJ1Y3Qg ZnRyYWNlX29wcyAqb3BzLCB1bnNpZ25lZCBpbnQgKnRyYW1wX3NpemUpCiAJICogdGhlIGdsb2Jh bCBmdW5jdGlvbl90cmFjZV9vcCB2YXJpYWJsZS4KIAkgKi8KIAotCXB0ciA9ICh1bnNpZ25lZCBs b25nICopKHRyYW1wb2xpbmUgKyBzaXplICsgTUNPVU5UX0lOU05fU0laRSk7CisJcHRyID0gKHVu c2lnbmVkIGxvbmcgKikodHJhbXBvbGluZSArIHNpemUgKyBNQ09VTlRfUkVMSU5TTl9TSVpFKTsK IAkqcHRyID0gKHVuc2lnbmVkIGxvbmcpb3BzOwogCiAJb3Bfb2Zmc2V0IC09IHN0YXJ0X29mZnNl dDsKQEAgLTg2OCw3ICs5MjQsNyBAQCB2b2lkIGFyY2hfZnRyYWNlX3VwZGF0ZV90cmFtcG9saW5l KHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMpCiAJZnVuYyA9IGZ0cmFjZV9vcHNfZ2V0X2Z1bmMob3Bz KTsKIAogCS8qIERvIGEgc2FmZSBtb2RpZnkgaW4gY2FzZSB0aGUgdHJhbXBvbGluZSBpcyBleGVj dXRpbmcgKi8KLQluZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCAodW5zaWduZWQgbG9uZylm dW5jKTsKKwluZXcgPSBmdHJhY2VfY2FsbF9yZXBsYWNlKGlwLCAodW5zaWduZWQgbG9uZylmdW5j LCBNQ09VTlRfUkVMSU5TTl9TSVpFKTsKIAlyZXQgPSB1cGRhdGVfZnRyYWNlX2Z1bmMoaXAsIG5l dyk7CiAJc2V0X21lbW9yeV9ybyhvcHMtPnRyYW1wb2xpbmUsIG5wYWdlcyk7CiAKQEAgLTg4Miw3 ICs5MzgsNyBAQCBzdGF0aWMgdm9pZCAqYWRkcl9mcm9tX2NhbGwodm9pZCAqcHRyKQogCXVuaW9u IGZ0cmFjZV9jb2RlX3VuaW9uIGNhbGM7CiAJaW50IHJldDsKIAotCXJldCA9IHByb2JlX2tlcm5l bF9yZWFkKCZjYWxjLCBwdHIsIE1DT1VOVF9JTlNOX1NJWkUpOworCXJldCA9IHByb2JlX2tlcm5l bF9yZWFkKCZjYWxjLCBwdHIsIE1DT1VOVF9SRUxJTlNOX1NJWkUpOwogCWlmIChXQVJOX09OX09O Q0UocmV0IDwgMCkpCiAJCXJldHVybiBOVUxMOwogCkBAIC04OTIsNyArOTQ4LDcgQEAgc3RhdGlj IHZvaWQgKmFkZHJfZnJvbV9jYWxsKHZvaWQgKnB0cikKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0J cmV0dXJuIHB0ciArIE1DT1VOVF9JTlNOX1NJWkUgKyBjYWxjLm9mZnNldDsKKwlyZXR1cm4gcHRy ICsgTUNPVU5UX1JFTElOU05fU0laRSArIGNhbGMub2Zmc2V0OwogfQogCiB2b2lkIHByZXBhcmVf ZnRyYWNlX3JldHVybih1bnNpZ25lZCBsb25nIHNlbGZfYWRkciwgdW5zaWduZWQgbG9uZyAqcGFy ZW50LApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21vZHVsZS5sZHMgYi9hcmNoL3g4Ni9r ZXJuZWwvbW9kdWxlLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAu LmZkNmU5NWE0YjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUu bGRzCkBAIC0wLDAgKzEsMyBAQAorU0VDVElPTlMgeworCS5nb3QgKE5PTE9BRCkgOiB7IEJZVEUo MCkgfQorfQotLSAKMi4xNC4yLjkyMC5nY2YwYzY3OTc5Yy1nb29nCgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApY ZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Garnier Date: Wed, 4 Oct 2017 14:19:56 -0700 Message-Id: <20171004212003.28296-21-thgarnie@google.com> In-Reply-To: <20171004212003.28296-1-thgarnie@google.com> References: <20171004212003.28296-1-thgarnie@google.com> Subject: [kernel-hardening] [RFC v3 20/27] x86/ftrace: Adapt function tracing for PIE support To: Herbert Xu , "David S . Miller" , Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , Peter Zijlstra , Josh Poimboeuf , Thomas Garnier , Arnd Bergmann , Kees Cook , Matthias Kaehlcke , Tom Lendacky , Andy Lutomirski , "Kirill A . Shutemov" , Borislav Petkov , "Rafael J . Wysocki" , Len Brown , Pavel Machek , Juergen Gross , Chris Wright , Alok Kataria , Rusty Russell , Tejun Heo , Christoph Lameter , Boris Ostrovsky , Alexey Dobriyan , Andrew Morton , Paul Gortmaker , Chris Metcalf , "Paul E . McKenney" , Nicolas Pitre , Borislav Petkov , "Luis R . Rodriguez" , Greg Kroah-Hartman , Christopher Li , Steven Rostedt , Jason Baron , Dou Liyang , "Rafael J . Wysocki" , Mika Westerberg , Lukas Wunner , Masahiro Yamada , Alexei Starovoitov , Daniel Borkmann , Markus Trippelsdorf , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Joerg Roedel , Rik van Riel , David Howells , Ard Biesheuvel , Waiman Long , Kyle Huey , Andrey Ryabinin , Jonathan Corbet , Matthew Wilcox , Michal Hocko , Peter Foley , Paul Bolle , Jiri Kosina , Rob Landley , "H . J . Lu" , Baoquan He , =?UTF-8?q?Jan=20H=20=2E=20Sch=C3=B6nherr?= , Daniel Micay Cc: x86@kernel.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, virtualization@lists.linux-foundation.org, xen-devel@lists.xenproject.org, linux-arch@vger.kernel.org, linux-sparse@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, kernel-hardening@lists.openwall.com List-ID: When using -fPIE/PIC with function tracing, the compiler generates a call through the GOT (call *__fentry__@GOTPCREL). This instruction takes 6 bytes instead of 5 on the usual relative call. With this change, function tracing supports 6 bytes on traceable function and can still replace relative calls on the ftrace assembly functions. Position Independent Executable (PIE) support will allow to extended the KASLR randomization range below the -2G memory limit. Signed-off-by: Thomas Garnier --- arch/x86/include/asm/ftrace.h | 23 +++++- arch/x86/include/asm/sections.h | 4 + arch/x86/kernel/ftrace.c | 168 ++++++++++++++++++++++++++-------------- arch/x86/kernel/module.lds | 3 + 4 files changed, 139 insertions(+), 59 deletions(-) create mode 100644 arch/x86/kernel/module.lds diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h index eccd0ac6bc38..b8bbcc7fad7f 100644 --- a/arch/x86/include/asm/ftrace.h +++ b/arch/x86/include/asm/ftrace.h @@ -1,6 +1,7 @@ #ifndef _ASM_X86_FTRACE_H #define _ASM_X86_FTRACE_H + #ifdef CONFIG_FUNCTION_TRACER #ifdef CC_USING_FENTRY # define MCOUNT_ADDR ((unsigned long)(__fentry__)) @@ -8,7 +9,19 @@ # define MCOUNT_ADDR ((unsigned long)(mcount)) # define HAVE_FUNCTION_GRAPH_FP_TEST #endif -#define MCOUNT_INSN_SIZE 5 /* sizeof mcount call */ + +#define MCOUNT_RELINSN_SIZE 5 /* sizeof relative (call or jump) */ +#define MCOUNT_GOTCALL_SIZE 6 /* sizeof call *got */ + +/* + * MCOUNT_INSN_SIZE is the highest size of instructions based on the + * configuration. + */ +#ifdef CONFIG_X86_PIE +#define MCOUNT_INSN_SIZE MCOUNT_GOTCALL_SIZE +#else +#define MCOUNT_INSN_SIZE MCOUNT_RELINSN_SIZE +#endif #ifdef CONFIG_DYNAMIC_FTRACE #define ARCH_SUPPORTS_FTRACE_OPS 1 @@ -17,6 +30,8 @@ #define HAVE_FUNCTION_GRAPH_RET_ADDR_PTR #ifndef __ASSEMBLY__ +#include + extern void mcount(void); extern atomic_t modifying_ftrace_code; extern void __fentry__(void); @@ -24,9 +39,11 @@ extern void __fentry__(void); static inline unsigned long ftrace_call_adjust(unsigned long addr) { /* - * addr is the address of the mcount call instruction. - * recordmcount does the necessary offset calculation. + * addr is the address of the mcount call instruction. PIE has always a + * byte added to the start of the function. */ + if (IS_ENABLED(CONFIG_X86_PIE)) + addr -= 1; return addr; } diff --git a/arch/x86/include/asm/sections.h b/arch/x86/include/asm/sections.h index 2f75f30cb2f6..6b2d496cf1aa 100644 --- a/arch/x86/include/asm/sections.h +++ b/arch/x86/include/asm/sections.h @@ -11,4 +11,8 @@ extern struct exception_table_entry __stop___ex_table[]; extern char __end_rodata_hpage_align[]; #endif +#if defined(CONFIG_X86_PIE) +extern char __start_got[], __end_got[]; +#endif + #endif /* _ASM_X86_SECTIONS_H */ diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 9bef1bbeba63..41d8c4c4306d 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c @@ -58,12 +58,17 @@ static int ftrace_calc_offset(long ip, long addr) return (int)(addr - ip); } -static unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) +static unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr, + unsigned int size) { static union ftrace_code_union calc; + /* On PIE, fill the rest of the buffer with nops */ + if (IS_ENABLED(CONFIG_X86_PIE)) + memset(calc.code, ideal_nops[1][0], sizeof(calc.code)); + calc.e8 = 0xe8; - calc.offset = ftrace_calc_offset(ip + MCOUNT_INSN_SIZE, addr); + calc.offset = ftrace_calc_offset(ip + MCOUNT_RELINSN_SIZE, addr); /* * No locking needed, this must be called via kstop_machine @@ -72,6 +77,44 @@ static unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) return calc.code; } +#ifdef CONFIG_X86_PIE +union ftrace_code_got_union { + char code[MCOUNT_INSN_SIZE]; + struct { + unsigned short ff15; + int offset; + } __attribute__((packed)); +}; + +/* Used to identify a mcount GOT call on PIE */ +static unsigned char *ftrace_original_call(struct module* mod, unsigned long ip, + unsigned long addr, + unsigned int size) +{ + static union ftrace_code_got_union calc; + unsigned long gotaddr; + + calc.ff15 = 0x15ff; + + gotaddr = module_find_got_entry(mod, addr); + if (!gotaddr) { + pr_err("Failed to find GOT entry for 0x%lx\n", addr); + return NULL; + } + + calc.offset = ftrace_calc_offset(ip + MCOUNT_GOTCALL_SIZE, gotaddr); + return calc.code; +} +#else +static unsigned char *ftrace_original_call(struct module* mod, unsigned long ip, + unsigned long addr, + unsigned int size) +{ + return ftrace_call_replace(ip, addr, size); +} + +#endif + static inline int within(unsigned long addr, unsigned long start, unsigned long end) { @@ -94,16 +137,18 @@ static unsigned long text_ip_addr(unsigned long ip) return ip; } -static const unsigned char *ftrace_nop_replace(void) +static const unsigned char *ftrace_nop_replace(unsigned int size) { - return ideal_nops[NOP_ATOMIC5]; + return ideal_nops[size == 5 ? NOP_ATOMIC5 : size]; } static int -ftrace_modify_code_direct(unsigned long ip, unsigned const char *old_code, - unsigned const char *new_code) +ftrace_modify_code_direct(struct dyn_ftrace *rec, unsigned const char *old_code, + unsigned const char *new_code) { unsigned char replaced[MCOUNT_INSN_SIZE]; + unsigned long ip = rec->ip; + unsigned int size = MCOUNT_INSN_SIZE; ftrace_expected = old_code; @@ -116,17 +161,17 @@ ftrace_modify_code_direct(unsigned long ip, unsigned const char *old_code, */ /* read the text we want to modify */ - if (probe_kernel_read(replaced, (void *)ip, MCOUNT_INSN_SIZE)) + if (probe_kernel_read(replaced, (void *)ip, size)) return -EFAULT; /* Make sure it is what we expect it to be */ - if (memcmp(replaced, old_code, MCOUNT_INSN_SIZE) != 0) + if (memcmp(replaced, old_code, size) != 0) return -EINVAL; ip = text_ip_addr(ip); /* replace the text with the new text */ - if (probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE)) + if (probe_kernel_write((void *)ip, new_code, size)) return -EPERM; sync_core(); @@ -139,9 +184,7 @@ int ftrace_make_nop(struct module *mod, { unsigned const char *new, *old; unsigned long ip = rec->ip; - - old = ftrace_call_replace(ip, addr); - new = ftrace_nop_replace(); + unsigned int size = MCOUNT_INSN_SIZE; /* * On boot up, and when modules are loaded, the MCOUNT_ADDR @@ -151,14 +194,20 @@ int ftrace_make_nop(struct module *mod, * We do not want to use the breakpoint version in this case, * just modify the code directly. */ - if (addr == MCOUNT_ADDR) - return ftrace_modify_code_direct(rec->ip, old, new); + if (addr != MCOUNT_ADDR) { + ftrace_expected = NULL; - ftrace_expected = NULL; + /* Normal cases use add_brk_on_nop */ + WARN_ONCE(1, "invalid use of ftrace_make_nop"); + return -EINVAL; + } - /* Normal cases use add_brk_on_nop */ - WARN_ONCE(1, "invalid use of ftrace_make_nop"); - return -EINVAL; + old = ftrace_original_call(mod, ip, addr, size); + if (!old) + return -EINVAL; + new = ftrace_nop_replace(size); + + return ftrace_modify_code_direct(rec, old, new); } int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) @@ -166,11 +215,11 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) unsigned const char *new, *old; unsigned long ip = rec->ip; - old = ftrace_nop_replace(); - new = ftrace_call_replace(ip, addr); + old = ftrace_nop_replace(MCOUNT_INSN_SIZE); + new = ftrace_call_replace(ip, addr, MCOUNT_INSN_SIZE); /* Should only be called when module is loaded */ - return ftrace_modify_code_direct(rec->ip, old, new); + return ftrace_modify_code_direct(rec, old, new); } /* @@ -233,7 +282,7 @@ static int update_ftrace_func(unsigned long ip, void *new) unsigned char old[MCOUNT_INSN_SIZE]; int ret; - memcpy(old, (void *)ip, MCOUNT_INSN_SIZE); + memcpy(old, (void *)ip, MCOUNT_RELINSN_SIZE); ftrace_update_func = ip; /* Make sure the breakpoints see the ftrace_update_func update */ @@ -255,13 +304,14 @@ int ftrace_update_ftrace_func(ftrace_func_t func) unsigned char *new; int ret; - new = ftrace_call_replace(ip, (unsigned long)func); + new = ftrace_call_replace(ip, (unsigned long)func, MCOUNT_RELINSN_SIZE); ret = update_ftrace_func(ip, new); /* Also update the regs callback function */ if (!ret) { ip = (unsigned long)(&ftrace_regs_call); - new = ftrace_call_replace(ip, (unsigned long)func); + new = ftrace_call_replace(ip, (unsigned long)func, + MCOUNT_RELINSN_SIZE); ret = update_ftrace_func(ip, new); } @@ -309,18 +359,18 @@ static int ftrace_write(unsigned long ip, const char *val, int size) return 0; } -static int add_break(unsigned long ip, const char *old) +static int add_break(unsigned long ip, const char *old, unsigned int size) { unsigned char replaced[MCOUNT_INSN_SIZE]; unsigned char brk = BREAKPOINT_INSTRUCTION; - if (probe_kernel_read(replaced, (void *)ip, MCOUNT_INSN_SIZE)) + if (probe_kernel_read(replaced, (void *)ip, size)) return -EFAULT; ftrace_expected = old; /* Make sure it is what we expect it to be */ - if (memcmp(replaced, old, MCOUNT_INSN_SIZE) != 0) + if (memcmp(replaced, old, size) != 0) return -EINVAL; return ftrace_write(ip, &brk, 1); @@ -330,20 +380,22 @@ static int add_brk_on_call(struct dyn_ftrace *rec, unsigned long addr) { unsigned const char *old; unsigned long ip = rec->ip; + unsigned int size = MCOUNT_INSN_SIZE; - old = ftrace_call_replace(ip, addr); + old = ftrace_call_replace(ip, addr, size); - return add_break(rec->ip, old); + return add_break(rec->ip, old, size); } static int add_brk_on_nop(struct dyn_ftrace *rec) { unsigned const char *old; + unsigned int size = MCOUNT_INSN_SIZE; - old = ftrace_nop_replace(); + old = ftrace_nop_replace(size); - return add_break(rec->ip, old); + return add_break(rec->ip, old, size); } static int add_breakpoints(struct dyn_ftrace *rec, int enable) @@ -386,22 +438,23 @@ static int remove_breakpoint(struct dyn_ftrace *rec) const unsigned char *nop; unsigned long ftrace_addr; unsigned long ip = rec->ip; + unsigned int size = MCOUNT_INSN_SIZE; /* If we fail the read, just give up */ - if (probe_kernel_read(ins, (void *)ip, MCOUNT_INSN_SIZE)) + if (probe_kernel_read(ins, (void *)ip, size)) return -EFAULT; /* If this does not have a breakpoint, we are done */ if (ins[0] != brk) return 0; - nop = ftrace_nop_replace(); + nop = ftrace_nop_replace(size); /* * If the last 4 bytes of the instruction do not match * a nop, then we assume that this is a call to ftrace_addr. */ - if (memcmp(&ins[1], &nop[1], MCOUNT_INSN_SIZE - 1) != 0) { + if (memcmp(&ins[1], &nop[1], size - 1) != 0) { /* * For extra paranoidism, we check if the breakpoint is on * a call that would actually jump to the ftrace_addr. @@ -409,18 +462,18 @@ static int remove_breakpoint(struct dyn_ftrace *rec) * a disaster. */ ftrace_addr = ftrace_get_addr_new(rec); - nop = ftrace_call_replace(ip, ftrace_addr); + nop = ftrace_call_replace(ip, ftrace_addr, size); - if (memcmp(&ins[1], &nop[1], MCOUNT_INSN_SIZE - 1) == 0) + if (memcmp(&ins[1], &nop[1], size - 1) == 0) goto update; /* Check both ftrace_addr and ftrace_old_addr */ ftrace_addr = ftrace_get_addr_curr(rec); - nop = ftrace_call_replace(ip, ftrace_addr); + nop = ftrace_call_replace(ip, ftrace_addr, size); ftrace_expected = nop; - if (memcmp(&ins[1], &nop[1], MCOUNT_INSN_SIZE - 1) != 0) + if (memcmp(&ins[1], &nop[1], size - 1) != 0) return -EINVAL; } @@ -428,30 +481,33 @@ static int remove_breakpoint(struct dyn_ftrace *rec) return ftrace_write(ip, nop, 1); } -static int add_update_code(unsigned long ip, unsigned const char *new) +static int add_update_code(unsigned long ip, unsigned const char *new, + unsigned int size) { /* skip breakpoint */ ip++; new++; - return ftrace_write(ip, new, MCOUNT_INSN_SIZE - 1); + return ftrace_write(ip, new, size - 1); } static int add_update_call(struct dyn_ftrace *rec, unsigned long addr) { unsigned long ip = rec->ip; + unsigned int size = MCOUNT_INSN_SIZE; unsigned const char *new; - new = ftrace_call_replace(ip, addr); - return add_update_code(ip, new); + new = ftrace_call_replace(ip, addr, size); + return add_update_code(ip, new, size); } static int add_update_nop(struct dyn_ftrace *rec) { unsigned long ip = rec->ip; + unsigned int size = MCOUNT_INSN_SIZE; unsigned const char *new; - new = ftrace_nop_replace(); - return add_update_code(ip, new); + new = ftrace_nop_replace(size); + return add_update_code(ip, new, size); } static int add_update(struct dyn_ftrace *rec, int enable) @@ -485,7 +541,7 @@ static int finish_update_call(struct dyn_ftrace *rec, unsigned long addr) unsigned long ip = rec->ip; unsigned const char *new; - new = ftrace_call_replace(ip, addr); + new = ftrace_call_replace(ip, addr, MCOUNT_INSN_SIZE); return ftrace_write(ip, new, 1); } @@ -495,7 +551,7 @@ static int finish_update_nop(struct dyn_ftrace *rec) unsigned long ip = rec->ip; unsigned const char *new; - new = ftrace_nop_replace(); + new = ftrace_nop_replace(MCOUNT_INSN_SIZE); return ftrace_write(ip, new, 1); } @@ -619,13 +675,13 @@ ftrace_modify_code(unsigned long ip, unsigned const char *old_code, { int ret; - ret = add_break(ip, old_code); + ret = add_break(ip, old_code, MCOUNT_RELINSN_SIZE); if (ret) goto out; run_sync(); - ret = add_update_code(ip, new_code); + ret = add_update_code(ip, new_code, MCOUNT_RELINSN_SIZE); if (ret) goto fail_update; @@ -670,7 +726,7 @@ static unsigned char *ftrace_jmp_replace(unsigned long ip, unsigned long addr) /* Jmp not a call (ignore the .e8) */ calc.e8 = 0xe9; - calc.offset = ftrace_calc_offset(ip + MCOUNT_INSN_SIZE, addr); + calc.offset = ftrace_calc_offset(ip + MCOUNT_RELINSN_SIZE, addr); /* * ftrace external locks synchronize the access to the static variable. @@ -766,11 +822,11 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size) * the jmp to ftrace_epilogue, as well as the address of * the ftrace_ops this trampoline is used for. */ - trampoline = alloc_tramp(size + MCOUNT_INSN_SIZE + sizeof(void *)); + trampoline = alloc_tramp(size + MCOUNT_RELINSN_SIZE + sizeof(void *)); if (!trampoline) return 0; - *tramp_size = size + MCOUNT_INSN_SIZE + sizeof(void *); + *tramp_size = size + MCOUNT_RELINSN_SIZE + sizeof(void *); /* Copy ftrace_caller onto the trampoline memory */ ret = probe_kernel_read(trampoline, (void *)start_offset, size); @@ -783,7 +839,7 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size) /* The trampoline ends with a jmp to ftrace_epilogue */ jmp = ftrace_jmp_replace(ip, (unsigned long)ftrace_epilogue); - memcpy(trampoline + size, jmp, MCOUNT_INSN_SIZE); + memcpy(trampoline + size, jmp, MCOUNT_RELINSN_SIZE); /* * The address of the ftrace_ops that is used for this trampoline @@ -793,7 +849,7 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size) * the global function_trace_op variable. */ - ptr = (unsigned long *)(trampoline + size + MCOUNT_INSN_SIZE); + ptr = (unsigned long *)(trampoline + size + MCOUNT_RELINSN_SIZE); *ptr = (unsigned long)ops; op_offset -= start_offset; @@ -868,7 +924,7 @@ void arch_ftrace_update_trampoline(struct ftrace_ops *ops) func = ftrace_ops_get_func(ops); /* Do a safe modify in case the trampoline is executing */ - new = ftrace_call_replace(ip, (unsigned long)func); + new = ftrace_call_replace(ip, (unsigned long)func, MCOUNT_RELINSN_SIZE); ret = update_ftrace_func(ip, new); set_memory_ro(ops->trampoline, npages); @@ -882,7 +938,7 @@ static void *addr_from_call(void *ptr) union ftrace_code_union calc; int ret; - ret = probe_kernel_read(&calc, ptr, MCOUNT_INSN_SIZE); + ret = probe_kernel_read(&calc, ptr, MCOUNT_RELINSN_SIZE); if (WARN_ON_ONCE(ret < 0)) return NULL; @@ -892,7 +948,7 @@ static void *addr_from_call(void *ptr) return NULL; } - return ptr + MCOUNT_INSN_SIZE + calc.offset; + return ptr + MCOUNT_RELINSN_SIZE + calc.offset; } void prepare_ftrace_return(unsigned long self_addr, unsigned long *parent, diff --git a/arch/x86/kernel/module.lds b/arch/x86/kernel/module.lds new file mode 100644 index 000000000000..fd6e95a4b454 --- /dev/null +++ b/arch/x86/kernel/module.lds @@ -0,0 +1,3 @@ +SECTIONS { + .got (NOLOAD) : { BYTE(0) } +} -- 2.14.2.920.gcf0c67979c-goog