fixed the bugs, calling the pxe bios now works

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19621 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen 2006-12-25 02:48:08 +00:00
parent f7110a4231
commit 578e3c2607

View File

@ -19,7 +19,7 @@
#define REAL_MODE_STACK 0x9000
// the location of the stack in real mode
#define SAVED_EAX 0x10000
#define SAVED_EAX 0x10014
// we're overwriting the start of our boot loader to hold some
// temporary values - the first 1024 bytes of it are used at
// startup only, and we avoid some linking issues this way
@ -31,7 +31,7 @@
/** uint16 call_pxe_bios(void *pxe, uint16 opcode, void *param)
* Does a call to the PXE BIOS functions in real mode.
* Both pxe and param must be as linear pointer in lower 1 MB,
* Both pxe and param must be as linear pointer into lower 1 MB,
* pxe is the pointer to the !PXE structure.
*/
@ -44,9 +44,9 @@ FUNCTION(call_pxe_bios)
lidt idt_descriptor
// !PXE
movl 40(%esp), %eax
// entry point SEG:OFS
movl 0x10(%eax), %ebx
movl 40(%esp), %ebx
// make %ebx a pointer to entry point SEG:OFS
addl $0x10, %ebx
// opcode
movl 44(%esp), %ecx
@ -54,16 +54,17 @@ FUNCTION(call_pxe_bios)
// param
movl 48(%esp), %edx
// enter real mode (clobbers %eax, %ds, %es, %fs, %gs, %ss, %sp)
call switch_to_real_mode
.code16
// SEG param
// param (segment)
movl %edx, %eax
shrl $4, %eax
pushw %ax
// OFS param
// param (offset)
andw $0xf, %dx
pushw %dx
@ -71,16 +72,20 @@ FUNCTION(call_pxe_bios)
pushw %cx
// call PXE entry point
call * %ebx
movl %ebx, %eax
shrl $4, %eax
movw %ax, %es
andw $0xf, %bx
lcall * %es:(%bx)
addw $6, %sp
// save %ax from the call
// save %ax result
xorl %ebx, %ebx
movw %ax, %bx
movl %ebx, (SAVED_EAX - 0x10000)
// back to protected mode
// back to protected mode (clobbers %eax)
call switch_to_protected_mode
.code32