xref: /xnu-11215.41.3/osfmk/kdp/kdp_protocol.h (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
1 /*
2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef _KDP_PROTOCOL_H_
30 #define _KDP_PROTOCOL_H_
31 
32 /*
33  * Definition of remote debugger protocol.
34  */
35 
36 
37 #ifdef MACH_KERNEL_PRIVATE
38 #include        <mach/vm_prot.h>
39 #include    <mach/boolean.h>
40 #include        <stdint.h>
41 #endif
42 
43 #ifdef KDP_PROXY_PACK_SUPPORT
44 #pragma pack(1)
45 #define KDP_PACKED
46 #else
47 #define KDP_PACKED __attribute__((packed))
48 #endif
49 
50 /*
51  * Retransmit parameters
52  */
53 #if     DDEBUG_DEBUG || DEBUG_DEBUG
54 #define KDP_REXMIT_SECS         20      /* rexmit if no ack in 3 secs */
55 #else   /* DDEBUG_DEBUG || DEBUG_DEBUG */
56 #define KDP_REXMIT_SECS         3       /* rexmit if no ack in 3 secs */
57 #endif  /* DDEBUG_DEBUG || DEBUG_DEBUG */
58 #define KDP_REXMIT_TRIES        8       /* xmit 8 times, then give up */
59 
60 
61 /*
62  * (NMI) Attention Max Wait Time
63  * Remote will resume unless KDP requests is received within this
64  * many seconds after an attention (nmi) packet is sent.
65  */
66 #define KDP_MAX_ATTN_WAIT       30      /* wait max of 30 seconds */
67 
68 /*
69  * Well-known UDP port, debugger side.
70  * FIXME: This is what the 68K guys use, but beats me how they chose it...
71  */
72 #define KDP_REMOTE_PORT         41139   /* pick one and register it */
73 
74 /*
75  * UDP ports, KDB side. 5 port numbers are reserved for each port (request
76  * and exception). This allows multiple KDBs to run on one host.
77  */
78 #define UDP_HOST_COMM_BASE      41140
79 #define UDP_HOST_EXCEP_BASE     41145
80 #define NUM_UDP_HOST_PORTS      5
81 
82 /*
83  * Requests
84  */
85 typedef enum {
86 	/* connection oriented requests */
87 	KDP_CONNECT, KDP_DISCONNECT,
88 
89 	/* obtaining client info */
90 	KDP_HOSTINFO, KDP_VERSION, KDP_MAXBYTES,
91 
92 	/* memory access */
93 	KDP_READMEM, KDP_WRITEMEM,
94 
95 	/* register access */
96 	KDP_READREGS, KDP_WRITEREGS,
97 
98 	/* executable image info */
99 	KDP_LOAD, KDP_IMAGEPATH,
100 
101 	/* execution control */
102 	KDP_SUSPEND, KDP_RESUMECPUS,
103 
104 	/* exception and termination notification, NOT true requests */
105 	KDP_EXCEPTION, KDP_TERMINATION,
106 
107 	/* breakpoint control */
108 	KDP_BREAKPOINT_SET, KDP_BREAKPOINT_REMOVE,
109 
110 	/* vm regions */
111 	KDP_REGIONS,
112 
113 	/* reattach to a connected host */
114 	KDP_REATTACH,
115 
116 	/* remote reboot request */
117 	KDP_HOSTREBOOT,
118 
119 	/* memory access (64-bit wide addresses). Version 11 protocol */
120 	KDP_READMEM64, KDP_WRITEMEM64,
121 
122 	/* breakpoint control (64-bit wide addresses). Version 11 protocol */
123 	KDP_BREAKPOINT64_SET, KDP_BREAKPOINT64_REMOVE,
124 
125 	/* kernel version string, like "xnu-1234.5~6". Version 11 protocol */
126 	KDP_KERNELVERSION,
127 
128 	/* physical memory access (64-bit wide addresses). Version 12 protocol */
129 	KDP_READPHYSMEM64, KDP_WRITEPHYSMEM64,
130 
131 	/* ioport access (8-, 16-, and 32-bit) */
132 	KDP_READIOPORT, KDP_WRITEIOPORT,
133 
134 	/* msr access (64-bit) */
135 	KDP_READMSR64, KDP_WRITEMSR64,
136 
137 	/* get/dump panic/corefile info */
138 	KDP_DUMPINFO,
139 
140 	/* keep this last */
141 	KDP_INVALID_REQUEST
142 } kdp_req_t;
143 
144 typedef enum {
145 	KDP_DUMPINFO_GETINFO    = 0x00000000,
146 	KDP_DUMPINFO_SETINFO    = 0x00000001,
147 	KDP_DUMPINFO_CORE       = 0x00000102,
148 	KDP_DUMPINFO_PANICLOG   = 0x00000103,
149 	KDP_DUMPINFO_SYSTEMLOG  = 0x00000104,
150 	KDP_DUMPINFO_DISABLE    = 0x00000105,
151 	KDP_DUMPINFO_MASK       = 0x00000FFF,
152 	KDP_DUMPINFO_DUMP       = 0x00000100,
153 
154 	KDP_DUMPINFO_REBOOT     = 0x10000000,
155 	KDP_DUMPINFO_NORESUME   = 0x20000000,
156 	KDP_DUMPINFO_RESUME     = 0x00000000, /* default behaviour */
157 	KDP_DUMPINFO_NOINTR     = 0x40000000, /* don't interrupt */
158 	KDP_DUMPINFO_INTR       = 0x00000000, /* default behaviour */
159 } kdp_dumpinfo_t;
160 
161 /*
162  * Common KDP packet header
163  * NOTE: kgmacros has a non-symboled version of kdp_hdr_t so that some basic information.
164  *       can be gathered from a kernel without any symbols. changes to this structure
165  *       need to be reflected in kgmacros as well.
166  */
167 typedef struct {
168 	kdp_req_t       request:7;      /* kdp_req_t, request type */
169 	unsigned        is_reply:1;     /* 0 => request, 1 => reply */
170 	unsigned        seq:8;          /* sequence number within session */
171 	unsigned        len:16;         /* length of entire pkt including hdr */
172 	unsigned        key;            /* session key */
173 } KDP_PACKED kdp_hdr_t;
174 
175 /*
176  * KDP errors
177  */
178 typedef enum {
179 	KDPERR_NO_ERROR = 0,
180 	KDPERR_ALREADY_CONNECTED,
181 	KDPERR_BAD_NBYTES,
182 	KDPERR_BADFLAVOR,               /* bad flavor in w/r regs */
183 	KDPERR_BAD_ACCESS,              /* memory reference failure */
184 
185 	KDPERR_MAX_BREAKPOINTS = 100,
186 	KDPERR_BREAKPOINT_NOT_FOUND = 101,
187 	KDPERR_BREAKPOINT_ALREADY_SET = 102
188 } kdp_error_t;
189 
190 #if defined(__x86_64__)
191 #define KDPERR_ACCESS(_req, _ret)  \
192 	(((_req) == (uint32_t)(_ret)) ? KDPERR_NO_ERROR : KDPERR_BAD_ACCESS)
193 #else
194 #define KDPERR_ACCESS(req, cnt)  (KDPERR_NO_ERROR)
195 #endif /* x86_64 */
196 
197 
198 /*
199  * KDP requests and reply packet formats
200  */
201 
202 /*
203  * KDP_CONNECT
204  */
205 typedef struct {                        /* KDP_CONNECT request */
206 	kdp_hdr_t       hdr;
207 	uint16_t        req_reply_port; /* udp port which to send replies */
208 	uint16_t        exc_note_port;  /* udp port which to send exc notes */
209 	char            greeting[0];    /* "greetings", nul-terminated */
210 } KDP_PACKED kdp_connect_req_t;
211 
212 typedef struct {                        /* KDP_CONNECT reply */
213 	kdp_hdr_t       hdr;
214 	kdp_error_t     error;
215 } KDP_PACKED kdp_connect_reply_t;
216 
217 /*
218  * KDP_DISCONNECT
219  */
220 typedef struct {                        /* KDP_DISCONNECT request */
221 	kdp_hdr_t       hdr;
222 } KDP_PACKED kdp_disconnect_req_t;
223 
224 typedef struct {                        /* KDP_DISCONNECT reply */
225 	kdp_hdr_t       hdr;
226 } KDP_PACKED kdp_disconnect_reply_t;
227 
228 /*
229  * KDP_REATTACH
230  */
231 typedef struct {
232 	kdp_hdr_t hdr;
233 	uint16_t req_reply_port; /* udp port which to send replies */
234 } KDP_PACKED kdp_reattach_req_t;
235 
236 /*
237  * KDP_HOSTINFO
238  */
239 typedef struct {                        /* KDP_HOSTINFO request */
240 	kdp_hdr_t       hdr;
241 } KDP_PACKED kdp_hostinfo_req_t;
242 
243 typedef struct {
244 	uint32_t                cpus_mask;      /* bit is 1 if cpu present */
245 	uint32_t                cpu_type;
246 	uint32_t                cpu_subtype;
247 } KDP_PACKED kdp_hostinfo_t;
248 
249 typedef struct {                        /* KDP_HOSTINFO reply */
250 	kdp_hdr_t       hdr;
251 	kdp_hostinfo_t  hostinfo;
252 } KDP_PACKED kdp_hostinfo_reply_t;
253 
254 /*
255  * KDP_VERSION
256  */
257 typedef struct {                        /* KDP_VERSION request */
258 	kdp_hdr_t       hdr;
259 } KDP_PACKED kdp_version_req_t;
260 
261 #define KDP_FEATURE_BP  0x1     /* local breakpoint support */
262 
263 typedef struct {                        /* KDP_VERSION reply */
264 	kdp_hdr_t       hdr;
265 	uint32_t        version;
266 	uint32_t        feature;
267 	uint32_t        pad0;
268 	uint32_t        pad1;
269 } KDP_PACKED kdp_version_reply_t;
270 
271 #define VM_PROT_VOLATILE        ((vm_prot_t) 0x08)      /* not cacheable */
272 #define VM_PROT_SPARSE          ((vm_prot_t) 0x10)      /* sparse addr space */
273 
274 /*
275  * KDP_REGIONS
276  */
277 typedef struct {                        /* KDP_REGIONS request */
278 	kdp_hdr_t       hdr;
279 } KDP_PACKED kdp_regions_req_t;
280 
281 typedef struct {
282 	uint32_t        address;
283 	uint32_t        nbytes;
284 	uint32_t        protection;     /* vm_prot_t */
285 } KDP_PACKED kdp_region_t;
286 
287 typedef struct {                        /* KDP_REGIONS reply */
288 	kdp_hdr_t       hdr;
289 	uint32_t        nregions;
290 	kdp_region_t    regions[0];
291 } KDP_PACKED kdp_regions_reply_t;
292 
293 /*
294  * KDP_MAXBYTES
295  */
296 typedef struct {                        /* KDP_MAXBYTES request */
297 	kdp_hdr_t       hdr;
298 } KDP_PACKED kdp_maxbytes_req_t;
299 
300 typedef struct {                        /* KDP_MAXBYTES reply */
301 	kdp_hdr_t       hdr;
302 	uint32_t        max_bytes;
303 } KDP_PACKED kdp_maxbytes_reply_t;
304 
305 /*
306  * KDP_READMEM
307  */
308 typedef struct {                        /* KDP_READMEM request */
309 	kdp_hdr_t       hdr;
310 	uint32_t        address;
311 	uint32_t        nbytes;
312 } KDP_PACKED kdp_readmem_req_t;
313 
314 typedef struct {                        /* KDP_READMEM reply */
315 	kdp_hdr_t       hdr;
316 	kdp_error_t     error;
317 	char            data[0];
318 } KDP_PACKED kdp_readmem_reply_t;
319 
320 /*
321  * KDP_READMEM64
322  */
323 typedef struct {                        /* KDP_READMEM64 request */
324 	kdp_hdr_t       hdr;
325 	uint64_t        address;
326 	uint32_t        nbytes;
327 } KDP_PACKED kdp_readmem64_req_t;
328 
329 typedef struct {                        /* KDP_READMEM64 reply */
330 	kdp_hdr_t       hdr;
331 	kdp_error_t     error;
332 	char            data[0];
333 } KDP_PACKED kdp_readmem64_reply_t;
334 
335 /*
336  * KDP_READPHYSMEM64
337  */
338 typedef struct {                        /* KDP_READPHYSMEM64 request */
339 	kdp_hdr_t       hdr;
340 	uint64_t        address;
341 	uint32_t        nbytes;
342 	uint16_t        lcpu;
343 } KDP_PACKED kdp_readphysmem64_req_t;
344 
345 typedef struct {                        /* KDP_READPHYSMEM64 reply */
346 	kdp_hdr_t       hdr;
347 	kdp_error_t     error;
348 	char            data[0];
349 } KDP_PACKED kdp_readphysmem64_reply_t;
350 
351 /*
352  * KDP_WRITEMEM
353  */
354 typedef struct {                        /* KDP_WRITEMEM request */
355 	kdp_hdr_t       hdr;
356 	uint32_t        address;
357 	uint32_t        nbytes;
358 	char            data[0];
359 } KDP_PACKED kdp_writemem_req_t;
360 
361 typedef struct {                        /* KDP_WRITEMEM reply */
362 	kdp_hdr_t       hdr;
363 	kdp_error_t     error;
364 } KDP_PACKED kdp_writemem_reply_t;
365 
366 /*
367  * KDP_WRITEMEM64
368  */
369 typedef struct {                        /* KDP_WRITEMEM64 request */
370 	kdp_hdr_t       hdr;
371 	uint64_t        address;
372 	uint32_t        nbytes;
373 	char            data[0];
374 } KDP_PACKED kdp_writemem64_req_t;
375 
376 typedef struct {                        /* KDP_WRITEMEM64 reply */
377 	kdp_hdr_t       hdr;
378 	kdp_error_t     error;
379 } KDP_PACKED kdp_writemem64_reply_t;
380 
381 /*
382  * KDP_WRITEPHYSMEM64
383  */
384 typedef struct {                        /* KDP_WRITEPHYSMEM64 request */
385 	kdp_hdr_t       hdr;
386 	uint64_t        address;
387 	uint32_t        nbytes;
388 	uint16_t        lcpu;
389 	char            data[0];
390 } KDP_PACKED kdp_writephysmem64_req_t;
391 
392 typedef struct {                        /* KDP_WRITEPHYSMEM64 reply */
393 	kdp_hdr_t       hdr;
394 	kdp_error_t     error;
395 } KDP_PACKED kdp_writephysmem64_reply_t;
396 
397 /*
398  * KDP_WRITEIOPORT
399  */
400 typedef struct {                        /* KDP_WRITEIOPORT request */
401 	kdp_hdr_t       hdr;
402 	uint16_t        lcpu;
403 	uint16_t        address;
404 	uint16_t        nbytes;
405 	char            data[0];
406 } KDP_PACKED kdp_writeioport_req_t;
407 
408 typedef struct {                        /* KDP_WRITEIOPORT reply */
409 	kdp_hdr_t       hdr;
410 	kdp_error_t     error;
411 } KDP_PACKED kdp_writeioport_reply_t;
412 
413 /*
414  * KDP_READIOPORT
415  */
416 typedef struct {                        /* KDP_READIOPORT request */
417 	kdp_hdr_t       hdr;
418 	uint16_t        lcpu;
419 	uint16_t        address;
420 	uint16_t        nbytes;
421 } KDP_PACKED kdp_readioport_req_t;
422 
423 typedef struct {                        /* KDP_READIOPORT reply */
424 	kdp_hdr_t       hdr;
425 	kdp_error_t     error;
426 	char            data[0];
427 } KDP_PACKED kdp_readioport_reply_t;
428 
429 
430 /*
431  * KDP_WRITEMSR64
432  */
433 typedef struct {                        /* KDP_WRITEMSR64 request */
434 	kdp_hdr_t       hdr;
435 	uint32_t        address;
436 	uint16_t        lcpu;
437 	char            data[0];
438 } KDP_PACKED kdp_writemsr64_req_t;
439 
440 typedef struct {                        /* KDP_WRITEMSR64 reply */
441 	kdp_hdr_t       hdr;
442 	kdp_error_t     error;
443 } KDP_PACKED kdp_writemsr64_reply_t;
444 
445 /*
446  * KDP_READMSR64
447  */
448 typedef struct {                        /* KDP_READMSR64 request */
449 	kdp_hdr_t       hdr;
450 	uint32_t        address;
451 	uint16_t        lcpu;
452 } KDP_PACKED kdp_readmsr64_req_t;
453 
454 typedef struct {                        /* KDP_READMSR64 reply */
455 	kdp_hdr_t       hdr;
456 	kdp_error_t     error;
457 	char            data[0];
458 } KDP_PACKED kdp_readmsr64_reply_t;
459 
460 
461 /*
462  * KDP_READREGS
463  */
464 typedef struct {                        /* KDP_READREGS request */
465 	kdp_hdr_t       hdr;
466 	uint32_t        cpu;
467 	uint32_t        flavor;
468 } KDP_PACKED kdp_readregs_req_t;
469 
470 typedef struct {                        /* KDP_READREGS reply */
471 	kdp_hdr_t       hdr;
472 	kdp_error_t     error;          /* could be KDPERR_BADFLAVOR */
473 	char            data[0];
474 } KDP_PACKED kdp_readregs_reply_t;
475 
476 /*
477  * KDP_WRITEREGS
478  */
479 typedef struct {                        /* KDP_WRITEREGS request */
480 	kdp_hdr_t       hdr;
481 	uint32_t        cpu;
482 	uint32_t        flavor;
483 	char            data[0];
484 } KDP_PACKED kdp_writeregs_req_t;
485 
486 typedef struct {                        /* KDP_WRITEREGS reply */
487 	kdp_hdr_t       hdr;
488 	kdp_error_t     error;
489 } KDP_PACKED kdp_writeregs_reply_t;
490 
491 /*
492  * KDP_LOAD
493  */
494 typedef struct {                        /* KDP_LOAD request */
495 	kdp_hdr_t       hdr;
496 	char            file_args[0];
497 } KDP_PACKED kdp_load_req_t;
498 
499 typedef struct {                        /* KDP_LOAD reply */
500 	kdp_hdr_t       hdr;
501 	kdp_error_t     error;
502 } KDP_PACKED kdp_load_reply_t;
503 
504 /*
505  * KDP_IMAGEPATH
506  */
507 typedef struct {                        /* KDP_IMAGEPATH request */
508 	kdp_hdr_t       hdr;
509 } KDP_PACKED kdp_imagepath_req_t;
510 
511 typedef struct {                        /* KDP_IMAGEPATH reply */
512 	kdp_hdr_t       hdr;
513 	char            path[0];
514 } KDP_PACKED kdp_imagepath_reply_t;
515 
516 /*
517  * KDP_SUSPEND
518  */
519 typedef struct {                        /* KDP_SUSPEND request */
520 	kdp_hdr_t       hdr;
521 } KDP_PACKED kdp_suspend_req_t;
522 
523 typedef struct {                        /* KDP_SUSPEND reply */
524 	kdp_hdr_t       hdr;
525 } KDP_PACKED kdp_suspend_reply_t;
526 
527 /*
528  * KDP_RESUMECPUS
529  */
530 typedef struct {                        /* KDP_RESUMECPUS request */
531 	kdp_hdr_t       hdr;
532 	uint32_t        cpu_mask;
533 } KDP_PACKED kdp_resumecpus_req_t;
534 
535 typedef struct {                        /* KDP_RESUMECPUS reply */
536 	kdp_hdr_t       hdr;
537 } KDP_PACKED kdp_resumecpus_reply_t;
538 
539 /*
540  * KDP_BREAKPOINT_SET and KDP_BREAKPOINT_REMOVE
541  */
542 
543 typedef struct {
544 	kdp_hdr_t hdr;
545 	uint32_t      address;
546 } KDP_PACKED kdp_breakpoint_req_t;
547 
548 typedef struct {
549 	kdp_hdr_t hdr;
550 	kdp_error_t error;
551 } KDP_PACKED kdp_breakpoint_reply_t;
552 
553 /*
554  * KDP_BREAKPOINT64_SET and KDP_BREAKPOINT64_REMOVE
555  */
556 
557 typedef struct {
558 	kdp_hdr_t hdr;
559 	uint64_t        address;
560 } KDP_PACKED kdp_breakpoint64_req_t;
561 
562 typedef struct {
563 	kdp_hdr_t hdr;
564 	kdp_error_t error;
565 } KDP_PACKED kdp_breakpoint64_reply_t;
566 
567 /*
568  * Exception notifications
569  * (Exception notifications are not requests, and in fact travel from
570  * the remote debugger to the gdb agent KDB.)
571  */
572 typedef struct {                        /* exc. info for one cpu */
573 	uint32_t        cpu;
574 	/*
575 	 * Following info is defined as
576 	 * per <mach/exception.h>
577 	 */
578 	uint32_t        exception;
579 	uint32_t        code;
580 	uint32_t        subcode;
581 } KDP_PACKED kdp_exc_info_t;
582 
583 typedef struct {                        /* KDP_EXCEPTION notification */
584 	kdp_hdr_t       hdr;
585 	uint32_t        n_exc_info;
586 	kdp_exc_info_t  exc_info[0];
587 } KDP_PACKED kdp_exception_t;
588 
589 typedef struct {                        /* KDP_EXCEPTION acknowledgement */
590 	kdp_hdr_t       hdr;
591 } KDP_PACKED kdp_exception_ack_t;
592 
593 /*
594  * KDP_KERNELVERSION
595  */
596 typedef struct {                        /* KDP_KERNELVERSION request */
597 	kdp_hdr_t       hdr;
598 } KDP_PACKED kdp_kernelversion_req_t;
599 
600 typedef struct {                        /* KDP_KERNELVERSION reply */
601 	kdp_hdr_t       hdr;
602 	char            version[0];
603 } KDP_PACKED kdp_kernelversion_reply_t;
604 
605 
606 /*
607  * Child termination messages
608  */
609 typedef enum {
610 	KDP_FAULT = 0,          /* child took fault (internal use) */
611 	KDP_EXIT,               /* child exited */
612 	KDP_POWEROFF,           /* child power-off */
613 	KDP_REBOOT,             /* child reboot */
614 	KDP_COMMAND_MODE        /* child exit to mon command_mode */
615 } kdp_termination_code_t;
616 
617 typedef struct {                        /* KDP_TERMINATION notification */
618 	kdp_hdr_t               hdr;
619 	uint32_t                term_code;      /* kdp_termination_code_t */
620 	uint32_t                exit_code;
621 } KDP_PACKED kdp_termination_t;
622 
623 typedef struct {
624 	kdp_hdr_t       hdr;
625 } KDP_PACKED kdp_termination_ack_t;
626 
627 /*
628  * KDP_DUMPINFO
629  */
630 typedef struct {                        /* KDP_DUMPINFO request */
631 	kdp_hdr_t       hdr;
632 	char            name[50];
633 	char            destip[16];
634 	char            routerip[16];
635 	uint32_t        port;
636 	kdp_dumpinfo_t  type;
637 } KDP_PACKED kdp_dumpinfo_req_t;
638 
639 typedef struct {                        /* KDP_DUMPINFO reply */
640 	kdp_hdr_t       hdr;
641 	char            name[50];
642 	char            destip[16];
643 	char            routerip[16];
644 	uint32_t        port;
645 	kdp_dumpinfo_t  type;
646 } KDP_PACKED kdp_dumpinfo_reply_t;
647 
648 
649 typedef union {
650 	kdp_hdr_t               hdr;
651 	kdp_connect_req_t       connect_req;
652 	kdp_connect_reply_t     connect_reply;
653 	kdp_disconnect_req_t    disconnect_req;
654 	kdp_disconnect_reply_t  disconnect_reply;
655 	kdp_hostinfo_req_t      hostinfo_req;
656 	kdp_hostinfo_reply_t    hostinfo_reply;
657 	kdp_version_req_t       version_req;
658 	kdp_version_reply_t     version_reply;
659 	kdp_maxbytes_req_t      maxbytes_req;
660 	kdp_maxbytes_reply_t    maxbytes_reply;
661 	kdp_readmem_req_t       readmem_req;
662 	kdp_readmem_reply_t     readmem_reply;
663 	kdp_readmem64_req_t     readmem64_req;
664 	kdp_readmem64_reply_t   readmem64_reply;
665 	kdp_readphysmem64_req_t readphysmem64_req;
666 	kdp_readphysmem64_reply_t       readphysmem64_reply;
667 	kdp_writemem_req_t      writemem_req;
668 	kdp_writemem_reply_t    writemem_reply;
669 	kdp_writemem64_req_t    writemem64_req;
670 	kdp_writemem64_reply_t  writemem64_reply;
671 	kdp_writephysmem64_req_t        writephysmem64_req;
672 	kdp_writephysmem64_reply_t      writephysmem64_reply;
673 	kdp_readregs_req_t      readregs_req;
674 	kdp_readregs_reply_t    readregs_reply;
675 	kdp_writeregs_req_t     writeregs_req;
676 	kdp_writeregs_reply_t   writeregs_reply;
677 	kdp_load_req_t          load_req;
678 	kdp_load_reply_t        load_reply;
679 	kdp_imagepath_req_t     imagepath_req;
680 	kdp_imagepath_reply_t   imagepath_reply;
681 	kdp_suspend_req_t       suspend_req;
682 	kdp_suspend_reply_t     suspend_reply;
683 	kdp_resumecpus_req_t    resumecpus_req;
684 	kdp_resumecpus_reply_t  resumecpus_reply;
685 	kdp_exception_t         exception;
686 	kdp_exception_ack_t     exception_ack;
687 	kdp_termination_t       termination;
688 	kdp_termination_ack_t   termination_ack;
689 	kdp_breakpoint_req_t    breakpoint_req;
690 	kdp_breakpoint_reply_t  breakpoint_reply;
691 	kdp_breakpoint64_req_t  breakpoint64_req;
692 	kdp_breakpoint64_reply_t        breakpoint64_reply;
693 	kdp_reattach_req_t      reattach_req;
694 	kdp_regions_req_t       regions_req;
695 	kdp_regions_reply_t     regions_reply;
696 	kdp_kernelversion_req_t kernelversion_req;
697 	kdp_kernelversion_reply_t       kernelversion_reply;
698 	kdp_readioport_req_t    readioport_req;
699 	kdp_readioport_reply_t  readioport_reply;
700 	kdp_writeioport_req_t   writeioport_req;
701 	kdp_writeioport_reply_t writeioport_reply;
702 	kdp_readmsr64_req_t     readmsr64_req;
703 	kdp_readmsr64_reply_t   readmsr64_reply;
704 	kdp_writemsr64_req_t    writemsr64_req;
705 	kdp_writemsr64_reply_t  writemsr64_reply;
706 	kdp_dumpinfo_req_t      dumpinfo_req;
707 	kdp_dumpinfo_reply_t    dumpinfo_reply;
708 } kdp_pkt_t;
709 
710 #define MAX_KDP_PKT_SIZE        1200    /* max packet size */
711 #define MAX_KDP_DATA_SIZE       1024    /* max r/w data per packet */
712 
713 /*
714  * Support relatively small request/responses here.
715  * If kgmacros needs to make a larger request, increase
716  * this buffer size
717  */
718 #define KDP_MANUAL_PACKET_SIZE 128
719 struct kdp_manual_pkt {
720 	unsigned char       data[KDP_MANUAL_PACKET_SIZE];
721 	unsigned int        len;
722 	boolean_t           input;
723 } KDP_PACKED;
724 
725 #ifdef KDP_PROXY_PACK_SUPPORT
726 #pragma pack()
727 #endif
728 
729 #endif // _KDP_PROTOCOL_H_
730