X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fremote-rdp.c;h=f8d9d8b77b1bdae37900d24d96cb5a8d12794171;hb=61aff869b912a1b28b9c058b62cc90791ba5497d;hp=3cc4c4eed2d3a4d779e5bed5d63d1b82609a785d;hpb=b890317e1b15a0e4dc1abe34a6d6cfc6f3e7fd52;p=binutils-gdb.git diff --git a/gdb/remote-rdp.c b/gdb/remote-rdp.c index 3cc4c4eed2d..f8d9d8b77b1 100644 --- a/gdb/remote-rdp.c +++ b/gdb/remote-rdp.c @@ -1,5 +1,7 @@ /* Remote debugging for the ARM RDP interface. - Copyright 1994, 1995 Free Software Foundation, Inc. + + Copyright 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003 Free + Software Foundation, Inc. This file is part of GDB. @@ -15,7 +17,8 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ @@ -37,27 +40,26 @@ #include "defs.h" #include "inferior.h" -#include "wait.h" #include "value.h" -#include "callback.h" +#include "gdb/callback.h" #include "command.h" -#ifdef ANSI_PROTOTYPES -#include -#else -#include -#endif #include #include #include "symfile.h" #include "remote-utils.h" #include "gdb_string.h" -#ifdef HAVE_UNISTD_H -#include -#endif +#include "gdbcore.h" +#include "regcache.h" +#include "serial.h" +#include "arm-tdep.h" + +#ifdef HAVE_TIME_H +#include +#endif extern struct target_ops remote_rdp_ops; -static serial_t io; +static struct serial *io; static host_callback *callback = &default_callback; struct @@ -138,6 +140,16 @@ ds; #define RDP_INFO_ABOUT_BREAK_THREAD_BREAK (1<<9) #define RDP_INFO_ABOUT_BREAK_THREAD_WATCH (1<<10) #define RDP_INFO_ABOUT_BREAK_COND (1<<11) +#define RDP_INFO_VECTOR_CATCH (0x180) +#define RDP_INFO_ICEBREAKER (7) +#define RDP_INFO_SET_CMDLINE (0x300) + +#define RDP_SELECT_CONFIG (0x16) +#define RDI_ConfigCPU 0 +#define RDI_ConfigSystem 1 +#define RDI_MatchAny 0 +#define RDI_MatchExactly 1 +#define RDI_MatchNoEarlier 2 #define RDP_RESET 0x7f @@ -157,23 +169,24 @@ ds; static int timeout = 2; +static char *commandline = NULL; + static int -remote_rdp_xfer_inferior_memory PARAMS ((CORE_ADDR memaddr, - char *myaddr, - int len, - int write, - struct target_ops * target)); +remote_rdp_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, + int write, + struct mem_attrib *attrib, + struct target_ops *target); /* Stuff for talking to the serial layer. */ static unsigned char -get_byte () +get_byte (void) { - int c = SERIAL_READCHAR (io, timeout); + int c = serial_readchar (io, timeout); if (remote_debug) - printf ("[%02x]\n", c); + fprintf_unfiltered (gdb_stdlog, "[%02x]\n", c); if (c == SERIAL_TIMEOUT) { @@ -189,7 +202,7 @@ get_byte () /* Note that the target always speaks little-endian to us, even if it's a big endian machine. */ static unsigned int -get_word () +get_word (void) { unsigned int val = 0; unsigned int c; @@ -203,17 +216,15 @@ get_word () } static void -put_byte (val) - char val; +put_byte (char val) { if (remote_debug) - printf ("(%02x)\n", val); - SERIAL_WRITE (io, &val, 1); + fprintf_unfiltered (gdb_stdlog, "(%02x)\n", val); + serial_write (io, &val, 1); } static void -put_word (val) - int val; +put_word (int val) { /* We always send in little endian */ unsigned char b[4]; @@ -223,9 +234,9 @@ put_word (val) b[3] = val >> 24; if (remote_debug) - printf ("(%04x)", val); + fprintf_unfiltered (gdb_stdlog, "(%04x)", val); - SERIAL_WRITE (io, b, 4); + serial_write (io, b, 4); } @@ -241,9 +252,7 @@ put_word (val) */ static void -rdp_init (cold, tty) - int cold; - int tty; +rdp_init (int cold, int tty) { int sync = 0; int type = cold ? RDP_OPEN_TYPE_COLD : RDP_OPEN_TYPE_WARM; @@ -258,34 +267,65 @@ rdp_init (cold, tty) int restype; QUIT; - SERIAL_FLUSH_INPUT (io); - SERIAL_FLUSH_OUTPUT (io); + serial_flush_input (io); + serial_flush_output (io); if (tty) printf_unfiltered ("Trying to connect at %d baud.\n", baudtry); + + /* + ** It seems necessary to reset an EmbeddedICE to get it going. + ** This has the side benefit of displaying the startup banner. + */ + if (cold) + { + put_byte (RDP_RESET); + while ((restype = serial_readchar (io, 1)) > 0) + { + switch (restype) + { + case SERIAL_TIMEOUT: + break; + case RDP_RESET: + /* Sent at start of reset process: ignore */ + break; + default: + printf_unfiltered ("%c", isgraph (restype) ? restype : ' '); + break; + } + } + + if (restype == 0) + { + /* Got end-of-banner mark */ + printf_filtered ("\n"); + } + } + put_byte (RDP_OPEN); put_byte (type | RDP_OPEN_TYPE_RETURN_SEX); put_word (0); - while (!sync && (restype = SERIAL_READCHAR (io, 1)) > 0) + while (!sync && (restype = serial_readchar (io, 1)) > 0) { if (remote_debug) - printf_unfiltered ("[%02x]\n", restype); + fprintf_unfiltered (gdb_stdlog, "[%02x]\n", restype); switch (restype) { case SERIAL_TIMEOUT: break; + case RDP_RESET: - while ((restype = SERIAL_READCHAR (io, 1)) == RDP_RESET) + while ((restype = serial_readchar (io, 1)) == RDP_RESET) ; - while ((restype = SERIAL_READCHAR (io, 1)) > 0) + do { printf_unfiltered ("%c", isgraph (restype) ? restype : ' '); } - while ((restype = SERIAL_READCHAR (io, 1)) > 0) - ; + while ((restype = serial_readchar (io, 1)) > 0); + if (tty) { printf_unfiltered ("\nThe board has sent notification that it was reset.\n"); @@ -294,22 +334,47 @@ rdp_init (cold, tty) sleep (3); if (tty) printf_unfiltered ("\nTrying again.\n"); + cold = 0; break; + default: break; + case RDP_RES_VALUE: { - int resval = SERIAL_READCHAR (io, 1); + int resval = serial_readchar (io, 1); + + if (remote_debug) + fprintf_unfiltered (gdb_stdlog, "[%02x]\n", resval); + switch (resval) { case SERIAL_TIMEOUT: break; case RDP_RES_VALUE_LITTLE_ENDIAN: - target_byte_order = LITTLE_ENDIAN; +#if 0 + /* FIXME: cagney/2003-11-22: Ever since the ARM + was multi-arched (in 2002-02-08), this + assignment has had no effect. There needs to + be some sort of check/decision based on the + current architecture's byte-order vs the remote + target's byte order. For the moment disable + the assignment to keep things building. */ + target_byte_order = BFD_ENDIAN_LITTLE; +#endif sync = 1; break; case RDP_RES_VALUE_BIG_ENDIAN: - target_byte_order = BIG_ENDIAN; +#if 0 + /* FIXME: cagney/2003-11-22: Ever since the ARM + was multi-arched (in 2002-02-08), this + assignment has had no effect. There needs to + be some sort of check/decision based on the + current architecture's byte-order vs the remote + target's byte order. For the moment disable + the assignment to keep things building. */ + target_byte_order = BFD_ENDIAN_BIG; +#endif sync = 1; break; default: @@ -327,23 +392,13 @@ rdp_init (cold, tty) } -#ifdef ANSI_PROTOTYPES -void +static void send_rdp (char *template,...) -#else -void -send_rdp (char *template, va_alist) - va_dcl -#endif { char buf[200]; char *dst = buf; va_list alist; -#ifdef ANSI_PROTOTYPES va_start (alist, template); -#else - va_start (alist); -#endif while (*template) { @@ -384,9 +439,27 @@ send_rdp (char *template, va_alist) } break; case 'Z': - /* Check the result code, error if not zero */ - if (get_byte ()) - error ("Command garbled"); + /* Check the result code */ + switch (get_byte ()) + { + case 0: + /* Success */ + break; + case 253: + /* Target can't do it; never mind */ + printf_unfiltered ("RDP: Insufficient privilege\n"); + return; + case 254: + /* Target can't do it; never mind */ + printf_unfiltered ("RDP: Unimplemented message\n"); + return; + case 255: + error ("Command garbled"); + break; + default: + error ("Corrupt reply from target"); + break; + } break; case 'W': /* Read a word from the target */ @@ -407,13 +480,13 @@ send_rdp (char *template, va_alist) pc = va_arg (alist, char *); val = va_arg (alist, int); dst = buf; - SERIAL_WRITE (io, pc, val); + serial_write (io, pc, val); break; case '-': /* Send whats in the queue */ if (dst != buf) { - SERIAL_WRITE (io, buf, dst - buf); + serial_write (io, buf, dst - buf); dst = buf; } break; @@ -422,21 +495,18 @@ send_rdp (char *template, va_alist) *pi = get_byte (); break; default: - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); } } - va_end (args); + va_end (alist); if (dst != buf) - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); } static int -rdp_write (memaddr, buf, len) - CORE_ADDR memaddr; - char *buf; - int len; +rdp_write (CORE_ADDR memaddr, char *buf, int len) { int res; int val; @@ -452,10 +522,7 @@ rdp_write (memaddr, buf, len) static int -rdp_read (memaddr, buf, len) - CORE_ADDR memaddr; - char *buf; - int len; +rdp_read (CORE_ADDR memaddr, char *buf, int len) { int res; int val; @@ -471,9 +538,7 @@ rdp_read (memaddr, buf, len) } static void -rdp_fetch_one_register (mask, buf) - int mask; - char *buf; +rdp_fetch_one_register (int mask, char *buf) { int val; send_rdp ("bbw-SWZ", RDP_CPU_READ, RDP_CPU_READWRITE_MODE_CURRENT, mask, &val); @@ -481,9 +546,7 @@ rdp_fetch_one_register (mask, buf) } static void -rdp_fetch_one_fpu_register (mask, buf) - int mask; - char *buf; +rdp_fetch_one_fpu_register (int mask, char *buf) { #if 0 /* !!! Since the PIE board doesn't work as documented, @@ -505,14 +568,12 @@ rdp_fetch_one_fpu_register (mask, buf) send_rdp ("bbw-SWWWWZ", RDP_COPRO_READ, FPU_COPRO_NUMBER, mask, buf + 0, buf + 4, buf + 8, &dummy); } #endif - memset (buf, 0, MAX_REGISTER_RAW_SIZE); + memset (buf, 0, MAX_REGISTER_SIZE); } static void -rdp_store_one_register (mask, buf) - int mask; - char *buf; +rdp_store_one_register (int mask, char *buf) { int val = extract_unsigned_integer (buf, 4); @@ -522,9 +583,7 @@ rdp_store_one_register (mask, buf) static void -rdp_store_one_fpu_register (mask, buf) - int mask; - char *buf; +rdp_store_one_fpu_register (int mask, char *buf) { #if 0 /* See comment in fetch_one_fpu_register */ @@ -562,8 +621,7 @@ rdp_store_one_fpu_register (mask, buf) /* Convert between GDB requests and the RDP layer. */ static void -remote_rdp_fetch_register (regno) - int regno; +remote_rdp_fetch_register (int regno) { if (regno == -1) { @@ -572,29 +630,28 @@ remote_rdp_fetch_register (regno) } else { - char buf[MAX_REGISTER_RAW_SIZE]; + char buf[MAX_REGISTER_SIZE]; if (regno < 15) rdp_fetch_one_register (1 << regno, buf); - else if (regno == PC_REGNUM) + else if (regno == ARM_PC_REGNUM) rdp_fetch_one_register (RDP_CPU_READWRITE_MASK_PC, buf); - else if (regno == PS_REGNUM) + else if (regno == ARM_PS_REGNUM) rdp_fetch_one_register (RDP_CPU_READWRITE_MASK_CPSR, buf); - else if (regno == FPS_REGNUM) + else if (regno == ARM_FPS_REGNUM) rdp_fetch_one_fpu_register (RDP_FPU_READWRITE_MASK_FPS, buf); - else if (regno >= F0_REGNUM && regno <= F7_REGNUM) - rdp_fetch_one_fpu_register (1 << (regno - F0_REGNUM), buf); + else if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM) + rdp_fetch_one_fpu_register (1 << (regno - ARM_F0_REGNUM), buf); else { printf ("Help me with fetch reg %d\n", regno); } - supply_register (regno, buf); + regcache_raw_supply (current_regcache, regno, buf); } } static void -remote_rdp_store_register (regno) - int regno; +remote_rdp_store_register (int regno) { if (regno == -1) { @@ -603,16 +660,16 @@ remote_rdp_store_register (regno) } else { - char tmp[MAX_REGISTER_RAW_SIZE]; - read_register_gen (regno, tmp); + char tmp[MAX_REGISTER_SIZE]; + deprecated_read_register_gen (regno, tmp); if (regno < 15) rdp_store_one_register (1 << regno, tmp); - else if (regno == PC_REGNUM) + else if (regno == ARM_PC_REGNUM) rdp_store_one_register (RDP_CPU_READWRITE_MASK_PC, tmp); - else if (regno == PS_REGNUM) + else if (regno == ARM_PS_REGNUM) rdp_store_one_register (RDP_CPU_READWRITE_MASK_CPSR, tmp); - else if (regno >= F0_REGNUM && regno <= F7_REGNUM) - rdp_store_one_fpu_register (1 << (regno - F0_REGNUM), tmp); + else if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM) + rdp_store_one_fpu_register (1 << (regno - ARM_F0_REGNUM), tmp); else { printf ("Help me with reg %d\n", regno); @@ -621,14 +678,14 @@ remote_rdp_store_register (regno) } static void -remote_rdp_kill () +remote_rdp_kill (void) { callback->shutdown (callback); } static void -rdp_info () +rdp_info (void) { send_rdp ("bw-S-W-Z", RDP_INFO, RDP_INFO_ABOUT_STEP, &ds.step_info); @@ -645,13 +702,49 @@ rdp_info () static void -rdp_execute_start () +rdp_execute_start (void) { /* Start it off, but don't wait for it */ send_rdp ("bb-", RDP_EXEC, RDP_EXEC_TYPE_SYNC); } +static void +rdp_set_command_line (char *command, char *args) +{ + /* + ** We could use RDP_INFO_SET_CMDLINE to send this, but EmbeddedICE systems + ** don't implement that, and get all confused at the unexpected text. + ** Instead, just keep a copy, and send it when the target does a SWI_GetEnv + */ + + if (commandline != NULL) + xfree (commandline); + + commandline = xstrprintf ("%s %s", command, args); +} + +static void +rdp_catch_vectors (void) +{ + /* + ** We want the target monitor to intercept the abort vectors + ** i.e. stop the program if any of these are used. + */ + send_rdp ("bww-SZ", RDP_INFO, RDP_INFO_VECTOR_CATCH, + /* + ** Specify a bitmask including + ** the reset vector + ** the undefined instruction vector + ** the prefetch abort vector + ** the data abort vector + ** the address exception vector + */ + (1 << 0) | (1 << 1) | (1 << 3) | (1 << 4) | (1 << 5) + ); +} + + #define a_byte 1 #define a_word 2 @@ -698,10 +791,28 @@ argsin; #define SWI_GenerateError 0x71 +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +static int translate_open_mode[] = +{ + O_RDONLY, /* "r" */ + O_RDONLY + O_BINARY, /* "rb" */ + O_RDWR, /* "r+" */ + O_RDWR + O_BINARY, /* "r+b" */ + O_WRONLY + O_CREAT + O_TRUNC, /* "w" */ + O_WRONLY + O_BINARY + O_CREAT + O_TRUNC, /* "wb" */ + O_RDWR + O_CREAT + O_TRUNC, /* "w+" */ + O_RDWR + O_BINARY + O_CREAT + O_TRUNC, /* "w+b" */ + O_WRONLY + O_APPEND + O_CREAT, /* "a" */ + O_WRONLY + O_BINARY + O_APPEND + O_CREAT, /* "ab" */ + O_RDWR + O_APPEND + O_CREAT, /* "a+" */ + O_RDWR + O_BINARY + O_APPEND + O_CREAT /* "a+b" */ +}; + static int -exec_swi (swi, args) - int swi; - argsin *args; +exec_swi (int swi, argsin *args) { int i; char c; @@ -727,31 +838,41 @@ exec_swi (swi, args) case SWI_Time: args->n = callback->time (callback, NULL); return 1; + + case SWI_Clock: + /* return number of centi-seconds... */ + args->n = +#ifdef CLOCKS_PER_SEC + (CLOCKS_PER_SEC >= 100) + ? (clock () / (CLOCKS_PER_SEC / 100)) + : ((clock () * 100) / CLOCKS_PER_SEC); +#else + /* presume unix... clock() returns microseconds */ + clock () / 10000; +#endif + return 1; + case SWI_Remove: args->n = callback->unlink (callback, args->s); return 1; case SWI_Rename: args->n = callback->rename (callback, args[0].s, args[1].s); return 1; - case SWI_Open: - i = 0; -#ifdef O_BINARY - if (args[1].n & 1) - i |= O_BINARY; -#endif - if (args[1].n & 2) - i |= O_RDWR; + case SWI_Open: + /* Now we need to decode the Demon open mode */ + i = translate_open_mode[args[1].n]; - if (args[1].n & 4) + /* Filename ":tt" is special: it denotes stdin/out */ + if (strcmp (args->s, ":tt") == 0) { - i |= O_CREAT; + if (i == O_RDONLY) /* opening tty "r" */ + args->n = 0 /* stdin */ ; + else + args->n = 1 /* stdout */ ; } - - if (args[1].n & 8) - i |= O_APPEND; - - args->n = callback->open (callback, args->s, i); + else + args->n = callback->open (callback, args->s, i); return 1; case SWI_Close: @@ -759,25 +880,30 @@ exec_swi (swi, args) return 1; case SWI_Write: - args->n = callback->write (callback, args[0].n, args[1].s, args[1].n); + /* Return the number of bytes *not* written */ + args->n = args[1].n - + callback->write (callback, args[0].n, args[1].s, args[1].n); return 1; + case SWI_Read: { char *copy = alloca (args[2].n); int done = callback->read (callback, args[0].n, copy, args[2].n); if (done > 0) - remote_rdp_xfer_inferior_memory (args[0].n, copy, done, 1, 0); - args->n -= done; + remote_rdp_xfer_inferior_memory (args[1].n, copy, done, 1, 0, 0); + args->n = args[2].n - done; return 1; } case SWI_Seek: - args->n = callback->lseek (callback, args[0].n, args[1].n, 0) >= 0; + /* Return non-zero on failure */ + args->n = callback->lseek (callback, args[0].n, args[1].n, 0) < 0; return 1; + case SWI_Flen: { - long old = callback->lseek (callback, args->n, 1, 1); - args->n = callback->lseek (callback, args->n, 2, 0); + long old = callback->lseek (callback, args->n, 0, SEEK_CUR); + args->n = callback->lseek (callback, args->n, 0, SEEK_END); callback->lseek (callback, args->n, old, 0); return 1; } @@ -786,6 +912,22 @@ exec_swi (swi, args) args->n = callback->isatty (callback, args->n); return 1; + case SWI_GetEnv: + if (commandline != NULL) + { + int len = strlen (commandline); + if (len > 255) + { + len = 255; + commandline[255] = '\0'; + } + remote_rdp_xfer_inferior_memory (args[0].n, + commandline, len + 1, 1, 0, 0); + } + else + remote_rdp_xfer_inferior_memory (args[0].n, "", 1, 1, 0, 0); + return 1; + default: return 0; } @@ -793,7 +935,7 @@ exec_swi (swi, args) static void -handle_swi () +handle_swi (void) { argsin args[3]; char *buf; @@ -830,6 +972,7 @@ handle_swi () buf, len, 0, + 0, 0); } else @@ -845,7 +988,7 @@ handle_swi () break; default: - error ("Unimplented SWI argument"); + error ("Unimplemented SWI argument"); } type = type >> 2; @@ -866,19 +1009,19 @@ handle_swi () } static void -rdp_execute_finish () +rdp_execute_finish (void) { int running = 1; while (running) { int res; - res = SERIAL_READCHAR (io, 1); + res = serial_readchar (io, 1); while (res == SERIAL_TIMEOUT) { QUIT; printf_filtered ("Waiting for target..\n"); - res = SERIAL_READCHAR (io, 1); + res = serial_readchar (io, 1); } switch (res) @@ -903,16 +1046,14 @@ rdp_execute_finish () static void -rdp_execute () +rdp_execute (void) { rdp_execute_start (); rdp_execute_finish (); } static int -remote_rdp_insert_breakpoint (addr, save) - CORE_ADDR addr; - char *save; +remote_rdp_insert_breakpoint (CORE_ADDR addr, char *save) { int res; if (ds.rdi_level > 0) @@ -936,9 +1077,7 @@ remote_rdp_insert_breakpoint (addr, save) } static int -remote_rdp_remove_breakpoint (addr, save) - CORE_ADDR addr; - char *save; +remote_rdp_remove_breakpoint (CORE_ADDR addr, char *save) { int res; if (ds.rdi_level > 0) @@ -959,7 +1098,7 @@ remote_rdp_remove_breakpoint (addr, save) } static void -rdp_step () +rdp_step (void) { if (ds.can_step && 0) { @@ -973,19 +1112,19 @@ rdp_step () else { char handle[4]; - CORE_ADDR pc = read_register (PC_REGNUM); + CORE_ADDR pc = read_register (ARM_PC_REGNUM); pc = arm_get_next_pc (pc); - remote_rdp_insert_breakpoint (pc, &handle); + remote_rdp_insert_breakpoint (pc, handle); rdp_execute (); - remote_rdp_remove_breakpoint (pc, &handle); + remote_rdp_remove_breakpoint (pc, handle); } } static void -remote_rdp_open (args, from_tty) - char *args; - int from_tty; +remote_rdp_open (char *args, int from_tty) { + int not_icebreaker; + if (!args) error_no_arg ("serial port device name"); @@ -993,12 +1132,12 @@ remote_rdp_open (args, from_tty) target_preopen (from_tty); - io = SERIAL_OPEN (args); + io = serial_open (args); if (!io) perror_with_name (args); - SERIAL_RAW (io); + serial_raw (io); rdp_init (1, from_tty); @@ -1010,15 +1149,39 @@ remote_rdp_open (args, from_tty) rdp_info (); + /* Need to set up the vector interception state */ + rdp_catch_vectors (); + + /* + ** If it's an EmbeddedICE, we need to set the processor config. + ** Assume we can always have ARM7TDI... + */ + send_rdp ("bw-SB", RDP_INFO, RDP_INFO_ICEBREAKER, ¬_icebreaker); + if (!not_icebreaker) + { + const char *CPU = "ARM7TDI"; + int ICEversion; + int len = strlen (CPU); + + send_rdp ("bbbbw-p-SWZ", + RDP_SELECT_CONFIG, + RDI_ConfigCPU, /* Aspect: set the CPU */ + len, /* The number of bytes in the name */ + RDI_MatchAny, /* We'll take whatever we get */ + 0, /* We'll take whatever version's there */ + CPU, len, + &ICEversion); + } + + /* command line initialised on 'run' */ + push_target (&remote_rdp_ops); callback->init (callback); flush_cached_frames (); registers_changed (); stop_pc = read_pc (); - set_current_frame (create_new_frame (read_fp (), stop_pc)); - select_frame (get_current_frame (), 0); - print_stack_frame (selected_frame, -1, 1); + print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC); } @@ -1026,12 +1189,11 @@ remote_rdp_open (args, from_tty) /* Close out all files and local state before this target loses control. */ static void -remote_rdp_close (quitting) - int quitting; +remote_rdp_close (int quitting) { callback->shutdown (callback); if (io) - SERIAL_CLOSE (io); + serial_close (io); io = 0; } @@ -1041,9 +1203,7 @@ remote_rdp_close (quitting) to the target, or zero for no signal. */ static void -remote_rdp_resume (pid, step, siggnal) - int pid, step; - enum target_signal siggnal; +remote_rdp_resume (ptid_t ptid, int step, enum target_signal siggnal) { if (step) rdp_step (); @@ -1055,10 +1215,8 @@ remote_rdp_resume (pid, step, siggnal) or -1 in case of error; store status through argument pointer STATUS, just as `wait' would. */ -static int -remote_rdp_wait (pid, status) - int pid; - struct target_waitstatus *status; +static ptid_t +remote_rdp_wait (ptid_t ptid, struct target_waitstatus *status) { switch (ds.rdi_stopped_status) { @@ -1084,7 +1242,7 @@ remote_rdp_wait (pid, status) #endif } - return inferior_pid; + return inferior_ptid; } /* Get ready to modify the registers array. On machines which store @@ -1094,18 +1252,21 @@ remote_rdp_wait (pid, status) debugged. */ static void -remote_rdp_prepare_to_store () +remote_rdp_prepare_to_store (void) { /* Do nothing, since we can store individual regs */ } +/* Transfer LEN bytes between GDB address MYADDR and target address + MEMADDR. If WRITE is non-zero, transfer them to the target, + otherwise transfer them from the target. TARGET is unused. + + Returns the number of bytes transferred. */ + static int -remote_rdp_xfer_inferior_memory (memaddr, myaddr, len, write, target) - CORE_ADDR memaddr; - char *myaddr; - int len; - int write; - struct target_ops *target; /* ignored */ +remote_rdp_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, + int write, struct mem_attrib *attrib, + struct target_ops *target) { /* I infer from D Taylor's code that there's a limit on the amount we can transfer in one chunk.. */ @@ -1170,9 +1331,7 @@ static struct yn breakinfo[] = static void -dump_bits (t, info) - struct yn *t; - int info; +dump_bits (struct yn *t, int info) { while (t->name) { @@ -1182,8 +1341,7 @@ dump_bits (t, info) } static void -remote_rdp_files_info (target) - struct target_ops *target; +remote_rdp_files_info (struct target_ops *target) { printf_filtered ("Target capabilities:\n"); dump_bits (stepinfo, ds.step_info); @@ -1192,56 +1350,83 @@ remote_rdp_files_info (target) } +static void +remote_rdp_create_inferior (char *exec_file, char *allargs, char **env, + int from_tty) +{ + CORE_ADDR entry_point; + + if (exec_file == 0 || exec_bfd == 0) + error ("No executable file specified."); + + entry_point = (CORE_ADDR) bfd_get_start_address (exec_bfd); + + remote_rdp_kill (); + remove_breakpoints (); + init_wait_for_inferior (); + + /* This gives us a chance to set up the command line */ + rdp_set_command_line (exec_file, allargs); + + inferior_ptid = pid_to_ptid (42); + insert_breakpoints (); /* Needed to get correct instruction in cache */ + + /* + ** RDP targets don't provide any facility to set the top of memory, + ** so we don't bother to look for MEMSIZE in the environment. + */ + + /* Let's go! */ + proceed (entry_point, TARGET_SIGNAL_DEFAULT, 0); +} + +/* Attach doesn't need to do anything */ +static void +remote_rdp_attach (char *args, int from_tty) +{ + return; +} + /* Define the target subroutine names */ -struct target_ops remote_rdp_ops = +struct target_ops remote_rdp_ops; + +static void +init_remote_rdp_ops (void) { - "rdp", /* to_shortname */ - /* to_longname */ - "Remote Target using the RDProtocol", - /* to_doc */ - "Use a remote ARM system which uses the ARM Remote Debugging Protocol", - remote_rdp_open, /* to_open */ - remote_rdp_close, /* to_close */ - NULL, /* to_attach */ - NULL, /* to_detach */ - remote_rdp_resume, /* to_resume */ - remote_rdp_wait, /* to_wait */ - remote_rdp_fetch_register, /* to_fetch_registers */ - remote_rdp_store_register, /* to_store_registers */ - remote_rdp_prepare_to_store, /* to_prepare_to_store */ - remote_rdp_xfer_inferior_memory, /* to_xfer_memory */ - remote_rdp_files_info, /* to_files_info */ - remote_rdp_insert_breakpoint, /* to_insert_breakpoint */ - remote_rdp_remove_breakpoint, /* to_remove_breakpoint */ - NULL, /* to_terminal_init */ - NULL, /* to_terminal_inferior */ - NULL, /* to_terminal_ours_for_output */ - NULL, /* to_terminal_ours */ - NULL, /* to_terminal_info */ - remote_rdp_kill, /* to_kill */ - generic_load, /* to_load */ - NULL, /* to_lookup_symbol */ - NULL, /* to_create_inferior */ - generic_mourn_inferior, /* to_mourn_inferior */ - 0, /* to_can_run */ - 0, /* to_notice_signals */ - 0, /* to_thread_alive */ - 0, /* to_stop */ - process_stratum, /* to_stratum */ - NULL, /* to_next */ - 1, /* to_has_all_memory */ - 1, /* to_has_memory */ - 1, /* to_has_stack */ - 1, /* to_has_registers */ - 1, /* to_has_execution */ - NULL, /* sections */ - NULL, /* sections_end */ - OPS_MAGIC, /* to_magic */ -}; + remote_rdp_ops.to_shortname = "rdp"; + remote_rdp_ops.to_longname = "Remote Target using the RDProtocol"; + remote_rdp_ops.to_doc = "Use a remote ARM system which uses the ARM Remote Debugging Protocol"; + remote_rdp_ops.to_open = remote_rdp_open; + remote_rdp_ops.to_close = remote_rdp_close; + remote_rdp_ops.to_attach = remote_rdp_attach; + remote_rdp_ops.to_resume = remote_rdp_resume; + remote_rdp_ops.to_wait = remote_rdp_wait; + remote_rdp_ops.to_fetch_registers = remote_rdp_fetch_register; + remote_rdp_ops.to_store_registers = remote_rdp_store_register; + remote_rdp_ops.to_prepare_to_store = remote_rdp_prepare_to_store; + remote_rdp_ops.deprecated_xfer_memory = remote_rdp_xfer_inferior_memory; + remote_rdp_ops.to_files_info = remote_rdp_files_info; + remote_rdp_ops.to_insert_breakpoint = remote_rdp_insert_breakpoint; + remote_rdp_ops.to_remove_breakpoint = remote_rdp_remove_breakpoint; + remote_rdp_ops.to_kill = remote_rdp_kill; + remote_rdp_ops.to_load = generic_load; + remote_rdp_ops.to_create_inferior = remote_rdp_create_inferior; + remote_rdp_ops.to_mourn_inferior = generic_mourn_inferior; + remote_rdp_ops.to_stratum = process_stratum; + remote_rdp_ops.to_has_all_memory = 1; + remote_rdp_ops.to_has_memory = 1; + remote_rdp_ops.to_has_stack = 1; + remote_rdp_ops.to_has_registers = 1; + remote_rdp_ops.to_has_execution = 1; + remote_rdp_ops.to_magic = OPS_MAGIC; +} + +extern initialize_file_ftype _initialize_remote_rdp; /* -Wmissing-prototypes */ void -_initialize_remote_rdp () +_initialize_remote_rdp (void) { + init_remote_rdp_ops (); add_target (&remote_rdp_ops); }