static int __dbg rvec_break( int dummy_rvec, int break_flag ) { switch( break_flag ) { case BREAK_RFI: if( (molcpu.break_flags & BREAK_USER) ) { if( !(mregs->msr & MSR_PR) ) return 0; clear_break_flag( BREAK_USER ); } printm("BREAK-RFI (%08lX)\n", mregs->nip ); break; case BREAK_EA_PAGE: /* breakpoint might not have been written */ printm("ea-break at %08lX\n", mregs->nip ); restore_breakpoints(); setup_breakpoints(); break; case BREAK_SINGLE_STEP: if( molcpu.break_flags & BREAK_SINGLE_STEP_CONT ) { if( !is_stop_breakpoint( mregs->nip ) ) return 0; clear_break_flag( BREAK_SINGLE_STEP_CONT ); } //setup_breakpoints(); break; default: printm("rvec_break: Unknown break flag %d\n", break_flag ); break; } stop_emulation(); clear_break_flag( break_flag ); return 0; }
//------------------------------------------------------------------------------ // Name: show_menu // Desc: //------------------------------------------------------------------------------ void HardwareBreakpoints::show_menu() { if(!dialog_) { dialog_ = new DialogHWBreakpoints(edb::v1::debugger_ui); } if(dialog_->exec() == QDialog::Accepted) { setup_breakpoints(); } }
static void handle_msg( mol_dgram_t *dg ) { cmd_entry_t *ce = sv.cmd_root; int i, val; switch( dg->what ) { case kMDG_connect: printm("Debugger attached\n"); sv.dbg_attached = 1; send_dgram( sv.sock, kMDG_connect ); send_mregs(); send_dgram( sv.sock, kMDG_refresh_debugger ); /* send debugger commands */ for( ce=sv.cmd_root; ce; ce=ce->next ) { int s = strlen( ce->cmdname ) + 1; int t = strlen( ce->help ) + 1; char *b = malloc( s + t ); strcpy( b, ce->cmdname ); strcpy( b+s, ce->help ); send_dgram_buf2( sv.sock, kMDG_dbg_cmd, b, s+t, s, -1 /*dummy*/ ); free( b ); } break; case kMDG_disconnect: sv.dbg_attached = 0; close_sock(); printm("Debugger detached\n"); break; case kMDG_mregs: send_mregs(); break; case kMDG_write_mregs: receive_mregs( (mac_regs_t*)dg->data ); break; case kMDG_read_dpage: { /* ea, context, data_access */ char buf[0x2000]; dg->p0 &= ~0xfff; restore_breakpoints(); for( i=0; i<2; i++ ) { char *lvptr; if( ea_to_lvptr( dg->p0 + i*0x1000, dg->p1, &lvptr, dg->p2 ) ) memset( buf+i*0x1000, 0xDE, 0x1000 ); else memcpy( buf+i*0x1000, lvptr, 0x1000 ); } setup_breakpoints(); send_dgram_buf( sv.sock, kMDG_dpage_data, buf, 0x2000 ); break; } case kMDG_in_ppc_mode: /* flag */ sv.in_ppc_mode = dg->p0; break; case kMDG_debug_action: /* action (go, single-step, etc.) */ debug_action( dg->p0 ); break; case kMDG_add_breakpoint: /* addr, flags, data */ add_breakpoint( dg->p0, dg->p1, dg->p2 ); break; case kMDG_is_breakpoint: { /* mvptr */ char breakbuf[ BREAK_BUF_SIZE ]; for(i=0; i<BREAK_BUF_SIZE; i++ ){ if( !is_breakpoint( dg->p0 + i*4, &breakbuf[i] ) ) breakbuf[i] = 0; } send_dgram_buf1( sv.sock, kMDG_is_breakpoint, breakbuf, BREAK_BUF_SIZE, dg->p0 ); break; } case kMDG_dbg_cmd: val = do_dbg_cmd( (remote_cmd_t*)dg->data ); send_dgram1( sv.sock, kMDG_result, val ); break; default: printm("Unknown dbg-message %d received\n", dg->what ); break; } }