copy of the original trampoline code, needs to be modified as UNDI needes the used address range

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19125 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen 2006-10-25 20:04:46 +00:00
parent 1411be7744
commit 7613b42bcd

View File

@ -0,0 +1,69 @@
/*
** Copyright 2001, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License.
*/
// expects a stack page like this:
// (stack has to be at (0x9e000)
// 0x9effc : final esp
// 0x9eff8 : page dir
//
// 0x9e000 - 0x9e006 : gdt descriptor
// 0x9e008 - 0x9e020 : gdt
//
// smp_trampoline must be located at 0x9f000
.globl smp_trampoline
.globl smp_trampoline_end
.globl foo
.code16
smp_trampoline:
cli
mov $0x9e00,%ax
mov %ax,%ds
// lgdt 0x9e000 # load the gdt
.byte 0x66, 0x0f, 0x01, 0x15, 0x00, 0xe0, 0x09, 0x00
movl %cr0,%eax
orl $0x01,%eax
movl %eax,%cr0 # switch into protected mode
.code32
_trampoline_32:
.byte 0x66
ljmp $0x08,$(trampoline_32 - smp_trampoline + 0x9f000)
trampoline_32:
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov %ax, %ss
movl $0x9eff8,%esp # set up the stack pointer
popl %eax # get the page dir
movl %eax,%cr3 # set the page dir
popl %eax # get the final stack location
movl %eax,%esp
// load an address for an indirect jump
movl $trampoline_after_paging,%ecx
movl %cr0,%eax
orl $0x80000000,%eax
movl %eax,%cr0 # enable paging
// jump to the address previously loaded. NOTE:
// this address is the address at which the code is originally linked,
// which is > 1MB. We will be out of the low memory at this point.
jmp *%ecx
trampoline_after_paging:
// just return, the bsp would have set the return address to the
// target function at the top of the passed stack
ret
smp_trampoline_end: