summaryrefslogtreecommitdiffstats
path: root/arch/i386/kernel/trampoline.S
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-01-07 02:33:00 +0000
committer <ralf@linux-mips.org>1997-01-07 02:33:00 +0000
commitbeb116954b9b7f3bb56412b2494b562f02b864b1 (patch)
tree120e997879884e1b9d93b265221b939d2ef1ade1 /arch/i386/kernel/trampoline.S
parent908d4681a1dc3792ecafbe64265783a86c4cccb6 (diff)
Import of Linux/MIPS 2.1.14
Diffstat (limited to 'arch/i386/kernel/trampoline.S')
-rw-r--r--arch/i386/kernel/trampoline.S74
1 files changed, 74 insertions, 0 deletions
diff --git a/arch/i386/kernel/trampoline.S b/arch/i386/kernel/trampoline.S
new file mode 100644
index 000000000..29bcc9040
--- /dev/null
+++ b/arch/i386/kernel/trampoline.S
@@ -0,0 +1,74 @@
+!
+! 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__
+#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
+ 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
+
+gdt:
+ .word 0,0,0,0 ! dummy
+
+ .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
+
+ .word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
+ .word 0x0000 ! base address=0
+ .word 0x9200 ! data read/write
+ .word 0x00C0 ! granularity=4096, 386
+
+idt_48:
+ .word 0 ! idt limit=0
+ .word 0,0 ! idt base=0L
+
+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
+