Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1450964

[PATCH 3/4] x86/boot: Rework reserve_real_mode() to allow multiple tries

From Andy Lutomirski <luto@kernel.org>
Newsgroups linux.kernel
Subject [PATCH 3/4] x86/boot: Rework reserve_real_mode() to allow multiple tries
Date 2016-07-27 01:00 +0200
Message-ID <rZjup-84c-11@gated-at.bofh.it> (permalink)
References <rZjup-84c-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


If reserve_real_mode() fails, panicing immediately means we're
doomed.  Make it safe to try more than once to allocate the
trampoline:

 - Degrade a failure from panic() to pr_info().  (If we make it to
   setup_real_mode() without reserving the trampoline, we'll panic
   them.)

 - Factor out helpers so that platform code can supply a specific
   address to try.

 - Warn if reserve_real_mode() is called after we're done with the
   memblock allocator.  If that were to happen, we would behave
   unpredictably.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
---
 arch/x86/include/asm/realmode.h |  9 +++++++++
 arch/x86/realmode/init.c        | 29 +++++++++++++++++++++--------
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h
index 8d6777724ba4..b2988c0ed829 100644
--- a/arch/x86/include/asm/realmode.h
+++ b/arch/x86/include/asm/realmode.h
@@ -58,6 +58,15 @@ extern unsigned char boot_gdt[];
 extern unsigned char secondary_startup_64[];
 #endif
 
+static inline size_t real_mode_size_needed(void)
+{
+	if (real_mode_header)
+		return 0;	/* already allocated. */
+
+	return ALIGN(real_mode_blob_end - real_mode_blob, PAGE_SIZE);
+}
+
+void set_real_mode_mem(phys_addr_t mem, size_t size);
 void reserve_real_mode(void);
 
 #endif /* _ARCH_X86_REALMODE_H */
diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c
index 747b71e8f547..5db706f14111 100644
--- a/arch/x86/realmode/init.c
+++ b/arch/x86/realmode/init.c
@@ -1,4 +1,5 @@
 #include <linux/io.h>
+#include <linux/slab.h>
 #include <linux/memblock.h>
 
 #include <asm/cacheflush.h>
@@ -12,22 +13,34 @@ u32 *trampoline_cr4_features;
 /* Hold the pgd entry used on booting additional CPUs */
 pgd_t trampoline_pgd_entry;
 
+void __init set_real_mode_mem(phys_addr_t mem, size_t size)
+{
+	void *base = __va(mem);
+
+	real_mode_header = (struct real_mode_header *) base;
+	printk(KERN_DEBUG "Base memory trampoline at [%p] %llx size %zu\n",
+	       base, (unsigned long long)mem, size);
+}
+
 void __init reserve_real_mode(void)
 {
 	phys_addr_t mem;
-	unsigned char *base;
-	size_t size = PAGE_ALIGN(real_mode_blob_end - real_mode_blob);
+	size_t size = real_mode_size_needed();
+
+	if (!size)
+		return;
+
+	WARN_ON(slab_is_available());
 
 	/* Has to be under 1M so we can execute real-mode AP code. */
 	mem = memblock_find_in_range(0, 1<<20, size, PAGE_SIZE);
-	if (!mem)
-		panic("Cannot allocate trampoline\n");
+	if (!mem) {
+		pr_info("No sub-1M memory is available for the trampoline\n");
+		return;
+	}
 
-	base = __va(mem);
 	memblock_reserve(mem, size);
-	real_mode_header = (struct real_mode_header *) base;
-	printk(KERN_DEBUG "Base memory trampoline at [%p] %llx size %zu\n",
-	       base, (unsigned long long)mem, size);
+	set_real_mode_mem(mem, size);
 }
 
 static void __init setup_real_mode(void)
-- 
2.7.4

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 4.8? 0/4] Allow the trampoline to use EFI boot services RAM Andy Lutomirski <luto@kernel.org> - 2016-07-27 01:00 +0200
  [PATCH 4/4] x86/efi: Allocate a trampoline if needed in efi_free_boot_services() Andy Lutomirski <luto@kernel.org> - 2016-07-27 01:00 +0200
    Re: [PATCH 4/4] x86/efi: Allocate a trampoline if needed in  efi_free_boot_services() "H. Peter Anvin" <hpa@zytor.com> - 2016-08-01 07:10 +0200
      Re: [PATCH 4/4] x86/efi: Allocate a trampoline if needed in efi_free_boot_services() Andy Lutomirski <luto@amacapital.net> - 2016-08-02 20:30 +0200
  [PATCH 3/4] x86/boot: Rework reserve_real_mode() to allow multiple tries Andy Lutomirski <luto@kernel.org> - 2016-07-27 01:00 +0200
  Re: [PATCH 4.8? 0/4] Allow the trampoline to use EFI boot services  RAM Matt Fleming <matt@codeblueprint.co.uk> - 2016-07-31 23:40 +0200
    Re: [PATCH 4.8? 0/4] Allow the trampoline to use EFI boot services  RAM Matt Fleming <matt@codeblueprint.co.uk> - 2016-08-04 11:30 +0200

csiph-web