From patchwork Thu Nov 29 23:47:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Graf X-Patchwork-Id: 152473 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp3007953ljp; Thu, 29 Nov 2018 15:47:59 -0800 (PST) X-Google-Smtp-Source: AFSGD/VVooxV/oOC1FF0Ai6L2qWO0SXOnYF68w9om7LznwyKI+BDWXa+SPY+Kfb3aA5IVsHjQ7/C X-Received: by 2002:a50:a415:: with SMTP id u21mr3194218edb.244.1543535279672; Thu, 29 Nov 2018 15:47:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543535279; cv=none; d=google.com; s=arc-20160816; b=0ZAjVgWwQJW0XXlACJgvT0GQgk8ENvkKRedvU36Uw3JE1heR4NAf73ibM5o34pHs35 Ni/vPNeDmhW67dElBGvZ6bUkgPNBZFg4mLSoC2dB/Cy00u2V309kobhgOQ9xLcSG8BNa BR2UPRQLyGOegdlTXGtLQ1Vok0HH0DZhc/UvOf2Q/eBQNCddxsCQ4gozJWngjB+5Mhf0 C+DC6qklGletC1xgQKopMbKzxsmFDyxyD1XF8KC3Fj0VHR1KmPp3q3DdZq/pLN8r/pTK khmWHsTDEeUWOS2O6QrCKxH9A35sNi5yLRHZzkP+ne1rZ5mkEFXvnQ+UkC6UQgww64a7 MHrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:cc:message-id:date:to:from; bh=zfoSBA1dKwCWxhtimX1d7LqR9VgwXDvxH5uPVbphn+k=; b=EwGeGIzsShYmsReWxEO0taPt0UbqMxeY6HyRrZBu0r12n18Dl3pPRcjetUaxUz6Jev AViMKNXUAHnzAhbcln1hJGGJGQhLpSamt6zJh9LMFFtfFtkQcA51HmxfAdUsyvq3WEvq a5X6VEL3aQ6yD+newX2JLKlP6x4vxQC41JKrPUFbAEHas5MF4jEaTdTPSLa86MJI5Sgw jYa3wc3yYQc/yLs7GulBzMvavJ3+O6FHOpTS7pud/0oIoEW+6HAeml5G0lHwkeXNak/A yWdBwWXUgh2KdLmf5yhnGbn7rB8l6eW43MuBcv6TtkpMtljJNtV+6bcLqI1OOAeMv8d1 GcUw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Return-Path: Received: from lists.denx.de (dione.denx.de. [81.169.180.215]) by mx.google.com with ESMTP id f27si1651528edd.387.2018.11.29.15.47.58; Thu, 29 Nov 2018 15:47:59 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) client-ip=81.169.180.215; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by lists.denx.de (Postfix, from userid 105) id A5808C2214A; Thu, 29 Nov 2018 23:47:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_DNSWL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id E4C24C21E36; Thu, 29 Nov 2018 23:47:54 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 34EEAC21E36; Thu, 29 Nov 2018 23:47:53 +0000 (UTC) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) by lists.denx.de (Postfix) with ESMTPS id D51BAC21E1E for ; Thu, 29 Nov 2018 23:47:52 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 3790EAECC; Thu, 29 Nov 2018 23:47:52 +0000 (UTC) From: Alexander Graf To: u-boot@lists.denx.de Date: Fri, 30 Nov 2018 00:47:51 +0100 Message-Id: <20181129234751.64224-1-agraf@suse.de> X-Mailer: git-send-email 2.12.3 Cc: Baruch Siach , Prafulla Wadaskar , Luka Perkov , Heinrich Schuchardt , Yazan Shhady , Stefan Roese Subject: [U-Boot] [PATCH] efi_loader: Reserve unaccessible memory X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" On some systems, not all RAM may be usable within U-Boot. Maybe the memory maps are incomplete, maybe it's used as workaround for broken DMA. But whatever the reason may be, a platform can say that it does not wish to have its RAM accessed above a certain address by defining board_get_usable_ram_top(). In the efi_loader world, we ignored that hint, mostly because very few boards actually have real restrictions around this. So let's honor the board's wish to not access high addresses during boot time. The best way to do so is by indicating the respective pages as "allocated by firmware". That way, Operating Systems will still use the pages after boot, but before boot no allocation will use them. Reported-by: Baruch Siach Signed-off-by: Alexander Graf --- include/common.h | 11 +++++++++++ lib/efi_loader/efi_memory.c | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/include/common.h b/include/common.h index 3f69943887..8f295c2f30 100644 --- a/include/common.h +++ b/include/common.h @@ -106,6 +106,17 @@ int mdm_init(void); void board_show_dram(phys_size_t size); /** + * Get the uppermost pointer that is valid to access + * + * Some systems may not map all of their address space. This function allows + * boards to indicate what their highest support pointer value is for DRAM + * access. + * + * @param total_size Size of U-Boot (unused?) + */ +ulong board_get_usable_ram_top(ulong total_size); + +/** * arch_fixup_fdt() - Write arch-specific information to fdt * * Defined in arch/$(ARCH)/lib/bootm-fdt.c diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c index f225a9028c..2f13bf8a75 100644 --- a/lib/efi_loader/efi_memory.c +++ b/lib/efi_loader/efi_memory.c @@ -551,6 +551,7 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size, __weak void efi_add_known_memory(void) { + u64 ram_top = board_get_usable_ram_top(0) & ~EFI_PAGE_MASK; int i; /* Add RAM */ @@ -570,6 +571,14 @@ __weak void efi_add_known_memory(void) efi_add_memory_map(ram_start, pages, EFI_CONVENTIONAL_MEMORY, false); } + + /* Reserve memory above ram_top, as that may not be mapped */ + if ((ram_top >= ram_start) && (ram_top < ram_end)) { + pages = (ram_end - ram_top) >> EFI_PAGE_SHIFT; + + efi_add_memory_map(ram_top, pages, + EFI_BOOT_SERVICES_DATA, true); + } } }