Booting VxWorks from LinuxBios
Christopher Stutts
stutts at innocon.com
Wed Feb 5 11:51:01 CET 2003
Asm part of jump from Linuxbios to vxWorks
-------------- next part --------------
//
// cpmasm.S
//
// Performs real-mode switch and then jump to code copied to flash at 0x800:0.
// (VxWorks startup code expects a 0 offset, so 0:0x8000 is verboten.)
// Mode switch is two part: loading all seg registers with 16-bit segments, then
// jumping to realmode segment. GDT in intel_start32.S contains a 16-bit data segment
// 0x30 & a 16-bit code segment 0x28. 0x28:0 = 0xf0000 physical. The jump to
// 0x28:offset_patch_address requires a far jump with a 16-bit offset, which the assembler
// doesn't do. The offset there fore is patched before we get executed by some C code.
.text
// .code32
.global flashOSBootasm
flashOSBootasm:
//Load all data segment regs with a 16-bit segment
mov $0x30,%ax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
mov %ax,%ss
//Jump to a 16-bit code segment
ljmp $0x28,$0x00000000
.global offset_patch_address
.long offset_patch_address
offset_patch_address:
movl %cr0, %eax //mov eax,cr0
and $0xfffffffe,%eax //and eax,0ffffffFEh
movl %eax,%cr0 //Switch back to real-mode without resetting
.global PROTECTION_DISABLED
PROTECTION_DISABLED:
.code16
//Load all data segments regs with 0 until realmode code sets them
mov $0,%ax
nop
nop
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%ss
mov %ax,%gs
//opcode for real-mode jump to 800:0
.byte 0xea,0,0,0,0x8
.code32
More information about the coreboot
mailing list