From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Garnier Subject: [PATCH v2 10/27] x86/boot/64: Adapt assembly for PIE support Date: Tue, 13 Mar 2018 13:59:28 -0700 Message-ID: <20180313205945.245105-11-thgarnie@google.com> References: <20180313205945.245105-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 , Kate Stewart , Thomas Garnier , Arnd Bergmann , Philippe Ombredanne , Arnaldo Carvalho de Melo , Andrey Ryabinin , Matthias Kaehlcke , Kees Cook , Tom Lendacky , "Kirill A . Shutemov" , Andy Lutomirski , Dominik Brodowski , Borislav Petkov , Borislav Petkov , "Raf Return-path: In-Reply-To: <20180313205945.245105-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 Q2hhbmdlIHRoZSBhc3NlbWJseSBjb2RlIHRvIHVzZSBvbmx5IHJlbGF0aXZlIHJlZmVyZW5jZXMg b2Ygc3ltYm9scyBmb3IgdGhlCmtlcm5lbCB0byBiZSBQSUUgY29tcGF0aWJsZS4KCkVhcmx5IGF0 IGJvb3QsIHRoZSBrZXJuZWwgaXMgbWFwcGVkIGF0IGEgdGVtcG9yYXJ5IGFkZHJlc3Mgd2hpbGUg cHJlcGFyaW5nCnRoZSBwYWdlIHRhYmxlLiBUbyBrbm93IHRoZSBjaGFuZ2VzIG5lZWRlZCBmb3Ig dGhlIHBhZ2UgdGFibGUgd2l0aCBLQVNMUiwKdGhlIGJvb3QgY29kZSBjYWxjdWxhdGUgdGhlIGRp ZmZlcmVuY2UgYmV0d2VlbiB0aGUgZXhwZWN0ZWQgYWRkcmVzcyBvZiB0aGUKa2VybmVsIGFuZCB0 aGUgb25lIGNob3NlbiBieSBLQVNMUi4gSXQgZG9lcyBub3Qgd29yayB3aXRoIFBJRSBiZWNhdXNl IGFsbApzeW1ib2xzIGluIGNvZGUgYXJlIHJlbGF0aXZlcy4gSW5zdGVhZCBvZiBnZXR0aW5nIHRo ZSBmdXR1cmUgcmVsb2NhdGVkCnZpcnR1YWwgYWRkcmVzcywgeW91IHdpbGwgZ2V0IHRoZSBjdXJy ZW50IHRlbXBvcmFyeSBtYXBwaW5nLiBUaGUgc29sdXRpb24KaXMgdXNpbmcgZ2xvYmFsIHZhcmlh YmxlcyB0aGF0IHdpbGwgYmUgcmVsb2NhdGVkIGFzIGV4cGVjdGVkLgoKUG9zaXRpb24gSW5kZXBl bmRlbnQgRXhlY3V0YWJsZSAoUElFKSBzdXBwb3J0IHdpbGwgYWxsb3cgdG8gZXh0ZW5kZWQgdGhl CktBU0xSIHJhbmRvbWl6YXRpb24gcmFuZ2UgYmVsb3cgdGhlIC0yRyBtZW1vcnkgbGltaXQuCgpT aWduZWQtb2ZmLWJ5OiBUaG9tYXMgR2FybmllciA8dGhnYXJuaWVAZ29vZ2xlLmNvbT4KLS0tCiBh cmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TIHwgMjYgKysrKysrKysrKysrKysrKysrKystLS0tLS0K IDEgZmlsZSBjaGFuZ2VkLCAyMCBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAt LWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82 NC5TCmluZGV4IDQ4Mzg1YzEwNzRhNS4uNDg2NTJmM2VjNDZhIDEwMDY0NAotLS0gYS9hcmNoL3g4 Ni9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMKQEAgLTg5 LDggKzg5LDkgQEAgc3RhcnR1cF82NDoKIAlwb3BxCSVyc2kKIAogCS8qIEZvcm0gdGhlIENSMyB2 YWx1ZSBiZWluZyBzdXJlIHRvIGluY2x1ZGUgdGhlIENSMyBtb2RpZmllciAqLwotCWFkZHEJJChl YXJseV90b3BfcGd0IC0gX19TVEFSVF9LRVJORUxfbWFwKSwgJXJheAorCWFkZHEgICAgX2Vhcmx5 X3RvcF9wZ3Rfb2Zmc2V0KCVyaXApLCAlcmF4CiAJam1wIDFmCisKIEVOVFJZKHNlY29uZGFyeV9z dGFydHVwXzY0KQogCVVOV0lORF9ISU5UX0VNUFRZCiAJLyoKQEAgLTExOSw3ICsxMjAsNyBAQCBF TlRSWShzZWNvbmRhcnlfc3RhcnR1cF82NCkKIAlwb3BxCSVyc2kKIAogCS8qIEZvcm0gdGhlIENS MyB2YWx1ZSBiZWluZyBzdXJlIHRvIGluY2x1ZGUgdGhlIENSMyBtb2RpZmllciAqLwotCWFkZHEJ JChpbml0X3RvcF9wZ3QgLSBfX1NUQVJUX0tFUk5FTF9tYXApLCAlcmF4CisJYWRkcSAgICBfaW5p dF90b3Bfb2Zmc2V0KCVyaXApLCAlcmF4CiAxOgogCiAJLyogRW5hYmxlIFBBRSBtb2RlLCBQR0Ug YW5kIExBNTcgKi8KQEAgLTEzNyw3ICsxMzgsNyBAQCBFTlRSWShzZWNvbmRhcnlfc3RhcnR1cF82 NCkKIAltb3ZxCSVyYXgsICVjcjMKIAogCS8qIEVuc3VyZSBJIGFtIGV4ZWN1dGluZyBmcm9tIHZp cnR1YWwgYWRkcmVzc2VzICovCi0JbW92cQkkMWYsICVyYXgKKwltb3ZhYnMgICQxZiwgJXJheAog CUFOTk9UQVRFX1JFVFBPTElORV9TQUZFCiAJam1wCSolcmF4CiAxOgpAQCAtMjM0LDExICsyMzUs MTIgQEAgRU5UUlkoc2Vjb25kYXJ5X3N0YXJ0dXBfNjQpCiAJICoJUkVYLlcgKyBGRiAvNSBKTVAg bTE2OjY0IEp1bXAgZmFyLCBhYnNvbHV0ZSBpbmRpcmVjdCwKIAkgKgkJYWRkcmVzcyBnaXZlbiBp biBtMTY6NjQuCiAJICovCi0JcHVzaHEJJC5MYWZ0ZXJfbHJldAkjIHB1dCByZXR1cm4gYWRkcmVz cyBvbiBzdGFjayBmb3IgdW53aW5kZXIKKwlsZWFxCS5MYWZ0ZXJfbHJldCglcmlwKSwgJXJheAor CXB1c2hxCSVyYXgJCSMgcHV0IHJldHVybiBhZGRyZXNzIG9uIHN0YWNrIGZvciB1bndpbmRlcgog CXhvcnEJJXJicCwgJXJicAkjIGNsZWFyIGZyYW1lIHBvaW50ZXIKLQltb3ZxCWluaXRpYWxfY29k ZSglcmlwKSwgJXJheAorCWxlYXEJaW5pdGlhbF9jb2RlKCVyaXApLCAlcmF4CiAJcHVzaHEJJF9f S0VSTkVMX0NTCSMgc2V0IGNvcnJlY3QgY3MKLQlwdXNocQklcmF4CQkjIHRhcmdldCBhZGRyZXNz IGluIG5lZ2F0aXZlIHNwYWNlCisJcHVzaHEJKCVyYXgpCQkjIHRhcmdldCBhZGRyZXNzIGluIG5l Z2F0aXZlIHNwYWNlCiAJbHJldHEKIC5MYWZ0ZXJfbHJldDoKIEVORChzZWNvbmRhcnlfc3RhcnR1 cF82NCkKQEAgLTM0Miw2ICszNDQsMTggQEAgRU5EKGVhcmx5X2lkdF9oYW5kbGVyX2NvbW1vbikK IEdMT0JBTChlYXJseV9yZWN1cnNpb25fZmxhZykKIAkubG9uZyAwCiAKKwkvKgorCSAqIFBvc2l0 aW9uIEluZGVwZW5kZW50IENvZGUgdGFrZXMgb25seSByZWxhdGl2ZSByZWZlcmVuY2VzIGluIGNv ZGUKKwkgKiBtZWFuaW5nIGEgZ2xvYmFsIHZhcmlhYmxlIGFkZHJlc3MgaXMgcmVsYXRpdmUgdG8g UklQIGFuZCBub3QgaXRzCisJICogZnV0dXJlIHZpcnR1YWwgYWRkcmVzcy4gR2xvYmFsIHZhcmlh YmxlcyBjYW4gYmUgdXNlZCBpbnN0ZWFkIGFzIHRoZXkKKwkgKiBhcmUgc3RpbGwgcmVsb2NhdGVk IG9uIHRoZSBleHBlY3RlZCBrZXJuZWwgbWFwcGluZyBhZGRyZXNzLgorCSAqLworCS5hbGlnbiA4 CitfZWFybHlfdG9wX3BndF9vZmZzZXQ6CisJLnF1YWQgZWFybHlfdG9wX3BndCAtIF9fU1RBUlRf S0VSTkVMX21hcAorX2luaXRfdG9wX29mZnNldDoKKwkucXVhZCBpbml0X3RvcF9wZ3QgLSBfX1NU QVJUX0tFUk5FTF9tYXAKKwogI2RlZmluZSBORVhUX1BBR0UobmFtZSkgXAogCS5iYWxpZ24JUEFH RV9TSVpFOyBcCiBHTE9CQUwobmFtZSkKLS0gCjIuMTYuMi42NjAuZzcwOTg4Nzk3MWItZ29vZwoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZl bCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlz dHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: ARC-Seal: i=1; a=rsa-sha256; t=1520974832; cv=none; d=google.com; s=arc-20160816; b=wgLQ09XACdRTwbJcp9q6YxHyh71y7e4kNiPSoeEW2BIC5bgrbRFUtllrtvFNvT5r6T Sri41HB1UEr8+hKSsWkObYmm8ZcUhw14zedXqo1KY7ZJHRgOpGzFfDFazLSgV37A9vsP sqc9y2TNy3DyxaS4kIF7qYD1L94JMlb7ztKWi01KiRTrZ1YI9ofzVg5pDWKXZRg2krfN U1tvevVE5Ty4b7IQ4BIUjD1xG24wjmG5x/OePKsizbXWOEJvVT2lgmJPJunCmrxcLeTe 46vUkfXa4uH+6oIfPK/1WRzyTysRyu3OefAdLI2VwHfnob3MtaWnL6a+95VUJdhSGCwg jHEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=eQdfHSyL7AbE7TzHHG42nf8EeTOIWyarQ4Ux7nBg5B8=; b=uZEwGblsHSdTcfxZs/YcMeBN5jfDEuQgvf81lb22hTrTXvkoe1lZurfHKJr0Rfnakp t6CzoWA7q24t35ybORjaFhDrhVx/f6MpSGBpGnbNBXubEuMoFlihW87Oa2PuvnY26Fdn lY5mZ4u/zNe+zg1kyqUt3vu2Nw5Or/MYOYGcYUxg3nzzAt8yTVOKucVwkYKM+/WdK5Da tRXButJ7DRcn2H3DF2U1vtqLzVjgIZLot28cXWDlVWNnXgV6mdkAbGG7wfGyJnE4D2fm IbvhOJkJdemzFzmLavVJRwrCg7RbVCszbuH15pkx0vCRH11Mmg1zC0czP3ztgwokZ7fw HQvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=iiQVUdPc; spf=pass (google.com: domain of thgarnie@google.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=thgarnie@google.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=iiQVUdPc; spf=pass (google.com: domain of thgarnie@google.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=thgarnie@google.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com X-Google-Smtp-Source: AG47ELuOiyvGXklA6FKJYQ7NaM2KHPy4UF5jT2e2wQvWE83YTwJ/PZd7Lo9eVaFht4V2uAc+OQeLtA== From: Thomas Garnier To: Herbert Xu , "David S . Miller" , Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , Peter Zijlstra , Josh Poimboeuf , Greg Kroah-Hartman , Kate Stewart , Thomas Garnier , Arnd Bergmann , Philippe Ombredanne , Arnaldo Carvalho de Melo , Andrey Ryabinin , Matthias Kaehlcke , 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 , Tejun Heo , Christoph Lameter , Dennis Zhou , Boris Ostrovsky , David Woodhouse , Alexey Dobriyan , "Paul E . McKenney" , Andrew Morton , Nicolas Pitre , Randy Dunlap , "Luis R . Rodriguez" , Christopher Li , Jason Baron , Ashish Kalra , Kyle McMartin , Dou Liyang , Lukas Wunner , Petr Mladek , Sergey Senozhatsky , Masahiro Yamada , Ingo Molnar , Nicholas Piggin , Cao jin , "H . J . Lu" , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Joerg Roedel , Dave Hansen , Rik van Riel , Jia Zhang , Jiri Slaby , Kyle Huey , Jonathan Corbet , Matthew Wilcox , Michal Hocko , Rob Landley , Baoquan He , Daniel Micay , =?UTF-8?q?Jan=20H=20=2E=20Sch=C3=B6nherr?= 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 Subject: [PATCH v2 10/27] x86/boot/64: Adapt assembly for PIE support Date: Tue, 13 Mar 2018 13:59:28 -0700 Message-Id: <20180313205945.245105-11-thgarnie@google.com> X-Mailer: git-send-email 2.16.2.660.g709887971b-goog In-Reply-To: <20180313205945.245105-1-thgarnie@google.com> References: <20180313205945.245105-1-thgarnie@google.com> X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1594857706486774509?= X-GMAIL-MSGID: =?utf-8?q?1594857706486774509?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: Change the assembly code to use only relative references of symbols for the kernel to be PIE compatible. Early at boot, the kernel is mapped at a temporary address while preparing the page table. To know the changes needed for the page table with KASLR, the boot code calculate the difference between the expected address of the kernel and the one chosen by KASLR. It does not work with PIE because all symbols in code are relatives. Instead of getting the future relocated virtual address, you will get the current temporary mapping. The solution is using global variables that will be relocated as expected. 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/kernel/head_64.S | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 48385c1074a5..48652f3ec46a 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -89,8 +89,9 @@ startup_64: popq %rsi /* Form the CR3 value being sure to include the CR3 modifier */ - addq $(early_top_pgt - __START_KERNEL_map), %rax + addq _early_top_pgt_offset(%rip), %rax jmp 1f + ENTRY(secondary_startup_64) UNWIND_HINT_EMPTY /* @@ -119,7 +120,7 @@ ENTRY(secondary_startup_64) popq %rsi /* Form the CR3 value being sure to include the CR3 modifier */ - addq $(init_top_pgt - __START_KERNEL_map), %rax + addq _init_top_offset(%rip), %rax 1: /* Enable PAE mode, PGE and LA57 */ @@ -137,7 +138,7 @@ ENTRY(secondary_startup_64) movq %rax, %cr3 /* Ensure I am executing from virtual addresses */ - movq $1f, %rax + movabs $1f, %rax ANNOTATE_RETPOLINE_SAFE jmp *%rax 1: @@ -234,11 +235,12 @@ ENTRY(secondary_startup_64) * REX.W + FF /5 JMP m16:64 Jump far, absolute indirect, * address given in m16:64. */ - pushq $.Lafter_lret # put return address on stack for unwinder + leaq .Lafter_lret(%rip), %rax + pushq %rax # put return address on stack for unwinder xorq %rbp, %rbp # clear frame pointer - movq initial_code(%rip), %rax + leaq initial_code(%rip), %rax pushq $__KERNEL_CS # set correct cs - pushq %rax # target address in negative space + pushq (%rax) # target address in negative space lretq .Lafter_lret: END(secondary_startup_64) @@ -342,6 +344,18 @@ END(early_idt_handler_common) GLOBAL(early_recursion_flag) .long 0 + /* + * Position Independent Code takes only relative references in code + * meaning a global variable address is relative to RIP and not its + * future virtual address. Global variables can be used instead as they + * are still relocated on the expected kernel mapping address. + */ + .align 8 +_early_top_pgt_offset: + .quad early_top_pgt - __START_KERNEL_map +_init_top_offset: + .quad init_top_pgt - __START_KERNEL_map + #define NEXT_PAGE(name) \ .balign PAGE_SIZE; \ GLOBAL(name) -- 2.16.2.660.g709887971b-goog