Hi, Christopher

Thanks a lot for the code. I really appreciate it !
Did you modify the linuxbios itself to allow VxWorks
to be loaded at 8000h. I guess I have to modify ldscript.ld
but i don't know how.

Thanks a lot.

Felix.


Christopher Stutts wrote:

Asm part of jump from Linuxbios to vxWorks




------------------------------------------------------------------------

//
// 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


_______________________________________________
Linuxbios mailing list
[EMAIL PROTECTED]
http://www.clustermatic.org/mailman/listinfo/linuxbios

Reply via email to