2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
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.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
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.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #ifndef _KDP_PROTOCOL_H_
30 #define _KDP_PROTOCOL_H_
33 * Definition of remote debugger protocol.
37 #ifdef MACH_KERNEL_PRIVATE
38 #include <mach/vm_prot.h>
39 #include <mach/boolean.h>
43 #ifdef KDP_PROXY_PACK_SUPPORT
47 #define KDP_PACKED __attribute__((packed))
51 * Retransmit parameters
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 */
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.
66 #define KDP_MAX_ATTN_WAIT 30 /* wait max of 30 seconds */
69 * Well-known UDP port, debugger side.
70 * FIXME: This is what the 68K guys use, but beats me how they chose it...
72 #define KDP_REMOTE_PORT 41139 /* pick one and register it */
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.
78 #define UDP_HOST_COMM_BASE 41140
79 #define UDP_HOST_EXCEP_BASE 41145
80 #define NUM_UDP_HOST_PORTS 5
86 /* connection oriented requests */
87 KDP_CONNECT
, KDP_DISCONNECT
,
89 /* obtaining client info */
90 KDP_HOSTINFO
, KDP_VERSION
, KDP_MAXBYTES
,
93 KDP_READMEM
, KDP_WRITEMEM
,
96 KDP_READREGS
, KDP_WRITEREGS
,
98 /* executable image info */
99 KDP_LOAD
, KDP_IMAGEPATH
,
101 /* execution control */
102 KDP_SUSPEND
, KDP_RESUMECPUS
,
104 /* exception and termination notification, NOT true requests */
105 KDP_EXCEPTION
, KDP_TERMINATION
,
107 /* breakpoint control */
108 KDP_BREAKPOINT_SET
, KDP_BREAKPOINT_REMOVE
,
113 /* reattach to a connected host */
116 /* remote reboot request */
119 /* memory access (64-bit wide addresses). Version 11 protocol */
120 KDP_READMEM64
, KDP_WRITEMEM64
,
122 /* breakpoint control (64-bit wide addresses). Version 11 protocol */
123 KDP_BREAKPOINT64_SET
, KDP_BREAKPOINT64_REMOVE
,
125 /* kernel version string, like "xnu-1234.5~6". Version 11 protocol */
128 /* physical memory access (64-bit wide addresses). Version 12 protocol */
129 KDP_READPHYSMEM64
, KDP_WRITEPHYSMEM64
,
131 /* ioport access (8-, 16-, and 32-bit) */
132 KDP_READIOPORT
, KDP_WRITEIOPORT
,
134 /* msr access (64-bit) */
135 KDP_READMSR64
, KDP_WRITEMSR64
,
137 /* get/dump panic/corefile info */
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,
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 */
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.
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
;
180 KDPERR_ALREADY_CONNECTED
,
182 KDPERR_BADFLAVOR
, /* bad flavor in w/r regs */
183 KDPERR_BAD_ACCESS
, /* memory reference failure */
185 KDPERR_MAX_BREAKPOINTS
= 100,
186 KDPERR_BREAKPOINT_NOT_FOUND
= 101,
187 KDPERR_BREAKPOINT_ALREADY_SET
= 102
190 #if defined(__x86_64__)
191 #define KDPERR_ACCESS(_req,_ret) \
192 (((_req) == (uint32_t)(_ret)) ? KDPERR_NO_ERROR : KDPERR_BAD_ACCESS)
194 #define KDPERR_ACCESS(req,cnt) (KDPERR_NO_ERROR)
199 * KDP requests and reply packet formats
205 typedef struct { /* KDP_CONNECT request */
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
;
212 typedef struct { /* KDP_CONNECT reply */
215 } KDP_PACKED kdp_connect_reply_t
;
220 typedef struct { /* KDP_DISCONNECT request */
222 } KDP_PACKED kdp_disconnect_req_t
;
224 typedef struct { /* KDP_DISCONNECT reply */
226 } KDP_PACKED kdp_disconnect_reply_t
;
233 uint16_t req_reply_port
; /* udp port which to send replies */
234 } KDP_PACKED kdp_reattach_req_t
;
239 typedef struct { /* KDP_HOSTINFO request */
241 } KDP_PACKED kdp_hostinfo_req_t
;
244 uint32_t cpus_mask
; /* bit is 1 if cpu present */
246 uint32_t cpu_subtype
;
247 } KDP_PACKED kdp_hostinfo_t
;
249 typedef struct { /* KDP_HOSTINFO reply */
251 kdp_hostinfo_t hostinfo
;
252 } KDP_PACKED kdp_hostinfo_reply_t
;
257 typedef struct { /* KDP_VERSION request */
259 } KDP_PACKED kdp_version_req_t
;
261 #define KDP_FEATURE_BP 0x1 /* local breakpoint support */
263 typedef struct { /* KDP_VERSION reply */
269 } KDP_PACKED kdp_version_reply_t
;
271 #define VM_PROT_VOLATILE ((vm_prot_t) 0x08) /* not cacheable */
272 #define VM_PROT_SPARSE ((vm_prot_t) 0x10) /* sparse addr space */
277 typedef struct { /* KDP_REGIONS request */
279 } KDP_PACKED kdp_regions_req_t
;
284 uint32_t protection
; /* vm_prot_t */
285 } KDP_PACKED kdp_region_t
;
287 typedef struct { /* KDP_REGIONS reply */
290 kdp_region_t regions
[0];
291 } KDP_PACKED kdp_regions_reply_t
;
296 typedef struct { /* KDP_MAXBYTES request */
298 } KDP_PACKED kdp_maxbytes_req_t
;
300 typedef struct { /* KDP_MAXBYTES reply */
303 } KDP_PACKED kdp_maxbytes_reply_t
;
308 typedef struct { /* KDP_READMEM request */
312 } KDP_PACKED kdp_readmem_req_t
;
314 typedef struct { /* KDP_READMEM reply */
318 } KDP_PACKED kdp_readmem_reply_t
;
323 typedef struct { /* KDP_READMEM64 request */
327 } KDP_PACKED kdp_readmem64_req_t
;
329 typedef struct { /* KDP_READMEM64 reply */
333 } KDP_PACKED kdp_readmem64_reply_t
;
338 typedef struct { /* KDP_READPHYSMEM64 request */
343 } KDP_PACKED kdp_readphysmem64_req_t
;
345 typedef struct { /* KDP_READPHYSMEM64 reply */
349 } KDP_PACKED kdp_readphysmem64_reply_t
;
354 typedef struct { /* KDP_WRITEMEM request */
359 } KDP_PACKED kdp_writemem_req_t
;
361 typedef struct { /* KDP_WRITEMEM reply */
364 } KDP_PACKED kdp_writemem_reply_t
;
369 typedef struct { /* KDP_WRITEMEM64 request */
374 } KDP_PACKED kdp_writemem64_req_t
;
376 typedef struct { /* KDP_WRITEMEM64 reply */
379 } KDP_PACKED kdp_writemem64_reply_t
;
384 typedef struct { /* KDP_WRITEPHYSMEM64 request */
390 } KDP_PACKED kdp_writephysmem64_req_t
;
392 typedef struct { /* KDP_WRITEPHYSMEM64 reply */
395 } KDP_PACKED kdp_writephysmem64_reply_t
;
400 typedef struct { /* KDP_WRITEIOPORT request */
406 } KDP_PACKED kdp_writeioport_req_t
;
408 typedef struct { /* KDP_WRITEIOPORT reply */
411 } KDP_PACKED kdp_writeioport_reply_t
;
416 typedef struct { /* KDP_READIOPORT request */
421 } KDP_PACKED kdp_readioport_req_t
;
423 typedef struct { /* KDP_READIOPORT reply */
427 } KDP_PACKED kdp_readioport_reply_t
;
433 typedef struct { /* KDP_WRITEMSR64 request */
438 } KDP_PACKED kdp_writemsr64_req_t
;
440 typedef struct { /* KDP_WRITEMSR64 reply */
443 } KDP_PACKED kdp_writemsr64_reply_t
;
448 typedef struct { /* KDP_READMSR64 request */
452 } KDP_PACKED kdp_readmsr64_req_t
;
454 typedef struct { /* KDP_READMSR64 reply */
458 } KDP_PACKED kdp_readmsr64_reply_t
;
464 typedef struct { /* KDP_READREGS request */
468 } KDP_PACKED kdp_readregs_req_t
;
470 typedef struct { /* KDP_READREGS reply */
472 kdp_error_t error
; /* could be KDPERR_BADFLAVOR */
474 } KDP_PACKED kdp_readregs_reply_t
;
479 typedef struct { /* KDP_WRITEREGS request */
484 } KDP_PACKED kdp_writeregs_req_t
;
486 typedef struct { /* KDP_WRITEREGS reply */
489 } KDP_PACKED kdp_writeregs_reply_t
;
494 typedef struct { /* KDP_LOAD request */
497 } KDP_PACKED kdp_load_req_t
;
499 typedef struct { /* KDP_LOAD reply */
502 } KDP_PACKED kdp_load_reply_t
;
507 typedef struct { /* KDP_IMAGEPATH request */
509 } KDP_PACKED kdp_imagepath_req_t
;
511 typedef struct { /* KDP_IMAGEPATH reply */
514 } KDP_PACKED kdp_imagepath_reply_t
;
519 typedef struct { /* KDP_SUSPEND request */
521 } KDP_PACKED kdp_suspend_req_t
;
523 typedef struct { /* KDP_SUSPEND reply */
525 } KDP_PACKED kdp_suspend_reply_t
;
530 typedef struct { /* KDP_RESUMECPUS request */
533 } KDP_PACKED kdp_resumecpus_req_t
;
535 typedef struct { /* KDP_RESUMECPUS reply */
537 } KDP_PACKED kdp_resumecpus_reply_t
;
540 * KDP_BREAKPOINT_SET and KDP_BREAKPOINT_REMOVE
546 } KDP_PACKED kdp_breakpoint_req_t
;
551 } KDP_PACKED kdp_breakpoint_reply_t
;
554 * KDP_BREAKPOINT64_SET and KDP_BREAKPOINT64_REMOVE
560 } KDP_PACKED kdp_breakpoint64_req_t
;
565 } KDP_PACKED kdp_breakpoint64_reply_t
;
568 * Exception notifications
569 * (Exception notifications are not requests, and in fact travel from
570 * the remote debugger to the gdb agent KDB.)
572 typedef struct { /* exc. info for one cpu */
575 * Following info is defined as
576 * per <mach/exception.h>
581 } KDP_PACKED kdp_exc_info_t
;
583 typedef struct { /* KDP_EXCEPTION notification */
586 kdp_exc_info_t exc_info
[0];
587 } KDP_PACKED kdp_exception_t
;
589 typedef struct { /* KDP_EXCEPTION acknowledgement */
591 } KDP_PACKED kdp_exception_ack_t
;
596 typedef struct { /* KDP_KERNELVERSION request */
598 } KDP_PACKED kdp_kernelversion_req_t
;
600 typedef struct { /* KDP_KERNELVERSION reply */
603 } KDP_PACKED kdp_kernelversion_reply_t
;
607 * Child termination messages
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
;
617 typedef struct { /* KDP_TERMINATION notification */
619 uint32_t term_code
; /* kdp_termination_code_t */
621 } KDP_PACKED kdp_termination_t
;
625 } KDP_PACKED kdp_termination_ack_t
;
630 typedef struct { /* KDP_DUMPINFO request */
637 } KDP_PACKED kdp_dumpinfo_req_t
;
639 typedef struct { /* KDP_DUMPINFO reply */
646 } KDP_PACKED kdp_dumpinfo_reply_t
;
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
;
710 #define MAX_KDP_PKT_SIZE 1200 /* max packet size */
711 #define MAX_KDP_DATA_SIZE 1024 /* max r/w data per packet */
714 * Support relatively small request/responses here.
715 * If kgmacros needs to make a larger request, increase
718 #define KDP_MANUAL_PACKET_SIZE 128
719 struct kdp_manual_pkt
{
720 unsigned char data
[KDP_MANUAL_PACKET_SIZE
];
725 #ifdef KDP_PROXY_PACK_SUPPORT
729 #endif // _KDP_PROTOCOL_H_