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 + -
显示快捷键?