X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fremote-es.c;h=6423fe2ac36a53ff07ba67a3b02cf46e0f484d11;hb=39f770628a4eaf018fec8d55684bf2ec16ada9cc;hp=5663191ce1e2671c96be137f56379312a1453f29;hpb=72ec28b8afa357cdde70c612b4e0e9f37a34f8e4;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-es.c b/gdb/remote-es.c index 5663191ce1..6423fe2ac3 100644 --- a/gdb/remote-es.c +++ b/gdb/remote-es.c @@ -1,5 +1,6 @@ /* Memory-access and commands for remote es1800 processes, for GDB. - Copyright (C) 1988, 1992 Free Software Foundation, Inc. + Copyright 1988, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. This file is added to GDB to make it possible to do debugging via an ES-1800 emulator. The code was originally written by Johan Holmberg @@ -104,140 +105,102 @@ #include "frame.h" #include "inferior.h" #include "target.h" -#include "gdb_wait.h" #include "command.h" +#include "symfile.h" #include "remote-utils.h" #include "gdbcore.h" #include "serial.h" +#include "regcache.h" /* Prototypes for local functions */ -static void -es1800_child_detach PARAMS ((char *, int)); +static void es1800_child_detach (char *, int); -static void -es1800_child_open PARAMS ((char *, int)); +static void es1800_child_open (char *, int); -static void -es1800_transparent PARAMS ((char *, int)); +static void es1800_transparent (char *, int); -static void -es1800_create_inferior PARAMS ((char *, char *, char **)); +static void es1800_create_inferior (char *, char *, char **); -static void -es1800_load PARAMS ((char *, int)); +static void es1800_load (char *, int); -static void -es1800_kill PARAMS ((void)); +static void es1800_kill (void); -static int -verify_break PARAMS ((int)); +static int verify_break (int); -static int -es1800_remove_breakpoint PARAMS ((CORE_ADDR, char *)); +static int es1800_remove_breakpoint (CORE_ADDR, char *); -static int -es1800_insert_breakpoint PARAMS ((CORE_ADDR, char *)); +static int es1800_insert_breakpoint (CORE_ADDR, char *); -static void -es1800_files_info PARAMS ((struct target_ops *)); +static void es1800_files_info (struct target_ops *); static int -es1800_xfer_inferior_memory PARAMS ((CORE_ADDR, char *, int, int, - struct target_ops *)); +es1800_xfer_inferior_memory (CORE_ADDR, char *, int, int, + struct mem_attrib *, struct target_ops *); -static void -es1800_prepare_to_store PARAMS ((void)); +static void es1800_prepare_to_store (void); -static int es1800_wait PARAMS ((int, struct target_waitstatus *)); +static ptid_t es1800_wait (ptid_t, struct target_waitstatus *); -static void es1800_resume PARAMS ((int, int, enum target_signal)); +static void es1800_resume (ptid_t, int, enum target_signal); -static void -es1800_detach PARAMS ((char *, int)); +static void es1800_detach (char *, int); -static void -es1800_attach PARAMS ((char *, int)); +static void es1800_attach (char *, int); -static int -damn_b PARAMS ((char *)); +static int damn_b (char *); -static void -es1800_open PARAMS ((char *, int)); +static void es1800_open (char *, int); -static void -es1800_timer PARAMS ((void)); +static void es1800_timer (void); -static void -es1800_reset PARAMS ((char *)); +static void es1800_reset (char *); -static void -es1800_request_quit PARAMS ((void)); +static void es1800_request_quit (void); -static int -readchar PARAMS ((void)); +static int readchar (void); -static void -expect PARAMS ((char *, int)); +static void expect (char *, int); -static void -expect_prompt PARAMS ((void)); +static void expect_prompt (void); -static void -download PARAMS ((FILE *, int, int)); +static void download (FILE *, int, int); #if 0 -static void -bfd_copy PARAMS ((bfd *, bfd *)); +static void bfd_copy (bfd *, bfd *); #endif -static void -get_break_addr PARAMS ((int, CORE_ADDR *)); +static void get_break_addr (int, CORE_ADDR *); -static int -fromhex PARAMS ((int)); +static int fromhex (int); -static int -tohex PARAMS ((int)); +static int tohex (int); -static void -es1800_close PARAMS ((int)); +static void es1800_close (int); -static void -es1800_fetch_registers PARAMS ((void)); +static void es1800_fetch_registers (void); -static void -es1800_fetch_register PARAMS ((int)); +static void es1800_fetch_register (int); -static void -es1800_store_register PARAMS ((int)); +static void es1800_store_register (int); -static void -es1800_read_bytes PARAMS ((CORE_ADDR, char *, int)); +static void es1800_read_bytes (CORE_ADDR, char *, int); -static void -es1800_write_bytes PARAMS ((CORE_ADDR, char *, int)); +static void es1800_write_bytes (CORE_ADDR, char *, int); -static void -send_with_reply PARAMS ((char *, char *, int)); +static void send_with_reply (char *, char *, int); -static void -send_command PARAMS ((char *)); +static void send_command (char *); -static void -send PARAMS ((char *)); +static void send (char *); -static void -getmessage PARAMS ((char *, int)); +static void getmessage (char *, int); -static void -es1800_mourn_inferior PARAMS ((void)); +static void es1800_mourn_inferior (void); -static void -es1800_create_break_insn PARAMS ((char *, int)); +static void es1800_create_break_insn (char *, int); -static void -es1800_init_break PARAMS ((char *, int)); +static void es1800_init_break (char *, int); /* Local variables */ @@ -288,7 +251,7 @@ static jmp_buf interrupt; Rely on global variables: old_sigint(), interrupt */ static void -es1800_request_quit () +es1800_request_quit (void) { /* restore original signalhandler */ signal (SIGINT, old_sigint); @@ -301,8 +264,7 @@ es1800_request_quit () quit - return to '(esgdb)' prompt or continue */ static void -es1800_reset (quit) - char *quit; +es1800_reset (char *quit) { char buf[80]; @@ -329,9 +291,7 @@ es1800_reset (quit) from_tty - says whether to be verbose or not */ static void -es1800_open (name, from_tty) - char *name; - int from_tty; +es1800_open (char *name, int from_tty) { char buf[PBUFSIZ]; char *p; @@ -462,8 +422,7 @@ es1800_open (name, from_tty) quitting - are we quitting gdb now? */ static void -es1800_close (quitting) - int quitting; +es1800_close (int quitting) { if (es1800_desc != NULL) { @@ -476,7 +435,7 @@ es1800_close (quitting) } if (savename != NULL) { - free (savename); + xfree (savename); } savename = NULL; @@ -504,9 +463,7 @@ es1800_close (quitting) from_tty - says whether to be verbose or not */ static void -es1800_attach (args, from_tty) - char *args; - int from_tty; +es1800_attach (char *args, int from_tty) { error ("Cannot attach to pid %s, this feature is not implemented yet.", args); @@ -524,9 +481,7 @@ es1800_attach (args, from_tty) from_tty - says whether to be verbose or not */ static void -es1800_detach (args, from_tty) - char *args; - int from_tty; +es1800_detach (char *args, int from_tty) { if (args) { @@ -545,10 +500,7 @@ es1800_detach (args, from_tty) siggnal - the signal value to be given to the target (0 = no signal) */ static void -es1800_resume (pid, step, siggnal) - int pid; - int step; - enum target_signal siggnal; +es1800_resume (ptid_t ptid, int step, enum target_signal siggnal) { char buf[PBUFSIZ]; @@ -571,10 +523,8 @@ es1800_resume (pid, step, siggnal) storing status in STATUS just as `wait' would. status - */ -static int -es1800_wait (pid, status) - int pid; - struct target_waitstatus *status; +static ptid_t +es1800_wait (ptid_t ptid, struct target_waitstatus *status) { unsigned char buf[PBUFSIZ]; int old_timeout = timeout; @@ -639,7 +589,7 @@ es1800_wait (pid, status) } signal (SIGINT, old_sigint); timeout = old_timeout; - return (0); + return inferior_ptid; } @@ -647,8 +597,7 @@ es1800_wait (pid, status) regno - the register to be fetched (fetch all registers if -1) */ static void -es1800_fetch_register (regno) - int regno; +es1800_fetch_register (int regno) { char buf[PBUFSIZ]; int k; @@ -685,7 +634,7 @@ es1800_fetch_register (regno) Always fetches all registers. */ static void -es1800_fetch_registers () +es1800_fetch_registers (void) { char buf[PBUFSIZ]; char SR_buf[PBUFSIZ]; @@ -857,8 +806,7 @@ es1800_fetch_registers () FIXME: Return errno value. */ static void -es1800_store_register (regno) - int regno; +es1800_store_register (int regno) { static char regtab[18][4] = @@ -956,7 +904,7 @@ es1800_store_register (regno) /* Prepare to store registers. */ static void -es1800_prepare_to_store () +es1800_prepare_to_store (void) { /* Do nothing, since we can store individual regs */ } @@ -964,8 +912,7 @@ es1800_prepare_to_store () /* Convert hex digit A to a number. */ static int -fromhex (a) - int a; +fromhex (int a) { if (a >= '0' && a <= '9') { @@ -990,8 +937,7 @@ fromhex (a) /* Convert number NIB to a hex digit. */ static int -tohex (nib) - int nib; +tohex (int nib) { if (nib < 10) { @@ -1010,15 +956,14 @@ tohex (nib) memaddr - the target's address myaddr - gdb's address len - number of bytes - write - write if != 0 otherwise read */ + write - write if != 0 otherwise read + tops - unused */ static int -es1800_xfer_inferior_memory (memaddr, myaddr, len, write, tops) - CORE_ADDR memaddr; - char *myaddr; - int len; - int write; - struct target_ops *tops; /* Unused */ +es1800_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, + int write, + struct mem_attrib *attrib ATTRIBUTE_UNUSED, + struct target_ops *target ATTRIBUTE_UNUSED) { int origlen = len; int xfersize; @@ -1053,10 +998,7 @@ es1800_xfer_inferior_memory (memaddr, myaddr, len, write, tops) len - number of bytes */ static void -es1800_write_bytes (memaddr, myaddr, len) - CORE_ADDR memaddr; - char *myaddr; - int len; +es1800_write_bytes (CORE_ADDR memaddr, char *myaddr, int len) { char buf[PBUFSIZ]; int i; @@ -1079,10 +1021,7 @@ es1800_write_bytes (memaddr, myaddr, len) len - number of bytes */ static void -es1800_read_bytes (memaddr, myaddr, len) - CORE_ADDR memaddr; - char *myaddr; - int len; +es1800_read_bytes (CORE_ADDR memaddr, char *myaddr, int len) { static int DB_tab[16] = {8, 11, 14, 17, 20, 23, 26, 29, 34, 37, 40, 43, 46, 49, 52, 55}; @@ -1094,7 +1033,7 @@ es1800_read_bytes (memaddr, myaddr, len) if (len > PBUFSIZ / 2 - 1) { - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); } if (len == 1) /* The emulator does not like expressions like: */ @@ -1127,11 +1066,10 @@ es1800_read_bytes (memaddr, myaddr, len) } } -/* Information about the current target */ +/* Display information about the current target. TOPS is unused. */ static void -es1800_files_info (tops) - struct target_ops *tops; /* Unused */ +es1800_files_info (struct target_ops *tops) { printf ("ES1800 Attached to %s at %d baud in %s mode\n", savename, 19200, MODE); @@ -1150,9 +1088,7 @@ es1800_files_info (tops) the target_arch transfer vector, if we ever have one... */ static int -es1800_insert_breakpoint (addr, contents_cache) - CORE_ADDR addr; - char *contents_cache; +es1800_insert_breakpoint (CORE_ADDR addr, char *contents_cache) { int val; @@ -1176,9 +1112,7 @@ es1800_insert_breakpoint (addr, contents_cache) BREAKPOINT bytes. */ static int -es1800_remove_breakpoint (addr, contents_cache) - CORE_ADDR addr; - char *contents_cache; +es1800_remove_breakpoint (CORE_ADDR addr, char *contents_cache) { return (target_write_memory (addr, contents_cache, @@ -1189,9 +1123,7 @@ es1800_remove_breakpoint (addr, contents_cache) Primitive datastructures containing the es1800 breakpoint instruction */ static void -es1800_create_break_insn (ins, vec) - char *ins; - int vec; +es1800_create_break_insn (char *ins, int vec) { if (vec == 15) { @@ -1207,8 +1139,7 @@ es1800_create_break_insn (ins, vec) vec - trap vector used for breakpoints */ static int -verify_break (vec) - int vec; +verify_break (int vec) { CORE_ADDR memaddress; char buf[8]; @@ -1224,21 +1155,19 @@ verify_break (vec) { memory_error (status, memaddress); } - return (STRCMP (instr, buf)); + return (strcmp (instr, buf)); } return (-1); } /* get_break_addr () - find address of breakpint routine + find address of breakpoint routine vec - trap vector used for breakpoints addrp - store the address here */ static void -get_break_addr (vec, addrp) - int vec; - CORE_ADDR *addrp; +get_break_addr (int vec, CORE_ADDR *addrp) { CORE_ADDR memaddress = 0; int status; @@ -1275,11 +1204,11 @@ get_break_addr (vec, addrp) /* Kill an inferior process */ static void -es1800_kill () +es1800_kill (void) { - if (inferior_pid != 0) + if (!ptid_equal (inferior_ptid, null_ptid)) { - inferior_pid = 0; + inferior_ptid = null_ptid; es1800_mourn_inferior (); } } @@ -1294,9 +1223,7 @@ es1800_kill () FIXME Uses emulator overlay memory for trap routine */ static void -es1800_load (filename, from_tty) - char *filename; - int from_tty; +es1800_load (char *filename, int from_tty) { FILE *instream; @@ -1312,7 +1239,7 @@ es1800_load (filename, from_tty) } filename = tilde_expand (filename); - make_cleanup (free, filename); + make_cleanup (xfree, filename); switch (es1800_load_format) { @@ -1346,7 +1273,7 @@ es1800_load (filename, from_tty) } breakpoint_init_inferior (); - inferior_pid = 0; + inferior_ptid = null_ptid; if (from_tty) { printf ("Downloading \"%s\" to the ES 1800\n", filename); @@ -1393,7 +1320,7 @@ es1800_load (filename, from_tty) system (buf); } - symbol_file_command (filename, from_tty); /* reading symbol table */ + symbol_file_add_main (filename, from_tty); /* reading symbol table */ immediate_quit--; } @@ -1402,9 +1329,7 @@ es1800_load (filename, from_tty) #define NUMCPYBYTES 20 static void -bfd_copy (from_bfd, to_bfd) - bfd *from_bfd; - bfd *to_bfd; +bfd_copy (bfd *from_bfd, bfd *to_bfd) { asection *p, *new; int i; @@ -1449,17 +1374,14 @@ bfd_copy (from_bfd, to_bfd) #endif -/* Start an process on the es1800 and set inferior_pid to the new +/* Start an process on the es1800 and set inferior_ptid to the new process' pid. execfile - the file to run args - arguments passed to the program env - the environment vector to pass */ static void -es1800_create_inferior (execfile, args, env) - char *execfile; - char *args; - char **env; +es1800_create_inferior (char *execfile, char *args, char **env) { int entry_pt; int pid; @@ -1505,7 +1427,7 @@ es1800_create_inferior (execfile, args, env) /* The "process" (board) is already stopped awaiting our commands, and the program is already downloaded. We just set its PC and go. */ - inferior_pid = pid; /* Needed for wait_for_inferior below */ + inferior_ptid = pid_to_ptid (pid); /* Needed for wait_for_inferior below */ clear_proceed_status (); @@ -1535,7 +1457,7 @@ es1800_create_inferior (execfile, args, env) /* The process has died, clean up. */ static void -es1800_mourn_inferior () +es1800_mourn_inferior (void) { remove_breakpoints (); unpush_target (&es1800_child_ops); @@ -1551,9 +1473,7 @@ es1800_mourn_inferior () read until string is found (== 0) */ static void -expect (string, nowait) - char *string; - int nowait; +expect (char *string, int nowait) { char c; char *p = string; @@ -1591,7 +1511,7 @@ expect (string, nowait) /* Keep discarding input until we see the prompt. */ static void -expect_prompt () +expect_prompt (void) { expect (">", 0); } @@ -1604,7 +1524,7 @@ expect_prompt () /* read from stdin */ static int -readchar () +readchar (void) { char buf[1]; @@ -1625,7 +1545,7 @@ readchar () timeout stuff. */ static int -readchar () +readchar (void) { int ch; @@ -1656,9 +1576,7 @@ readchar () len - size of buf */ static void -send_with_reply (string, buf, len) - char *string, *buf; - int len; +send_with_reply (char *string, char *buf, int len) { send (string); SERIAL_WRITE (es1800_desc, "\r", 1); @@ -1677,8 +1595,7 @@ send_with_reply (string, buf, len) string - the es1800 command */ static void -send_command (string) - char *string; +send_command (char *string) { send (string); SERIAL_WRITE (es1800_desc, "\r", 1); @@ -1694,8 +1611,7 @@ send_command (string) string - the es1800 command */ static void -send (string) - char *string; +send (char *string) { if (kiodebug) { @@ -1710,9 +1626,7 @@ send (string) len - size of buf */ static void -getmessage (buf, len) - char *buf; - int len; +getmessage (char *buf, int len) { char *bp; int c; @@ -1753,10 +1667,7 @@ getmessage (buf, len) } static void -download (instream, from_tty, format) - FILE *instream; - int from_tty; - int format; +download (FILE *instream, int from_tty, int format) { char c; char buf[160]; @@ -1812,9 +1723,7 @@ download (instream, from_tty, format) /*ARGSUSED */ static void -es1800_transparent (args, from_tty) - char *args; - int from_tty; +es1800_transparent (char *args, int from_tty) { int console; struct sgttyb modebl; @@ -1970,9 +1879,7 @@ es1800_transparent (args, from_tty) #endif /* PROVIDE_TRANSPARENT */ static void -es1800_init_break (args, from_tty) - char *args; - int from_tty; +es1800_init_break (char *args, int from_tty) { CORE_ADDR memaddress = 0; char buf[PBUFSIZ]; @@ -2038,17 +1945,13 @@ es1800_init_break (args, from_tty) } static void -es1800_child_open (arg, from_tty) - char *arg; - int from_tty; +es1800_child_open (char *arg, int from_tty) { error ("Use the \"run\" command to start a child process."); } static void -es1800_child_detach (args, from_tty) - char *args; - int from_tty; +es1800_child_detach (char *args, int from_tty) { if (args) { @@ -2058,7 +1961,7 @@ es1800_child_detach (args, from_tty) pop_target (); if (from_tty) { - printf ("Ending debugging the process %d.\n", inferior_pid); + printf ("Ending debugging the process %d.\n", PIDGET (inferior_ptid)); } } @@ -2123,7 +2026,6 @@ Specify the serial device it is connected to (e.g. /dev/ttya)."; es1800_ops.to_thread_alive = 0; es1800_ops.to_stop = 0; es1800_ops.to_pid_to_exec_file = NULL; - es1800_ops.to_core_file_to_sym_file = NULL; es1800_ops.to_stratum = core_stratum; es1800_ops.DONT_USE = 0; es1800_ops.to_has_all_memory = 0; @@ -2196,7 +2098,6 @@ Specify the serial device it is connected to (e.g. /dev/ttya)."; es1800_child_ops.to_thread_alive = 0; es1800_child_ops.to_stop = 0; es1800_child_ops.to_pid_to_exec_file = NULL; - es1800_child_ops.to_core_file_to_sym_file = NULL; es1800_child_ops.to_stratum = process_stratum; es1800_child_ops.DONT_USE = 0; es1800_child_ops.to_has_all_memory = 1; @@ -2210,7 +2111,7 @@ Specify the serial device it is connected to (e.g. /dev/ttya)."; } void -_initialize_es1800 () +_initialize_es1800 (void) { init_es1800_ops (); init_es1800_child_ops ();