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

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