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 | |