1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
/*
* Copyright (c) 1995, 1996 Cygnus Support
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice is included verbatim in any distributions. No written agreement,
* license, or royalty fee is required for any of the authorized uses.
* Modifications to this software may be copyrighted by their authors
* and need not follow the licensing terms described here, provided that
* the new terms are clearly indicated on the first page of each file where
* they apply.
*/
static const char hexchars[]="0123456789abcdef";
typedef void (*exception_t)(int); /* pointer to function with int parm */
/*
* This is the default function handler to be called with all exceptions.
*/
extern exception_t default_trap_hook;
/* this is used to make Unix style signale nukbers to an exception */
struct trap_info
{
unsigned char tt; /* exception number */
unsigned char signo; /* corresponding signal number */
};
/*
* prototypes for the functions in debug.c. As these'll only be used with GCC,
* we don't worry about no stinkin K&R comilers.
*/
extern void exception_handler (int, unsigned long);
extern unsigned char *mem2hex(unsigned char *, unsigned char *, int, int);
extern unsigned char *hex2mem(unsigned char *, unsigned char *, int, int);
extern void getpacket(unsigned char *);
extern void putpacket(unsigned char *);
extern char *make_return_packet(int);
extern void set_debug_traps();
extern int computeSignal(int);
extern char digit2hex(int);
extern int hex2digit(int);
extern void debuglogs(int level, char *msg);
extern int hex2int();
extern char *int2hex(int);
extern void gdb_event_loop(int, unsigned long *);
extern char *gdb_read_registers(); /* g - read registers */
extern char *gdb_write_registers(char *); /* G - write registers */
extern char *gdb_read_memory(long, int); /* m - read memory */
extern char *gdb_write_memory(long, int, char *);/* M write memory */
extern char *gdb_continue(int, long ); /* c - continue */
extern char *gdb_step(int, long); /* s - step instruction(s) */
extern char *gdb_kill(); /* k - kill program */
extern char *gdb_last_signal(); /* ? - last signal */
extern char *gdb_baudrate(int); /* b - change baud rate */
extern char *gdb_dump_state(); /* T - dump state */
extern char *gdb_set_thread(int, int); /* H - set thread */
extern char *gdb_detach(); /* D - detach */
extern char *gdb_read_reg(int); /* p - read one register */
extern char *gdb_write_reg(int, long); /* P - write one register */
extern char *gdb_exited(); /* W - process exited */
extern char *gdb_terminated(); /* X - process terminated */
extern char *gdb_hex(); /* O - hex encoding */
extern char *gdb_thread_alive(int); /* A - tread alive request */
extern char *gdb_extended(); /* ! - extended protocol */
extern char *gdb_debug(); /* d - toggle stub diagnostics */
extern char *gdb_toggle(); /* unsupported, toggle stub on/off */
extern char *gdb_reset(); /* r - reset target */
extern char *gdb_search(long, long, long); /* t - search backwards */
extern char *gdb_query(char *); /* q - general query */
extern char *gdb_set(char *); /* Q - set value */
/*
* indicate to caller of mem2hex or hex2mem that there has been an error.
* 0 means ok, 1 means error
*/
extern volatile int mem_err;
/*
* indicate whether the debug vectors have been initialized
* 0 means not yet, 1 means yep, it's ready.
*/
extern int initialized;
/*
* 1 means print debugging messages from the target, 0 means be quiet.
*/
extern int remote_debug;
/*
* Set up the command processing required for GDB
*/
struct gdb_ops {
/*
* these functions are the most minimal working subset top get full
* functionality for remote debugging
*/
char *(*gdb_read_registers); /* g - read registers */
char *(*gdb_write_registers)(char *); /* G - write registers */
char *(*gdb_read_memory)(long, int); /* m - read memory */
char *(*gdb_write_memory)(long, int, char *);/* M write memory */
char *(*gdb_continue)(int, long ); /* c - continue */
char *(*gdb_step)(int, long); /* s - step instruction(s) */
char *(*gdb_kill); /* k - kill program */
char *(*gdb_last_signal); /* ? - last signal */
char *(*gdb_baudrate)(int); /* b - change baud rate */
char *(*gdb_dump_state); /* T - dump state */
/*
* these functions are for a more sophisticated target, typically
* running a simple RTOS.
*/
char *(*gdb_set_thread)(int, int); /* H - set thread */
char *(*gdb_detach); /* D - detach */
char *(*gdb_read_reg)(int); /* p - read one register */
char *(*gdb_write_reg)(int, long); /* P - write one register */
char *(*gdb_exited); /* W - process exited */
char *(*gdb_terminated); /* X - process terminated */
char *(*gdb_hex); /* O - hex encoding */
char *(*gdb_thread_alive)(int); /* A - tread alive request */
/* FIXME: not standard yet */
char *(*gdb_extended); /* ! - extended protocol */
char *(*gdb_debug); /* d - toggle stub diagnostics */
char *(*gdb_toggle); /* unsupported, toggle stub on/off */
char *(*gdb_reset); /* r - reset target */
char *(*gdb_search)(long, long, long); /* t - search backwards */
char *(*gdb_query)(char *); /* q - general query */
char *(*gdb_set)(long); /* Q - set value */
};
/*
* BUFMAX defines the maximum number of characters in inbound/outbound buffers
* at least NUMREGBYTES*2 are needed for register packets
*/
#define BUFMAX 2048
extern char packet_in_buf[BUFMAX];
extern char packet_out_buf[BUFMAX];
extern int packet_index;
#define DEBUG(x, y) debuglog(x, y);
#define set_debug_level(x) remote_debug = x;
#define OK 0
#define ERROR -1
#define ENN(x) "x"
#define MAY_FAULT 1
#define NO_FAULT 0
|