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