diff options
Diffstat (limited to 'arch/x86/kernel/trampoline.c')
| -rw-r--r-- | arch/x86/kernel/trampoline.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/arch/x86/kernel/trampoline.c b/arch/x86/kernel/trampoline.c index 1106fac6024d..808031a5ba19 100644 --- a/arch/x86/kernel/trampoline.c +++ b/arch/x86/kernel/trampoline.c | |||
| @@ -1,10 +1,26 @@ | |||
| 1 | #include <linux/io.h> | 1 | #include <linux/io.h> |
| 2 | 2 | ||
| 3 | #include <asm/trampoline.h> | 3 | #include <asm/trampoline.h> |
| 4 | #include <asm/e820.h> | ||
| 4 | 5 | ||
| 5 | /* ready for x86_64 and x86 */ | 6 | /* ready for x86_64 and x86 */ |
| 6 | unsigned char *trampoline_base = __va(TRAMPOLINE_BASE); | 7 | unsigned char *trampoline_base = __va(TRAMPOLINE_BASE); |
| 7 | 8 | ||
| 9 | void __init reserve_trampoline_memory(void) | ||
| 10 | { | ||
| 11 | #ifdef CONFIG_X86_32 | ||
| 12 | /* | ||
| 13 | * But first pinch a few for the stack/trampoline stuff | ||
| 14 | * FIXME: Don't need the extra page at 4K, but need to fix | ||
| 15 | * trampoline before removing it. (see the GDT stuff) | ||
| 16 | */ | ||
| 17 | reserve_early(PAGE_SIZE, PAGE_SIZE + PAGE_SIZE, "EX TRAMPOLINE"); | ||
| 18 | #endif | ||
| 19 | /* Has to be in very low memory so we can execute real-mode AP code. */ | ||
| 20 | reserve_early(TRAMPOLINE_BASE, TRAMPOLINE_BASE + TRAMPOLINE_SIZE, | ||
| 21 | "TRAMPOLINE"); | ||
| 22 | } | ||
| 23 | |||
| 8 | /* | 24 | /* |
| 9 | * Currently trivial. Write the real->protected mode | 25 | * Currently trivial. Write the real->protected mode |
| 10 | * bootstrap into the page concerned. The caller | 26 | * bootstrap into the page concerned. The caller |
| @@ -12,7 +28,6 @@ unsigned char *trampoline_base = __va(TRAMPOLINE_BASE); | |||
| 12 | */ | 28 | */ |
| 13 | unsigned long setup_trampoline(void) | 29 | unsigned long setup_trampoline(void) |
| 14 | { | 30 | { |
| 15 | memcpy(trampoline_base, trampoline_data, | 31 | memcpy(trampoline_base, trampoline_data, TRAMPOLINE_SIZE); |
| 16 | trampoline_end - trampoline_data); | ||
| 17 | return virt_to_phys(trampoline_base); | 32 | return virt_to_phys(trampoline_base); |
| 18 | } | 33 | } |
