mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 03:27:30 -04:00
x86/realmode: Make the location of the trampoline configurable
x86 CPUs boot in real mode. This mode uses a 1MB address space. The trampoline must reside below this 1MB memory boundary. There are platforms in which the firmware boots the secondary CPUs, switches them to long mode and transfers control to the kernel. An example of such a mechanism is the ACPI Multiprocessor Wakeup Structure. In this scenario there is no restriction on locating the trampoline under 1MB memory. Moreover, certain platforms (for example, Hyper-V VTL guests) may not have memory available for allocation below 1MB. Add a new member to struct x86_init_resources to specify the upper bound for the location of the trampoline memory. Preserve the default upper bound of 1MB to conserve the current behavior. Reviewed-by: Dexuan Cui <decui@microsoft.com> Reviewed-by: Michael Kelley <mhklinux@outlook.com> Originally-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Yunhong Jiang <yunhong.jiang@linux.intel.com> Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> Signed-off-by: Dexuan Cui <dexuan@kernel.org>
This commit is contained in:
committed by
Dexuan Cui
parent
7e4c083ece
commit
a7ac1ea1f0
@@ -31,12 +31,15 @@ struct x86_init_mpparse {
|
||||
* platform
|
||||
* @memory_setup: platform specific memory setup
|
||||
* @dmi_setup: platform specific DMI setup
|
||||
* @realmode_limit: platform specific address limit for the real mode trampoline
|
||||
* (default 1M)
|
||||
*/
|
||||
struct x86_init_resources {
|
||||
void (*probe_roms)(void);
|
||||
void (*reserve_resources)(void);
|
||||
char *(*memory_setup)(void);
|
||||
void (*dmi_setup)(void);
|
||||
unsigned long realmode_limit;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/bios_ebda.h>
|
||||
@@ -69,6 +70,8 @@ struct x86_init_ops x86_init __initdata = {
|
||||
.reserve_resources = reserve_standard_io_resources,
|
||||
.memory_setup = e820__memory_setup_default,
|
||||
.dmi_setup = dmi_setup,
|
||||
/* Has to be under 1M so we can execute real-mode AP code. */
|
||||
.realmode_limit = SZ_1M,
|
||||
},
|
||||
|
||||
.mpparse = {
|
||||
|
||||
@@ -46,7 +46,7 @@ void load_trampoline_pgtable(void)
|
||||
|
||||
void __init reserve_real_mode(void)
|
||||
{
|
||||
phys_addr_t mem;
|
||||
phys_addr_t mem, limit = x86_init.resources.realmode_limit;
|
||||
size_t size = real_mode_size_needed();
|
||||
|
||||
if (!size)
|
||||
@@ -54,10 +54,9 @@ void __init reserve_real_mode(void)
|
||||
|
||||
WARN_ON(slab_is_available());
|
||||
|
||||
/* Has to be under 1M so we can execute real-mode AP code. */
|
||||
mem = memblock_phys_alloc_range(size, PAGE_SIZE, 0, 1<<20);
|
||||
mem = memblock_phys_alloc_range(size, PAGE_SIZE, 0, limit);
|
||||
if (!mem)
|
||||
pr_info("No sub-1M memory is available for the trampoline\n");
|
||||
pr_info("No memory below %pa for the real-mode trampoline\n", &limit);
|
||||
else
|
||||
set_real_mode_mem(mem);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user