Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Added (not yet tested) PXE API entry point and support functions.
- Loading branch information
Michael Brown
committed
Aug 8, 2006
1 parent
d12383f
commit 18c112d
Showing
2 changed files
with
300 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
/* | ||
* Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation; either version 2 of the | ||
* License, or any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
* | ||
*/ | ||
|
||
.arch i386 | ||
.section ".text16", "awx", @progbits | ||
.section ".text16.data", "aw", @progbits | ||
.section ".data16", "aw", @progbits | ||
|
||
/**************************************************************************** | ||
* !PXE structure | ||
**************************************************************************** | ||
*/ | ||
.section ".text16.data" | ||
.globl pxe | ||
pxe: | ||
.ascii "!PXE" /* Signature */ | ||
.byte pxe_length /* StructLength */ | ||
.byte 0 /* StructCksum */ | ||
.byte 0 /* StructRev */ | ||
.byte 0 /* reserved_1 */ | ||
.word 0, 0 /* UNDIROMID */ | ||
.word 0, 0 /* BaseROMID */ | ||
.word pxe_entry_sp, 0 /* EntryPointSP */ | ||
.word pxe_entry_esp, 0 /* EntryPointESP */ | ||
.word -1, -1 /* StatusCallout */ | ||
.byte 0 /* reserved_2 */ | ||
.byte SegDescCnt /* SegDescCnt */ | ||
.word 0 /* FirstSelector */ | ||
pxe_segments: | ||
.word 0, 0, 0, _data16_size /* Stack */ | ||
.word 0, 0, 0, _data16_size /* UNDIData */ | ||
.word 0, 0, 0, _text16_size /* UNDICode */ | ||
.word 0, 0, 0, _text16_size /* UNDICodeWrite */ | ||
.word 0, 0, 0, 0 /* BC_Data */ | ||
.word 0, 0, 0, 0 /* BC_Code */ | ||
.word 0, 0, 0, 0 /* BC_CodeWrite */ | ||
.equ SegDescCnt, ( ( . - pxe_segments ) / 8 ) | ||
.equ pxe_length, . - pxe | ||
.size pxe, . - pxe | ||
|
||
/**************************************************************************** | ||
* PXENV+ structure | ||
**************************************************************************** | ||
*/ | ||
.section ".text16.data" | ||
.globl pxenv | ||
pxenv: | ||
.ascii "PXENV+" /* Signature */ | ||
.word 0x0201 /* Version */ | ||
.byte pxenv_length /* Length */ | ||
.byte 0 /* Checksum */ | ||
.word pxenv_entry, 0 /* RMEntry */ | ||
.long 0 /* PMEntry */ | ||
.word 0 /* PMSelector */ | ||
.word 0 /* StackSeg */ | ||
.word _data16_size /* StackSize */ | ||
.word 0 /* BC_CodeSeg */ | ||
.word 0 /* BC_CodeSize */ | ||
.word 0 /* BC_DataSeg */ | ||
.word 0 /* BC_DataSize */ | ||
.word 0 /* UNDIDataSeg */ | ||
.word _data16_size /* UNDIDataSize */ | ||
.word 0 /* UNDICodeSeg */ | ||
.word _text16_size /* UNDICodeSize */ | ||
.word pxe, 0 /* PXEPtr */ | ||
.equ pxenv_length, . - pxenv | ||
.size pxenv, . - pxenv | ||
|
||
/**************************************************************************** | ||
* pxenv_entry (16-bit far call) | ||
* | ||
* PXE API call PXENV+ entry point | ||
* | ||
* Parameters: | ||
* %es:di : Far pointer to PXE parameter structure | ||
* %bx : PXE API call | ||
* Returns: | ||
* %ax : PXE exit status | ||
* Corrupts: | ||
* none | ||
**************************************************************************** | ||
*/ | ||
.section ".text16" | ||
.code16 | ||
pxenv_entry: | ||
pushl $pxe_api_call | ||
pushw %cs | ||
call prot_call | ||
addl $4, %esp | ||
lret | ||
.size pxenv_entry, . - pxenv_entry | ||
|
||
/**************************************************************************** | ||
* pxe_entry | ||
* | ||
* PXE API call !PXE entry point | ||
* | ||
* Parameters: | ||
* stack : Far pointer to PXE parameter structure | ||
* stack : PXE API call | ||
* Returns: | ||
* %ax : PXE exit status | ||
* Corrupts: | ||
* none | ||
**************************************************************************** | ||
*/ | ||
.section ".text16" | ||
.code16 | ||
pxe_entry: | ||
pxe_entry_sp: | ||
/* Preserve original %esp */ | ||
pushl %esp | ||
/* Zero high word of %esp to allow use of common code */ | ||
movzwl %sp, %esp | ||
jmp pxe_entry_common | ||
pxe_entry_esp: | ||
/* Preserve %esp to match behaviour of pxe_entry_sp */ | ||
pushl %esp | ||
pxe_entry_common: | ||
/* Save PXENV+ API call registers */ | ||
pushw %es | ||
pushw %di | ||
pushw %bx | ||
/* Load !PXE parameters from stack into PXENV+ registers */ | ||
movw 16(%esp), %bx | ||
movw %bx, %es | ||
movw 14(%esp), %di | ||
movw 12(%esp), %bx | ||
/* Make call as for PXENV+ */ | ||
pushw %cs | ||
call pxenv_entry | ||
/* Restore PXENV+ registers */ | ||
popw %bx | ||
popw %di | ||
popw %es | ||
/* Restore original %esp and return */ | ||
popl %esp | ||
lret | ||
.size pxe_entry, . - pxe_entry | ||
|
||
/**************************************************************************** | ||
* pxe_int_1a | ||
* | ||
* PXE INT 1A handler | ||
* | ||
* Parameters: | ||
* %ax : 0x5650 | ||
* Returns: | ||
* %ax : 0x564e | ||
* %es:bx : Far pointer to the PXENV+ structure | ||
* CF cleared | ||
* Corrupts: | ||
* none | ||
**************************************************************************** | ||
*/ | ||
.section ".text16" | ||
.code16 | ||
pxe_int_1a: | ||
pushfw | ||
cmpw $0x5650, %ax | ||
jne 1f | ||
/* INT 1A,5650 - PXE installation check */ | ||
pushw %cs | ||
popw %es | ||
movw $pxenv, %bx | ||
movw $0x564e, %ax | ||
popfw | ||
clc | ||
lret $2 | ||
1: /* INT 1A,other - pass through */ | ||
popfw | ||
ljmp *%cs:pxe_int_1a_vector | ||
|
||
.section ".text16.data" | ||
.globl pxe_int_1a_vector | ||
pxe_int_1a_vector: .long 0 |