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