summaryrefslogtreecommitdiffstats
path: root/arch/i386/kernel/trampoline.S
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-04-29 21:13:14 +0000
committer <ralf@linux-mips.org>1997-04-29 21:13:14 +0000
commit19c9bba94152148523ba0f7ef7cffe3d45656b11 (patch)
tree40b1cb534496a7f1ca0f5c314a523c69f1fee464 /arch/i386/kernel/trampoline.S
parent7206675c40394c78a90e74812bbdbf8cf3cca1be (diff)
Import of Linux/MIPS 2.1.36
Diffstat (limited to 'arch/i386/kernel/trampoline.S')
-rw-r--r--arch/i386/kernel/trampoline.S157
1 files changed, 95 insertions, 62 deletions
diff --git a/arch/i386/kernel/trampoline.S b/arch/i386/kernel/trampoline.S
index 29bcc9040..63bc51c5e 100644
--- a/arch/i386/kernel/trampoline.S
+++ b/arch/i386/kernel/trampoline.S
@@ -1,74 +1,107 @@
-!
-! Trampoline.S Derived from Setup.S by Linus Torvalds
-!
-! Entry: CS:IP point to the start of our code, we are
-! in real mode with no stack, but the rest of the
-! trampoline page to make our stack and everything else
-! is a mystery.
-!
-! In fact we don't actually need a stack so we don't
-! set one up.
-!
-! We jump into the boot/compressed/head.S code. So you'd
-! better be running a compressed kernel image or you
-! won't get very far.
-!
-#define __ASSEMBLY__
+/*
+ *
+ * Trampoline.S Derived from Setup.S by Linus Torvalds
+ *
+ * 4 Jan 1997 Michael Chastain: changed to gnu as.
+ *
+ * Entry: CS:IP point to the start of our code, we are
+ * in real mode with no stack, but the rest of the
+ * trampoline page to make our stack and everything else
+ * is a mystery.
+ *
+ * In fact we don't actually need a stack so we don't
+ * set one up.
+ *
+ * We jump into the boot/compressed/head.S code. So you'd
+ * better be running a compressed kernel image or you
+ * won't get very far.
+ *
+ * On entry to trampoline_data, the processor is in real mode
+ * with 16-bit addressing and 16-bit data. CS has some value
+ * and IP is zero. Thus, data addresses need to be absolute
+ * (no relocation) and are taken with regard to r_base.
+ *
+ * On the transition to protected mode, this page appears at
+ * address 8192, so protected mode addresses are with regard
+ * to p_base.
+ *
+ * If you work on this file, check the object module with objdump
+ * --full-contents --reloc to make sure there are no relocation
+ * entries.
+ */
+
+#include <linux/linkage.h>
#include <asm/segment.h>
-.text
- extrn startup32
-
-entry start
-start:
-! nop
-! jmp start ! Test
- mov ax,cs ! Code and data in the same place
- mov ds,ax !
- mov cx,ax ! Pass stack info to the 32bit boot
- add cx,cx
- add cx,cx
- add cx,cx
- add cx,cx ! Segment -> Offset
- add cx, #4096 ! End of page is wanted
- mov bx,#1 ! Flag an SMP trampoline
- cli ! We should be safe anyway
-
- lidt idt_48 ! load idt with 0,0
- lgdt gdt_48 ! load gdt with whatever is appropriate
-
- xor ax,ax
- inc ax ! protected mode (PE) bit
- lmsw ax ! Into protected mode
+.data
+
+.code16
+
+ENTRY(trampoline_data)
+r_base = .
+p_base = . - 8192
+
+ mov %cs, %ax # Code and data in the same place
+ mov %ax, %ds
+
+ mov %ax, %cx # Pass stack info to the 32bit boot
+ shl $4, %cx # Segment -> Offset
+ add $4096, %cx # End of page is wanted
+
+ mov $1, %bx # Flag an SMP trampoline
+ cli # We should be safe anyway
+
+ movl $0xA5A5A5A5, trampoline_data - r_base
+ # write marker for master knows we're running
+
+ lidt idt_48 - r_base # load idt with 0, 0
+ lgdt gdt_48 - r_base # load gdt with whatever is appropriate
+
+ xor %ax, %ax
+ inc %ax # protected mode (PE) bit
+ lmsw %ax # into protected mode
jmp flush_instr
flush_instr:
- jmpi 8192+startup32,KERNEL_CS ! Jump to the 32bit trampoline code
-! jmpi 0x100000,KERNEL_CS ! Jump into the 32bit startup
-! .byte 0x66,0x67 ! 32bit
-! .byte 0xea,0x00,0x00,0x10,0x00,0x10,0x00 !jmpi .0x100000,KERNEL_CS
+ ljmp $KERNEL_CS, $0x00100000
+ # jump to startup_32
+
+idt_48:
+ .word 0 # idt limit = 0
+ .word 0, 0 # idt base = 0L
+gdt_48:
+ .word 0x0800 # gdt limit = 2048, 256 GDT entries
+ .word gdt - p_base, 0x0 # gdt base = gdt (first SMP CPU)
+ # we load the others with first table
+ # saves rewriting gdt_48 for each
gdt:
- .word 0,0,0,0 ! dummy
+ .word 0, 0, 0, 0 # dummy
- .word 0,0,0,0 ! unused
+ .word 0, 0, 0, 0 # unused
- .word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
- .word 0x0000 ! base address=0
- .word 0x9A00 ! code read/exec
- .word 0x00C0 ! granularity=4096, 386
+# walken modif
- .word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
- .word 0x0000 ! base address=0
- .word 0x9200 ! data read/write
- .word 0x00C0 ! granularity=4096, 386
+ .word 0xFFFF # 4 Gb - (0x100000*0x1000 = 4Gb)
+ .word 0x0000 # base address = 0
+ .word 0x9A00 # code read / exec
+ .word 0x00CF # granularity = 4096, 386 (+5th nibble of limit)
-idt_48:
- .word 0 ! idt limit=0
- .word 0,0 ! idt base=0L
+ .word 0xFFFF # 4 Gb - (0x100000*0x1000 = 4Gb)
+ .word 0x0000 # base address = 0
+ .word 0x9200 # data read / write
+ .word 0x00CF # granularity = 4096, 386 (+5th nibble of limit)
-gdt_48:
- .word 0x800 ! gdt limit=2048, 256 GDT entries
- .word 8192+gdt,0x0 ! gdt base = 8192+gdt (first SMP CPU)
- ! we load the others with the first table
- ! saves rewriting gdt_48 for each
+# walken modif
+
+# .word 0x07FF # 8 Mb - limit = 2047 (2048 * 4096 = 8 Mb)
+# .word 0x0000 # base address = 0
+# .word 0x9A00 # code read / exec
+# .word 0x00C0 # granularity = 4096, 386
+
+# .word 0x07FF # 8 Mb - limit = 2047 (2048 * 4096 = 8 Mb)
+# .word 0x0000 # base address = 0
+# .word 0x9200 # data read / write
+# .word 0x00C0 # granularity = 4096, 386
+.globl SYMBOL_NAME(trampoline_end)
+SYMBOL_NAME_LABEL(trampoline_end)