2007-06-13 Mike Frysinger <vapier@gentoo.org>
[deliverable/binutils-gdb.git] / gdb / remote-m32r-sdi.c
1 /* Remote debugging interface for M32R/SDI.
2
3 Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4
5 Contributed by Renesas Technology Co.
6 Written by Kei Sakamoto <sakamoto.kei@renesas.com>.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 Boston, MA 02110-1301, USA. */
24
25 #include "defs.h"
26 #include "gdbcmd.h"
27 #include "gdbcore.h"
28 #include "inferior.h"
29 #include "target.h"
30 #include "regcache.h"
31 #include "gdb_string.h"
32 #include <ctype.h>
33 #include <signal.h>
34 #ifdef __MINGW32__
35 #include <winsock.h>
36 #else
37 #include <netinet/in.h>
38 #endif
39 #include <sys/types.h>
40 #include <sys/time.h>
41 #include <signal.h>
42 #include <time.h>
43
44
45 #include "serial.h"
46
47 /* Descriptor for I/O to remote machine. */
48
49 static struct serial *sdi_desc = NULL;
50
51 #define SDI_TIMEOUT 30
52
53
54 #define SDIPORT 3232
55
56 static char chip_name[64];
57
58 static int step_mode;
59 static unsigned long last_pc_addr = 0xffffffff;
60 static unsigned char last_pc_addr_data[2];
61
62 static int mmu_on = 0;
63
64 static int use_ib_breakpoints = 1;
65
66 #define MAX_BREAKPOINTS 1024
67 static int max_ib_breakpoints;
68 static unsigned long bp_address[MAX_BREAKPOINTS];
69 static unsigned char bp_data[MAX_BREAKPOINTS][4];
70
71 /* dbt -> nop */
72 static const unsigned char dbt_bp_entry[] = {
73 0x10, 0xe0, 0x70, 0x00
74 };
75
76 #define MAX_ACCESS_BREAKS 4
77 static int max_access_breaks;
78 static unsigned long ab_address[MAX_ACCESS_BREAKS];
79 static unsigned int ab_type[MAX_ACCESS_BREAKS];
80 static unsigned int ab_size[MAX_ACCESS_BREAKS];
81 static CORE_ADDR hit_watchpoint_addr = 0;
82
83 static int interrupted = 0;
84
85 /* Forward data declarations */
86 extern struct target_ops m32r_ops;
87
88
89 /* Commands */
90 #define SDI_OPEN 1
91 #define SDI_CLOSE 2
92 #define SDI_RELEASE 3
93 #define SDI_READ_CPU_REG 4
94 #define SDI_WRITE_CPU_REG 5
95 #define SDI_READ_MEMORY 6
96 #define SDI_WRITE_MEMORY 7
97 #define SDI_EXEC_CPU 8
98 #define SDI_STOP_CPU 9
99 #define SDI_WAIT_FOR_READY 10
100 #define SDI_GET_ATTR 11
101 #define SDI_SET_ATTR 12
102 #define SDI_STATUS 13
103
104 /* Attributes */
105 #define SDI_ATTR_NAME 1
106 #define SDI_ATTR_BRK 2
107 #define SDI_ATTR_ABRK 3
108 #define SDI_ATTR_CACHE 4
109 #define SDI_CACHE_TYPE_M32102 0
110 #define SDI_CACHE_TYPE_CHAOS 1
111 #define SDI_ATTR_MEM_ACCESS 5
112 #define SDI_MEM_ACCESS_DEBUG_DMA 0
113 #define SDI_MEM_ACCESS_MON_CODE 1
114
115 /* Registers */
116 #define SDI_REG_R0 0
117 #define SDI_REG_R1 1
118 #define SDI_REG_R2 2
119 #define SDI_REG_R3 3
120 #define SDI_REG_R4 4
121 #define SDI_REG_R5 5
122 #define SDI_REG_R6 6
123 #define SDI_REG_R7 7
124 #define SDI_REG_R8 8
125 #define SDI_REG_R9 9
126 #define SDI_REG_R10 10
127 #define SDI_REG_R11 11
128 #define SDI_REG_R12 12
129 #define SDI_REG_FP 13
130 #define SDI_REG_LR 14
131 #define SDI_REG_SP 15
132 #define SDI_REG_PSW 16
133 #define SDI_REG_CBR 17
134 #define SDI_REG_SPI 18
135 #define SDI_REG_SPU 19
136 #define SDI_REG_CR4 20
137 #define SDI_REG_EVB 21
138 #define SDI_REG_BPC 22
139 #define SDI_REG_CR7 23
140 #define SDI_REG_BBPSW 24
141 #define SDI_REG_CR9 25
142 #define SDI_REG_CR10 26
143 #define SDI_REG_CR11 27
144 #define SDI_REG_CR12 28
145 #define SDI_REG_WR 29
146 #define SDI_REG_BBPC 30
147 #define SDI_REG_PBP 31
148 #define SDI_REG_ACCH 32
149 #define SDI_REG_ACCL 33
150 #define SDI_REG_ACC1H 34
151 #define SDI_REG_ACC1L 35
152
153
154 /* Low level communication functions */
155
156 /* Check an ack packet from the target */
157 static int
158 get_ack (void)
159 {
160 int c;
161
162 if (!sdi_desc)
163 return -1;
164
165 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
166
167 if (c < 0)
168 return -1;
169
170 if (c != '+') /* error */
171 return -1;
172
173 return 0;
174 }
175
176 /* Send data to the target and check an ack packet */
177 static int
178 send_data (void *buf, int len)
179 {
180 int ret;
181
182 if (!sdi_desc)
183 return -1;
184
185 if (serial_write (sdi_desc, buf, len) != 0)
186 return -1;
187
188 if (get_ack () == -1)
189 return -1;
190
191 return len;
192 }
193
194 /* Receive data from the target */
195 static int
196 recv_data (void *buf, int len)
197 {
198 int total = 0;
199 int c;
200
201 if (!sdi_desc)
202 return -1;
203
204 while (total < len)
205 {
206 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
207
208 if (c < 0)
209 return -1;
210
211 ((unsigned char *) buf)[total++] = c;
212 }
213
214 return len;
215 }
216
217 /* Store unsigned long parameter on packet */
218 static void
219 store_long_parameter (void *buf, long val)
220 {
221 val = htonl (val);
222 memcpy (buf, &val, 4);
223 }
224
225 static int
226 send_cmd (unsigned char cmd)
227 {
228 unsigned char buf[1];
229 buf[0] = cmd;
230 return send_data (buf, 1);
231 }
232
233 static int
234 send_one_arg_cmd (unsigned char cmd, unsigned char arg1)
235 {
236 unsigned char buf[2];
237 buf[0] = cmd;
238 buf[1] = arg1;
239 return send_data (buf, 2);
240 }
241
242 static int
243 send_two_arg_cmd (unsigned char cmd, unsigned char arg1, unsigned long arg2)
244 {
245 unsigned char buf[6];
246 buf[0] = cmd;
247 buf[1] = arg1;
248 store_long_parameter (buf + 2, arg2);
249 return send_data (buf, 6);
250 }
251
252 static int
253 send_three_arg_cmd (unsigned char cmd, unsigned long arg1, unsigned long arg2,
254 unsigned long arg3)
255 {
256 unsigned char buf[13];
257 buf[0] = cmd;
258 store_long_parameter (buf + 1, arg1);
259 store_long_parameter (buf + 5, arg2);
260 store_long_parameter (buf + 9, arg3);
261 return send_data (buf, 13);
262 }
263
264 static unsigned char
265 recv_char_data (void)
266 {
267 unsigned char val;
268 recv_data (&val, 1);
269 return val;
270 }
271
272 static unsigned long
273 recv_long_data (void)
274 {
275 unsigned long val;
276 recv_data (&val, 4);
277 return ntohl (val);
278 }
279
280
281 /* Check if MMU is on */
282 static void
283 check_mmu_status (void)
284 {
285 unsigned long val;
286
287 /* Read PC address */
288 if (send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BPC) == -1)
289 return;
290 val = recv_long_data ();
291 if ((val & 0xc0000000) == 0x80000000)
292 {
293 mmu_on = 1;
294 return;
295 }
296
297 /* Read EVB address */
298 if (send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_EVB) == -1)
299 return;
300 val = recv_long_data ();
301 if ((val & 0xc0000000) == 0x80000000)
302 {
303 mmu_on = 1;
304 return;
305 }
306
307 mmu_on = 0;
308 }
309
310
311 /* This is called not only when we first attach, but also when the
312 user types "run" after having attached. */
313 static void
314 m32r_create_inferior (char *execfile, char *args, char **env, int from_tty)
315 {
316 CORE_ADDR entry_pt;
317
318 if (args && *args)
319 error (_("Cannot pass arguments to remote STDEBUG process"));
320
321 if (execfile == 0 || exec_bfd == 0)
322 error (_("No executable file specified"));
323
324 if (remote_debug)
325 fprintf_unfiltered (gdb_stdlog, "m32r_create_inferior(%s,%s)\n", execfile,
326 args);
327
328 entry_pt = bfd_get_start_address (exec_bfd);
329
330 /* The "process" (board) is already stopped awaiting our commands, and
331 the program is already downloaded. We just set its PC and go. */
332
333 clear_proceed_status ();
334
335 /* Tell wait_for_inferior that we've started a new process. */
336 init_wait_for_inferior ();
337
338 /* Set up the "saved terminal modes" of the inferior
339 based on what modes we are starting it with. */
340 target_terminal_init ();
341
342 /* Install inferior's terminal modes. */
343 target_terminal_inferior ();
344
345 write_pc (entry_pt);
346 }
347
348 /* Open a connection to a remote debugger.
349 NAME is the filename used for communication. */
350
351 static void
352 m32r_open (char *args, int from_tty)
353 {
354 struct hostent *host_ent;
355 struct sockaddr_in server_addr;
356 char *port_str, hostname[256];
357 int port;
358 int i, n;
359 int yes = 1;
360
361 if (remote_debug)
362 fprintf_unfiltered (gdb_stdlog, "m32r_open(%d)\n", from_tty);
363
364 target_preopen (from_tty);
365
366 push_target (&m32r_ops);
367
368 if (args == NULL)
369 sprintf (hostname, "localhost:%d", SDIPORT);
370 else
371 {
372 port_str = strchr (args, ':');
373 if (port_str == NULL)
374 sprintf (hostname, "%s:%d", args, SDIPORT);
375 else
376 strcpy (hostname, args);
377 }
378
379 sdi_desc = serial_open (hostname);
380 if (!sdi_desc)
381 error (_("Connection refused."));
382
383 if (get_ack () == -1)
384 error (_("Cannot connect to SDI target."));
385
386 if (send_cmd (SDI_OPEN) == -1)
387 error (_("Cannot connect to SDI target."));
388
389 /* Get maximum number of ib breakpoints */
390 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_BRK);
391 max_ib_breakpoints = recv_char_data ();
392 if (remote_debug)
393 printf_filtered ("Max IB Breakpoints = %d\n", max_ib_breakpoints);
394
395 /* Initialize breakpoints. */
396 for (i = 0; i < MAX_BREAKPOINTS; i++)
397 bp_address[i] = 0xffffffff;
398
399 /* Get maximum number of access breaks. */
400 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_ABRK);
401 max_access_breaks = recv_char_data ();
402 if (remote_debug)
403 printf_filtered ("Max Access Breaks = %d\n", max_access_breaks);
404
405 /* Initialize access breask. */
406 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
407 ab_address[i] = 0x00000000;
408
409 check_mmu_status ();
410
411 /* Get the name of chip on target board. */
412 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_NAME);
413 recv_data (chip_name, 64);
414
415 if (from_tty)
416 printf_filtered ("Remote %s connected to %s\n", target_shortname,
417 chip_name);
418 }
419
420 /* Close out all files and local state before this target loses control. */
421
422 static void
423 m32r_close (int quitting)
424 {
425 if (remote_debug)
426 fprintf_unfiltered (gdb_stdlog, "m32r_close(%d)\n", quitting);
427
428 if (sdi_desc)
429 {
430 send_cmd (SDI_CLOSE);
431 serial_close (sdi_desc);
432 sdi_desc = NULL;
433 }
434
435 inferior_ptid = null_ptid;
436 return;
437 }
438
439 /* Tell the remote machine to resume. */
440
441 static void
442 m32r_resume (ptid_t ptid, int step, enum target_signal sig)
443 {
444 unsigned long pc_addr, bp_addr, ab_addr;
445 int ib_breakpoints;
446 unsigned char buf[13];
447 int i;
448
449 if (remote_debug)
450 {
451 if (step)
452 fprintf_unfiltered (gdb_stdlog, "\nm32r_resume(step)\n");
453 else
454 fprintf_unfiltered (gdb_stdlog, "\nm32r_resume(cont)\n");
455 }
456
457 check_mmu_status ();
458
459 pc_addr = read_pc ();
460 if (remote_debug)
461 fprintf_unfiltered (gdb_stdlog, "pc <= 0x%lx\n", pc_addr);
462
463 /* At pc address there is a parallel instruction with +2 offset,
464 so we have to make it a serial instruction or avoid it. */
465 if (pc_addr == last_pc_addr)
466 {
467 /* Avoid a parallel nop. */
468 if (last_pc_addr_data[0] == 0xf0 && last_pc_addr_data[1] == 0x00)
469 {
470 pc_addr += 2;
471 /* Now we can forget this instruction. */
472 last_pc_addr = 0xffffffff;
473 }
474 /* Clear a parallel bit. */
475 else
476 {
477 buf[0] = SDI_WRITE_MEMORY;
478 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
479 store_long_parameter (buf + 1, pc_addr);
480 else
481 store_long_parameter (buf + 1, pc_addr - 1);
482 store_long_parameter (buf + 5, 1);
483 buf[9] = last_pc_addr_data[0] & 0x7f;
484 send_data (buf, 10);
485 }
486 }
487
488 /* Set PC. */
489 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BPC, pc_addr);
490
491 /* step mode. */
492 step_mode = step;
493 if (step)
494 {
495 /* Set PBP. */
496 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PBP, pc_addr | 1);
497 }
498 else
499 {
500 /* Unset PBP. */
501 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PBP, 0x00000000);
502 }
503
504 if (use_ib_breakpoints)
505 ib_breakpoints = max_ib_breakpoints;
506 else
507 ib_breakpoints = 0;
508
509 /* Set ib breakpoints. */
510 for (i = 0; i < ib_breakpoints; i++)
511 {
512 bp_addr = bp_address[i];
513
514 if (bp_addr == 0xffffffff)
515 continue;
516
517 /* Set PBP. */
518 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
519 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8000 + 4 * i, 4,
520 0x00000006);
521 else
522 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8000 + 4 * i, 4,
523 0x06000000);
524
525 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8080 + 4 * i, 4, bp_addr);
526 }
527
528 /* Set dbt breakpoints. */
529 for (i = ib_breakpoints; i < MAX_BREAKPOINTS; i++)
530 {
531 bp_addr = bp_address[i];
532
533 if (bp_addr == 0xffffffff)
534 continue;
535
536 if (!mmu_on)
537 bp_addr &= 0x7fffffff;
538
539 /* Write DBT instruction. */
540 buf[0] = SDI_WRITE_MEMORY;
541 store_long_parameter (buf + 1, (bp_addr & 0xfffffffc));
542 store_long_parameter (buf + 5, 4);
543 if ((bp_addr & 2) == 0 && bp_addr != (pc_addr & 0xfffffffc))
544 {
545 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
546 {
547 buf[9] = dbt_bp_entry[0];
548 buf[10] = dbt_bp_entry[1];
549 buf[11] = dbt_bp_entry[2];
550 buf[12] = dbt_bp_entry[3];
551 }
552 else
553 {
554 buf[9] = dbt_bp_entry[3];
555 buf[10] = dbt_bp_entry[2];
556 buf[11] = dbt_bp_entry[1];
557 buf[12] = dbt_bp_entry[0];
558 }
559 }
560 else
561 {
562 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
563 {
564 if ((bp_addr & 2) == 0)
565 {
566 buf[9] = dbt_bp_entry[0];
567 buf[10] = dbt_bp_entry[1];
568 buf[11] = bp_data[i][2] & 0x7f;
569 buf[12] = bp_data[i][3];
570 }
571 else
572 {
573 buf[9] = bp_data[i][0];
574 buf[10] = bp_data[i][1];
575 buf[11] = dbt_bp_entry[0];
576 buf[12] = dbt_bp_entry[1];
577 }
578 }
579 else
580 {
581 if ((bp_addr & 2) == 0)
582 {
583 buf[9] = bp_data[i][0];
584 buf[10] = bp_data[i][1] & 0x7f;
585 buf[11] = dbt_bp_entry[1];
586 buf[12] = dbt_bp_entry[0];
587 }
588 else
589 {
590 buf[9] = dbt_bp_entry[1];
591 buf[10] = dbt_bp_entry[0];
592 buf[11] = bp_data[i][2];
593 buf[12] = bp_data[i][3];
594 }
595 }
596 }
597 send_data (buf, 13);
598 }
599
600 /* Set access breaks. */
601 for (i = 0; i < max_access_breaks; i++)
602 {
603 ab_addr = ab_address[i];
604
605 if (ab_addr == 0x00000000)
606 continue;
607
608 /* DBC register */
609 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
610 {
611 switch (ab_type[i])
612 {
613 case 0: /* write watch */
614 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
615 0x00000086);
616 break;
617 case 1: /* read watch */
618 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
619 0x00000046);
620 break;
621 case 2: /* access watch */
622 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
623 0x00000006);
624 break;
625 }
626 }
627 else
628 {
629 switch (ab_type[i])
630 {
631 case 0: /* write watch */
632 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
633 0x86000000);
634 break;
635 case 1: /* read watch */
636 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
637 0x46000000);
638 break;
639 case 2: /* access watch */
640 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
641 0x06000000);
642 break;
643 }
644 }
645
646 /* DBAH register */
647 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8180 + 4 * i, 4, ab_addr);
648
649 /* DBAL register */
650 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8200 + 4 * i, 4,
651 0xffffffff);
652
653 /* DBD register */
654 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8280 + 4 * i, 4,
655 0x00000000);
656
657 /* DBDM register */
658 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8300 + 4 * i, 4,
659 0x00000000);
660 }
661
662 /* Resume program. */
663 send_cmd (SDI_EXEC_CPU);
664
665 /* Without this, some commands which require an active target (such as kill)
666 won't work. This variable serves (at least) double duty as both the pid
667 of the target process (if it has such), and as a flag indicating that a
668 target is active. These functions should be split out into seperate
669 variables, especially since GDB will someday have a notion of debugging
670 several processes. */
671 inferior_ptid = pid_to_ptid (32);
672
673 return;
674 }
675
676 /* Wait until the remote machine stops, then return,
677 storing status in STATUS just as `wait' would. */
678
679 static void
680 gdb_cntrl_c (int signo)
681 {
682 if (remote_debug)
683 fprintf_unfiltered (gdb_stdlog, "interrupt\n");
684 interrupted = 1;
685 }
686
687 static ptid_t
688 m32r_wait (ptid_t ptid, struct target_waitstatus *status)
689 {
690 static RETSIGTYPE (*prev_sigint) ();
691 unsigned long bp_addr, pc_addr;
692 int ib_breakpoints;
693 long i;
694 unsigned char buf[13];
695 unsigned long val;
696 int ret, c;
697
698 if (remote_debug)
699 fprintf_unfiltered (gdb_stdlog, "m32r_wait()\n");
700
701 status->kind = TARGET_WAITKIND_EXITED;
702 status->value.sig = 0;
703
704 interrupted = 0;
705 prev_sigint = signal (SIGINT, gdb_cntrl_c);
706
707 /* Wait for ready */
708 buf[0] = SDI_WAIT_FOR_READY;
709 if (serial_write (sdi_desc, buf, 1) != 0)
710 error (_("Remote connection closed"));
711
712 while (1)
713 {
714 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
715 if (c < 0)
716 error (_("Remote connection closed"));
717
718 if (c == '-') /* error */
719 {
720 status->kind = TARGET_WAITKIND_STOPPED;
721 status->value.sig = TARGET_SIGNAL_HUP;
722 return inferior_ptid;
723 }
724 else if (c == '+') /* stopped */
725 break;
726
727 if (interrupted)
728 ret = serial_write (sdi_desc, "!", 1); /* packet to interrupt */
729 else
730 ret = serial_write (sdi_desc, ".", 1); /* packet to wait */
731 if (ret != 0)
732 error (_("Remote connection closed"));
733 }
734
735 status->kind = TARGET_WAITKIND_STOPPED;
736 if (interrupted)
737 status->value.sig = TARGET_SIGNAL_INT;
738 else
739 status->value.sig = TARGET_SIGNAL_TRAP;
740
741 interrupted = 0;
742 signal (SIGINT, prev_sigint);
743
744 check_mmu_status ();
745
746 /* Recover parallel bit. */
747 if (last_pc_addr != 0xffffffff)
748 {
749 buf[0] = SDI_WRITE_MEMORY;
750 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
751 store_long_parameter (buf + 1, last_pc_addr);
752 else
753 store_long_parameter (buf + 1, last_pc_addr - 1);
754 store_long_parameter (buf + 5, 1);
755 buf[9] = last_pc_addr_data[0];
756 send_data (buf, 10);
757 last_pc_addr = 0xffffffff;
758 }
759
760 if (use_ib_breakpoints)
761 ib_breakpoints = max_ib_breakpoints;
762 else
763 ib_breakpoints = 0;
764
765 /* Set back pc by 2 if m32r is stopped with dbt. */
766 last_pc_addr = 0xffffffff;
767 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BPC);
768 pc_addr = recv_long_data () - 2;
769 for (i = ib_breakpoints; i < MAX_BREAKPOINTS; i++)
770 {
771 if (pc_addr == bp_address[i])
772 {
773 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BPC, pc_addr);
774
775 /* If there is a parallel instruction with +2 offset at pc
776 address, we have to take care of it later. */
777 if ((pc_addr & 0x2) != 0)
778 {
779 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
780 {
781 if ((bp_data[i][2] & 0x80) != 0)
782 {
783 last_pc_addr = pc_addr;
784 last_pc_addr_data[0] = bp_data[i][2];
785 last_pc_addr_data[1] = bp_data[i][3];
786 }
787 }
788 else
789 {
790 if ((bp_data[i][1] & 0x80) != 0)
791 {
792 last_pc_addr = pc_addr;
793 last_pc_addr_data[0] = bp_data[i][1];
794 last_pc_addr_data[1] = bp_data[i][0];
795 }
796 }
797 }
798 break;
799 }
800 }
801
802 /* Remove ib breakpoints. */
803 for (i = 0; i < ib_breakpoints; i++)
804 {
805 if (bp_address[i] != 0xffffffff)
806 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8000 + 4 * i, 4,
807 0x00000000);
808 }
809 /* Remove dbt breakpoints. */
810 for (i = ib_breakpoints; i < MAX_BREAKPOINTS; i++)
811 {
812 bp_addr = bp_address[i];
813 if (bp_addr != 0xffffffff)
814 {
815 if (!mmu_on)
816 bp_addr &= 0x7fffffff;
817 buf[0] = SDI_WRITE_MEMORY;
818 store_long_parameter (buf + 1, bp_addr & 0xfffffffc);
819 store_long_parameter (buf + 5, 4);
820 buf[9] = bp_data[i][0];
821 buf[10] = bp_data[i][1];
822 buf[11] = bp_data[i][2];
823 buf[12] = bp_data[i][3];
824 send_data (buf, 13);
825 }
826 }
827
828 /* Remove access breaks. */
829 hit_watchpoint_addr = 0;
830 for (i = 0; i < max_access_breaks; i++)
831 {
832 if (ab_address[i] != 0x00000000)
833 {
834 buf[0] = SDI_READ_MEMORY;
835 store_long_parameter (buf + 1, 0xffff8100 + 4 * i);
836 store_long_parameter (buf + 5, 4);
837 serial_write (sdi_desc, buf, 9);
838 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
839 if (c != '-' && recv_data (buf, 4) != -1)
840 {
841 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
842 {
843 if ((buf[3] & 0x1) == 0x1)
844 hit_watchpoint_addr = ab_address[i];
845 }
846 else
847 {
848 if ((buf[0] & 0x1) == 0x1)
849 hit_watchpoint_addr = ab_address[i];
850 }
851 }
852
853 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
854 0x00000000);
855 }
856 }
857
858 if (remote_debug)
859 fprintf_unfiltered (gdb_stdlog, "pc => 0x%lx\n", pc_addr);
860
861 return inferior_ptid;
862 }
863
864 /* Terminate the open connection to the remote debugger.
865 Use this when you want to detach and do something else
866 with your gdb. */
867 static void
868 m32r_detach (char *args, int from_tty)
869 {
870 if (remote_debug)
871 fprintf_unfiltered (gdb_stdlog, "m32r_detach(%d)\n", from_tty);
872
873 m32r_resume (inferior_ptid, 0, 0);
874
875 /* calls m32r_close to do the real work */
876 pop_target ();
877 if (from_tty)
878 fprintf_unfiltered (gdb_stdlog, "Ending remote %s debugging\n",
879 target_shortname);
880 }
881
882 /* Return the id of register number REGNO. */
883
884 static int
885 get_reg_id (int regno)
886 {
887 switch (regno)
888 {
889 case 20:
890 return SDI_REG_BBPC;
891 case 21:
892 return SDI_REG_BPC;
893 case 22:
894 return SDI_REG_ACCL;
895 case 23:
896 return SDI_REG_ACCH;
897 case 24:
898 return SDI_REG_EVB;
899 }
900
901 return regno;
902 }
903
904 /* Read the remote registers into the block REGS. */
905
906 static void m32r_fetch_register (struct regcache *, int);
907
908 static void
909 m32r_fetch_registers (struct regcache *regcache)
910 {
911 int regno;
912
913 for (regno = 0; regno < gdbarch_num_regs (current_gdbarch); regno++)
914 m32r_fetch_register (regcache, regno);
915 }
916
917 /* Fetch register REGNO, or all registers if REGNO is -1.
918 Returns errno value. */
919 static void
920 m32r_fetch_register (struct regcache *regcache, int regno)
921 {
922 unsigned long val, val2, regid;
923
924 if (regno == -1)
925 m32r_fetch_registers (regcache);
926 else
927 {
928 char buffer[MAX_REGISTER_SIZE];
929
930 regid = get_reg_id (regno);
931 send_one_arg_cmd (SDI_READ_CPU_REG, regid);
932 val = recv_long_data ();
933
934 if (regid == SDI_REG_PSW)
935 {
936 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BBPSW);
937 val2 = recv_long_data ();
938 val = ((0x00cf & val2) << 8) | ((0xcf00 & val) >> 8);
939 }
940
941 if (remote_debug)
942 fprintf_unfiltered (gdb_stdlog, "m32r_fetch_register(%d,0x%08lx)\n",
943 regno, val);
944
945 /* We got the number the register holds, but gdb expects to see a
946 value in the target byte ordering. */
947 store_unsigned_integer (buffer, 4, val);
948 regcache_raw_supply (regcache, regno, buffer);
949 }
950 return;
951 }
952
953 /* Store the remote registers from the contents of the block REGS. */
954
955 static void m32r_store_register (struct regcache *, int);
956
957 static void
958 m32r_store_registers (struct regcache *regcache)
959 {
960 int regno;
961
962 for (regno = 0; regno < gdbarch_num_regs (current_gdbarch); regno++)
963 m32r_store_register (regcache, regno);
964
965 registers_changed ();
966 }
967
968 /* Store register REGNO, or all if REGNO == 0.
969 Return errno value. */
970 static void
971 m32r_store_register (struct regcache *regcache, int regno)
972 {
973 int regid;
974 ULONGEST regval, tmp;
975
976 if (regno == -1)
977 m32r_store_registers (regcache);
978 else
979 {
980 regcache_cooked_read_unsigned (regcache, regno, &regval);
981 regid = get_reg_id (regno);
982
983 if (regid == SDI_REG_PSW)
984 {
985 unsigned long psw, bbpsw;
986
987 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_PSW);
988 psw = recv_long_data ();
989
990 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BBPSW);
991 bbpsw = recv_long_data ();
992
993 tmp = (0x00cf & psw) | ((0x00cf & regval) << 8);
994 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PSW, tmp);
995
996 tmp = (0x0030 & bbpsw) | ((0xcf00 & regval) >> 8);
997 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BBPSW, tmp);
998 }
999 else
1000 {
1001 send_two_arg_cmd (SDI_WRITE_CPU_REG, regid, regval);
1002 }
1003
1004 if (remote_debug)
1005 fprintf_unfiltered (gdb_stdlog, "m32r_store_register(%d,0x%08lu)\n",
1006 regno, (unsigned long) regval);
1007 }
1008 }
1009
1010 /* Get ready to modify the registers array. On machines which store
1011 individual registers, this doesn't need to do anything. On machines
1012 which store all the registers in one fell swoop, this makes sure
1013 that registers contains all the registers from the program being
1014 debugged. */
1015
1016 static void
1017 m32r_prepare_to_store (struct regcache *regcache)
1018 {
1019 /* Do nothing, since we can store individual regs */
1020 if (remote_debug)
1021 fprintf_unfiltered (gdb_stdlog, "m32r_prepare_to_store()\n");
1022 }
1023
1024 static void
1025 m32r_files_info (struct target_ops *target)
1026 {
1027 char *file = "nothing";
1028
1029 if (exec_bfd)
1030 {
1031 file = bfd_get_filename (exec_bfd);
1032 printf_filtered ("\tAttached to %s running program %s\n",
1033 chip_name, file);
1034 }
1035 }
1036
1037 /* Read/Write memory. */
1038 static int
1039 m32r_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
1040 int write,
1041 struct mem_attrib *attrib, struct target_ops *target)
1042 {
1043 unsigned long taddr;
1044 unsigned char buf[0x2000];
1045 int ret, c;
1046
1047 taddr = memaddr;
1048
1049 if (!mmu_on)
1050 {
1051 if ((taddr & 0xa0000000) == 0x80000000)
1052 taddr &= 0x7fffffff;
1053 }
1054
1055 if (remote_debug)
1056 {
1057 if (write)
1058 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%08lx,%d,write)\n",
1059 memaddr, len);
1060 else
1061 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%08lx,%d,read)\n",
1062 memaddr, len);
1063 }
1064
1065 if (write)
1066 {
1067 buf[0] = SDI_WRITE_MEMORY;
1068 store_long_parameter (buf + 1, taddr);
1069 store_long_parameter (buf + 5, len);
1070 if (len < 0x1000)
1071 {
1072 memcpy (buf + 9, myaddr, len);
1073 ret = send_data (buf, len + 9) - 9;
1074 }
1075 else
1076 {
1077 if (serial_write (sdi_desc, buf, 9) != 0)
1078 {
1079 if (remote_debug)
1080 fprintf_unfiltered (gdb_stdlog,
1081 "m32r_xfer_memory() failed\n");
1082 return 0;
1083 }
1084 ret = send_data (myaddr, len);
1085 }
1086 }
1087 else
1088 {
1089 buf[0] = SDI_READ_MEMORY;
1090 store_long_parameter (buf + 1, taddr);
1091 store_long_parameter (buf + 5, len);
1092 if (serial_write (sdi_desc, buf, 9) != 0)
1093 {
1094 if (remote_debug)
1095 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory() failed\n");
1096 return 0;
1097 }
1098
1099 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
1100 if (c < 0 || c == '-')
1101 {
1102 if (remote_debug)
1103 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory() failed\n");
1104 return 0;
1105 }
1106
1107 ret = recv_data (myaddr, len);
1108 }
1109
1110 if (ret <= 0)
1111 {
1112 if (remote_debug)
1113 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory() fails\n");
1114 return 0;
1115 }
1116
1117 return ret;
1118 }
1119
1120 static void
1121 m32r_kill (void)
1122 {
1123 if (remote_debug)
1124 fprintf_unfiltered (gdb_stdlog, "m32r_kill()\n");
1125
1126 inferior_ptid = null_ptid;
1127
1128 return;
1129 }
1130
1131 /* Clean up when a program exits.
1132
1133 The program actually lives on in the remote processor's RAM, and may be
1134 run again without a download. Don't leave it full of breakpoint
1135 instructions. */
1136
1137 static void
1138 m32r_mourn_inferior (void)
1139 {
1140 if (remote_debug)
1141 fprintf_unfiltered (gdb_stdlog, "m32r_mourn_inferior()\n");
1142
1143 remove_breakpoints ();
1144 generic_mourn_inferior ();
1145 }
1146
1147 static int
1148 m32r_insert_breakpoint (struct bp_target_info *bp_tgt)
1149 {
1150 CORE_ADDR addr = bp_tgt->placed_address;
1151 int ib_breakpoints;
1152 unsigned char buf[13];
1153 int i, c;
1154
1155 if (remote_debug)
1156 fprintf_unfiltered (gdb_stdlog, "m32r_insert_breakpoint(%08lx,...)\n",
1157 addr);
1158
1159 if (use_ib_breakpoints)
1160 ib_breakpoints = max_ib_breakpoints;
1161 else
1162 ib_breakpoints = 0;
1163
1164 for (i = 0; i < MAX_BREAKPOINTS; i++)
1165 {
1166 if (bp_address[i] == 0xffffffff)
1167 {
1168 bp_address[i] = addr;
1169 if (i >= ib_breakpoints)
1170 {
1171 buf[0] = SDI_READ_MEMORY;
1172 if (mmu_on)
1173 store_long_parameter (buf + 1, addr & 0xfffffffc);
1174 else
1175 store_long_parameter (buf + 1, addr & 0x7ffffffc);
1176 store_long_parameter (buf + 5, 4);
1177 serial_write (sdi_desc, buf, 9);
1178 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
1179 if (c != '-')
1180 recv_data (bp_data[i], 4);
1181 }
1182 return 0;
1183 }
1184 }
1185
1186 error (_("Too many breakpoints"));
1187 return 1;
1188 }
1189
1190 static int
1191 m32r_remove_breakpoint (struct bp_target_info *bp_tgt)
1192 {
1193 CORE_ADDR addr = bp_tgt->placed_address;
1194 int i;
1195
1196 if (remote_debug)
1197 fprintf_unfiltered (gdb_stdlog, "m32r_remove_breakpoint(%08lx)\n",
1198 addr);
1199
1200 for (i = 0; i < MAX_BREAKPOINTS; i++)
1201 {
1202 if (bp_address[i] == addr)
1203 {
1204 bp_address[i] = 0xffffffff;
1205 break;
1206 }
1207 }
1208
1209 return 0;
1210 }
1211
1212 static void
1213 m32r_load (char *args, int from_tty)
1214 {
1215 struct cleanup *old_chain;
1216 asection *section;
1217 bfd *pbfd;
1218 bfd_vma entry;
1219 char *filename;
1220 int quiet;
1221 int nostart;
1222 struct timeval start_time, end_time;
1223 unsigned long data_count; /* Number of bytes transferred to memory */
1224 int ret;
1225 static RETSIGTYPE (*prev_sigint) ();
1226
1227 /* for direct tcp connections, we can do a fast binary download */
1228 quiet = 0;
1229 nostart = 0;
1230 filename = NULL;
1231
1232 while (*args != '\000')
1233 {
1234 char *arg;
1235
1236 while (isspace (*args))
1237 args++;
1238
1239 arg = args;
1240
1241 while ((*args != '\000') && !isspace (*args))
1242 args++;
1243
1244 if (*args != '\000')
1245 *args++ = '\000';
1246
1247 if (*arg != '-')
1248 filename = arg;
1249 else if (strncmp (arg, "-quiet", strlen (arg)) == 0)
1250 quiet = 1;
1251 else if (strncmp (arg, "-nostart", strlen (arg)) == 0)
1252 nostart = 1;
1253 else
1254 error (_("Unknown option `%s'"), arg);
1255 }
1256
1257 if (!filename)
1258 filename = get_exec_file (1);
1259
1260 pbfd = bfd_openr (filename, gnutarget);
1261 if (pbfd == NULL)
1262 {
1263 perror_with_name (filename);
1264 return;
1265 }
1266 old_chain = make_cleanup_bfd_close (pbfd);
1267
1268 if (!bfd_check_format (pbfd, bfd_object))
1269 error (_("\"%s\" is not an object file: %s"), filename,
1270 bfd_errmsg (bfd_get_error ()));
1271
1272 gettimeofday (&start_time, NULL);
1273 data_count = 0;
1274
1275 interrupted = 0;
1276 prev_sigint = signal (SIGINT, gdb_cntrl_c);
1277
1278 for (section = pbfd->sections; section; section = section->next)
1279 {
1280 if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)
1281 {
1282 bfd_vma section_address;
1283 bfd_size_type section_size;
1284 file_ptr fptr;
1285 int n;
1286
1287 section_address = bfd_section_lma (pbfd, section);
1288 section_size = bfd_get_section_size (section);
1289
1290 if (!mmu_on)
1291 {
1292 if ((section_address & 0xa0000000) == 0x80000000)
1293 section_address &= 0x7fffffff;
1294 }
1295
1296 if (!quiet)
1297 printf_filtered ("[Loading section %s at 0x%lx (%d bytes)]\n",
1298 bfd_get_section_name (pbfd, section),
1299 section_address, (int) section_size);
1300
1301 fptr = 0;
1302
1303 data_count += section_size;
1304
1305 n = 0;
1306 while (section_size > 0)
1307 {
1308 char unsigned buf[0x1000 + 9];
1309 int count;
1310
1311 count = min (section_size, 0x1000);
1312
1313 buf[0] = SDI_WRITE_MEMORY;
1314 store_long_parameter (buf + 1, section_address);
1315 store_long_parameter (buf + 5, count);
1316
1317 bfd_get_section_contents (pbfd, section, buf + 9, fptr, count);
1318 if (send_data (buf, count + 9) <= 0)
1319 error (_("Error while downloading %s section."),
1320 bfd_get_section_name (pbfd, section));
1321
1322 if (!quiet)
1323 {
1324 printf_unfiltered (".");
1325 if (n++ > 60)
1326 {
1327 printf_unfiltered ("\n");
1328 n = 0;
1329 }
1330 gdb_flush (gdb_stdout);
1331 }
1332
1333 section_address += count;
1334 fptr += count;
1335 section_size -= count;
1336
1337 if (interrupted)
1338 break;
1339 }
1340
1341 if (!quiet && !interrupted)
1342 {
1343 printf_unfiltered ("done.\n");
1344 gdb_flush (gdb_stdout);
1345 }
1346 }
1347
1348 if (interrupted)
1349 {
1350 printf_unfiltered ("Interrupted.\n");
1351 break;
1352 }
1353 }
1354
1355 interrupted = 0;
1356 signal (SIGINT, prev_sigint);
1357
1358 gettimeofday (&end_time, NULL);
1359
1360 /* Make the PC point at the start address */
1361 if (exec_bfd)
1362 write_pc (bfd_get_start_address (exec_bfd));
1363
1364 inferior_ptid = null_ptid; /* No process now */
1365
1366 /* This is necessary because many things were based on the PC at the time
1367 that we attached to the monitor, which is no longer valid now that we
1368 have loaded new code (and just changed the PC). Another way to do this
1369 might be to call normal_stop, except that the stack may not be valid,
1370 and things would get horribly confused... */
1371
1372 clear_symtab_users ();
1373
1374 if (!nostart)
1375 {
1376 entry = bfd_get_start_address (pbfd);
1377
1378 if (!quiet)
1379 printf_unfiltered ("[Starting %s at 0x%lx]\n", filename, entry);
1380 }
1381
1382 print_transfer_performance (gdb_stdout, data_count, 0, &start_time,
1383 &end_time);
1384
1385 do_cleanups (old_chain);
1386 }
1387
1388 static void
1389 m32r_stop (void)
1390 {
1391 if (remote_debug)
1392 fprintf_unfiltered (gdb_stdlog, "m32r_stop()\n");
1393
1394 send_cmd (SDI_STOP_CPU);
1395
1396 return;
1397 }
1398
1399
1400 /* Tell whether this target can support a hardware breakpoint. CNT
1401 is the number of hardware breakpoints already installed. This
1402 implements the TARGET_CAN_USE_HARDWARE_WATCHPOINT macro. */
1403
1404 int
1405 m32r_can_use_hw_watchpoint (int type, int cnt, int othertype)
1406 {
1407 return sdi_desc != NULL && cnt < max_access_breaks;
1408 }
1409
1410 /* Set a data watchpoint. ADDR and LEN should be obvious. TYPE is 0
1411 for a write watchpoint, 1 for a read watchpoint, or 2 for a read/write
1412 watchpoint. */
1413
1414 int
1415 m32r_insert_watchpoint (CORE_ADDR addr, int len, int type)
1416 {
1417 int i;
1418
1419 if (remote_debug)
1420 fprintf_unfiltered (gdb_stdlog, "m32r_insert_watchpoint(%08lx,%d,%d)\n",
1421 addr, len, type);
1422
1423 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
1424 {
1425 if (ab_address[i] == 0x00000000)
1426 {
1427 ab_address[i] = addr;
1428 ab_size[i] = len;
1429 ab_type[i] = type;
1430 return 0;
1431 }
1432 }
1433
1434 error (_("Too many watchpoints"));
1435 return 1;
1436 }
1437
1438 int
1439 m32r_remove_watchpoint (CORE_ADDR addr, int len, int type)
1440 {
1441 int i;
1442
1443 if (remote_debug)
1444 fprintf_unfiltered (gdb_stdlog, "m32r_remove_watchpoint(%08lx,%d,%d)\n",
1445 addr, len, type);
1446
1447 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
1448 {
1449 if (ab_address[i] == addr)
1450 {
1451 ab_address[i] = 0x00000000;
1452 break;
1453 }
1454 }
1455
1456 return 0;
1457 }
1458
1459 int
1460 m32r_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
1461 {
1462 int rc = 0;
1463 if (hit_watchpoint_addr != 0x00000000)
1464 {
1465 *addr_p = hit_watchpoint_addr;
1466 rc = 1;
1467 }
1468 return rc;
1469 }
1470
1471 int
1472 m32r_stopped_by_watchpoint (void)
1473 {
1474 CORE_ADDR addr;
1475 return m32r_stopped_data_address (&current_target, &addr);
1476 }
1477
1478
1479 static void
1480 sdireset_command (char *args, int from_tty)
1481 {
1482 if (remote_debug)
1483 fprintf_unfiltered (gdb_stdlog, "m32r_sdireset()\n");
1484
1485 send_cmd (SDI_OPEN);
1486
1487 inferior_ptid = null_ptid;
1488 }
1489
1490
1491 static void
1492 sdistatus_command (char *args, int from_tty)
1493 {
1494 unsigned char buf[4096];
1495 int i, c;
1496
1497 if (remote_debug)
1498 fprintf_unfiltered (gdb_stdlog, "m32r_sdireset()\n");
1499
1500 if (!sdi_desc)
1501 return;
1502
1503 send_cmd (SDI_STATUS);
1504 for (i = 0; i < 4096; i++)
1505 {
1506 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
1507 if (c < 0)
1508 return;
1509 buf[i] = c;
1510 if (c == 0)
1511 break;
1512 }
1513
1514 printf_filtered ("%s", buf);
1515 }
1516
1517
1518 static void
1519 debug_chaos_command (char *args, int from_tty)
1520 {
1521 unsigned char buf[3];
1522
1523 buf[0] = SDI_SET_ATTR;
1524 buf[1] = SDI_ATTR_CACHE;
1525 buf[2] = SDI_CACHE_TYPE_CHAOS;
1526 send_data (buf, 3);
1527 }
1528
1529
1530 static void
1531 use_debug_dma_command (char *args, int from_tty)
1532 {
1533 unsigned char buf[3];
1534
1535 buf[0] = SDI_SET_ATTR;
1536 buf[1] = SDI_ATTR_MEM_ACCESS;
1537 buf[2] = SDI_MEM_ACCESS_DEBUG_DMA;
1538 send_data (buf, 3);
1539 }
1540
1541 static void
1542 use_mon_code_command (char *args, int from_tty)
1543 {
1544 unsigned char buf[3];
1545
1546 buf[0] = SDI_SET_ATTR;
1547 buf[1] = SDI_ATTR_MEM_ACCESS;
1548 buf[2] = SDI_MEM_ACCESS_MON_CODE;
1549 send_data (buf, 3);
1550 }
1551
1552
1553 static void
1554 use_ib_breakpoints_command (char *args, int from_tty)
1555 {
1556 use_ib_breakpoints = 1;
1557 }
1558
1559 static void
1560 use_dbt_breakpoints_command (char *args, int from_tty)
1561 {
1562 use_ib_breakpoints = 0;
1563 }
1564
1565
1566 /* Define the target subroutine names */
1567
1568 struct target_ops m32r_ops;
1569
1570 static void
1571 init_m32r_ops (void)
1572 {
1573 m32r_ops.to_shortname = "m32rsdi";
1574 m32r_ops.to_longname = "Remote M32R debugging over SDI interface";
1575 m32r_ops.to_doc = "Use an M32R board using SDI debugging protocol.";
1576 m32r_ops.to_open = m32r_open;
1577 m32r_ops.to_close = m32r_close;
1578 m32r_ops.to_detach = m32r_detach;
1579 m32r_ops.to_resume = m32r_resume;
1580 m32r_ops.to_wait = m32r_wait;
1581 m32r_ops.to_fetch_registers = m32r_fetch_register;
1582 m32r_ops.to_store_registers = m32r_store_register;
1583 m32r_ops.to_prepare_to_store = m32r_prepare_to_store;
1584 m32r_ops.deprecated_xfer_memory = m32r_xfer_memory;
1585 m32r_ops.to_files_info = m32r_files_info;
1586 m32r_ops.to_insert_breakpoint = m32r_insert_breakpoint;
1587 m32r_ops.to_remove_breakpoint = m32r_remove_breakpoint;
1588 m32r_ops.to_can_use_hw_breakpoint = m32r_can_use_hw_watchpoint;
1589 m32r_ops.to_insert_watchpoint = m32r_insert_watchpoint;
1590 m32r_ops.to_remove_watchpoint = m32r_remove_watchpoint;
1591 m32r_ops.to_stopped_by_watchpoint = m32r_stopped_by_watchpoint;
1592 m32r_ops.to_stopped_data_address = m32r_stopped_data_address;
1593 m32r_ops.to_kill = m32r_kill;
1594 m32r_ops.to_load = m32r_load;
1595 m32r_ops.to_create_inferior = m32r_create_inferior;
1596 m32r_ops.to_mourn_inferior = m32r_mourn_inferior;
1597 m32r_ops.to_stop = m32r_stop;
1598 m32r_ops.to_stratum = process_stratum;
1599 m32r_ops.to_has_all_memory = 1;
1600 m32r_ops.to_has_memory = 1;
1601 m32r_ops.to_has_stack = 1;
1602 m32r_ops.to_has_registers = 1;
1603 m32r_ops.to_has_execution = 1;
1604 m32r_ops.to_magic = OPS_MAGIC;
1605 };
1606
1607
1608 extern initialize_file_ftype _initialize_remote_m32r;
1609
1610 void
1611 _initialize_remote_m32r (void)
1612 {
1613 int i;
1614
1615 init_m32r_ops ();
1616
1617 /* Initialize breakpoints. */
1618 for (i = 0; i < MAX_BREAKPOINTS; i++)
1619 bp_address[i] = 0xffffffff;
1620
1621 /* Initialize access breaks. */
1622 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
1623 ab_address[i] = 0x00000000;
1624
1625 add_target (&m32r_ops);
1626
1627 add_com ("sdireset", class_obscure, sdireset_command,
1628 _("Reset SDI connection."));
1629
1630 add_com ("sdistatus", class_obscure, sdistatus_command,
1631 _("Show status of SDI connection."));
1632
1633 add_com ("debug_chaos", class_obscure, debug_chaos_command,
1634 _("Debug M32R/Chaos."));
1635
1636 add_com ("use_debug_dma", class_obscure, use_debug_dma_command,
1637 _("Use debug DMA mem access."));
1638 add_com ("use_mon_code", class_obscure, use_mon_code_command,
1639 _("Use mon code mem access."));
1640
1641 add_com ("use_ib_break", class_obscure, use_ib_breakpoints_command,
1642 _("Set breakpoints by IB break."));
1643 add_com ("use_dbt_break", class_obscure, use_dbt_breakpoints_command,
1644 _("Set breakpoints by dbt."));
1645 }
This page took 0.075686 seconds and 4 git commands to generate.