pxe.h
来自「Next BIOS Source code : Extensible Firmw」· C头文件 代码 · 共 689 行 · 第 1/2 页
H
689 行
/*++
Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved
This software and associated documentation (if any) is furnished
under a license and may only be used or copied in accordance
with the terms of the license. Except as permitted by such
license, no part of this software or documentation may be
reproduced, stored in a retrieval system, or transmitted in any
form or by any means without the express written consent of
Intel Corporation.
Module Name:
Pxe.h
These are PXE Specification 2.1-compliant data structures and defines.
This file relies upon the existence of a PXE-compliant ROM
in memory, as defined by the Preboot Execution Environment
Specification (PXE), Version 2.1, located at
http://developer.intel.com/ial/wfm/wfmspecs.htm
--*/
#ifndef _PXEDEF_H
#define _PXEDEF_H
#pragma pack(1)
// Stuff taken from PXE reference code. Need to clean up and fix!
#ifndef __FAR
#define __FAR
#endif
#ifndef __CDECL
#define __CDECL
#endif
/*++
PXE structure signatures
--*/
#define BC_ROMID_SIG "$BC$"
#define UNDI_ROMID_SIG "UNDI"
#define BUSD_ROMID_SIG "BUSD"
#define PXE_SIG "!PXE"
#define PXENV_SIG "PXENV+"
#define BC_ROMID_REV 0x00
#define UNDI_ROMID_REV 0x00
#define BUSD_ROMID_REV 0x00
#define PXE_REV 0x00
#define PXENV_REV 0x0201
#define PXENV_PTR EFI_SIGNATURE_32('P','X','E','N')
#define PXE_PTR EFI_SIGNATURE_32('!','P','X','E')
#define UNDI_ROMID_SIG_PTR EFI_SIGNATURE_32('U','N','D','I')
typedef UINT16 SEGSEL; // Real mode segment or protected mode selector.
typedef UINT16 OFF16; // Unsigned 16bit offset.
typedef UINT32 ADDR32;
/*++
Bus types
--*/
#define PXENV_BUS_ISA 0
#define PXENV_BUS_EISA 1
#define PXENV_BUS_MCA 2
#define PXENV_BUS_PCI 3
#define PXENV_BUS_VESA 4
#define PXENV_BUS_PCMCIA 5
/*++
Result codes returned in AX by a PXENV API service.
--*/
#define PXENV_EXIT_SUCCESS 0x0000
#define PXENV_EXIT_FAILURE 0x0001
/*++
Status codes returned in the status word of PXENV API parameter structures.
Generic API errors - these do not match up with the M0x or E0x messages
that are reported by the loader.
--*/
#define PXENV_STATUS_SUCCESS 0x00
#define PXENV_STATUS_FAILURE 0x01
#define PXENV_STATUS_BAD_FUNC 0x02
#define PXENV_STATUS_UNSUPPORTED 0x03
#define PXENV_STATUS_KEEP_UNDI 0x04
#define PXENV_STATUS_KEEP_ALL 0x05
#define PXENV_STATUS_OUT_OF_RESOURCES 0x06
typedef enum {
PxeEnvStatus_Success,
PxeEnvStatus_Failure,
PxeEnvStatus_BadFunc,
PxeEnvStatus_Unsupported,
PxeEnvStatus_KeepUndi,
PxeEnvStatus_KeepAll
} EFI_PXE_STATUS;
/* Driver errors (0x60 to 0x6F) */
/* These errors are for UNDI compatible NIC drivers. */
#define PXENV_STATUS_UNDI_INVALID_FUNCTION 0x60
#define PXENV_STATUS_UNDI_MEDIATEST_FAILED 0x61
#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST 0x62
#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC 0x63
#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY 0x64
#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA 0x65
#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA 0x66
#define PXENV_STATUS_UNDI_BAD_MAC_ADDR 0x67
#define PXENV_STATUS_UNDI_BAD_EEPROM_CKSUM 0x68
#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR 0x69
#define PXENV_STATUS_UNDI_INVALID_STATE 0x6A
#define PXENV_STATUS_UNDI_TRANSMIT_ERROR 0x6B
#define PXENV_STATUS_UNDI_INVALID_PARAMETER 0x6C
typedef struct {
UINT16 Seg_Addr;
UINT32 Phy_Addr;
UINT16 Seg_Size;
} NEWSEGDESC_t;
typedef struct {
OFF16 offset;
SEGSEL segment;
} SEGOFF16;
typedef struct {
UINT8 Signature[4]; // Structure signature is not NULL terminated.
UINT8 StructLength; // Length of this structure in bytes.
UINT8 StructCksum; // Use to make byte checksum of this structure == zero.
UINT8 StructRev; // Structure format revision number.
UINT8 UNDI_Rev[3]; // API revision number stored in Intel order.
// Revision 2.1.0 == 0x00, 0x01, 0x02
UINT16 UNDI_Loader; // Offset of UNDI loader routine in the option ROM image.
UINT16 StackSize; // Minimum stack segment size, in bytes, needed to load and run the UNDI.
UINT16 DataSize; // UNDI runtime code and data
UINT16 CodeSize; // segment sizes.
UINT8 BusType[4]; // 'ISAR', 'EISA', 'PCIR', 'PCCR'
} UNDI_ROMID_t;
typedef struct {
UINT8 Signature[4]; // Structure signature is not NULL terminated.
UINT8 StructLength; // Length of this structure in bytes.
UINT8 StructCksum; // Use to make byte checksum of this structure == zero.
UINT8 StructRev; // Structure format revision number.
UINT8 BC_Rev[3]; // API revision number stored in Intel order.
// Revision 2.1.0 == 0x00, 0x01, 0x02
UINT16 BC_Loader; // Offset of base-code loader routine in the option ROM image.
UINT16 StackSize; // Minimum stack segment size (bytes) needed to load/run base-code.
UINT16 DataSize; // Base-code runtime code and data
UINT16 CodeSize; // segment sizes.
} BC_ROMID_t;
typedef struct {
UINT8 Signature[4]; // Structure signature is not NULL terminated.
UINT8 StructLength; // Length of this structure in bytes.
UINT8 StructCksum; // Use to make byte checksum of this structure == zero.
UINT8 StructRev; // Structure format revision number.
UINT8 reserved1; // must be zero
// UNDI_ROMID_t __FAR *UNDI;// Far pointer to UNDI ROMID
SEGOFF16 UNDI;
// BC_ROMID_t __FAR *Base; // Far pointer to base-code ROMID
SEGOFF16 Base;
// UINT16 (__FAR __CDECL *EntryPointSP)(UINT16 func, void __FAR *param);
// 16bit stack segment API entry point. This will be seg:off in
// real mode and sel:off in 16:16 protected mode.
SEGOFF16 EntryPointSP;
// UINT16 (__FAR __CDECL *EntryPointESP)(UINT16 func, void __FAR *param);
// 32bit stack segment API entry point. This will be sel:off.
// In real mode, sel == 0
SEGOFF16 EntryPointESP;
// UINT16 (__FAR __CDECL *StatusCallout)(UINT16 param);
// Address of DHCP/TFTP status callout routine.
SEGOFF16 StatusCallout;
UINT8 reserved2; // must be zero
UINT8 SegDescCnt; // Number of segment descriptors in this structure.
UINT16 FirstSelector; // First segment descriptor in GDT assigned to PXE.
NEWSEGDESC_t Stack;
NEWSEGDESC_t UNDIData;
NEWSEGDESC_t UNDICode;
NEWSEGDESC_t UNDICodeWrite;
NEWSEGDESC_t BC_Data;
NEWSEGDESC_t BC_Code;
NEWSEGDESC_t BC_CodeWrite;
} PXE_t;
typedef struct {
char Signature[6]; // "PXENV+"
UINT16 Version; // PXE version number. LSB is minor version. MSB is major version.
UINT8 StructLength; // Length of PXE-2.0 Entry Point structure in bytes.
UINT8 StructCksum; // Used to make structure checksum equal zero.
UINT32 RMEntry; // Real mode API entry point segment:offset.
UINT32 PMEntryOff; // Protected mode API entry point
UINT16 PMEntrySeg; // segment:offset. This will always be zero. Protected mode API calls
// must be made through the API entry points in the PXE Runtime ID structure.
UINT16 StackSeg; // Real mode stack segment.
UINT16 StackSize; // Stack segment size in bytes.
UINT16 BaseCodeSeg; // Real mode base-code code segment.
UINT16 BaseCodeSize; // Base-code code segment size
UINT16 BaseDataSeg; // Real mode base-code data segment.
UINT16 BaseDataSize; // Base-code data segment size
UINT16 UNDIDataSeg; // Real mode UNDI data segment.
UINT16 UNDIDataSize; // UNDI data segment size in bytes.
UINT16 UNDICodeSeg; // Real mode UNDI code segment.
UINT16 UNDICodeSize; // UNDI code segment size in bytes.
PXE_t __FAR *RuntimePtr; // Real mode segment:offset pointer to PXE Runtime ID structure.
} PXENV_t;
typedef struct {
OUT UINT16 Status;
IN OUT UINT16 _AX_;
IN OUT UINT16 _BX_;
IN OUT UINT16 _DX_;
IN OUT UINT16 _DI_;
IN OUT UINT16 _ES_;
IN OUT UINT16 UNDI_DS;
IN OUT UINT16 UNDI_CS;
OUT SEGOFF16 PXEptr;
OUT SEGOFF16 PXENVptr;
} UNDI_Loader_t;
//
// Put in some UNDI-specific arguments
//
#define PXENV_START_UNDI 0x0000
#define PXENV_UNDI_STARTUP 0x0001
#define PXENV_UNDI_CLEANUP 0x0002
#define PXENV_UNDI_INITIALIZE 0x0003
#define PXENV_UNDI_RESET_NIC 0x0004
#define PXENV_UNDI_SHUTDOWN 0x0005
#define PXENV_UNDI_OPEN 0x0006
#define PXENV_UNDI_CLOSE 0x0007
#define PXENV_UNDI_TRANSMIT 0x0008
#define PXENV_UNDI_SET_MCAST_ADDR 0x0009
#define PXENV_UNDI_SET_STATION_ADDR 0x000A
#define PXENV_UNDI_SET_PACKET_FILTER 0x000B
#define PXENV_UNDI_GET_INFORMATION 0x000C
#define PXENV_UNDI_GET_STATISTICS 0x000D
#define PXENV_UNDI_CLEAR_STATISTICS 0x000E
#define PXENV_UNDI_INITIATE_DIAGS 0x000F
#define PXENV_UNDI_FORCE_INTERRUPT 0x0010
#define PXENV_UNDI_GET_MCAST_ADDR 0x0011
#define PXENV_UNDI_GET_NIC_TYPE 0x0012
#define PXENV_UNDI_GET_NDIS_INFO 0x0013
#define PXENV_UNDI_ISR 0x0014
#define PXENV_STOP_UNDI 0x0015
#define PXENV_UNDI_GET_STATE 0x0016
#define ADDR_LEN 16
#define MAXNUM_MCADDR 8
#define IPLEN 4 /* length of an IP address */
#define XMT_DESTADDR 0x0000 /* destination address given */
#define XMT_BROADCAST 0x0001 /* use broadcast address */
typedef struct {
UINT16 MCastAddrCount; /* In: Number of multi-cast */
/* addresses. */
UINT8 MCastAddr[MAXNUM_MCADDR][ADDR_LEN]; /* In: */
/* list of multi-cast addresses. */
/* Each address can take up to */
/* ADDR_LEN bytes and a maximum */
/* of MAXNUM_MCADDR address can */
/* be provided*/
} PXENV_UNDI_MCAST_ADDR_t;
/* Definitions of TFTP API parameter structures.
*/
typedef struct {
OUT UINT16 Status; /* Out: PXENV_STATUS_xxx */
IN UINT16 ax; /* In: These register fields must be */
IN UINT16 bx; /* filled in with the same data */
IN UINT16 dx; /* that was passed to the MLID */
IN UINT16 di; /* option ROM boot code by the */
IN UINT16 es; /* system BIOS. */
} PXENV_START_UNDI_t;
typedef struct {
OUT UINT16 Status; /* Out: PXENV_STATUS_xxx */
} PXENV_UNDI_STARTUP_t;
typedef struct {
OUT UINT16 Status; /* Out: PXENV_STATUS_xxx */
} PXENV_UNDI_CLEANUP_t;
typedef struct {
OUT UINT16 Status; /* Out: PXENV_STATUS_xxx */
IN UINT32 ProtocolIni; /* In: See description below */
UINT8 reserved[8];
} PXENV_UNDI_INITIALIZE_t;
/*++
ProtocolIni :
This is an input parameter and is a 32-bit physical address of
a memory copy of the driver module in the protocol.ini file
obtained from the Protocol Manager driver(refer to NDIS 2.0
specifications). This parameter is basically supported for
the universal NDIS driver to pass the information contained in
protocol.ini file to the NIC driver for any specific
configuration of the NIC. (Note that the module
identification in the protocol.ini file was done by NDIS
itself.) This value can be NULL for for any other application
interfacing to the Universal NIC Driver.
--*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?