1 /* Remote debugging interface for M32R/SDI.
3 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
4 Free Software Foundation, Inc.
6 Contributed by Renesas Technology Co.
7 Written by Kei Sakamoto <sakamoto.kei@renesas.com>.
9 This file is part of GDB.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
30 #include "gdb_string.h"
31 #include "gdbthread.h"
37 #include <netinet/in.h>
39 #include <sys/types.h>
47 /* Descriptor for I/O to remote machine. */
49 static struct serial *sdi_desc = NULL;
51 #define SDI_TIMEOUT 30
56 static char chip_name[64];
59 static unsigned long last_pc_addr = 0xffffffff;
60 static unsigned char last_pc_addr_data[2];
62 static int mmu_on = 0;
64 static int use_ib_breakpoints = 1;
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];
72 static const unsigned char dbt_bp_entry[] = {
73 0x10, 0xe0, 0x70, 0x00
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;
83 static int interrupted = 0;
85 /* Forward data declarations */
86 extern struct target_ops m32r_ops;
88 /* This is the ptid we use while we're connected to the remote. Its
89 value is arbitrary, as the target doesn't have a notion of
90 processes or threads, but we need something non-null to place in
92 static ptid_t remote_m32r_ptid;
98 #define SDI_READ_CPU_REG 4
99 #define SDI_WRITE_CPU_REG 5
100 #define SDI_READ_MEMORY 6
101 #define SDI_WRITE_MEMORY 7
102 #define SDI_EXEC_CPU 8
103 #define SDI_STOP_CPU 9
104 #define SDI_WAIT_FOR_READY 10
105 #define SDI_GET_ATTR 11
106 #define SDI_SET_ATTR 12
107 #define SDI_STATUS 13
110 #define SDI_ATTR_NAME 1
111 #define SDI_ATTR_BRK 2
112 #define SDI_ATTR_ABRK 3
113 #define SDI_ATTR_CACHE 4
114 #define SDI_CACHE_TYPE_M32102 0
115 #define SDI_CACHE_TYPE_CHAOS 1
116 #define SDI_ATTR_MEM_ACCESS 5
117 #define SDI_MEM_ACCESS_DEBUG_DMA 0
118 #define SDI_MEM_ACCESS_MON_CODE 1
131 #define SDI_REG_R10 10
132 #define SDI_REG_R11 11
133 #define SDI_REG_R12 12
134 #define SDI_REG_FP 13
135 #define SDI_REG_LR 14
136 #define SDI_REG_SP 15
137 #define SDI_REG_PSW 16
138 #define SDI_REG_CBR 17
139 #define SDI_REG_SPI 18
140 #define SDI_REG_SPU 19
141 #define SDI_REG_CR4 20
142 #define SDI_REG_EVB 21
143 #define SDI_REG_BPC 22
144 #define SDI_REG_CR7 23
145 #define SDI_REG_BBPSW 24
146 #define SDI_REG_CR9 25
147 #define SDI_REG_CR10 26
148 #define SDI_REG_CR11 27
149 #define SDI_REG_CR12 28
150 #define SDI_REG_WR 29
151 #define SDI_REG_BBPC 30
152 #define SDI_REG_PBP 31
153 #define SDI_REG_ACCH 32
154 #define SDI_REG_ACCL 33
155 #define SDI_REG_ACC1H 34
156 #define SDI_REG_ACC1L 35
159 /* Low level communication functions */
161 /* Check an ack packet from the target */
170 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
175 if (c != '+') /* error */
181 /* Send data to the target and check an ack packet */
183 send_data (void *buf, int len)
190 if (serial_write (sdi_desc, buf, len) != 0)
193 if (get_ack () == -1)
199 /* Receive data from the target */
201 recv_data (void *buf, int len)
211 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
216 ((unsigned char *) buf)[total++] = c;
222 /* Store unsigned long parameter on packet */
224 store_long_parameter (void *buf, long val)
227 memcpy (buf, &val, 4);
231 send_cmd (unsigned char cmd)
233 unsigned char buf[1];
235 return send_data (buf, 1);
239 send_one_arg_cmd (unsigned char cmd, unsigned char arg1)
241 unsigned char buf[2];
244 return send_data (buf, 2);
248 send_two_arg_cmd (unsigned char cmd, unsigned char arg1, unsigned long arg2)
250 unsigned char buf[6];
253 store_long_parameter (buf + 2, arg2);
254 return send_data (buf, 6);
258 send_three_arg_cmd (unsigned char cmd, unsigned long arg1, unsigned long arg2,
261 unsigned char buf[13];
263 store_long_parameter (buf + 1, arg1);
264 store_long_parameter (buf + 5, arg2);
265 store_long_parameter (buf + 9, arg3);
266 return send_data (buf, 13);
270 recv_char_data (void)
278 recv_long_data (void)
286 /* Check if MMU is on */
288 check_mmu_status (void)
292 /* Read PC address */
293 if (send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BPC) == -1)
295 val = recv_long_data ();
296 if ((val & 0xc0000000) == 0x80000000)
302 /* Read EVB address */
303 if (send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_EVB) == -1)
305 val = recv_long_data ();
306 if ((val & 0xc0000000) == 0x80000000)
316 /* This is called not only when we first attach, but also when the
317 user types "run" after having attached. */
319 m32r_create_inferior (char *execfile, char *args, char **env, int from_tty)
324 error (_("Cannot pass arguments to remote STDEBUG process"));
326 if (execfile == 0 || exec_bfd == 0)
327 error (_("No executable file specified"));
330 fprintf_unfiltered (gdb_stdlog, "m32r_create_inferior(%s,%s)\n", execfile,
333 entry_pt = bfd_get_start_address (exec_bfd);
335 /* The "process" (board) is already stopped awaiting our commands, and
336 the program is already downloaded. We just set its PC and go. */
338 clear_proceed_status ();
340 /* Tell wait_for_inferior that we've started a new process. */
341 init_wait_for_inferior ();
343 /* Set up the "saved terminal modes" of the inferior
344 based on what modes we are starting it with. */
345 target_terminal_init ();
347 /* Install inferior's terminal modes. */
348 target_terminal_inferior ();
353 /* Open a connection to a remote debugger.
354 NAME is the filename used for communication. */
357 m32r_open (char *args, int from_tty)
359 struct hostent *host_ent;
360 struct sockaddr_in server_addr;
361 char *port_str, hostname[256];
367 fprintf_unfiltered (gdb_stdlog, "m32r_open(%d)\n", from_tty);
369 target_preopen (from_tty);
371 push_target (&m32r_ops);
374 sprintf (hostname, "localhost:%d", SDIPORT);
377 port_str = strchr (args, ':');
378 if (port_str == NULL)
379 sprintf (hostname, "%s:%d", args, SDIPORT);
381 strcpy (hostname, args);
384 sdi_desc = serial_open (hostname);
386 error (_("Connection refused."));
388 if (get_ack () == -1)
389 error (_("Cannot connect to SDI target."));
391 if (send_cmd (SDI_OPEN) == -1)
392 error (_("Cannot connect to SDI target."));
394 /* Get maximum number of ib breakpoints */
395 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_BRK);
396 max_ib_breakpoints = recv_char_data ();
398 printf_filtered ("Max IB Breakpoints = %d\n", max_ib_breakpoints);
400 /* Initialize breakpoints. */
401 for (i = 0; i < MAX_BREAKPOINTS; i++)
402 bp_address[i] = 0xffffffff;
404 /* Get maximum number of access breaks. */
405 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_ABRK);
406 max_access_breaks = recv_char_data ();
408 printf_filtered ("Max Access Breaks = %d\n", max_access_breaks);
410 /* Initialize access breask. */
411 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
412 ab_address[i] = 0x00000000;
416 /* Get the name of chip on target board. */
417 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_NAME);
418 recv_data (chip_name, 64);
421 printf_filtered ("Remote %s connected to %s\n", target_shortname,
425 /* Close out all files and local state before this target loses control. */
428 m32r_close (int quitting)
431 fprintf_unfiltered (gdb_stdlog, "m32r_close(%d)\n", quitting);
435 send_cmd (SDI_CLOSE);
436 serial_close (sdi_desc);
440 inferior_ptid = null_ptid;
441 delete_thread_silent (remote_m32r_ptid);
445 /* Tell the remote machine to resume. */
448 m32r_resume (ptid_t ptid, int step, enum target_signal sig)
450 unsigned long pc_addr, bp_addr, ab_addr;
452 unsigned char buf[13];
458 fprintf_unfiltered (gdb_stdlog, "\nm32r_resume(step)\n");
460 fprintf_unfiltered (gdb_stdlog, "\nm32r_resume(cont)\n");
465 pc_addr = read_pc ();
467 fprintf_unfiltered (gdb_stdlog, "pc <= 0x%lx\n", pc_addr);
469 /* At pc address there is a parallel instruction with +2 offset,
470 so we have to make it a serial instruction or avoid it. */
471 if (pc_addr == last_pc_addr)
473 /* Avoid a parallel nop. */
474 if (last_pc_addr_data[0] == 0xf0 && last_pc_addr_data[1] == 0x00)
477 /* Now we can forget this instruction. */
478 last_pc_addr = 0xffffffff;
480 /* Clear a parallel bit. */
483 buf[0] = SDI_WRITE_MEMORY;
484 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
485 store_long_parameter (buf + 1, pc_addr);
487 store_long_parameter (buf + 1, pc_addr - 1);
488 store_long_parameter (buf + 5, 1);
489 buf[9] = last_pc_addr_data[0] & 0x7f;
495 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BPC, pc_addr);
502 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PBP, pc_addr | 1);
507 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PBP, 0x00000000);
510 if (use_ib_breakpoints)
511 ib_breakpoints = max_ib_breakpoints;
515 /* Set ib breakpoints. */
516 for (i = 0; i < ib_breakpoints; i++)
518 bp_addr = bp_address[i];
520 if (bp_addr == 0xffffffff)
524 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
525 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8000 + 4 * i, 4,
528 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8000 + 4 * i, 4,
531 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8080 + 4 * i, 4, bp_addr);
534 /* Set dbt breakpoints. */
535 for (i = ib_breakpoints; i < MAX_BREAKPOINTS; i++)
537 bp_addr = bp_address[i];
539 if (bp_addr == 0xffffffff)
543 bp_addr &= 0x7fffffff;
545 /* Write DBT instruction. */
546 buf[0] = SDI_WRITE_MEMORY;
547 store_long_parameter (buf + 1, (bp_addr & 0xfffffffc));
548 store_long_parameter (buf + 5, 4);
549 if ((bp_addr & 2) == 0 && bp_addr != (pc_addr & 0xfffffffc))
551 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
553 buf[9] = dbt_bp_entry[0];
554 buf[10] = dbt_bp_entry[1];
555 buf[11] = dbt_bp_entry[2];
556 buf[12] = dbt_bp_entry[3];
560 buf[9] = dbt_bp_entry[3];
561 buf[10] = dbt_bp_entry[2];
562 buf[11] = dbt_bp_entry[1];
563 buf[12] = dbt_bp_entry[0];
568 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
570 if ((bp_addr & 2) == 0)
572 buf[9] = dbt_bp_entry[0];
573 buf[10] = dbt_bp_entry[1];
574 buf[11] = bp_data[i][2] & 0x7f;
575 buf[12] = bp_data[i][3];
579 buf[9] = bp_data[i][0];
580 buf[10] = bp_data[i][1];
581 buf[11] = dbt_bp_entry[0];
582 buf[12] = dbt_bp_entry[1];
587 if ((bp_addr & 2) == 0)
589 buf[9] = bp_data[i][0];
590 buf[10] = bp_data[i][1] & 0x7f;
591 buf[11] = dbt_bp_entry[1];
592 buf[12] = dbt_bp_entry[0];
596 buf[9] = dbt_bp_entry[1];
597 buf[10] = dbt_bp_entry[0];
598 buf[11] = bp_data[i][2];
599 buf[12] = bp_data[i][3];
606 /* Set access breaks. */
607 for (i = 0; i < max_access_breaks; i++)
609 ab_addr = ab_address[i];
611 if (ab_addr == 0x00000000)
615 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
619 case 0: /* write watch */
620 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
623 case 1: /* read watch */
624 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
627 case 2: /* access watch */
628 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
637 case 0: /* write watch */
638 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
641 case 1: /* read watch */
642 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
645 case 2: /* access watch */
646 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
653 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8180 + 4 * i, 4, ab_addr);
656 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8200 + 4 * i, 4,
660 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8280 + 4 * i, 4,
664 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8300 + 4 * i, 4,
668 /* Resume program. */
669 send_cmd (SDI_EXEC_CPU);
671 /* Without this, some commands which require an active target (such as kill)
672 won't work. This variable serves (at least) double duty as both the pid
673 of the target process (if it has such), and as a flag indicating that a
674 target is active. These functions should be split out into seperate
675 variables, especially since GDB will someday have a notion of debugging
676 several processes. */
677 inferior_ptid = remote_m32r_ptid;
678 add_thread_silent (remote_m32r_ptid);
683 /* Wait until the remote machine stops, then return,
684 storing status in STATUS just as `wait' would. */
687 gdb_cntrl_c (int signo)
690 fprintf_unfiltered (gdb_stdlog, "interrupt\n");
695 m32r_wait (ptid_t ptid, struct target_waitstatus *status)
697 static RETSIGTYPE (*prev_sigint) ();
698 unsigned long bp_addr, pc_addr;
701 unsigned char buf[13];
706 fprintf_unfiltered (gdb_stdlog, "m32r_wait()\n");
708 status->kind = TARGET_WAITKIND_EXITED;
709 status->value.sig = 0;
712 prev_sigint = signal (SIGINT, gdb_cntrl_c);
715 buf[0] = SDI_WAIT_FOR_READY;
716 if (serial_write (sdi_desc, buf, 1) != 0)
717 error (_("Remote connection closed"));
721 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
723 error (_("Remote connection closed"));
725 if (c == '-') /* error */
727 status->kind = TARGET_WAITKIND_STOPPED;
728 status->value.sig = TARGET_SIGNAL_HUP;
729 return inferior_ptid;
731 else if (c == '+') /* stopped */
735 ret = serial_write (sdi_desc, "!", 1); /* packet to interrupt */
737 ret = serial_write (sdi_desc, ".", 1); /* packet to wait */
739 error (_("Remote connection closed"));
742 status->kind = TARGET_WAITKIND_STOPPED;
744 status->value.sig = TARGET_SIGNAL_INT;
746 status->value.sig = TARGET_SIGNAL_TRAP;
749 signal (SIGINT, prev_sigint);
753 /* Recover parallel bit. */
754 if (last_pc_addr != 0xffffffff)
756 buf[0] = SDI_WRITE_MEMORY;
757 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
758 store_long_parameter (buf + 1, last_pc_addr);
760 store_long_parameter (buf + 1, last_pc_addr - 1);
761 store_long_parameter (buf + 5, 1);
762 buf[9] = last_pc_addr_data[0];
764 last_pc_addr = 0xffffffff;
767 if (use_ib_breakpoints)
768 ib_breakpoints = max_ib_breakpoints;
772 /* Set back pc by 2 if m32r is stopped with dbt. */
773 last_pc_addr = 0xffffffff;
774 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BPC);
775 pc_addr = recv_long_data () - 2;
776 for (i = ib_breakpoints; i < MAX_BREAKPOINTS; i++)
778 if (pc_addr == bp_address[i])
780 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BPC, pc_addr);
782 /* If there is a parallel instruction with +2 offset at pc
783 address, we have to take care of it later. */
784 if ((pc_addr & 0x2) != 0)
786 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
788 if ((bp_data[i][2] & 0x80) != 0)
790 last_pc_addr = pc_addr;
791 last_pc_addr_data[0] = bp_data[i][2];
792 last_pc_addr_data[1] = bp_data[i][3];
797 if ((bp_data[i][1] & 0x80) != 0)
799 last_pc_addr = pc_addr;
800 last_pc_addr_data[0] = bp_data[i][1];
801 last_pc_addr_data[1] = bp_data[i][0];
809 /* Remove ib breakpoints. */
810 for (i = 0; i < ib_breakpoints; i++)
812 if (bp_address[i] != 0xffffffff)
813 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8000 + 4 * i, 4,
816 /* Remove dbt breakpoints. */
817 for (i = ib_breakpoints; i < MAX_BREAKPOINTS; i++)
819 bp_addr = bp_address[i];
820 if (bp_addr != 0xffffffff)
823 bp_addr &= 0x7fffffff;
824 buf[0] = SDI_WRITE_MEMORY;
825 store_long_parameter (buf + 1, bp_addr & 0xfffffffc);
826 store_long_parameter (buf + 5, 4);
827 buf[9] = bp_data[i][0];
828 buf[10] = bp_data[i][1];
829 buf[11] = bp_data[i][2];
830 buf[12] = bp_data[i][3];
835 /* Remove access breaks. */
836 hit_watchpoint_addr = 0;
837 for (i = 0; i < max_access_breaks; i++)
839 if (ab_address[i] != 0x00000000)
841 buf[0] = SDI_READ_MEMORY;
842 store_long_parameter (buf + 1, 0xffff8100 + 4 * i);
843 store_long_parameter (buf + 5, 4);
844 serial_write (sdi_desc, buf, 9);
845 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
846 if (c != '-' && recv_data (buf, 4) != -1)
848 if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
850 if ((buf[3] & 0x1) == 0x1)
851 hit_watchpoint_addr = ab_address[i];
855 if ((buf[0] & 0x1) == 0x1)
856 hit_watchpoint_addr = ab_address[i];
860 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
866 fprintf_unfiltered (gdb_stdlog, "pc => 0x%lx\n", pc_addr);
868 return inferior_ptid;
871 /* Terminate the open connection to the remote debugger.
872 Use this when you want to detach and do something else
875 m32r_detach (char *args, int from_tty)
878 fprintf_unfiltered (gdb_stdlog, "m32r_detach(%d)\n", from_tty);
880 m32r_resume (inferior_ptid, 0, 0);
882 /* calls m32r_close to do the real work */
885 fprintf_unfiltered (gdb_stdlog, "Ending remote %s debugging\n",
889 /* Return the id of register number REGNO. */
892 get_reg_id (int regno)
911 /* Read the remote registers into the block REGS. */
913 static void m32r_fetch_register (struct regcache *, int);
916 m32r_fetch_registers (struct regcache *regcache)
921 regno < gdbarch_num_regs (get_regcache_arch (regcache));
923 m32r_fetch_register (regcache, regno);
926 /* Fetch register REGNO, or all registers if REGNO is -1.
927 Returns errno value. */
929 m32r_fetch_register (struct regcache *regcache, int regno)
931 unsigned long val, val2, regid;
934 m32r_fetch_registers (regcache);
937 char buffer[MAX_REGISTER_SIZE];
939 regid = get_reg_id (regno);
940 send_one_arg_cmd (SDI_READ_CPU_REG, regid);
941 val = recv_long_data ();
943 if (regid == SDI_REG_PSW)
945 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BBPSW);
946 val2 = recv_long_data ();
947 val = ((0x00cf & val2) << 8) | ((0xcf00 & val) >> 8);
951 fprintf_unfiltered (gdb_stdlog, "m32r_fetch_register(%d,0x%08lx)\n",
954 /* We got the number the register holds, but gdb expects to see a
955 value in the target byte ordering. */
956 store_unsigned_integer (buffer, 4, val);
957 regcache_raw_supply (regcache, regno, buffer);
962 /* Store the remote registers from the contents of the block REGS. */
964 static void m32r_store_register (struct regcache *, int);
967 m32r_store_registers (struct regcache *regcache)
972 regno < gdbarch_num_regs (get_regcache_arch (regcache));
974 m32r_store_register (regcache, regno);
976 registers_changed ();
979 /* Store register REGNO, or all if REGNO == 0.
980 Return errno value. */
982 m32r_store_register (struct regcache *regcache, int regno)
985 ULONGEST regval, tmp;
988 m32r_store_registers (regcache);
991 regcache_cooked_read_unsigned (regcache, regno, ®val);
992 regid = get_reg_id (regno);
994 if (regid == SDI_REG_PSW)
996 unsigned long psw, bbpsw;
998 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_PSW);
999 psw = recv_long_data ();
1001 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BBPSW);
1002 bbpsw = recv_long_data ();
1004 tmp = (0x00cf & psw) | ((0x00cf & regval) << 8);
1005 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PSW, tmp);
1007 tmp = (0x0030 & bbpsw) | ((0xcf00 & regval) >> 8);
1008 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BBPSW, tmp);
1012 send_two_arg_cmd (SDI_WRITE_CPU_REG, regid, regval);
1016 fprintf_unfiltered (gdb_stdlog, "m32r_store_register(%d,0x%08lu)\n",
1017 regno, (unsigned long) regval);
1021 /* Get ready to modify the registers array. On machines which store
1022 individual registers, this doesn't need to do anything. On machines
1023 which store all the registers in one fell swoop, this makes sure
1024 that registers contains all the registers from the program being
1028 m32r_prepare_to_store (struct regcache *regcache)
1030 /* Do nothing, since we can store individual regs */
1032 fprintf_unfiltered (gdb_stdlog, "m32r_prepare_to_store()\n");
1036 m32r_files_info (struct target_ops *target)
1038 char *file = "nothing";
1042 file = bfd_get_filename (exec_bfd);
1043 printf_filtered ("\tAttached to %s running program %s\n",
1048 /* Read/Write memory. */
1050 m32r_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
1052 struct mem_attrib *attrib, struct target_ops *target)
1054 unsigned long taddr;
1055 unsigned char buf[0x2000];
1062 if ((taddr & 0xa0000000) == 0x80000000)
1063 taddr &= 0x7fffffff;
1069 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%s,%d,write)\n",
1070 paddr (memaddr), len);
1072 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%s,%d,read)\n",
1073 paddr (memaddr), len);
1078 buf[0] = SDI_WRITE_MEMORY;
1079 store_long_parameter (buf + 1, taddr);
1080 store_long_parameter (buf + 5, len);
1083 memcpy (buf + 9, myaddr, len);
1084 ret = send_data (buf, len + 9) - 9;
1088 if (serial_write (sdi_desc, buf, 9) != 0)
1091 fprintf_unfiltered (gdb_stdlog,
1092 "m32r_xfer_memory() failed\n");
1095 ret = send_data (myaddr, len);
1100 buf[0] = SDI_READ_MEMORY;
1101 store_long_parameter (buf + 1, taddr);
1102 store_long_parameter (buf + 5, len);
1103 if (serial_write (sdi_desc, buf, 9) != 0)
1106 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory() failed\n");
1110 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
1111 if (c < 0 || c == '-')
1114 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory() failed\n");
1118 ret = recv_data (myaddr, len);
1124 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory() fails\n");
1135 fprintf_unfiltered (gdb_stdlog, "m32r_kill()\n");
1137 inferior_ptid = null_ptid;
1138 delete_thread_silent (remote_m32r_ptid);
1143 /* Clean up when a program exits.
1145 The program actually lives on in the remote processor's RAM, and may be
1146 run again without a download. Don't leave it full of breakpoint
1150 m32r_mourn_inferior (void)
1153 fprintf_unfiltered (gdb_stdlog, "m32r_mourn_inferior()\n");
1155 remove_breakpoints ();
1156 generic_mourn_inferior ();
1160 m32r_insert_breakpoint (struct bp_target_info *bp_tgt)
1162 CORE_ADDR addr = bp_tgt->placed_address;
1164 unsigned char buf[13];
1168 fprintf_unfiltered (gdb_stdlog, "m32r_insert_breakpoint(%s,...)\n",
1171 if (use_ib_breakpoints)
1172 ib_breakpoints = max_ib_breakpoints;
1176 for (i = 0; i < MAX_BREAKPOINTS; i++)
1178 if (bp_address[i] == 0xffffffff)
1180 bp_address[i] = addr;
1181 if (i >= ib_breakpoints)
1183 buf[0] = SDI_READ_MEMORY;
1185 store_long_parameter (buf + 1, addr & 0xfffffffc);
1187 store_long_parameter (buf + 1, addr & 0x7ffffffc);
1188 store_long_parameter (buf + 5, 4);
1189 serial_write (sdi_desc, buf, 9);
1190 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
1192 recv_data (bp_data[i], 4);
1198 error (_("Too many breakpoints"));
1203 m32r_remove_breakpoint (struct bp_target_info *bp_tgt)
1205 CORE_ADDR addr = bp_tgt->placed_address;
1209 fprintf_unfiltered (gdb_stdlog, "m32r_remove_breakpoint(%s)\n",
1212 for (i = 0; i < MAX_BREAKPOINTS; i++)
1214 if (bp_address[i] == addr)
1216 bp_address[i] = 0xffffffff;
1225 m32r_load (char *args, int from_tty)
1227 struct cleanup *old_chain;
1234 struct timeval start_time, end_time;
1235 unsigned long data_count; /* Number of bytes transferred to memory */
1237 static RETSIGTYPE (*prev_sigint) ();
1239 /* for direct tcp connections, we can do a fast binary download */
1244 while (*args != '\000')
1248 while (isspace (*args))
1253 while ((*args != '\000') && !isspace (*args))
1256 if (*args != '\000')
1261 else if (strncmp (arg, "-quiet", strlen (arg)) == 0)
1263 else if (strncmp (arg, "-nostart", strlen (arg)) == 0)
1266 error (_("Unknown option `%s'"), arg);
1270 filename = get_exec_file (1);
1272 pbfd = bfd_openr (filename, gnutarget);
1275 perror_with_name (filename);
1278 old_chain = make_cleanup_bfd_close (pbfd);
1280 if (!bfd_check_format (pbfd, bfd_object))
1281 error (_("\"%s\" is not an object file: %s"), filename,
1282 bfd_errmsg (bfd_get_error ()));
1284 gettimeofday (&start_time, NULL);
1288 prev_sigint = signal (SIGINT, gdb_cntrl_c);
1290 for (section = pbfd->sections; section; section = section->next)
1292 if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)
1294 bfd_vma section_address;
1295 bfd_size_type section_size;
1299 section_address = bfd_section_lma (pbfd, section);
1300 section_size = bfd_get_section_size (section);
1304 if ((section_address & 0xa0000000) == 0x80000000)
1305 section_address &= 0x7fffffff;
1309 printf_filtered ("[Loading section %s at 0x%lx (%d bytes)]\n",
1310 bfd_get_section_name (pbfd, section),
1311 (unsigned long) section_address,
1312 (int) section_size);
1316 data_count += section_size;
1319 while (section_size > 0)
1321 char unsigned buf[0x1000 + 9];
1324 count = min (section_size, 0x1000);
1326 buf[0] = SDI_WRITE_MEMORY;
1327 store_long_parameter (buf + 1, section_address);
1328 store_long_parameter (buf + 5, count);
1330 bfd_get_section_contents (pbfd, section, buf + 9, fptr, count);
1331 if (send_data (buf, count + 9) <= 0)
1332 error (_("Error while downloading %s section."),
1333 bfd_get_section_name (pbfd, section));
1337 printf_unfiltered (".");
1340 printf_unfiltered ("\n");
1343 gdb_flush (gdb_stdout);
1346 section_address += count;
1348 section_size -= count;
1354 if (!quiet && !interrupted)
1356 printf_unfiltered ("done.\n");
1357 gdb_flush (gdb_stdout);
1363 printf_unfiltered ("Interrupted.\n");
1369 signal (SIGINT, prev_sigint);
1371 gettimeofday (&end_time, NULL);
1373 /* Make the PC point at the start address */
1375 write_pc (bfd_get_start_address (exec_bfd));
1377 inferior_ptid = null_ptid; /* No process now */
1378 delete_thread_silent (remote_m32r_ptid);
1380 /* This is necessary because many things were based on the PC at the time
1381 that we attached to the monitor, which is no longer valid now that we
1382 have loaded new code (and just changed the PC). Another way to do this
1383 might be to call normal_stop, except that the stack may not be valid,
1384 and things would get horribly confused... */
1386 clear_symtab_users ();
1390 entry = bfd_get_start_address (pbfd);
1393 printf_unfiltered ("[Starting %s at 0x%lx]\n", filename,
1394 (unsigned long) entry);
1397 print_transfer_performance (gdb_stdout, data_count, 0, &start_time,
1400 do_cleanups (old_chain);
1404 m32r_stop (ptid_t ptid)
1407 fprintf_unfiltered (gdb_stdlog, "m32r_stop()\n");
1409 send_cmd (SDI_STOP_CPU);
1415 /* Tell whether this target can support a hardware breakpoint. CNT
1416 is the number of hardware breakpoints already installed. This
1417 implements the TARGET_CAN_USE_HARDWARE_WATCHPOINT macro. */
1420 m32r_can_use_hw_watchpoint (int type, int cnt, int othertype)
1422 return sdi_desc != NULL && cnt < max_access_breaks;
1425 /* Set a data watchpoint. ADDR and LEN should be obvious. TYPE is 0
1426 for a write watchpoint, 1 for a read watchpoint, or 2 for a read/write
1430 m32r_insert_watchpoint (CORE_ADDR addr, int len, int type)
1435 fprintf_unfiltered (gdb_stdlog, "m32r_insert_watchpoint(%s,%d,%d)\n",
1436 paddr (addr), len, type);
1438 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
1440 if (ab_address[i] == 0x00000000)
1442 ab_address[i] = addr;
1449 error (_("Too many watchpoints"));
1454 m32r_remove_watchpoint (CORE_ADDR addr, int len, int type)
1459 fprintf_unfiltered (gdb_stdlog, "m32r_remove_watchpoint(%s,%d,%d)\n",
1460 paddr (addr), len, type);
1462 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
1464 if (ab_address[i] == addr)
1466 ab_address[i] = 0x00000000;
1475 m32r_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
1478 if (hit_watchpoint_addr != 0x00000000)
1480 *addr_p = hit_watchpoint_addr;
1487 m32r_stopped_by_watchpoint (void)
1490 return m32r_stopped_data_address (¤t_target, &addr);
1495 sdireset_command (char *args, int from_tty)
1498 fprintf_unfiltered (gdb_stdlog, "m32r_sdireset()\n");
1500 send_cmd (SDI_OPEN);
1502 inferior_ptid = null_ptid;
1503 delete_thread_silent (remote_m32r_ptid);
1508 sdistatus_command (char *args, int from_tty)
1510 unsigned char buf[4096];
1514 fprintf_unfiltered (gdb_stdlog, "m32r_sdireset()\n");
1519 send_cmd (SDI_STATUS);
1520 for (i = 0; i < 4096; i++)
1522 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
1530 printf_filtered ("%s", buf);
1535 debug_chaos_command (char *args, int from_tty)
1537 unsigned char buf[3];
1539 buf[0] = SDI_SET_ATTR;
1540 buf[1] = SDI_ATTR_CACHE;
1541 buf[2] = SDI_CACHE_TYPE_CHAOS;
1547 use_debug_dma_command (char *args, int from_tty)
1549 unsigned char buf[3];
1551 buf[0] = SDI_SET_ATTR;
1552 buf[1] = SDI_ATTR_MEM_ACCESS;
1553 buf[2] = SDI_MEM_ACCESS_DEBUG_DMA;
1558 use_mon_code_command (char *args, int from_tty)
1560 unsigned char buf[3];
1562 buf[0] = SDI_SET_ATTR;
1563 buf[1] = SDI_ATTR_MEM_ACCESS;
1564 buf[2] = SDI_MEM_ACCESS_MON_CODE;
1570 use_ib_breakpoints_command (char *args, int from_tty)
1572 use_ib_breakpoints = 1;
1576 use_dbt_breakpoints_command (char *args, int from_tty)
1578 use_ib_breakpoints = 0;
1582 /* Define the target subroutine names */
1584 struct target_ops m32r_ops;
1587 init_m32r_ops (void)
1589 m32r_ops.to_shortname = "m32rsdi";
1590 m32r_ops.to_longname = "Remote M32R debugging over SDI interface";
1591 m32r_ops.to_doc = "Use an M32R board using SDI debugging protocol.";
1592 m32r_ops.to_open = m32r_open;
1593 m32r_ops.to_close = m32r_close;
1594 m32r_ops.to_detach = m32r_detach;
1595 m32r_ops.to_resume = m32r_resume;
1596 m32r_ops.to_wait = m32r_wait;
1597 m32r_ops.to_fetch_registers = m32r_fetch_register;
1598 m32r_ops.to_store_registers = m32r_store_register;
1599 m32r_ops.to_prepare_to_store = m32r_prepare_to_store;
1600 m32r_ops.deprecated_xfer_memory = m32r_xfer_memory;
1601 m32r_ops.to_files_info = m32r_files_info;
1602 m32r_ops.to_insert_breakpoint = m32r_insert_breakpoint;
1603 m32r_ops.to_remove_breakpoint = m32r_remove_breakpoint;
1604 m32r_ops.to_can_use_hw_breakpoint = m32r_can_use_hw_watchpoint;
1605 m32r_ops.to_insert_watchpoint = m32r_insert_watchpoint;
1606 m32r_ops.to_remove_watchpoint = m32r_remove_watchpoint;
1607 m32r_ops.to_stopped_by_watchpoint = m32r_stopped_by_watchpoint;
1608 m32r_ops.to_stopped_data_address = m32r_stopped_data_address;
1609 m32r_ops.to_kill = m32r_kill;
1610 m32r_ops.to_load = m32r_load;
1611 m32r_ops.to_create_inferior = m32r_create_inferior;
1612 m32r_ops.to_mourn_inferior = m32r_mourn_inferior;
1613 m32r_ops.to_stop = m32r_stop;
1614 m32r_ops.to_log_command = serial_log_command;
1615 m32r_ops.to_stratum = process_stratum;
1616 m32r_ops.to_has_all_memory = 1;
1617 m32r_ops.to_has_memory = 1;
1618 m32r_ops.to_has_stack = 1;
1619 m32r_ops.to_has_registers = 1;
1620 m32r_ops.to_has_execution = 1;
1621 m32r_ops.to_magic = OPS_MAGIC;
1625 extern initialize_file_ftype _initialize_remote_m32r;
1628 _initialize_remote_m32r (void)
1634 /* Initialize breakpoints. */
1635 for (i = 0; i < MAX_BREAKPOINTS; i++)
1636 bp_address[i] = 0xffffffff;
1638 /* Initialize access breaks. */
1639 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
1640 ab_address[i] = 0x00000000;
1642 add_target (&m32r_ops);
1644 add_com ("sdireset", class_obscure, sdireset_command,
1645 _("Reset SDI connection."));
1647 add_com ("sdistatus", class_obscure, sdistatus_command,
1648 _("Show status of SDI connection."));
1650 add_com ("debug_chaos", class_obscure, debug_chaos_command,
1651 _("Debug M32R/Chaos."));
1653 add_com ("use_debug_dma", class_obscure, use_debug_dma_command,
1654 _("Use debug DMA mem access."));
1655 add_com ("use_mon_code", class_obscure, use_mon_code_command,
1656 _("Use mon code mem access."));
1658 add_com ("use_ib_break", class_obscure, use_ib_breakpoints_command,
1659 _("Set breakpoints by IB break."));
1660 add_com ("use_dbt_break", class_obscure, use_dbt_breakpoints_command,
1661 _("Set breakpoints by dbt."));
1663 /* Yes, 42000 is arbitrary. The only sense out of it, is that it
1665 remote_m32r_ptid = ptid_build (42000, 0, 42000);