1 /* Target communications support for Macraigor Systems' On-Chip Debugging
2 Copyright 1996, 1997 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
23 #include "gdb_string.h"
33 #include "gdb-stabs.h"
35 #include <sys/types.h>
40 /* Prototypes for local functions */
42 static int ocd_read_bytes (CORE_ADDR memaddr, char *myaddr, int len);
44 static int ocd_start_remote (PTR dummy);
46 static int readchar (int timeout);
48 static void reset_packet (void);
50 static void output_packet (void);
52 static int get_quoted_char (int timeout);
54 static void put_quoted_char (int c);
56 static void ocd_interrupt (int signo);
58 static void ocd_interrupt_twice (int signo);
60 static void interrupt_query (void);
62 static unsigned char *ocd_do_command (int cmd, int *statusp, int *lenp);
64 static void ocd_put_packet (unsigned char *packet, int pktlen);
66 static unsigned char *ocd_get_packet (int cmd, int *pktlen, int timeout);
68 static struct target_ops *current_ops = NULL;
70 static int last_run_status;
72 /* This was 5 seconds, which is a long time to sit and wait.
73 Unless this is going though some terminal server or multiplexer or
74 other form of hairy serial connection, I would think 2 seconds would
78 /* FIXME: Change to allow option to set timeout value on a per target
80 static int remote_timeout = 2;
83 /* Descriptor for I/O to remote machine. Initialize it to NULL so that
84 ocd_open knows that we don't have a file open when the program
86 static serial_t ocd_desc = NULL;
89 ocd_error (s, error_code)
95 fputs_filtered (s, gdb_stderr);
96 fputs_filtered (" ", gdb_stderr);
107 s = "Cable disconnected";
110 s = "Couldn't enter OCD mode";
113 s = "Target stuck in reset";
116 s = "OCD hasn't been initialized";
119 s = "Write verify failed";
122 s = "Reg buff error (during MPC5xx fp reg read/write)";
125 s = "Invalid CPU register access attempt failed";
131 s = "Checksum error";
134 s = "Illegal command";
137 s = "Parameter error";
140 s = "Internal error";
143 s = "Flash erase error";
146 sprintf (buf, "Unknown error code %d", error_code);
153 /* Return nonzero if the thread TH is still alive on the remote system. */
156 ocd_thread_alive (th)
162 /* Clean up connection to a remote debugger. */
170 SERIAL_CLOSE (ocd_desc);
174 /* Stub for catch_errors. */
177 ocd_start_remote (dummy)
180 unsigned char buf[10], *p;
185 enum ocd_target_type target_type;
187 target_type = *(enum ocd_target_type *) dummy;
189 immediate_quit = 1; /* Allow user to interrupt it */
191 SERIAL_SEND_BREAK (ocd_desc); /* Wake up the wiggler */
193 speed = 80; /* Divide clock by 4000 */
197 buf[2] = speed & 0xff;
198 buf[3] = target_type;
199 ocd_put_packet (buf, 4); /* Init OCD params */
200 p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
203 error ("Truncated response packet from OCD device");
209 ocd_error ("OCD_INIT:", error_code);
211 ocd_do_command (OCD_AYT, &status, &pktlen);
213 p = ocd_do_command (OCD_GET_VERSION, &status, &pktlen);
215 printf_unfiltered ("[Wiggler version %x.%x, capability 0x%x]\n",
216 p[0], p[1], (p[2] << 16) | p[3]);
219 /* Reset the target */
221 ocd_do_command (OCD_RESET_RUN, &status, &pktlen);
222 /* ocd_do_command (OCD_RESET, &status, &pktlen); */
225 /* If processor is still running, stop it. */
227 if (!(status & OCD_FLAG_BDM))
231 /* When using a target box, we want to asynchronously return status when
232 target stops. The OCD_SET_CTL_FLAGS command is ignored by Wigglers.dll
233 when using a parallel Wiggler */
234 buf[0] = OCD_SET_CTL_FLAGS;
237 ocd_put_packet (buf, 3);
239 p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
242 error ("Truncated response packet from OCD device");
248 ocd_error ("OCD_SET_CTL_FLAGS:", error_code);
253 /* This is really the job of start_remote however, that makes an assumption
254 that the target is about to print out a status message of some sort. That
255 doesn't happen here (in fact, it may not be possible to get the monitor to
256 send the appropriate packet). */
258 flush_cached_frames ();
259 registers_changed ();
260 stop_pc = read_pc ();
261 set_current_frame (create_new_frame (read_fp (), stop_pc));
262 select_frame (get_current_frame (), 0);
263 print_stack_frame (selected_frame, -1, 1);
265 buf[0] = OCD_LOG_FILE;
266 buf[1] = 3; /* close existing WIGGLERS.LOG */
267 ocd_put_packet (buf, 2);
268 p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
270 buf[0] = OCD_LOG_FILE;
271 buf[1] = 2; /* append to existing WIGGLERS.LOG */
272 ocd_put_packet (buf, 2);
273 p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
278 /* Open a connection to a remote debugger.
279 NAME is the filename used for communication. */
281 static DCACHE *ocd_dcache;
284 ocd_open (name, from_tty, target_type, ops)
287 enum ocd_target_type target_type;
288 struct target_ops *ops;
290 unsigned char buf[10], *p;
294 error ("To open an OCD connection, you need to specify the\n\
295 device the OCD device is attached to (e.g. /dev/ttya).");
297 target_preopen (from_tty);
301 unpush_target (current_ops);
303 ocd_dcache = dcache_init (ocd_read_bytes, ocd_write_bytes);
305 if (strncmp (name, "wiggler", 7) == 0)
307 ocd_desc = SERIAL_OPEN ("ocd");
309 perror_with_name (name);
311 buf[0] = OCD_LOG_FILE;
312 buf[1] = 1; /* open new or overwrite existing WIGGLERS.LOG */
313 ocd_put_packet (buf, 2);
314 p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
316 buf[0] = OCD_SET_CONNECTION;
317 buf[1] = 0x01; /* atoi (name[11]); */
318 ocd_put_packet (buf, 2);
319 p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
322 /* not using Wigglers.dll */
324 ocd_desc = SERIAL_OPEN (name);
326 perror_with_name (name);
331 if (SERIAL_SETBAUDRATE (ocd_desc, baud_rate))
333 SERIAL_CLOSE (ocd_desc);
334 perror_with_name (name);
338 SERIAL_RAW (ocd_desc);
340 /* If there is something sitting in the buffer we might take it as a
341 response to a command, which would be bad. */
342 SERIAL_FLUSH_INPUT (ocd_desc);
346 puts_filtered ("Remote target wiggler connected to ");
347 puts_filtered (name);
348 puts_filtered ("\n");
350 push_target (current_ops); /* Switch to using remote target now */
352 /* Without this, some commands which require an active target (such as kill)
353 won't work. This variable serves (at least) double duty as both the pid
354 of the target process (if it has such), and as a flag indicating that a
355 target is active. These functions should be split out into seperate
356 variables, especially since GDB will someday have a notion of debugging
357 several processes. */
359 inferior_pid = 42000;
360 /* Start the remote connection; if error (0), discard this target.
361 In particular, if the user quits, be sure to discard it
362 (we'd be in an inconsistent state otherwise). */
363 if (!catch_errors (ocd_start_remote, &target_type,
364 "Couldn't establish connection to remote target\n",
368 error ("Failed to connect to OCD.");
372 /* This takes a program previously attached to and detaches it. After
373 this is done, GDB can be used to debug some other program. We
374 better not have left any breakpoints in the target program or it'll
375 die when it hits one. */
378 ocd_detach (args, from_tty)
383 error ("Argument given to \"detach\" when remotely debugging.");
387 puts_filtered ("Ending remote debugging.\n");
390 /* Tell the remote machine to resume. */
393 ocd_resume (pid, step, siggnal)
395 enum target_signal siggnal;
399 dcache_flush (ocd_dcache);
402 ocd_do_command (OCD_STEP, &last_run_status, &pktlen);
404 ocd_do_command (OCD_RUN, &last_run_status, &pktlen);
413 ocd_do_command (OCD_STOP, &status, &pktlen);
415 if (!(status & OCD_FLAG_BDM))
416 error ("Can't stop target via BDM");
419 static volatile int ocd_interrupt_flag;
421 /* Send ^C to target to halt it. Target will respond, and send us a
425 ocd_interrupt (signo)
428 /* If this doesn't work, try more severe steps. */
429 signal (signo, ocd_interrupt_twice);
432 printf_unfiltered ("ocd_interrupt called\n");
439 ocd_put_packet (buf, 1);
440 ocd_interrupt_flag = 1;
444 static void (*ofunc) ();
446 /* The user typed ^C twice. */
448 ocd_interrupt_twice (signo)
451 signal (signo, ofunc);
455 signal (signo, ocd_interrupt);
458 /* Ask the user what to do when an interrupt is received. */
463 target_terminal_ours ();
465 if (query ("Interrupted while waiting for the program.\n\
466 Give up (and stop debugging it)? "))
468 target_mourn_inferior ();
469 return_to_top_level (RETURN_QUIT);
472 target_terminal_inferior ();
475 /* If nonzero, ignore the next kill. */
476 static int kill_kludge;
478 /* Wait until the remote machine stops, then return,
479 storing status in STATUS just as `wait' would.
480 Returns "pid" (though it's not clear what, if anything, that
481 means in the case of this target). */
491 ocd_interrupt_flag = 0;
493 /* Target might already be stopped by the time we get here. */
494 /* If we aren't already stopped, we need to loop until we've dropped
495 back into BDM mode */
497 while (!(last_run_status & OCD_FLAG_BDM))
500 ocd_put_packet (buf, 1);
501 p = ocd_get_packet (OCD_AYT, &pktlen, -1);
503 ofunc = (void (*)()) signal (SIGINT, ocd_interrupt);
504 signal (SIGINT, ofunc);
507 error ("Truncated response packet from OCD device");
509 last_run_status = p[1];
513 ocd_error ("target_wait:", error_code);
515 if (last_run_status & OCD_FLAG_PWF)
516 error ("OCD device lost VCC at BDM interface.");
517 else if (last_run_status & OCD_FLAG_CABLE_DISC)
518 error ("OCD device cable appears to have been disconnected.");
521 if (ocd_interrupt_flag)
527 /* Read registers from the OCD device. Specify the starting and ending
528 register number. Return the number of regs actually read in *NUMREGS.
529 Returns a pointer to a static array containing the register contents. */
532 ocd_read_bdm_registers (first_bdm_regno, last_bdm_regno, reglen)
537 unsigned char buf[10];
541 int error_code, status;
544 buf[0] = OCD_READ_REGS;
545 buf[1] = first_bdm_regno >> 8;
546 buf[2] = first_bdm_regno & 0xff;
547 buf[3] = last_bdm_regno >> 8;
548 buf[4] = last_bdm_regno & 0xff;
550 ocd_put_packet (buf, 5);
551 p = ocd_get_packet (OCD_READ_REGS, &pktlen, remote_timeout);
557 ocd_error ("read_bdm_registers:", error_code);
565 error ("Register block size bad: %d", i);
574 /* Read register BDM_REGNO and returns its value ala read_register() */
577 ocd_read_bdm_register (bdm_regno)
584 p = ocd_read_bdm_registers (bdm_regno, bdm_regno, ®len);
585 regval = extract_unsigned_integer (p, reglen);
591 ocd_write_bdm_registers (first_bdm_regno, regptr, reglen)
593 unsigned char *regptr;
598 int error_code, status;
601 buf = alloca (4 + reglen);
603 buf[0] = OCD_WRITE_REGS;
604 buf[1] = first_bdm_regno >> 8;
605 buf[2] = first_bdm_regno & 0xff;
607 memcpy (buf + 4, regptr, reglen);
609 ocd_put_packet (buf, 4 + reglen);
610 p = ocd_get_packet (OCD_WRITE_REGS, &pktlen, remote_timeout);
613 error ("Truncated response packet from OCD device");
619 ocd_error ("ocd_write_bdm_registers:", error_code);
623 ocd_write_bdm_register (bdm_regno, reg)
627 unsigned char buf[4];
629 store_unsigned_integer (buf, 4, reg);
631 ocd_write_bdm_registers (bdm_regno, buf, 4);
635 ocd_prepare_to_store ()
639 /* Write memory data directly to the remote machine.
640 This does not inform the data cache; the data cache uses this.
641 MEMADDR is the address in the remote memory space.
642 MYADDR is the address of the buffer in our space.
643 LEN is the number of bytes.
645 Returns number of bytes transferred, or 0 for error. */
647 static int write_mem_command = OCD_WRITE_MEM;
650 ocd_write_bytes (memaddr, myaddr, len)
661 buf[0] = write_mem_command;
662 buf[5] = 1; /* Write as bytes */
663 buf[6] = 0; /* Don't verify */
669 int status, error_code;
671 numbytes = min (len, 256 - 8);
673 buf[1] = memaddr >> 24;
674 buf[2] = memaddr >> 16;
675 buf[3] = memaddr >> 8;
680 memcpy (&buf[8], myaddr, numbytes);
681 ocd_put_packet (buf, 8 + numbytes);
682 p = ocd_get_packet (OCD_WRITE_MEM, &pktlen, remote_timeout);
684 error ("Truncated response packet from OCD device");
689 if (error_code == 0x11) /* Got a bus error? */
691 CORE_ADDR error_address;
693 error_address = p[3] << 24;
694 error_address |= p[4] << 16;
695 error_address |= p[5] << 8;
696 error_address |= p[6];
697 numbytes = error_address - memaddr;
705 else if (error_code != 0)
706 ocd_error ("ocd_write_bytes:", error_code);
713 return origlen - len;
716 /* Read memory data directly from the remote machine.
717 This does not use the data cache; the data cache uses this.
718 MEMADDR is the address in the remote memory space.
719 MYADDR is the address of the buffer in our space.
720 LEN is the number of bytes.
722 Returns number of bytes transferred, or 0 for error. */
725 ocd_read_bytes (memaddr, myaddr, len)
736 buf[0] = OCD_READ_MEM;
737 buf[5] = 1; /* Read as bytes */
743 int status, error_code;
745 numbytes = min (len, 256 - 7);
747 buf[1] = memaddr >> 24;
748 buf[2] = memaddr >> 16;
749 buf[3] = memaddr >> 8;
754 ocd_put_packet (buf, 7);
755 p = ocd_get_packet (OCD_READ_MEM, &pktlen, remote_timeout);
757 error ("Truncated response packet from OCD device");
762 if (error_code == 0x11) /* Got a bus error? */
764 CORE_ADDR error_address;
766 error_address = p[3] << 24;
767 error_address |= p[4] << 16;
768 error_address |= p[5] << 8;
769 error_address |= p[6];
770 numbytes = error_address - memaddr;
778 else if (error_code != 0)
779 ocd_error ("ocd_read_bytes:", error_code);
781 memcpy (myaddr, &p[4], numbytes);
788 return origlen - len;
791 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
792 to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
793 nonzero. Returns length of data written or read; 0 for error. */
797 ocd_xfer_memory (memaddr, myaddr, len, should_write, target)
802 struct target_ops *target; /* ignored */
804 return dcache_xfer_memory (ocd_dcache, memaddr, myaddr, len, should_write);
808 ocd_files_info (ignore)
809 struct target_ops *ignore;
811 puts_filtered ("Debugging a target over a serial line.\n");
814 /* Stuff for dealing with the packets which are part of this protocol.
815 See comment at top of file for details. */
817 /* Read a single character from the remote side, handling wierd errors. */
825 ch = SERIAL_READCHAR (ocd_desc, timeout);
830 error ("Remote connection closed");
832 perror_with_name ("Remote communication error");
840 /* Read a character from the data stream, dequoting as necessary. SYN is
841 treated special. Any SYNs appearing in the data stream are returned as the
842 distinct value RAW_SYN (which has a value > 8 bits and therefore cannot be
843 mistaken for real data). */
846 get_quoted_char (timeout)
851 ch = readchar (timeout);
856 error ("Timeout in mid-packet, aborting");
860 ch = readchar (timeout);
869 static unsigned char pkt[256 * 2 + 10], *pktp; /* Worst case */
880 if (SERIAL_WRITE (ocd_desc, pkt, pktp - pkt))
881 perror_with_name ("output_packet: write failed");
886 /* Output a quoted character. SYNs and DLEs are quoted. Everything else goes
887 through untouched. */
904 /* Send a packet to the OCD device. The packet framed by a SYN character,
905 a byte count and a checksum. The byte count only counts the number of
906 bytes between the count and the checksum. A count of zero actually
907 means 256. Any SYNs within the packet (including the checksum and
908 count) must be quoted. The quote character must be quoted as well.
909 Quoting is done by replacing the character with the two-character sequence
910 DLE, {char} | 0100. Note that the quoting mechanism has no effect on the
914 stu_put_packet (buf, len)
918 unsigned char checksum;
921 if (len == 0 || len > 256)
922 abort (); /* Can't represent 0 length packet */
928 put_quoted_char (RAW_SYN);
942 put_quoted_char (-checksum & 0xff);
949 /* Send a packet to the OCD device. The packet framed by a SYN character,
950 a byte count and a checksum. The byte count only counts the number of
951 bytes between the count and the checksum. A count of zero actually
952 means 256. Any SYNs within the packet (including the checksum and
953 count) must be quoted. The quote character must be quoted as well.
954 Quoting is done by replacing the character with the two-character sequence
955 DLE, {char} | 0100. Note that the quoting mechanism has no effect on the
959 ocd_put_packet (buf, len)
963 unsigned char checksum;
965 unsigned char *packet, *packet_ptr;
967 packet = alloca (len + 1 + 1); /* packet + SYN + checksum */
972 *packet_ptr++ = 0x55;
982 *packet_ptr++ = -checksum;
983 if (SERIAL_WRITE (ocd_desc, packet, packet_ptr - packet))
984 perror_with_name ("output_packet: write failed");
989 /* Get a packet from the OCD device. Timeout is only enforced for the
990 first byte of the packet. Subsequent bytes are expected to arrive in
991 time <= remote_timeout. Returns a pointer to a static buffer containing
992 the payload of the packet. *LENP contains the length of the packet.
995 static unsigned char *
996 stu_get_packet (cmd, lenp, timeout)
1002 static unsigned char buf[256 + 10], *p;
1003 unsigned char checksum;
1007 ch = get_quoted_char (timeout);
1010 error ("get_packet (readchar): %d", ch);
1015 found_syn: /* Found the start of a packet */
1020 len = get_quoted_char (remote_timeout);
1030 len++; /* Include checksum */
1034 ch = get_quoted_char (remote_timeout);
1046 error ("Response phase error. Got 0x%x, expected 0x%x", buf[0], cmd);
1048 *lenp = p - buf - 1;
1054 /* Get a packet from the OCD device. Timeout is only enforced for the
1055 first byte of the packet. Subsequent bytes are expected to arrive in
1056 time <= remote_timeout. Returns a pointer to a static buffer containing
1057 the payload of the packet. *LENP contains the length of the packet.
1060 static unsigned char *
1061 ocd_get_packet (cmd, lenp, timeout)
1067 static unsigned char packet[512];
1068 unsigned char *packet_ptr;
1069 unsigned char checksum;
1071 ch = readchar (timeout);
1074 error ("ocd_get_packet (readchar): %d", ch);
1077 error ("ocd_get_packet (readchar): %d", ch);
1079 /* Found the start of a packet */
1081 packet_ptr = packet;
1084 /* Read command char. That sort of tells us how long the packet is. */
1086 ch = readchar (timeout);
1089 error ("ocd_get_packet (readchar): %d", ch);
1096 ch = readchar (timeout);
1099 error ("ocd_get_packet (readchar): %d", ch);
1103 /* Get error code. */
1105 ch = readchar (timeout);
1108 error ("ocd_get_packet (readchar): %d", ch);
1112 switch (ch) /* Figure out length of packet */
1114 case 0x7: /* Write verify error? */
1115 len = 8; /* write address, value read back */
1117 case 0x11: /* Bus error? */
1118 /* write address, read flag */
1119 case 0x15: /* Internal error */
1120 len = 5; /* error code, vector */
1122 default: /* Error w/no params */
1125 case 0x0: /* Normal result */
1128 case OCD_AYT: /* Are You There? */
1129 case OCD_SET_BAUD_RATE: /* Set Baud Rate */
1130 case OCD_INIT: /* Initialize OCD device */
1131 case OCD_SET_SPEED: /* Set Speed */
1132 case OCD_SET_FUNC_CODE: /* Set Function Code */
1133 case OCD_SET_CTL_FLAGS: /* Set Control Flags */
1134 case OCD_SET_BUF_ADDR: /* Set Register Buffer Address */
1135 case OCD_RUN: /* Run Target from PC */
1136 case OCD_RUN_ADDR: /* Run Target from Specified Address */
1137 case OCD_STOP: /* Stop Target */
1138 case OCD_RESET_RUN: /* Reset Target and Run */
1139 case OCD_RESET: /* Reset Target and Halt */
1140 case OCD_STEP: /* Single Step */
1141 case OCD_WRITE_REGS: /* Write Register */
1142 case OCD_WRITE_MEM: /* Write Memory */
1143 case OCD_FILL_MEM: /* Fill Memory */
1144 case OCD_MOVE_MEM: /* Move Memory */
1145 case OCD_WRITE_INT_MEM: /* Write Internal Memory */
1146 case OCD_JUMP: /* Jump to Subroutine */
1147 case OCD_ERASE_FLASH: /* Erase flash memory */
1148 case OCD_PROGRAM_FLASH: /* Write flash memory */
1149 case OCD_EXIT_MON: /* Exit the flash programming monitor */
1150 case OCD_ENTER_MON: /* Enter the flash programming monitor */
1151 case OCD_LOG_FILE: /* Make Wigglers.dll save Wigglers.log */
1152 case OCD_SET_CONNECTION: /* Set type of connection in Wigglers.dll */
1155 case OCD_GET_VERSION: /* Get Version */
1158 case OCD_GET_STATUS_MASK: /* Get Status Mask */
1161 case OCD_GET_CTRS: /* Get Error Counters */
1162 case OCD_READ_REGS: /* Read Register */
1163 case OCD_READ_MEM: /* Read Memory */
1164 case OCD_READ_INT_MEM: /* Read Internal Memory */
1168 error ("ocd_get_packet: unknown packet type 0x%x\n", ch);
1172 if (len == 257) /* Byte stream? */
1173 { /* Yes, byte streams contain the length */
1174 ch = readchar (timeout);
1177 error ("ocd_get_packet (readchar): %d", ch);
1185 while (len-- >= 0) /* Do rest of packet and checksum */
1187 ch = readchar (timeout);
1190 error ("ocd_get_packet (readchar): %d", ch);
1196 error ("ocd_get_packet: bad packet checksum");
1198 if (cmd != -1 && cmd != packet[0])
1199 error ("Response phase error. Got 0x%x, expected 0x%x", packet[0], cmd);
1201 *lenp = packet_ptr - packet - 1; /* Subtract checksum byte */
1206 /* Execute a simple (one-byte) command. Returns a pointer to the data
1207 following the error code. */
1209 static unsigned char *
1210 ocd_do_command (cmd, statusp, lenp)
1215 unsigned char buf[100], *p;
1216 int status, error_code;
1219 unsigned char logbuf[100];
1223 ocd_put_packet (buf, 1); /* Send command */
1224 p = ocd_get_packet (*buf, lenp, remote_timeout);
1227 error ("Truncated response packet from OCD device");
1232 if (error_code != 0)
1234 sprintf (errbuf, "ocd_do_command (0x%x):", cmd);
1235 ocd_error (errbuf, error_code);
1238 if (status & OCD_FLAG_PWF)
1239 error ("OCD device can't detect VCC at BDM interface.");
1240 else if (status & OCD_FLAG_CABLE_DISC)
1241 error ("BDM cable appears to be disconnected.");
1245 logbuf[0] = OCD_LOG_FILE;
1246 logbuf[1] = 3; /* close existing WIGGLERS.LOG */
1247 ocd_put_packet (logbuf, 2);
1248 ocd_get_packet (logbuf[0], &logpktlen, remote_timeout);
1250 logbuf[0] = OCD_LOG_FILE;
1251 logbuf[1] = 2; /* append to existing WIGGLERS.LOG */
1252 ocd_put_packet (logbuf, 2);
1253 ocd_get_packet (logbuf[0], &logpktlen, remote_timeout);
1261 /* For some mysterious reason, wait_for_inferior calls kill instead of
1262 mourn after it gets TARGET_WAITKIND_SIGNALLED. Work around it. */
1266 target_mourn_inferior ();
1270 /* Don't wait for it to die. I'm not really sure it matters whether
1272 target_mourn_inferior ();
1278 unpush_target (current_ops);
1279 generic_mourn_inferior ();
1282 /* All we actually do is set the PC to the start address of exec_bfd, and start
1283 the program at that point. */
1286 ocd_create_inferior (exec_file, args, env)
1291 if (args && (*args != '\000'))
1292 error ("Args are not supported by BDM.");
1294 clear_proceed_status ();
1295 proceed (bfd_get_start_address (exec_bfd), TARGET_SIGNAL_0, 0);
1299 ocd_load (args, from_tty)
1303 generic_load (args, from_tty);
1307 /* This is necessary because many things were based on the PC at the time that
1308 we attached to the monitor, which is no longer valid now that we have loaded
1309 new code (and just changed the PC). Another way to do this might be to call
1310 normal_stop, except that the stack may not be valid, and things would get
1311 horribly confused... */
1313 clear_symtab_users ();
1316 /* This should be defined for each target */
1317 /* But we want to be able to compile this file for some configurations
1318 not yet supported fully */
1320 #define BDM_BREAKPOINT {0x0,0x0,0x0,0x0} /* For ppc 8xx */
1322 #define BDM_BREAKPOINT {0x4a,0xfa} /* BGND insn used for CPU32 */
1325 /* BDM (at least on CPU32) uses a different breakpoint */
1328 ocd_insert_breakpoint (addr, contents_cache)
1330 char *contents_cache;
1332 static char break_insn[] = BDM_BREAKPOINT;
1335 val = target_read_memory (addr, contents_cache, sizeof (break_insn));
1338 val = target_write_memory (addr, break_insn, sizeof (break_insn));
1344 ocd_remove_breakpoint (addr, contents_cache)
1346 char *contents_cache;
1348 static char break_insn[] = BDM_BREAKPOINT;
1351 val = target_write_memory (addr, contents_cache, sizeof (break_insn));
1357 bdm_command (args, from_tty)
1361 error ("bdm command must be followed by `reset'");
1365 bdm_reset_command (args, from_tty)
1372 error ("Not connected to OCD device.");
1374 ocd_do_command (OCD_RESET, &status, &pktlen);
1375 dcache_flush (ocd_dcache);
1376 registers_changed ();
1380 bdm_restart_command (args, from_tty)
1387 error ("Not connected to OCD device.");
1389 ocd_do_command (OCD_RESET_RUN, &status, &pktlen);
1390 last_run_status = status;
1391 clear_proceed_status ();
1392 wait_for_inferior ();
1396 /* Temporary replacement for target_store_registers(). This prevents
1397 generic_load from trying to set the PC. */
1400 noop_store_registers (regno)
1406 bdm_update_flash_command (args, from_tty)
1411 struct cleanup *old_chain;
1412 void (*store_registers_tmp) (int);
1415 error ("Not connected to OCD device.");
1418 error ("Must specify file containing new OCD code.");
1420 /* old_chain = make_cleanup (flash_cleanup, 0); */
1422 ocd_do_command (OCD_ENTER_MON, &status, &pktlen);
1424 ocd_do_command (OCD_ERASE_FLASH, &status, &pktlen);
1426 write_mem_command = OCD_PROGRAM_FLASH;
1427 store_registers_tmp = current_target.to_store_registers;
1428 current_target.to_store_registers = noop_store_registers;
1430 generic_load (args, from_tty);
1432 current_target.to_store_registers = store_registers_tmp;
1433 write_mem_command = OCD_WRITE_MEM;
1435 ocd_do_command (OCD_EXIT_MON, &status, &pktlen);
1437 /* discard_cleanups (old_chain); */
1441 bdm_read_register_command (args, from_tty)
1445 /* XXX repeat should go on to the next register */
1448 error ("Not connected to OCD device.");
1451 error ("Must specify BDM register number.");
1456 _initialize_remote_ocd ()
1458 extern struct cmd_list_element *cmdlist;
1459 static struct cmd_list_element *ocd_cmd_list = NULL;
1461 add_show_from_set (add_set_cmd ("remotetimeout", no_class,
1462 var_integer, (char *) &remote_timeout,
1463 "Set timeout value for remote read.\n", &setlist),
1466 add_prefix_cmd ("ocd", class_obscure, bdm_command, "", &ocd_cmd_list, "ocd ",
1469 add_cmd ("reset", class_obscure, bdm_reset_command, "", &ocd_cmd_list);
1470 add_cmd ("restart", class_obscure, bdm_restart_command, "", &ocd_cmd_list);
1471 add_cmd ("update-flash", class_obscure, bdm_update_flash_command, "", &ocd_cmd_list);
1472 /* add_cmd ("read-register", class_obscure, bdm_read_register_command, "", &ocd_cmd_list); */