summaryrefslogtreecommitdiffstats
path: root/arch/x86/realmode
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2012-05-16 22:44:10 +0200
committerH. Peter Anvin <hpa@linux.intel.com>2012-05-16 22:44:10 +0200
commit51edbe6a2f47c78c6c6e529999ee0a044fe59a89 (patch)
tree8e68fcbac877e409e04596e97f6868d7db8f3fe2 /arch/x86/realmode
parentx86, realmode: Mask out EFER.LMA when saving trampoline EFER (diff)
downloadlinux-51edbe6a2f47c78c6c6e529999ee0a044fe59a89.tar.xz
linux-51edbe6a2f47c78c6c6e529999ee0a044fe59a89.zip
x86, realmode: Move not-common bits out of trampoline_common.S
Move the bits that aren't actually common out of trampoline_common.S and into the arch-specific files. Furthermore, make sure the page directory is first in the .bss section for trampoline_64.S in order to not waste an entire page of memory. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Cc: Jarkko Sakkinen <jarkko.sakkinen@intel.com>
Diffstat (limited to 'arch/x86/realmode')
-rw-r--r--arch/x86/realmode/rm/trampoline_32.S8
-rw-r--r--arch/x86/realmode/rm/trampoline_64.S25
-rw-r--r--arch/x86/realmode/rm/trampoline_common.S35
3 files changed, 33 insertions, 35 deletions
diff --git a/arch/x86/realmode/rm/trampoline_32.S b/arch/x86/realmode/rm/trampoline_32.S
index 6fc064b4d2b9..c1b2791183e7 100644
--- a/arch/x86/realmode/rm/trampoline_32.S
+++ b/arch/x86/realmode/rm/trampoline_32.S
@@ -63,4 +63,12 @@ ENTRY(trampoline_start)
ENTRY(startup_32) # note: also used from wakeup_asm.S
jmp *%eax
+ .bss
+ .balign 8
+GLOBAL(trampoline_header)
+ tr_start: .space 4
+ tr_gdt_pad: .space 2
+ tr_gdt: .space 6
+END(trampoline_header)
+
#include "trampoline_common.S"
diff --git a/arch/x86/realmode/rm/trampoline_64.S b/arch/x86/realmode/rm/trampoline_64.S
index 66e26f088288..1b9e1bc1ac5e 100644
--- a/arch/x86/realmode/rm/trampoline_64.S
+++ b/arch/x86/realmode/rm/trampoline_64.S
@@ -125,4 +125,29 @@ ENTRY(startup_64)
# Now jump into the kernel using virtual addresses
jmpq *tr_start(%rip)
+ .section ".rodata","a"
+ # Duplicate the global descriptor table
+ # so the kernel can live anywhere
+ .balign 16
+ .globl tr_gdt
+tr_gdt:
+ .short tr_gdt_end - tr_gdt - 1 # gdt limit
+ .long pa_tr_gdt
+ .short 0
+ .quad 0x00cf9b000000ffff # __KERNEL32_CS
+ .quad 0x00af9b000000ffff # __KERNEL_CS
+ .quad 0x00cf93000000ffff # __KERNEL_DS
+tr_gdt_end:
+
+ .bss
+ .balign PAGE_SIZE
+GLOBAL(trampoline_pgd) .space PAGE_SIZE
+
+ .balign 8
+GLOBAL(trampoline_header)
+ tr_start: .space 8
+ GLOBAL(tr_cr4) .space 4
+ GLOBAL(tr_efer) .space 8
+END(trampoline_header)
+
#include "trampoline_common.S"
diff --git a/arch/x86/realmode/rm/trampoline_common.S b/arch/x86/realmode/rm/trampoline_common.S
index cac444b942f8..b1ecdb9692ad 100644
--- a/arch/x86/realmode/rm/trampoline_common.S
+++ b/arch/x86/realmode/rm/trampoline_common.S
@@ -1,42 +1,7 @@
.section ".rodata","a"
-
-#ifdef CONFIG_X86_64
- # Duplicate the global descriptor table
- # so the kernel can live anywhere
.balign 16
- .globl tr_gdt
-tr_gdt:
- .short tr_gdt_end - tr_gdt - 1 # gdt limit
- .long pa_tr_gdt
- .short 0
- .quad 0x00cf9b000000ffff # __KERNEL32_CS
- .quad 0x00af9b000000ffff # __KERNEL_CS
- .quad 0x00cf93000000ffff # __KERNEL_DS
-tr_gdt_end:
-#endif
-
- .balign 4
tr_idt: .fill 1, 6, 0
.bss
-
.balign 4
GLOBAL(trampoline_status) .space 4
-
- .balign 8
-GLOBAL(trampoline_header)
-#ifdef CONFIG_X86_32
- tr_start: .space 4
- tr_gdt_pad: .space 2
- tr_gdt: .space 6
-#else
- tr_start: .space 8
- GLOBAL(tr_cr4) .space 4
- GLOBAL(tr_efer) .space 8
-#endif
-END(trampoline_header)
-
-#ifdef CONFIG_X86_64
- .balign PAGE_SIZE
-GLOBAL(trampoline_pgd) .space PAGE_SIZE
-#endif