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