Annotation of XNU/osfmk/kdp/kdp_protocol.h, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.