Mercurial > flash_v2
annotate packages/hal/common/current/src/generic-stub.c @ 912:82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
* src/generic-stub.c: as above.
| author | jlarmour |
|---|---|
| date | Tue, 08 Apr 2003 01:13:14 +0000 |
| parents | 4747af8ef0ef |
| children | 609c8b1447ee |
| rev | line source |
|---|---|
| 2 | 1 #include "board.h" |
| 2 | |
| 3 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS | |
| 4 | |
| 5 /* Eventually, this should default to ON */ | |
| 6 #if USE_GDBSTUB_PROTOTYPES | |
| 7 #include "stub-tservice.h" | |
| 8 #include "generic-stub.h" | |
| 9 #else | |
| 10 // Function declarations (prevents compiler warnings) | |
| 11 int stubhex (unsigned char ch); | |
| 12 static void unlock_thread_scheduler (void); | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
13 static uint32 crc32 (target_addr_t mem, int len, uint32 crc); |
| 2 | 14 #endif |
| 15 | |
| 16 #include "thread-pkts.h" | |
| 17 /* Defines function macros if thread support is not selected in board.h */ | |
| 18 | |
|
145
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
138
diff
changeset
|
19 #ifdef __ECOS__ |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
138
diff
changeset
|
20 char GDB_stubs_version[] CYGBLD_ATTRIB_WEAK = |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
138
diff
changeset
|
21 "eCos GDB stubs - built " __DATE__ " / " __TIME__; |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
138
diff
changeset
|
22 #endif |
| 2 | 23 |
| 0 | 24 /**************************************************************************** |
| 25 | |
| 2 | 26 THIS SOFTWARE IS NOT COPYRIGHTED |
| 0 | 27 |
| 28 HP offers the following for use in the public domain. HP makes no | |
| 29 warranty with regard to the software or it's performance and the | |
| 30 user accepts the software "AS IS" with all faults. | |
| 31 | |
| 32 HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD | |
| 33 TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES | |
| 34 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
| 35 | |
| 36 ****************************************************************************/ | |
| 37 | |
| 38 /**************************************************************************** | |
| 39 * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $ | |
| 40 * | |
| 41 * Module name: remcom.c $ | |
| 42 * Revision: 1.34 $ | |
| 43 * Date: 91/03/09 12:29:49 $ | |
| 44 * Contributor: Lake Stevens Instrument Division$ | |
| 45 * | |
| 46 * Description: low level support for gdb debugger. $ | |
| 47 * | |
| 48 * Considerations: only works on target hardware $ | |
| 49 * | |
| 50 * Written by: Glenn Engel $ | |
| 51 * ModuleState: Experimental $ | |
| 52 * | |
| 53 * NOTES: See Below $ | |
| 54 * | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
48
diff
changeset
|
55 * Modified for SPARC by Stu Grossman, Red Hat. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
48
diff
changeset
|
56 * Modified for generic CygMON stub support by Bob Manson, Red Hat. |
| 0 | 57 * |
| 58 * To enable debugger support, two things need to happen. One, a | |
| 2 | 59 * call to set_debug_traps () is necessary in order to allow any breakpoints |
| 0 | 60 * or error conditions to be properly intercepted and reported to gdb. |
| 61 * Two, a breakpoint needs to be generated to begin communication. This | |
| 2 | 62 * is most easily accomplished by a call to breakpoint (). Breakpoint () |
| 0 | 63 * simulates a breakpoint by executing a trap #1. |
| 64 * | |
| 65 ************* | |
| 66 * | |
| 67 * The following gdb commands are supported: | |
| 68 * | |
| 69 * command function Return value | |
| 70 * | |
| 71 * g return the value of the CPU registers hex data or ENN | |
| 72 * G set the value of the CPU registers OK or ENN | |
| 73 * | |
| 74 * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN | |
| 75 * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN | |
| 76 * | |
| 77 * c Resume at current address SNN ( signal NN) | |
| 78 * cAA..AA Continue at address AA..AA SNN | |
| 79 * | |
| 80 * s Step one instruction SNN | |
| 81 * sAA..AA Step one instruction from AA..AA SNN | |
| 82 * | |
| 83 * k kill | |
| 84 * | |
| 85 * ? What was the last sigval ? SNN (signal NN) | |
| 86 * | |
| 2 | 87 * bBB..BB Set baud rate to BB..BB OK or BNN, then sets |
| 88 * baud rate | |
| 0 | 89 * |
| 90 * All commands and responses are sent with a packet which includes a | |
| 91 * checksum. A packet consists of | |
| 92 * | |
| 93 * $<packet info>#<checksum>. | |
| 94 * | |
| 95 * where | |
| 96 * <packet info> :: <characters representing the command or response> | |
| 97 * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>> | |
| 98 * | |
| 99 * When a packet is received, it is first acknowledged with either '+' or '-'. | |
| 100 * '+' indicates a successful transfer. '-' indicates a failed transfer. | |
| 101 * | |
| 102 * Example: | |
| 103 * | |
| 104 * Host: Reply: | |
| 105 * $m0,10#2a +$00010203040506070809101112131415#42 | |
| 106 * | |
| 107 ****************************************************************************/ | |
| 108 | |
|
48
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
109 #ifdef __ECOS__ |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
110 |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
111 // We cannot share memcpy and memset with the rest of the system since |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
112 // the user may want to step through it. |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
113 static inline void* |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
114 _memcpy(void* dest, void* src, int size) |
|
48
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
115 { |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
116 unsigned char* __d = (unsigned char*) dest; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
117 unsigned char* __s = (unsigned char*) src; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
118 |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
119 while(size--) |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
120 *__d++ = *__s++; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
121 |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
122 return dest; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
123 } |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
124 |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
125 static inline void* |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
126 _memset(void* s, int c, int size) |
|
48
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
127 { |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
128 unsigned char* __s = (unsigned char*) s; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
129 unsigned char __c = (unsigned char) c; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
130 |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
131 while(size--) |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
132 *__s++ = __c; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
133 |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
134 return s; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
135 } |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
136 |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
137 #else |
| 2 | 138 #include <string.h> |
| 139 #include <signal.h> | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
140 #define _memcpy memcpy |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
141 #define _memset memset |
| 2 | 142 #endif // __ECOS__ |
| 0 | 143 |
| 144 /************************************************************************/ | |
| 145 /* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/ | |
| 146 /* at least NUMREGBYTES*2 are needed for register packets */ | |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
147 #ifdef __ECOS__ |
|
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
148 #ifdef NUMREGBYTES |
|
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
149 #define BUFMAX (32 + (NUMREGBYTES*2)) |
|
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
150 #else |
| 0 | 151 #define BUFMAX 2048 |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
152 #endif |
|
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
153 #else |
|
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
154 #define BUFMAX 2048 |
|
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
155 #endif |
| 0 | 156 |
| 2 | 157 static int initialized = 0; /* !0 means we've been initialized */ |
| 158 | |
| 0 | 159 static int process_exception (int sigval); |
| 160 static void do_nothing (void); /* and do it gracefully */ | |
| 161 static int syscall_do_nothing (int); | |
| 2 | 162 |
|
895
4747af8ef0ef
Leave out unused static buffers if not supporting program args.
gthomas
parents:
317
diff
changeset
|
163 #ifdef CYGSEM_ECOS_SUPPORTS_PROGRAM_ARGS |
| 2 | 164 void __free_program_args (void); |
|
895
4747af8ef0ef
Leave out unused static buffers if not supporting program args.
gthomas
parents:
317
diff
changeset
|
165 static char *__add_program_arg (int argnum, uint32 arglen); |
|
4747af8ef0ef
Leave out unused static buffers if not supporting program args.
gthomas
parents:
317
diff
changeset
|
166 #endif |
| 0 | 167 |
| 168 volatile __PFI __process_exception_vec = process_exception; | |
| 169 volatile __PFV __process_exit_vec = do_nothing; | |
| 170 volatile __PFI __process_syscall_vec = syscall_do_nothing; | |
| 171 volatile __PFI __process_signal_vec = NULL; | |
| 2 | 172 volatile __PFV __init_vec = NULL; |
| 173 volatile __PFV __cleanup_vec = NULL; | |
| 174 | |
| 0 | 175 static const char hexchars[] = "0123456789abcdef"; |
| 176 | |
| 2 | 177 static void process_query (char *pkt); |
| 178 static void process_set (char *pkt); | |
| 0 | 179 |
| 180 char | |
| 181 __tohex (int c) | |
| 182 { | |
| 183 return hexchars [c & 15]; | |
| 184 } | |
| 185 | |
| 2 | 186 #define __tohex(c) hexchars[(c) & 15] |
| 0 | 187 |
| 188 #ifndef NUMREGS_GDB | |
| 189 #define NUMREGS_GDB NUMREGS | |
| 190 #endif | |
| 191 | |
| 192 /* One pushback character. */ | |
| 193 int ungot_char = -1; | |
| 194 | |
| 195 static int | |
| 196 readDebugChar (void) | |
| 197 { | |
| 198 if (ungot_char > 0) | |
| 199 { | |
| 200 int result = ungot_char; | |
| 201 ungot_char = -1; | |
| 202 return result; | |
| 203 } | |
| 204 else | |
| 205 return getDebugChar (); | |
| 206 } | |
| 207 | |
| 208 /* Convert ch from a hex digit to an int. */ | |
| 209 | |
| 210 int | |
| 2 | 211 stubhex (ch) |
| 212 unsigned char ch; | |
| 0 | 213 { |
| 214 if (ch >= 'a' && ch <= 'f') | |
| 215 return ch-'a'+10; | |
| 216 if (ch >= '0' && ch <= '9') | |
| 217 return ch-'0'; | |
| 218 if (ch >= 'A' && ch <= 'F') | |
| 219 return ch-'A'+10; | |
| 220 return -1; | |
| 221 } | |
| 222 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
223 void |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
224 __getpacket (buffer) |
| 2 | 225 char *buffer; |
| 0 | 226 { |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
227 struct gdb_packet packet; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
228 int res; |
| 0 | 229 |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
230 packet.state = 0; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
231 packet.contents = buffer; |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
232 packet.err = 0; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
233 while ((res = __add_char_to_packet (readDebugChar () & 0xff, &packet)) != 1) { |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
234 if (res == -2) { |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
235 putDebugChar ('-'); // Tell host packet was not processed |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
236 // Reset for the next packet |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
237 packet.state = 0; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
238 packet.err = 0; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
239 } |
| 0 | 240 } |
| 241 } | |
| 242 | |
| 243 int | |
| 2 | 244 __add_char_to_packet (ch, packet) |
| 245 unsigned int ch; | |
| 246 struct gdb_packet *packet; | |
| 0 | 247 { |
| 248 if (packet->state == 0) | |
| 249 { | |
| 250 if (ch == '$') | |
| 2 | 251 { |
| 252 packet->state = 1; | |
| 253 packet->length = 0; | |
| 254 packet->checksum = 0; | |
| 255 packet->xmitcsum = -1; | |
| 256 } | |
| 0 | 257 return 0; |
| 258 } | |
| 259 | |
| 260 if (packet->state == 1) | |
| 261 { | |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
262 if (packet->length == BUFMAX) |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
263 { |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
264 packet->state = 0; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
265 packet->err = 1; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
266 } |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
267 else if (ch == '#') |
| 2 | 268 { |
| 269 packet->contents[packet->length] = 0; | |
| 270 packet->state = 2; | |
| 271 } | |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
272 else |
| 2 | 273 { |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
274 packet->checksum += ch; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
275 packet->contents[packet->length++] = ch; |
| 2 | 276 } |
| 0 | 277 return 0; |
| 278 } | |
| 279 | |
| 280 if (packet->state == 2) | |
| 281 { | |
| 282 packet->xmitcsum = stubhex (ch) << 4; | |
| 283 packet->state = 3; | |
| 284 return 0; | |
| 285 } | |
| 286 | |
| 287 if (packet->state == 3) | |
| 288 { | |
| 2 | 289 packet->xmitcsum |= stubhex (ch); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
290 if (packet->err) { |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
291 // Packet was too long - just tell the consumer |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
292 return -2; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
293 } |
| 0 | 294 if ((packet->checksum & 255) != packet->xmitcsum) |
| 2 | 295 { |
| 296 putDebugChar ('-'); /* failed checksum */ | |
| 297 packet->state = 0; | |
| 298 return -1; | |
| 299 } | |
| 0 | 300 else |
| 2 | 301 { |
| 302 putDebugChar ('+'); /* successful transfer */ | |
| 303 /* if a sequence char is present, reply the sequence ID */ | |
| 304 if (packet->contents[2] == ':') | |
| 305 { | |
| 306 uint32 count = packet->length; | |
| 307 uint32 i; | |
| 308 putDebugChar (packet->contents[0]); | |
| 309 putDebugChar (packet->contents[1]); | |
| 310 /* remove sequence chars from buffer */ | |
| 311 for (i=3; i <= count; i++) | |
| 312 packet->contents[i-3] = packet->contents[i]; | |
| 313 } | |
| 314 return 1; | |
| 315 } | |
| 0 | 316 } |
| 317 /* We should never get here. */ | |
| 318 packet->state = 0; | |
| 319 return -1; | |
| 320 } | |
| 321 | |
| 322 /* send the packet in buffer. */ | |
| 323 | |
| 2 | 324 void |
| 325 __putpacket (buffer) | |
| 326 char *buffer; | |
| 0 | 327 { |
| 328 unsigned char checksum; | |
| 2 | 329 uint32 count; |
| 0 | 330 unsigned char ch; |
| 331 | |
| 332 /* $<packet info>#<checksum>. */ | |
| 333 do | |
| 334 { | |
| 335 putDebugChar ('$'); | |
| 336 checksum = 0; | |
| 337 count = 0; | |
| 338 | |
| 339 while ((ch = buffer[count])) | |
| 2 | 340 { |
| 341 putDebugChar (ch); | |
| 342 checksum += ch; | |
| 343 count += 1; | |
| 344 } | |
| 0 | 345 |
| 346 putDebugChar ('#'); | |
| 347 putDebugChar (hexchars[(checksum >> 4) & 0xf]); | |
| 348 putDebugChar (hexchars[checksum & 0xf]); | |
| 349 | |
| 350 } | |
| 351 while ((readDebugChar () & 0x7f) != '+'); | |
| 352 } | |
| 353 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
354 char __remcomInBuffer[BUFMAX]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
355 char __remcomOutBuffer[BUFMAX]; |
| 0 | 356 |
| 357 /* Indicate to caller of mem2hex or hex2mem that there has been an | |
| 358 error. */ | |
| 359 volatile int __mem_fault = 0; | |
| 360 | |
| 2 | 361 |
| 362 #ifndef TARGET_HAS_OWN_MEM_FUNCS | |
| 363 /* | |
| 364 * _target_readmem_hook / _target_writemem_hook: | |
| 365 * Allow target to get involved in reading/writing memory. | |
| 366 * | |
| 367 * If these hooks are defined by the target, they will be | |
| 368 * called for each user program memory access. Otherwise, the stub | |
| 369 * will simply dereference a pointer to access user program memory. | |
| 370 */ | |
| 371 | |
| 372 unsigned char (*_target_readmem_hook) (unsigned char* addr); | |
| 373 void (*_target_writemem_hook) (unsigned char* addr, | |
| 374 unsigned char value); | |
| 375 | |
| 376 static unsigned char | |
| 377 get_target_byte (volatile unsigned char *address) | |
| 0 | 378 { |
| 2 | 379 if (_target_readmem_hook) /* target needs to control memory access */ |
| 380 return _target_readmem_hook ((unsigned char *) address); | |
| 381 else | |
| 382 return *address; | |
| 383 } | |
| 384 | |
| 385 static void | |
| 386 put_target_byte (volatile unsigned char *address, unsigned char value) | |
| 387 { | |
| 388 if (_target_writemem_hook) /* target needs to control memory access */ | |
| 389 _target_writemem_hook ((unsigned char *) address, value); | |
| 390 else | |
| 391 *address = value; | |
| 392 } | |
| 393 | |
| 394 /* These are the "arguments" to __do_read_mem and __do_write_mem, | |
| 395 which are passed as globals to avoid squeezing them thru | |
| 396 __set_mem_fault_trap. */ | |
| 397 | |
| 398 static volatile target_register_t memCount; | |
| 399 static volatile unsigned char *memSrc, *memDst; | |
| 0 | 400 |
| 2 | 401 /* |
| 402 * __do_read_mem: | |
| 403 * Copy from target memory to trusted memory. | |
| 404 */ | |
| 405 | |
| 406 static void | |
| 407 __do_read_mem (void) | |
| 408 { | |
| 409 __mem_fault = 0; | |
| 410 while (memCount) | |
| 411 { | |
| 412 unsigned char ch = get_target_byte (memSrc++); | |
| 413 | |
| 414 if (__mem_fault) | |
| 415 return; | |
| 416 *memDst++ = ch; | |
| 417 memCount--; | |
| 418 } | |
| 0 | 419 } |
| 420 | |
| 2 | 421 /* |
| 422 * __do_write_mem: | |
| 423 * Copy from trusted memory to target memory. | |
| 424 */ | |
| 425 | |
| 426 static void | |
| 427 __do_write_mem (void) | |
| 428 { | |
| 429 __mem_fault = 0; | |
| 430 while (memCount) | |
| 431 { | |
| 432 unsigned char ch = *memSrc++; | |
| 433 | |
| 434 put_target_byte (memDst++, ch); | |
| 435 if (__mem_fault) | |
| 436 return; | |
| 437 memCount--; | |
| 438 } | |
| 439 } | |
| 440 | |
| 441 /* | |
| 442 * __read_mem_safe: | |
| 443 * Get contents of target memory, abort on error. | |
| 444 */ | |
| 445 | |
| 0 | 446 int |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
447 __read_mem_safe (void *dst, target_register_t src, int count) |
| 0 | 448 { |
| 2 | 449 memCount = count; |
| 450 memSrc = (unsigned char *) src; | |
| 451 memDst = (unsigned char *) dst; | |
| 452 __set_mem_fault_trap (__do_read_mem); | |
| 453 return count - memCount; /* return number of bytes successfully read */ | |
| 0 | 454 } |
| 455 | |
| 2 | 456 /* |
| 457 * __write_mem_safe: | |
| 458 * Set contents of target memory, abort on error. | |
| 459 */ | |
| 460 | |
| 0 | 461 int |
| 462 __write_mem_safe (unsigned char *src, target_register_t dst, int count) | |
| 463 { | |
| 2 | 464 memCount = count; |
| 465 memSrc = (unsigned char *) src; | |
| 466 memDst = (unsigned char *) dst; | |
| 467 __set_mem_fault_trap (__do_write_mem); | |
| 468 return count - memCount; /* return number of bytes successfully read */ | |
| 0 | 469 } |
| 470 | |
| 2 | 471 #endif /* TARGET_HAS_OWN_MEM_FUNCS */ |
| 472 | |
| 473 /* These are the "arguments" to __mem2hex_helper and __hex2mem_helper, | |
| 474 which are passed as globals to avoid squeezing them thru | |
| 475 __set_mem_fault_trap. */ | |
| 476 | |
| 477 static int hexMemCount; | |
| 478 static char *hexMemSrc, *hexMemDst; | |
| 479 static int may_fault_mode; | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
480 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
481 static int progMem; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
482 #endif |
| 2 | 483 |
| 484 /* Hamburger helper? */ | |
| 485 static void | |
| 486 __mem2hex_helper (void) | |
| 487 { | |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
488 union { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
489 unsigned long long_val; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
490 unsigned char bytes[sizeof(long)]; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
491 } val; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
492 int len, i; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
493 unsigned char ch; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
494 __mem_fault = 0; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
495 while (hexMemCount > 0) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
496 if (may_fault_mode) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
497 if ((hexMemCount >= sizeof(long)) && |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
498 (((target_register_t)hexMemSrc & (sizeof(long)-1)) == 0)) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
499 // Should be safe to access via a long |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
500 len = sizeof(long); |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
501 } else if ((hexMemCount >= sizeof(short)) && |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
502 (((target_register_t)hexMemSrc & (sizeof(short)-1)) == 0)) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
503 // Should be safe to access via a short |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
504 len = sizeof(short); |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
505 } else { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
506 len = 1; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
507 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
508 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
509 if (progMem) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
510 __read_progmem_safe(&val.bytes[0], hexMemSrc, len); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
511 else |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
512 #endif |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
513 __read_mem_safe(&val.bytes[0], hexMemSrc, len); |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
514 } else { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
515 len = 1; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
516 val.bytes[0] = *hexMemSrc; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
517 } |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
518 if (__mem_fault) |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
519 return; |
| 2 | 520 |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
521 for (i = 0; i < len; i++) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
522 ch = val.bytes[i]; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
523 *(hexMemDst++) = hexchars[(ch >> 4) & 0xf]; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
524 if (__mem_fault) |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
525 return; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
526 *(hexMemDst++) = hexchars[ch & 0xf]; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
527 if (__mem_fault) |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
528 return; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
529 } |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
530 hexMemCount -= len; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
531 hexMemSrc += len; |
| 2 | 532 } |
| 533 } | |
| 534 | |
| 535 /* Convert the memory pointed to by MEM into HEX, placing result in BUF. | |
| 536 * Return a pointer to the last char put in buf (NUL). In case of a memory | |
| 537 * fault, return 0. | |
| 0 | 538 * If MAY_FAULT is non-zero, then we will handle memory faults by returning |
| 2 | 539 * a 0 (and assume that MEM is a pointer into the user program), else we |
| 540 * treat a fault like any other fault in the stub (and assume that MEM is | |
| 541 * a pointer into the stub's memory). | |
| 0 | 542 */ |
| 543 | |
| 2 | 544 char * |
| 545 __mem2hex (mem, buf, count, may_fault) | |
| 546 char *mem; | |
| 547 char *buf; | |
| 0 | 548 int count; |
| 549 int may_fault; | |
| 550 { | |
| 2 | 551 hexMemDst = (unsigned char *) buf; |
| 552 hexMemSrc = (unsigned char *) mem; | |
| 553 hexMemCount = count; | |
| 554 may_fault_mode = may_fault; | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
555 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
556 progMem = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
557 #endif |
| 2 | 558 |
| 559 if (may_fault) | |
| 0 | 560 { |
| 2 | 561 if (__set_mem_fault_trap (__mem2hex_helper)) |
| 562 return 0; | |
| 0 | 563 } |
| 2 | 564 else |
| 565 __mem2hex_helper (); | |
| 0 | 566 |
| 2 | 567 *hexMemDst = 0; |
| 0 | 568 |
| 2 | 569 return (char *) hexMemDst; |
| 0 | 570 } |
| 571 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
572 /* Convert the target memory identified by MEM into HEX, placing result in BUF. |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
573 * Return a pointer to the last char put in buf (NUL). In case of a memory |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
574 * fault, return 0. |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
575 */ |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
576 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
577 static char * |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
578 __mem2hex_safe (target_addr_t mem, char *buf, int count) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
579 { |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
580 hexMemDst = (unsigned char *) buf; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
581 hexMemSrc = (unsigned char *) TARGET_ADDR_TO_PTR(mem); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
582 hexMemCount = count; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
583 may_fault_mode = 1; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
584 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
585 progMem = TARGET_ADDR_IS_PROGMEM(mem); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
586 #endif |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
587 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
588 if (__set_mem_fault_trap (__mem2hex_helper)) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
589 return 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
590 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
591 *hexMemDst = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
592 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
593 return (char *) hexMemDst; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
594 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
595 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
596 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
597 |
| 2 | 598 static void |
| 599 __hex2mem_helper (void) | |
| 0 | 600 { |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
601 union { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
602 unsigned long long_val; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
603 unsigned char bytes[sizeof(long)]; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
604 } val; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
605 int len, i; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
606 unsigned char ch = '\0'; |
| 0 | 607 |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
608 __mem_fault = 0; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
609 while (hexMemCount > 0 && *hexMemSrc) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
610 if (may_fault_mode) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
611 if ((hexMemCount >= sizeof(long)) && |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
612 (((target_register_t)hexMemDst & (sizeof(long)-1)) == 0)) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
613 len = sizeof(long); |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
614 } else if ((hexMemCount >= sizeof(short)) && |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
615 (((target_register_t)hexMemDst & (sizeof(short)-1)) == 0)) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
616 len = sizeof(short); |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
617 } else { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
618 len = 1; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
619 } |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
620 } else { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
621 len = 1; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
622 } |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
623 |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
624 for (i = 0; i < len; i++) { |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
625 // Check for short data? |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
626 ch = stubhex (*(hexMemSrc++)) << 4; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
627 if (__mem_fault) |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
628 return; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
629 ch |= stubhex (*(hexMemSrc++)); |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
630 if (__mem_fault) |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
631 return; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
632 val.bytes[i] = ch; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
633 } |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
634 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
635 if (may_fault_mode) { |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
636 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
637 if (progMem) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
638 __write_progmem_safe (&val.bytes[0], hexMemDst, len); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
639 else |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
640 #endif |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
641 __write_mem_safe (&val.bytes[0], hexMemDst, len); |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
642 } else |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
643 *hexMemDst = ch; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
644 |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
645 if (__mem_fault) |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
646 return; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
647 hexMemCount -= len; |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
648 hexMemDst += len; |
| 0 | 649 } |
| 2 | 650 } |
| 651 | |
| 652 /* Convert COUNT bytes of the hex array pointed to by BUF into binary | |
| 653 to be placed in MEM. Return a pointer to the character AFTER the | |
| 654 last byte written. | |
| 655 | |
| 656 If MAY_FAULT is set, we will return a non-zero value if a memory | |
| 657 fault occurs (and we assume that MEM is a pointer into the user | |
| 658 program). Otherwise, we will take a trap just like any other memory | |
| 659 fault (and assume that MEM points into the stub's memory). */ | |
| 0 | 660 |
| 2 | 661 char * |
| 662 __hex2mem (buf, mem, count, may_fault) | |
| 663 char *buf; | |
| 664 char *mem; | |
| 665 int count; | |
| 666 int may_fault; | |
| 667 { | |
| 668 hexMemSrc = (unsigned char *) buf; | |
| 669 hexMemDst = (unsigned char *) mem; | |
| 670 hexMemCount = count; | |
| 671 may_fault_mode = may_fault; | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
672 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
673 progMem = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
674 #endif |
| 0 | 675 |
| 2 | 676 if (may_fault) |
| 677 { | |
| 678 if (__set_mem_fault_trap (__hex2mem_helper)) | |
| 679 return 0; | |
| 680 } | |
| 681 else | |
| 682 __hex2mem_helper (); | |
| 683 | |
| 684 return (char *) hexMemDst; | |
| 685 } | |
| 686 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
687 /* Convert COUNT bytes of the hex array pointed to by BUF into binary |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
688 to be placed in target MEM. Return a pointer to the character AFTER |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
689 the last byte written. |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
690 */ |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
691 char * |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
692 __hex2mem_safe (char *buf, target_addr_t mem, int count) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
693 { |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
694 hexMemSrc = (unsigned char *) buf; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
695 hexMemDst = (unsigned char *) TARGET_ADDR_TO_PTR(mem); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
696 hexMemCount = count; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
697 may_fault_mode = 1; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
698 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
699 progMem = TARGET_ADDR_IS_PROGMEM(mem); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
700 #endif |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
701 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
702 if (__set_mem_fault_trap (__hex2mem_helper)) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
703 return 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
704 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
705 return (char *) hexMemDst; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
706 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
707 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
708 |
| 2 | 709 void |
| 710 set_debug_traps (void) | |
| 711 { | |
| 712 __install_traps (); | |
| 713 initialized = 1; /* FIXME: Change this to dbg_stub_initialized */ | |
| 0 | 714 } |
| 715 | |
| 716 /* | |
| 717 * While we find nice hex chars, build an int. | |
| 718 * Return number of chars processed. | |
| 719 */ | |
| 720 | |
| 2 | 721 unsigned int |
| 722 __hexToInt (char **ptr, target_register_t *intValue) | |
| 0 | 723 { |
| 724 int numChars = 0; | |
| 725 int hexValue; | |
| 726 | |
| 727 *intValue = 0; | |
| 728 | |
| 729 while (**ptr) | |
| 730 { | |
| 2 | 731 hexValue = stubhex (**ptr); |
| 0 | 732 if (hexValue < 0) |
| 2 | 733 break; |
| 0 | 734 |
| 735 *intValue = (*intValue << 4) | hexValue; | |
| 736 numChars ++; | |
| 737 | |
| 738 (*ptr)++; | |
| 739 } | |
| 740 | |
| 741 return (numChars); | |
| 742 } | |
| 743 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
744 /* |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
745 * While we find nice hex chars, build a target memory address. |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
746 * Return number of chars processed. |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
747 */ |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
748 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
749 unsigned int |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
750 __hexToAddr (char **ptr, target_addr_t *val) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
751 { |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
752 int numChars = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
753 int hexValue; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
754 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
755 *val = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
756 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
757 while (**ptr) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
758 { |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
759 hexValue = stubhex (**ptr); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
760 if (hexValue < 0) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
761 break; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
762 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
763 *val = (*val << 4) | hexValue; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
764 numChars ++; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
765 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
766 (*ptr)++; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
767 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
768 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
769 return (numChars); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
770 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
771 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
772 |
| 0 | 773 /* |
| 774 * Complement of __hexToInt: take an int of size "numBits", | |
| 775 * convert it to a hex string. Return length of (unterminated) output. | |
| 776 */ | |
| 777 | |
| 778 unsigned int | |
| 779 __intToHex (char *ptr, target_register_t intValue, int numBits) | |
| 780 { | |
| 781 int numChars = 0; | |
| 782 | |
| 783 if (intValue == 0) | |
| 784 { | |
| 785 *(ptr++) = '0'; | |
| 786 *(ptr++) = '0'; | |
| 787 return 2; | |
| 788 } | |
| 789 | |
| 790 numBits = (numBits + 7) / 8; | |
| 791 while (numBits) | |
| 792 { | |
| 793 int v = (intValue >> ((numBits - 1) * 8)); | |
| 794 if (v || (numBits == 1)) | |
| 2 | 795 { |
| 796 v = v & 255; | |
| 797 *(ptr++) = __tohex ((v / 16) & 15); | |
| 798 *(ptr++) = __tohex (v & 15); | |
| 799 numChars += 2; | |
| 800 } | |
| 0 | 801 numBits--; |
| 802 } | |
| 803 | |
| 804 return (numChars); | |
| 805 } | |
| 806 | |
| 2 | 807 #if DEBUG_THREADS |
| 808 /* | |
| 809 * Kernel Thread Control | |
| 810 * | |
| 811 * If the current thread is set to other than zero (or minus one), | |
| 812 * then ask the kernel to lock it's scheduler so that only that thread | |
| 813 * can run. | |
| 814 */ | |
| 815 | |
| 816 static unsigned char did_lock_scheduler = 0; | |
| 817 static unsigned char did_disable_interrupts = 0; | |
| 818 | |
| 819 /* Pointer to "kernel call" for scheduler control */ | |
| 820 static int (*schedlock_fn) (int, int, long) = stub_lock_scheduler; | |
| 821 | |
| 822 /* Pointer to target stub call for disabling interrupts. | |
| 823 Target stub will initialize this if it can. */ | |
| 824 int (*__disable_interrupts_hook) (int); /* don't initialize here! */ | |
| 825 #endif | |
| 826 | |
| 827 static void | |
| 828 lock_thread_scheduler (int kind) /* "step" or "continue" */ | |
| 829 { | |
| 830 #if DEBUG_THREADS | |
| 831 int ret = 0; | |
| 832 | |
| 833 /* GDB will signal its desire to run a single thread | |
| 834 by setting _gdb_cont_thread to non-zero / non-negative. */ | |
| 835 if (_gdb_cont_thread <= 0) | |
| 836 return; | |
| 837 | |
| 838 if (schedlock_fn) /* kernel call */ | |
| 839 ret = (*schedlock_fn) (1, kind, _gdb_cont_thread); | |
| 840 | |
| 841 if (ret == 1) | |
| 842 { | |
| 843 did_lock_scheduler = 1; | |
| 844 return; | |
| 845 } | |
| 846 | |
| 847 if (schedlock_fn == 0 || /* no kernel scheduler call */ | |
| 848 ret == -1) /* kernel asks stub to handle it */ | |
| 849 if (__disable_interrupts_hook) /* target stub has capability */ | |
| 850 if ((*__disable_interrupts_hook) (1)) | |
| 851 { | |
| 852 did_disable_interrupts = 1; | |
| 853 return; | |
| 854 } | |
| 855 #endif /* DEBUG_THREADS */ | |
| 856 } | |
| 857 | |
| 858 static void | |
| 859 unlock_thread_scheduler () | |
| 860 { | |
| 861 #if DEBUG_THREADS | |
| 862 if (did_lock_scheduler) | |
| 863 if (schedlock_fn) /* kernel call */ | |
| 864 { | |
| 865 (*schedlock_fn) (0, 0, _gdb_cont_thread); | |
| 866 /* I could check the return value, but | |
| 867 what would I do if it failed??? */ | |
| 868 did_lock_scheduler = 0; | |
| 869 } | |
| 870 if (did_disable_interrupts) | |
| 871 if (__disable_interrupts_hook) /* target stub call */ | |
| 872 { | |
| 873 (*__disable_interrupts_hook) (0); | |
| 874 /* Again, I could check the return value, but | |
| 875 what would I do if it failed??? */ | |
| 876 did_disable_interrupts = 0; | |
| 877 } | |
| 878 #endif /* DEBUG_THREADS */ | |
| 879 } | |
| 880 | |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
881 #ifdef CYGPKG_CYGMON |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
112
diff
changeset
|
882 int processing_breakpoint_function = 0; |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
883 #endif |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
884 |
| 0 | 885 void |
| 886 __handle_exception (void) | |
| 887 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
888 int sigval = 0; |
| 0 | 889 |
| 2 | 890 #ifdef TARGET_HAS_NEXT_STEP |
| 891 if (! __next_step_done ()) | |
| 892 { | |
| 893 __clear_breakpoints (); | |
| 894 __install_breakpoints (); | |
| 895 __single_step (); | |
| 896 return; | |
| 897 } | |
| 898 #endif | |
| 0 | 899 |
| 2 | 900 #ifdef __ECOS__ |
| 901 // We need to unpack the registers before they are accessed. | |
| 902 if (__cleanup_vec != NULL) | |
| 903 __cleanup_vec (); | |
| 0 | 904 |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
132
diff
changeset
|
905 #if defined(CYGSEM_REDBOOT_BSP_SYSCALLS) |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
132
diff
changeset
|
906 // Temporary support for gnupro bsp SWIs |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
132
diff
changeset
|
907 if (__is_bsp_syscall()) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
908 { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
909 sigval = hal_syscall_handler(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
910 if (0 == sigval) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
911 { |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
132
diff
changeset
|
912 if (__init_vec != NULL) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
913 __init_vec (); |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
132
diff
changeset
|
914 return; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
915 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
916 } |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
132
diff
changeset
|
917 #endif |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
132
diff
changeset
|
918 |
| 2 | 919 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT |
| 920 // Special case for GDB BREAKs. This flag is set by cyg_stub_cleanup. | |
| 921 if (cyg_hal_gdb_break) { | |
| 922 cyg_hal_gdb_break = 0; | |
| 923 sigval = SIGINT; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
924 } |
| 2 | 925 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
926 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
927 // Only compute sigval if it wasn't already computed (in |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
928 // hal_syscall_handler or as a result of a GDB async break) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
929 if (0 == sigval) |
| 2 | 930 sigval = __computeSignal (__get_trap_number ()); |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
132
diff
changeset
|
931 |
| 2 | 932 #else // __ECOS__ |
| 0 | 933 /* reply to host that an exception has occurred */ |
| 934 sigval = __computeSignal (__get_trap_number ()); | |
| 2 | 935 #endif // __ECOS__ |
| 0 | 936 |
| 937 if (__is_breakpoint_function ()) | |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
938 { |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
939 #ifdef CYGPKG_CYGMON |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
940 processing_breakpoint_function = 1; |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
941 #endif |
| 0 | 942 __skipinst (); |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
943 } else { |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
944 #ifdef CYGPKG_CYGMON |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
945 processing_breakpoint_function = 0; |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
946 #endif |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
947 } |
| 0 | 948 |
| 2 | 949 #ifndef __ECOS__ |
| 950 if (__cleanup_vec != NULL) | |
| 951 __cleanup_vec (); | |
| 952 #endif // !__ECOS__ | |
| 953 | |
| 954 __clear_breakpoints (); | |
| 955 | |
| 956 /* Undo effect of previous single step. */ | |
| 957 unlock_thread_scheduler (); | |
| 958 __clear_single_step (); | |
| 959 | |
|
48
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
960 #ifdef __ECOS__ |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
961 /* Need to flush the data and instruction cache here, as we may have |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
962 removed a breakpoint in __single_step - and we may be sharing |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
963 some code with the application! */ |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
964 |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
965 __data_cache (CACHE_FLUSH) ; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
966 __instruction_cache (CACHE_FLUSH) ; |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
967 #endif |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
968 |
| 2 | 969 #ifdef SIGSYSCALL |
| 970 if (sigval == SIGSYSCALL) | |
| 0 | 971 { |
| 972 int val; | |
| 973 /* Do the skipinst FIRST. */ | |
| 2 | 974 #ifndef SYSCALL_PC_AFTER_INST |
| 0 | 975 __skipinst (); |
| 2 | 976 #endif |
| 0 | 977 val = __process_syscall_vec (__get_syscall_num ()); |
| 2 | 978 if (val < 0) |
| 979 sigval = -val; | |
| 980 else | |
| 981 sigval = 0; | |
| 0 | 982 } |
| 983 | |
| 984 #endif | |
| 985 | |
| 2 | 986 /* Indirect function call to stub, cygmon monitor or other */ |
| 987 if (sigval != 0) | |
| 988 { | |
| 989 while (__process_exception_vec (sigval)) | |
| 990 { | |
| 991 /* Empty! */ | |
| 992 } | |
| 993 } | |
| 0 | 994 |
| 2 | 995 __install_breakpoints (); |
| 0 | 996 |
| 2 | 997 if (__init_vec != NULL) |
| 998 __init_vec (); | |
| 0 | 999 } |
| 1000 | |
| 2 | 1001 /* |
| 1002 * _get_trace_register_hook: | |
| 1003 * This function pointer will be non-zero if the trace component | |
| 1004 * wants to intercept requests for register values. | |
| 1005 * | |
| 1006 * FIXME: evidently I need a new hook for large registers... | |
| 1007 */ | |
| 1008 | |
| 1009 int (*_get_trace_register_hook) (regnames_t, target_register_t *); | |
| 1010 | |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1011 void |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1012 stub_format_registers(char *packet, char *ptr) |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1013 { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1014 int regnum; |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1015 int sr = 0, er = NUMREGS_GDB; |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1016 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1017 if (packet[0] == 'p') |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1018 { |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1019 target_register_t regno; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1020 char *p = &packet[1]; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1021 if (__hexToInt (&p, ®no)) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1022 { |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1023 sr = regno; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1024 er = regno + 1; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1025 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1026 else |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1027 { |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1028 strcpy (ptr, "INVALID"); |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1029 return; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1030 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1031 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1032 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1033 for (regnum = sr; regnum < er; regnum++) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1034 { |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1035 /* We need to compensate for the value offset within the |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1036 register. */ |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1037 char dummyDat[32]; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1038 target_register_t addr; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1039 char *vptr; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1040 int reg_valid = 1; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1041 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1042 #ifdef TARGET_HAS_LARGE_REGISTERS |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1043 if (sizeof (target_register_t) < REGSIZE (regnum)) { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1044 get_register_as_bytes (regnum, dummyDat); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1045 vptr = dummyDat; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1046 } else |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1047 #endif |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1048 { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1049 if (_get_trace_register_hook) |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1050 reg_valid = _get_trace_register_hook (regnum, &addr); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1051 else |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
112
diff
changeset
|
1052 { |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1053 addr = get_register (regnum); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
112
diff
changeset
|
1054 #ifdef CYGHWR_REGISTER_VALIDITY_CHECKING |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
112
diff
changeset
|
1055 reg_valid = get_register_valid (regnum); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
112
diff
changeset
|
1056 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
112
diff
changeset
|
1057 } |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1058 vptr = ((char *) &addr); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1059 if (sizeof (addr) > REGSIZE(regnum)) { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1060 /* May need to cope with endian-ness */ |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1061 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1062 #if !defined(__LITTLE_ENDIAN__) && !defined(_LITTLE_ENDIAN) |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1063 vptr += sizeof (addr) - REGSIZE (regnum); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1064 #endif |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1065 } else if (sizeof (addr) < REGSIZE (regnum)) { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1066 int off = REGSIZE (regnum) - sizeof (addr); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1067 int x; |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1068 char extend_val = 0; |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1069 |
|
121
6bd9d475ed4b
Merge from eCos master repository on 2000-09-04-20:50:20-BST
jlarmour
parents:
115
diff
changeset
|
1070 #ifdef CYGARC_SIGN_EXTEND_REGISTERS |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1071 { |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1072 unsigned long bits_in_addr = (sizeof(addr) << 3); // ie Size in bytes * 8 |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1073 target_register_t sign_bit_mask = (1 << (bits_in_addr - 1)); |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1074 if ((addr & sign_bit_mask) == sign_bit_mask) |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1075 extend_val = ~0; |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1076 } |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1077 #endif |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1078 |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1079 #if defined(__LITTLE_ENDIAN__) || defined(_LITTLE_ENDIAN) |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1080 for (x = 0; x < off; x++) |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1081 dummyDat[x + sizeof(addr)] = extend_val; |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1082 _memcpy (dummyDat, &addr, sizeof (addr)); |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1083 #else |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1084 for (x = 0; x < off; x++) |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1085 dummyDat[x] = extend_val; |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1086 _memcpy (dummyDat + off, &addr, sizeof (addr)); |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1087 #endif |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1088 vptr = dummyDat; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1089 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1090 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1091 if (reg_valid) { /* we have a valid reg value */ |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1092 ptr = __mem2hex (vptr, ptr, REGSIZE (regnum), 0); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1093 } else { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1094 /* Trace component returned a failure code. |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1095 This means that the register value is not available. |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1096 We'll fill it with 'x's, and GDB will understand. */ |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1097 _memset (ptr, 'x', 2 * REGSIZE (regnum)); |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1098 ptr += 2 * REGSIZE (regnum); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1099 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1100 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1101 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1102 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1103 void |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1104 stub_update_registers(char *in_ptr, char *out_ptr) |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1105 { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1106 char *ptr = &in_ptr[1]; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1107 int x; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1108 int sr = 0, er = NUMREGS_GDB; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1109 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1110 if (*in_ptr == 'P') { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1111 target_register_t regno; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1112 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1113 if (__hexToInt (&ptr, ®no) && (*ptr++ == '=')) { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1114 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1115 sr = regno; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1116 er = regno + 1; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1117 } else { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1118 strcpy (out_ptr, "P01"); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1119 return; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1120 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1121 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1122 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1123 for (x = sr; x < er; x++) { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1124 target_register_t value = 0; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1125 char *vptr; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1126 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1127 #ifdef TARGET_HAS_LARGE_REGISTERS |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1128 if (sizeof (target_register_t) < REGSIZE (x)) { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1129 char dummyDat [32]; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1130 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1131 __hex2mem (ptr, dummyDat, REGSIZE (x), 0); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1132 put_register_as_bytes (x, dummyDat); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1133 } else |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1134 #endif |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1135 { |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1136 vptr = ((char *) &value); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1137 #if !defined(__LITTLE_ENDIAN__) && !defined(_LITTLE_ENDIAN) |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1138 vptr += sizeof (value) - REGSIZE (x); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1139 #endif |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1140 __hex2mem (ptr, vptr, REGSIZE (x), 0); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1141 put_register (x, value); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1142 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1143 ptr += REGSIZE (x) * 2; |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1144 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1145 |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1146 strcpy (out_ptr, "OK"); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1147 } |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1148 |
| 2 | 1149 int |
| 1150 __process_packet (char *packet) | |
| 0 | 1151 { |
| 2 | 1152 int is_binary = 0; |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1153 #if defined(CYGNUM_HAL_BREAKPOINT_LIST_SIZE) |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1154 int is_Z = 0; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1155 #endif |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1156 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1157 __remcomOutBuffer[0] = 0; |
| 0 | 1158 switch (packet[0]) |
| 1159 { | |
| 1160 case '?': | |
| 1161 { | |
| 2 | 1162 int sigval = __computeSignal (__get_trap_number ()); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1163 __remcomOutBuffer[0] = 'S'; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1164 __remcomOutBuffer[1] = hexchars[(sigval >> 4) & 0xf]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1165 __remcomOutBuffer[2] = hexchars[sigval & 0xf]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1166 __remcomOutBuffer[3] = 0; |
| 2 | 1167 break; |
| 0 | 1168 } |
| 1169 | |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
34
diff
changeset
|
1170 #ifdef __ECOS__ |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
34
diff
changeset
|
1171 #if !defined(CYG_HAL_STARTUP_RAM) // Only for ROM based stubs |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1172 #if 0 // Disable to avoid conflict with stub-breakpoint z/Z-packets |
|
78
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1173 case 'z': |
|
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1174 /* report IO buffer sizes so download can achieve optimal |
|
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1175 download speed */ |
|
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1176 { |
|
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1177 int i; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1178 i = __intToHex (__remcomOutBuffer, BUFMAX, 32); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1179 __remcomOutBuffer[i] = 0; |
|
78
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1180 break; |
|
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1181 } |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1182 #endif |
|
78
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1183 case 'd': |
|
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1184 /* toggle debug flag */ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1185 strcpy(__remcomOutBuffer, GDB_stubs_version); |
|
78
59d97b6ba612
Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents:
64
diff
changeset
|
1186 break; |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
34
diff
changeset
|
1187 #endif |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
34
diff
changeset
|
1188 #endif // __ECOS__ |
| 0 | 1189 |
| 1190 case 'q': | |
| 1191 /* general query packet */ | |
| 1192 process_query (&packet[1]); | |
| 1193 break; | |
| 1194 | |
| 1195 case 'Q': | |
| 1196 /* general set packet */ | |
| 1197 process_set (&packet[1]); | |
| 1198 break; | |
| 1199 | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1200 case 'p': /* return the value of a single CPU register */ |
| 2 | 1201 case 'g': /* return the value of the CPU registers */ |
| 0 | 1202 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1203 stub_format_registers(&packet[0], __remcomOutBuffer); |
| 2 | 1204 break; |
| 1205 } | |
| 0 | 1206 |
| 2 | 1207 case 'A': /* set program arguments */ |
| 1208 { | |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
1209 #ifdef CYGSEM_ECOS_SUPPORTS_PROGRAM_ARGS |
| 2 | 1210 if (packet[1] == '\0') |
| 1211 { | |
| 1212 __free_program_args (); | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1213 strcpy (__remcomOutBuffer, "OK"); |
| 2 | 1214 } |
| 1215 else | |
| 1216 { | |
| 1217 target_register_t arglen, argnum; | |
| 1218 char *ptr = &packet[1]; | |
| 1219 | |
| 1220 while (1) | |
| 1221 { | |
| 1222 if (__hexToInt (&ptr, &arglen) | |
| 1223 && (*ptr++ == ',') | |
| 1224 && __hexToInt (&ptr, &argnum) | |
| 1225 && (*ptr++ == ',')) | |
| 1226 { | |
| 1227 if (arglen > 0) | |
| 1228 { | |
| 1229 char *s = __add_program_arg (argnum, arglen); | |
| 1230 if (s != NULL) | |
| 1231 { | |
| 1232 __hex2mem (ptr, s, arglen, 0); | |
| 1233 } | |
| 1234 ptr += arglen * 2; | |
| 1235 } | |
| 1236 | |
| 1237 if (*ptr == ',') | |
| 1238 ptr++; | |
| 1239 else | |
| 1240 break; | |
| 1241 } | |
| 1242 else | |
| 1243 break; | |
| 1244 } | |
| 1245 if (*ptr == '\0') | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1246 strcpy (__remcomOutBuffer, "OK"); |
| 2 | 1247 else |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1248 strcpy (__remcomOutBuffer, "E01"); |
| 2 | 1249 } |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
1250 #else |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1251 strcpy (__remcomOutBuffer, "E01"); |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
1252 #endif |
| 0 | 1253 } |
| 2 | 1254 break; |
| 0 | 1255 |
| 1256 case 'P': | |
| 2 | 1257 case 'G': /* set the value of the CPU registers - return OK */ |
| 0 | 1258 { |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1259 char *in_ptr = &packet[0]; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1260 char *out_ptr = __remcomOutBuffer; |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
38
diff
changeset
|
1261 stub_update_registers(in_ptr, out_ptr); |
| 2 | 1262 break; |
| 0 | 1263 } |
| 1264 | |
| 2 | 1265 case 'm': /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ |
| 0 | 1266 /* Try to read %x,%x. */ |
| 1267 { | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1268 target_register_t length; |
| 2 | 1269 char *ptr = &packet[1]; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1270 target_addr_t addr; |
| 0 | 1271 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1272 if (__hexToAddr (&ptr, &addr) |
| 2 | 1273 && *ptr++ == ',' |
| 1274 && __hexToInt (&ptr, &length)) | |
| 1275 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1276 if (__mem2hex_safe (addr, __remcomOutBuffer, length)) |
| 2 | 1277 break; |
| 0 | 1278 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1279 strcpy (__remcomOutBuffer, "E03"); |
| 2 | 1280 } |
| 1281 else | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1282 strcpy (__remcomOutBuffer, "E01"); |
| 2 | 1283 break; |
| 0 | 1284 } |
| 1285 | |
| 2 | 1286 case 'X': |
| 1287 /* XAA..AA,LLLL: Write LLLL escaped binary bytes at address AA.AA */ | |
| 1288 is_binary = 1; | |
| 1289 /* fall through */ | |
| 0 | 1290 case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ |
| 1291 /* Try to read '%x,%x:'. */ | |
| 1292 { | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1293 target_register_t length; |
| 2 | 1294 char *ptr = &packet[1], buf[128]; |
| 1295 int i; | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1296 target_addr_t addr; |
| 2 | 1297 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1298 if (__hexToAddr (&ptr, &addr) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1299 && *ptr++ == ',' |
| 2 | 1300 && __hexToInt (&ptr, &length) |
| 1301 && *ptr++ == ':') | |
| 1302 { | |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
163
diff
changeset
|
1303 /* GDB sometimes sends an impossible length */ |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
163
diff
changeset
|
1304 if (length < 0 || length >= BUFMAX) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1305 strcpy (__remcomOutBuffer, "E01"); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
163
diff
changeset
|
1306 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
163
diff
changeset
|
1307 else if (is_binary) |
| 2 | 1308 { |
| 1309 while (length > 0) | |
| 1310 { | |
| 1311 for (i = 0; i < sizeof(buf) && i < length; i++) | |
| 1312 if ((buf[i] = *ptr++) == 0x7d) | |
| 1313 buf[i] = 0x20 | (*ptr++ & 0xff); | |
| 1314 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1315 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1316 if (TARGET_ADDR_IS_PROGMEM(addr)) { |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1317 if (__write_progmem_safe (buf, (void *)TARGET_ADDR_TO_PTR(addr), i) != i) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1318 break; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1319 } else |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1320 #endif |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1321 if (__write_mem_safe (buf, (void *)TARGET_ADDR_TO_PTR(addr), i) != i) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1322 break; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1323 |
| 0 | 1324 |
| 2 | 1325 length -= i; |
| 1326 addr += i; | |
| 1327 } | |
| 1328 if (length <= 0) | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1329 strcpy (__remcomOutBuffer, "OK"); |
| 2 | 1330 else |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1331 strcpy (__remcomOutBuffer, "E03"); |
| 2 | 1332 } |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
163
diff
changeset
|
1333 else |
| 2 | 1334 { |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1335 if (__hex2mem_safe (ptr, addr, length) != NULL) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1336 strcpy (__remcomOutBuffer, "OK"); |
| 2 | 1337 else |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1338 strcpy (__remcomOutBuffer, "E03"); |
| 2 | 1339 } |
| 1340 } | |
| 1341 else | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1342 strcpy (__remcomOutBuffer, "E02"); |
| 2 | 1343 break; |
| 0 | 1344 } |
| 1345 | |
| 1346 case 'S': | |
| 2 | 1347 case 's': /* sAA..AA Step from address AA..AA (optional) */ |
| 0 | 1348 case 'C': |
| 2 | 1349 case 'c': /* cAA..AA Continue at address AA..AA (optional) */ |
| 0 | 1350 /* try to read optional parameter, pc unchanged if no parm */ |
| 1351 | |
| 1352 { | |
| 2 | 1353 char *ptr = &packet[1]; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1354 target_addr_t addr; |
| 2 | 1355 target_register_t sigval = 0; |
| 1356 | |
| 1357 if (packet[0] == 'C' || packet[0] == 'S') | |
| 1358 { | |
| 1359 __hexToInt (&ptr, &sigval); | |
| 1360 if (*ptr == ';') | |
| 1361 ptr++; | |
| 1362 } | |
| 0 | 1363 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1364 if (__hexToAddr (&ptr, &addr)) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1365 set_pc ((target_register_t)TARGET_ADDR_TO_PTR(addr)); |
| 2 | 1366 |
| 1367 /* Need to flush the instruction cache here, as we may have | |
| 1368 deposited a breakpoint, and the icache probably has no way of | |
| 1369 knowing that a data ref to some location may have changed | |
| 1370 something that is in the instruction cache. */ | |
| 1371 | |
| 1372 #ifdef __ECOS__ | |
| 1373 __data_cache (CACHE_FLUSH) ; | |
| 1374 #endif | |
| 1375 __instruction_cache (CACHE_FLUSH) ; | |
| 0 | 1376 |
| 2 | 1377 /* If we have a function to handle signals, call it. */ |
| 1378 if (sigval != 0 && __process_signal_vec != NULL) | |
| 1379 { | |
| 1380 /* If 0 is returned, we either ignored the signal or invoked a user | |
| 1381 handler. Otherwise, the user program should die. */ | |
| 1382 if (! __process_signal_vec (sigval)) | |
| 1383 sigval = 0; | |
| 1384 } | |
| 0 | 1385 |
| 2 | 1386 if (sigval != 0) |
| 1387 { | |
| 1388 sigval = SIGKILL; /* Always nuke the program */ | |
| 1389 __kill_program (sigval); | |
| 1390 return 0; | |
| 1391 } | |
| 0 | 1392 |
|
48
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1393 #ifdef __ECOS__ |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1394 // CASE 102327 - watchpoints fight with output, so do not step |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1395 // through $O packet output routines. |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1396 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1397 if ( cyg_hal_gdb_break_is_set() ) { |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1398 packet[0] = 'c'; // Force it to be a "continue" instead of step. |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1399 cyg_hal_gdb_running_step = 1; // And tell the hal_stub... |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1400 } |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1401 #endif |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1402 #endif |
|
1370c5e55234
Merge from eCos master repository on 1999-10-25-21:18:27-BST
jlarmour
parents:
46
diff
changeset
|
1403 |
| 2 | 1404 /* Set machine state to force a single step. */ |
| 1405 if (packet[0] == 's' || packet[0] == 'S') | |
| 1406 { | |
| 1407 lock_thread_scheduler (0); /* 0 == single-step */ | |
| 1408 #ifdef __ECOS__ | |
| 1409 // PR 19845 workaround: | |
| 1410 // Make sure the single-step magic affects the correct registers. | |
| 1411 _registers = ®isters[0]; | |
| 1412 #endif | |
| 1413 __single_step (); | |
| 1414 } | |
| 1415 else | |
| 1416 { | |
| 1417 lock_thread_scheduler (1); /* 1 == continue */ | |
| 1418 } | |
| 0 | 1419 |
|
28
18ee5a9c102e
Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents:
2
diff
changeset
|
1420 #ifdef __ECOS__ |
|
18ee5a9c102e
Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents:
2
diff
changeset
|
1421 /* Need to flush the data and instruction cache here, as we may have |
|
18ee5a9c102e
Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents:
2
diff
changeset
|
1422 deposited a breakpoint in __single_step. */ |
|
18ee5a9c102e
Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents:
2
diff
changeset
|
1423 |
|
18ee5a9c102e
Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents:
2
diff
changeset
|
1424 __data_cache (CACHE_FLUSH) ; |
|
18ee5a9c102e
Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents:
2
diff
changeset
|
1425 __instruction_cache (CACHE_FLUSH) ; |
|
138
289bf90c6a9b
Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents:
136
diff
changeset
|
1426 hal_flush_output(); |
|
28
18ee5a9c102e
Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents:
2
diff
changeset
|
1427 #endif |
|
18ee5a9c102e
Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents:
2
diff
changeset
|
1428 |
| 2 | 1429 return -1; |
| 0 | 1430 } |
| 1431 | |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
163
diff
changeset
|
1432 case 'D' : /* detach */ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1433 __putpacket (__remcomOutBuffer); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
163
diff
changeset
|
1434 /* fall through */ |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
163
diff
changeset
|
1435 case 'k' : /* kill the program */ |
|
138
289bf90c6a9b
Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents:
136
diff
changeset
|
1436 #ifdef __ECOS__ |
|
289bf90c6a9b
Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents:
136
diff
changeset
|
1437 hal_flush_output(); |
|
289bf90c6a9b
Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents:
136
diff
changeset
|
1438 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1439 #ifdef CYGSEM_REDBOOT_BSP_SYSCALLS_GPROF |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1440 { // Reset the timer to default and cancel any callback |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1441 extern void sys_profile_reset(void); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1442 sys_profile_reset(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1443 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1444 #endif // CYGSEM_REDBOOT_BSP_SYSCALLS_GPROF |
| 0 | 1445 __process_exit_vec (); |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
151
diff
changeset
|
1446 return -1; |
| 2 | 1447 |
| 1448 case 'r': /* Reset */ | |
|
162
2395031e7a66
Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents:
156
diff
changeset
|
1449 /* With the next 'k' packet, reset the board */ |
|
2395031e7a66
Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents:
156
diff
changeset
|
1450 __process_exit_vec = &__reset; |
| 0 | 1451 break; |
| 2 | 1452 |
| 0 | 1453 case 'H': |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1454 STUB_PKT_CHANGETHREAD (packet+1, __remcomOutBuffer, 300) ; |
| 0 | 1455 break ; |
| 1456 case 'T' : | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1457 STUB_PKT_THREAD_ALIVE (packet+1, __remcomOutBuffer, 300) ; |
| 0 | 1458 break ; |
| 2 | 1459 case 'B': |
| 1460 /* breakpoint */ | |
| 0 | 1461 { |
| 2 | 1462 target_register_t addr; |
| 1463 char mode; | |
| 1464 char *ptr = &packet[1]; | |
| 1465 if (__hexToInt (&ptr, &addr) && *(ptr++) == ',') | |
| 1466 { | |
| 1467 mode = *(ptr++); | |
| 1468 if (mode == 'C') | |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
145
diff
changeset
|
1469 __remove_breakpoint (addr,0); |
| 2 | 1470 else |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
145
diff
changeset
|
1471 __set_breakpoint (addr,0); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1472 strcpy (__remcomOutBuffer, "OK"); |
| 2 | 1473 } |
| 1474 else | |
| 1475 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1476 strcpy (__remcomOutBuffer, "E01"); |
| 2 | 1477 } |
| 1478 break; | |
| 1479 } | |
| 0 | 1480 |
| 2 | 1481 case 'b': /* bBB... Set baud rate to BB... */ |
| 1482 { | |
| 1483 target_register_t baudrate; | |
| 0 | 1484 |
| 2 | 1485 char *ptr = &packet[1]; |
| 1486 if (!__hexToInt (&ptr, &baudrate)) | |
| 1487 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1488 strcpy (__remcomOutBuffer, "B01"); |
| 2 | 1489 break; |
| 1490 } | |
| 1491 | |
| 1492 __putpacket ("OK"); /* Ack before changing speed */ | |
| 1493 __set_baud_rate (baudrate); | |
| 1494 break; | |
| 0 | 1495 } |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1496 |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1497 #if defined(CYGNUM_HAL_BREAKPOINT_LIST_SIZE) && (CYGNUM_HAL_BREAKPOINT_LIST_SIZE > 0) |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1498 case 'Z': |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1499 is_Z = 1; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1500 case 'z': |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1501 { |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1502 char *ptr = &packet[1]; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1503 target_register_t ztype, addr, length; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1504 int err; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1505 target_addr_t taddr; |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1506 |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1507 if (__hexToInt (&ptr, &ztype) && *(ptr++) == ',') |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1508 { |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1509 if (__hexToAddr (&ptr, &taddr)) |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1510 { |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1511 if (*(ptr++) == ',') |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1512 { |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1513 /* When there is a comma, there must be a length */ |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1514 if (!__hexToInt (&ptr, &length)) |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1515 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1516 strcpy (__remcomOutBuffer, "E02"); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1517 break; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1518 } |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1519 } |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1520 else |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1521 length = 0; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1522 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1523 addr = (target_register_t)TARGET_ADDR_TO_PTR(taddr); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1524 |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1525 switch (ztype) |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1526 { |
| 317 | 1527 case ZTYPE_SW_BREAKPOINT: |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1528 /* sw breakpoint */ |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1529 if (is_Z) |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
145
diff
changeset
|
1530 err = __set_breakpoint(addr,length); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1531 else |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
145
diff
changeset
|
1532 err = __remove_breakpoint(addr,length); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1533 if (!err) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1534 strcpy (__remcomOutBuffer, "OK"); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1535 else |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1536 strcpy (__remcomOutBuffer, "E02"); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1537 break; |
| 317 | 1538 case ZTYPE_HW_BREAKPOINT: |
| 1539 #if defined(HAL_STUB_HW_BREAKPOINT_LIST_SIZE) && (HAL_STUB_HW_BREAKPOINT_LIST_SIZE > 0) | |
| 1540 if (is_Z) | |
| 1541 err = __set_hw_breakpoint(addr, length); | |
| 1542 else | |
| 1543 err = __remove_hw_breakpoint(addr, length); | |
| 1544 if (!err) | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1545 strcpy (__remcomOutBuffer, "OK"); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1546 else |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1547 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1548 strcpy (__remcomOutBuffer, "E02"); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1549 break; |
| 317 | 1550 case ZTYPE_HW_WATCHPOINT_WRITE: |
| 1551 case ZTYPE_HW_WATCHPOINT_READ: | |
| 1552 case ZTYPE_HW_WATCHPOINT_ACCESS: | |
| 1553 #if defined(HAL_STUB_HW_WATCHPOINT_LIST_SIZE) && (HAL_STUB_HW_WATCHPOINT_LIST_SIZE > 0) | |
| 1554 if (is_Z) | |
| 1555 err = __set_hw_watchpoint(addr, length, ztype); | |
| 1556 else | |
| 1557 err = __remove_hw_watchpoint(addr, length, ztype); | |
| 1558 if (!err) | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1559 strcpy (__remcomOutBuffer, "OK"); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1560 else |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1561 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1562 strcpy (__remcomOutBuffer, "E02"); |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1563 break; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1564 } |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1565 } |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1566 } |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1567 break; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1568 } |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
130
diff
changeset
|
1569 #endif // Z packet support |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1570 #ifdef CYGPKG_HAL_GDB_FILEIO // File I/O over the GDB remote protocol |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1571 case 'F': |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1572 { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1573 extern void cyg_hal_gdbfileio_process_F_packet( char *, char *); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1574 cyg_hal_gdbfileio_process_F_packet( packet, __remcomOutBuffer ); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1575 return -1; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1576 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1577 #endif |
| 2 | 1578 default: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1579 __process_target_packet (packet, __remcomOutBuffer, 300); |
| 2 | 1580 break; |
| 0 | 1581 } |
| 1582 | |
| 1583 /* reply to the request */ | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1584 __putpacket (__remcomOutBuffer); |
| 0 | 1585 return 0; |
| 1586 } | |
| 1587 | |
| 1588 static void | |
| 1589 send_t_packet (int sigval) | |
| 1590 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1591 __build_t_packet (sigval, __remcomOutBuffer); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1592 __putpacket (__remcomOutBuffer); |
| 0 | 1593 } |
| 1594 | |
| 1595 /* | |
| 1596 * This function does all command procesing for interfacing to gdb. | |
| 1597 */ | |
| 1598 | |
| 1599 static int | |
| 1600 process_exception (int sigval) | |
| 1601 { | |
| 1602 int status; | |
| 1603 | |
| 1604 /* Nasty. */ | |
| 1605 if (ungot_char < 0) | |
| 1606 send_t_packet (sigval); | |
| 1607 | |
| 1608 do { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1609 __getpacket (__remcomInBuffer); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1610 status = __process_packet (__remcomInBuffer); |
| 0 | 1611 } while (status == 0); |
| 1612 | |
| 1613 if (status < 0) | |
| 1614 return 0; | |
| 1615 else | |
| 1616 return 1; | |
| 1617 } | |
| 1618 | |
| 1619 void | |
| 1620 __send_exit_status (int status) | |
| 1621 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1622 __remcomOutBuffer[0] = 'W'; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1623 __remcomOutBuffer[1] = hexchars[(status >> 4) & 0xf]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1624 __remcomOutBuffer[2] = hexchars[status & 0xf]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1625 __remcomOutBuffer[3] = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1626 __putpacket (__remcomOutBuffer); |
| 0 | 1627 } |
| 1628 | |
| 2 | 1629 /* Read up to MAXLEN bytes from the remote GDB client, and store in DEST |
| 1630 (which is a pointer in the user program). BLOCK indicates what mode | |
| 1631 is being used; if it is set, we will wait for MAXLEN bytes to be | |
| 1632 entered. Otherwise, the function will return immediately with whatever | |
| 1633 bytes are waiting to be read. | |
| 1634 | |
| 1635 The value returned is the number of bytes read. A -1 indicates that an | |
| 1636 error of some sort occurred. */ | |
| 1637 | |
| 0 | 1638 int |
| 2 | 1639 __get_gdb_input (target_register_t dest, int maxlen, int block) |
| 0 | 1640 { |
| 1641 char buf[4]; | |
| 1642 int len, i; | |
| 2 | 1643 char d; |
| 0 | 1644 |
| 1645 buf[0] = 'I'; | |
| 1646 buf[1] = '0'; | |
| 1647 buf[2] = block ? '0' : '1'; | |
| 1648 buf[3] = 0; | |
| 2 | 1649 __putpacket (buf); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1650 __getpacket (__remcomInBuffer); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1651 if (__remcomInBuffer[0] != 'I') |
| 0 | 1652 return -1; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1653 len = stubhex (__remcomInBuffer[1]) * 16 + stubhex (__remcomInBuffer[2]); |
| 0 | 1654 for (i = 0; i < len; i++) |
| 1655 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1656 d = stubhex (__remcomInBuffer[3 + i * 2]) * 16; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1657 d |= stubhex (__remcomInBuffer[3 + i * 2 + 1]); |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1658 __write_mem_safe (&d, (void *)(dest + i), 1); |
| 0 | 1659 } |
| 2 | 1660 /* Write the trailing \0. */ |
| 1661 d = '\0'; | |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1662 __write_mem_safe (&d, (void *)(dest + i), 1); |
| 0 | 1663 return len; |
| 1664 } | |
| 1665 | |
| 1666 void | |
| 1667 __output_hex_value (target_register_t i) | |
| 1668 { | |
| 1669 char buf[32], *ptr=buf+31; | |
| 1670 unsigned int x; | |
| 1671 | |
| 1672 *ptr = 0; | |
| 2 | 1673 for (x = 0; x < (sizeof (i) * 2); x++) |
| 0 | 1674 { |
| 1675 *(--ptr) = hexchars[i & 15]; | |
| 1676 i = i >> 4; | |
| 1677 } | |
| 1678 while (*ptr) | |
| 1679 { | |
| 1680 putDebugChar (*(ptr++)); | |
| 1681 } | |
| 1682 } | |
| 1683 | |
| 2 | 1684 /* Write the C-style string pointed to by STR to the GDB comm port. */ |
| 1685 void | |
| 1686 __putDebugStr (char *str) | |
| 1687 { | |
| 1688 while (*str) | |
| 1689 { | |
| 1690 putDebugChar (*str); | |
| 1691 str++; | |
| 1692 } | |
| 1693 } | |
| 1694 | |
| 1695 /* Send STRING_LEN bytes of STR to GDB, using 'O' packets. | |
| 1696 STR is assumed to be in the program being debugged. */ | |
| 1697 | |
| 0 | 1698 int |
| 2 | 1699 __output_gdb_string (target_register_t str, int string_len) |
| 0 | 1700 { |
| 2 | 1701 /* We will arbitrarily limit output packets to less than 400 bytes. */ |
| 1702 static char buf[400]; | |
| 0 | 1703 int x; |
| 1704 int len; | |
| 1705 | |
| 1706 if (string_len == 0) | |
| 2 | 1707 { |
| 1708 /* We can't do strlen on a user pointer. */ | |
| 1709 return -1; | |
| 1710 } | |
| 0 | 1711 |
| 2 | 1712 len = string_len; |
| 1713 while (len > 0) | |
| 0 | 1714 { |
| 2 | 1715 int packetlen = ((len < 175) ? len : 175); |
| 1716 buf[0] = 'O'; | |
| 1717 for (x = 0; x < packetlen; x++) | |
| 1718 { | |
| 1719 char c; | |
| 1720 | |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1721 __read_mem_safe (&c, (void *)(str + x), 1); |
| 2 | 1722 buf[x*2+1] = hexchars[(c >> 4) & 0xf]; |
| 1723 buf[x*2+2] = hexchars[c % 16]; | |
| 1724 } | |
| 1725 str += x; | |
| 1726 len -= x; | |
| 1727 buf[x*2+1] = 0; | |
| 1728 __putpacket (buf); | |
| 0 | 1729 } |
| 1730 return string_len; | |
| 1731 } | |
| 1732 | |
| 1733 static void | |
| 1734 do_nothing (void) | |
| 1735 { | |
| 1736 /* mmmm */ | |
| 1737 } | |
| 1738 | |
| 1739 static int | |
| 1740 syscall_do_nothing (int junk) | |
| 1741 { | |
| 1742 return 0; | |
| 1743 } | |
| 1744 | |
| 1745 /* Start the stub running. */ | |
| 1746 void | |
| 2 | 1747 __switch_to_stub (void) |
| 0 | 1748 { |
| 1749 __process_exception_vec = process_exception; | |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1750 #ifdef CYGPKG_CYGMON |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1751 // Cygmon will have consumed the '$' character for this packet. |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1752 // Let's put one in the unget buffer. |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1753 // Actually, Cygmon does an unget, but since it uses different |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1754 // unget handling, we need to do this here. |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1755 ungetDebugChar('$'); |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
78
diff
changeset
|
1756 #endif |
| 0 | 1757 } |
| 1758 | |
| 2 | 1759 #if ! defined(BOARD_SPECIFIC_STUB_INIT) |
| 1760 void | |
| 1761 initialize_stub (void) | |
| 1762 { | |
| 1763 set_debug_traps (); | |
| 1764 /* FIXME: This function should be renamed to specifically init the | |
| 1765 hardware required by debug operations. If initHardware is implemented at | |
| 1766 all, it should be called before main (). | |
| 1767 */ | |
| 1768 initHardware () ; | |
| 1769 /* This acks any stale packets , NOT an effective solution */ | |
| 1770 putDebugChar ('+'); | |
| 1771 } | |
| 1772 #endif | |
| 1773 | |
| 0 | 1774 void |
| 1775 ungetDebugChar (int c) | |
| 1776 { | |
| 1777 ungot_char = c; | |
| 1778 } | |
| 1779 | |
| 2 | 1780 void |
| 1781 __kill_program (int sigval) | |
| 0 | 1782 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1783 __remcomOutBuffer[0] = 'X'; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1784 __remcomOutBuffer[1] = hexchars[(sigval >> 4) & 15]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1785 __remcomOutBuffer[2] = hexchars[sigval & 15]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1786 __remcomOutBuffer[3] = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1787 __putpacket (__remcomOutBuffer); |
| 2 | 1788 } |
| 1789 | |
|
895
4747af8ef0ef
Leave out unused static buffers if not supporting program args.
gthomas
parents:
317
diff
changeset
|
1790 #ifdef CYGSEM_ECOS_SUPPORTS_PROGRAM_ARGS |
| 2 | 1791 #define MAX_ARG_COUNT 20 |
| 1792 #define MAX_ARGDATA 128 | |
| 1793 | |
| 1794 static char *program_argv [MAX_ARG_COUNT]; | |
| 1795 static int program_argc; | |
| 1796 static int last_program_arg; | |
| 1797 static char program_argstr [MAX_ARGDATA], *argptr; | |
| 1798 static int args_initted = 0; | |
| 1799 | |
| 1800 void | |
| 1801 __free_program_args (void) | |
| 1802 { | |
| 1803 last_program_arg = -1; | |
| 1804 program_argc = 0; | |
| 1805 program_argv [0] = NULL; | |
| 1806 argptr = program_argstr; | |
| 1807 args_initted = 1; | |
| 1808 } | |
| 1809 | |
| 1810 static char * | |
| 1811 __add_program_arg (int argc, uint32 len) | |
| 1812 { | |
| 1813 char *res; | |
| 1814 | |
| 1815 if (! args_initted) | |
| 1816 { | |
| 1817 __free_program_args (); | |
| 1818 } | |
| 1819 | |
| 1820 if ((argc >= (MAX_ARG_COUNT - 1)) | |
| 1821 || ((argptr - program_argstr + len) > MAX_ARGDATA)) | |
| 1822 { | |
| 1823 return NULL; | |
| 1824 } | |
| 1825 | |
| 1826 if (argc != last_program_arg) | |
| 1827 { | |
| 1828 if (argc >= program_argc) | |
| 1829 { | |
| 1830 program_argc = argc + 1; | |
| 1831 program_argv [program_argc] = NULL; | |
| 1832 } | |
| 1833 program_argv [argc] = argptr; | |
| 1834 last_program_arg = argc; | |
| 1835 } | |
| 1836 | |
| 1837 res = argptr; | |
| 1838 argptr += len; | |
| 1839 | |
| 1840 return res; | |
| 1841 } | |
| 1842 | |
| 1843 void | |
| 1844 __set_program_args (int argc, char **argv) | |
| 1845 { | |
| 1846 int x; | |
| 1847 | |
| 1848 __free_program_args (); | |
| 1849 if (argc) | |
| 1850 { | |
| 1851 for (x = 0; x < argc; x++) | |
| 1852 { | |
| 1853 uint32 len = strlen (argv[x])+1; | |
| 1854 char *s = __add_program_arg (x, len); | |
| 1855 | |
| 1856 if (s == NULL) | |
| 1857 return; | |
| 1858 | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
1859 _memcpy (s, argv[x], len); |
| 2 | 1860 } |
| 1861 } | |
| 1862 } | |
| 1863 | |
| 1864 char ** | |
| 1865 __get_program_args (target_register_t argcPtr) | |
| 1866 { | |
| 1867 if (!args_initted) | |
| 1868 { | |
| 1869 __free_program_args (); | |
| 1870 } | |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1871 __write_mem_safe ((char *) &program_argc, (void *)argcPtr, sizeof (program_argc)); |
| 2 | 1872 return program_argv; |
| 0 | 1873 } |
|
895
4747af8ef0ef
Leave out unused static buffers if not supporting program args.
gthomas
parents:
317
diff
changeset
|
1874 #endif |
| 0 | 1875 |
| 1876 /* Table used by the crc32 function to calcuate the checksum. */ | |
|
912
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1877 #ifdef CYGDBG_HAL_CRCTABLE_LOCATION_RAM |
| 0 | 1878 static uint32 crc32_table[256]; |
| 1879 static int tableInit = 0; | |
|
912
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1880 #else |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1881 static const uint32 crc32_table[256]={ |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1882 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9,0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1883 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61,0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1884 0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9,0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1885 0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011,0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1886 0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039,0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1887 0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81,0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1888 0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49,0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1889 0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1,0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1890 0x34867077,0x30476dc0,0x3d044b19,0x39c556ae,0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1891 0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16,0x018aeb13,0x054bf6a4,0x0808d07d,0x0cc9cdca, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1892 0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde,0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1893 0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066,0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1894 0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e,0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1895 0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6,0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1896 0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e,0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1897 0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686,0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1898 0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637,0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1899 0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f,0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1900 0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47,0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1901 0x0315d626,0x07d4cb91,0x0a97ed48,0x0e56f0ff,0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1902 0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7,0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1903 0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f,0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1904 0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7,0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1905 0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f,0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1906 0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640,0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1907 0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8,0x68860bfd,0x6c47164a,0x61043093,0x65c52d24, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1908 0x119b4be9,0x155a565e,0x18197087,0x1cd86d30,0x029f3d35,0x065e2082,0x0b1d065b,0x0fdc1bec, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1909 0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088,0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1910 0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0,0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1911 0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18,0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1912 0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0,0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1913 0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668,0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4, |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1914 }; |
|
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1915 #endif |
| 0 | 1916 |
| 1917 /* | |
| 1918 Calculate a CRC-32 using LEN bytes of PTR. CRC is the initial CRC | |
| 1919 value. | |
| 1920 PTR is assumed to be a pointer in the user program. */ | |
| 1921 | |
| 1922 static uint32 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1923 crc32 (target_addr_t mem, int len, uint32 crc) |
| 0 | 1924 { |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1925 unsigned char *ptr = (unsigned char *)TARGET_ADDR_TO_PTR(mem); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1926 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1927 int is_progmem = TARGET_ADDR_IS_PROGMEM(mem); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1928 #endif |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1929 |
|
912
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1930 #ifdef CYGDBG_HAL_CRCTABLE_RAM |
| 0 | 1931 if (! tableInit) |
| 1932 { | |
| 1933 /* Initialize the CRC table and the decoding table. */ | |
| 1934 uint32 i, j; | |
| 1935 uint32 c; | |
| 1936 | |
| 1937 tableInit = 1; | |
| 1938 for (i = 0; i < 256; i++) | |
| 2 | 1939 { |
| 1940 for (c = i << 24, j = 8; j > 0; --j) | |
| 1941 c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1); | |
| 1942 crc32_table[i] = c; | |
| 1943 } | |
| 0 | 1944 } |
|
912
82d5a3544347
* cdl/debugging.cdl: Allow CRC to be allocated in ROM as well as RAM.
jlarmour
parents:
895
diff
changeset
|
1945 #endif |
| 0 | 1946 |
| 1947 __mem_fault = 0; | |
| 1948 while (len--) | |
| 1949 { | |
| 1950 unsigned char ch; | |
| 1951 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1952 #ifdef TARGET_HAS_HARVARD_MEMORY |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1953 if (is_progmem) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1954 __read_progmem_safe (&ch, (void *)ptr, 1); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1955 else |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1956 #endif |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1957 __read_mem_safe (&ch, (void *)ptr, 1); |
| 0 | 1958 if (__mem_fault) |
| 2 | 1959 { |
| 1960 break; | |
| 1961 } | |
| 0 | 1962 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ ch) & 255]; |
| 1963 ptr++; | |
| 1964 } | |
| 1965 return crc; | |
| 1966 } | |
| 1967 | |
| 1968 /* Handle the 'q' request */ | |
| 1969 | |
| 1970 static void | |
| 1971 process_query (char *pkt) | |
| 1972 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1973 __remcomOutBuffer[0] = '\0'; |
| 2 | 1974 #ifdef __ECOS__ |
| 0 | 1975 if ('C' == pkt[0] && |
| 1976 'R' == pkt[1] && | |
| 1977 'C' == pkt[2] && | |
| 1978 ':' == pkt[3]) | |
| 2 | 1979 #else // __ECOS__ |
| 1980 if (strncmp (pkt, "CRC:", 4) == 0) | |
| 1981 #endif // __ECOS__ | |
| 0 | 1982 { |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1983 target_addr_t startmem; |
| 0 | 1984 target_register_t length; |
| 1985 uint32 our_crc; | |
| 1986 | |
| 1987 pkt += 4; | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1988 if (__hexToAddr (&pkt, &startmem) |
| 2 | 1989 && *(pkt++) == ',' |
| 1990 && __hexToInt (&pkt, &length)) | |
| 1991 { | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1992 our_crc = crc32 (startmem, length, 0xffffffff); |
| 2 | 1993 if (__mem_fault) |
| 1994 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1995 strcpy (__remcomOutBuffer, "E01"); |
| 2 | 1996 } |
| 1997 else | |
| 1998 { | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
1999 int numb = __intToHex (__remcomOutBuffer + 1, our_crc, 32); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2000 __remcomOutBuffer[0] = 'C'; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2001 __remcomOutBuffer[numb + 1] = 0; |
| 2 | 2002 } |
| 2003 } | |
| 0 | 2004 return; |
| 2005 } | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
2006 #ifdef CYG_HAL_STUB_PROCESS_QUERY |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2007 else if (CYG_HAL_STUB_PROCESS_QUERY (pkt, __remcomOutBuffer, sizeof(__remcomOutBuffer))) |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
2008 return; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
2009 #endif |
| 0 | 2010 else |
| 2011 { | |
| 2012 char ch ; | |
| 2013 char * subpkt ; | |
| 2014 ch = *pkt ; | |
| 2015 subpkt = pkt + 1 ; | |
| 2016 switch (ch) | |
| 2 | 2017 { |
| 2018 case 'L' : /* threadlistquery */ | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2019 STUB_PKT_GETTHREADLIST (subpkt, __remcomOutBuffer, 300); |
| 2 | 2020 break ; |
| 2021 case 'P' : /* Thread or process information request */ | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2022 STUB_PKT_GETTHREADINFO (subpkt, __remcomOutBuffer, 300); |
| 2 | 2023 break ; |
| 2024 case 'C' : /* current thread query */ | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2025 STUB_PKT_CURRTHREAD(subpkt, __remcomOutBuffer, sizeof(__remcomOutBuffer)); |
| 2 | 2026 break; |
| 2027 default: | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2028 __process_target_query (pkt, __remcomOutBuffer, 300); |
| 2 | 2029 break ; |
| 2030 } | |
| 0 | 2031 } |
| 2032 } | |
| 2033 | |
| 2034 /* Handle the 'Q' request */ | |
| 2035 | |
| 2036 static void | |
| 2037 process_set (char *pkt) | |
| 2038 { | |
| 2039 char ch ; | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
2040 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
2041 #ifdef CYG_HAL_STUB_PROCESS_SET |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2042 if (CYG_HAL_STUB_PROCESS_SET (pkt, __remcomOutBuffer, sizeof(__remcomOutBuffer))) |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
2043 return; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
2044 #endif |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
184
diff
changeset
|
2045 |
| 0 | 2046 ch = *pkt ; |
| 2047 switch (ch) | |
| 2048 { | |
| 2049 case 'p' : /* Set current process or thread */ | |
| 2050 /* reserve the packet id even if support is not present */ | |
| 2051 /* Dont strip the 'p' off the header, there are several variations of | |
| 2 | 2052 this packet */ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2053 STUB_PKT_CHANGETHREAD (pkt, __remcomOutBuffer, 300) ; |
| 0 | 2054 break ; |
| 2055 default: | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
2056 __process_target_set (pkt, __remcomOutBuffer, 300); |
| 0 | 2057 break ; |
| 2058 } | |
| 2059 } | |
| 2060 #endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
