xref: /dragonfly/stand/boot/pc32/libi386/pxe.h (revision 479ab7f0)
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