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