|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* Copyright (c) 1991 by NeXT Computer, Inc. ! 23: * ! 24: * File: services/kdp.h ! 25: * ! 26: * Definition of remote debugger protocol. ! 27: * ! 28: * HISTORY ! 29: * 27-Oct-91 Mike DeMoney ([email protected]) ! 30: * Created ! 31: */ ! 32: ! 33: #include <mach/vm_prot.h> ! 34: ! 35: /* ! 36: * Retransmit parameters ! 37: */ ! 38: #if DDEBUG_DEBUG || DEBUG_DEBUG ! 39: #define KDP_REXMIT_SECS 20 /* rexmit if no ack in 3 secs */ ! 40: #else /* DDEBUG_DEBUG || DEBUG_DEBUG */ ! 41: #define KDP_REXMIT_SECS 3 /* rexmit if no ack in 3 secs */ ! 42: #endif /* DDEBUG_DEBUG || DEBUG_DEBUG */ ! 43: #define KDP_REXMIT_TRIES 8 /* xmit 8 times, then give up */ ! 44: ! 45: /* ! 46: * (NMI) Attention Max Wait Time ! 47: * Remote will resume unless KDP requests is received within this ! 48: * many seconds after an attention (nmi) packet is sent. ! 49: */ ! 50: #define KDP_MAX_ATTN_WAIT 30 /* wait max of 30 seconds */ ! 51: ! 52: /* ! 53: * Well-known UDP port, debugger side. ! 54: * FIXME: This is what the 68K guys use, but beats me how they chose it... ! 55: */ ! 56: #define KDP_REMOTE_PORT 41139 /* pick one and register it */ ! 57: ! 58: /* ! 59: * UDP ports, KDB side. 5 port numbers are reserved for each port (request ! 60: * and exception). This allows multiple KDBs to run on one host. ! 61: */ ! 62: #define UDP_HOST_COMM_BASE 41140 ! 63: #define UDP_HOST_EXCEP_BASE 41145 ! 64: #define NUM_UDP_HOST_PORTS 5 ! 65: ! 66: /* ! 67: * Requests ! 68: */ ! 69: typedef enum { ! 70: /* connection oriented requests */ ! 71: KDP_CONNECT, KDP_DISCONNECT, ! 72: ! 73: /* obtaining client info */ ! 74: KDP_HOSTINFO, KDP_REGIONS, KDP_MAXBYTES, ! 75: ! 76: /* memory access */ ! 77: KDP_READMEM, KDP_WRITEMEM, ! 78: ! 79: /* register access */ ! 80: KDP_READREGS, KDP_WRITEREGS, ! 81: ! 82: /* executable image info */ ! 83: KDP_LOAD, KDP_IMAGEPATH, ! 84: ! 85: /* execution control */ ! 86: KDP_SUSPEND, KDP_RESUMECPUS, ! 87: ! 88: /* exception and termination notification, NOT true requests */ ! 89: KDP_EXCEPTION, KDP_TERMINATION, ! 90: ! 91: /* remote reboot request */ ! 92: KDP_HOSTREBOOT ! 93: } kdp_req_t; ! 94: ! 95: /* ! 96: * Common KDP packet header ! 97: */ ! 98: typedef struct { ! 99: kdp_req_t request:7; /* request type */ ! 100: unsigned is_reply:1; /* 0 => request, 1 => reply */ ! 101: unsigned seq:8; /* sequence number within session */ ! 102: unsigned len:16; /* length of entire pkt including hdr */ ! 103: unsigned key; /* session key */ ! 104: } kdp_hdr_t; ! 105: ! 106: /* ! 107: * KDP errors ! 108: */ ! 109: typedef enum { ! 110: KDPERR_NO_ERROR = 0, ! 111: KDPERR_ALREADY_CONNECTED, ! 112: KDPERR_BAD_NBYTES, ! 113: KDPERR_BADFLAVOR /* bad flavor in w/r regs */ ! 114: } kdp_error_t; ! 115: ! 116: /* ! 117: * KDP requests and reply packet formats ! 118: */ ! 119: ! 120: /* ! 121: * KDP_CONNECT ! 122: */ ! 123: typedef struct { /* KDP_CONNECT request */ ! 124: kdp_hdr_t hdr; ! 125: unsigned short req_reply_port; /* udp port which to send replies */ ! 126: unsigned short exc_note_port; /* udp port which to send exc notes */ ! 127: char greeting[0]; /* "greetings", null-terminated */ ! 128: } kdp_connect_req_t; ! 129: ! 130: typedef struct { /* KDP_CONNECT reply */ ! 131: kdp_hdr_t hdr; ! 132: kdp_error_t error; ! 133: } kdp_connect_reply_t; ! 134: ! 135: /* ! 136: * KDP_DISCONNECT ! 137: */ ! 138: typedef struct { /* KDP_DISCONNECT request */ ! 139: kdp_hdr_t hdr; ! 140: } kdp_disconnect_req_t; ! 141: ! 142: typedef struct { /* KDP_DISCONNECT reply */ ! 143: kdp_hdr_t hdr; ! 144: } kdp_disconnect_reply_t; ! 145: ! 146: /* ! 147: * KDP_HOSTINFO ! 148: */ ! 149: typedef struct { /* KDP_HOSTINFO request */ ! 150: kdp_hdr_t hdr; ! 151: } kdp_hostinfo_req_t; ! 152: ! 153: typedef struct { ! 154: unsigned cpus_mask; /* bit is 1 if cpu present */ ! 155: int cpu_type; ! 156: int cpu_subtype; ! 157: } kdp_hostinfo_t; ! 158: ! 159: typedef struct { /* KDP_HOSTINFO reply */ ! 160: kdp_hdr_t hdr; ! 161: kdp_hostinfo_t hostinfo; ! 162: } kdp_hostinfo_reply_t; ! 163: ! 164: /* ! 165: * KDP_REGIONS ! 166: */ ! 167: typedef struct { /* KDP_REGIONS request */ ! 168: kdp_hdr_t hdr; ! 169: } kdp_regions_req_t; ! 170: ! 171: #define VM_PROT_VOLATILE ((vm_prot_t) 0x08) /* not cacheable */ ! 172: #define VM_PROT_SPARSE ((vm_prot_t) 0x10) /* sparse addr space */ ! 173: ! 174: typedef struct { ! 175: void *address; ! 176: unsigned nbytes; ! 177: vm_prot_t protection; ! 178: } kdp_region_t; ! 179: ! 180: typedef struct { /* KDP_REGIONS reply */ ! 181: kdp_hdr_t hdr; ! 182: unsigned nregions; ! 183: kdp_region_t regions[0]; ! 184: } kdp_regions_reply_t; ! 185: ! 186: /* ! 187: * KDP_MAXBYTES ! 188: */ ! 189: typedef struct { /* KDP_MAXBYTES request */ ! 190: kdp_hdr_t hdr; ! 191: } kdp_maxbytes_req_t; ! 192: ! 193: typedef struct { /* KDP_MAXBYTES reply */ ! 194: kdp_hdr_t hdr; ! 195: unsigned max_bytes; ! 196: } kdp_maxbytes_reply_t; ! 197: ! 198: /* ! 199: * KDP_READMEM ! 200: */ ! 201: typedef struct { /* KDP_READMEM request */ ! 202: kdp_hdr_t hdr; ! 203: void *address; ! 204: unsigned nbytes; ! 205: } kdp_readmem_req_t; ! 206: ! 207: typedef struct { /* KDP_READMEM reply */ ! 208: kdp_hdr_t hdr; ! 209: kdp_error_t error; ! 210: char data[0]; ! 211: } kdp_readmem_reply_t; ! 212: ! 213: /* ! 214: * KDP_WRITEMEM ! 215: */ ! 216: typedef struct { /* KDP_WRITEMEM request */ ! 217: kdp_hdr_t hdr; ! 218: void *address; ! 219: unsigned nbytes; ! 220: char data[0]; ! 221: } kdp_writemem_req_t; ! 222: ! 223: typedef struct { /* KDP_WRITEMEM reply */ ! 224: kdp_hdr_t hdr; ! 225: kdp_error_t error; ! 226: } kdp_writemem_reply_t; ! 227: ! 228: /* ! 229: * KDP_READREGS ! 230: */ ! 231: typedef struct { /* KDP_READREGS request */ ! 232: kdp_hdr_t hdr; ! 233: unsigned cpu; ! 234: unsigned flavor; ! 235: } kdp_readregs_req_t; ! 236: ! 237: typedef struct { /* KDP_READREGS reply */ ! 238: kdp_hdr_t hdr; ! 239: kdp_error_t error; /* could be KDPERR_BADFLAVOR */ ! 240: char data[0]; ! 241: } kdp_readregs_reply_t; ! 242: ! 243: /* ! 244: * KDP_WRITEREGS ! 245: */ ! 246: typedef struct { /* KDP_WRITEREGS request */ ! 247: kdp_hdr_t hdr; ! 248: unsigned cpu; ! 249: unsigned flavor; ! 250: char data[0]; ! 251: } kdp_writeregs_req_t; ! 252: ! 253: typedef struct { /* KDP_WRITEREGS reply */ ! 254: kdp_hdr_t hdr; ! 255: kdp_error_t error; ! 256: } kdp_writeregs_reply_t; ! 257: ! 258: /* ! 259: * KDP_LOAD ! 260: */ ! 261: typedef struct { /* KDP_LOAD request */ ! 262: kdp_hdr_t hdr; ! 263: char file_args[0]; ! 264: } kdp_load_req_t; ! 265: ! 266: typedef struct { /* KDP_LOAD reply */ ! 267: kdp_hdr_t hdr; ! 268: kdp_error_t error; ! 269: } kdp_load_reply_t; ! 270: ! 271: /* ! 272: * KDP_IMAGEPATH ! 273: */ ! 274: typedef struct { /* KDP_IMAGEPATH request */ ! 275: kdp_hdr_t hdr; ! 276: } kdp_imagepath_req_t; ! 277: ! 278: typedef struct { /* KDP_IMAGEPATH reply */ ! 279: kdp_hdr_t hdr; ! 280: char path[0]; ! 281: } kdp_imagepath_reply_t; ! 282: ! 283: /* ! 284: * KDP_SUSPEND ! 285: */ ! 286: typedef struct { /* KDP_SUSPEND request */ ! 287: kdp_hdr_t hdr; ! 288: } kdp_suspend_req_t; ! 289: ! 290: typedef struct { /* KDP_SUSPEND reply */ ! 291: kdp_hdr_t hdr; ! 292: } kdp_suspend_reply_t; ! 293: ! 294: /* ! 295: * KDP_RESUMECPUS ! 296: */ ! 297: typedef struct { /* KDP_RESUMECPUS request */ ! 298: kdp_hdr_t hdr; ! 299: unsigned cpu_mask; ! 300: } kdp_resumecpus_req_t; ! 301: ! 302: typedef struct { /* KDP_RESUMECPUS reply */ ! 303: kdp_hdr_t hdr; ! 304: } kdp_resumecpus_reply_t; ! 305: ! 306: /* ! 307: * Exception notifications ! 308: * (Exception notifications are not requests, and in fact travel from ! 309: * the remote debugger to the gdb agent KDB.) ! 310: */ ! 311: typedef struct { /* exc. info for one cpu */ ! 312: unsigned cpu; ! 313: /* ! 314: * Following info is defined as ! 315: * per <mach/exception.h> ! 316: */ ! 317: unsigned exception; ! 318: unsigned code; ! 319: unsigned subcode; ! 320: } kdp_exc_info_t; ! 321: ! 322: typedef struct { /* KDP_EXCEPTION notification */ ! 323: kdp_hdr_t hdr; ! 324: unsigned n_exc_info; ! 325: kdp_exc_info_t exc_info[0]; ! 326: } kdp_exception_t; ! 327: ! 328: typedef struct { /* KDP_EXCEPTION acknowledgement */ ! 329: kdp_hdr_t hdr; ! 330: } kdp_exception_ack_t; ! 331: ! 332: /* ! 333: * Child termination messages ! 334: */ ! 335: typedef enum { ! 336: KDP_FAULT = 0, /* child took fault (internal use) */ ! 337: KDP_EXIT, /* child exited */ ! 338: KDP_POWEROFF, /* child power-off */ ! 339: KDP_REBOOT, /* child reboot */ ! 340: KDP_COMMAND_MODE /* child exit to mon command_mode */ ! 341: } kdp_termination_code_t; ! 342: ! 343: typedef struct { /* KDP_TERMINATION notification */ ! 344: kdp_hdr_t hdr; ! 345: kdp_termination_code_t term_code; ! 346: unsigned exit_code; ! 347: } kdp_termination_t; ! 348: ! 349: typedef struct { ! 350: kdp_hdr_t hdr; ! 351: } kdp_termination_ack_t; ! 352: ! 353: typedef union { ! 354: kdp_hdr_t hdr; ! 355: kdp_connect_req_t connect_req; ! 356: kdp_connect_reply_t connect_reply; ! 357: kdp_disconnect_req_t disconnect_req; ! 358: kdp_disconnect_reply_t disconnect_reply; ! 359: kdp_hostinfo_req_t hostinfo_req; ! 360: kdp_hostinfo_reply_t hostinfo_reply; ! 361: kdp_regions_req_t regions_req; ! 362: kdp_regions_reply_t regions_reply; ! 363: kdp_maxbytes_req_t maxbytes_req; ! 364: kdp_maxbytes_reply_t maxbytes_reply; ! 365: kdp_readmem_req_t readmem_req; ! 366: kdp_readmem_reply_t readmem_reply; ! 367: kdp_writemem_req_t writemem_req; ! 368: kdp_writemem_reply_t writemem_reply; ! 369: kdp_readregs_req_t readregs_req; ! 370: kdp_readregs_reply_t readregs_reply; ! 371: kdp_writeregs_req_t writeregs_req; ! 372: kdp_writeregs_reply_t writeregs_reply; ! 373: kdp_load_req_t load_req; ! 374: kdp_load_reply_t load_reply; ! 375: kdp_imagepath_req_t imagepath_req; ! 376: kdp_imagepath_reply_t imagepath_reply; ! 377: kdp_suspend_req_t suspend_req; ! 378: kdp_suspend_reply_t suspend_reply; ! 379: kdp_resumecpus_req_t resumecpus_req; ! 380: kdp_resumecpus_reply_t resumecpus_reply; ! 381: kdp_exception_t exception; ! 382: kdp_exception_ack_t exception_ack; ! 383: kdp_termination_t termination; ! 384: kdp_termination_ack_t termination_ack; ! 385: } kdp_pkt_t; ! 386: ! 387: #define MAX_KDP_PKT_SIZE 1200 /* max packet size */ ! 388: #define MAX_KDP_DATA_SIZE 1024 /* max r/w data per packet */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.