void cyg_hal_gdb_interrupt (target_register_t pc) { t_inst break_inst = HAL_BREAKINST; CYGARC_HAL_SAVE_GP(); // Clear flag that we Continued instead of Stepping cyg_hal_gdb_running_step = 0; // and override existing break? So that a ^C takes effect... if (NULL != break_buffer.targetAddr) cyg_hal_gdb_remove_break( (target_register_t)break_buffer.targetAddr ); if (NULL == break_buffer.targetAddr) { // Not always safe to read/write directly to program // memory due to possibly unaligned instruction, use the // provided memory functions instead. __read_mem_safe(&break_buffer.savedInstr, (t_inst*)pc, HAL_BREAKINST_SIZE); __write_mem_safe(&break_inst, (t_inst*)pc, HAL_BREAKINST_SIZE); // Save the PC where we put the break, so we can remove // it after the target takes the break. break_buffer.targetAddr = (t_inst*)pc; __data_cache(CACHE_FLUSH); __instruction_cache(CACHE_FLUSH); } CYGARC_HAL_RESTORE_GP(); }
static void __insert_break(int indx, target_register_t pc) { sstep_instr[indx].targetAddr = (t_inst *)pc; sstep_instr[indx].savedInstr = *(t_inst *)pc; *(t_inst*)pc = (t_inst)HAL_BREAKINST; __data_cache(CACHE_FLUSH); __instruction_cache(CACHE_FLUSH); }
void install_async_breakpoint(void *pc) { asyncBuffer.targetAddr = pc; asyncBuffer.savedInstr = *(t_inst *)pc; *(t_inst *)pc = (t_inst)HAL_BREAKINST; __instruction_cache(CACHE_FLUSH); __data_cache(CACHE_FLUSH); }
static void __remove_break(int indx) { if (sstep_instr[indx].targetAddr != 0) { *(sstep_instr[indx].targetAddr) = sstep_instr[indx].savedInstr; sstep_instr[indx].targetAddr = 0; __data_cache(CACHE_FLUSH); __instruction_cache(CACHE_FLUSH); } }
int cyg_hal_gdb_remove_break (target_register_t pc) { if ( cyg_hal_gdb_running_step ) return 0; if ((t_inst*)pc == break_buffer.targetAddr) { __write_mem_safe(&break_buffer.savedInstr, (t_inst*)pc, HAL_BREAKINST_SIZE); break_buffer.targetAddr = NULL; __data_cache(CACHE_FLUSH); __instruction_cache(CACHE_FLUSH); return 1; } return 0; }
int __computeSignal (unsigned int trap_number) { if (asyncBuffer.targetAddr != NULL) { /* BP installed by serial driver to stop running program */ *asyncBuffer.targetAddr = asyncBuffer.savedInstr; __instruction_cache(CACHE_FLUSH); __data_cache(CACHE_FLUSH); asyncBuffer.targetAddr = NULL; return SIGINT; } #ifdef SIGSYSCALL switch (trap_number) { case SIGSYSCALL: /* System call */ return SIGSYSCALL; } #endif return SIGTRAP; }