xref: /titanic_52/usr/src/boot/sys/boot/i386/libi386/pxe.h (revision 7b2a1233f92b2b3cb858f2fdb69378a9ab0a42f1)
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  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  */
30 
31 /*
32  * The typedefs and structures declared in this file
33  * clearly violate style(9), the reason for this is to conform to the
34  * typedefs/structure-names used in the Intel literature to avoid confusion.
35  *
36  * It's for your own good. :)
37  */
38 
39 /* It seems that intel didn't think about ABI,
40  * either that or 16bit ABI != 32bit ABI (which seems reasonable)
41  * I have to thank Intel for the hair loss I incurred trying to figure
42  * out why PXE was mis-reading structures I was passing it (at least
43  * from my point of view)
44  *
45  * Solution: use gcc's '__packed' to correctly align
46  * structures passed into PXE
47  * Question: does this really work for PXE's expected ABI?
48  */
49 #define	PACKED		__packed
50 
51 #define	S_SIZE(s)	s, sizeof(s) - 1
52 
53 #define	PXENFSROOTPATH	"/pxeroot"
54 
55 typedef struct {
56 	uint16_t		offset;
57 	uint16_t		segment;
58 } SEGOFF16_t;
59 
60 typedef struct {
61 	uint16_t		Seg_Addr;
62 	uint32_t		Phy_Addr;
63 	uint16_t		Seg_Size;
64 } SEGDESC_t;
65 
66 typedef	uint16_t		SEGSEL_t;
67 typedef	uint16_t		PXENV_STATUS_t;
68 typedef	uint32_t		IP4_t;
69 typedef	uint32_t		ADDR32_t;
70 typedef	uint16_t		UDP_PORT_t;
71 
72 #define	MAC_ADDR_LEN		16
73 typedef	uint8_t			MAC_ADDR[MAC_ADDR_LEN];
74 
75 /* PXENV+ */
76 typedef struct {
77 	uint8_t		Signature[6];	/* 'PXENV+' */
78 	uint16_t	Version;	/* MSB = major, LSB = minor */
79 	uint8_t		Length;		/* structure length */
80 	uint8_t		Checksum;	/* checksum pad */
81 	SEGOFF16_t	RMEntry;	/* SEG:OFF to PXE entry point */
82 	/* don't use PMOffset and PMSelector (from the 2.1 PXE manual) */
83 	uint32_t	PMOffset;	/* Protected mode entry */
84 	SEGSEL_t	PMSelector;	/* Protected mode selector */
85 	SEGSEL_t	StackSeg;	/* Stack segment address */
86 	uint16_t	StackSize;	/* Stack segment size (bytes) */
87 	SEGSEL_t	BC_CodeSeg;	/* BC Code segment address */
88 	uint16_t	BC_CodeSize;	/* BC Code segment size (bytes) */
89 	SEGSEL_t	BC_DataSeg;	/* BC Data segment address */
90 	uint16_t	BC_DataSize;	/* BC Data segment size (bytes) */
91 	SEGSEL_t	UNDIDataSeg;	/* UNDI Data segment address */
92 	uint16_t	UNDIDataSize;	/* UNDI Data segment size (bytes) */
93 	SEGSEL_t	UNDICodeSeg;	/* UNDI Code segment address */
94 	uint16_t	UNDICodeSize;	/* UNDI Code segment size (bytes) */
95 	SEGOFF16_t	PXEPtr;		/* SEG:OFF to !PXE struct,
96 					   only present when Version > 2.1 */
97 } PACKED pxenv_t;
98 
99 /* !PXE */
100 typedef struct {
101 	uint8_t		Signature[4];
102 	uint8_t		StructLength;
103 	uint8_t		StructCksum;
104 	uint8_t		StructRev;
105 	uint8_t		reserved_1;
106 	SEGOFF16_t	UNDIROMID;
107 	SEGOFF16_t	BaseROMID;
108 	SEGOFF16_t	EntryPointSP;
109 	SEGOFF16_t	EntryPointESP;
110 	SEGOFF16_t	StatusCallout;
111 	uint8_t		reserved_2;
112 	uint8_t		SegDescCn;
113 	SEGSEL_t	FirstSelector;
114 	SEGDESC_t	Stack;
115 	SEGDESC_t	UNDIData;
116 	SEGDESC_t	UNDICode;
117 	SEGDESC_t	UNDICodeWrite;
118 	SEGDESC_t	BC_Data;
119 	SEGDESC_t	BC_Code;
120 	SEGDESC_t	BC_CodeWrite;
121 } PACKED pxe_t;
122 
123 #define	PXENV_START_UNDI		0x0000
124 typedef struct {
125 	PXENV_STATUS_t	Status;
126 	uint16_t	ax;
127 	uint16_t	bx;
128 	uint16_t	dx;
129 	uint16_t	di;
130 	uint16_t	es;
131 } PACKED t_PXENV_START_UNDI;
132 
133 #define	PXENV_UNDI_STARTUP		0x0001
134 typedef struct {
135 	PXENV_STATUS_t	Status;
136 } PACKED t_PXENV_UNDI_STARTUP;
137 
138 #define	PXENV_UNDI_CLEANUP		0x0002
139 typedef struct {
140 	PXENV_STATUS_t	Status;
141 } PACKED t_PXENV_UNDI_CLEANUP;
142 
143 #define	PXENV_UNDI_INITIALIZE		0x0003
144 typedef struct {
145 	PXENV_STATUS_t	Status;
146 	ADDR32_t	ProtocolIni;	/* Phys addr of a copy of the driver module */
147 	uint8_t		reserved[8];
148 } PACKED t_PXENV_UNDI_INITALIZE;
149 
150 
151 #define	MAXNUM_MCADDR		8
152 typedef struct {
153 	PXENV_STATUS_t	Status;
154 	uint16_t	MCastAddrCount;
155 	MAC_ADDR	McastAddr[MAXNUM_MCADDR];
156 } PACKED t_PXENV_UNDI_MCAST_ADDRESS;
157 
158 #define	PXENV_UNDI_RESET_ADAPTER	0x0004
159 typedef struct {
160 	PXENV_STATUS_t	Status;
161 	t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
162 } PACKED t_PXENV_UNDI_RESET;
163 
164 #define	PXENV_UNDI_SHUTDOWN		0x0005
165 typedef struct {
166 	PXENV_STATUS_t	Status;
167 } PACKED t_PXENV_UNDI_SHUTDOWN;
168 
169 #define	PXENV_UNDI_OPEN			0x0006
170 typedef struct {
171 	PXENV_STATUS_t	Status;
172 	uint16_t	OpenFlag;
173 	uint16_t	PktFilter;
174 #	define FLTR_DIRECTED	0x0001
175 #	define FLTR_BRDCST	0x0002
176 #	define FLTR_PRMSCS	0x0004
177 #	define FLTR_SRC_RTG	0x0008
178 
179 	t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
180 } PACKED t_PXENV_UNDI_OPEN;
181 
182 #define	PXENV_UNDI_CLOSE		0x0007
183 typedef struct {
184 	PXENV_STATUS_t	Status;
185 } PACKED t_PXENV_UNDI_CLOSE;
186 
187 #define	PXENV_UNDI_TRANSMIT		0x0008
188 typedef struct {
189 	PXENV_STATUS_t	Status;
190 	uint8_t		Protocol;
191 #	define P_UNKNOWN	0
192 #	define P_IP		1
193 #	define P_ARP		2
194 #	define P_RARP		3
195 
196 	uint8_t		XmitFlag;
197 #	define XMT_DESTADDR	0x0000
198 #	define XMT_BROADCAST	0x0001
199 
200 	SEGOFF16_t	DestAddr;
201 	SEGOFF16_t	TBD;
202 	uint32_t	Reserved[2];
203 } PACKED t_PXENV_UNDI_TRANSMIT;
204 
205 #define	MAX_DATA_BLKS		8
206 typedef struct {
207 	uint16_t	ImmedLength;
208 	SEGOFF16_t	Xmit;
209 	uint16_t	DataBlkCount;
210 	struct	DataBlk {
211 		uint8_t		TDPtrType;
212 		uint8_t		TDRsvdByte;
213 		uint16_t	TDDataLen;
214 		SEGOFF16_t	TDDataPtr;
215 	} DataBlock[MAX_DATA_BLKS];
216 } PACKED t_PXENV_UNDI_TBD;
217 
218 #define	PXENV_UNDI_SET_MCAST_ADDRESS	0x0009
219 typedef struct {
220 	PXENV_STATUS_t	Status;
221 	t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
222 } PACKED t_PXENV_UNDI_SET_MCAST_ADDR;
223 
224 #define	PXENV_UNDI_SET_STATION_ADDRESS	0x000A
225 typedef struct {
226 	PXENV_STATUS_t	Status;
227 	MAC_ADDR	StationAddress;		/* Temp MAC address to use */
228 } PACKED t_PXENV_UNDI_SET_STATION_ADDR;
229 
230 #define	PXENV_UNDI_SET_PACKET_FILTER	0x000B
231 typedef struct {
232 	PXENV_STATUS_t	Status;
233 	uint8_t		filter;			/* see UNDI_OPEN (0x0006) */
234 } PACKED t_PXENV_UNDI_SET_PACKET_FILTER;
235 
236 #define	PXENV_UNDI_GET_INFORMATION	0x000C
237 typedef struct {
238 	PXENV_STATUS_t	Status;
239 	uint16_t	BaseIo;			/* Adapter base I/O address */
240 	uint16_t	IntNumber;		/* Adapter IRQ number */
241 	uint16_t	MaxTranUnit;		/* Adapter maximum transmit unit */
242 	uint16_t	HwType;			/* Type of protocol at the hardware addr */
243 #	define ETHER_TYPE	1
244 #	define EXP_ETHER_TYPE	2
245 #	define IEEE_TYPE	6
246 #	define ARCNET_TYPE	7
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 be 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;
512