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