1*479ab7f0SSascha Wildner /* 2*479ab7f0SSascha Wildner * Copyright (c) 2000 Alfred Perlstein <alfred@freebsd.org> 3*479ab7f0SSascha Wildner * All rights reserved. 4*479ab7f0SSascha Wildner * Copyright (c) 2000 Paul Saab <ps@freebsd.org> 5*479ab7f0SSascha Wildner * All rights reserved. 6*479ab7f0SSascha Wildner * Copyright (c) 2000 John Baldwin <jhb@freebsd.org> 7*479ab7f0SSascha Wildner * All rights reserved. 8*479ab7f0SSascha Wildner * 9*479ab7f0SSascha Wildner * Redistribution and use in source and binary forms, with or without 10*479ab7f0SSascha Wildner * modification, are permitted provided that the following conditions 11*479ab7f0SSascha Wildner * are met: 12*479ab7f0SSascha Wildner * 1. Redistributions of source code must retain the above copyright 13*479ab7f0SSascha Wildner * notice, this list of conditions and the following disclaimer. 14*479ab7f0SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 15*479ab7f0SSascha Wildner * notice, this list of conditions and the following disclaimer in the 16*479ab7f0SSascha Wildner * documentation and/or other materials provided with the distribution. 17*479ab7f0SSascha Wildner * 18*479ab7f0SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19*479ab7f0SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*479ab7f0SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*479ab7f0SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22*479ab7f0SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*479ab7f0SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*479ab7f0SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*479ab7f0SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26*479ab7f0SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27*479ab7f0SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28*479ab7f0SSascha Wildner * SUCH DAMAGE. 29*479ab7f0SSascha Wildner * 30*479ab7f0SSascha Wildner * $FreeBSD: src/sys/boot/i386/libi386/pxe.h,v 1.6 2002/09/23 18:54:26 alfred Exp $ 31*479ab7f0SSascha Wildner */ 32*479ab7f0SSascha Wildner 33*479ab7f0SSascha Wildner /* 34*479ab7f0SSascha Wildner * The typedefs and structures declared in this file 35*479ab7f0SSascha Wildner * clearly violate style(9), the reason for this is to conform to the 36*479ab7f0SSascha Wildner * typedefs/structure-names used in the Intel literature to avoid confusion. 37*479ab7f0SSascha Wildner * 38*479ab7f0SSascha Wildner * It's for your own good. :) 39*479ab7f0SSascha Wildner */ 40*479ab7f0SSascha Wildner 41*479ab7f0SSascha Wildner /* It seems that intel didn't think about ABI, 42*479ab7f0SSascha Wildner * either that or 16bit ABI != 32bit ABI (which seems reasonable) 43*479ab7f0SSascha Wildner * I have to thank Intel for the hair loss I incurred trying to figure 44*479ab7f0SSascha Wildner * out why PXE was mis-reading structures I was passing it (at least 45*479ab7f0SSascha Wildner * from my point of view) 46*479ab7f0SSascha Wildner * 47*479ab7f0SSascha Wildner * Solution: use gcc's '__packed' to correctly align 48*479ab7f0SSascha Wildner * structures passed into PXE 49*479ab7f0SSascha Wildner * Question: does this really work for PXE's expected ABI? 50*479ab7f0SSascha Wildner */ 51*479ab7f0SSascha Wildner #define PACKED __packed 52*479ab7f0SSascha Wildner 53*479ab7f0SSascha Wildner #define S_SIZE(s) s, sizeof(s) - 1 54*479ab7f0SSascha Wildner 55*479ab7f0SSascha Wildner #define IP_STR "%d.%d.%d.%d" 56*479ab7f0SSascha Wildner #define IP_ARGS(ip) \ 57*479ab7f0SSascha Wildner (int)(ip >> 24) & 0xff, (int)(ip >> 16) & 0xff, \ 58*479ab7f0SSascha Wildner (int)(ip >> 8) & 0xff, (int)ip & 0xff 59*479ab7f0SSascha Wildner 60*479ab7f0SSascha Wildner #define MAC_STR "%02x:%02x:%02x:%02x:%02x:%02x" 61*479ab7f0SSascha Wildner #define MAC_ARGS(mac) \ 62*479ab7f0SSascha Wildner mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] 63*479ab7f0SSascha Wildner 64*479ab7f0SSascha Wildner #define PXENFSROOTPATH "/pxeroot" 65*479ab7f0SSascha Wildner 66*479ab7f0SSascha Wildner typedef struct { 67*479ab7f0SSascha Wildner uint16_t offset; 68*479ab7f0SSascha Wildner uint16_t segment; 69*479ab7f0SSascha Wildner } SEGOFF16_t; 70*479ab7f0SSascha Wildner 71*479ab7f0SSascha Wildner typedef struct { 72*479ab7f0SSascha Wildner uint16_t Seg_Addr; 73*479ab7f0SSascha Wildner uint32_t Phy_Addr; 74*479ab7f0SSascha Wildner uint16_t Seg_Size; 75*479ab7f0SSascha Wildner } SEGDESC_t; 76*479ab7f0SSascha Wildner 77*479ab7f0SSascha Wildner typedef uint16_t SEGSEL_t; 78*479ab7f0SSascha Wildner typedef uint16_t PXENV_STATUS_t; 79*479ab7f0SSascha Wildner typedef uint32_t IP4_t; 80*479ab7f0SSascha Wildner typedef uint32_t ADDR32_t; 81*479ab7f0SSascha Wildner typedef uint16_t UDP_PORT_t; 82*479ab7f0SSascha Wildner 83*479ab7f0SSascha Wildner #define MAC_ADDR_LEN 16 84*479ab7f0SSascha Wildner typedef uint8_t MAC_ADDR[MAC_ADDR_LEN]; 85*479ab7f0SSascha Wildner 86*479ab7f0SSascha Wildner /* PXENV+ */ 87*479ab7f0SSascha Wildner typedef struct { 88*479ab7f0SSascha Wildner uint8_t Signature[6]; /* 'PXENV+' */ 89*479ab7f0SSascha Wildner uint16_t Version; /* MSB = major, LSB = minor */ 90*479ab7f0SSascha Wildner uint8_t Length; /* structure length */ 91*479ab7f0SSascha Wildner uint8_t Checksum; /* checksum pad */ 92*479ab7f0SSascha Wildner SEGOFF16_t RMEntry; /* SEG:OFF to PXE entry point */ 93*479ab7f0SSascha Wildner /* don't use PMOffset and PMSelector (from the 2.1 PXE manual) */ 94*479ab7f0SSascha Wildner uint32_t PMOffset; /* Protected mode entry */ 95*479ab7f0SSascha Wildner SEGSEL_t PMSelector; /* Protected mode selector */ 96*479ab7f0SSascha Wildner SEGSEL_t StackSeg; /* Stack segment address */ 97*479ab7f0SSascha Wildner uint16_t StackSize; /* Stack segment size (bytes) */ 98*479ab7f0SSascha Wildner SEGSEL_t BC_CodeSeg; /* BC Code segment address */ 99*479ab7f0SSascha Wildner uint16_t BC_CodeSize; /* BC Code segment size (bytes) */ 100*479ab7f0SSascha Wildner SEGSEL_t BC_DataSeg; /* BC Data segment address */ 101*479ab7f0SSascha Wildner uint16_t BC_DataSize; /* BC Data segment size (bytes) */ 102*479ab7f0SSascha Wildner SEGSEL_t UNDIDataSeg; /* UNDI Data segment address */ 103*479ab7f0SSascha Wildner uint16_t UNDIDataSize; /* UNDI Data segment size (bytes) */ 104*479ab7f0SSascha Wildner SEGSEL_t UNDICodeSeg; /* UNDI Code segment address */ 105*479ab7f0SSascha Wildner uint16_t UNDICodeSize; /* UNDI Code segment size (bytes) */ 106*479ab7f0SSascha Wildner SEGOFF16_t PXEPtr; /* SEG:OFF to !PXE struct, 107*479ab7f0SSascha Wildner only present when Version > 2.1 */ 108*479ab7f0SSascha Wildner } PACKED pxenv_t; 109*479ab7f0SSascha Wildner 110*479ab7f0SSascha Wildner /* !PXE */ 111*479ab7f0SSascha Wildner typedef struct { 112*479ab7f0SSascha Wildner uint8_t Signature[4]; 113*479ab7f0SSascha Wildner uint8_t StructLength; 114*479ab7f0SSascha Wildner uint8_t StructCksum; 115*479ab7f0SSascha Wildner uint8_t StructRev; 116*479ab7f0SSascha Wildner uint8_t reserved_1; 117*479ab7f0SSascha Wildner SEGOFF16_t UNDIROMID; 118*479ab7f0SSascha Wildner SEGOFF16_t BaseROMID; 119*479ab7f0SSascha Wildner SEGOFF16_t EntryPointSP; 120*479ab7f0SSascha Wildner SEGOFF16_t EntryPointESP; 121*479ab7f0SSascha Wildner SEGOFF16_t StatusCallout; 122*479ab7f0SSascha Wildner uint8_t reserved_2; 123*479ab7f0SSascha Wildner uint8_t SegDescCn; 124*479ab7f0SSascha Wildner SEGSEL_t FirstSelector; 125*479ab7f0SSascha Wildner SEGDESC_t Stack; 126*479ab7f0SSascha Wildner SEGDESC_t UNDIData; 127*479ab7f0SSascha Wildner SEGDESC_t UNDICode; 128*479ab7f0SSascha Wildner SEGDESC_t UNDICodeWrite; 129*479ab7f0SSascha Wildner SEGDESC_t BC_Data; 130*479ab7f0SSascha Wildner SEGDESC_t BC_Code; 131*479ab7f0SSascha Wildner SEGDESC_t BC_CodeWrite; 132*479ab7f0SSascha Wildner } PACKED pxe_t; 133*479ab7f0SSascha Wildner 134*479ab7f0SSascha Wildner #define PXENV_START_UNDI 0x0000 135*479ab7f0SSascha Wildner typedef struct { 136*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 137*479ab7f0SSascha Wildner uint16_t ax; 138*479ab7f0SSascha Wildner uint16_t bx; 139*479ab7f0SSascha Wildner uint16_t dx; 140*479ab7f0SSascha Wildner uint16_t di; 141*479ab7f0SSascha Wildner uint16_t es; 142*479ab7f0SSascha Wildner } PACKED t_PXENV_START_UNDI; 143*479ab7f0SSascha Wildner 144*479ab7f0SSascha Wildner #define PXENV_UNDI_STARTUP 0x0001 145*479ab7f0SSascha Wildner typedef struct { 146*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 147*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_STARTUP; 148*479ab7f0SSascha Wildner 149*479ab7f0SSascha Wildner #define PXENV_UNDI_CLEANUP 0x0002 150*479ab7f0SSascha Wildner typedef struct { 151*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 152*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_CLEANUP; 153*479ab7f0SSascha Wildner 154*479ab7f0SSascha Wildner #define PXENV_UNDI_INITIALIZE 0x0003 155*479ab7f0SSascha Wildner typedef struct { 156*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 157*479ab7f0SSascha Wildner ADDR32_t ProtocolIni; /* Phys addr of a copy of the driver module */ 158*479ab7f0SSascha Wildner uint8_t reserved[8]; 159*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_INITIALIZE; 160*479ab7f0SSascha Wildner 161*479ab7f0SSascha Wildner 162*479ab7f0SSascha Wildner #define MAXNUM_MCADDR 8 163*479ab7f0SSascha Wildner typedef struct { 164*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 165*479ab7f0SSascha Wildner uint16_t MCastAddrCount; 166*479ab7f0SSascha Wildner MAC_ADDR McastAddr[MAXNUM_MCADDR]; 167*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_MCAST_ADDRESS; 168*479ab7f0SSascha Wildner 169*479ab7f0SSascha Wildner #define PXENV_UNDI_RESET_ADAPTER 0x0004 170*479ab7f0SSascha Wildner typedef struct { 171*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 172*479ab7f0SSascha Wildner t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 173*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_RESET; 174*479ab7f0SSascha Wildner 175*479ab7f0SSascha Wildner #define PXENV_UNDI_SHUTDOWN 0x0005 176*479ab7f0SSascha Wildner typedef struct { 177*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 178*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_SHUTDOWN; 179*479ab7f0SSascha Wildner 180*479ab7f0SSascha Wildner #define PXENV_UNDI_OPEN 0x0006 181*479ab7f0SSascha Wildner typedef struct { 182*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 183*479ab7f0SSascha Wildner uint16_t OpenFlag; 184*479ab7f0SSascha Wildner uint16_t PktFilter; 185*479ab7f0SSascha Wildner # define FLTR_DIRECTED 0x0001 186*479ab7f0SSascha Wildner # define FLTR_BRDCST 0x0002 187*479ab7f0SSascha Wildner # define FLTR_PRMSCS 0x0003 188*479ab7f0SSascha Wildner # define FLTR_SRC_RTG 0x0004 189*479ab7f0SSascha Wildner 190*479ab7f0SSascha Wildner t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 191*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_OPEN; 192*479ab7f0SSascha Wildner 193*479ab7f0SSascha Wildner #define PXENV_UNDI_CLOSE 0x0007 194*479ab7f0SSascha Wildner typedef struct { 195*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 196*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_CLOSE; 197*479ab7f0SSascha Wildner 198*479ab7f0SSascha Wildner #define PXENV_UNDI_TRANSMIT 0x0008 199*479ab7f0SSascha Wildner typedef struct { 200*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 201*479ab7f0SSascha Wildner uint8_t Protocol; 202*479ab7f0SSascha Wildner # define P_UNKNOWN 0 203*479ab7f0SSascha Wildner # define P_IP 1 204*479ab7f0SSascha Wildner # define P_ARP 2 205*479ab7f0SSascha Wildner # define P_RARP 3 206*479ab7f0SSascha Wildner 207*479ab7f0SSascha Wildner uint8_t XmitFlag; 208*479ab7f0SSascha Wildner # define XMT_DESTADDR 0x0000 209*479ab7f0SSascha Wildner # define XMT_BROADCAST 0x0001 210*479ab7f0SSascha Wildner 211*479ab7f0SSascha Wildner SEGOFF16_t DestAddr; 212*479ab7f0SSascha Wildner SEGOFF16_t TBD; 213*479ab7f0SSascha Wildner uint32_t Reserved[2]; 214*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_TRANSMIT; 215*479ab7f0SSascha Wildner 216*479ab7f0SSascha Wildner #define MAX_DATA_BLKS 8 217*479ab7f0SSascha Wildner typedef struct { 218*479ab7f0SSascha Wildner uint16_t ImmedLength; 219*479ab7f0SSascha Wildner SEGOFF16_t Xmit; 220*479ab7f0SSascha Wildner uint16_t DataBlkCount; 221*479ab7f0SSascha Wildner struct DataBlk { 222*479ab7f0SSascha Wildner uint8_t TDPtrType; 223*479ab7f0SSascha Wildner uint8_t TDRsvdByte; 224*479ab7f0SSascha Wildner uint16_t TDDataLen; 225*479ab7f0SSascha Wildner SEGOFF16_t TDDataPtr; 226*479ab7f0SSascha Wildner } DataBlock[MAX_DATA_BLKS]; 227*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_TBD; 228*479ab7f0SSascha Wildner 229*479ab7f0SSascha Wildner #define PXENV_UNDI_SET_MCAST_ADDRESS 0x0009 230*479ab7f0SSascha Wildner typedef struct { 231*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 232*479ab7f0SSascha Wildner t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 233*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_SET_MCAST_ADDR; 234*479ab7f0SSascha Wildner 235*479ab7f0SSascha Wildner #define PXENV_UNDI_SET_STATION_ADDRESS 0x000A 236*479ab7f0SSascha Wildner typedef struct { 237*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 238*479ab7f0SSascha Wildner MAC_ADDR StationAddress; /* Temp MAC address to use */ 239*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_SET_STATION_ADDR; 240*479ab7f0SSascha Wildner 241*479ab7f0SSascha Wildner #define PXENV_UNDI_SET_PACKET_FILTER 0x000B 242*479ab7f0SSascha Wildner typedef struct { 243*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 244*479ab7f0SSascha Wildner uint8_t filter; /* see UNDI_OPEN (0x0006) */ 245*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_SET_PACKET_FILTER; 246*479ab7f0SSascha Wildner 247*479ab7f0SSascha Wildner #define PXENV_UNDI_GET_INFORMATION 0x000C 248*479ab7f0SSascha Wildner typedef struct { 249*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 250*479ab7f0SSascha Wildner uint16_t BaseIo; /* Adapter base I/O address */ 251*479ab7f0SSascha Wildner uint16_t IntNumber; /* Adapter IRQ number */ 252*479ab7f0SSascha Wildner uint16_t MaxTranUnit; /* Adapter maximum transmit unit */ 253*479ab7f0SSascha Wildner uint16_t HwType; /* Type of protocol at the hardware addr */ 254*479ab7f0SSascha Wildner # define ETHER_TYPE 1 255*479ab7f0SSascha Wildner # define EXP_ETHER_TYPE 2 256*479ab7f0SSascha Wildner # define IEEE_TYPE 6 257*479ab7f0SSascha Wildner # define ARCNET_TYPE 7 258*479ab7f0SSascha Wildner 259*479ab7f0SSascha Wildner uint16_t HwAddrLen; /* Length of hardware address */ 260*479ab7f0SSascha Wildner MAC_ADDR CurrentNodeAddress; /* Current hardware address */ 261*479ab7f0SSascha Wildner MAC_ADDR PermNodeAddress; /* Permanent hardware address */ 262*479ab7f0SSascha Wildner SEGSEL_t ROMAddress; /* Real mode ROM segment address */ 263*479ab7f0SSascha Wildner uint16_t RxBufCt; /* Receive queue length */ 264*479ab7f0SSascha Wildner uint16_t TxBufCt; /* Transmit queue length */ 265*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_GET_INFORMATION; 266*479ab7f0SSascha Wildner 267*479ab7f0SSascha Wildner #define PXENV_UNDI_GET_STATISTICS 0x000D 268*479ab7f0SSascha Wildner typedef struct { 269*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 270*479ab7f0SSascha Wildner uint32_t XmitGoodFrames; /* Number of successful transmissions */ 271*479ab7f0SSascha Wildner uint32_t RcvGoodFrames; /* Number of good frames received */ 272*479ab7f0SSascha Wildner uint32_t RcvCRCErrors; /* Number of frames with CRC errors */ 273*479ab7f0SSascha Wildner uint32_t RcvResourceErrors; /* Number of frames dropped */ 274*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_GET_STATISTICS; 275*479ab7f0SSascha Wildner 276*479ab7f0SSascha Wildner #define PXENV_UNDI_CLEAR_STATISTICS 0x000E 277*479ab7f0SSascha Wildner typedef struct { 278*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 279*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_CLEAR_STATISTICS; 280*479ab7f0SSascha Wildner 281*479ab7f0SSascha Wildner #define PXENV_UNDI_INITIATE_DIAGS 0x000F 282*479ab7f0SSascha Wildner typedef struct { 283*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 284*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_INITIATE_DIAGS; 285*479ab7f0SSascha Wildner 286*479ab7f0SSascha Wildner #define PXENV_UNDI_FORCE_INTERRUPT 0x0010 287*479ab7f0SSascha Wildner typedef struct { 288*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 289*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_FORCE_INTERRUPT; 290*479ab7f0SSascha Wildner 291*479ab7f0SSascha Wildner #define PXENV_UNDI_GET_MCAST_ADDRESS 0x0011 292*479ab7f0SSascha Wildner typedef struct { 293*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 294*479ab7f0SSascha Wildner IP4_t InetAddr; /* IP mulicast address */ 295*479ab7f0SSascha Wildner MAC_ADDR MediaAddr; /* MAC multicast address */ 296*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_GET_MCAST_ADDR; 297*479ab7f0SSascha Wildner 298*479ab7f0SSascha Wildner #define PXENV_UNDI_GET_NIC_TYPE 0x0012 299*479ab7f0SSascha Wildner typedef struct { 300*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 301*479ab7f0SSascha Wildner uint8_t NicType; /* Type of NIC */ 302*479ab7f0SSascha Wildner # define PCI_NIC 2 303*479ab7f0SSascha Wildner # define PnP_NIC 3 304*479ab7f0SSascha Wildner # define CardBus_NIC 4 305*479ab7f0SSascha Wildner 306*479ab7f0SSascha Wildner union { 307*479ab7f0SSascha Wildner struct { 308*479ab7f0SSascha Wildner uint16_t Vendor_ID; 309*479ab7f0SSascha Wildner uint16_t Dev_ID; 310*479ab7f0SSascha Wildner uint8_t Base_Class; 311*479ab7f0SSascha Wildner uint8_t Sub_Class; 312*479ab7f0SSascha Wildner uint8_t Prog_Intf; 313*479ab7f0SSascha Wildner uint8_t Rev; 314*479ab7f0SSascha Wildner uint16_t BusDevFunc; 315*479ab7f0SSascha Wildner uint16_t SubVendor_ID; 316*479ab7f0SSascha Wildner uint16_t SubDevice_ID; 317*479ab7f0SSascha Wildner } pci, cardbus; 318*479ab7f0SSascha Wildner struct { 319*479ab7f0SSascha Wildner uint32_t EISA_Dev_ID; 320*479ab7f0SSascha Wildner uint8_t Base_Class; 321*479ab7f0SSascha Wildner uint8_t Sub_Class; 322*479ab7f0SSascha Wildner uint8_t Prog_Intf; 323*479ab7f0SSascha Wildner uint16_t CardSelNum; 324*479ab7f0SSascha Wildner } pnp; 325*479ab7f0SSascha Wildner } info; 326*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_GET_NIC_TYPE; 327*479ab7f0SSascha Wildner 328*479ab7f0SSascha Wildner #define PXENV_UNDI_GET_IFACE_INFO 0x0013 329*479ab7f0SSascha Wildner typedef struct { 330*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 331*479ab7f0SSascha Wildner uint8_t IfaceType[16]; /* Name of MAC type in ASCII. */ 332*479ab7f0SSascha Wildner uint32_t LinkSpeed; /* Defined in NDIS 2.0 spec */ 333*479ab7f0SSascha Wildner uint32_t ServiceFlags; /* Defined in NDIS 2.0 spec */ 334*479ab7f0SSascha Wildner uint32_t Reserved[4]; /* must be 0 */ 335*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_GET_NDIS_INFO; 336*479ab7f0SSascha Wildner 337*479ab7f0SSascha Wildner #define PXENV_UNDI_ISR 0x0014 338*479ab7f0SSascha Wildner typedef struct { 339*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 340*479ab7f0SSascha Wildner uint16_t FuncFlag; /* PXENV_UNDI_ISR_OUT_xxx */ 341*479ab7f0SSascha Wildner uint16_t BufferLength; /* Length of Frame */ 342*479ab7f0SSascha Wildner uint16_t FrameLength; /* Total length of receiver frame */ 343*479ab7f0SSascha Wildner uint16_t FrameHeaderLength; /* Length of the media header in Frame */ 344*479ab7f0SSascha Wildner SEGOFF16_t Frame; /* receive buffer */ 345*479ab7f0SSascha Wildner uint8_t ProtType; /* Protocol type */ 346*479ab7f0SSascha Wildner uint8_t PktType; /* Packet Type */ 347*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_IN_START 1 348*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_IN_PROCESS 2 349*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_IN_GET_NEXT 3 350*479ab7f0SSascha Wildner 351*479ab7f0SSascha Wildner /* one of these will be returned for PXENV_UNDI_ISR_IN_START */ 352*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_OUT_OURS 0 353*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_OUT_NOT_OUTS 1 354*479ab7f0SSascha Wildner 355*479ab7f0SSascha Wildner /* 356*479ab7f0SSascha Wildner * one of these will be returned for PXEND_UNDI_ISR_IN_PROCESS 357*479ab7f0SSascha Wildner * and PXENV_UNDI_ISR_IN_GET_NEXT 358*479ab7f0SSascha Wildner */ 359*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_OUT_DONE 0 360*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_OUT_TRANSMIT 2 361*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_OUT_RECEIVE 3 362*479ab7f0SSascha Wildner # define PXENV_UNDI_ISR_OUT_BUSY 4 363*479ab7f0SSascha Wildner } PACKED t_PXENV_UNDI_ISR; 364*479ab7f0SSascha Wildner 365*479ab7f0SSascha Wildner #define PXENV_STOP_UNDI 0x0015 366*479ab7f0SSascha Wildner typedef struct { 367*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 368*479ab7f0SSascha Wildner } PACKED t_PXENV_STOP_UNDI; 369*479ab7f0SSascha Wildner 370*479ab7f0SSascha Wildner #define PXENV_TFTP_OPEN 0x0020 371*479ab7f0SSascha Wildner typedef struct { 372*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 373*479ab7f0SSascha Wildner IP4_t ServerIPAddress; 374*479ab7f0SSascha Wildner IP4_t GatewayIPAddress; 375*479ab7f0SSascha Wildner uint8_t FileName[128]; 376*479ab7f0SSascha Wildner UDP_PORT_t TFTPPort; 377*479ab7f0SSascha Wildner uint16_t PacketSize; 378*479ab7f0SSascha Wildner } PACKED t_PXENV_TFTP_OPEN; 379*479ab7f0SSascha Wildner 380*479ab7f0SSascha Wildner #define PXENV_TFTP_CLOSE 0x0021 381*479ab7f0SSascha Wildner typedef struct { 382*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 383*479ab7f0SSascha Wildner } PACKED t_PXENV_TFTP_CLOSE; 384*479ab7f0SSascha Wildner 385*479ab7f0SSascha Wildner #define PXENV_TFTP_READ 0x0022 386*479ab7f0SSascha Wildner typedef struct { 387*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 388*479ab7f0SSascha Wildner uint16_t PacketNumber; 389*479ab7f0SSascha Wildner uint16_t BufferSize; 390*479ab7f0SSascha Wildner SEGOFF16_t Buffer; 391*479ab7f0SSascha Wildner } PACKED t_PXENV_TFTP_READ; 392*479ab7f0SSascha Wildner 393*479ab7f0SSascha Wildner #define PXENV_TFTP_READ_FILE 0x0023 394*479ab7f0SSascha Wildner typedef struct { 395*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 396*479ab7f0SSascha Wildner uint8_t FileName[128]; 397*479ab7f0SSascha Wildner uint32_t BufferSize; 398*479ab7f0SSascha Wildner ADDR32_t Buffer; 399*479ab7f0SSascha Wildner IP4_t ServerIPAddress; 400*479ab7f0SSascha Wildner IP4_t GatewayIPAdress; 401*479ab7f0SSascha Wildner IP4_t McastIPAdress; 402*479ab7f0SSascha Wildner UDP_PORT_t TFTPClntPort; 403*479ab7f0SSascha Wildner UDP_PORT_t TFTPSrvPort; 404*479ab7f0SSascha Wildner uint16_t TFTPOpenTimeOut; 405*479ab7f0SSascha Wildner uint16_t TFTPReopenDelay; 406*479ab7f0SSascha Wildner } PACKED t_PXENV_TFTP_READ_FILE; 407*479ab7f0SSascha Wildner 408*479ab7f0SSascha Wildner #define PXENV_TFTP_GET_FSIZE 0x0025 409*479ab7f0SSascha Wildner typedef struct { 410*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 411*479ab7f0SSascha Wildner IP4_t ServerIPAddress; 412*479ab7f0SSascha Wildner IP4_t GatewayIPAdress; 413*479ab7f0SSascha Wildner uint8_t FileName[128]; 414*479ab7f0SSascha Wildner uint32_t FileSize; 415*479ab7f0SSascha Wildner } PACKED t_PXENV_TFTP_GET_FSIZE; 416*479ab7f0SSascha Wildner 417*479ab7f0SSascha Wildner #define PXENV_UDP_OPEN 0x0030 418*479ab7f0SSascha Wildner typedef struct { 419*479ab7f0SSascha Wildner PXENV_STATUS_t status; 420*479ab7f0SSascha Wildner IP4_t src_ip; /* IP address of this station */ 421*479ab7f0SSascha Wildner } PACKED t_PXENV_UDP_OPEN; 422*479ab7f0SSascha Wildner 423*479ab7f0SSascha Wildner #define PXENV_UDP_CLOSE 0x0031 424*479ab7f0SSascha Wildner typedef struct { 425*479ab7f0SSascha Wildner PXENV_STATUS_t status; 426*479ab7f0SSascha Wildner } PACKED t_PXENV_UDP_CLOSE; 427*479ab7f0SSascha Wildner 428*479ab7f0SSascha Wildner #define PXENV_UDP_READ 0x0032 429*479ab7f0SSascha Wildner typedef struct { 430*479ab7f0SSascha Wildner PXENV_STATUS_t status; 431*479ab7f0SSascha Wildner IP4_t src_ip; /* IP of sender */ 432*479ab7f0SSascha Wildner IP4_t dest_ip; /* Only accept packets sent to this IP */ 433*479ab7f0SSascha Wildner UDP_PORT_t s_port; /* UDP source port of sender */ 434*479ab7f0SSascha Wildner UDP_PORT_t d_port; /* Only accept packets sent to this port */ 435*479ab7f0SSascha Wildner uint16_t buffer_size; /* Size of the packet buffer */ 436*479ab7f0SSascha Wildner SEGOFF16_t buffer; /* SEG:OFF to the packet buffer */ 437*479ab7f0SSascha Wildner } PACKED t_PXENV_UDP_READ; 438*479ab7f0SSascha Wildner 439*479ab7f0SSascha Wildner #define PXENV_UDP_WRITE 0x0033 440*479ab7f0SSascha Wildner typedef struct { 441*479ab7f0SSascha Wildner PXENV_STATUS_t status; 442*479ab7f0SSascha Wildner IP4_t ip; /* dest ip addr */ 443*479ab7f0SSascha Wildner IP4_t gw; /* ip gateway */ 444*479ab7f0SSascha Wildner UDP_PORT_t src_port; /* source udp port */ 445*479ab7f0SSascha Wildner UDP_PORT_t dst_port; /* destination udp port */ 446*479ab7f0SSascha Wildner uint16_t buffer_size; /* Size of the packet buffer */ 447*479ab7f0SSascha Wildner SEGOFF16_t buffer; /* SEG:OFF to the packet buffer */ 448*479ab7f0SSascha Wildner } PACKED t_PXENV_UDP_WRITE; 449*479ab7f0SSascha Wildner 450*479ab7f0SSascha Wildner #define PXENV_UNLOAD_STACK 0x0070 451*479ab7f0SSascha Wildner typedef struct { 452*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 453*479ab7f0SSascha Wildner uint8_t reserved[10]; 454*479ab7f0SSascha Wildner } PACKED t_PXENV_UNLOAD_STACK; 455*479ab7f0SSascha Wildner 456*479ab7f0SSascha Wildner 457*479ab7f0SSascha Wildner #define PXENV_GET_CACHED_INFO 0x0071 458*479ab7f0SSascha Wildner typedef struct { 459*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 460*479ab7f0SSascha Wildner uint16_t PacketType; /* type (defined right here) */ 461*479ab7f0SSascha Wildner # define PXENV_PACKET_TYPE_DHCP_DISCOVER 1 462*479ab7f0SSascha Wildner # define PXENV_PACKET_TYPE_DHCP_ACK 2 463*479ab7f0SSascha Wildner # define PXENV_PACKET_TYPE_BINL_REPLY 3 464*479ab7f0SSascha Wildner uint16_t BufferSize; /* max to copy, leave at 0 for pointer */ 465*479ab7f0SSascha Wildner SEGOFF16_t Buffer; /* copy to, leave at 0 for pointer */ 466*479ab7f0SSascha Wildner uint16_t BufferLimit; /* max size of buffer in BC dataseg ? */ 467*479ab7f0SSascha Wildner } PACKED t_PXENV_GET_CACHED_INFO; 468*479ab7f0SSascha Wildner 469*479ab7f0SSascha Wildner 470*479ab7f0SSascha Wildner /* structure filled in by PXENV_GET_CACHED_INFO 471*479ab7f0SSascha Wildner * (how we determine which IP we downloaded the initial bootstrap from) 472*479ab7f0SSascha Wildner * words can't describe... 473*479ab7f0SSascha Wildner */ 474*479ab7f0SSascha Wildner typedef struct { 475*479ab7f0SSascha Wildner uint8_t opcode; 476*479ab7f0SSascha Wildner # define BOOTP_REQ 1 477*479ab7f0SSascha Wildner # define BOOTP_REP 2 478*479ab7f0SSascha Wildner uint8_t Hardware; /* hardware type */ 479*479ab7f0SSascha Wildner uint8_t Hardlen; /* hardware addr len */ 480*479ab7f0SSascha Wildner uint8_t Gatehops; /* zero it */ 481*479ab7f0SSascha Wildner uint32_t ident; /* random number chosen by client */ 482*479ab7f0SSascha Wildner uint16_t seconds; /* seconds since did initial bootstrap */ 483*479ab7f0SSascha Wildner uint16_t Flags; /* seconds since did initial bootstrap */ 484*479ab7f0SSascha Wildner # define BOOTP_BCAST 0x8000 /* ? */ 485*479ab7f0SSascha Wildner IP4_t cip; /* Client IP */ 486*479ab7f0SSascha Wildner IP4_t yip; /* Your IP */ 487*479ab7f0SSascha Wildner IP4_t sip; /* IP to use for next boot stage */ 488*479ab7f0SSascha Wildner IP4_t gip; /* Relay IP ? */ 489*479ab7f0SSascha Wildner MAC_ADDR CAddr; /* Client hardware address */ 490*479ab7f0SSascha Wildner uint8_t Sname[64]; /* Server's hostname (Optional) */ 491*479ab7f0SSascha Wildner uint8_t bootfile[128]; /* boot filename */ 492*479ab7f0SSascha Wildner union { 493*479ab7f0SSascha Wildner # if 1 494*479ab7f0SSascha Wildner # define BOOTP_DHCPVEND 1024 /* DHCP extended vendor field size */ 495*479ab7f0SSascha Wildner # else 496*479ab7f0SSascha Wildner # define BOOTP_DHCPVEND 312 /* DHCP standard vendor field size */ 497*479ab7f0SSascha Wildner # endif 498*479ab7f0SSascha Wildner uint8_t d[BOOTP_DHCPVEND]; /* raw array of vendor/dhcp options */ 499*479ab7f0SSascha Wildner struct { 500*479ab7f0SSascha Wildner uint8_t magic[4]; /* DHCP magic cookie */ 501*479ab7f0SSascha Wildner # ifndef VM_RFC1048 502*479ab7f0SSascha Wildner # define VM_RFC1048 0x63825363L /* ? */ 503*479ab7f0SSascha Wildner # endif 504*479ab7f0SSascha Wildner uint32_t flags; /* bootp flags/opcodes */ 505*479ab7f0SSascha Wildner uint8_t pad[56]; /* I don't think intel knows what a 506*479ab7f0SSascha Wildner union does... */ 507*479ab7f0SSascha Wildner } v; 508*479ab7f0SSascha Wildner } vendor; 509*479ab7f0SSascha Wildner } PACKED BOOTPLAYER; 510*479ab7f0SSascha Wildner 511*479ab7f0SSascha Wildner #define PXENV_RESTART_TFTP 0x0073 512*479ab7f0SSascha Wildner #define t_PXENV_RESTART_TFTP t_PXENV_TFTP_READ_FILE 513*479ab7f0SSascha Wildner 514*479ab7f0SSascha Wildner #define PXENV_START_BASE 0x0075 515*479ab7f0SSascha Wildner typedef struct { 516*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 517*479ab7f0SSascha Wildner } PACKED t_PXENV_START_BASE; 518*479ab7f0SSascha Wildner 519*479ab7f0SSascha Wildner #define PXENV_STOP_BASE 0x0076 520*479ab7f0SSascha Wildner typedef struct { 521*479ab7f0SSascha Wildner PXENV_STATUS_t Status; 522*479ab7f0SSascha Wildner } PACKED t_PXENV_STOP_BASE; 523