From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Garnier Subject: [PATCH v3 23/27] x86/modules: Adapt module loading for PIE support Date: Wed, 23 May 2018 12:54:17 -0700 Message-ID: <20180523195421.180248-24-thgarnie@google.com> References: <20180523195421.180248-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 , Greg Kroah-Hartman , Thomas Garnier , Philippe Ombredanne , Kate Stewart , Arnaldo Carvalho de Melo , Yonghong Song , Andrey Ryabinin , Kees Cook , Tom Lendacky , "Kirill A . Shutemov" , Andy Lutomirski , Dominik Brodowski , Borislav Petkov , Borislav Petkov , "Rafael J . Wysocki" , Len Return-path: In-Reply-To: <20180523195421.180248-1-thgarnie@google.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" List-Id: linux-crypto.vger.kernel.org QWRhcHQgbW9kdWxlIGxvYWRpbmcgdG8gc3VwcG9ydCBQSUUgcmVsb2NhdGlvbnMuIEdlbmVyYXRl IGR5bmFtaWMgR09UIGlmCmEgc3ltYm9sIHJlcXVpcmVzIGl0IGJ1dCBubyBlbnRyeSBleGlzdCBp biB0aGUga2VybmVsIEdPVC4KClBvc2l0aW9uIEluZGVwZW5kZW50IEV4ZWN1dGFibGUgKFBJRSkg c3VwcG9ydCB3aWxsIGFsbG93IHRvIGV4dGVuZGVkIHRoZQpLQVNMUiByYW5kb21pemF0aW9uIHJh bmdlIGJlbG93IHRoZSAtMkcgbWVtb3J5IGxpbWl0LgoKU2lnbmVkLW9mZi1ieTogVGhvbWFzIEdh cm5pZXIgPHRoZ2FybmllQGdvb2dsZS5jb20+Ci0tLQogYXJjaC94ODYvTWFrZWZpbGUgICAgICAg ICAgICAgICB8ICAgNCArCiBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9tb2R1bGUuaCAgIHwgIDExICsr CiBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIHwgICA0ICsKIGFyY2gveDg2L2tlcm5l bC9tb2R1bGUuYyAgICAgICAgfCAxODEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0K IGFyY2gveDg2L2tlcm5lbC9tb2R1bGUubGRzICAgICAgfCAgIDMgKwogNSBmaWxlcyBjaGFuZ2Vk LCAxOTggaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBh cmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmxkcwoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L01ha2VmaWxl IGIvYXJjaC94ODYvTWFrZWZpbGUKaW5kZXggMjc3ZmZjNTdhZTEzLi4yMGJiNmNiZDg5MzggMTAw NjQ0Ci0tLSBhL2FyY2gveDg2L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L01ha2VmaWxlCkBAIC0x MzQsNyArMTM0LDExIEBAIGVsc2UKICAgICAgICAgS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15 KQogCiAgICAgICAgIEtCVUlMRF9DRkxBR1MgKz0gLW1uby1yZWQtem9uZQoraWZkZWYgQ09ORklH X1g4Nl9QSUUKKyAgICAgICAgS0JVSUxEX0xERkxBR1NfTU9EVUxFICs9IC1UICQoc3JjdHJlZSkv YXJjaC94ODYva2VybmVsL21vZHVsZS5sZHMKK2Vsc2UKICAgICAgICAgS0JVSUxEX0NGTEFHUyAr PSAtbWNtb2RlbD1rZXJuZWwKK2VuZGlmCiAKICAgICAgICAgIyAtZnVuaXQtYXQtYS10aW1lIHNo cmlua3MgdGhlIGtlcm5lbCAudGV4dCBjb25zaWRlcmFibHkKICAgICAgICAgIyB1bmZvcnR1bmF0 ZWx5IGl0IG1ha2VzIHJlYWRpbmcgb29wc2VzIGhhcmRlci4KZGlmZiAtLWdpdCBhL2FyY2gveDg2 L2luY2x1ZGUvYXNtL21vZHVsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5k ZXggNzk0OGExN2ZlYmI0Li42OGZmMDVlMTQyODggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1 ZGUvYXNtL21vZHVsZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC01 LDEyICs1LDIzIEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW9kdWxlLmg+CiAjaW5jbHVkZSA8 YXNtL29yY190eXBlcy5oPgogCisjaWZkZWYgQ09ORklHX1g4Nl9QSUUKK3N0cnVjdCBtb2RfZ290 X3NlYyB7CisJc3RydWN0IGVsZjY0X3NoZHIJKmdvdDsKKwlpbnQJCQlnb3RfbnVtX2VudHJpZXM7 CisJaW50CQkJZ290X21heF9lbnRyaWVzOworfTsKKyNlbmRpZgorCiBzdHJ1Y3QgbW9kX2FyY2hf c3BlY2lmaWMgewogI2lmZGVmIENPTkZJR19VTldJTkRFUl9PUkMKIAl1bnNpZ25lZCBpbnQgbnVt X29yY3M7CiAJaW50ICpvcmNfdW53aW5kX2lwOwogCXN0cnVjdCBvcmNfZW50cnkgKm9yY191bndp bmQ7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2X1BJRQorCXN0cnVjdCBtb2RfZ290X3NlYwlj b3JlOworI2VuZGlmCiB9OwogCiAjaWZkZWYgQ09ORklHX1g4Nl82NApkaWZmIC0tZ2l0IGEvYXJj aC94ODYvaW5jbHVkZS9hc20vc2VjdGlvbnMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NlY3Rp b25zLmgKaW5kZXggZGEzZDk4YmIyYmNiLi44OWIzYTk1YzhkMTEgMTAwNjQ0Ci0tLSBhL2FyY2gv eDg2L2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2Vj dGlvbnMuaApAQCAtMTcsNCArMTcsOCBAQCBleHRlcm4gY2hhciBfX2VudHJ5X3RyYW1wb2xpbmVf c3RhcnRbXSwgX19lbnRyeV90cmFtcG9saW5lX2VuZFtdOwogZXh0ZXJuIGNoYXIgX19zdGFydF9n b3RbXSwgX19lbmRfZ290W107CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9QSUUp CitleHRlcm4gY2hhciBfX3N0YXJ0X2dvdFtdLCBfX2VuZF9nb3RbXTsKKyNlbmRpZgorCiAjZW5k aWYJLyogX0FTTV9YODZfU0VDVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVs L21vZHVsZS5jIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCmluZGV4IGY1ODMzNmFmMDk1Yy4u ODg4OTVmM2Q0NzRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMKKysrIGIv YXJjaC94ODYva2VybmVsL21vZHVsZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGlu dXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogI2luY2x1ZGUgPGxpbnV4 L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS90ZXh0 LXBhdGNoaW5nLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTc3LDYgKzc4LDE3MyBAQCBz dGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgZ2V0X21vZHVsZV9sb2FkX29mZnNldCh2b2lkKQogfQog I2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfWDg2X1BJRQorc3RhdGljIHU2NCBmaW5kX2dvdF9rZXJu ZWxfZW50cnkoRWxmNjRfU3ltICpzeW0sIGNvbnN0IEVsZjY0X1JlbGEgKnJlbGEpCit7CisJdTY0 ICpwb3M7CisKKwlmb3IgKHBvcyA9ICh1NjQqKV9fc3RhcnRfZ290OyBwb3MgPCAodTY0KilfX2Vu ZF9nb3Q7IHBvcysrKSB7CisJCWlmICgqcG9zID09IHN5bS0+c3RfdmFsdWUpCisJCQlyZXR1cm4g KHU2NClwb3MgKyByZWxhLT5yX2FkZGVuZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IHU2NCBtb2R1bGVfZW1pdF9nb3RfZW50cnkoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICpsb2Ms CisJCQkJIGNvbnN0IEVsZjY0X1JlbGEgKnJlbGEsIEVsZjY0X1N5bSAqc3ltKQoreworCXN0cnVj dCBtb2RfZ290X3NlYyAqZ290c2VjID0gJm1vZC0+YXJjaC5jb3JlOworCXU2NCAqZ290ID0gKHU2 NCopZ290c2VjLT5nb3QtPnNoX2FkZHI7CisJaW50IGkgPSBnb3RzZWMtPmdvdF9udW1fZW50cmll czsKKwl1NjQgcmV0OworCisJLyogQ2hlY2sgaWYgd2UgY2FuIHVzZSB0aGUga2VybmVsIEdPVCAq LworCXJldCA9IGZpbmRfZ290X2tlcm5lbF9lbnRyeShzeW0sIHJlbGEpOworCWlmIChyZXQpCisJ CXJldHVybiByZXQ7CisKKwlnb3RbaV0gPSBzeW0tPnN0X3ZhbHVlOworCisJLyoKKwkgKiBDaGVj ayBpZiB0aGUgZW50cnkgd2UganVzdCBjcmVhdGVkIGlzIGEgZHVwbGljYXRlLiBHaXZlbiB0aGF0 IHRoZQorCSAqIHJlbG9jYXRpb25zIGFyZSBzb3J0ZWQsIHRoaXMgd2lsbCBiZSB0aGUgbGFzdCBl bnRyeSB3ZSBhbGxvY2F0ZWQuCisJICogKGlmIG9uZSBleGlzdHMpLgorCSAqLworCWlmIChpID4g MCAmJiBnb3RbaV0gPT0gZ290W2kgLSAyXSkgeworCQlyZXQgPSAodTY0KSZnb3RbaSAtIDFdOwor CX0gZWxzZSB7CisJCWdvdHNlYy0+Z290X251bV9lbnRyaWVzKys7CisJCUJVR19PTihnb3RzZWMt PmdvdF9udW1fZW50cmllcyA+IGdvdHNlYy0+Z290X21heF9lbnRyaWVzKTsKKwkJcmV0ID0gKHU2 NCkmZ290W2ldOworCX0KKworCXJldHVybiByZXQgKyByZWxhLT5yX2FkZGVuZDsKK30KKworI2Rl ZmluZSBjbXBfM3dheShhLGIpCSgoYSkgPCAoYikgPyAtMSA6IChhKSA+IChiKSkKKworc3RhdGlj IGludCBjbXBfcmVsYShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IEVs ZjY0X1JlbGEgKnggPSBhLCAqeSA9IGI7CisJaW50IGk7CisKKwkvKiBzb3J0IGJ5IHR5cGUsIHN5 bWJvbCBpbmRleCBhbmQgYWRkZW5kICovCisJaSA9IGNtcF8zd2F5KEVMRjY0X1JfVFlQRSh4LT5y X2luZm8pLCBFTEY2NF9SX1RZUEUoeS0+cl9pbmZvKSk7CisJaWYgKGkgPT0gMCkKKwkJaSA9IGNt cF8zd2F5KEVMRjY0X1JfU1lNKHgtPnJfaW5mbyksIEVMRjY0X1JfU1lNKHktPnJfaW5mbykpOwor CWlmIChpID09IDApCisJCWkgPSBjbXBfM3dheSh4LT5yX2FkZGVuZCwgeS0+cl9hZGRlbmQpOwor CXJldHVybiBpOworfQorCitzdGF0aWMgYm9vbCBkdXBsaWNhdGVfcmVsKGNvbnN0IEVsZjY0X1Jl bGEgKnJlbGEsIGludCBudW0pCit7CisJLyoKKwkgKiBFbnRyaWVzIGFyZSBzb3J0ZWQgYnkgdHlw ZSwgc3ltYm9sIGluZGV4IGFuZCBhZGRlbmQuIFRoYXQgbWVhbnMKKwkgKiB0aGF0LCBpZiBhIGR1 cGxpY2F0ZSBlbnRyeSBleGlzdHMsIGl0IG11c3QgYmUgaW4gdGhlIHByZWNlZGluZworCSAqIHNs b3QuCisJICovCisJcmV0dXJuIG51bSA+IDAgJiYgY21wX3JlbGEocmVsYSArIG51bSwgcmVsYSAr IG51bSAtIDEpID09IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY291bnRfZ290cyhFbGY2 NF9TeW0gKnN5bXMsIEVsZjY0X1JlbGEgKnJlbGEsIGludCBudW0pCit7CisJdW5zaWduZWQgaW50 IHJldCA9IDA7CisJRWxmNjRfU3ltICpzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51 bTsgaSsrKSB7CisJCXN3aXRjaCAoRUxGNjRfUl9UWVBFKHJlbGFbaV0ucl9pbmZvKSkgeworCQlj YXNlIFJfWDg2XzY0X0dPVFBDUkVMOgorCQkJcyA9IHN5bXMgKyBFTEY2NF9SX1NZTShyZWxhW2ld LnJfaW5mbyk7CisKKwkJCS8qCisJCQkgKiBVc2UgdGhlIGtlcm5lbCBHT1Qgd2hlbiBwb3NzaWJs ZSwgZWxzZSByZXNlcnZlIGEKKwkJCSAqIGN1c3RvbSBvbmUgZm9yIHRoaXMgbW9kdWxlLgorCQkJ ICovCisJCQlpZiAoIWR1cGxpY2F0ZV9yZWwocmVsYSwgaSkgJiYKKwkJCSAgICAhZmluZF9nb3Rf a2VybmVsX2VudHJ5KHMsIHJlbGEgKyBpKSkKKwkJCQlyZXQrKzsKKwkJCWJyZWFrOworCQl9CisJ fQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBHT1QgZW50cmllcyBmb3IgR09U UENSRUwgcmVsb2NhdGlvbnMgdGhhdCBkbyBub3QgZXhpc3RzIGluIHRoZQorICoga2VybmVsIEdP VC4gQmFzZWQgb24gYXJtNjQgbW9kdWxlLXBsdHMgaW1wbGVtZW50YXRpb24uCisgKi8KK2ludCBt b2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICplaGRyLCBFbGZfU2hkciAqc2VjaGRy cywKKwkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwl1 bnNpZ25lZCBsb25nIGdvdHMgPSAwOworCUVsZl9TaGRyICpzeW10YWIgPSBOVUxMOworCUVsZjY0 X1N5bSAqc3ltcyA9IE5VTEw7CisJY2hhciAqc3RyaW5ncywgKm5hbWU7CisJaW50IGk7CisKKwkv KgorCSAqIEZpbmQgdGhlIGVtcHR5IC5nb3Qgc2VjdGlvbiBzbyB3ZSBjYW4gZXhwYW5kIGl0IHRv IHN0b3JlIHRoZSBQTFQKKwkgKiBlbnRyaWVzLiBSZWNvcmQgdGhlIHN5bXRhYiBhZGRyZXNzIGFz IHdlbGwuCisJICovCisJZm9yIChpID0gMDsgaSA8IGVoZHItPmVfc2hudW07IGkrKykgeworCQlp ZiAoIXN0cmNtcChzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLCAiLmdvdCIpKSB7CisJ CQltb2QtPmFyY2guY29yZS5nb3QgPSBzZWNoZHJzICsgaTsKKwkJfSBlbHNlIGlmIChzZWNoZHJz W2ldLnNoX3R5cGUgPT0gU0hUX1NZTVRBQikgeworCQkJc3ltdGFiID0gc2VjaGRycyArIGk7CisJ CQlzeW1zID0gKEVsZjY0X1N5bSAqKXN5bXRhYi0+c2hfYWRkcjsKKwkJfQorCX0KKworCWlmICgh bW9kLT5hcmNoLmNvcmUuZ290KSB7CisJCXByX2VycigiJXM6IG1vZHVsZSBHT1Qgc2VjdGlvbiBt aXNzaW5nXG4iLCBtb2QtPm5hbWUpOworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCWlmICghc3lt cykgeworCQlwcl9lcnIoIiVzOiBtb2R1bGUgc3ltdGFiIHNlY3Rpb24gbWlzc2luZ1xuIiwgbW9k LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlaGRy LT5lX3NobnVtOyBpKyspIHsKKwkJRWxmNjRfUmVsYSAqcmVscyA9ICh2b2lkICopZWhkciArIHNl Y2hkcnNbaV0uc2hfb2Zmc2V0OworCQlpbnQgbnVtcmVscyA9IHNlY2hkcnNbaV0uc2hfc2l6ZSAv IHNpemVvZihFbGY2NF9SZWxhKTsKKworCQlpZiAoc2VjaGRyc1tpXS5zaF90eXBlICE9IFNIVF9S RUxBKQorCQkJY29udGludWU7CisKKwkJLyogc29ydCBieSB0eXBlLCBzeW1ib2wgaW5kZXggYW5k IGFkZGVuZCAqLworCQlzb3J0KHJlbHMsIG51bXJlbHMsIHNpemVvZihFbGY2NF9SZWxhKSwgY21w X3JlbGEsIE5VTEwpOworCisJCWdvdHMgKz0gY291bnRfZ290cyhzeW1zLCByZWxzLCBudW1yZWxz KTsKKwl9CisKKwltb2QtPmFyY2guY29yZS5nb3QtPnNoX3R5cGUgPSBTSFRfTk9CSVRTOworCW1v ZC0+YXJjaC5jb3JlLmdvdC0+c2hfZmxhZ3MgPSBTSEZfQUxMT0M7CisJbW9kLT5hcmNoLmNvcmUu Z290LT5zaF9hZGRyYWxpZ24gPSBMMV9DQUNIRV9CWVRFUzsKKwltb2QtPmFyY2guY29yZS5nb3Qt PnNoX3NpemUgPSAoZ290cyArIDEpICogc2l6ZW9mKHU2NCk7CisJbW9kLT5hcmNoLmNvcmUuZ290 X251bV9lbnRyaWVzID0gMDsKKwltb2QtPmFyY2guY29yZS5nb3RfbWF4X2VudHJpZXMgPSBnb3Rz OworCisJLyoKKwkgKiBJZiBhIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgZXhpc3RzLCBt YWtlIGl0IGFic29sdXRlIGZvcgorCSAqIG1vZHVsZXMgdG8gY29ycmVjdGx5IHJlZmVyZW5jZSBp dC4gU2ltaWxhciB0byBzMzkwIGltcGxlbWVudGF0aW9uLgorCSAqLworCXN0cmluZ3MgPSAodm9p ZCAqKSBlaGRyICsgc2VjaGRyc1tzeW10YWItPnNoX2xpbmtdLnNoX29mZnNldDsKKwlmb3IgKGkg PSAwOyBpIDwgc3ltdGFiLT5zaF9zaXplL3NpemVvZihFbGZfU3ltKTsgaSsrKSB7CisJCWlmIChz eW1zW2ldLnN0X3NobmR4ICE9IFNITl9VTkRFRikKKwkJCWNvbnRpbnVlOworCQluYW1lID0gc3Ry aW5ncyArIHN5bXNbaV0uc3RfbmFtZTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgIl9HTE9CQUxfT0ZG U0VUX1RBQkxFXyIpKSB7CisJCQlzeW1zW2ldLnN0X3NobmR4ID0gU0hOX0FCUzsKKwkJCWJyZWFr OworCQl9CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKIHZvaWQgKm1vZHVsZV9hbGxvYyh1 bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdm9pZCAqcDsKQEAgLTE5MCwxNiArMzU4LDIwIEBAIGlu dCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmNjRfU2hkciAqc2VjaGRycywKIAkJCWlmICgoczY0KXZh bCAhPSAqKHMzMiAqKWxvYykKIAkJCQlnb3RvIG92ZXJmbG93OwogCQkJYnJlYWs7CisjaWZkZWYg Q09ORklHX1g4Nl9QSUUKKwkJY2FzZSBSX1g4Nl82NF9HT1RQQ1JFTDoKKwkJCXZhbCA9IG1vZHVs ZV9lbWl0X2dvdF9lbnRyeShtZSwgbG9jLCByZWwgKyBpLCBzeW0pOworCQkJLyogZmFsbHRocm91 Z2ggKi8KKyNlbmRpZgogCQljYXNlIFJfWDg2XzY0X1BDMzI6CiAJCWNhc2UgUl9YODZfNjRfUExU MzI6CiAJCQlpZiAoKih1MzIgKilsb2MgIT0gMCkKIAkJCQlnb3RvIGludmFsaWRfcmVsb2NhdGlv bjsKIAkJCXZhbCAtPSAodTY0KWxvYzsKIAkJCSoodTMyICopbG9jID0gdmFsOwotI2lmIDAKLQkJ CWlmICgoczY0KXZhbCAhPSAqKHMzMiAqKWxvYykKKwkJCWlmIChJU19FTkFCTEVEKENPTkZJR19Y ODZfUElFKSAmJgorCQkJICAgIChzNjQpdmFsICE9ICooczMyICopbG9jKQogCQkJCWdvdG8gb3Zl cmZsb3c7Ci0jZW5kaWYKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJfZXJyKCIlczogVW5r bm93biByZWxhIHJlbG9jYXRpb246ICVsbHVcbiIsCkBAIC0yMTcsOCArMzg5LDcgQEAgaW50IGFw cGx5X3JlbG9jYXRlX2FkZChFbGY2NF9TaGRyICpzZWNoZHJzLAogb3ZlcmZsb3c6CiAJcHJfZXJy KCJvdmVyZmxvdyBpbiByZWxvY2F0aW9uIHR5cGUgJWQgdmFsICVMeFxuIiwKIAkgICAgICAgKGlu dClFTEY2NF9SX1RZUEUocmVsW2ldLnJfaW5mbyksIHZhbCk7Ci0JcHJfZXJyKCJgJXMnIGxpa2Vs eSBub3QgY29tcGlsZWQgd2l0aCAtbWNtb2RlbD1rZXJuZWxcbiIsCi0JICAgICAgIG1lLT5uYW1l KTsKKwlwcl9lcnIoImAlcycgbGlrZWx5IHRvbyBmYXIgZnJvbSB0aGUga2VybmVsXG4iLCBtZS0+ bmFtZSk7CiAJcmV0dXJuIC1FTk9FWEVDOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4 Ni9rZXJuZWwvbW9kdWxlLmxkcyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUubGRzCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZmQ2ZTk1YTRiNDU0Ci0tLSAvZGV2L251 bGwKKysrIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5sZHMKQEAgLTAsMCArMSwzIEBACitTRUNU SU9OUyB7CisJLmdvdCAoTk9MT0FEKSA6IHsgQllURSgwKSB9Cit9Ci0tIAoyLjE3LjAuNDQxLmdi NDZmZTYwZTFkLWdvb2cKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0 Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRl dmVs From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Garnier Subject: [PATCH v3 23/27] x86/modules: Adapt module loading for PIE support Date: Wed, 23 May 2018 12:54:17 -0700 Message-ID: <20180523195421.180248-24-thgarnie@google.com> References: <20180523195421.180248-1-thgarnie@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180523195421.180248-1-thgarnie@google.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Herbert Xu , "David S . Miller" , Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , Peter Zijlstra , Josh Poimboeuf , Greg Kroah-Hartman , Thomas Garnier , Philippe Ombredanne , Kate Stewart , Arnaldo Carvalho de Melo , Yonghong Song , Andrey Ryabinin , Kees Cook , Tom Lendacky , "Kirill A . Shutemov" , Andy Lutomirski , Dominik Brodowski , Borislav Petkov , Borislav Petkov , "Rafael J . Wysocki" Len 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 QWRhcHQgbW9kdWxlIGxvYWRpbmcgdG8gc3VwcG9ydCBQSUUgcmVsb2NhdGlvbnMuIEdlbmVyYXRl IGR5bmFtaWMgR09UIGlmCmEgc3ltYm9sIHJlcXVpcmVzIGl0IGJ1dCBubyBlbnRyeSBleGlzdCBp biB0aGUga2VybmVsIEdPVC4KClBvc2l0aW9uIEluZGVwZW5kZW50IEV4ZWN1dGFibGUgKFBJRSkg c3VwcG9ydCB3aWxsIGFsbG93IHRvIGV4dGVuZGVkIHRoZQpLQVNMUiByYW5kb21pemF0aW9uIHJh bmdlIGJlbG93IHRoZSAtMkcgbWVtb3J5IGxpbWl0LgoKU2lnbmVkLW9mZi1ieTogVGhvbWFzIEdh cm5pZXIgPHRoZ2FybmllQGdvb2dsZS5jb20+Ci0tLQogYXJjaC94ODYvTWFrZWZpbGUgICAgICAg ICAgICAgICB8ICAgNCArCiBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9tb2R1bGUuaCAgIHwgIDExICsr CiBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIHwgICA0ICsKIGFyY2gveDg2L2tlcm5l bC9tb2R1bGUuYyAgICAgICAgfCAxODEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0K IGFyY2gveDg2L2tlcm5lbC9tb2R1bGUubGRzICAgICAgfCAgIDMgKwogNSBmaWxlcyBjaGFuZ2Vk LCAxOTggaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBh cmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmxkcwoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L01ha2VmaWxl IGIvYXJjaC94ODYvTWFrZWZpbGUKaW5kZXggMjc3ZmZjNTdhZTEzLi4yMGJiNmNiZDg5MzggMTAw NjQ0Ci0tLSBhL2FyY2gveDg2L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L01ha2VmaWxlCkBAIC0x MzQsNyArMTM0LDExIEBAIGVsc2UKICAgICAgICAgS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15 KQogCiAgICAgICAgIEtCVUlMRF9DRkxBR1MgKz0gLW1uby1yZWQtem9uZQoraWZkZWYgQ09ORklH X1g4Nl9QSUUKKyAgICAgICAgS0JVSUxEX0xERkxBR1NfTU9EVUxFICs9IC1UICQoc3JjdHJlZSkv YXJjaC94ODYva2VybmVsL21vZHVsZS5sZHMKK2Vsc2UKICAgICAgICAgS0JVSUxEX0NGTEFHUyAr PSAtbWNtb2RlbD1rZXJuZWwKK2VuZGlmCiAKICAgICAgICAgIyAtZnVuaXQtYXQtYS10aW1lIHNo cmlua3MgdGhlIGtlcm5lbCAudGV4dCBjb25zaWRlcmFibHkKICAgICAgICAgIyB1bmZvcnR1bmF0 ZWx5IGl0IG1ha2VzIHJlYWRpbmcgb29wc2VzIGhhcmRlci4KZGlmZiAtLWdpdCBhL2FyY2gveDg2 L2luY2x1ZGUvYXNtL21vZHVsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5k ZXggNzk0OGExN2ZlYmI0Li42OGZmMDVlMTQyODggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1 ZGUvYXNtL21vZHVsZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC01 LDEyICs1LDIzIEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW9kdWxlLmg+CiAjaW5jbHVkZSA8 YXNtL29yY190eXBlcy5oPgogCisjaWZkZWYgQ09ORklHX1g4Nl9QSUUKK3N0cnVjdCBtb2RfZ290 X3NlYyB7CisJc3RydWN0IGVsZjY0X3NoZHIJKmdvdDsKKwlpbnQJCQlnb3RfbnVtX2VudHJpZXM7 CisJaW50CQkJZ290X21heF9lbnRyaWVzOworfTsKKyNlbmRpZgorCiBzdHJ1Y3QgbW9kX2FyY2hf c3BlY2lmaWMgewogI2lmZGVmIENPTkZJR19VTldJTkRFUl9PUkMKIAl1bnNpZ25lZCBpbnQgbnVt X29yY3M7CiAJaW50ICpvcmNfdW53aW5kX2lwOwogCXN0cnVjdCBvcmNfZW50cnkgKm9yY191bndp bmQ7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2X1BJRQorCXN0cnVjdCBtb2RfZ290X3NlYwlj b3JlOworI2VuZGlmCiB9OwogCiAjaWZkZWYgQ09ORklHX1g4Nl82NApkaWZmIC0tZ2l0IGEvYXJj aC94ODYvaW5jbHVkZS9hc20vc2VjdGlvbnMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NlY3Rp b25zLmgKaW5kZXggZGEzZDk4YmIyYmNiLi44OWIzYTk1YzhkMTEgMTAwNjQ0Ci0tLSBhL2FyY2gv eDg2L2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2Vj dGlvbnMuaApAQCAtMTcsNCArMTcsOCBAQCBleHRlcm4gY2hhciBfX2VudHJ5X3RyYW1wb2xpbmVf c3RhcnRbXSwgX19lbnRyeV90cmFtcG9saW5lX2VuZFtdOwogZXh0ZXJuIGNoYXIgX19zdGFydF9n b3RbXSwgX19lbmRfZ290W107CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9QSUUp CitleHRlcm4gY2hhciBfX3N0YXJ0X2dvdFtdLCBfX2VuZF9nb3RbXTsKKyNlbmRpZgorCiAjZW5k aWYJLyogX0FTTV9YODZfU0VDVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVs L21vZHVsZS5jIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCmluZGV4IGY1ODMzNmFmMDk1Yy4u ODg4OTVmM2Q0NzRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMKKysrIGIv YXJjaC94ODYva2VybmVsL21vZHVsZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGlu dXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogI2luY2x1ZGUgPGxpbnV4 L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS90ZXh0 LXBhdGNoaW5nLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTc3LDYgKzc4LDE3MyBAQCBz dGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgZ2V0X21vZHVsZV9sb2FkX29mZnNldCh2b2lkKQogfQog I2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfWDg2X1BJRQorc3RhdGljIHU2NCBmaW5kX2dvdF9rZXJu ZWxfZW50cnkoRWxmNjRfU3ltICpzeW0sIGNvbnN0IEVsZjY0X1JlbGEgKnJlbGEpCit7CisJdTY0 ICpwb3M7CisKKwlmb3IgKHBvcyA9ICh1NjQqKV9fc3RhcnRfZ290OyBwb3MgPCAodTY0KilfX2Vu ZF9nb3Q7IHBvcysrKSB7CisJCWlmICgqcG9zID09IHN5bS0+c3RfdmFsdWUpCisJCQlyZXR1cm4g KHU2NClwb3MgKyByZWxhLT5yX2FkZGVuZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IHU2NCBtb2R1bGVfZW1pdF9nb3RfZW50cnkoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICpsb2Ms CisJCQkJIGNvbnN0IEVsZjY0X1JlbGEgKnJlbGEsIEVsZjY0X1N5bSAqc3ltKQoreworCXN0cnVj dCBtb2RfZ290X3NlYyAqZ290c2VjID0gJm1vZC0+YXJjaC5jb3JlOworCXU2NCAqZ290ID0gKHU2 NCopZ290c2VjLT5nb3QtPnNoX2FkZHI7CisJaW50IGkgPSBnb3RzZWMtPmdvdF9udW1fZW50cmll czsKKwl1NjQgcmV0OworCisJLyogQ2hlY2sgaWYgd2UgY2FuIHVzZSB0aGUga2VybmVsIEdPVCAq LworCXJldCA9IGZpbmRfZ290X2tlcm5lbF9lbnRyeShzeW0sIHJlbGEpOworCWlmIChyZXQpCisJ CXJldHVybiByZXQ7CisKKwlnb3RbaV0gPSBzeW0tPnN0X3ZhbHVlOworCisJLyoKKwkgKiBDaGVj ayBpZiB0aGUgZW50cnkgd2UganVzdCBjcmVhdGVkIGlzIGEgZHVwbGljYXRlLiBHaXZlbiB0aGF0 IHRoZQorCSAqIHJlbG9jYXRpb25zIGFyZSBzb3J0ZWQsIHRoaXMgd2lsbCBiZSB0aGUgbGFzdCBl bnRyeSB3ZSBhbGxvY2F0ZWQuCisJICogKGlmIG9uZSBleGlzdHMpLgorCSAqLworCWlmIChpID4g MCAmJiBnb3RbaV0gPT0gZ290W2kgLSAyXSkgeworCQlyZXQgPSAodTY0KSZnb3RbaSAtIDFdOwor CX0gZWxzZSB7CisJCWdvdHNlYy0+Z290X251bV9lbnRyaWVzKys7CisJCUJVR19PTihnb3RzZWMt PmdvdF9udW1fZW50cmllcyA+IGdvdHNlYy0+Z290X21heF9lbnRyaWVzKTsKKwkJcmV0ID0gKHU2 NCkmZ290W2ldOworCX0KKworCXJldHVybiByZXQgKyByZWxhLT5yX2FkZGVuZDsKK30KKworI2Rl ZmluZSBjbXBfM3dheShhLGIpCSgoYSkgPCAoYikgPyAtMSA6IChhKSA+IChiKSkKKworc3RhdGlj IGludCBjbXBfcmVsYShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IEVs ZjY0X1JlbGEgKnggPSBhLCAqeSA9IGI7CisJaW50IGk7CisKKwkvKiBzb3J0IGJ5IHR5cGUsIHN5 bWJvbCBpbmRleCBhbmQgYWRkZW5kICovCisJaSA9IGNtcF8zd2F5KEVMRjY0X1JfVFlQRSh4LT5y X2luZm8pLCBFTEY2NF9SX1RZUEUoeS0+cl9pbmZvKSk7CisJaWYgKGkgPT0gMCkKKwkJaSA9IGNt cF8zd2F5KEVMRjY0X1JfU1lNKHgtPnJfaW5mbyksIEVMRjY0X1JfU1lNKHktPnJfaW5mbykpOwor CWlmIChpID09IDApCisJCWkgPSBjbXBfM3dheSh4LT5yX2FkZGVuZCwgeS0+cl9hZGRlbmQpOwor CXJldHVybiBpOworfQorCitzdGF0aWMgYm9vbCBkdXBsaWNhdGVfcmVsKGNvbnN0IEVsZjY0X1Jl bGEgKnJlbGEsIGludCBudW0pCit7CisJLyoKKwkgKiBFbnRyaWVzIGFyZSBzb3J0ZWQgYnkgdHlw ZSwgc3ltYm9sIGluZGV4IGFuZCBhZGRlbmQuIFRoYXQgbWVhbnMKKwkgKiB0aGF0LCBpZiBhIGR1 cGxpY2F0ZSBlbnRyeSBleGlzdHMsIGl0IG11c3QgYmUgaW4gdGhlIHByZWNlZGluZworCSAqIHNs b3QuCisJICovCisJcmV0dXJuIG51bSA+IDAgJiYgY21wX3JlbGEocmVsYSArIG51bSwgcmVsYSAr IG51bSAtIDEpID09IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY291bnRfZ290cyhFbGY2 NF9TeW0gKnN5bXMsIEVsZjY0X1JlbGEgKnJlbGEsIGludCBudW0pCit7CisJdW5zaWduZWQgaW50 IHJldCA9IDA7CisJRWxmNjRfU3ltICpzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51 bTsgaSsrKSB7CisJCXN3aXRjaCAoRUxGNjRfUl9UWVBFKHJlbGFbaV0ucl9pbmZvKSkgeworCQlj YXNlIFJfWDg2XzY0X0dPVFBDUkVMOgorCQkJcyA9IHN5bXMgKyBFTEY2NF9SX1NZTShyZWxhW2ld LnJfaW5mbyk7CisKKwkJCS8qCisJCQkgKiBVc2UgdGhlIGtlcm5lbCBHT1Qgd2hlbiBwb3NzaWJs ZSwgZWxzZSByZXNlcnZlIGEKKwkJCSAqIGN1c3RvbSBvbmUgZm9yIHRoaXMgbW9kdWxlLgorCQkJ ICovCisJCQlpZiAoIWR1cGxpY2F0ZV9yZWwocmVsYSwgaSkgJiYKKwkJCSAgICAhZmluZF9nb3Rf a2VybmVsX2VudHJ5KHMsIHJlbGEgKyBpKSkKKwkJCQlyZXQrKzsKKwkJCWJyZWFrOworCQl9CisJ fQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBHT1QgZW50cmllcyBmb3IgR09U UENSRUwgcmVsb2NhdGlvbnMgdGhhdCBkbyBub3QgZXhpc3RzIGluIHRoZQorICoga2VybmVsIEdP VC4gQmFzZWQgb24gYXJtNjQgbW9kdWxlLXBsdHMgaW1wbGVtZW50YXRpb24uCisgKi8KK2ludCBt b2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICplaGRyLCBFbGZfU2hkciAqc2VjaGRy cywKKwkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwl1 bnNpZ25lZCBsb25nIGdvdHMgPSAwOworCUVsZl9TaGRyICpzeW10YWIgPSBOVUxMOworCUVsZjY0 X1N5bSAqc3ltcyA9IE5VTEw7CisJY2hhciAqc3RyaW5ncywgKm5hbWU7CisJaW50IGk7CisKKwkv KgorCSAqIEZpbmQgdGhlIGVtcHR5IC5nb3Qgc2VjdGlvbiBzbyB3ZSBjYW4gZXhwYW5kIGl0IHRv IHN0b3JlIHRoZSBQTFQKKwkgKiBlbnRyaWVzLiBSZWNvcmQgdGhlIHN5bXRhYiBhZGRyZXNzIGFz IHdlbGwuCisJICovCisJZm9yIChpID0gMDsgaSA8IGVoZHItPmVfc2hudW07IGkrKykgeworCQlp ZiAoIXN0cmNtcChzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLCAiLmdvdCIpKSB7CisJ CQltb2QtPmFyY2guY29yZS5nb3QgPSBzZWNoZHJzICsgaTsKKwkJfSBlbHNlIGlmIChzZWNoZHJz W2ldLnNoX3R5cGUgPT0gU0hUX1NZTVRBQikgeworCQkJc3ltdGFiID0gc2VjaGRycyArIGk7CisJ CQlzeW1zID0gKEVsZjY0X1N5bSAqKXN5bXRhYi0+c2hfYWRkcjsKKwkJfQorCX0KKworCWlmICgh bW9kLT5hcmNoLmNvcmUuZ290KSB7CisJCXByX2VycigiJXM6IG1vZHVsZSBHT1Qgc2VjdGlvbiBt aXNzaW5nXG4iLCBtb2QtPm5hbWUpOworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCWlmICghc3lt cykgeworCQlwcl9lcnIoIiVzOiBtb2R1bGUgc3ltdGFiIHNlY3Rpb24gbWlzc2luZ1xuIiwgbW9k LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlaGRy LT5lX3NobnVtOyBpKyspIHsKKwkJRWxmNjRfUmVsYSAqcmVscyA9ICh2b2lkICopZWhkciArIHNl Y2hkcnNbaV0uc2hfb2Zmc2V0OworCQlpbnQgbnVtcmVscyA9IHNlY2hkcnNbaV0uc2hfc2l6ZSAv IHNpemVvZihFbGY2NF9SZWxhKTsKKworCQlpZiAoc2VjaGRyc1tpXS5zaF90eXBlICE9IFNIVF9S RUxBKQorCQkJY29udGludWU7CisKKwkJLyogc29ydCBieSB0eXBlLCBzeW1ib2wgaW5kZXggYW5k IGFkZGVuZCAqLworCQlzb3J0KHJlbHMsIG51bXJlbHMsIHNpemVvZihFbGY2NF9SZWxhKSwgY21w X3JlbGEsIE5VTEwpOworCisJCWdvdHMgKz0gY291bnRfZ290cyhzeW1zLCByZWxzLCBudW1yZWxz KTsKKwl9CisKKwltb2QtPmFyY2guY29yZS5nb3QtPnNoX3R5cGUgPSBTSFRfTk9CSVRTOworCW1v ZC0+YXJjaC5jb3JlLmdvdC0+c2hfZmxhZ3MgPSBTSEZfQUxMT0M7CisJbW9kLT5hcmNoLmNvcmUu Z290LT5zaF9hZGRyYWxpZ24gPSBMMV9DQUNIRV9CWVRFUzsKKwltb2QtPmFyY2guY29yZS5nb3Qt PnNoX3NpemUgPSAoZ290cyArIDEpICogc2l6ZW9mKHU2NCk7CisJbW9kLT5hcmNoLmNvcmUuZ290 X251bV9lbnRyaWVzID0gMDsKKwltb2QtPmFyY2guY29yZS5nb3RfbWF4X2VudHJpZXMgPSBnb3Rz OworCisJLyoKKwkgKiBJZiBhIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgZXhpc3RzLCBt YWtlIGl0IGFic29sdXRlIGZvcgorCSAqIG1vZHVsZXMgdG8gY29ycmVjdGx5IHJlZmVyZW5jZSBp dC4gU2ltaWxhciB0byBzMzkwIGltcGxlbWVudGF0aW9uLgorCSAqLworCXN0cmluZ3MgPSAodm9p ZCAqKSBlaGRyICsgc2VjaGRyc1tzeW10YWItPnNoX2xpbmtdLnNoX29mZnNldDsKKwlmb3IgKGkg PSAwOyBpIDwgc3ltdGFiLT5zaF9zaXplL3NpemVvZihFbGZfU3ltKTsgaSsrKSB7CisJCWlmIChz eW1zW2ldLnN0X3NobmR4ICE9IFNITl9VTkRFRikKKwkJCWNvbnRpbnVlOworCQluYW1lID0gc3Ry aW5ncyArIHN5bXNbaV0uc3RfbmFtZTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgIl9HTE9CQUxfT0ZG U0VUX1RBQkxFXyIpKSB7CisJCQlzeW1zW2ldLnN0X3NobmR4ID0gU0hOX0FCUzsKKwkJCWJyZWFr OworCQl9CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKIHZvaWQgKm1vZHVsZV9hbGxvYyh1 bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdm9pZCAqcDsKQEAgLTE5MCwxNiArMzU4LDIwIEBAIGlu dCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmNjRfU2hkciAqc2VjaGRycywKIAkJCWlmICgoczY0KXZh bCAhPSAqKHMzMiAqKWxvYykKIAkJCQlnb3RvIG92ZXJmbG93OwogCQkJYnJlYWs7CisjaWZkZWYg Q09ORklHX1g4Nl9QSUUKKwkJY2FzZSBSX1g4Nl82NF9HT1RQQ1JFTDoKKwkJCXZhbCA9IG1vZHVs ZV9lbWl0X2dvdF9lbnRyeShtZSwgbG9jLCByZWwgKyBpLCBzeW0pOworCQkJLyogZmFsbHRocm91 Z2ggKi8KKyNlbmRpZgogCQljYXNlIFJfWDg2XzY0X1BDMzI6CiAJCWNhc2UgUl9YODZfNjRfUExU MzI6CiAJCQlpZiAoKih1MzIgKilsb2MgIT0gMCkKIAkJCQlnb3RvIGludmFsaWRfcmVsb2NhdGlv bjsKIAkJCXZhbCAtPSAodTY0KWxvYzsKIAkJCSoodTMyICopbG9jID0gdmFsOwotI2lmIDAKLQkJ CWlmICgoczY0KXZhbCAhPSAqKHMzMiAqKWxvYykKKwkJCWlmIChJU19FTkFCTEVEKENPTkZJR19Y ODZfUElFKSAmJgorCQkJICAgIChzNjQpdmFsICE9ICooczMyICopbG9jKQogCQkJCWdvdG8gb3Zl cmZsb3c7Ci0jZW5kaWYKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJfZXJyKCIlczogVW5r bm93biByZWxhIHJlbG9jYXRpb246ICVsbHVcbiIsCkBAIC0yMTcsOCArMzg5LDcgQEAgaW50IGFw cGx5X3JlbG9jYXRlX2FkZChFbGY2NF9TaGRyICpzZWNoZHJzLAogb3ZlcmZsb3c6CiAJcHJfZXJy KCJvdmVyZmxvdyBpbiByZWxvY2F0aW9uIHR5cGUgJWQgdmFsICVMeFxuIiwKIAkgICAgICAgKGlu dClFTEY2NF9SX1RZUEUocmVsW2ldLnJfaW5mbyksIHZhbCk7Ci0JcHJfZXJyKCJgJXMnIGxpa2Vs eSBub3QgY29tcGlsZWQgd2l0aCAtbWNtb2RlbD1rZXJuZWxcbiIsCi0JICAgICAgIG1lLT5uYW1l KTsKKwlwcl9lcnIoImAlcycgbGlrZWx5IHRvbyBmYXIgZnJvbSB0aGUga2VybmVsXG4iLCBtZS0+ bmFtZSk7CiAJcmV0dXJuIC1FTk9FWEVDOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4 Ni9rZXJuZWwvbW9kdWxlLmxkcyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUubGRzCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZmQ2ZTk1YTRiNDU0Ci0tLSAvZGV2L251 bGwKKysrIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5sZHMKQEAgLTAsMCArMSwzIEBACitTRUNU SU9OUyB7CisJLmdvdCAoTk9MT0FEKSA6IHsgQllURSgwKSB9Cit9Ci0tIAoyLjE3LjAuNDQxLmdi NDZmZTYwZTFkLWdvb2cKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0 Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRl dmVs From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Garnier Subject: [PATCH v3 23/27] x86/modules: Adapt module loading for PIE support Date: Wed, 23 May 2018 12:54:17 -0700 Message-Id: <20180523195421.180248-24-thgarnie@google.com> In-Reply-To: <20180523195421.180248-1-thgarnie@google.com> References: <20180523195421.180248-1-thgarnie@google.com> To: Herbert Xu , "David S . Miller" , Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , Peter Zijlstra , Josh Poimboeuf , Greg Kroah-Hartman , Thomas Garnier , Philippe Ombredanne , Kate Stewart , Arnaldo Carvalho de Melo , Yonghong Song , Andrey Ryabinin , Kees Cook , Tom Lendacky , "Kirill A . Shutemov" , Andy Lutomirski , Dominik Brodowski , Borislav Petkov , Borislav Petkov , "Rafael J . Wysocki" , Len Brown , Pavel Machek , Juergen Gross , Alok Kataria , Steven Rostedt , Jan Kiszka , Tejun Heo , Christoph Lameter , Dennis Zhou , Boris Ostrovsky , Alexey Dobriyan , Masami Hiramatsu , Cao jin , Francis Deslauriers , "Paul E . McKenney" , Nicolas Pitre , Andrew Morton , Randy Dunlap , "Luis R . Rodriguez" , Arnd Bergmann , Christopher Li , Jason Baron , Mika Westerberg , Lukas Wunner , Dou Liyang , Sergey Senozhatsky , Petr Mladek , Masahiro Yamada , Ingo Molnar , Nicholas Piggin , "H . J . Lu" , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Joerg Roedel , David Woodhouse , Dave Hansen , Rik van Riel , Jia Zhang , Ricardo Neri , Jonathan Corbet , Jan Beulich , Matthias Kaehlcke , 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: Adapt module loading to support PIE relocations. Generate dynamic GOT if a symbol requires it but no entry exist in the kernel GOT. 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/Makefile | 4 + arch/x86/include/asm/module.h | 11 ++ arch/x86/include/asm/sections.h | 4 + arch/x86/kernel/module.c | 181 +++++++++++++++++++++++++++++++- arch/x86/kernel/module.lds | 3 + 5 files changed, 198 insertions(+), 5 deletions(-) create mode 100644 arch/x86/kernel/module.lds diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 277ffc57ae13..20bb6cbd8938 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -134,7 +134,11 @@ else KBUILD_CFLAGS += $(cflags-y) KBUILD_CFLAGS += -mno-red-zone +ifdef CONFIG_X86_PIE + KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/x86/kernel/module.lds +else KBUILD_CFLAGS += -mcmodel=kernel +endif # -funit-at-a-time shrinks the kernel .text considerably # unfortunately it makes reading oopses harder. diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h index 7948a17febb4..68ff05e14288 100644 --- a/arch/x86/include/asm/module.h +++ b/arch/x86/include/asm/module.h @@ -5,12 +5,23 @@ #include #include +#ifdef CONFIG_X86_PIE +struct mod_got_sec { + struct elf64_shdr *got; + int got_num_entries; + int got_max_entries; +}; +#endif + struct mod_arch_specific { #ifdef CONFIG_UNWINDER_ORC unsigned int num_orcs; int *orc_unwind_ip; struct orc_entry *orc_unwind; #endif +#ifdef CONFIG_X86_PIE + struct mod_got_sec core; +#endif }; #ifdef CONFIG_X86_64 diff --git a/arch/x86/include/asm/sections.h b/arch/x86/include/asm/sections.h index da3d98bb2bcb..89b3a95c8d11 100644 --- a/arch/x86/include/asm/sections.h +++ b/arch/x86/include/asm/sections.h @@ -17,4 +17,8 @@ extern char __entry_trampoline_start[], __entry_trampoline_end[]; extern char __start_got[], __end_got[]; #endif +#if defined(CONFIG_X86_PIE) +extern char __start_got[], __end_got[]; +#endif + #endif /* _ASM_X86_SECTIONS_H */ diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c index f58336af095c..88895f3d474b 100644 --- a/arch/x86/kernel/module.c +++ b/arch/x86/kernel/module.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -77,6 +78,173 @@ static unsigned long int get_module_load_offset(void) } #endif +#ifdef CONFIG_X86_PIE +static u64 find_got_kernel_entry(Elf64_Sym *sym, const Elf64_Rela *rela) +{ + u64 *pos; + + for (pos = (u64*)__start_got; pos < (u64*)__end_got; pos++) { + if (*pos == sym->st_value) + return (u64)pos + rela->r_addend; + } + + return 0; +} + +static u64 module_emit_got_entry(struct module *mod, void *loc, + const Elf64_Rela *rela, Elf64_Sym *sym) +{ + struct mod_got_sec *gotsec = &mod->arch.core; + u64 *got = (u64*)gotsec->got->sh_addr; + int i = gotsec->got_num_entries; + u64 ret; + + /* Check if we can use the kernel GOT */ + ret = find_got_kernel_entry(sym, rela); + if (ret) + return ret; + + got[i] = sym->st_value; + + /* + * Check if the entry we just created is a duplicate. Given that the + * relocations are sorted, this will be the last entry we allocated. + * (if one exists). + */ + if (i > 0 && got[i] == got[i - 2]) { + ret = (u64)&got[i - 1]; + } else { + gotsec->got_num_entries++; + BUG_ON(gotsec->got_num_entries > gotsec->got_max_entries); + ret = (u64)&got[i]; + } + + return ret + rela->r_addend; +} + +#define cmp_3way(a,b) ((a) < (b) ? -1 : (a) > (b)) + +static int cmp_rela(const void *a, const void *b) +{ + const Elf64_Rela *x = a, *y = b; + int i; + + /* sort by type, symbol index and addend */ + i = cmp_3way(ELF64_R_TYPE(x->r_info), ELF64_R_TYPE(y->r_info)); + if (i == 0) + i = cmp_3way(ELF64_R_SYM(x->r_info), ELF64_R_SYM(y->r_info)); + if (i == 0) + i = cmp_3way(x->r_addend, y->r_addend); + return i; +} + +static bool duplicate_rel(const Elf64_Rela *rela, int num) +{ + /* + * Entries are sorted by type, symbol index and addend. That means + * that, if a duplicate entry exists, it must be in the preceding + * slot. + */ + return num > 0 && cmp_rela(rela + num, rela + num - 1) == 0; +} + +static unsigned int count_gots(Elf64_Sym *syms, Elf64_Rela *rela, int num) +{ + unsigned int ret = 0; + Elf64_Sym *s; + int i; + + for (i = 0; i < num; i++) { + switch (ELF64_R_TYPE(rela[i].r_info)) { + case R_X86_64_GOTPCREL: + s = syms + ELF64_R_SYM(rela[i].r_info); + + /* + * Use the kernel GOT when possible, else reserve a + * custom one for this module. + */ + if (!duplicate_rel(rela, i) && + !find_got_kernel_entry(s, rela + i)) + ret++; + break; + } + } + return ret; +} + +/* + * Generate GOT entries for GOTPCREL relocations that do not exists in the + * kernel GOT. Based on arm64 module-plts implementation. + */ +int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, + char *secstrings, struct module *mod) +{ + unsigned long gots = 0; + Elf_Shdr *symtab = NULL; + Elf64_Sym *syms = NULL; + char *strings, *name; + int i; + + /* + * Find the empty .got section so we can expand it to store the PLT + * entries. Record the symtab address as well. + */ + for (i = 0; i < ehdr->e_shnum; i++) { + if (!strcmp(secstrings + sechdrs[i].sh_name, ".got")) { + mod->arch.core.got = sechdrs + i; + } else if (sechdrs[i].sh_type == SHT_SYMTAB) { + symtab = sechdrs + i; + syms = (Elf64_Sym *)symtab->sh_addr; + } + } + + if (!mod->arch.core.got) { + pr_err("%s: module GOT section missing\n", mod->name); + return -ENOEXEC; + } + if (!syms) { + pr_err("%s: module symtab section missing\n", mod->name); + return -ENOEXEC; + } + + for (i = 0; i < ehdr->e_shnum; i++) { + Elf64_Rela *rels = (void *)ehdr + sechdrs[i].sh_offset; + int numrels = sechdrs[i].sh_size / sizeof(Elf64_Rela); + + if (sechdrs[i].sh_type != SHT_RELA) + continue; + + /* sort by type, symbol index and addend */ + sort(rels, numrels, sizeof(Elf64_Rela), cmp_rela, NULL); + + gots += count_gots(syms, rels, numrels); + } + + mod->arch.core.got->sh_type = SHT_NOBITS; + mod->arch.core.got->sh_flags = SHF_ALLOC; + mod->arch.core.got->sh_addralign = L1_CACHE_BYTES; + mod->arch.core.got->sh_size = (gots + 1) * sizeof(u64); + mod->arch.core.got_num_entries = 0; + mod->arch.core.got_max_entries = gots; + + /* + * If a _GLOBAL_OFFSET_TABLE_ symbol exists, make it absolute for + * modules to correctly reference it. Similar to s390 implementation. + */ + strings = (void *) ehdr + sechdrs[symtab->sh_link].sh_offset; + for (i = 0; i < symtab->sh_size/sizeof(Elf_Sym); i++) { + if (syms[i].st_shndx != SHN_UNDEF) + continue; + name = strings + syms[i].st_name; + if (!strcmp(name, "_GLOBAL_OFFSET_TABLE_")) { + syms[i].st_shndx = SHN_ABS; + break; + } + } + return 0; +} +#endif + void *module_alloc(unsigned long size) { void *p; @@ -190,16 +358,20 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, if ((s64)val != *(s32 *)loc) goto overflow; break; +#ifdef CONFIG_X86_PIE + case R_X86_64_GOTPCREL: + val = module_emit_got_entry(me, loc, rel + i, sym); + /* fallthrough */ +#endif case R_X86_64_PC32: case R_X86_64_PLT32: if (*(u32 *)loc != 0) goto invalid_relocation; val -= (u64)loc; *(u32 *)loc = val; -#if 0 - if ((s64)val != *(s32 *)loc) + if (IS_ENABLED(CONFIG_X86_PIE) && + (s64)val != *(s32 *)loc) goto overflow; -#endif break; default: pr_err("%s: Unknown rela relocation: %llu\n", @@ -217,8 +389,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, overflow: pr_err("overflow in relocation type %d val %Lx\n", (int)ELF64_R_TYPE(rel[i].r_info), val); - pr_err("`%s' likely not compiled with -mcmodel=kernel\n", - me->name); + pr_err("`%s' likely too far from the kernel\n", me->name); return -ENOEXEC; } #endif 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.17.0.441.gb46fe60e1d-goog