import gdb-1999-08-09 snapshot
[deliverable/binutils-gdb.git] / gdb / remote-rdi.c
CommitLineData
c906108c
SS
1/* GDB interface to ARM RDI library.
2 Copyright 1997, 1998 Free Software Foundation, Inc.
3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b
JM
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
c906108c
SS
20
21#include "defs.h"
22#include "gdb_string.h"
23#include <fcntl.h>
24#include "frame.h"
25#include "inferior.h"
26#include "bfd.h"
27#include "symfile.h"
28#include "target.h"
29#include "wait.h"
30#include "gdbcmd.h"
31#include "objfiles.h"
32#include "gdb-stabs.h"
33#include "gdbthread.h"
34#include "gdbcore.h"
35
36#ifdef USG
37#include <sys/types.h>
38#endif
39
40#include <signal.h>
41
42#include "rdi-share/ardi.h"
43#include "rdi-share/adp.h"
44#include "rdi-share/hsys.h"
45
46extern int isascii PARAMS ((int));
47
48/* Prototypes for local functions */
49
c5aa993b 50static void arm_rdi_files_info PARAMS ((struct target_ops * ignore));
c906108c
SS
51
52static int arm_rdi_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
c5aa993b
JM
53 int len, int should_write,
54 struct target_ops * target));
c906108c
SS
55
56static void arm_rdi_prepare_to_store PARAMS ((void));
57
58static void arm_rdi_fetch_registers PARAMS ((int regno));
59
60static void arm_rdi_resume PARAMS ((int pid, int step,
c5aa993b 61 enum target_signal siggnal));
c906108c
SS
62
63static int arm_rdi_start_remote PARAMS ((char *dummy));
64
65static void arm_rdi_open PARAMS ((char *name, int from_tty));
66
67static void arm_rdi_create_inferior PARAMS ((char *exec_file, char *args,
68 char **env));
69
70static void arm_rdi_close PARAMS ((int quitting));
71
72static void arm_rdi_store_registers PARAMS ((int regno));
73
74static void arm_rdi_mourn PARAMS ((void));
75
76static void arm_rdi_send PARAMS ((char *buf));
77
c5aa993b 78static int arm_rdi_wait PARAMS ((int pid, struct target_waitstatus * status));
c906108c
SS
79
80static void arm_rdi_kill PARAMS ((void));
81
82static void arm_rdi_detach PARAMS ((char *args, int from_tty));
83
84static void arm_rdi_interrupt PARAMS ((int signo));
85
86static void arm_rdi_interrupt_twice PARAMS ((int signo));
87
88static void interrupt_query PARAMS ((void));
89
90static int arm_rdi_insert_breakpoint PARAMS ((CORE_ADDR, char *));
91
92static int arm_rdi_remove_breakpoint PARAMS ((CORE_ADDR, char *));
93
94static char *rdi_error_message PARAMS ((int err));
95
96static enum target_signal rdi_error_signal PARAMS ((int err));
97
98/* Global variables. */
99
100struct target_ops arm_rdi_ops;
101
102static struct Dbg_ConfigBlock gdb_config;
103
104static struct Dbg_HostosInterface gdb_hostif;
105
106static int max_load_size;
107
108static int execute_status;
109
110/* A little list of breakpoints that have been set. */
111
c5aa993b
JM
112static struct local_bp_list_entry
113 {
114 CORE_ADDR addr;
115 PointHandle point;
116 struct local_bp_list_entry *next;
117 }
118 *local_bp_list;
c906108c 119\f
c5aa993b 120
c906108c
SS
121/* Stub for catch_errors. */
122
123static int
124arm_rdi_start_remote (dummy)
125 char *dummy;
126{
127 return 1;
128}
129
130/* Helper callbacks for the "host interface" structure. RDI functions call
131 these to forward output from the target system and so forth. */
132
133void
134voiddummy ()
135{
136 fprintf_unfiltered (gdb_stdout, "void dummy\n");
137}
138
139static void
140myprint (arg, format, ap)
141 PTR arg;
142 const char *format;
143 va_list ap;
144{
145 vfprintf_unfiltered (gdb_stdout, format, ap);
146}
147
148static void
149mywritec (arg, c)
150 PTR arg;
151 int c;
152{
153 if (isascii (c))
154 fputc_unfiltered (c, gdb_stdout);
155}
156
157static int
158mywrite (arg, buffer, len)
159 PTR arg;
160 char const *buffer;
161 int len;
162{
163 int i;
164 char *e;
165
166 e = (char *) buffer;
167 for (i = 0; i < len; i++)
c5aa993b 168 {
c906108c 169 if (isascii ((int) *e))
c5aa993b
JM
170 {
171 fputc_unfiltered ((int) *e, gdb_stdout);
172 e++;
173 }
174 }
c906108c
SS
175
176 return len;
177}
178
179static void
180mypause (arg)
181 PTR arg;
182{
183}
184
185/* These last two are tricky as we have to handle the special case of
186 being interrupted more carefully */
187
188static int
189myreadc (arg)
190 PTR arg;
c5aa993b 191{
c906108c
SS
192 return fgetc (stdin);
193}
194
195static char *
196mygets (arg, buffer, len)
197 PTR arg;
198 char *buffer;
199 int len;
200{
c5aa993b 201 return fgets (buffer, len, stdin);
c906108c
SS
202}
203
204/* Prevent multiple calls to angel_RDI_close(). */
205static int closed_already = 1;
206
207/* Open a connection to a remote debugger. NAME is the filename used
208 for communication. */
209
210static void
211arm_rdi_open (name, from_tty)
212 char *name;
213 int from_tty;
214{
215 int rslt, i;
216 unsigned long arg1, arg2;
217
218 if (name == NULL)
219 error ("To open an RDI connection, you need to specify what serial\n\
220device is attached to the remote system (e.g. /dev/ttya).");
221
222 /* Make the basic low-level connection. */
223
224 rslt = Adp_OpenDevice (name, NULL, 1);
225
226 if (rslt != adp_ok)
227 error ("Could not open device \"%s\"", name);
228
229 gdb_config.bytesex = 2 | (TARGET_BYTE_ORDER == BIG_ENDIAN ? 1 : 0);
230 gdb_config.fpe = 1;
231 gdb_config.rditype = 2;
232 gdb_config.heartbeat_on = 1;
233 gdb_config.flags = 2;
234
235 gdb_hostif.dbgprint = myprint;
236 gdb_hostif.dbgpause = mypause;
237 gdb_hostif.dbgarg = NULL;
238 gdb_hostif.writec = mywritec;
239 gdb_hostif.readc = myreadc;
240 gdb_hostif.write = mywrite;
241 gdb_hostif.gets = mygets;
242 gdb_hostif.hostosarg = NULL;
243 gdb_hostif.reset = voiddummy;
244
245 rslt = angel_RDI_open (10, &gdb_config, &gdb_hostif, NULL);
246 if (rslt == RDIError_BigEndian || rslt == RDIError_LittleEndian)
c5aa993b 247 ; /* do nothing, this is the expected return */
c906108c
SS
248 else if (rslt)
249 {
250 printf_filtered ("RDI_open: %s\n", rdi_error_message (rslt));
251 }
252
253 rslt = angel_RDI_info (RDIInfo_Target, &arg1, &arg2);
254 if (rslt)
255 {
256 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
257 }
258 rslt = angel_RDI_info (RDIInfo_Points, &arg1, &arg2);
259 if (rslt)
260 {
261 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
262 }
263 rslt = angel_RDI_info (RDIInfo_Step, &arg1, &arg2);
264 if (rslt)
265 {
266 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
267 }
268 rslt = angel_RDI_info (RDIInfo_CoPro, &arg1, &arg2);
269 if (rslt)
270 {
271 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
272 }
273 rslt = angel_RDI_info (RDIInfo_SemiHosting, &arg1, &arg2);
274 if (rslt)
275 {
276 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
277 }
278
279 rslt = angel_RDI_info (RDIInfo_GetLoadSize, &arg1, &arg2);
280 if (rslt)
281 {
282 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
283 }
284 max_load_size = arg1;
285
286 push_target (&arm_rdi_ops);
287
288 target_fetch_registers (-1);
289
290 rslt = angel_RDI_open (1, &gdb_config, NULL, NULL);
291 if (rslt)
292 {
293 printf_filtered ("RDI_open: %s\n", rdi_error_message (rslt));
294 }
295
296 arg1 = 0x13b;
297 rslt = angel_RDI_info (RDIVector_Catch, &arg1, &arg2);
298 if (rslt)
299 {
300 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
301 }
302
303 arg1 = (unsigned long) "";
304 rslt = angel_RDI_info (RDISet_Cmdline, &arg1, &arg2);
305 if (rslt)
306 {
307 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
308 }
309
310 /* Clear out any existing records of breakpoints. */
311 {
312 struct local_bp_list_entry *entry, *preventry = NULL;
313
314 for (entry = local_bp_list; entry != NULL; entry = entry->next)
315 {
316 if (preventry)
317 free (preventry);
318 }
319 }
320
321 printf_filtered ("Connected to ARM RDI target.\n");
322 closed_already = 0;
323 inferior_pid = 42;
324}
325
326/* Start an inferior process and set inferior_pid to its pid.
327 EXEC_FILE is the file to run.
328 ARGS is a string containing the arguments to the program.
329 ENV is the environment vector to pass. Errors reported with error().
330 On VxWorks and various standalone systems, we ignore exec_file. */
331/* This is called not only when we first attach, but also when the
332 user types "run" after having attached. */
333
334static void
335arm_rdi_create_inferior (exec_file, args, env)
336 char *exec_file;
337 char *args;
338 char **env;
339{
340 int len, rslt;
341 unsigned long arg1, arg2;
342 char *arg_buf;
343 CORE_ADDR entry_point;
344
345 if (exec_file == 0 || exec_bfd == 0)
c5aa993b 346 error ("No executable file specified.");
c906108c
SS
347
348 entry_point = (CORE_ADDR) bfd_get_start_address (exec_bfd);
349
c5aa993b 350 arm_rdi_kill ();
c906108c
SS
351 remove_breakpoints ();
352 init_wait_for_inferior ();
353
c5aa993b 354 len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10;
c906108c
SS
355 arg_buf = (char *) alloca (len);
356 arg_buf[0] = '\0';
357 strcat (arg_buf, exec_file);
358 strcat (arg_buf, " ");
359 strcat (arg_buf, args);
360
361 inferior_pid = 42;
c5aa993b 362 insert_breakpoints (); /* Needed to get correct instruction in cache */
c906108c
SS
363
364 if (env != NULL)
365 {
366 while (*env)
367 {
368 if (strncmp (*env, "MEMSIZE=", sizeof ("MEMSIZE=") - 1) == 0)
369 {
370 unsigned long top_of_memory;
371 char *end_of_num;
372
373 /* Set up memory limit */
374 top_of_memory = strtoul (*env + sizeof ("MEMSIZE=") - 1,
375 &end_of_num, 0);
376 printf_filtered ("Setting top-of-memory to 0x%x\n",
377 top_of_memory);
c5aa993b 378
c906108c
SS
379 rslt = angel_RDI_info (RDIInfo_SetTopMem, &top_of_memory, &arg2);
380 if (rslt)
381 {
382 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
383 }
384 }
385 env++;
386 }
387 }
388
389 arg1 = (unsigned long) arg_buf;
c5aa993b 390 rslt = angel_RDI_info (RDISet_Cmdline, /* &arg1 */ (unsigned long *) arg_buf, &arg2);
c906108c
SS
391 if (rslt)
392 {
393 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
394 }
395
396 proceed (entry_point, TARGET_SIGNAL_DEFAULT, 0);
397}
398
399/* This takes a program previously attached to and detaches it. After
400 this is done, GDB can be used to debug some other program. We
401 better not have left any breakpoints in the target program or it'll
402 die when it hits one. */
403
404static void
405arm_rdi_detach (args, from_tty)
406 char *args;
407 int from_tty;
408{
409 pop_target ();
410}
411
412/* Clean up connection to a remote debugger. */
413
414static void
415arm_rdi_close (quitting)
416 int quitting;
417{
418 int rslt;
419
c5aa993b 420 if (!closed_already)
c906108c
SS
421 {
422 rslt = angel_RDI_close ();
423 if (rslt)
424 {
425 printf_filtered ("RDI_close: %s\n", rdi_error_message (rslt));
426 }
427 closed_already = 1;
428 inferior_pid = 0;
96baa820 429 Adp_CloseDevice ();
c906108c
SS
430 }
431}
432\f
433/* Tell the remote machine to resume. */
434
435static void
436arm_rdi_resume (pid, step, siggnal)
437 int pid, step;
438 enum target_signal siggnal;
439{
440 int rslt;
441 PointHandle point;
442
c5aa993b 443 if (0 /* turn on when hardware supports single-stepping */ )
c906108c
SS
444 {
445 rslt = angel_RDI_step (1, &point);
446 if (rslt)
447 {
448 printf_filtered ("RDI_step: %s\n", rdi_error_message (rslt));
449 }
450 }
451 else
452 {
453 char handle[4];
454 CORE_ADDR pc;
455
456 if (step)
457 {
458 pc = read_register (PC_REGNUM);
459 pc = arm_get_next_pc (pc);
460 arm_rdi_insert_breakpoint (pc, handle);
461 }
462 execute_status = rslt = angel_RDI_execute (&point);
463 if (rslt == RDIError_BreakpointReached)
464 ;
465 else if (rslt)
466 {
467 printf_filtered ("RDI_execute: %s\n", rdi_error_message (rslt));
468 }
469 if (step)
470 {
471 arm_rdi_remove_breakpoint (pc, handle);
472 }
473 }
474}
475\f
476/* Send ^C to target to halt it. Target will respond, and send us a
477 packet. */
478
479static void
480arm_rdi_interrupt (signo)
481 int signo;
482{
483}
484
c5aa993b 485static void (*ofunc) ();
c906108c
SS
486
487/* The user typed ^C twice. */
488static void
489arm_rdi_interrupt_twice (signo)
490 int signo;
491{
492}
493
494/* Ask the user what to do when an interrupt is received. */
495
496static void
497interrupt_query ()
498{
499}
500
501/* Wait until the remote machine stops, then return, storing status in
502 STATUS just as `wait' would. Returns "pid" (though it's not clear
503 what, if anything, that means in the case of this target). */
504
505static int
506arm_rdi_wait (pid, status)
507 int pid;
508 struct target_waitstatus *status;
509{
510 status->kind = (execute_status == RDIError_NoError ?
c5aa993b 511 TARGET_WAITKIND_EXITED : TARGET_WAITKIND_STOPPED);
c906108c
SS
512
513 /* convert stopped code from target into right signal */
514 status->value.sig = rdi_error_signal (execute_status);
515
516 return inferior_pid;
517}
518
519/* Read the remote registers into the block REGS. */
520
521/* ARGSUSED */
522static void
523arm_rdi_fetch_registers (regno)
524 int regno;
525{
526 int rslt, rdi_regmask;
527 unsigned long rawreg, rawregs[32];
528 char cookedreg[4];
529
c5aa993b 530 if (regno == -1)
c906108c
SS
531 {
532 rslt = angel_RDI_CPUread (255, 0x27fff, rawregs);
533 if (rslt)
534 {
535 printf_filtered ("RDI_CPUread: %s\n", rdi_error_message (rslt));
536 }
537
538 for (regno = 0; regno < 15; regno++)
539 {
540 store_unsigned_integer (cookedreg, 4, rawregs[regno]);
541 supply_register (regno, (char *) cookedreg);
542 }
543 store_unsigned_integer (cookedreg, 4, rawregs[15]);
544 supply_register (PS_REGNUM, (char *) cookedreg);
545 arm_rdi_fetch_registers (PC_REGNUM);
546 }
547 else
548 {
549 if (regno == PC_REGNUM)
550 rdi_regmask = RDIReg_PC;
551 else if (regno == PS_REGNUM)
552 rdi_regmask = RDIReg_CPSR;
553 else if (regno < 0 || regno > 15)
554 {
555 rawreg = 0;
556 supply_register (regno, (char *) &rawreg);
557 return;
558 }
559 else
560 rdi_regmask = 1 << regno;
561
562 rslt = angel_RDI_CPUread (255, rdi_regmask, &rawreg);
563 if (rslt)
564 {
565 printf_filtered ("RDI_CPUread: %s\n", rdi_error_message (rslt));
566 }
567 store_unsigned_integer (cookedreg, 4, rawreg);
568 supply_register (regno, (char *) cookedreg);
569 }
570}
571
c5aa993b 572static void
c906108c
SS
573arm_rdi_prepare_to_store ()
574{
575 /* Nothing to do. */
576}
577
578/* Store register REGNO, or all registers if REGNO == -1, from the contents
579 of REGISTERS. FIXME: ignores errors. */
580
581static void
582arm_rdi_store_registers (regno)
583 int regno;
584{
585 int rslt, rdi_regmask;
586
587 /* These need to be able to take 'floating point register' contents */
588 unsigned long rawreg[3], rawerreg[3];
589
c5aa993b 590 if (regno == -1)
c906108c
SS
591 {
592 for (regno = 0; regno < NUM_REGS; regno++)
593 arm_rdi_store_registers (regno);
594 }
595 else
596 {
597 read_register_gen (regno, (char *) rawreg);
598 /* RDI manipulates data in host byte order, so convert now. */
599 store_unsigned_integer (rawerreg, 4, rawreg[0]);
600
601 if (regno == PC_REGNUM)
602 rdi_regmask = RDIReg_PC;
603 else if (regno == PS_REGNUM)
604 rdi_regmask = RDIReg_CPSR;
605 else if (regno < 0 || regno > 15)
606 return;
607 else
608 rdi_regmask = 1 << regno;
609
610 rslt = angel_RDI_CPUwrite (255, rdi_regmask, rawerreg);
611 if (rslt)
612 {
613 printf_filtered ("RDI_CPUwrite: %s\n", rdi_error_message (rslt));
614 }
615 }
616}
617\f
618/* Read or write LEN bytes from inferior memory at MEMADDR,
619 transferring to or from debugger address MYADDR. Write to inferior
620 if SHOULD_WRITE is nonzero. Returns length of data written or
621 read; 0 for error. */
622
623/* ARGSUSED */
624static int
c5aa993b 625arm_rdi_xfer_memory (memaddr, myaddr, len, should_write, target)
c906108c
SS
626 CORE_ADDR memaddr;
627 char *myaddr;
628 int len;
629 int should_write;
c5aa993b 630 struct target_ops *target; /* ignored */
c906108c
SS
631{
632 int rslt, i;
633
634 if (should_write)
635 {
636 rslt = angel_RDI_write (myaddr, memaddr, &len);
637 if (rslt)
638 {
639 printf_filtered ("RDI_write: %s\n", rdi_error_message (rslt));
640 }
641 }
c5aa993b 642 else
c906108c
SS
643 {
644 rslt = angel_RDI_read (memaddr, myaddr, &len);
645 if (rslt)
646 {
647 printf_filtered ("RDI_read: %s\n", rdi_error_message (rslt));
648 len = 0;
649 }
650 }
651 return len;
652}
653\f
654/* Display random info collected from the target. */
655
656static void
657arm_rdi_files_info (ignore)
658 struct target_ops *ignore;
659{
660 char *file = "nothing";
661 int rslt;
662 unsigned long arg1, arg2;
663
664 rslt = angel_RDI_info (RDIInfo_Target, &arg1, &arg2);
665 if (rslt)
666 {
667 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
668 }
669 if (arg1 & (1 << 15))
670 printf_filtered ("Target supports Thumb code.\n");
671 if (arg1 & (1 << 14))
672 printf_filtered ("Target can do profiling.\n");
673 if (arg1 & (1 << 4))
674 printf_filtered ("Target is real hardware.\n");
c5aa993b 675
c906108c
SS
676 rslt = angel_RDI_info (RDIInfo_Step, &arg1, &arg2);
677 if (rslt)
678 {
679 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
680 }
681 printf_filtered ("Target can%s single-step.\n", (arg1 & 0x4 ? "" : "not"));
682
683 rslt = angel_RDI_info (RDIInfo_Icebreaker, &arg1, &arg2);
684 if (rslt)
685 {
686 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt));
687 }
688 else
689 printf_filtered ("Target includes an EmbeddedICE.\n");
690}
691\f
692static void
693arm_rdi_kill ()
694{
695 int rslt;
696
697 rslt = angel_RDI_open (1, &gdb_config, NULL, NULL);
698 if (rslt)
699 {
700 printf_filtered ("RDI_open: %s\n", rdi_error_message (rslt));
701 }
702}
703
704static void
705arm_rdi_mourn_inferior ()
706{
707 unpush_target (&arm_rdi_ops);
708 generic_mourn_inferior ();
709}
710\f
711/* While the RDI library keeps track of its own breakpoints, we need
712 to remember "handles" so that we can delete them later. Since
713 breakpoints get used for stepping, be careful not to leak memory
714 here. */
715
716static int
717arm_rdi_insert_breakpoint (addr, contents_cache)
718 CORE_ADDR addr;
719 char *contents_cache;
720{
721 int rslt;
722 PointHandle point;
723 struct local_bp_list_entry *entry;
724 int type = RDIPoint_EQ;
725
726 if (arm_pc_is_thumb (addr) || arm_pc_is_thumb_dummy (addr))
727 type |= RDIPoint_16Bit;
728 rslt = angel_RDI_setbreak (addr, type, 0, &point);
729 if (rslt)
730 {
731 printf_filtered ("RDI_setbreak: %s\n", rdi_error_message (rslt));
732 }
733 entry =
734 (struct local_bp_list_entry *) xmalloc (sizeof (struct local_bp_list_entry));
735 entry->addr = addr;
736 entry->point = point;
737 entry->next = local_bp_list;
738 local_bp_list = entry;
739 return rslt;
740}
741
742static int
743arm_rdi_remove_breakpoint (addr, contents_cache)
744 CORE_ADDR addr;
745 char *contents_cache;
746{
747 int rslt;
748 PointHandle point;
749 struct local_bp_list_entry *entry, *preventry;
750
751 for (entry = local_bp_list; entry != NULL; entry = entry->next)
752 {
753 if (entry->addr == addr)
754 {
755 break;
756 }
757 preventry = entry;
758 }
759 if (entry)
760 {
761 rslt = angel_RDI_clearbreak (entry->point);
762 if (rslt)
763 {
764 printf_filtered ("RDI_clearbreak: %s\n", rdi_error_message (rslt));
765 }
766 /* Delete the breakpoint entry locally. */
767 if (entry == local_bp_list)
768 {
769 local_bp_list = entry->next;
770 }
771 else
772 {
773 preventry->next = entry->next;
774 }
775 free (entry);
776 }
777 return 0;
778}
779\f
780static char *
781rdi_error_message (err)
782 int err;
783{
784 switch (err)
785 {
c5aa993b 786 case RDIError_NoError:
c906108c
SS
787 return "no error";
788 case RDIError_Reset:
789 return "debuggee reset";
790 case RDIError_UndefinedInstruction:
791 return "undefined instruction";
792 case RDIError_SoftwareInterrupt:
793 return "SWI trapped";
794 case RDIError_PrefetchAbort:
795 return "prefetch abort, execution ran into unmapped memory?";
796 case RDIError_DataAbort:
797 return "data abort, no memory at specified address?";
798 case RDIError_AddressException:
799 return "address exception, access >26bit in 26bit mode";
800 case RDIError_IRQ:
801 return "IRQ, interrupt trapped";
802 case RDIError_FIQ:
803 return "FIQ, fast interrupt trapped";
804 case RDIError_Error:
805 return "a miscellaneous type of error";
806 case RDIError_BranchThrough0:
807 return "branch through location 0";
808 case RDIError_NotInitialised:
809 return "internal error, RDI_open not called first";
810 case RDIError_UnableToInitialise:
811 return "internal error, target world is broken";
812 case RDIError_WrongByteSex:
813 return "See Operator: WrongByteSex";
814 case RDIError_UnableToTerminate:
815 return "See Operator: Unable to Terminate";
816 case RDIError_BadInstruction:
817 return "bad instruction, illegal to execute this instruction";
818 case RDIError_IllegalInstruction:
819 return "illegal instruction, the effect of executing it is undefined";
820 case RDIError_BadCPUStateSetting:
821 return "internal error, tried to set SPSR of user mode";
822 case RDIError_UnknownCoPro:
823 return "unknown co-processor";
824 case RDIError_UnknownCoProState:
825 return "cannot execute co-processor request";
826 case RDIError_BadCoProState:
827 return "recognizably broken co-processor request";
828 case RDIError_BadPointType:
829 return "internal error, bad point yype";
830 case RDIError_UnimplementedType:
831 return "internal error, unimplemented type";
832 case RDIError_BadPointSize:
833 return "internal error, bad point size";
834 case RDIError_UnimplementedSize:
835 return "internal error, unimplemented size";
836 case RDIError_NoMorePoints:
837 return "last break/watch point was used";
838 case RDIError_BreakpointReached:
839 return "breakpoint reached";
840 case RDIError_WatchpointAccessed:
841 return "watchpoint accessed";
842 case RDIError_NoSuchPoint:
843 return "attempted to clear non-existent break/watch point";
844 case RDIError_ProgramFinishedInStep:
845 return "end of the program reached while stepping";
846 case RDIError_UserInterrupt:
847 return "you pressed Escape";
848 case RDIError_CantSetPoint:
849 return "no more break/watch points available";
850 case RDIError_IncompatibleRDILevels:
851 return "incompatible RDI levels";
852 case RDIError_LittleEndian:
853 return "debuggee is little endian";
854 case RDIError_BigEndian:
855 return "debuggee is big endian";
856 case RDIError_SoftInitialiseError:
857 return "recoverable error in RDI initialization";
858 case RDIError_InsufficientPrivilege:
859 return "internal error, supervisor state not accessible to monitor";
860 case RDIError_UnimplementedMessage:
861 return "internal error, unimplemented message";
862 case RDIError_UndefinedMessage:
863 return "internal error, undefined message";
864 default:
c5aa993b 865 return "undefined error message, should reset target";
c906108c
SS
866 }
867}
868
869/* Convert the ARM error messages to signals that GDB knows about. */
870
871static enum target_signal
872rdi_error_signal (err)
873 int err;
874{
875 switch (err)
876 {
877 case RDIError_NoError:
878 return 0;
879 case RDIError_Reset:
c5aa993b 880 return TARGET_SIGNAL_TERM; /* ??? */
c906108c
SS
881 case RDIError_UndefinedInstruction:
882 return TARGET_SIGNAL_ILL;
883 case RDIError_SoftwareInterrupt:
884 case RDIError_PrefetchAbort:
885 case RDIError_DataAbort:
886 return TARGET_SIGNAL_TRAP;
887 case RDIError_AddressException:
888 return TARGET_SIGNAL_SEGV;
889 case RDIError_IRQ:
890 case RDIError_FIQ:
891 return TARGET_SIGNAL_TRAP;
892 case RDIError_Error:
893 return TARGET_SIGNAL_TERM;
894 case RDIError_BranchThrough0:
895 return TARGET_SIGNAL_TRAP;
896 case RDIError_NotInitialised:
897 case RDIError_UnableToInitialise:
898 case RDIError_WrongByteSex:
899 case RDIError_UnableToTerminate:
900 return TARGET_SIGNAL_UNKNOWN;
901 case RDIError_BadInstruction:
902 case RDIError_IllegalInstruction:
903 return TARGET_SIGNAL_ILL;
904 case RDIError_BadCPUStateSetting:
905 case RDIError_UnknownCoPro:
906 case RDIError_UnknownCoProState:
907 case RDIError_BadCoProState:
908 case RDIError_BadPointType:
909 case RDIError_UnimplementedType:
910 case RDIError_BadPointSize:
911 case RDIError_UnimplementedSize:
912 case RDIError_NoMorePoints:
913 return TARGET_SIGNAL_UNKNOWN;
914 case RDIError_BreakpointReached:
915 case RDIError_WatchpointAccessed:
916 return TARGET_SIGNAL_TRAP;
917 case RDIError_NoSuchPoint:
918 case RDIError_ProgramFinishedInStep:
919 return TARGET_SIGNAL_UNKNOWN;
920 case RDIError_UserInterrupt:
921 return TARGET_SIGNAL_INT;
922 case RDIError_IncompatibleRDILevels:
923 case RDIError_LittleEndian:
924 case RDIError_BigEndian:
925 case RDIError_SoftInitialiseError:
926 case RDIError_InsufficientPrivilege:
927 case RDIError_UnimplementedMessage:
928 case RDIError_UndefinedMessage:
929 default:
c5aa993b 930 return TARGET_SIGNAL_UNKNOWN;
c906108c
SS
931 }
932}
933\f
934/* Define the target operations structure. */
935
936static void
937init_rdi_ops ()
938{
c5aa993b 939 arm_rdi_ops.to_shortname = "rdi";
c906108c
SS
940 arm_rdi_ops.to_longname = "ARM RDI";
941 arm_rdi_ops.to_doc = "Use a remote ARM-based computer; via the RDI library.\n\
c5aa993b
JM
942Specify the serial device it is connected to (e.g. /dev/ttya).";
943 arm_rdi_ops.to_open = arm_rdi_open;
944 arm_rdi_ops.to_close = arm_rdi_close;
945 arm_rdi_ops.to_detach = arm_rdi_detach;
946 arm_rdi_ops.to_resume = arm_rdi_resume;
947 arm_rdi_ops.to_wait = arm_rdi_wait;
c906108c
SS
948 arm_rdi_ops.to_fetch_registers = arm_rdi_fetch_registers;
949 arm_rdi_ops.to_store_registers = arm_rdi_store_registers;
950 arm_rdi_ops.to_prepare_to_store = arm_rdi_prepare_to_store;
951 arm_rdi_ops.to_xfer_memory = arm_rdi_xfer_memory;
952 arm_rdi_ops.to_files_info = arm_rdi_files_info;
953 arm_rdi_ops.to_insert_breakpoint = arm_rdi_insert_breakpoint;
c5aa993b
JM
954 arm_rdi_ops.to_remove_breakpoint = arm_rdi_remove_breakpoint;
955 arm_rdi_ops.to_kill = arm_rdi_kill;
956 arm_rdi_ops.to_load = generic_load;
c906108c
SS
957 arm_rdi_ops.to_create_inferior = arm_rdi_create_inferior;
958 arm_rdi_ops.to_mourn_inferior = arm_rdi_mourn_inferior;
959 arm_rdi_ops.to_stratum = process_stratum;
c5aa993b
JM
960 arm_rdi_ops.to_has_all_memory = 1;
961 arm_rdi_ops.to_has_memory = 1;
962 arm_rdi_ops.to_has_stack = 1;
963 arm_rdi_ops.to_has_registers = 1;
964 arm_rdi_ops.to_has_execution = 1;
965 arm_rdi_ops.to_magic = OPS_MAGIC;
c906108c
SS
966}
967
968void
969_initialize_remote_rdi ()
970{
c5aa993b 971 init_rdi_ops ();
c906108c
SS
972 add_target (&arm_rdi_ops);
973}
974
975/* A little dummy to make linking with the library succeed. */
976
c5aa993b
JM
977int
978Fail ()
979{
980 return 0;
981}
This page took 0.073334 seconds and 4 git commands to generate.