📄 remote-mm.c
字号:
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 + -