1 /* Remote debugging for the ARM RDP interface.
3 Copyright 1994, 1995, 1998, 1999, 2000, 2001, 2002 Free Software
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.
28 Much of this file (in particular the SWI stuff) is based on code by
29 David Taylor (djt1000@uk.ac.cam.hermes).
31 I hacked on and simplified it by removing a lot of sexy features he
32 had added, and some of the (unix specific) workarounds he'd done
33 for other GDB problems - which if they still exist should be fixed
34 in GDB, not in a remote-foo thing . I also made it conform more to
35 the doc I have; which may be wrong.
37 Steve Chamberlain (sac@cygnus.com).
44 #include "gdb/callback.h"
49 #include "remote-utils.h"
50 #include "gdb_string.h"
61 extern struct target_ops remote_rdp_ops;
62 static struct serial *io;
63 static host_callback *callback = &default_callback;
72 char command_line[10];
74 int rdi_stopped_status;
80 /* Definitions for the RDP protocol. */
82 #define RDP_MOUTHFULL (1<<6)
83 #define FPU_COPRO_NUMBER 1
86 #define RDP_OPEN_TYPE_COLD 0
87 #define RDP_OPEN_TYPE_WARM 1
88 #define RDP_OPEN_TYPE_BAUDRATE 2
90 #define RDP_OPEN_BAUDRATE_9600 1
91 #define RDP_OPEN_BAUDRATE_19200 2
92 #define RDP_OPEN_BAUDRATE_38400 3
94 #define RDP_OPEN_TYPE_RETURN_SEX (1<<3)
98 #define RDP_MEM_READ 2
100 #define RDP_MEM_WRITE 3
102 #define RDP_CPU_READ 4
103 #define RDP_CPU_WRITE 5
104 #define RDP_CPU_READWRITE_MODE_CURRENT 255
105 #define RDP_CPU_READWRITE_MASK_PC (1<<16)
106 #define RDP_CPU_READWRITE_MASK_CPSR (1<<17)
107 #define RDP_CPU_READWRITE_MASK_SPSR (1<<18)
109 #define RDP_COPRO_READ 6
110 #define RDP_COPRO_WRITE 7
111 #define RDP_FPU_READWRITE_MASK_FPS (1<<8)
113 #define RDP_SET_BREAK 0xa
114 #define RDP_SET_BREAK_TYPE_PC_EQUAL 0
115 #define RDP_SET_BREAK_TYPE_GET_HANDLE (0x10)
117 #define RDP_CLEAR_BREAK 0xb
119 #define RDP_EXEC 0x10
120 #define RDP_EXEC_TYPE_SYNC 0
122 #define RDP_STEP 0x11
124 #define RDP_INFO 0x12
125 #define RDP_INFO_ABOUT_STEP 2
126 #define RDP_INFO_ABOUT_STEP_GT_1 1
127 #define RDP_INFO_ABOUT_STEP_TO_JMP 2
128 #define RDP_INFO_ABOUT_STEP_1 4
129 #define RDP_INFO_ABOUT_TARGET 0
130 #define RDP_INFO_ABOUT_BREAK 1
131 #define RDP_INFO_ABOUT_BREAK_COMP 1
132 #define RDP_INFO_ABOUT_BREAK_RANGE 2
133 #define RDP_INFO_ABOUT_BREAK_BYTE_READ 4
134 #define RDP_INFO_ABOUT_BREAK_HALFWORD_READ 8
135 #define RDP_INFO_ABOUT_BREAK_WORD_READ (1<<4)
136 #define RDP_INFO_ABOUT_BREAK_BYTE_WRITE (1<<5)
137 #define RDP_INFO_ABOUT_BREAK_HALFWORD_WRITE (1<<6)
138 #define RDP_INFO_ABOUT_BREAK_WORD_WRITE (1<<7)
139 #define RDP_INFO_ABOUT_BREAK_MASK (1<<8)
140 #define RDP_INFO_ABOUT_BREAK_THREAD_BREAK (1<<9)
141 #define RDP_INFO_ABOUT_BREAK_THREAD_WATCH (1<<10)
142 #define RDP_INFO_ABOUT_BREAK_COND (1<<11)
143 #define RDP_INFO_VECTOR_CATCH (0x180)
144 #define RDP_INFO_ICEBREAKER (7)
145 #define RDP_INFO_SET_CMDLINE (0x300)
147 #define RDP_SELECT_CONFIG (0x16)
148 #define RDI_ConfigCPU 0
149 #define RDI_ConfigSystem 1
150 #define RDI_MatchAny 0
151 #define RDI_MatchExactly 1
152 #define RDI_MatchNoEarlier 2
154 #define RDP_RESET 0x7f
156 /* Returns from RDP */
157 #define RDP_RES_STOPPED 0x20
158 #define RDP_RES_SWI 0x21
159 #define RDP_RES_FATAL 0x5e
160 #define RDP_RES_VALUE 0x5f
161 #define RDP_RES_VALUE_LITTLE_ENDIAN 240
162 #define RDP_RES_VALUE_BIG_ENDIAN 241
163 #define RDP_RES_RESET 0x7f
164 #define RDP_RES_AT_BREAKPOINT 143
165 #define RDP_RES_IDUNNO 0xe6
166 #define RDP_OSOpReply 0x13
167 #define RDP_OSOpWord 2
168 #define RDP_OSOpNothing 0
170 static int timeout = 2;
172 static char *commandline = NULL;
175 remote_rdp_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
177 struct mem_attrib *attrib,
178 struct target_ops *target);
181 /* Stuff for talking to the serial layer. */
186 int c = serial_readchar (io, timeout);
189 fprintf_unfiltered (gdb_stdlog, "[%02x]\n", c);
191 if (c == SERIAL_TIMEOUT)
194 return (unsigned char) c;
196 error ("Timeout reading from remote_system");
202 /* Note that the target always speaks little-endian to us,
203 even if it's a big endian machine. */
207 unsigned int val = 0;
210 for (n = 0; n < 4; n++)
222 fprintf_unfiltered (gdb_stdlog, "(%02x)\n", val);
223 serial_write (io, &val, 1);
229 /* We always send in little endian */
237 fprintf_unfiltered (gdb_stdlog, "(%04x)", val);
239 serial_write (io, b, 4);
244 /* Stuff for talking to the RDP layer. */
246 /* This is a bit more fancy that need be so that it syncs even in nasty cases.
248 I'be been unable to make it reliably sync up with the change
249 baudrate open command. It likes to sit and say it's been reset,
250 with no more action. So I took all that code out. I'd rather sync
251 reliably at 9600 than wait forever for a possible 19200 connection.
255 rdp_init (int cold, int tty)
258 int type = cold ? RDP_OPEN_TYPE_COLD : RDP_OPEN_TYPE_WARM;
261 time_t now = time (0);
262 time_t stop_time = now + 10; /* Try and sync for 10 seconds, then give up */
265 while (time (0) < stop_time && !sync)
270 serial_flush_input (io);
271 serial_flush_output (io);
274 printf_unfiltered ("Trying to connect at %d baud.\n", baudtry);
277 ** It seems necessary to reset an EmbeddedICE to get it going.
278 ** This has the side benefit of displaying the startup banner.
282 put_byte (RDP_RESET);
283 while ((restype = serial_readchar (io, 1)) > 0)
290 /* Sent at start of reset process: ignore */
293 printf_unfiltered ("%c", isgraph (restype) ? restype : ' ');
300 /* Got end-of-banner mark */
301 printf_filtered ("\n");
307 put_byte (type | RDP_OPEN_TYPE_RETURN_SEX);
310 while (!sync && (restype = serial_readchar (io, 1)) > 0)
313 fprintf_unfiltered (gdb_stdlog, "[%02x]\n", restype);
321 while ((restype = serial_readchar (io, 1)) == RDP_RESET)
325 printf_unfiltered ("%c", isgraph (restype) ? restype : ' ');
327 while ((restype = serial_readchar (io, 1)) > 0);
331 printf_unfiltered ("\nThe board has sent notification that it was reset.\n");
332 printf_unfiltered ("Waiting for it to settle down...\n");
336 printf_unfiltered ("\nTrying again.\n");
345 int resval = serial_readchar (io, 1);
348 fprintf_unfiltered (gdb_stdlog, "[%02x]\n", resval);
354 case RDP_RES_VALUE_LITTLE_ENDIAN:
355 target_byte_order = BFD_ENDIAN_LITTLE;
358 case RDP_RES_VALUE_BIG_ENDIAN:
359 target_byte_order = BFD_ENDIAN_BIG;
372 error ("Couldn't reset the board, try pressing the reset button");
378 send_rdp (char *template,...)
383 va_start (alist, template);
395 val = va_arg (alist, int);
399 val = va_arg (alist, int);
407 if (val != RDP_RES_VALUE)
409 printf_unfiltered ("got bad res value of %d, %x\n", val, val);
413 pstat = va_arg (alist, int *);
414 pi = va_arg (alist, int *);
416 *pstat = get_byte ();
417 /* Check the result was zero, if not read the syndrome */
424 /* Check the result code */
431 /* Target can't do it; never mind */
432 printf_unfiltered ("RDP: Insufficient privilege\n");
435 /* Target can't do it; never mind */
436 printf_unfiltered ("RDP: Unimplemented message\n");
439 error ("Command garbled");
442 error ("Corrupt reply from target");
447 /* Read a word from the target */
448 pi = va_arg (alist, int *);
452 /* Read in some bytes from the target. */
453 pc = va_arg (alist, char *);
454 val = va_arg (alist, int);
455 for (i = 0; i < val; i++)
461 /* send what's being pointed at */
462 pc = va_arg (alist, char *);
463 val = va_arg (alist, int);
465 serial_write (io, pc, val);
468 /* Send whats in the queue */
471 serial_write (io, buf, dst - buf);
476 pi = va_arg (alist, int *);
480 internal_error (__FILE__, __LINE__, "failed internal consistency check");
486 internal_error (__FILE__, __LINE__, "failed internal consistency check");
491 rdp_write (CORE_ADDR memaddr, char *buf, int len)
496 send_rdp ("bww-p-SV", RDP_MEM_WRITE, memaddr, len, buf, len, &res, &val);
507 rdp_read (CORE_ADDR memaddr, char *buf, int len)
511 send_rdp ("bww-S-P-V",
512 RDP_MEM_READ, memaddr, len,
523 rdp_fetch_one_register (int mask, char *buf)
526 send_rdp ("bbw-SWZ", RDP_CPU_READ, RDP_CPU_READWRITE_MODE_CURRENT, mask, &val);
527 store_signed_integer (buf, 4, val);
531 rdp_fetch_one_fpu_register (int mask, char *buf)
534 /* !!! Since the PIE board doesn't work as documented,
535 and it doesn't have FPU hardware anyway and since it
536 slows everything down, I've disabled this. */
538 if (mask == RDP_FPU_READWRITE_MASK_FPS)
540 /* this guy is only a word */
541 send_rdp ("bbw-SWZ", RDP_COPRO_READ, FPU_COPRO_NUMBER, mask, &val);
542 store_signed_integer (buf, 4, val);
546 /* There are 12 bytes long
547 !! fixme about endianness
549 int dummy; /* I've seen these come back as four words !! */
550 send_rdp ("bbw-SWWWWZ", RDP_COPRO_READ, FPU_COPRO_NUMBER, mask, buf + 0, buf + 4, buf + 8, &dummy);
553 memset (buf, 0, MAX_REGISTER_RAW_SIZE);
558 rdp_store_one_register (int mask, char *buf)
560 int val = extract_unsigned_integer (buf, 4);
563 RDP_CPU_WRITE, RDP_CPU_READWRITE_MODE_CURRENT, mask, val);
568 rdp_store_one_fpu_register (int mask, char *buf)
571 /* See comment in fetch_one_fpu_register */
572 if (mask == RDP_FPU_READWRITE_MASK_FPS)
574 int val = extract_unsigned_integer (buf, 4);
575 /* this guy is only a word */
576 send_rdp ("bbww-SZ", RDP_COPRO_WRITE,
582 /* There are 12 bytes long
583 !! fixme about endianness
586 /* I've seen these come as four words, not the three advertized !! */
587 printf ("Sending mask %x\n", mask);
588 send_rdp ("bbwwwww-SZ",
597 printf ("done mask %x\n", mask);
603 /* Convert between GDB requests and the RDP layer. */
606 remote_rdp_fetch_register (int regno)
610 for (regno = 0; regno < NUM_REGS; regno++)
611 remote_rdp_fetch_register (regno);
615 char buf[ARM_MAX_REGISTER_RAW_SIZE];
617 rdp_fetch_one_register (1 << regno, buf);
618 else if (regno == ARM_PC_REGNUM)
619 rdp_fetch_one_register (RDP_CPU_READWRITE_MASK_PC, buf);
620 else if (regno == ARM_PS_REGNUM)
621 rdp_fetch_one_register (RDP_CPU_READWRITE_MASK_CPSR, buf);
622 else if (regno == ARM_FPS_REGNUM)
623 rdp_fetch_one_fpu_register (RDP_FPU_READWRITE_MASK_FPS, buf);
624 else if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM)
625 rdp_fetch_one_fpu_register (1 << (regno - ARM_F0_REGNUM), buf);
628 printf ("Help me with fetch reg %d\n", regno);
630 supply_register (regno, buf);
636 remote_rdp_store_register (int regno)
640 for (regno = 0; regno < NUM_REGS; regno++)
641 remote_rdp_store_register (regno);
645 char tmp[ARM_MAX_REGISTER_RAW_SIZE];
646 deprecated_read_register_gen (regno, tmp);
648 rdp_store_one_register (1 << regno, tmp);
649 else if (regno == ARM_PC_REGNUM)
650 rdp_store_one_register (RDP_CPU_READWRITE_MASK_PC, tmp);
651 else if (regno == ARM_PS_REGNUM)
652 rdp_store_one_register (RDP_CPU_READWRITE_MASK_CPSR, tmp);
653 else if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM)
654 rdp_store_one_fpu_register (1 << (regno - ARM_F0_REGNUM), tmp);
657 printf ("Help me with reg %d\n", regno);
663 remote_rdp_kill (void)
665 callback->shutdown (callback);
672 send_rdp ("bw-S-W-Z", RDP_INFO, RDP_INFO_ABOUT_STEP,
674 send_rdp ("bw-S-W-Z", RDP_INFO, RDP_INFO_ABOUT_BREAK,
676 send_rdp ("bw-S-WW-Z", RDP_INFO, RDP_INFO_ABOUT_TARGET,
680 ds.can_step = ds.step_info & RDP_INFO_ABOUT_STEP_1;
682 ds.rdi_level = (ds.target_info >> 5) & 3;
687 rdp_execute_start (void)
689 /* Start it off, but don't wait for it */
690 send_rdp ("bb-", RDP_EXEC, RDP_EXEC_TYPE_SYNC);
695 rdp_set_command_line (char *command, char *args)
698 ** We could use RDP_INFO_SET_CMDLINE to send this, but EmbeddedICE systems
699 ** don't implement that, and get all confused at the unexpected text.
700 ** Instead, just keep a copy, and send it when the target does a SWI_GetEnv
703 if (commandline != NULL)
706 xasprintf (&commandline, "%s %s", command, args);
710 rdp_catch_vectors (void)
713 ** We want the target monitor to intercept the abort vectors
714 ** i.e. stop the program if any of these are used.
716 send_rdp ("bww-SZ", RDP_INFO, RDP_INFO_VECTOR_CATCH,
718 ** Specify a bitmask including
720 ** the undefined instruction vector
721 ** the prefetch abort vector
722 ** the data abort vector
723 ** the address exception vector
725 (1 << 0) | (1 << 1) | (1 << 3) | (1 << 4) | (1 << 5)
748 #define SWI_WriteC 0x0
749 #define SWI_Write0 0x2
750 #define SWI_ReadC 0x4
752 #define SWI_GetEnv 0x10
753 #define SWI_Exit 0x11
754 #define SWI_EnterOS 0x16
756 #define SWI_GetErrno 0x60
757 #define SWI_Clock 0x61
759 #define SWI_Time 0x63
760 #define SWI_Remove 0x64
761 #define SWI_Rename 0x65
762 #define SWI_Open 0x66
764 #define SWI_Close 0x68
765 #define SWI_Write 0x69
766 #define SWI_Read 0x6a
767 #define SWI_Seek 0x6b
768 #define SWI_Flen 0x6c
770 #define SWI_IsTTY 0x6e
771 #define SWI_TmpNam 0x6f
772 #define SWI_InstallHandler 0x70
773 #define SWI_GenerateError 0x71
780 static int translate_open_mode[] =
783 O_RDONLY + O_BINARY, /* "rb" */
785 O_RDWR + O_BINARY, /* "r+b" */
786 O_WRONLY + O_CREAT + O_TRUNC, /* "w" */
787 O_WRONLY + O_BINARY + O_CREAT + O_TRUNC, /* "wb" */
788 O_RDWR + O_CREAT + O_TRUNC, /* "w+" */
789 O_RDWR + O_BINARY + O_CREAT + O_TRUNC, /* "w+b" */
790 O_WRONLY + O_APPEND + O_CREAT, /* "a" */
791 O_WRONLY + O_BINARY + O_APPEND + O_CREAT, /* "ab" */
792 O_RDWR + O_APPEND + O_CREAT, /* "a+" */
793 O_RDWR + O_BINARY + O_APPEND + O_CREAT /* "a+b" */
797 exec_swi (int swi, argsin *args)
804 callback->write_stdout (callback, &c, 1);
807 for (i = 0; i < args->n; i++)
808 callback->write_stdout (callback, args->s, strlen (args->s));
811 callback->read_stdin (callback, &c, 1);
815 args->n = callback->system (callback, args->s);
818 args->n = callback->get_errno (callback);
821 args->n = callback->time (callback, NULL);
825 /* return number of centi-seconds... */
827 #ifdef CLOCKS_PER_SEC
828 (CLOCKS_PER_SEC >= 100)
829 ? (clock () / (CLOCKS_PER_SEC / 100))
830 : ((clock () * 100) / CLOCKS_PER_SEC);
832 /* presume unix... clock() returns microseconds */
838 args->n = callback->unlink (callback, args->s);
841 args->n = callback->rename (callback, args[0].s, args[1].s);
845 /* Now we need to decode the Demon open mode */
846 i = translate_open_mode[args[1].n];
848 /* Filename ":tt" is special: it denotes stdin/out */
849 if (strcmp (args->s, ":tt") == 0)
851 if (i == O_RDONLY) /* opening tty "r" */
852 args->n = 0 /* stdin */ ;
854 args->n = 1 /* stdout */ ;
857 args->n = callback->open (callback, args->s, i);
861 args->n = callback->close (callback, args->n);
865 /* Return the number of bytes *not* written */
866 args->n = args[1].n -
867 callback->write (callback, args[0].n, args[1].s, args[1].n);
872 char *copy = alloca (args[2].n);
873 int done = callback->read (callback, args[0].n, copy, args[2].n);
875 remote_rdp_xfer_inferior_memory (args[1].n, copy, done, 1, 0, 0);
876 args->n = args[2].n - done;
881 /* Return non-zero on failure */
882 args->n = callback->lseek (callback, args[0].n, args[1].n, 0) < 0;
887 long old = callback->lseek (callback, args->n, 0, SEEK_CUR);
888 args->n = callback->lseek (callback, args->n, 0, SEEK_END);
889 callback->lseek (callback, args->n, old, 0);
894 args->n = callback->isatty (callback, args->n);
898 if (commandline != NULL)
900 int len = strlen (commandline);
904 commandline[255] = '\0';
906 remote_rdp_xfer_inferior_memory (args[0].n,
907 commandline, len + 1, 1, 0, 0);
910 remote_rdp_xfer_inferior_memory (args[0].n, "", 1, 1, 0, 0);
927 int swino = get_word ();
928 int type = get_byte ();
934 args[count].n = get_byte ();
938 args[count].n = get_word ();
942 /* If the word is under 32 bytes it will be sent otherwise
943 an address to it is passed. Also: Special case of 255 */
953 remote_rdp_xfer_inferior_memory (get_word (),
963 buf = alloca (len + 1);
964 for (i = 0; i < len; i++)
965 buf[i] = get_byte ();
973 error ("Unimplemented SWI argument");
980 if (exec_swi (swino, args))
982 /* We have two options here reply with either a byte or a word
983 which is stored in args[0].n. There is no harm in replying with
984 a word all the time, so thats what I do! */
985 send_rdp ("bbw-", RDP_OSOpReply, RDP_OSOpWord, args[0].n);
989 send_rdp ("bb-", RDP_OSOpReply, RDP_OSOpNothing);
994 rdp_execute_finish (void)
1001 res = serial_readchar (io, 1);
1002 while (res == SERIAL_TIMEOUT)
1005 printf_filtered ("Waiting for target..\n");
1006 res = serial_readchar (io, 1);
1015 send_rdp ("B", &ds.rdi_stopped_status);
1019 printf_filtered ("Target reset\n");
1023 printf_filtered ("Ignoring %x\n", res);
1033 rdp_execute_start ();
1034 rdp_execute_finish ();
1038 remote_rdp_insert_breakpoint (CORE_ADDR addr, char *save)
1041 if (ds.rdi_level > 0)
1043 send_rdp ("bwb-SWB",
1046 RDP_SET_BREAK_TYPE_PC_EQUAL | RDP_SET_BREAK_TYPE_GET_HANDLE,
1055 RDP_SET_BREAK_TYPE_PC_EQUAL,
1062 remote_rdp_remove_breakpoint (CORE_ADDR addr, char *save)
1065 if (ds.rdi_level > 0)
1067 send_rdp ("b-p-S-B",
1085 if (ds.can_step && 0)
1087 /* The pie board can't do steps so I can't test this, and
1088 the other code will always work. */
1090 send_rdp ("bbw-S-B",
1097 CORE_ADDR pc = read_register (ARM_PC_REGNUM);
1098 pc = arm_get_next_pc (pc);
1099 remote_rdp_insert_breakpoint (pc, handle);
1101 remote_rdp_remove_breakpoint (pc, handle);
1106 remote_rdp_open (char *args, int from_tty)
1111 error_no_arg ("serial port device name");
1115 target_preopen (from_tty);
1117 io = serial_open (args);
1120 perror_with_name (args);
1124 rdp_init (1, from_tty);
1129 printf_unfiltered ("Remote RDP debugging using %s at %d baud\n", args, baud_rate);
1134 /* Need to set up the vector interception state */
1135 rdp_catch_vectors ();
1138 ** If it's an EmbeddedICE, we need to set the processor config.
1139 ** Assume we can always have ARM7TDI...
1141 send_rdp ("bw-SB", RDP_INFO, RDP_INFO_ICEBREAKER, ¬_icebreaker);
1142 if (!not_icebreaker)
1144 const char *CPU = "ARM7TDI";
1146 int len = strlen (CPU);
1148 send_rdp ("bbbbw-p-SWZ",
1150 RDI_ConfigCPU, /* Aspect: set the CPU */
1151 len, /* The number of bytes in the name */
1152 RDI_MatchAny, /* We'll take whatever we get */
1153 0, /* We'll take whatever version's there */
1158 /* command line initialised on 'run' */
1160 push_target (&remote_rdp_ops);
1162 callback->init (callback);
1163 flush_cached_frames ();
1164 registers_changed ();
1165 stop_pc = read_pc ();
1166 set_current_frame (create_new_frame (read_fp (), stop_pc));
1167 select_frame (get_current_frame ());
1168 print_stack_frame (selected_frame, -1, 1);
1173 /* Close out all files and local state before this target loses control. */
1176 remote_rdp_close (int quitting)
1178 callback->shutdown (callback);
1185 /* Resume execution of the target process. STEP says whether to single-step
1186 or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
1187 to the target, or zero for no signal. */
1190 remote_rdp_resume (ptid_t ptid, int step, enum target_signal siggnal)
1198 /* Wait for inferior process to do something. Return pid of child,
1199 or -1 in case of error; store status through argument pointer STATUS,
1200 just as `wait' would. */
1203 remote_rdp_wait (ptid_t ptid, struct target_waitstatus *status)
1205 switch (ds.rdi_stopped_status)
1210 status->kind = TARGET_WAITKIND_EXITED;
1211 status->value.integer = read_register (0);
1213 case RDP_RES_AT_BREAKPOINT:
1214 status->kind = TARGET_WAITKIND_STOPPED;
1215 /* The signal in sigrc is a host signal. That probably
1217 status->value.sig = TARGET_SIGNAL_TRAP;
1221 status->kind = TARGET_WAITKIND_SIGNALLED;
1222 /* The signal in sigrc is a host signal. That probably
1224 status->value.sig = target_signal_from_host (sigrc);
1229 return inferior_ptid;
1232 /* Get ready to modify the registers array. On machines which store
1233 individual registers, this doesn't need to do anything. On machines
1234 which store all the registers in one fell swoop, this makes sure
1235 that registers contains all the registers from the program being
1239 remote_rdp_prepare_to_store (void)
1241 /* Do nothing, since we can store individual regs */
1244 /* Transfer LEN bytes between GDB address MYADDR and target address
1245 MEMADDR. If WRITE is non-zero, transfer them to the target,
1246 otherwise transfer them from the target. TARGET is unused.
1248 Returns the number of bytes transferred. */
1251 remote_rdp_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
1252 int write, struct mem_attrib *attrib,
1253 struct target_ops *target)
1255 /* I infer from D Taylor's code that there's a limit on the amount
1256 we can transfer in one chunk.. */
1261 int thisbite = len - done;
1262 if (thisbite > RDP_MOUTHFULL)
1263 thisbite = RDP_MOUTHFULL;
1269 justdone = rdp_write (memaddr + done, myaddr + done, thisbite);
1273 justdone = rdp_read (memaddr + done, myaddr + done, thisbite);
1278 if (justdone != thisbite)
1291 static struct yn stepinfo[] =
1293 {"Step more than one instruction", RDP_INFO_ABOUT_STEP_GT_1},
1294 {"Step to jump", RDP_INFO_ABOUT_STEP_TO_JMP},
1295 {"Step one instruction", RDP_INFO_ABOUT_STEP_1},
1299 static struct yn breakinfo[] =
1301 {"comparison breakpoints supported", RDP_INFO_ABOUT_BREAK_COMP},
1302 {"range breakpoints supported", RDP_INFO_ABOUT_BREAK_RANGE},
1303 {"watchpoints for byte reads supported", RDP_INFO_ABOUT_BREAK_BYTE_READ},
1304 {"watchpoints for half-word reads supported", RDP_INFO_ABOUT_BREAK_HALFWORD_READ},
1305 {"watchpoints for word reads supported", RDP_INFO_ABOUT_BREAK_WORD_READ},
1306 {"watchpoints for byte writes supported", RDP_INFO_ABOUT_BREAK_BYTE_WRITE},
1307 {"watchpoints for half-word writes supported", RDP_INFO_ABOUT_BREAK_HALFWORD_WRITE},
1308 {"watchpoints for word writes supported", RDP_INFO_ABOUT_BREAK_WORD_WRITE},
1309 {"mask break/watch-points supported", RDP_INFO_ABOUT_BREAK_MASK},
1310 {"thread-specific breakpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_BREAK},
1311 {"thread-specific watchpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_WATCH},
1312 {"conditional breakpoints supported", RDP_INFO_ABOUT_BREAK_COND},
1318 dump_bits (struct yn *t, int info)
1322 printf_unfiltered (" %-45s : %s\n", t->name, (info & t->bit) ? "Yes" : "No");
1328 remote_rdp_files_info (struct target_ops *target)
1330 printf_filtered ("Target capabilities:\n");
1331 dump_bits (stepinfo, ds.step_info);
1332 dump_bits (breakinfo, ds.break_info);
1333 printf_unfiltered ("target level RDI %x\n", (ds.target_info >> 5) & 3);
1338 remote_rdp_create_inferior (char *exec_file, char *allargs, char **env)
1340 CORE_ADDR entry_point;
1342 if (exec_file == 0 || exec_bfd == 0)
1343 error ("No executable file specified.");
1345 entry_point = (CORE_ADDR) bfd_get_start_address (exec_bfd);
1348 remove_breakpoints ();
1349 init_wait_for_inferior ();
1351 /* This gives us a chance to set up the command line */
1352 rdp_set_command_line (exec_file, allargs);
1354 inferior_ptid = pid_to_ptid (42);
1355 insert_breakpoints (); /* Needed to get correct instruction in cache */
1358 ** RDP targets don't provide any facility to set the top of memory,
1359 ** so we don't bother to look for MEMSIZE in the environment.
1363 proceed (entry_point, TARGET_SIGNAL_DEFAULT, 0);
1366 /* Attach doesn't need to do anything */
1368 remote_rdp_attach (char *args, int from_tty)
1373 /* Define the target subroutine names */
1375 struct target_ops remote_rdp_ops;
1378 init_remote_rdp_ops (void)
1380 remote_rdp_ops.to_shortname = "rdp";
1381 remote_rdp_ops.to_longname = "Remote Target using the RDProtocol";
1382 remote_rdp_ops.to_doc = "Use a remote ARM system which uses the ARM Remote Debugging Protocol";
1383 remote_rdp_ops.to_open = remote_rdp_open;
1384 remote_rdp_ops.to_close = remote_rdp_close;
1385 remote_rdp_ops.to_attach = remote_rdp_attach;
1386 remote_rdp_ops.to_resume = remote_rdp_resume;
1387 remote_rdp_ops.to_wait = remote_rdp_wait;
1388 remote_rdp_ops.to_fetch_registers = remote_rdp_fetch_register;
1389 remote_rdp_ops.to_store_registers = remote_rdp_store_register;
1390 remote_rdp_ops.to_prepare_to_store = remote_rdp_prepare_to_store;
1391 remote_rdp_ops.to_xfer_memory = remote_rdp_xfer_inferior_memory;
1392 remote_rdp_ops.to_files_info = remote_rdp_files_info;
1393 remote_rdp_ops.to_insert_breakpoint = remote_rdp_insert_breakpoint;
1394 remote_rdp_ops.to_remove_breakpoint = remote_rdp_remove_breakpoint;
1395 remote_rdp_ops.to_kill = remote_rdp_kill;
1396 remote_rdp_ops.to_load = generic_load;
1397 remote_rdp_ops.to_create_inferior = remote_rdp_create_inferior;
1398 remote_rdp_ops.to_mourn_inferior = generic_mourn_inferior;
1399 remote_rdp_ops.to_stratum = process_stratum;
1400 remote_rdp_ops.to_has_all_memory = 1;
1401 remote_rdp_ops.to_has_memory = 1;
1402 remote_rdp_ops.to_has_stack = 1;
1403 remote_rdp_ops.to_has_registers = 1;
1404 remote_rdp_ops.to_has_execution = 1;
1405 remote_rdp_ops.to_magic = OPS_MAGIC;
1409 _initialize_remote_rdp (void)
1411 init_remote_rdp_ops ();
1412 add_target (&remote_rdp_ops);