OSDN Git Service

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