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

📄 remote-mm.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
  for (regno = LR0_REGNUM ; regno < LR0_REGNUM+128 ; regno++)    {      out_msg_buf->write_r_msg.data[regno-LR0_REGNUM] = read_register (regno);    }  msg_send_serial( out_msg_buf);  if (!expect_msg(WRITE_ACK,in_msg_buf,1)) {	result = -1;  }/* Protected Special Registers */   /* VAB through TMR */  out_msg_buf->write_r_msg.memory_space = SPECIAL_REG;  out_msg_buf->write_r_msg.byte_count = 4* 10;  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;  for (regno = 0 ; regno<=9 ; regno++)	/* VAB through TMR */    out_msg_buf->write_r_msg.data[regno] = read_register (SR_REGNUM(regno));  msg_send_serial( out_msg_buf);  if (!expect_msg(WRITE_ACK,in_msg_buf,1)) {	result = -1;  }  /* PC0, PC1, PC2 possibly as shadow registers */  out_msg_buf->write_r_msg.byte_count = 4* 3;  out_msg_buf->write_r_msg.length = 3*4 + out_msg_buf->write_r_msg.byte_count;  for (regno=10 ; regno<=12 ; regno++)	/* LRU and MMU */    out_msg_buf->write_r_msg.data[regno-10] = read_register (SR_REGNUM(regno));  if (USE_SHADOW_PC)     out_msg_buf->write_r_msg.address = 20;	/* SPC0 */  else     out_msg_buf->write_r_msg.address = 10;	/* PC0 */  msg_send_serial( out_msg_buf);  if (!expect_msg(WRITE_ACK,in_msg_buf,1)) {	result = -1;  }  /* LRU and MMU */  out_msg_buf->write_r_msg.byte_count = 4* 2;  out_msg_buf->write_r_msg.length = 3*4 + out_msg_buf->write_r_msg.byte_count;  out_msg_buf->write_r_msg.address = 13;  for (regno=13 ; regno<=14 ; regno++)	/* LRU and MMU */    out_msg_buf->write_r_msg.data[regno-13] = read_register (SR_REGNUM(regno));  msg_send_serial( out_msg_buf);  if (!expect_msg(WRITE_ACK,in_msg_buf,1)) {	result = -1;  }/* Unprotected Special Registers */   out_msg_buf->write_r_msg.byte_count = 4*8;  out_msg_buf->write_r_msg.length = 3*4 + out_msg_buf->write_r_msg.byte_count;  out_msg_buf->write_r_msg.address = 128;  for (regno = 128 ; regno<=135 ; regno++)    out_msg_buf->write_r_msg.data[regno-128] = read_register(SR_REGNUM(regno));  msg_send_serial( out_msg_buf);  if (!expect_msg(WRITE_ACK,in_msg_buf,1)) {	result = -1;  }   registers_changed ();}/*************************************************** REMOTE_PREPARE_TO_STORE *//* Get ready to modify the registers array.  On machines which store   individual registers, this doesn't need to do anything.  On machines   which store all the registers in one fell swoop, this makes sure   that registers contains all the registers from the program being   debugged.  */static voidmm_prepare_to_store (){  /* Do nothing, since we can store individual regs */}/******************************************************* REMOTE_XFER_MEMORY */static CORE_ADDRtranslate_addr(addr)CORE_ADDR addr;{#if defined(KERNEL_DEBUGGING)        /* Check for a virtual address in the kernel */        /* Assume physical address of ublock is in  paddr_u register */	/* FIXME: doesn't work for user virtual addresses */        if (addr >= UVADDR) {                /* PADDR_U register holds the physical address of the ublock */                CORE_ADDR i = (CORE_ADDR)read_register(PADDR_U_REGNUM);                return(i + addr - (CORE_ADDR)UVADDR);        } else {        	return(addr);        }#else        return(addr);#endif}/******************************************************* REMOTE_FILES_INFO */static voidmm_files_info (){  printf ("\tAttached to %s at %d baud and running program %s.\n",          dev_name, baudrate, prog_name);}/************************************************* REMOTE_INSERT_BREAKPOINT */static intmm_insert_breakpoint (addr, contents_cache)     CORE_ADDR addr;     char *contents_cache;{  out_msg_buf->bkpt_set_msg.code = BKPT_SET;  out_msg_buf->bkpt_set_msg.length = 4*4;  out_msg_buf->bkpt_set_msg.memory_space = I_MEM;  out_msg_buf->bkpt_set_msg.bkpt_addr = (ADDR32) addr;  out_msg_buf->bkpt_set_msg.pass_count = 1;  out_msg_buf->bkpt_set_msg.bkpt_type = -1;	/* use illop for 29000 */  msg_send_serial( out_msg_buf);  if (expect_msg(BKPT_SET_ACK,in_msg_buf,1)) {	return 0;		/* Success */  } else {	return 1;		/* Failure */  }}/************************************************* REMOTE_DELETE_BREAKPOINT */static intmm_remove_breakpoint (addr, contents_cache)     CORE_ADDR addr;     char *contents_cache;{  out_msg_buf->bkpt_rm_msg.code = BKPT_RM;  out_msg_buf->bkpt_rm_msg.length = 4*3;  out_msg_buf->bkpt_rm_msg.memory_space = I_MEM;  out_msg_buf->bkpt_rm_msg.bkpt_addr = (ADDR32) addr;  msg_send_serial( out_msg_buf);  if (expect_msg(BKPT_RM_ACK,in_msg_buf,1)) {	return 0;		/* Success */  } else {	return 1;		/* Failure */  }}/******************************************************* REMOTE_KILL */static voidmm_kill(arg,from_tty)char    *arg;int     from_tty;{	char	buf[4];#if defined(KERNEL_DEBUGGING)	/* We don't ever kill the kernel */	if (from_tty) {		printf("Kernel not killed, but left in current state.\n");	 	printf("Use detach to leave kernel running.\n");	}#else  	out_msg_buf->break_msg.code = BREAK;  	out_msg_buf->bkpt_set_msg.length = 4*0;	expect_msg(HALT,in_msg_buf,from_tty);	if (from_tty) {		printf("Target has been stopped.");		printf("Would you like to do a hardware reset (y/n) [n] ");		fgets(buf,3,stdin);			if (buf[0] == 'y') {			out_msg_buf->reset_msg.code = RESET;			out_msg_buf->bkpt_set_msg.length = 4*0;			expect_msg(RESET_ACK,in_msg_buf,from_tty);			printf("Target has been reset.");		}	}	pop_target();#endif }/***************************************************************************//*  * Load a program into the target. */static voidmm_load(arg_string,from_tty)char	*arg_string;int	from_tty;{  dont_repeat ();#if defined(KERNEL_DEBUGGING)  printf("The kernel had better be loaded already!  Loading not done.\n");#else  if (arg_string == 0)    error ("The load command takes a file name");  arg_string = tilde_expand (arg_string);  make_cleanup (free, arg_string);  QUIT;  immediate_quit++;  error("File loading is not yet supported for MiniMon.");  /* FIXME, code to load your file here... */  /* You may need to do an init_target_mm() */  /* init_target_mm(?,?,?,?,?,?,?,?); */  immediate_quit--;  /* symbol_file_add (arg_string, from_tty, text_addr, 0, 0); */#endif}/************************************************ REMOTE_WRITE_INFERIOR_MEMORY** Copy LEN bytes of data from debugger memory at MYADDR   to inferior's memory at MEMADDR.  Returns number of bytes written.  */static intmm_write_inferior_memory (memaddr, myaddr, len)     CORE_ADDR memaddr;     char *myaddr;     int len;{  int i,nwritten;  out_msg_buf->write_req_msg.code= WRITE_REQ;  out_msg_buf->write_req_msg.memory_space = mm_memory_space(memaddr);	  nwritten=0;  while (nwritten < len) {	int num_to_write = len - nwritten;	if (num_to_write > MAXDATA) num_to_write = MAXDATA;  	for (i=0 ; i < num_to_write ; i++)      		out_msg_buf->write_req_msg.data[i] = myaddr[i+nwritten];  	out_msg_buf->write_req_msg.byte_count = num_to_write;  	out_msg_buf->write_req_msg.length = 3*4 + num_to_write;   	out_msg_buf->write_req_msg.address = memaddr + nwritten;  	msg_send_serial(out_msg_buf);  	if (expect_msg(WRITE_ACK,in_msg_buf,1)) {  		nwritten += in_msg_buf->write_ack_msg.byte_count;  	} else {		break;	  	}  }  return(nwritten);}/************************************************* REMOTE_READ_INFERIOR_MEMORY** Read LEN bytes from inferior memory at MEMADDR.  Put the result   at debugger address MYADDR.  Returns number of bytes read.  */static intmm_read_inferior_memory(memaddr, myaddr, len)     CORE_ADDR memaddr;     char *myaddr;     int len;{  int i,nread;  out_msg_buf->read_req_msg.code= READ_REQ;  out_msg_buf->read_req_msg.memory_space = mm_memory_space(memaddr);  nread=0;  while (nread < len) {	int num_to_read = (len - nread);	if (num_to_read > MAXDATA) num_to_read = MAXDATA;  	out_msg_buf->read_req_msg.byte_count = num_to_read;   	out_msg_buf->read_req_msg.length = 3*4 + num_to_read;   	out_msg_buf->read_req_msg.address = memaddr + nread;  	msg_send_serial(out_msg_buf);  	if (expect_msg(READ_ACK,in_msg_buf,1)) {  		for (i=0 ; i<in_msg_buf->read_ack_msg.byte_count ; i++)      			myaddr[i+nread] = in_msg_buf->read_ack_msg.data[i];  		nread += in_msg_buf->read_ack_msg.byte_count;  	} else {		break;	  	}  }  return(nread);}/* FIXME!  Merge these two.  */static intmm_xfer_inferior_memory (memaddr, myaddr, len, write)     CORE_ADDR memaddr;     char *myaddr;     int len;     int write;{  memaddr = translate_addr(memaddr);  if (write)    return mm_write_inferior_memory (memaddr, myaddr, len);  else    return mm_read_inferior_memory (memaddr, myaddr, len);}/********************************************************** MSG_SEND_SERIAL** This function is used to send a message over the** serial line.**** If the message is successfully sent, a zero is** returned.  If the message was not sendable, a -1** is returned.  This function blocks.  That is, it** does not return until the message is completely** sent, or until an error is encountered.***/intmsg_send_serial(msg_ptr)   union  msg_t  *msg_ptr;{   INT32  message_size;   int    byte_count;   int    result;   char   c;   /* Send message header */   byte_count = 0;   message_size = msg_ptr->generic_msg.length + (2 * sizeof(INT32));   do {      c = *((char *)msg_ptr+byte_count);      result = write(mm_desc, &c, 1);      if (result == 1) {         byte_count = byte_count + 1;      }   } while ((byte_count < message_size) );   return(0);}  /* end msg_send_serial() *//********************************************************** MSG_RECV_SERIAL** This function is used to receive a message over a** serial line.**** If the message is waiting in the buffer, a zero is** returned and the buffer pointed to by msg_ptr is filled** in.  If no message was available, a -1 is returned.** If timeout==0, wait indefinetly for a character.***/intmsg_recv_serial(msg_ptr)union  msg_t  *msg_ptr;{   static INT32  length=0;   static INT32  byte_count=0;   int    result;   char   c;  if(msg_ptr == 0)		/* re-sync request */  {  length=0;     byte_count=0;#ifdef HAVE_TERMIO     /* The timeout here is the prevailing timeout set with VTIME */     ->"timeout==0 semantics not supported"     read(mm_desc, in_buf, BUFER_SIZE);#else     alarm (1);     read(mm_desc, in_buf, BUFER_SIZE);     alarm (0);#endif     return(0);  }   /* Receive message */#ifdef HAVE_TERMIO/* Timeout==0, help support the mm_wait() routine */   ->"timeout==0 semantics not supported (and its nice if they are)"   result = read(mm_desc, &c, 1);#else  alarm(timeout);  result = read(mm_desc, &c, 1);  alarm (0);#endif  if ( result < 0) {      if (errno == EINTR) {      	error ("Timeout reading from remote system.");      } else	perror_with_name ("remote");  } else if (result == 1) {      *((char *)msg_ptr+byte_count) = c;      byte_count = byte_count + 1;  }   /* Message header received.  Save message length. */  if (byte_count == (2 * sizeof(INT32)))      length = msg_ptr->generic_msg.length;  if (byte_count >= (length + (2 * sizeof(INT32)))) {      /* Message received */      byte_count = 0;      return(0);  } else      return (-1);}  /* end msg_recv_serial() *//********************************************************************* KBD_RAW** This function is used to put the keyboard in "raw"** mode for BSD Unix.  The original status is saved** so that it may be restored later.*/TERMINAL kbd_tbuf;intkbd_raw() {   int    result;   TERMINAL tbuf;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -