Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp55929ybh; Tue, 14 Jul 2020 17:45:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyjDTt7R+vpWMajZimZf+nwGrBARR1rePrugDv7m2mO8TWTCZ6h4g9ZfO+t0lU4bcxIS/pg X-Received: by 2002:a17:906:8588:: with SMTP id v8mr7144242ejx.211.1594773932735; Tue, 14 Jul 2020 17:45:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594773932; cv=none; d=google.com; s=arc-20160816; b=qu6G5VqYsXXTy3zLemYEHi4UGqhtzGsPI81zwB8p3Adcxmo0n1056cLjqxvxJBJ4b5 Mk8lDy28xTi4bomiROEJJBqDvsdR2SWo1mckEB8S3zN+V/WXORkWg/46SeDN+QoRm8rP VwkrGhaJgU4LSRl7+bZbVOyrdySXGlQSL9U8FgNSUWWijZ97iNicFlUaWPVW6MrAGFPz /r4Kq1pEpg/iyBtOg8NvXPHpKOH84zA71lO4bEWj48Yd6Tk9+wh9I4BMsZyHHQ/zsjW7 23lUtGyr7PI62dcbjSHyRH6mLKhrLYL3Ep/sX9iiLX0fjmLcSVkR35xmlkW1lesBcsLz fWUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=hjflrgJ1nEMfvu6o0sT4KLViapV2UjMMsYBLgsk/fRo=; b=o6qWWuFnI4K52bQom5epPI3VVVVJQB8CSYOhF1E0Gu4NnevozQ2imdL6yvdSgg9pNx WWuY9SGBbe4n9X05nKNg8tb8ShxLaXfcfDQr5YQaS0UYx3ABNoAW64Zc3AIVKYZvYwKc rD7mluEbQmaqUvuoGxUlEwaQiLaafpTG5XbyCFc5bTR1xQuWVYGRqO6cCVR/S+f1yWy6 2PHFMsKJ11nIn7LtvYilwvNFWu1ACL4o0zNIvvf+8e+UTFV921377rOM7iWJexvNWLTy 8iPkY/P4RyzlXftHcj9Iqm26klVvx9Cjt+liLs8q1nBUaSAAzBvhyTv1c8L+RJBM41tK grVg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c25si278131ejb.6.2020.07.14.17.45.09; Tue, 14 Jul 2020 17:45:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728240AbgGOAl7 (ORCPT + 99 others); Tue, 14 Jul 2020 20:41:59 -0400 Received: from mail-qv1-f67.google.com ([209.85.219.67]:40588 "EHLO mail-qv1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728001AbgGOAlk (ORCPT ); Tue, 14 Jul 2020 20:41:40 -0400 Received: by mail-qv1-f67.google.com with SMTP id m8so160218qvk.7 for ; Tue, 14 Jul 2020 17:41:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hjflrgJ1nEMfvu6o0sT4KLViapV2UjMMsYBLgsk/fRo=; b=Q6SEAMAMnDdgV1S7UXkZy77S+bvLzbfBw06lLiiqI2O5dfGBZT9E8Cw4EW8+HpXHK8 OoiUcf+p6HAoIhj3LLE9CfyCair+QUDF71sD/p7w04GC9Id2ekqNefnn3lXVAOY7N5N2 acbcueSasUxFFXI/d9AYcjco9/4s/R95+JvVwcPdwLbkGRZ4NBzqw5tR/0WvgrztIMVu JaSJQYVhw74JfqD6ttX7C5rPCBalYQUDl6fQ00qxXEdyomqjp1oJVXGuTTipgMXrpavw VNU4LvhTnczrBNLmrIJtf1nWoE82s0+RyIV2aUQ9FN6LoznOJjfSzwmRWSIr6taFWadX ELUg== X-Gm-Message-State: AOAM5304it34O2bsD5tjIHPLWgV+unq1Gwo15HQEWhuHgyoVa0gBa5kY zYunJrwmXzntezDDG5cSjgQ= X-Received: by 2002:a05:6214:289:: with SMTP id l9mr7332970qvv.238.1594773698195; Tue, 14 Jul 2020 17:41:38 -0700 (PDT) Received: from rani.riverdale.lan ([2001:470:1f07:5f3::b55f]) by smtp.gmail.com with ESMTPSA id c9sm524776qko.24.2020.07.14.17.41.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2020 17:41:37 -0700 (PDT) From: Arvind Sankar To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , x86@kernel.org Cc: Nick Desaulniers , Fangrui Song , Dmitry Golovin , clang-built-linux@googlegroups.com, Ard Biesheuvel , Masahiro Yamada , Daniel Kiper , Sedat Dilek , Kees Cook , Nathan Chancellor , Arnd Bergmann , "H . J . Lu" , linux-kernel@vger.kernel.org Subject: [PATCH v5 3/7] x86/boot/compressed: Get rid of GOT fixup code Date: Tue, 14 Jul 2020 20:41:29 -0400 Message-Id: <20200715004133.1430068-4-nivedita@alum.mit.edu> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200714023836.2310569-1-nivedita@alum.mit.edu> References: <20200714023836.2310569-1-nivedita@alum.mit.edu> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ard Biesheuvel In a previous patch, we have eliminated GOT entries from the decompressor binary and added an assertion that the .got section is empty. This means that the GOT fixup routines that exist in both the 32-bit and 64-bit startup routines have become dead code, and can be removed. While at it, drop the KEEP() from the linker script, as it has no effect on the contents of output sections that are created by the linker itself. Reviewed-by: Kees Cook Signed-off-by: Ard Biesheuvel Acked-by: Arvind Sankar Signed-off-by: Arvind Sankar From: Ard Biesheuvel Link: https://lore.kernel.org/r/20200523120021.34996-4-ardb@kernel.org --- arch/x86/boot/compressed/head_32.S | 24 ++--------- arch/x86/boot/compressed/head_64.S | 57 -------------------------- arch/x86/boot/compressed/vmlinux.lds.S | 4 +- 3 files changed, 5 insertions(+), 80 deletions(-) diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index 03557f2174bf..39f0bb43218f 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S @@ -49,16 +49,13 @@ * Position Independent Executable (PIE) so that linker won't optimize * R_386_GOT32X relocation to its fixed symbol address. Older * linkers generate R_386_32 relocations against locally defined symbols, - * _bss, _ebss, _got, _egot and _end, in PIE. It isn't wrong, just less - * optimal than R_386_RELATIVE. But the x86 kernel fails to properly handle - * R_386_32 relocations when relocating the kernel. To generate - * R_386_RELATIVE relocations, we mark _bss, _ebss, _got, _egot and _end as - * hidden: + * _bss, _ebss and _end, in PIE. It isn't wrong, just less optimal than + * R_386_RELATIVE. But the x86 kernel fails to properly handle R_386_32 + * relocations when relocating the kernel. To generate R_386_RELATIVE + * relocations, we mark _bss, _ebss and _end as hidden: */ .hidden _bss .hidden _ebss - .hidden _got - .hidden _egot .hidden _end __HEAD @@ -192,19 +189,6 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated) shrl $2, %ecx rep stosl -/* - * Adjust our own GOT - */ - leal _got(%ebx), %edx - leal _egot(%ebx), %ecx -1: - cmpl %ecx, %edx - jae 2f - addl %ebx, (%edx) - addl $4, %edx - jmp 1b -2: - /* * Do the extraction, and jump to the new kernel.. */ diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 97d37f0a34f5..bf1ab30acc5b 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -40,8 +40,6 @@ */ .hidden _bss .hidden _ebss - .hidden _got - .hidden _egot .hidden _end __HEAD @@ -353,25 +351,6 @@ SYM_CODE_START(startup_64) /* Set up the stack */ leaq boot_stack_end(%rbx), %rsp - /* - * paging_prepare() and cleanup_trampoline() below can have GOT - * references. Adjust the table with address we are running at. - * - * Zero RAX for adjust_got: the GOT was not adjusted before; - * there's no adjustment to undo. - */ - xorq %rax, %rax - - /* - * Calculate the address the binary is loaded at and use it as - * a GOT adjustment. - */ - call 1f -1: popq %rdi - subq $1b, %rdi - - call .Ladjust_got - /* * At this point we are in long mode with 4-level paging enabled, * but we might want to enable 5-level paging or vice versa. @@ -464,21 +443,6 @@ trampoline_return: pushq $0 popfq - /* - * Previously we've adjusted the GOT with address the binary was - * loaded at. Now we need to re-adjust for relocation address. - * - * Calculate the address the binary is loaded at, so that we can - * undo the previous GOT adjustment. - */ - call 1f -1: popq %rax - subq $1b, %rax - - /* The new adjustment is the relocation address */ - movq %rbx, %rdi - call .Ladjust_got - /* * Copy the compressed kernel to the end of our buffer * where decompression in place becomes safe. @@ -556,27 +520,6 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated) jmp *%rax SYM_FUNC_END(.Lrelocated) -/* - * Adjust the global offset table - * - * RAX is the previous adjustment of the table to undo (use 0 if it's the - * first time we touch GOT). - * RDI is the new adjustment to apply. - */ -.Ladjust_got: - /* Walk through the GOT adding the address to the entries */ - leaq _got(%rip), %rdx - leaq _egot(%rip), %rcx -1: - cmpq %rcx, %rdx - jae 2f - subq %rax, (%rdx) /* Undo previous adjustment */ - addq %rdi, (%rdx) /* Apply the new adjustment */ - addq $8, %rdx - jmp 1b -2: - ret - .code32 /* * This is the 32-bit trampoline that will be copied over to low memory. diff --git a/arch/x86/boot/compressed/vmlinux.lds.S b/arch/x86/boot/compressed/vmlinux.lds.S index 4bcc943842ab..a4a4a59a2628 100644 --- a/arch/x86/boot/compressed/vmlinux.lds.S +++ b/arch/x86/boot/compressed/vmlinux.lds.S @@ -43,9 +43,7 @@ SECTIONS _erodata = . ; } .got : { - _got = .; - KEEP(*(.got)) - _egot = .; + *(.got) } .got.plt : { *(.got.plt) -- 2.26.2