⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remote-mm.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
  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 + -