!
|
!
|
! Trampoline.S Derived from Setup.S by Linus Torvalds
|
! Trampoline.S Derived from Setup.S by Linus Torvalds
|
!
|
!
|
! Entry: CS:IP point to the start of our code, we are
|
! Entry: CS:IP point to the start of our code, we are
|
! in real mode with no stack, but the rest of the
|
! in real mode with no stack, but the rest of the
|
! trampoline page to make our stack and everything else
|
! trampoline page to make our stack and everything else
|
! is a mystery.
|
! is a mystery.
|
!
|
!
|
! In fact we don't actually need a stack so we don't
|
! In fact we don't actually need a stack so we don't
|
! set one up.
|
! set one up.
|
!
|
!
|
! We jump into the boot/compressed/head.S code. So you'd
|
! We jump into the boot/compressed/head.S code. So you'd
|
! better be running a compressed kernel image or you
|
! better be running a compressed kernel image or you
|
! won't get very far.
|
! won't get very far.
|
!
|
!
|
#define __ASSEMBLY__
|
#define __ASSEMBLY__
|
#include
|
#include
|
|
|
.text
|
.text
|
extrn startup32
|
extrn startup32
|
|
|
entry start
|
entry start
|
start:
|
start:
|
! nop
|
! nop
|
! jmp start ! Test
|
! jmp start ! Test
|
mov ax,cs ! Code and data in the same place
|
mov ax,cs ! Code and data in the same place
|
mov ds,ax !
|
mov ds,ax !
|
mov cx,ax ! Pass stack info to the 32bit boot
|
mov cx,ax ! Pass stack info to the 32bit boot
|
add cx,cx
|
add cx,cx
|
add cx,cx
|
add cx,cx
|
add cx,cx
|
add cx,cx
|
add cx,cx ! Segment -> Offset
|
add cx,cx ! Segment -> Offset
|
add cx, #4096 ! End of page is wanted
|
add cx, #4096 ! End of page is wanted
|
mov bx,#1 ! Flag an SMP trampoline
|
mov bx,#1 ! Flag an SMP trampoline
|
cli ! We should be safe anyway
|
cli ! We should be safe anyway
|
|
|
lidt idt_48 ! load idt with 0,0
|
lidt idt_48 ! load idt with 0,0
|
lgdt gdt_48 ! load gdt with whatever is appropriate
|
lgdt gdt_48 ! load gdt with whatever is appropriate
|
|
|
xor ax,ax
|
xor ax,ax
|
inc ax ! protected mode (PE) bit
|
inc ax ! protected mode (PE) bit
|
lmsw ax ! Into protected mode
|
lmsw ax ! Into protected mode
|
jmp flush_instr
|
jmp flush_instr
|
flush_instr:
|
flush_instr:
|
jmpi 8192+startup32,KERNEL_CS ! Jump to the 32bit trampoline code
|
jmpi 8192+startup32,KERNEL_CS ! Jump to the 32bit trampoline code
|
! jmpi 0x100000,KERNEL_CS ! Jump into the 32bit startup
|
! jmpi 0x100000,KERNEL_CS ! Jump into the 32bit startup
|
! .byte 0x66,0x67 ! 32bit
|
! .byte 0x66,0x67 ! 32bit
|
! .byte 0xea,0x00,0x00,0x10,0x00,0x10,0x00 !jmpi .0x100000,KERNEL_CS
|
! .byte 0xea,0x00,0x00,0x10,0x00,0x10,0x00 !jmpi .0x100000,KERNEL_CS
|
|
|
gdt:
|
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 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
|
.word 0x0000 ! base address=0
|
.word 0x0000 ! base address=0
|
.word 0x9A00 ! code read/exec
|
.word 0x9A00 ! code read/exec
|
.word 0x00C0 ! granularity=4096, 386
|
.word 0x00C0 ! granularity=4096, 386
|
|
|
.word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
|
.word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
|
.word 0x0000 ! base address=0
|
.word 0x0000 ! base address=0
|
.word 0x9200 ! data read/write
|
.word 0x9200 ! data read/write
|
.word 0x00C0 ! granularity=4096, 386
|
.word 0x00C0 ! granularity=4096, 386
|
|
|
idt_48:
|
idt_48:
|
.word 0 ! idt limit=0
|
.word 0 ! idt limit=0
|
.word 0,0 ! idt base=0L
|
.word 0,0 ! idt base=0L
|
|
|
gdt_48:
|
gdt_48:
|
.word 0x800 ! gdt limit=2048, 256 GDT entries
|
.word 0x800 ! gdt limit=2048, 256 GDT entries
|
.word 8192+gdt,0x0 ! gdt base = 8192+gdt (first SMP CPU)
|
.word 8192+gdt,0x0 ! gdt base = 8192+gdt (first SMP CPU)
|
! we load the others with the first table
|
! we load the others with the first table
|
! saves rewriting gdt_48 for each
|
! saves rewriting gdt_48 for each
|
|
|
|
|