patch-1.3.31 linux/arch/i386/kernel/trampoline.S
Next file: linux/arch/i386/kernel/trampoline32.S
Previous file: linux/arch/i386/kernel/time.c
Back to the patch index
Back to the overall index
- Lines: 76
- Date:
Mon Oct 2 14:25:10 1995
- Orig file:
v1.3.30/linux/arch/i386/kernel/trampoline.S
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v1.3.30/linux/arch/i386/kernel/trampoline.S linux/arch/i386/kernel/trampoline.S
@@ -0,0 +1,75 @@
+!
+! 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 <linux/config.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
+ 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
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this