Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp3829585ybf; Tue, 3 Mar 2020 13:42:50 -0800 (PST) X-Google-Smtp-Source: ADFU+vv0Fnx+OUoJR0qG5yC6X5RAXYTrlmUS8hrSD2D0JHrTRZ+Zf0VyI2kSDzzQukYYZptX74+t X-Received: by 2002:aca:4587:: with SMTP id s129mr426493oia.124.1583271770475; Tue, 03 Mar 2020 13:42:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583271770; cv=none; d=google.com; s=arc-20160816; b=KM5cVFmtNIN/fdxDnN/r5bLVf7MQlNjf0XaJtiref9Qtk3T6lI59QhMXEbSe2NdS0F kKIrd0a0pdbiWxbnvlRYJkjkZC+Rvk6ABpS65Q2Wc3oOCoOqRwlhHXKt4ugg7164laaT nBxseSIagLCO1TusEmL0DX4DVu/a9N0WSlkpt8xYRCJYKNTpZOOyxyflFHk5LrnpPVZ3 9NmVFZ6zg+1XBvGU4+a0CHbZDC/nI1HHX0Zg08h6M0zJYxAhwZnqmGAeHWwVqoQ5Xxhu kIoFpGhUCtJuyB4ttxXJrqlT5K7imoSiws4FvfABDKvkeMYpgU/Nuj+pAoRKKFGGab2k qCig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=O5kvtBeMwIy89t5uZh0VuPrhVoYA1mMKecky2dOqgH8=; b=iH0FLeDBQIu4LDvs1pNdpNLzhGeBxCZXSYDK7ZFoOQfN2JLZU/YIad6gaRCRUaEdM2 lvij25fpUdindqlSFekrx6DOyP/YAat+4uoWGZEi6+fb6ftNniZlBXiPJldm8y2LSBoF uZETKq33Qe0pQ8am9IP4RNQKbyQHsnAnNLAcgZDxFdk6J0iwqYwv2ebrNtRxXgNPUoq5 wDcXSzmkQFk6l17gnt2zVajL7ck4PDW8YX5PPeUIqWONOBhvzPMLodo/mspHahXIuVJT NaJ2C+j1yVNrzPdgnjI99BqUjYVYpenzaFnzRwokI8o+MF/eWpzpzePAT+ZgUyZi5mJI bMPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ROtWiJZA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c14si9100717otn.118.2020.03.03.13.42.39; Tue, 03 Mar 2020 13:42:50 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ROtWiJZA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730603AbgCCTPn (ORCPT + 99 others); Tue, 3 Mar 2020 14:15:43 -0500 Received: from mail.kernel.org ([198.145.29.99]:48012 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729575AbgCCTPn (ORCPT ); Tue, 3 Mar 2020 14:15:43 -0500 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AFF99208C3 for ; Tue, 3 Mar 2020 19:15:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583262942; bh=X9Yf9HU7bkYdwj/Oz/QtiPCpUgJ6zgCXdNdmoiqJdzA=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=ROtWiJZAW/6zcuOTKjy2SASVcdmt8Eyi5gyFgjkybCGd6Ru26ZqGxI+qe0QdkMloO PoNenKQYecdKBZ/kzE7UA/9fiyjRGx28Z/MEl8BaQNWDv8qbzIAw11N87JIaonhkr3 kwvUQepixpL1gYSb3dxKqSbGyf/Ho9ajmWEEVVPg= Received: by mail-wr1-f52.google.com with SMTP id v4so5848382wrs.8 for ; Tue, 03 Mar 2020 11:15:41 -0800 (PST) X-Gm-Message-State: ANhLgQ2sXoVrXPH3PoyR9dM/XeuucrvqktyxxctECdn86WQEbub25rlV QghVuA3V19VKJAPGTrmVGxQtbYprboU4sUrnxl0+sA== X-Received: by 2002:a05:6000:110b:: with SMTP id z11mr6969832wrw.252.1583262940064; Tue, 03 Mar 2020 11:15:40 -0800 (PST) MIME-Version: 1.0 References: <20200301230537.2247550-1-nivedita@alum.mit.edu> <20200301230537.2247550-6-nivedita@alum.mit.edu> In-Reply-To: <20200301230537.2247550-6-nivedita@alum.mit.edu> From: Ard Biesheuvel Date: Tue, 3 Mar 2020 20:15:29 +0100 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 5/5] efi/x86: Don't relocate the kernel unless necessary To: Arvind Sankar Cc: linux-efi , "the arch/x86 maintainers" , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 2 Mar 2020 at 00:05, Arvind Sankar wrote: > > Add alignment slack to the PE image size, so that we can realign the > decompression buffer within the space allocated for the image. > > Only relocate the kernel if it has been loaded at an unsuitable address: > * Below LOAD_PHYSICAL_ADDR, or > * Above 64T for 64-bit and 512MiB for 32-bit > > For 32-bit, the upper limit is conservative, but the exact limit can be > difficult to calculate. > > Signed-off-by: Arvind Sankar > --- > arch/x86/boot/tools/build.c | 16 ++++++---------- > drivers/firmware/efi/libstub/x86-stub.c | 22 +++++++++++++++++++--- > 2 files changed, 25 insertions(+), 13 deletions(-) > > diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c > index 3d03ad753ed5..db528961c283 100644 > --- a/arch/x86/boot/tools/build.c > +++ b/arch/x86/boot/tools/build.c > @@ -238,21 +238,17 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz, > > pe_header = get_unaligned_le32(&buf[0x3c]); > > -#ifdef CONFIG_EFI_MIXED > /* > - * In mixed mode, we will execute startup_32() at whichever offset in > - * memory it happened to land when the PE/COFF loader loaded the image, > - * which may be misaligned with respect to the kernel_alignment field > - * in the setup header. > + * The PE/COFF loader may load the image at an address which is > + * misaligned with respect to the kernel_alignment field in the setup > + * header. > * > - * In order for startup_32 to safely execute in place at this offset, > - * we need to ensure that the CONFIG_PHYSICAL_ALIGN aligned allocation > - * it creates for the page tables does not extend beyond the declared > - * size of the image in the PE/COFF header. So add the required slack. > + * In order to avoid relocating the kernel to correct the misalignment, > + * add slack to allow the buffer to be aligned within the declared size > + * of the image. > */ > bss_sz += CONFIG_PHYSICAL_ALIGN; > init_sz += CONFIG_PHYSICAL_ALIGN; > -#endif > > /* > * Size of code: Subtract the size of the first sector (512 bytes) > diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c > index 0c4a6352cfd3..957feeacdd8f 100644 > --- a/drivers/firmware/efi/libstub/x86-stub.c > +++ b/drivers/firmware/efi/libstub/x86-stub.c > @@ -717,6 +717,7 @@ unsigned long efi_main(efi_handle_t handle, > struct boot_params *boot_params) > { > unsigned long bzimage_addr = (unsigned long)startup_32; > + unsigned long buffer_start, buffer_end; > struct setup_header *hdr = &boot_params->hdr; > efi_status_t status; > unsigned long cmdline_paddr; > @@ -728,10 +729,25 @@ unsigned long efi_main(efi_handle_t handle, > efi_exit(handle, EFI_INVALID_PARAMETER); > > /* > - * If the kernel isn't already loaded at the preferred load > - * address, relocate it. > + * If the kernel isn't already loaded at a suitable address, > + * relocate it. > + * It must be loaded above LOAD_PHYSICAL_ADDR. > + * The maximum address for 64-bit is 1 << 46 for 4-level paging. > + * For 32-bit, the maximum address is complicated to figure out, for > + * now use KERNEL_IMAGE_SIZE, which will be 512MiB, the same as what > + * KASLR uses. > + * Also relocate it if image_offset is zero, i.e. we weren't loaded by > + * LoadImage, but we are not aligned correctly. > */ > - if (bzimage_addr - image_offset != hdr->pref_address) { > + buffer_start = ALIGN(bzimage_addr - image_offset, > + hdr->kernel_alignment); > + buffer_end = buffer_start + hdr->init_size; > + > + if (buffer_start < LOAD_PHYSICAL_ADDR > + || IS_ENABLED(CONFIG_X86_32) && buffer_end > KERNEL_IMAGE_SIZE > + || IS_ENABLED(CONFIG_X86_64) && buffer_end > 1ull << 46 > + || image_offset == 0 && !IS_ALIGNED(bzimage_addr, > + hdr->kernel_alignment)) { Could you please - put the || at the end - put () around the terms - add a #define for 1ull << 46 > status = efi_relocate_kernel(&bzimage_addr, > hdr->init_size, hdr->init_size, > hdr->pref_address, > -- > 2.24.1 >