Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1429051ybh; Mon, 13 Jul 2020 19:39:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxnW1QfW+cTaI+rrzcXFOFlGDy25clxRL4vbqXlTMkT0AldSekVils1uXqCLEq3mw9dd54F X-Received: by 2002:a17:906:3c56:: with SMTP id i22mr2625859ejg.12.1594694359895; Mon, 13 Jul 2020 19:39:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594694359; cv=none; d=google.com; s=arc-20160816; b=uG0pbYU1oYQvlYuYYCfcXzCLno49koFUP7QOhNRg/Zfc78R5X04VaDW9ORmUCU4unF x/MghTgzsOTcftggaz4SBeCK8QwMMk/PQPYtV6nCcAwlZFqIfwT/Iow6cAURzNBJ2foL 8LSl8yZd3q8aYoS//RAjta8mZ+1+V2TzmHvRgcFWUgNdAc3KMjxZRabRTbYiQHJ8zN7m k18bBJvmcyt2NhNePADtTIZhbs3sl1HqxkBCjfKgEOoNz3DhlPbiKb8Q5a8NoxycFH3X Qfnyx2cqG81hr06uAlFu0KQka5P9RBgVWOA3LwNkUoyGWJ+uCWPQyop8C9u4L/AwgPCv OUaA== 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=aLJKGhiT24jFn5bdFjl0Bt69kYs80uYBlHCplcAgbAg=; b=Jes2Qcf+BeTRLESrm3DAnyXK030Tp6VM5XPPdOWTyKtkRAaElThXTt4khGjbhxt93W /6zspSeWGdd4D2Cb12xtHxP7l0oI+MzbkRwJXhrShxs5uD9u9WzMmaFYoYdnOGKiiAd7 s9d2lu18JeywodPDPie0QHuDWzQiH7m3CFnWcXBOQMtRVcKf23JC2C+FygaWD2IXceDU FaUuP7xTwceDLhLRee5IItJJJ6grdIY+Rumy/SL+/U8VCe6PTuDT6+Xr0nMe+NIwhYiB AjS4V4972QvnQf5s2qBIG06SXf0UqqHGa94N5MCgaVo6eLu1VILXFzPD+a32IAVuhaTJ g/IQ== 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 k13si9501253ejq.296.2020.07.13.19.38.56; Mon, 13 Jul 2020 19:39:19 -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 S1726767AbgGNCil (ORCPT + 99 others); Mon, 13 Jul 2020 22:38:41 -0400 Received: from mail-qk1-f193.google.com ([209.85.222.193]:37902 "EHLO mail-qk1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726150AbgGNCik (ORCPT ); Mon, 13 Jul 2020 22:38:40 -0400 Received: by mail-qk1-f193.google.com with SMTP id e13so14338027qkg.5 for ; Mon, 13 Jul 2020 19:38:39 -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=aLJKGhiT24jFn5bdFjl0Bt69kYs80uYBlHCplcAgbAg=; b=BOg3oHgerH0GOc9V1UJ4i/Br0UAYsjN+tF7J0NgQcUurylRFItPbR+zbCkhQRa0tdf ANe29aCkTxF2Ft9lA0hjmICJV5IQwA3FE2Jb+Bq14bD7nkW0qJoPBuxWmtmeGRAz+8jI FfYKjjQUHVVBxcreyeX69VHYmHmZcoyUc5JrztKiDtfd1COEsZ7pWiX18FKbjLfs+iqs 8CP7RWp3OID7Ivy0VZrgbKKnDf1x2IjSvYjZ1U2hoAT0hMQ6QeTsQySIOksSR1UBRYRQ pb9PAhCsguH/M/eCiiNzYbL40v2XO2a5simwx6xjd3wVQHAC5CqBkZVt+ZuaCe61viej 1CnA== X-Gm-Message-State: AOAM530WRKIIZsILDLDWtnr5LO00Bj+Vw/R2ILpxuBsPTlX4eBjHyJPB YZg2tvpS4Z0KbApnO9cs/48= X-Received: by 2002:a37:7d86:: with SMTP id y128mr2285057qkc.343.1594694318979; Mon, 13 Jul 2020 19:38:38 -0700 (PDT) Received: from rani.riverdale.lan ([2001:470:1f07:5f3::b55f]) by smtp.gmail.com with ESMTPSA id a22sm21046291qka.64.2020.07.13.19.38.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2020 19:38:38 -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 v4 0/7] x86/boot: Remove runtime relocations from compressed kernel Date: Mon, 13 Jul 2020 22:38:29 -0400 Message-Id: <20200714023836.2310569-1-nivedita@alum.mit.edu> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200629140928.858507-1-nivedita@alum.mit.edu> References: <20200629140928.858507-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 The compressed kernel currently contains bogus runtime relocations in the startup code in head_{32,64}.S, which are generated by the linker, but must not actually be processed at runtime. This generates warnings when linking with the BFD linker, and errors with LLD, which defaults to erroring on runtime relocations in read-only sections. It also requires the -z noreloc-overflow hack for the 64-bit kernel, which prevents us from linking it as -pie on an older BFD linker (<= 2.26) or on LLD, because the locations that are to be apparently relocated are only 32-bits in size and so cannot really have R_X86_64_RELATIVE relocations. This series aims to get rid of these relocations. I've build- and boot-tested with combinations of clang/gcc-10 with lld/bfd-2.34, and gcc-4.9.0 with bfd-2.24, skipping clang on 32-bit because it currently has other issues [0]. The first three patches by Ard remove indirection via the GOT from the compressed kernel code. The next patch is an independent fix for LLD, to avoid an orphan section in arch/x86/boot/setup.elf. The fifth patch gets rid of almost all the relocations. It uses standard PIC addressing technique for 32-bit, i.e. loading a register with the address of _GLOBAL_OFFSET_TABLE_ and then using GOTOFF references to access variables. For 64-bit, there is 32-bit code that cannot use RIP-relative addressing, and also cannot use the 32-bit method, since GOTOFF references are 64-bit only. This is instead handled using a macro to replace a reference like gdt with (gdt-startup_32) instead. The assembler will generate a PC32 relocation entry, with addend set to (.-startup_32), and these will be replaced with constants at link time. This works as long as all the code using such references lives in the same section as startup_32, i.e. in .head.text. The sixth patch addresses a remaining issue with the BFD linker, which generates runtime relocations for absolute symbols. We use z_input_len and z_output_len, defined in the generated piggy.S file, as symbols whose absolute "addresses" are actually the size of the compressed payload and the size of the decompressed kernel image respectively. LLD does not generate relocations for these two symbols, but the BFD linker does, prior to the upcoming 2.35. To get around this, piggy.S is extended to also define two u32 variables (in .rodata) with the lengths, and the head code is modified to use those instead of the symbol addresses. An alternative way to handle z_input_len/z_output_len would be to just include piggy.S in head_{32,64}.S instead of as a separate object file, since the GNU assembler doesn't generate relocations for symbols set to constants. The last patch adds a check in the linker script to ensure that no runtime relocations get reintroduced. [0] https://lore.kernel.org/lkml/20200504230309.237398-1-ndesaulniers@google.com/ Changes from v3: - Move hidden.h to include/linux so the EFI stub and the compressed kernel can share the same file Changes from v2: - Incorporate Ard's patches for eliminating GOT references into this series - Rebase on v5.8-rc3 v2: https://lore.kernel.org/lkml/20200525225918.1624470-1-nivedita@alum.mit.edu/ Changes from v1: - Add .text.* to setup.ld instead of just .text.startup - Rename the la() macro introduced in the second patch for 64-bit to rva(), and rework the explanatory comment. - In the last patch, check both .rel.dyn and .rela.dyn, instead of just one per arch. Ard Biesheuvel (3): x86/boot/compressed: Move .got.plt entries out of the .got section x86/boot/compressed: Force hidden visibility for all symbol references x86/boot/compressed: Get rid of GOT fixup code Arvind Sankar (4): x86/boot: Add .text.* to setup.ld x86/boot: Remove run-time relocations from .head.text code x86/boot: Remove runtime relocations from head_{32,64}.S x86/boot: Check that there are no runtime relocations arch/x86/boot/compressed/Makefile | 37 +----- arch/x86/boot/compressed/head_32.S | 99 +++++---------- arch/x86/boot/compressed/head_64.S | 165 ++++++++++--------------- arch/x86/boot/compressed/mkpiggy.c | 6 + arch/x86/boot/compressed/vmlinux.lds.S | 24 +++- arch/x86/boot/setup.ld | 2 +- drivers/firmware/efi/libstub/Makefile | 2 +- drivers/firmware/efi/libstub/hidden.h | 6 - include/linux/hidden.h | 19 +++ 9 files changed, 152 insertions(+), 208 deletions(-) delete mode 100644 drivers/firmware/efi/libstub/hidden.h create mode 100644 include/linux/hidden.h base-commit: 11ba468877bb23f28956a35e896356252d63c983 -- 2.26.2