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