Mercurial > ecos
diff packages/hal/common/current/src/generic-stub.c @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | ea3f0bd33a73 |
| children | 4882695334f2 |
line wrap: on
line diff
--- a/packages/hal/common/current/src/generic-stub.c +++ b/packages/hal/common/current/src/generic-stub.c @@ -9,7 +9,6 @@ #else // Function declarations (prevents compiler warnings) int stubhex (unsigned char ch); -static void getpacket (char *buffer); static void unlock_thread_scheduler (void); static uint32 crc32 (target_addr_t mem, int len, uint32 crc); #endif @@ -220,8 +219,8 @@ stubhex (ch) return -1; } -static void -getpacket (buffer) +void +__getpacket (buffer) char *buffer; { struct gdb_packet packet; @@ -351,8 +350,8 @@ void while ((readDebugChar () & 0x7f) != '+'); } -static char remcomInBuffer[BUFMAX]; -static char remcomOutBuffer[BUFMAX]; +char __remcomInBuffer[BUFMAX]; +char __remcomOutBuffer[BUFMAX]; /* Indicate to caller of mem2hex or hex2mem that there has been an error. */ @@ -885,7 +884,7 @@ int processing_breakpoint_function = 0; void __handle_exception (void) { - int sigval; + int sigval = 0; #ifdef TARGET_HAS_NEXT_STEP if (! __next_step_done ()) @@ -905,14 +904,15 @@ void #if defined(CYGSEM_REDBOOT_BSP_SYSCALLS) // Temporary support for gnupro bsp SWIs if (__is_bsp_syscall()) - { - if (hal_syscall_handler() == 0) - { + { + sigval = hal_syscall_handler(); + if (0 == sigval) + { if (__init_vec != NULL) - __init_vec (); + __init_vec (); return; - } - } + } + } #endif #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT @@ -920,8 +920,12 @@ void if (cyg_hal_gdb_break) { cyg_hal_gdb_break = 0; sigval = SIGINT; - } else + } #endif + + // Only compute sigval if it wasn't already computed (in + // hal_syscall_handler or as a result of a GDB async break) + if (0 == sigval) sigval = __computeSignal (__get_trap_number ()); #else // __ECOS__ @@ -1149,16 +1153,16 @@ int int is_Z = 0; #endif - remcomOutBuffer[0] = 0; + __remcomOutBuffer[0] = 0; switch (packet[0]) { case '?': { int sigval = __computeSignal (__get_trap_number ()); - remcomOutBuffer[0] = 'S'; - remcomOutBuffer[1] = hexchars[(sigval >> 4) & 0xf]; - remcomOutBuffer[2] = hexchars[sigval & 0xf]; - remcomOutBuffer[3] = 0; + __remcomOutBuffer[0] = 'S'; + __remcomOutBuffer[1] = hexchars[(sigval >> 4) & 0xf]; + __remcomOutBuffer[2] = hexchars[sigval & 0xf]; + __remcomOutBuffer[3] = 0; break; } @@ -1170,14 +1174,14 @@ int download speed */ { int i; - i = __intToHex (remcomOutBuffer, BUFMAX, 32); - remcomOutBuffer[i] = 0; + i = __intToHex (__remcomOutBuffer, BUFMAX, 32); + __remcomOutBuffer[i] = 0; break; } #endif case 'd': /* toggle debug flag */ - strcpy(remcomOutBuffer, GDB_stubs_version); + strcpy(__remcomOutBuffer, GDB_stubs_version); break; #endif #endif // __ECOS__ @@ -1195,7 +1199,7 @@ int case 'p': /* return the value of a single CPU register */ case 'g': /* return the value of the CPU registers */ { - stub_format_registers(&packet[0], remcomOutBuffer); + stub_format_registers(&packet[0], __remcomOutBuffer); break; } @@ -1205,7 +1209,7 @@ int if (packet[1] == '\0') { __free_program_args (); - strcpy (remcomOutBuffer, "OK"); + strcpy (__remcomOutBuffer, "OK"); } else { @@ -1238,12 +1242,12 @@ int break; } if (*ptr == '\0') - strcpy (remcomOutBuffer, "OK"); + strcpy (__remcomOutBuffer, "OK"); else - strcpy (remcomOutBuffer, "E01"); + strcpy (__remcomOutBuffer, "E01"); } #else - strcpy (remcomOutBuffer, "E01"); + strcpy (__remcomOutBuffer, "E01"); #endif } break; @@ -1252,7 +1256,7 @@ int case 'G': /* set the value of the CPU registers - return OK */ { char *in_ptr = &packet[0]; - char *out_ptr = remcomOutBuffer; + char *out_ptr = __remcomOutBuffer; stub_update_registers(in_ptr, out_ptr); break; } @@ -1268,13 +1272,13 @@ int && *ptr++ == ',' && __hexToInt (&ptr, &length)) { - if (__mem2hex_safe (addr, remcomOutBuffer, length)) + if (__mem2hex_safe (addr, __remcomOutBuffer, length)) break; - strcpy (remcomOutBuffer, "E03"); + strcpy (__remcomOutBuffer, "E03"); } else - strcpy (remcomOutBuffer, "E01"); + strcpy (__remcomOutBuffer, "E01"); break; } @@ -1297,7 +1301,7 @@ int { /* GDB sometimes sends an impossible length */ if (length < 0 || length >= BUFMAX) - strcpy (remcomOutBuffer, "E01"); + strcpy (__remcomOutBuffer, "E01"); else if (is_binary) { @@ -1321,20 +1325,20 @@ int addr += i; } if (length <= 0) - strcpy (remcomOutBuffer, "OK"); + strcpy (__remcomOutBuffer, "OK"); else - strcpy (remcomOutBuffer, "E03"); + strcpy (__remcomOutBuffer, "E03"); } else { if (__hex2mem_safe (ptr, addr, length) != NULL) - strcpy (remcomOutBuffer, "OK"); + strcpy (__remcomOutBuffer, "OK"); else - strcpy (remcomOutBuffer, "E03"); + strcpy (__remcomOutBuffer, "E03"); } } else - strcpy (remcomOutBuffer, "E02"); + strcpy (__remcomOutBuffer, "E02"); break; } @@ -1425,12 +1429,18 @@ int } case 'D' : /* detach */ - __putpacket (remcomOutBuffer); + __putpacket (__remcomOutBuffer); /* fall through */ case 'k' : /* kill the program */ #ifdef __ECOS__ hal_flush_output(); #endif +#ifdef CYGSEM_REDBOOT_BSP_SYSCALLS_GPROF + { // Reset the timer to default and cancel any callback + extern void sys_profile_reset(void); + sys_profile_reset(); + } +#endif // CYGSEM_REDBOOT_BSP_SYSCALLS_GPROF __process_exit_vec (); return -1; @@ -1440,10 +1450,10 @@ int break; case 'H': - STUB_PKT_CHANGETHREAD (packet+1, remcomOutBuffer, 300) ; + STUB_PKT_CHANGETHREAD (packet+1, __remcomOutBuffer, 300) ; break ; case 'T' : - STUB_PKT_THREAD_ALIVE (packet+1, remcomOutBuffer, 300) ; + STUB_PKT_THREAD_ALIVE (packet+1, __remcomOutBuffer, 300) ; break ; case 'B': /* breakpoint */ @@ -1458,11 +1468,11 @@ int __remove_breakpoint (addr,0); else __set_breakpoint (addr,0); - strcpy (remcomOutBuffer, "OK"); + strcpy (__remcomOutBuffer, "OK"); } else { - strcpy (remcomOutBuffer, "E01"); + strcpy (__remcomOutBuffer, "E01"); } break; } @@ -1474,7 +1484,7 @@ int char *ptr = &packet[1]; if (!__hexToInt (&ptr, &baudrate)) { - strcpy (remcomOutBuffer, "B01"); + strcpy (__remcomOutBuffer, "B01"); break; } @@ -1502,7 +1512,7 @@ int /* When there is a comma, there must be a length */ if (!__hexToInt (&ptr, &length)) { - strcpy (remcomOutBuffer, "E02"); + strcpy (__remcomOutBuffer, "E02"); break; } } @@ -1520,18 +1530,18 @@ int else err = __remove_breakpoint(addr,length); if (!err) - strcpy (remcomOutBuffer, "OK"); + strcpy (__remcomOutBuffer, "OK"); else - strcpy (remcomOutBuffer, "E02"); + strcpy (__remcomOutBuffer, "E02"); break; case 1: /* hw breakpoint */ #ifdef HAL_STUB_HW_BREAKPOINT if (!HAL_STUB_HW_BREAKPOINT(is_Z, (void *)addr, length)) - strcpy (remcomOutBuffer, "OK"); + strcpy (__remcomOutBuffer, "OK"); else #endif - strcpy (remcomOutBuffer, "E02"); + strcpy (__remcomOutBuffer, "E02"); break; case 2: case 3: @@ -1539,10 +1549,10 @@ int /* hw watchpoint */ #ifdef HAL_STUB_HW_WATCHPOINT if (!HAL_STUB_HW_WATCHPOINT(is_Z, (void *)addr, length, ztype)) - strcpy (remcomOutBuffer, "OK"); + strcpy (__remcomOutBuffer, "OK"); else #endif - strcpy (remcomOutBuffer, "E02"); + strcpy (__remcomOutBuffer, "E02"); break; } } @@ -1550,21 +1560,29 @@ int break; } #endif // Z packet support +#ifdef CYGPKG_HAL_GDB_FILEIO // File I/O over the GDB remote protocol + case 'F': + { + extern void cyg_hal_gdbfileio_process_F_packet( char *, char *); + cyg_hal_gdbfileio_process_F_packet( packet, __remcomOutBuffer ); + return -1; + } +#endif default: - __process_target_packet (packet, remcomOutBuffer, 300); + __process_target_packet (packet, __remcomOutBuffer, 300); break; } /* reply to the request */ - __putpacket (remcomOutBuffer); + __putpacket (__remcomOutBuffer); return 0; } static void send_t_packet (int sigval) { - __build_t_packet (sigval, remcomOutBuffer); - __putpacket (remcomOutBuffer); + __build_t_packet (sigval, __remcomOutBuffer); + __putpacket (__remcomOutBuffer); } /* @@ -1581,8 +1599,8 @@ process_exception (int sigval) send_t_packet (sigval); do { - getpacket (remcomInBuffer); - status = __process_packet (remcomInBuffer); + __getpacket (__remcomInBuffer); + status = __process_packet (__remcomInBuffer); } while (status == 0); if (status < 0) @@ -1594,11 +1612,11 @@ process_exception (int sigval) void __send_exit_status (int status) { - remcomOutBuffer[0] = 'W'; - remcomOutBuffer[1] = hexchars[(status >> 4) & 0xf]; - remcomOutBuffer[2] = hexchars[status & 0xf]; - remcomOutBuffer[3] = 0; - __putpacket (remcomOutBuffer); + __remcomOutBuffer[0] = 'W'; + __remcomOutBuffer[1] = hexchars[(status >> 4) & 0xf]; + __remcomOutBuffer[2] = hexchars[status & 0xf]; + __remcomOutBuffer[3] = 0; + __putpacket (__remcomOutBuffer); } /* Read up to MAXLEN bytes from the remote GDB client, and store in DEST @@ -1622,14 +1640,14 @@ int buf[2] = block ? '0' : '1'; buf[3] = 0; __putpacket (buf); - getpacket (remcomInBuffer); - if (remcomInBuffer[0] != 'I') + __getpacket (__remcomInBuffer); + if (__remcomInBuffer[0] != 'I') return -1; - len = stubhex (remcomInBuffer[1]) * 16 + stubhex (remcomInBuffer[2]); + len = stubhex (__remcomInBuffer[1]) * 16 + stubhex (__remcomInBuffer[2]); for (i = 0; i < len; i++) { - d = stubhex (remcomInBuffer[3 + i * 2]) * 16; - d |= stubhex (remcomInBuffer[3 + i * 2 + 1]); + d = stubhex (__remcomInBuffer[3 + i * 2]) * 16; + d |= stubhex (__remcomInBuffer[3 + i * 2 + 1]); __write_mem_safe (&d, (void *)(dest + i), 1); } /* Write the trailing \0. */ @@ -1755,11 +1773,11 @@ ungetDebugChar (int c) void __kill_program (int sigval) { - remcomOutBuffer[0] = 'X'; - remcomOutBuffer[1] = hexchars[(sigval >> 4) & 15]; - remcomOutBuffer[2] = hexchars[sigval & 15]; - remcomOutBuffer[3] = 0; - __putpacket (remcomOutBuffer); + __remcomOutBuffer[0] = 'X'; + __remcomOutBuffer[1] = hexchars[(sigval >> 4) & 15]; + __remcomOutBuffer[2] = hexchars[sigval & 15]; + __remcomOutBuffer[3] = 0; + __putpacket (__remcomOutBuffer); } #define MAX_ARG_COUNT 20 @@ -1904,7 +1922,7 @@ crc32 (target_addr_t mem, int len, uint3 static void process_query (char *pkt) { - remcomOutBuffer[0] = '\0'; + __remcomOutBuffer[0] = '\0'; #ifdef __ECOS__ if ('C' == pkt[0] && 'R' == pkt[1] && @@ -1926,19 +1944,19 @@ process_query (char *pkt) our_crc = crc32 (startmem, length, 0xffffffff); if (__mem_fault) { - strcpy (remcomOutBuffer, "E01"); + strcpy (__remcomOutBuffer, "E01"); } else { - int numb = __intToHex (remcomOutBuffer + 1, our_crc, 32); - remcomOutBuffer[0] = 'C'; - remcomOutBuffer[numb + 1] = 0; + int numb = __intToHex (__remcomOutBuffer + 1, our_crc, 32); + __remcomOutBuffer[0] = 'C'; + __remcomOutBuffer[numb + 1] = 0; } } return; } #ifdef CYG_HAL_STUB_PROCESS_QUERY - else if (CYG_HAL_STUB_PROCESS_QUERY (pkt, remcomOutBuffer, sizeof(remcomOutBuffer))) + else if (CYG_HAL_STUB_PROCESS_QUERY (pkt, __remcomOutBuffer, sizeof(__remcomOutBuffer))) return; #endif else @@ -1950,16 +1968,16 @@ process_query (char *pkt) switch (ch) { case 'L' : /* threadlistquery */ - STUB_PKT_GETTHREADLIST (subpkt, remcomOutBuffer, 300); + STUB_PKT_GETTHREADLIST (subpkt, __remcomOutBuffer, 300); break ; case 'P' : /* Thread or process information request */ - STUB_PKT_GETTHREADINFO (subpkt, remcomOutBuffer, 300); + STUB_PKT_GETTHREADINFO (subpkt, __remcomOutBuffer, 300); break ; case 'C' : /* current thread query */ - STUB_PKT_CURRTHREAD(subpkt, remcomOutBuffer, sizeof(remcomOutBuffer)); + STUB_PKT_CURRTHREAD(subpkt, __remcomOutBuffer, sizeof(__remcomOutBuffer)); break; default: - __process_target_query (pkt, remcomOutBuffer, 300); + __process_target_query (pkt, __remcomOutBuffer, 300); break ; } } @@ -1973,7 +1991,7 @@ process_set (char *pkt) char ch ; #ifdef CYG_HAL_STUB_PROCESS_SET - if (CYG_HAL_STUB_PROCESS_SET (pkt, remcomOutBuffer, sizeof(remcomOutBuffer))) + if (CYG_HAL_STUB_PROCESS_SET (pkt, __remcomOutBuffer, sizeof(__remcomOutBuffer))) return; #endif @@ -1984,10 +2002,10 @@ process_set (char *pkt) /* reserve the packet id even if support is not present */ /* Dont strip the 'p' off the header, there are several variations of this packet */ - STUB_PKT_CHANGETHREAD (pkt, remcomOutBuffer, 300) ; + STUB_PKT_CHANGETHREAD (pkt, __remcomOutBuffer, 300) ; break ; default: - __process_target_set (pkt, remcomOutBuffer, 300); + __process_target_set (pkt, __remcomOutBuffer, 300); break ; } }
