frame: add frame_id_build_unavailable_stack_special
[deliverable/binutils-gdb.git] / gdb / remote-m32r-sdi.c
CommitLineData
b4b4b794
KI
1/* Remote debugging interface for M32R/SDI.
2
ecd75fc8 3 Copyright (C) 2003-2014 Free Software Foundation, Inc.
b4b4b794
KI
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
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
b4b4b794
KI
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
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
b4b4b794
KI
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"
0e9f083f 29#include <string.h>
e5ef4d75 30#include "gdbthread.h"
b4b4b794
KI
31#include <ctype.h>
32#include <signal.h>
cbba9205 33#ifdef __MINGW32__
b467f580 34#include <winsock2.h>
cbba9205 35#else
b4b4b794 36#include <netinet/in.h>
cbba9205 37#endif
b4b4b794
KI
38#include <sys/types.h>
39#include <sys/time.h>
b4b4b794 40#include <time.h>
cbb099e8 41#include "gdb_bfd.h"
529480d0 42#include "cli/cli-utils.h"
b4b4b794
KI
43
44#include "serial.h"
45
46/* Descriptor for I/O to remote machine. */
47
48static struct serial *sdi_desc = NULL;
49
50#define SDI_TIMEOUT 30
51
52
53#define SDIPORT 3232
54
55static char chip_name[64];
56
57static int step_mode;
58static unsigned long last_pc_addr = 0xffffffff;
59static unsigned char last_pc_addr_data[2];
60
61static int mmu_on = 0;
62
63static int use_ib_breakpoints = 1;
64
65#define MAX_BREAKPOINTS 1024
66static int max_ib_breakpoints;
67static unsigned long bp_address[MAX_BREAKPOINTS];
68static unsigned char bp_data[MAX_BREAKPOINTS][4];
b4b4b794
KI
69
70/* dbt -> nop */
71static const unsigned char dbt_bp_entry[] = {
72 0x10, 0xe0, 0x70, 0x00
73};
74
75#define MAX_ACCESS_BREAKS 4
76static int max_access_breaks;
77static unsigned long ab_address[MAX_ACCESS_BREAKS];
78static unsigned int ab_type[MAX_ACCESS_BREAKS];
79static unsigned int ab_size[MAX_ACCESS_BREAKS];
80static CORE_ADDR hit_watchpoint_addr = 0;
81
82static int interrupted = 0;
83
84/* Forward data declarations */
85extern struct target_ops m32r_ops;
86
e5ef4d75
PA
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. */
91static ptid_t remote_m32r_ptid;
b4b4b794
KI
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
0df8b418 158/* Low level communication functions. */
b4b4b794 159
0df8b418 160/* Check an ack packet from the target. */
b4b4b794
KI
161static int
162get_ack (void)
163{
164 int c;
165
717eb1cf 166 if (!sdi_desc)
b4b4b794
KI
167 return -1;
168
169 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
170
171 if (c < 0)
172 return -1;
173
717eb1cf 174 if (c != '+') /* error */
b4b4b794
KI
175 return -1;
176
177 return 0;
178}
179
0df8b418 180/* Send data to the target and check an ack packet. */
b4b4b794
KI
181static int
182send_data (void *buf, int len)
183{
717eb1cf 184 if (!sdi_desc)
b4b4b794
KI
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
0df8b418 196/* Receive data from the target. */
b4b4b794
KI
197static int
198recv_data (void *buf, int len)
199{
200 int total = 0;
201 int c;
202
717eb1cf 203 if (!sdi_desc)
b4b4b794
KI
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
0df8b418 219/* Store unsigned long parameter on packet. */
b4b4b794
KI
220static void
221store_long_parameter (void *buf, long val)
222{
223 val = htonl (val);
224 memcpy (buf, &val, 4);
225}
226
e22f895c
KI
227static int
228send_cmd (unsigned char cmd)
229{
230 unsigned char buf[1];
123f5f96 231
e22f895c
KI
232 buf[0] = cmd;
233 return send_data (buf, 1);
234}
235
236static int
237send_one_arg_cmd (unsigned char cmd, unsigned char arg1)
238{
239 unsigned char buf[2];
123f5f96 240
e22f895c
KI
241 buf[0] = cmd;
242 buf[1] = arg1;
243 return send_data (buf, 2);
244}
245
246static int
247send_two_arg_cmd (unsigned char cmd, unsigned char arg1, unsigned long arg2)
248{
249 unsigned char buf[6];
123f5f96 250
e22f895c
KI
251 buf[0] = cmd;
252 buf[1] = arg1;
253 store_long_parameter (buf + 2, arg2);
254 return send_data (buf, 6);
255}
256
257static int
258send_three_arg_cmd (unsigned char cmd, unsigned long arg1, unsigned long arg2,
259 unsigned long arg3)
260{
261 unsigned char buf[13];
123f5f96 262
e22f895c
KI
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
270static unsigned char
271recv_char_data (void)
272{
273 unsigned char val;
123f5f96 274
e22f895c
KI
275 recv_data (&val, 1);
276 return val;
277}
278
279static unsigned long
280recv_long_data (void)
281{
282 unsigned long val;
123f5f96 283
e22f895c
KI
284 recv_data (&val, 4);
285 return ntohl (val);
286}
287
288
0df8b418 289/* Check if MMU is on. */
b4b4b794
KI
290static void
291check_mmu_status (void)
292{
293 unsigned long val;
b4b4b794 294
0df8b418 295 /* Read PC address. */
e22f895c 296 if (send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BPC) == -1)
b4b4b794 297 return;
e22f895c 298 val = recv_long_data ();
b4b4b794
KI
299 if ((val & 0xc0000000) == 0x80000000)
300 {
301 mmu_on = 1;
302 return;
303 }
304
0df8b418 305 /* Read EVB address. */
e22f895c 306 if (send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_EVB) == -1)
b4b4b794 307 return;
e22f895c 308 val = recv_long_data ();
b4b4b794
KI
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. */
321static void
136d6dae
VP
322m32r_create_inferior (struct target_ops *ops, char *execfile,
323 char *args, char **env, int from_tty)
b4b4b794
KI
324{
325 CORE_ADDR entry_pt;
326
327 if (args && *args)
8a3fe4f8 328 error (_("Cannot pass arguments to remote STDEBUG process"));
b4b4b794
KI
329
330 if (execfile == 0 || exec_bfd == 0)
8a3fe4f8 331 error (_("No executable file specified"));
b4b4b794
KI
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
fb14de7b 354 regcache_write_pc (get_current_regcache (), entry_pt);
b4b4b794
KI
355}
356
357/* Open a connection to a remote debugger.
358 NAME is the filename used for communication. */
359
360static void
361m32r_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;
b4b4b794
KI
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)
8c042590 378 xsnprintf (hostname, sizeof (hostname), "localhost:%d", SDIPORT);
b4b4b794
KI
379 else
380 {
381 port_str = strchr (args, ':');
382 if (port_str == NULL)
8c042590 383 xsnprintf (hostname, sizeof (hostname), "%s:%d", args, SDIPORT);
b4b4b794 384 else
8c042590 385 xsnprintf (hostname, sizeof (hostname), "%s", args);
b4b4b794
KI
386 }
387
388 sdi_desc = serial_open (hostname);
389 if (!sdi_desc)
8a3fe4f8 390 error (_("Connection refused."));
b4b4b794
KI
391
392 if (get_ack () == -1)
8a3fe4f8 393 error (_("Cannot connect to SDI target."));
b4b4b794 394
e22f895c 395 if (send_cmd (SDI_OPEN) == -1)
8a3fe4f8 396 error (_("Cannot connect to SDI target."));
b4b4b794 397
0df8b418 398 /* Get maximum number of ib breakpoints. */
e22f895c
KI
399 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_BRK);
400 max_ib_breakpoints = recv_char_data ();
b4b4b794
KI
401 if (remote_debug)
402 printf_filtered ("Max IB Breakpoints = %d\n", max_ib_breakpoints);
403
0df8b418 404 /* Initialize breakpoints. */
b4b4b794
KI
405 for (i = 0; i < MAX_BREAKPOINTS; i++)
406 bp_address[i] = 0xffffffff;
407
0df8b418 408 /* Get maximum number of access breaks. */
e22f895c
KI
409 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_ABRK);
410 max_access_breaks = recv_char_data ();
b4b4b794
KI
411 if (remote_debug)
412 printf_filtered ("Max Access Breaks = %d\n", max_access_breaks);
413
0df8b418 414 /* Initialize access breask. */
b4b4b794
KI
415 for (i = 0; i < MAX_ACCESS_BREAKS; i++)
416 ab_address[i] = 0x00000000;
417
418 check_mmu_status ();
419
0df8b418 420 /* Get the name of chip on target board. */
e22f895c 421 send_one_arg_cmd (SDI_GET_ATTR, SDI_ATTR_NAME);
b4b4b794
KI
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
0df8b418 429/* Close out all files and local state before this target loses control. */
b4b4b794
KI
430
431static void
460014f5 432m32r_close (void)
b4b4b794 433{
b4b4b794 434 if (remote_debug)
460014f5 435 fprintf_unfiltered (gdb_stdlog, "m32r_close()\n");
b4b4b794
KI
436
437 if (sdi_desc)
438 {
e22f895c 439 send_cmd (SDI_CLOSE);
b4b4b794
KI
440 serial_close (sdi_desc);
441 sdi_desc = NULL;
442 }
443
444 inferior_ptid = null_ptid;
e5ef4d75 445 delete_thread_silent (remote_m32r_ptid);
b4b4b794
KI
446 return;
447}
448
449/* Tell the remote machine to resume. */
450
451static void
28439f5e 452m32r_resume (struct target_ops *ops,
2ea28649 453 ptid_t ptid, int step, enum gdb_signal sig)
b4b4b794
KI
454{
455 unsigned long pc_addr, bp_addr, ab_addr;
e22f895c 456 int ib_breakpoints;
b4b4b794
KI
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
fb14de7b 470 pc_addr = regcache_read_pc (get_current_regcache ());
b4b4b794
KI
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,
0df8b418 475 so we have to make it a serial instruction or avoid it. */
b4b4b794
KI
476 if (pc_addr == last_pc_addr)
477 {
0df8b418 478 /* Avoid a parallel nop. */
b4b4b794
KI
479 if (last_pc_addr_data[0] == 0xf0 && last_pc_addr_data[1] == 0x00)
480 {
481 pc_addr += 2;
0df8b418 482 /* Now we can forget this instruction. */
b4b4b794
KI
483 last_pc_addr = 0xffffffff;
484 }
0df8b418 485 /* Clear a parallel bit. */
b4b4b794
KI
486 else
487 {
488 buf[0] = SDI_WRITE_MEMORY;
f5656ead 489 if (gdbarch_byte_order (target_gdbarch ()) == BFD_ENDIAN_BIG)
b4b4b794
KI
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
0df8b418 499 /* Set PC. */
e22f895c 500 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BPC, pc_addr);
b4b4b794 501
0df8b418 502 /* step mode. */
b4b4b794
KI
503 step_mode = step;
504 if (step)
505 {
0df8b418 506 /* Set PBP. */
e22f895c 507 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PBP, pc_addr | 1);
b4b4b794
KI
508 }
509 else
510 {
0df8b418 511 /* Unset PBP. */
e22f895c
KI
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
0df8b418 520 /* Set ib breakpoints. */
e22f895c
KI
521 for (i = 0; i < ib_breakpoints; i++)
522 {
523 bp_addr = bp_address[i];
b4b4b794 524
e22f895c
KI
525 if (bp_addr == 0xffffffff)
526 continue;
527
0df8b418 528 /* Set PBP. */
f5656ead 529 if (gdbarch_byte_order (target_gdbarch ()) == BFD_ENDIAN_BIG)
e22f895c
KI
530 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8000 + 4 * i, 4,
531 0x00000006);
b4b4b794 532 else
e22f895c
KI
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
0df8b418 539 /* Set dbt breakpoints. */
e22f895c
KI
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;
b4b4b794 549
0df8b418 550 /* Write DBT instruction. */
e22f895c 551 buf[0] = SDI_WRITE_MEMORY;
492e5c6b 552 store_long_parameter (buf + 1, (bp_addr & 0xfffffffc));
e22f895c
KI
553 store_long_parameter (buf + 5, 4);
554 if ((bp_addr & 2) == 0 && bp_addr != (pc_addr & 0xfffffffc))
b4b4b794 555 {
f5656ead 556 if (gdbarch_byte_order (target_gdbarch ()) == BFD_ENDIAN_BIG)
b4b4b794 557 {
e22f895c
KI
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];
b4b4b794
KI
569 }
570 }
e22f895c 571 else
b4b4b794 572 {
f5656ead 573 if (gdbarch_byte_order (target_gdbarch ()) == BFD_ENDIAN_BIG)
b4b4b794 574 {
e22f895c 575 if ((bp_addr & 2) == 0)
b4b4b794 576 {
e22f895c
KI
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];
b4b4b794
KI
581 }
582 else
583 {
e22f895c
KI
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];
b4b4b794
KI
588 }
589 }
e22f895c 590 else
b4b4b794 591 {
e22f895c 592 if ((bp_addr & 2) == 0)
b4b4b794 593 {
e22f895c
KI
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];
b4b4b794
KI
598 }
599 else
600 {
e22f895c
KI
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];
b4b4b794 605 }
e22f895c
KI
606 }
607 }
608 send_data (buf, 13);
609 }
b4b4b794 610
0df8b418 611 /* Set access breaks. */
e22f895c
KI
612 for (i = 0; i < max_access_breaks; i++)
613 {
614 ab_addr = ab_address[i];
b4b4b794 615
e22f895c
KI
616 if (ab_addr == 0x00000000)
617 continue;
b4b4b794 618
0df8b418 619 /* DBC register. */
f5656ead 620 if (gdbarch_byte_order (target_gdbarch ()) == BFD_ENDIAN_BIG)
e22f895c
KI
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;
b4b4b794
KI
654 }
655 }
656
0df8b418 657 /* DBAH register. */
e22f895c
KI
658 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8180 + 4 * i, 4, ab_addr);
659
0df8b418 660 /* DBAL register. */
e22f895c
KI
661 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8200 + 4 * i, 4,
662 0xffffffff);
663
0df8b418 664 /* DBD register. */
e22f895c
KI
665 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8280 + 4 * i, 4,
666 0x00000000);
667
0df8b418 668 /* DBDM register. */
e22f895c
KI
669 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8300 + 4 * i, 4,
670 0x00000000);
b4b4b794
KI
671 }
672
0df8b418 673 /* Resume program. */
e22f895c 674 send_cmd (SDI_EXEC_CPU);
b4b4b794
KI
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. */
e5ef4d75
PA
682 inferior_ptid = remote_m32r_ptid;
683 add_thread_silent (remote_m32r_ptid);
b4b4b794
KI
684
685 return;
686}
687
688/* Wait until the remote machine stops, then return,
689 storing status in STATUS just as `wait' would. */
690
691static void
692gdb_cntrl_c (int signo)
693{
694 if (remote_debug)
695 fprintf_unfiltered (gdb_stdlog, "interrupt\n");
696 interrupted = 1;
697}
698
699static ptid_t
117de6a9 700m32r_wait (struct target_ops *ops,
61439e34 701 ptid_t ptid, struct target_waitstatus *status, int options)
b4b4b794
KI
702{
703 static RETSIGTYPE (*prev_sigint) ();
704 unsigned long bp_addr, pc_addr;
e22f895c 705 int ib_breakpoints;
b4b4b794
KI
706 long i;
707 unsigned char buf[13];
b4b4b794
KI
708 int ret, c;
709
710 if (remote_debug)
711 fprintf_unfiltered (gdb_stdlog, "m32r_wait()\n");
712
713 status->kind = TARGET_WAITKIND_EXITED;
a493e3e2 714 status->value.sig = GDB_SIGNAL_0;
b4b4b794
KI
715
716 interrupted = 0;
717 prev_sigint = signal (SIGINT, gdb_cntrl_c);
718
0df8b418 719 /* Wait for ready. */
b4b4b794
KI
720 buf[0] = SDI_WAIT_FOR_READY;
721 if (serial_write (sdi_desc, buf, 1) != 0)
8a3fe4f8 722 error (_("Remote connection closed"));
b4b4b794
KI
723
724 while (1)
725 {
726 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
727 if (c < 0)
8a3fe4f8 728 error (_("Remote connection closed"));
b4b4b794 729
717eb1cf 730 if (c == '-') /* error */
b4b4b794
KI
731 {
732 status->kind = TARGET_WAITKIND_STOPPED;
a493e3e2 733 status->value.sig = GDB_SIGNAL_HUP;
b4b4b794
KI
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)
8a3fe4f8 744 error (_("Remote connection closed"));
b4b4b794
KI
745 }
746
747 status->kind = TARGET_WAITKIND_STOPPED;
748 if (interrupted)
a493e3e2 749 status->value.sig = GDB_SIGNAL_INT;
b4b4b794 750 else
a493e3e2 751 status->value.sig = GDB_SIGNAL_TRAP;
b4b4b794
KI
752
753 interrupted = 0;
754 signal (SIGINT, prev_sigint);
755
756 check_mmu_status ();
757
0df8b418 758 /* Recover parallel bit. */
b4b4b794
KI
759 if (last_pc_addr != 0xffffffff)
760 {
761 buf[0] = SDI_WRITE_MEMORY;
f5656ead 762 if (gdbarch_byte_order (target_gdbarch ()) == BFD_ENDIAN_BIG)
b4b4b794
KI
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
e22f895c
KI
772 if (use_ib_breakpoints)
773 ib_breakpoints = max_ib_breakpoints;
774 else
775 ib_breakpoints = 0;
b4b4b794 776
0df8b418 777 /* Set back pc by 2 if m32r is stopped with dbt. */
e22f895c
KI
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])
b4b4b794 784 {
e22f895c
KI
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
0df8b418 788 address, we have to take care of it later. */
e22f895c 789 if ((pc_addr & 0x2) != 0)
b4b4b794 790 {
f5656ead 791 if (gdbarch_byte_order (target_gdbarch ()) == BFD_ENDIAN_BIG)
b4b4b794 792 {
e22f895c 793 if ((bp_data[i][2] & 0x80) != 0)
b4b4b794 794 {
e22f895c
KI
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];
b4b4b794 798 }
e22f895c
KI
799 }
800 else
801 {
802 if ((bp_data[i][1] & 0x80) != 0)
b4b4b794 803 {
e22f895c
KI
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];
b4b4b794
KI
807 }
808 }
b4b4b794 809 }
e22f895c 810 break;
b4b4b794 811 }
e22f895c 812 }
b4b4b794 813
0df8b418 814 /* Remove ib breakpoints. */
e22f895c
KI
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 }
0df8b418 821 /* Remove dbt breakpoints. */
e22f895c
KI
822 for (i = ib_breakpoints; i < MAX_BREAKPOINTS; i++)
823 {
824 bp_addr = bp_address[i];
825 if (bp_addr != 0xffffffff)
b4b4b794 826 {
e22f895c
KI
827 if (!mmu_on)
828 bp_addr &= 0x7fffffff;
492e5c6b 829 buf[0] = SDI_WRITE_MEMORY;
e22f895c
KI
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);
b4b4b794 837 }
e22f895c 838 }
b4b4b794 839
0df8b418 840 /* Remove access breaks. */
e22f895c
KI
841 hit_watchpoint_addr = 0;
842 for (i = 0; i < max_access_breaks; i++)
843 {
844 if (ab_address[i] != 0x00000000)
b4b4b794 845 {
e22f895c
KI
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)
b4b4b794 852 {
f5656ead 853 if (gdbarch_byte_order (target_gdbarch ()) == BFD_ENDIAN_BIG)
b4b4b794 854 {
e22f895c
KI
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];
b4b4b794 862 }
b4b4b794 863 }
b4b4b794 864
e22f895c
KI
865 send_three_arg_cmd (SDI_WRITE_MEMORY, 0xffff8100 + 4 * i, 4,
866 0x00000000);
867 }
b4b4b794 868 }
e22f895c
KI
869
870 if (remote_debug)
871 fprintf_unfiltered (gdb_stdlog, "pc => 0x%lx\n", pc_addr);
b4b4b794
KI
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. */
879static void
52554a0e 880m32r_detach (struct target_ops *ops, const char *args, int from_tty)
b4b4b794
KI
881{
882 if (remote_debug)
883 fprintf_unfiltered (gdb_stdlog, "m32r_detach(%d)\n", from_tty);
884
a493e3e2 885 m32r_resume (ops, inferior_ptid, 0, GDB_SIGNAL_0);
b4b4b794 886
0df8b418 887 /* Calls m32r_close to do the real work. */
7fdc1521 888 unpush_target (ops);
b4b4b794
KI
889 if (from_tty)
890 fprintf_unfiltered (gdb_stdlog, "Ending remote %s debugging\n",
891 target_shortname);
892}
893
0df8b418 894/* Return the id of register number REGNO. */
b4b4b794
KI
895
896static int
897get_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
b4b4b794
KI
916/* Fetch register REGNO, or all registers if REGNO is -1.
917 Returns errno value. */
918static void
28439f5e
PA
919m32r_fetch_register (struct target_ops *ops,
920 struct regcache *regcache, int regno)
b4b4b794 921{
e17a4113
UW
922 struct gdbarch *gdbarch = get_regcache_arch (regcache);
923 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
b4b4b794 924 unsigned long val, val2, regid;
b4b4b794
KI
925
926 if (regno == -1)
28439f5e
PA
927 {
928 for (regno = 0;
929 regno < gdbarch_num_regs (get_regcache_arch (regcache));
930 regno++)
931 m32r_fetch_register (ops, regcache, regno);
932 }
b4b4b794
KI
933 else
934 {
948f8e3d 935 gdb_byte buffer[MAX_REGISTER_SIZE];
b4b4b794
KI
936
937 regid = get_reg_id (regno);
e22f895c
KI
938 send_one_arg_cmd (SDI_READ_CPU_REG, regid);
939 val = recv_long_data ();
b4b4b794
KI
940
941 if (regid == SDI_REG_PSW)
942 {
e22f895c
KI
943 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BBPSW);
944 val2 = recv_long_data ();
3e41d55f 945 val = ((0x00cf & val2) << 8) | ((0xcf00 & val) >> 8);
b4b4b794
KI
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. */
e17a4113 954 store_unsigned_integer (buffer, 4, byte_order, val);
56be3814 955 regcache_raw_supply (regcache, regno, buffer);
b4b4b794
KI
956 }
957 return;
958}
959
b4b4b794
KI
960/* Store register REGNO, or all if REGNO == 0.
961 Return errno value. */
962static void
28439f5e
PA
963m32r_store_register (struct target_ops *ops,
964 struct regcache *regcache, int regno)
b4b4b794
KI
965{
966 int regid;
967 ULONGEST regval, tmp;
b4b4b794
KI
968
969 if (regno == -1)
28439f5e
PA
970 {
971 for (regno = 0;
972 regno < gdbarch_num_regs (get_regcache_arch (regcache));
973 regno++)
974 m32r_store_register (ops, regcache, regno);
975 }
b4b4b794
KI
976 else
977 {
56be3814 978 regcache_cooked_read_unsigned (regcache, regno, &regval);
b4b4b794
KI
979 regid = get_reg_id (regno);
980
981 if (regid == SDI_REG_PSW)
982 {
983 unsigned long psw, bbpsw;
984
e22f895c
KI
985 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_PSW);
986 psw = recv_long_data ();
b4b4b794 987
e22f895c
KI
988 send_one_arg_cmd (SDI_READ_CPU_REG, SDI_REG_BBPSW);
989 bbpsw = recv_long_data ();
b4b4b794 990
3e41d55f 991 tmp = (0x00cf & psw) | ((0x00cf & regval) << 8);
e22f895c 992 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_PSW, tmp);
b4b4b794 993
3e41d55f 994 tmp = (0x0030 & bbpsw) | ((0xcf00 & regval) >> 8);
e22f895c 995 send_two_arg_cmd (SDI_WRITE_CPU_REG, SDI_REG_BBPSW, tmp);
b4b4b794
KI
996 }
997 else
998 {
e22f895c 999 send_two_arg_cmd (SDI_WRITE_CPU_REG, regid, regval);
b4b4b794
KI
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
1014static void
316f2060 1015m32r_prepare_to_store (struct regcache *regcache)
b4b4b794 1016{
0df8b418 1017 /* Do nothing, since we can store individual regs. */
b4b4b794
KI
1018 if (remote_debug)
1019 fprintf_unfiltered (gdb_stdlog, "m32r_prepare_to_store()\n");
1020}
1021
1022static void
1023m32r_files_info (struct target_ops *target)
1024{
0d18d720 1025 const char *file = "nothing";
b4b4b794
KI
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. */
1036static int
16ac4ab5 1037m32r_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
b4b4b794
KI
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)
ec20a626 1056 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%s,%d,write)\n",
f5656ead 1057 paddress (target_gdbarch (), memaddr), len);
b4b4b794 1058 else
ec20a626 1059 fprintf_unfiltered (gdb_stdlog, "m32r_xfer_memory(%s,%d,read)\n",
f5656ead 1060 paddress (target_gdbarch (), memaddr), len);
b4b4b794
KI
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
1118static void
7d85a9c0 1119m32r_kill (struct target_ops *ops)
b4b4b794
KI
1120{
1121 if (remote_debug)
1122 fprintf_unfiltered (gdb_stdlog, "m32r_kill()\n");
1123
1124 inferior_ptid = null_ptid;
e5ef4d75 1125 delete_thread_silent (remote_m32r_ptid);
b4b4b794
KI
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
1136static void
136d6dae 1137m32r_mourn_inferior (struct target_ops *ops)
b4b4b794
KI
1138{
1139 if (remote_debug)
1140 fprintf_unfiltered (gdb_stdlog, "m32r_mourn_inferior()\n");
1141
1142 remove_breakpoints ();
1143 generic_mourn_inferior ();
1144}
1145
1146static int
a6d9a66e
UW
1147m32r_insert_breakpoint (struct gdbarch *gdbarch,
1148 struct bp_target_info *bp_tgt)
b4b4b794 1149{
8181d85f 1150 CORE_ADDR addr = bp_tgt->placed_address;
b4b4b794
KI
1151 int ib_breakpoints;
1152 unsigned char buf[13];
1153 int i, c;
1154
1155 if (remote_debug)
ec20a626 1156 fprintf_unfiltered (gdb_stdlog, "m32r_insert_breakpoint(%s,...)\n",
5af949e3 1157 paddress (gdbarch, addr));
b4b4b794
KI
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
8a3fe4f8 1186 error (_("Too many breakpoints"));
b4b4b794
KI
1187 return 1;
1188}
1189
1190static int
a6d9a66e
UW
1191m32r_remove_breakpoint (struct gdbarch *gdbarch,
1192 struct bp_target_info *bp_tgt)
b4b4b794 1193{
8181d85f 1194 CORE_ADDR addr = bp_tgt->placed_address;
b4b4b794
KI
1195 int i;
1196
1197 if (remote_debug)
ec20a626 1198 fprintf_unfiltered (gdb_stdlog, "m32r_remove_breakpoint(%s)\n",
5af949e3 1199 paddress (gdbarch, addr));
b4b4b794
KI
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
1213static void
1214m32r_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;
2b71414d 1223 struct timeval start_time, end_time;
0df8b418 1224 unsigned long data_count; /* Number of bytes transferred to memory. */
b4b4b794
KI
1225 static RETSIGTYPE (*prev_sigint) ();
1226
0df8b418 1227 /* for direct tcp connections, we can do a fast binary download. */
b4b4b794
KI
1228 quiet = 0;
1229 nostart = 0;
1230 filename = NULL;
1231
1232 while (*args != '\000')
1233 {
1234 char *arg;
1235
7da3ab79 1236 args = skip_spaces (args);
b4b4b794
KI
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
8a3fe4f8 1253 error (_("Unknown option `%s'"), arg);
b4b4b794
KI
1254 }
1255
1256 if (!filename)
1257 filename = get_exec_file (1);
1258
1c00ec6b 1259 pbfd = gdb_bfd_open (filename, gnutarget, -1);
b4b4b794
KI
1260 if (pbfd == NULL)
1261 {
1262 perror_with_name (filename);
1263 return;
1264 }
f9a062ff 1265 old_chain = make_cleanup_bfd_unref (pbfd);
b4b4b794
KI
1266
1267 if (!bfd_check_format (pbfd, bfd_object))
8a3fe4f8 1268 error (_("\"%s\" is not an object file: %s"), filename,
b4b4b794
KI
1269 bfd_errmsg (bfd_get_error ()));
1270
2b71414d 1271 gettimeofday (&start_time, NULL);
b4b4b794
KI
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);
2c500098 1287 section_size = bfd_get_section_size (section);
b4b4b794
KI
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),
ec20a626
UW
1298 (unsigned long) section_address,
1299 (int) section_size);
b4b4b794
KI
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)
8a3fe4f8 1319 error (_("Error while downloading %s section."),
b4b4b794
KI
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
2b71414d 1358 gettimeofday (&end_time, NULL);
b4b4b794 1359
0df8b418 1360 /* Make the PC point at the start address. */
b4b4b794 1361 if (exec_bfd)
fb14de7b
UW
1362 regcache_write_pc (get_current_regcache (),
1363 bfd_get_start_address (exec_bfd));
b4b4b794 1364
0df8b418 1365 inferior_ptid = null_ptid; /* No process now. */
e5ef4d75 1366 delete_thread_silent (remote_m32r_ptid);
b4b4b794
KI
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,
0df8b418 1372 and things would get horribly confused... */
b4b4b794 1373
c1e56572 1374 clear_symtab_users (0);
b4b4b794
KI
1375
1376 if (!nostart)
1377 {
1378 entry = bfd_get_start_address (pbfd);
1379
1380 if (!quiet)
ec20a626
UW
1381 printf_unfiltered ("[Starting %s at 0x%lx]\n", filename,
1382 (unsigned long) entry);
b4b4b794
KI
1383 }
1384
2b71414d
DJ
1385 print_transfer_performance (gdb_stdout, data_count, 0, &start_time,
1386 &end_time);
b4b4b794
KI
1387
1388 do_cleanups (old_chain);
1389}
1390
1391static void
f9c72d52 1392m32r_stop (ptid_t ptid)
b4b4b794 1393{
b4b4b794
KI
1394 if (remote_debug)
1395 fprintf_unfiltered (gdb_stdlog, "m32r_stop()\n");
1396
e22f895c 1397 send_cmd (SDI_STOP_CPU);
b4b4b794
KI
1398
1399 return;
1400}
1401
1402
37814c18
KI
1403/* Tell whether this target can support a hardware breakpoint. CNT
1404 is the number of hardware breakpoints already installed. This
d92524f1 1405 implements the target_can_use_hardware_watchpoint macro. */
b4b4b794 1406
63807e1d 1407static int
37814c18 1408m32r_can_use_hw_watchpoint (int type, int cnt, int othertype)
b4b4b794 1409{
37814c18 1410 return sdi_desc != NULL && cnt < max_access_breaks;
b4b4b794
KI
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
0df8b418 1415 watchpoint. */
b4b4b794 1416
63807e1d 1417static int
0cf6dd15
TJB
1418m32r_insert_watchpoint (CORE_ADDR addr, int len, int type,
1419 struct expression *cond)
b4b4b794
KI
1420{
1421 int i;
1422
1423 if (remote_debug)
ec20a626 1424 fprintf_unfiltered (gdb_stdlog, "m32r_insert_watchpoint(%s,%d,%d)\n",
f5656ead 1425 paddress (target_gdbarch (), addr), len, type);
b4b4b794
KI
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
8a3fe4f8 1438 error (_("Too many watchpoints"));
b4b4b794
KI
1439 return 1;
1440}
1441
63807e1d 1442static int
0cf6dd15
TJB
1443m32r_remove_watchpoint (CORE_ADDR addr, int len, int type,
1444 struct expression *cond)
b4b4b794
KI
1445{
1446 int i;
1447
1448 if (remote_debug)
ec20a626 1449 fprintf_unfiltered (gdb_stdlog, "m32r_remove_watchpoint(%s,%d,%d)\n",
f5656ead 1450 paddress (target_gdbarch (), addr), len, type);
b4b4b794
KI
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
63807e1d 1464static int
4aa7a7f5 1465m32r_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
b4b4b794 1466{
4aa7a7f5 1467 int rc = 0;
123f5f96 1468
4aa7a7f5
JJ
1469 if (hit_watchpoint_addr != 0x00000000)
1470 {
1471 *addr_p = hit_watchpoint_addr;
1472 rc = 1;
1473 }
1474 return rc;
b4b4b794
KI
1475}
1476
63807e1d 1477static int
b4b4b794
KI
1478m32r_stopped_by_watchpoint (void)
1479{
4aa7a7f5 1480 CORE_ADDR addr;
123f5f96 1481
4aa7a7f5 1482 return m32r_stopped_data_address (&current_target, &addr);
b4b4b794
KI
1483}
1484
4d6c6261
PA
1485/* Check to see if a thread is still alive. */
1486
1487static int
28439f5e 1488m32r_thread_alive (struct target_ops *ops, ptid_t ptid)
4d6c6261
PA
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
1500static char *
117de6a9 1501m32r_pid_to_str (struct target_ops *ops, ptid_t ptid)
4d6c6261
PA
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}
b4b4b794
KI
1513
1514static void
1515sdireset_command (char *args, int from_tty)
1516{
b4b4b794
KI
1517 if (remote_debug)
1518 fprintf_unfiltered (gdb_stdlog, "m32r_sdireset()\n");
1519
e22f895c 1520 send_cmd (SDI_OPEN);
b4b4b794
KI
1521
1522 inferior_ptid = null_ptid;
e5ef4d75 1523 delete_thread_silent (remote_m32r_ptid);
b4b4b794
KI
1524}
1525
1526
1527static void
1528sdistatus_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
e22f895c 1539 send_cmd (SDI_STATUS);
b4b4b794
KI
1540 for (i = 0; i < 4096; i++)
1541 {
1542 c = serial_readchar (sdi_desc, SDI_TIMEOUT);
1543 if (c < 0)
717eb1cf 1544 return;
b4b4b794
KI
1545 buf[i] = c;
1546 if (c == 0)
717eb1cf
AC
1547 break;
1548 }
b4b4b794
KI
1549
1550 printf_filtered ("%s", buf);
1551}
1552
1553
1554static void
1555debug_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
1566static void
1567use_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
1577static void
1578use_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
1589static void
1590use_ib_breakpoints_command (char *args, int from_tty)
1591{
1592 use_ib_breakpoints = 1;
1593}
1594
1595static void
1596use_dbt_breakpoints_command (char *args, int from_tty)
1597{
1598 use_ib_breakpoints = 0;
1599}
1600
c35b1492
PA
1601static int
1602m32r_return_one (struct target_ops *target)
1603{
1604 return 1;
1605}
b4b4b794 1606
aeaec162
TT
1607/* Implementation of the to_has_execution method. */
1608
1609static int
1610m32r_has_execution (struct target_ops *target, ptid_t the_ptid)
1611{
1612 return 1;
1613}
1614
0df8b418 1615/* Define the target subroutine names. */
b4b4b794
KI
1616
1617struct target_ops m32r_ops;
1618
1619static void
1620init_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;
c8e73a31 1633 m32r_ops.deprecated_xfer_memory = m32r_xfer_memory;
b4b4b794
KI
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;
37814c18
KI
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;
b4b4b794
KI
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;
49d03eab 1647 m32r_ops.to_log_command = serial_log_command;
4d6c6261
PA
1648 m32r_ops.to_thread_alive = m32r_thread_alive;
1649 m32r_ops.to_pid_to_str = m32r_pid_to_str;
b4b4b794 1650 m32r_ops.to_stratum = process_stratum;
c35b1492
PA
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;
aeaec162 1655 m32r_ops.to_has_execution = m32r_has_execution;
b4b4b794
KI
1656 m32r_ops.to_magic = OPS_MAGIC;
1657};
1658
1659
1660extern initialize_file_ftype _initialize_remote_m32r;
1661
1662void
1663_initialize_remote_m32r (void)
1664{
1665 int i;
1666
1667 init_m32r_ops ();
1668
0df8b418 1669 /* Initialize breakpoints. */
b4b4b794
KI
1670 for (i = 0; i < MAX_BREAKPOINTS; i++)
1671 bp_address[i] = 0xffffffff;
1672
0df8b418 1673 /* Initialize access breaks. */
b4b4b794
KI
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,
1bedd215 1680 _("Reset SDI connection."));
b4b4b794
KI
1681
1682 add_com ("sdistatus", class_obscure, sdistatus_command,
1bedd215 1683 _("Show status of SDI connection."));
b4b4b794
KI
1684
1685 add_com ("debug_chaos", class_obscure, debug_chaos_command,
1bedd215 1686 _("Debug M32R/Chaos."));
b4b4b794
KI
1687
1688 add_com ("use_debug_dma", class_obscure, use_debug_dma_command,
1bedd215 1689 _("Use debug DMA mem access."));
b4b4b794 1690 add_com ("use_mon_code", class_obscure, use_mon_code_command,
1bedd215 1691 _("Use mon code mem access."));
b4b4b794
KI
1692
1693 add_com ("use_ib_break", class_obscure, use_ib_breakpoints_command,
1bedd215 1694 _("Set breakpoints by IB break."));
b4b4b794 1695 add_com ("use_dbt_break", class_obscure, use_dbt_breakpoints_command,
1bedd215 1696 _("Set breakpoints by dbt."));
e5ef4d75
PA
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);
b4b4b794 1701}
This page took 0.968574 seconds and 4 git commands to generate.