X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fremote-mm.c;h=101d96438bd3ad3ca83146b967039c441266f6ea;hb=e1703d1f535a7320b1043c8330f17728087e4afd;hp=fb9060b015a450e6f886eb005b19a7b2dfdf46f1;hpb=5ee4e16ca776d5dd8c3cdb63489c4da773fd9f5c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-mm.c b/gdb/remote-mm.c index fb9060b015..101d96438b 100644 --- a/gdb/remote-mm.c +++ b/gdb/remote-mm.c @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This is like remote.c but ecpects MiniMON to be running on the Am29000 target hardware. @@ -37,7 +37,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include -#include +#include "gdb_string.h" #include "terminal.h" #include "minimon.h" #include "target.h" @@ -45,15 +45,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Offset of member MEMBER in a struct of type TYPE. */ #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER) -/* #define DEBUG 1 /* */ -#ifdef DEBUG -# define DENTER(NAME) (printf("Entering %s\n",NAME), fflush(stdout)) -# define DEXIT(NAME) (printf("Exiting %s\n",NAME), fflush(stdout)) -#else -# define DENTER(NAME) -# define DEXIT(NAME) -#endif - #define DRAIN_INPUT() (msg_recv_serial((union msg_t*)0)) extern int stop_soon_quietly; /* for wait_for_inferior */ @@ -71,18 +62,10 @@ static int expect_msg(); static void init_target_mm(); static int mm_memory_space(); -/* - * Processor types. - */ -#define TYPE_UNKNOWN 0 -#define TYPE_A29000 1 -#define TYPE_A29030 2 -#define TYPE_A29050 3 -static char *processor_name[] = { "Unknown", "A29000", "A29030", "A29050" }; -static int processor_type=TYPE_UNKNOWN; #define FREEZE_MODE (read_register(CPS_REGNUM) && 0x400) -#define USE_SHADOW_PC ((processor_type == TYPE_A29050) && FREEZE_MODE) +#define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE) +/* FIXME: Replace with `set remotedebug'. */ #define LLOG_FILE "minimon.log" #if defined (LOG_FILE) FILE *log_file; @@ -175,8 +158,6 @@ mm_create_inferior (execfile, args, env) char *token[MAX_TOKENS]; char cmd_line[BUFFER_SIZE]; - DENTER("mm_create_inferior()"); - if (args && *args) error ("Can't pass arguments to remote mm process (yet)."); @@ -196,26 +177,18 @@ mm_create_inferior (execfile, args, env) Assuming you are at NYU debuging a kernel, i.e., no need to download.\n\n"); /* We will get a task spawn event immediately. */ -#ifdef NOTDEF /* start_remote() now does a wait without a resume - so don't use it*/ - start_remote (); -#else init_wait_for_inferior (); clear_proceed_status (); stop_soon_quietly = 1; - proceed(-1,-1,0); + proceed (-1, TARGET_SIGNAL_DEFAULT, 0); normal_stop (); -#endif - DEXIT("mm_create_inferior()"); } /**************************************************** REMOTE_MOURN_INFERIOR */ static void mm_mourn() { - DENTER("mm_mourn()"); pop_target (); /* Pop back to no-child state */ generic_mourn_inferior (); - DEXIT("mm_mourn()"); } /********************************************************************** damn_b @@ -279,8 +252,6 @@ mm_open (name, from_tty) unsigned int prl; char *p; - DENTER("mm_open()"); - /* Find the first whitespace character, it separates dev_name from prog_name. */ for (p = name; @@ -289,7 +260,7 @@ mm_open (name, from_tty) if (p == 0 || *p == '\0') erroid: error ("Usage : [progname]"); - dev_name = (char*)malloc (p - name + 1); + dev_name = (char*)xmalloc (p - name + 1); strncpy (dev_name, name, p - name); dev_name[p - name] = '\0'; @@ -365,30 +336,15 @@ erroid: expect_msg(CONFIG,in_msg_buf,1); - /* Determine the processor revision level */ - /* FIXME: this code is the same as in remote-adapt.c */ - prl = (unsigned int)read_register(CFG_REGNUM) >> 24; - if (prl == 0x03) { - processor_type = TYPE_A29000; - } else if ((prl&0xf0) == 0x40) { /* 29030 = 0x4* */ - processor_type = TYPE_A29030; - fprintf_filtered(stderr,"WARNING: debugging of A29030 not tested.\n"); - } else if ((prl&0xf0) == 0x20) { /* 29050 = 0x2* */ - processor_type = TYPE_A29050; - fprintf_filtered(stderr,"WARNING: debugging of A29050 not tested.\n"); - } else { - processor_type = TYPE_UNKNOWN; - fprintf_filtered(stderr,"WARNING: processor type unknown.\n"); - } + a29k_get_processor_type (); /* Print out some stuff, letting the user now what's going on */ - printf_filtered("Remote debugging on an %s connect to MiniMon via %s.\n", - processor_name[processor_type],dev_name); + printf_filtered("Connected to MiniMon via %s.\n", dev_name); /* FIXME: can this restriction be removed? */ printf_filtered("Remote debugging using virtual addresses works only\n"); printf_filtered("\twhen virtual addresses map 1:1 to physical addresses.\n") ; - if (processor_type != TYPE_A29050) { + if (processor_type != a29k_freeze_mode) { fprintf_filtered(stderr, "Freeze-mode debugging not available, and can only be done on an A29050.\n"); } @@ -431,8 +387,6 @@ erroid: out_msg_buf->go_msg.length = 0; msg_send_serial(out_msg_buf); /* No message to expect after a GO */ - - DEXIT("mm_open()"); } /**************************************************************** REMOTE_CLOSE @@ -443,8 +397,6 @@ static void mm_close (quitting) /*FIXME: how is quitting used */ int quitting; { - DENTER("mm_close()"); - if (mm_desc < 0) error ("Can't close remote connection: not debugging remotely."); @@ -470,9 +422,6 @@ mm_close (quitting) /*FIXME: how is quitting used */ #endif printf ("Ending remote debugging\n"); - - DEXIT("mm_close()"); - } /************************************************************* REMOTE_ATACH */ @@ -485,17 +434,12 @@ mm_attach (args, from_tty) int from_tty; { - DENTER("mm_attach()"); - if (!mm_stream) error ("MiniMon not opened yet, use the 'target minimon' command.\n"); - dont_repeat(); - 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. @@ -509,16 +453,6 @@ mm_attach (args, from_tty) out_msg_buf->break_msg.code = BREAK; out_msg_buf->break_msg.length = 0; msg_send_serial(out_msg_buf); - - mark_breakpoints_out (); - init_wait_for_inferior (); - clear_proceed_status (); - stop_soon_quietly = 1; - wait_for_inferior (); - stop_soon_quietly = 0; - normal_stop (); - - DEXIT("mm_attach()"); } /********************************************************** REMOTE_DETACH */ /* Terminate the open connection to the remote debugger. @@ -529,13 +463,11 @@ mm_detach (args,from_tty) char *args; int from_tty; { - DENTER("mm_dettach()"); 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 */ - DEXIT("mm_dettach()"); } @@ -543,13 +475,12 @@ mm_detach (args,from_tty) ** Tell the remote machine to resume. */ static void -mm_resume (step, sig) - int step, sig; +mm_resume (pid, step, sig) + int pid, step; + enum target_signal sig; { - DENTER("mm_resume()"); - - if (sig) - error ("Can't send signals to a remote MiniMon system."); + if (sig != TARGET_SIGNAL_0) + warning ("Can't send signals to a remote MiniMon system."); if (step) { out_msg_buf->step_msg.code= STEP; @@ -561,8 +492,6 @@ mm_resume (step, sig) out_msg_buf->go_msg.length = 0; msg_send_serial(out_msg_buf); } - - DEXIT("mm_resume()"); } /***************************************************************** REMOTE_WAIT @@ -571,15 +500,14 @@ mm_resume (step, sig) static int mm_wait (status) - WAITTYPE *status; + struct target_waitstatus *status; { int i, result; int old_timeout = timeout; int old_immediate_quit = immediate_quit; - DENTER("mm_wait()"); - WSETEXIT ((*status), 0); - + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; /* wait for message to arrive. It should be: - A HIF service request. @@ -614,7 +542,7 @@ mm_wait (status) 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); + gdb_flush(stdout); /* Send CHANNEL1_ACK message */ out_msg_buf->channel1_ack_msg.code = CHANNEL1_ACK; out_msg_buf->channel1_ack_msg.length = 0; @@ -632,63 +560,81 @@ halted: 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); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; } 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); - } + { + printf("Am290*0 received vector number %d\n", + in_msg_buf->halt_msg.trap_number); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_BUS; + } 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); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_FPE; } 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); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_ILL; } 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); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_SEGV; } 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); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_ILL; } 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); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_ALRM; } else if (in_msg_buf->halt_msg.trap_number== 15) - WSETSTOP ((*status), SIGTRAP); + { + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; + } 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); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_INT; } 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); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_ILL; } /* BREAK message was sent */ else if (in_msg_buf->halt_msg.trap_number== 75) - WSETSTOP ((*status), SIGTRAP); + { + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; + } else exit: - WSETEXIT ((*status), 0); + { + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; + } timeout = old_timeout; /* Restore original timeout value */ immediate_quit = old_immediate_quit; - DEXIT("mm_wait()"); return 0; } @@ -707,8 +653,6 @@ int regno; return; } - DENTER("mm_fetch_registers()"); - /* Gr1/rsp */ out_msg_buf->read_req_msg.byte_count = 4*1; out_msg_buf->read_req_msg.memory_space = GLOBAL_REG; @@ -797,8 +741,6 @@ int regno; supply_register (FPS_REGNUM, &val); supply_register (EXO_REGNUM, &val); } - - DEXIT("mm_fetch_registerS()"); } @@ -819,7 +761,6 @@ int regno; return; } - DENTER("mm_store_registers()"); result = 0; out_msg_buf->write_r_msg.code= WRITE_REQ; @@ -930,8 +871,6 @@ int regno; } registers_changed (); - DEXIT("mm_store_registers()"); - /* FIXME return result; it is ignored by caller. */ } /*************************************************** REMOTE_PREPARE_TO_STORE */ @@ -982,7 +921,6 @@ mm_insert_breakpoint (addr, contents_cache) CORE_ADDR addr; char *contents_cache; { - DENTER("mm_insert_breakpoint()"); 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; @@ -991,10 +929,8 @@ mm_insert_breakpoint (addr, contents_cache) 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)) { - DEXIT("mm_insert_breakpoint() success"); return 0; /* Success */ } else { - DEXIT("mm_insert_breakpoint() failure"); return 1; /* Failure */ } } @@ -1005,17 +941,14 @@ mm_remove_breakpoint (addr, contents_cache) CORE_ADDR addr; char *contents_cache; { - DENTER("mm_remove_breakpoint()"); 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)) { - DEXIT("mm_remove_breakpoint()"); return 0; /* Success */ } else { - DEXIT("mm_remove_breakpoint()"); return 1; /* Failure */ } } @@ -1029,7 +962,6 @@ int from_tty; { char buf[4]; - DENTER("mm_kill()"); #if defined(KERNEL_DEBUGGING) /* We don't ever kill the kernel */ if (from_tty) { @@ -1053,7 +985,6 @@ int from_tty; } pop_target(); #endif - DEXIT("mm_kill()"); } @@ -1100,7 +1031,6 @@ mm_write_inferior_memory (memaddr, myaddr, len) { int i,nwritten; - /* DENTER("mm_write_inferior_memory()"); */ out_msg_buf->write_req_msg.code= WRITE_REQ; out_msg_buf->write_req_msg.memory_space = mm_memory_space(memaddr); @@ -1121,7 +1051,6 @@ mm_write_inferior_memory (memaddr, myaddr, len) break; } } - /* DEXIT("mm_write_inferior_memory()"); */ return(nwritten); } @@ -1136,7 +1065,6 @@ mm_read_inferior_memory(memaddr, myaddr, len) { int i,nread; - /* DENTER("mm_read_inferior_memory()"); */ out_msg_buf->read_req_msg.code= READ_REQ; out_msg_buf->read_req_msg.memory_space = mm_memory_space(memaddr); @@ -1371,7 +1299,6 @@ fetch_register (regno) int regno; { int result; - DENTER("mm_fetch_register()"); 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; @@ -1412,7 +1339,6 @@ fetch_register (regno) } else { result = -1; } - DEXIT("mm_fetch_register()"); return result; } /*****************************************************************************/ @@ -1425,7 +1351,6 @@ store_register (regno) { int result; - DENTER("store_register()"); out_msg_buf->write_req_msg.code= WRITE_REQ; out_msg_buf->write_req_msg.length = 4*4; out_msg_buf->write_req_msg.byte_count = 4; @@ -1472,7 +1397,6 @@ store_register (regno) } else { result = -1; } - DEXIT("store_register()"); return result; } /****************************************************************************/ @@ -1612,13 +1536,11 @@ INT32 msgcode; /* Msg code we expect */ union msg_t *msg_buf; /* Where to put the message received */ int from_tty; /* Print message on error if non-zero */ { - /* DENTER("expect_msg()"); */ int retries=0; while(msg_recv_serial(msg_buf) && (retries++= MAX_RETRIES) { printf("Expected msg %s, ",msg_str(msgcode)); printf("no message received!\n"); - /* DEXIT("expect_msg() failure"); */ return(0); /* Failure */ } @@ -1629,10 +1551,8 @@ int from_tty; /* Print message on error if non-zero */ if (msg_buf->generic_msg.code == ERROR) printf("%s\n",error_msg_str(msg_buf->error_msg.error_code)); } - /* DEXIT("expect_msg() failure"); */ return(0); /* Failure */ } - /* DEXIT("expect_msg() success"); */ return(1); /* Success */ } /****************************************************************************/ @@ -1684,6 +1604,8 @@ struct target_ops mm_ops = { mm_create_inferior, /* create_inferior */ mm_mourn, /* mourn_inferior FIXME */ 0, /* can_run */ + 0, /* notice_signals */ + 0, /* to_stop */ process_stratum, 0, /* next */ 1, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */ 0,0, /* sections, sections_end */