📄 remote-mm.c
字号:
out_msg_buf->go_msg.code = GO; out_msg_buf->go_msg.length = 0; msg_send_serial(out_msg_buf); /* No message to expect after a GO */}/**************************************************************** REMOTE_CLOSE** Close the open connection to the minimon debugger. Use this when you want to detach and do something else with your gdb. */static voidmm_close (quitting) /*FIXME: how is quitting used */ int quitting;{ if (mm_desc < 0) error ("Can't close remote connection: not debugging remotely."); /* We should never get here if there isn't something valid in mm_desc and mm_stream. Due to a bug in Unix, fclose closes not only the stdio stream, but also the file descriptor. So we don't actually close mm_desc. */ DRAIN_INPUT(); fclose (mm_stream); /* close (mm_desc); */ /* Do not try to close mm_desc again, later in the program. */ mm_stream = NULL; mm_desc = -1;#if defined (LOG_FILE) if (ferror (log_file)) printf ("Error writing log file.\n"); if (fclose (log_file) != 0) printf ("Error closing log file.\n");#endif printf ("Ending remote debugging\n");} /************************************************************* REMOTE_ATACH *//* Attach to a program that is already loaded and running * Upon exiting the process's execution is stopped. */static voidmm_attach (args, from_tty) char *args; int from_tty;{ if (!mm_stream) error ("MiniMon not opened yet, use the 'target minimon' command.\n"); if (from_tty) printf ("Attaching to remote program %s...\n", prog_name); /* Make sure the target is currently running, it is supposed to be. */ /* FIXME: is it ok to send MiniMon a BREAK if it is already stopped in * the dbg core. If so, we don't need to send this GO. */ out_msg_buf->go_msg.code = GO; out_msg_buf->go_msg.length = 0; msg_send_serial(out_msg_buf); sleep(2); /* At the worst it will stop, receive a message, continue */ /* Send the mm a break. */ out_msg_buf->break_msg.code = BREAK; out_msg_buf->break_msg.length = 0; msg_send_serial(out_msg_buf);}/********************************************************** REMOTE_DETACH *//* Terminate the open connection to the remote debugger. Use this when you want to detach and do something else with your gdb. Leave remote process running (with no breakpoints set). */static voidmm_detach (args,from_tty) char *args; int from_tty;{ remove_breakpoints(); /* Just in case there were any left in */ out_msg_buf->go_msg.code = GO; out_msg_buf->go_msg.length = 0; msg_send_serial(out_msg_buf); pop_target(); /* calls mm_close to do the real work */}/*************************************************************** REMOTE_RESUME** Tell the remote machine to resume. */static voidmm_resume (step, sig) int step, sig;{ if (sig) error ("Can't send signals to a remote MiniMon system."); if (step) { out_msg_buf->step_msg.code= STEP; out_msg_buf->step_msg.length = 1*4; out_msg_buf->step_msg.count = 1; /* step 1 instruction */ msg_send_serial(out_msg_buf); } else { out_msg_buf->go_msg.code= GO; out_msg_buf->go_msg.length = 0; msg_send_serial(out_msg_buf); }}/***************************************************************** REMOTE_WAIT** Wait until the remote machine stops, then return, storing status in STATUS just as `wait' would. */static intmm_wait (status) WAITTYPE *status;{ int i, result; int old_timeout = timeout; int old_immediate_quit = immediate_quit; WSETEXIT ((*status), 0);/* wait for message to arrive. It should be: - A HIF service request. - A HIF exit service request. - A CHANNEL0_ACK. - A CHANNEL1 request. - a debugcore HALT message. HIF services must be responded too, and while-looping continued. If the target stops executing, mm_wait() should return.*/ timeout = 0; /* Wait indefinetly for a message */ immediate_quit = 1; /* Helps ability to QUIT */ while(1) { while(msg_recv_serial(in_msg_buf)) { QUIT; /* Let user quit if they want */ } switch (in_msg_buf->halt_msg.code) { case HIF_CALL: i = in_msg_buf->hif_call_rtn_msg.service_number; result=service_HIF(in_msg_buf); if(i == 1) /* EXIT */ goto exit; if(result) printf("Warning: failure during HIF service %d\n", i); break; case CHANNEL0_ACK: service_HIF(in_msg_buf); break; case CHANNEL1: i=in_msg_buf->channel1_msg.length; in_msg_buf->channel1_msg.data[i] = '\0'; printf("%s", in_msg_buf->channel1_msg.data); fflush(stdout); /* Send CHANNEL1_ACK message */ out_msg_buf->channel1_ack_msg.code = CHANNEL1_ACK; out_msg_buf->channel1_ack_msg.length = 0; result = msg_send_serial(out_msg_buf); break; case HALT: goto halted; default: goto halted; } }halted: /* FIXME, these printfs should not be here. This is a source level debugger, guys! */ if (in_msg_buf->halt_msg.trap_number== 0) { printf("Am290*0 received vector number %d (break point)\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGTRAP); } else if (in_msg_buf->halt_msg.trap_number== 1) { printf("Am290*0 received vector number %d\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGBUS); } else if (in_msg_buf->halt_msg.trap_number== 3 || in_msg_buf->halt_msg.trap_number== 4) { printf("Am290*0 received vector number %d\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGFPE); } else if (in_msg_buf->halt_msg.trap_number== 5) { printf("Am290*0 received vector number %d\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGILL); } else if (in_msg_buf->halt_msg.trap_number >= 6 && in_msg_buf->halt_msg.trap_number <= 11) { printf("Am290*0 received vector number %d\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGSEGV); } else if (in_msg_buf->halt_msg.trap_number== 12 || in_msg_buf->halt_msg.trap_number== 13) { printf("Am290*0 received vector number %d\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGILL); } else if (in_msg_buf->halt_msg.trap_number== 14) { printf("Am290*0 received vector number %d\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGALRM); } else if (in_msg_buf->halt_msg.trap_number== 15) WSETSTOP ((*status), SIGTRAP); else if (in_msg_buf->halt_msg.trap_number >= 16 && in_msg_buf->halt_msg.trap_number <= 21) { printf("Am290*0 received vector number %d\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGINT); } else if (in_msg_buf->halt_msg.trap_number== 22) { printf("Am290*0 received vector number %d\n", in_msg_buf->halt_msg.trap_number); WSETSTOP ((*status), SIGILL); } /* BREAK message was sent */ else if (in_msg_buf->halt_msg.trap_number== 75) WSETSTOP ((*status), SIGTRAP); elseexit: WSETEXIT ((*status), 0); timeout = old_timeout; /* Restore original timeout value */ immediate_quit = old_immediate_quit; return 0;}/******************************************************* REMOTE_FETCH_REGISTERS * Read a remote register 'regno'. * If regno==-1 then read all the registers. */static void mm_fetch_registers (regno)int regno;{ INT32 *data_p; if (regno >= 0) { fetch_register(regno); return; }/* Gr1/rsp */ out_msg_buf->read_req_msg.byte_count = 4*1; out_msg_buf->read_req_msg.memory_space = GLOBAL_REG; out_msg_buf->read_req_msg.address = 1; msg_send_serial(out_msg_buf); expect_msg(READ_ACK,in_msg_buf,1); data_p = &(in_msg_buf->read_r_ack_msg.data[0]); supply_register (GR1_REGNUM , data_p);#if defined(GR64_REGNUM) /* Read gr64-127 *//* Global Registers gr64-gr95 */ out_msg_buf->read_req_msg.code= READ_REQ; out_msg_buf->read_req_msg.length = 4*3; out_msg_buf->read_req_msg.byte_count = 4*32; out_msg_buf->read_req_msg.memory_space = GLOBAL_REG; out_msg_buf->read_req_msg.address = 64; msg_send_serial(out_msg_buf); expect_msg(READ_ACK,in_msg_buf,1); data_p = &(in_msg_buf->read_r_ack_msg.data[0]); for (regno=GR64_REGNUM; regno<GR64_REGNUM+32; regno++) { supply_register (regno, data_p++); }#endif /* GR64_REGNUM *//* Global Registers gr96-gr127 */ out_msg_buf->read_req_msg.code= READ_REQ; out_msg_buf->read_req_msg.length = 4*3; out_msg_buf->read_req_msg.byte_count = 4 * 32; out_msg_buf->read_req_msg.memory_space = GLOBAL_REG; out_msg_buf->read_req_msg.address = 96; msg_send_serial(out_msg_buf); expect_msg(READ_ACK,in_msg_buf,1); data_p = &(in_msg_buf->read_r_ack_msg.data[0]); for (regno=GR96_REGNUM; regno<GR96_REGNUM+32; regno++) { supply_register (regno, data_p++); }/* Local Registers */ out_msg_buf->read_req_msg.byte_count = 4 * (128); out_msg_buf->read_req_msg.memory_space = LOCAL_REG; out_msg_buf->read_req_msg.address = 0; msg_send_serial(out_msg_buf); expect_msg(READ_ACK,in_msg_buf,1); data_p = &(in_msg_buf->read_r_ack_msg.data[0]); for (regno=LR0_REGNUM; regno<LR0_REGNUM+128; regno++) { supply_register (regno, data_p++); }/* Protected Special Registers */ out_msg_buf->read_req_msg.byte_count = 4*15; out_msg_buf->read_req_msg.memory_space = SPECIAL_REG; out_msg_buf->read_req_msg.address = 0; msg_send_serial( out_msg_buf); expect_msg(READ_ACK,in_msg_buf,1); data_p = &(in_msg_buf->read_r_ack_msg.data[0]); for (regno=0; regno<=14; regno++) { supply_register (SR_REGNUM(regno), data_p++); } if (USE_SHADOW_PC) { /* Let regno_to_srnum() handle the register number */ fetch_register(NPC_REGNUM); fetch_register(PC_REGNUM); fetch_register(PC2_REGNUM); }/* Unprotected Special Registers */ out_msg_buf->read_req_msg.byte_count = 4*8; out_msg_buf->read_req_msg.memory_space = SPECIAL_REG; out_msg_buf->read_req_msg.address = 128; msg_send_serial( out_msg_buf); expect_msg(READ_ACK,in_msg_buf,1); data_p = &(in_msg_buf->read_r_ack_msg.data[0]); for (regno=128; regno<=135; regno++) { supply_register (SR_REGNUM(regno), data_p++); } /* There doesn't seem to be any way to get these. */ { int val = -1; supply_register (FPE_REGNUM, &val); supply_register (INTE_REGNUM, &val); supply_register (FPS_REGNUM, &val); supply_register (EXO_REGNUM, &val); }}/****************************************************** REMOTE_STORE_REGISTERS * Store register regno into the target. * If regno==-1 then store all the registers. * Result is 0 for success, -1 for failure. */static voidmm_store_registers (regno)int regno;{ int result; if (regno >= 0) { store_register(regno); return; } result = 0; out_msg_buf->write_r_msg.code= WRITE_REQ;/* Gr1/rsp */ out_msg_buf->write_r_msg.byte_count = 4*1; out_msg_buf->write_r_msg.length = 3*4 + out_msg_buf->write_r_msg.byte_count; out_msg_buf->write_r_msg.memory_space = GLOBAL_REG; out_msg_buf->write_r_msg.address = 1; out_msg_buf->write_r_msg.data[0] = read_register (GR1_REGNUM); msg_send_serial( out_msg_buf); if (!expect_msg(WRITE_ACK,in_msg_buf,1)) { result = -1; }#if defined(GR64_REGNUM)/* Global registers gr64-gr95 */ out_msg_buf->write_r_msg.byte_count = 4* (32); out_msg_buf->write_r_msg.length = 3*4 + out_msg_buf->write_r_msg.byte_count; out_msg_buf->write_r_msg.address = 64; for (regno=GR64_REGNUM ; regno<GR64_REGNUM+32 ; regno++) { out_msg_buf->write_r_msg.data[regno-GR64_REGNUM] = read_register (regno); } msg_send_serial(out_msg_buf); if (!expect_msg(WRITE_ACK,in_msg_buf,1)) { result = -1; }#endif /* GR64_REGNUM *//* Global registers gr96-gr127 */ out_msg_buf->write_r_msg.byte_count = 4* (32); out_msg_buf->write_r_msg.length = 3*4 + out_msg_buf->write_r_msg.byte_count; out_msg_buf->write_r_msg.address = 96; for (regno=GR96_REGNUM ; regno<GR96_REGNUM+32 ; regno++) { out_msg_buf->write_r_msg.data[regno-GR96_REGNUM] = read_register (regno); } msg_send_serial( out_msg_buf); if (!expect_msg(WRITE_ACK,in_msg_buf,1)) { result = -1; }/* Local Registers */ out_msg_buf->write_r_msg.memory_space = LOCAL_REG; out_msg_buf->write_r_msg.byte_count = 4*128; out_msg_buf->write_r_msg.length = 3*4 + out_msg_buf->write_r_msg.byte_count; out_msg_buf->write_r_msg.address = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -