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