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