1 /* GDB interface to ARM RDI library.
2 Copyright 1997, 1998 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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, Boston, MA 02111-1307, USA. */
21 #include "gdb_string.h"
31 #include "gdb-stabs.h"
32 #include "gdbthread.h"
36 #include <sys/types.h>
41 #include "rdi-share/ardi.h"
42 #include "rdi-share/adp.h"
43 #include "rdi-share/hsys.h"
45 /* Prototypes for local functions */
47 static void arm_rdi_files_info
PARAMS ((struct target_ops
*ignore
));
49 static int arm_rdi_xfer_memory
PARAMS ((CORE_ADDR memaddr
, char *myaddr
,
50 int len
, int should_write
,
51 struct target_ops
*target
));
53 static void arm_rdi_prepare_to_store
PARAMS ((void));
55 static void arm_rdi_fetch_registers
PARAMS ((int regno
));
57 static void arm_rdi_resume
PARAMS ((int pid
, int step
,
58 enum target_signal siggnal
));
60 static int arm_rdi_start_remote
PARAMS ((char *dummy
));
62 static void arm_rdi_open
PARAMS ((char *name
, int from_tty
));
64 static void arm_rdi_create_inferior
PARAMS ((char *exec_file
, char *args
,
67 static void arm_rdi_close
PARAMS ((int quitting
));
69 static void arm_rdi_store_registers
PARAMS ((int regno
));
71 static void arm_rdi_mourn
PARAMS ((void));
73 static void arm_rdi_send
PARAMS ((char *buf
));
75 static int arm_rdi_wait
PARAMS ((int pid
, struct target_waitstatus
*status
));
77 static void arm_rdi_kill
PARAMS ((void));
79 static void arm_rdi_detach
PARAMS ((char *args
, int from_tty
));
81 static void arm_rdi_interrupt
PARAMS ((int signo
));
83 static void arm_rdi_interrupt_twice
PARAMS ((int signo
));
85 static void interrupt_query
PARAMS ((void));
87 static int arm_rdi_insert_breakpoint
PARAMS ((CORE_ADDR
, char *));
89 static int arm_rdi_remove_breakpoint
PARAMS ((CORE_ADDR
, char *));
91 static char *rdi_error_message
PARAMS ((int err
));
93 static enum target_signal rdi_error_signal
PARAMS ((int err
));
95 /* Global variables. */
97 struct target_ops arm_rdi_ops
;
99 static struct Dbg_ConfigBlock gdb_config
;
101 static struct Dbg_HostosInterface gdb_hostif
;
103 static int max_load_size
;
105 static int execute_status
;
107 /* A little list of breakpoints that have been set. */
109 static struct local_bp_list_entry
{
112 struct local_bp_list_entry
*next
;
116 /* Stub for catch_errors. */
119 arm_rdi_start_remote (dummy
)
125 /* Helper callbacks for the "host interface" structure. RDI functions call
126 these to forward output from the target system and so forth. */
131 printf("void dummy\n");
135 myprint (arg
, format
, ap
)
140 vfprintf (stdout
, format
, ap
);
148 fputc (c
, (FILE *) arg
);
152 mywrite (arg
, buffer
, len
)
157 return fwrite (buffer
, 1, len
, stdout
);
166 /* These last two are tricky as we have to handle the special case of
167 being interrupted more carefully */
173 return fgetc (stdin
);
177 mygets (arg
, buffer
, len
)
182 return fgets(buffer
, len
, stdin
);
185 /* Prevent multiple calls to angel_RDI_close(). */
186 static int closed_already
= 1;
188 /* Open a connection to a remote debugger. NAME is the filename used
189 for communication. */
192 arm_rdi_open (name
, from_tty
)
197 unsigned long arg1
, arg2
;
200 error ("To open an RDI connection, you need to specify what serial\n\
201 device is attached to the remote system (e.g. /dev/ttya).");
203 /* Make the basic low-level connection. */
205 rslt
= Adp_OpenDevice (name
, NULL
, 1);
208 error ("Could not open device \"%s\"", name
);
210 gdb_config
.bytesex
= 2 | (target_byte_order
== BIG_ENDIAN
? 1 : 0);
212 gdb_config
.rditype
= 2;
213 gdb_config
.heartbeat_on
= 1;
214 gdb_config
.flags
= 2;
216 gdb_hostif
.dbgprint
= myprint
;
217 gdb_hostif
.dbgpause
= mypause
;
218 gdb_hostif
.dbgarg
= stdout
;
219 gdb_hostif
.writec
= mywritec
;
220 gdb_hostif
.readc
= myreadc
;
221 gdb_hostif
.write
= mywrite
;
222 gdb_hostif
.gets
= mygets
;
223 gdb_hostif
.hostosarg
= stdout
;
224 gdb_hostif
.reset
= voiddummy
;
226 rslt
= angel_RDI_open (10, &gdb_config
, &gdb_hostif
, NULL
);
227 if (rslt
== RDIError_BigEndian
|| rslt
== RDIError_LittleEndian
)
228 ; /* do nothing, this is the expected return */
231 printf_filtered ("RDI_open: %s\n", rdi_error_message (rslt
));
234 rslt
= angel_RDI_info (RDIInfo_Target
, &arg1
, &arg2
);
237 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
239 rslt
= angel_RDI_info (RDIInfo_Points
, &arg1
, &arg2
);
242 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
244 rslt
= angel_RDI_info (RDIInfo_Step
, &arg1
, &arg2
);
247 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
249 rslt
= angel_RDI_info (RDIInfo_CoPro
, &arg1
, &arg2
);
252 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
254 rslt
= angel_RDI_info (RDIInfo_SemiHosting
, &arg1
, &arg2
);
257 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
260 rslt
= angel_RDI_info (RDIInfo_GetLoadSize
, &arg1
, &arg2
);
263 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
265 max_load_size
= arg1
;
267 push_target (&arm_rdi_ops
);
269 target_fetch_registers (-1);
271 rslt
= angel_RDI_open (1, &gdb_config
, NULL
, NULL
);
274 printf_filtered ("RDI_open: %s\n", rdi_error_message (rslt
));
278 rslt
= angel_RDI_info (RDIVector_Catch
, &arg1
, &arg2
);
281 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
284 arg1
= (unsigned long) "";
285 rslt
= angel_RDI_info (RDISet_Cmdline
, &arg1
, &arg2
);
288 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
291 /* Clear out any existing records of breakpoints. */
293 struct local_bp_list_entry
*entry
, *preventry
= NULL
;
295 for (entry
= local_bp_list
; entry
!= NULL
; entry
= entry
->next
)
302 printf_filtered ("Connected to ARM RDI target.\n");
307 /* Start an inferior process and set inferior_pid to its pid.
308 EXEC_FILE is the file to run.
309 ARGS is a string containing the arguments to the program.
310 ENV is the environment vector to pass. Errors reported with error().
311 On VxWorks and various standalone systems, we ignore exec_file. */
312 /* This is called not only when we first attach, but also when the
313 user types "run" after having attached. */
316 arm_rdi_create_inferior (exec_file
, args
, env
)
322 unsigned long arg1
, arg2
;
324 CORE_ADDR entry_point
;
326 if (exec_file
== 0 || exec_bfd
== 0)
327 error ("No exec file specified.");
329 entry_point
= (CORE_ADDR
) bfd_get_start_address (exec_bfd
);
332 remove_breakpoints ();
333 init_wait_for_inferior ();
335 len
= strlen (exec_file
) + 1 + strlen (args
) + 1 + /*slop*/ 10;
336 arg_buf
= (char *) alloca (len
);
338 strcat (arg_buf
, exec_file
);
339 strcat (arg_buf
, " ");
340 strcat (arg_buf
, args
);
343 insert_breakpoints (); /* Needed to get correct instruction in cache */
349 if (strncmp (*env
, "MEMSIZE=", sizeof ("MEMSIZE=") - 1) == 0)
351 unsigned long top_of_memory
;
354 /* Set up memory limit */
355 top_of_memory
= strtoul (*env
+ sizeof ("MEMSIZE=") - 1,
357 printf_filtered ("Setting top-of-memory to 0x%x\n",
360 rslt
= angel_RDI_info (RDIInfo_SetTopMem
, &top_of_memory
, &arg2
);
363 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
370 arg1
= (unsigned long) arg_buf
;
371 rslt
= angel_RDI_info (RDISet_Cmdline
, /* &arg1 */ (unsigned long *)arg_buf
, &arg2
);
374 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
377 proceed (entry_point
, TARGET_SIGNAL_DEFAULT
, 0);
380 /* This takes a program previously attached to and detaches it. After
381 this is done, GDB can be used to debug some other program. We
382 better not have left any breakpoints in the target program or it'll
383 die when it hits one. */
386 arm_rdi_detach (args
, from_tty
)
390 /* (anything to do?) */
393 /* Clean up connection to a remote debugger. */
396 arm_rdi_close (quitting
)
401 if (! closed_already
)
403 rslt
= angel_RDI_close ();
406 printf_filtered ("RDI_close: %s\n", rdi_error_message (rslt
));
412 /* Tell the remote machine to resume. */
415 arm_rdi_resume (pid
, step
, siggnal
)
417 enum target_signal siggnal
;
422 if (0 /* turn on when hardware supports single-stepping */)
424 rslt
= angel_RDI_step (1, &point
);
427 printf_filtered ("RDI_step: %s\n", rdi_error_message (rslt
));
437 pc
= read_register (PC_REGNUM
);
438 pc
= arm_get_next_pc (pc
);
439 arm_rdi_insert_breakpoint (pc
, handle
);
441 execute_status
= rslt
= angel_RDI_execute (&point
);
442 if (rslt
== RDIError_BreakpointReached
)
446 printf_filtered ("RDI_execute: %s\n", rdi_error_message (rslt
));
450 arm_rdi_remove_breakpoint (pc
, handle
);
455 /* Send ^C to target to halt it. Target will respond, and send us a
459 arm_rdi_interrupt (signo
)
464 static void (*ofunc
)();
466 /* The user typed ^C twice. */
468 arm_rdi_interrupt_twice (signo
)
473 /* Ask the user what to do when an interrupt is received. */
480 /* Wait until the remote machine stops, then return, storing status in
481 STATUS just as `wait' would. Returns "pid" (though it's not clear
482 what, if anything, that means in the case of this target). */
485 arm_rdi_wait (pid
, status
)
487 struct target_waitstatus
*status
;
489 status
->kind
= (execute_status
== RDIError_NoError
?
490 TARGET_WAITKIND_EXITED
: TARGET_WAITKIND_STOPPED
);
492 /* convert stopped code from target into right signal */
493 status
->value
.sig
= rdi_error_signal (execute_status
);
498 /* Read the remote registers into the block REGS. */
502 arm_rdi_fetch_registers (regno
)
505 int rslt
, rdi_regmask
;
506 unsigned long rawreg
, rawregs
[32];
511 rslt
= angel_RDI_CPUread (255, 0x27fff, rawregs
);
514 printf_filtered ("RDI_CPUread: %s\n", rdi_error_message (rslt
));
517 for (regno
= 0; regno
< 15; regno
++)
519 store_unsigned_integer (cookedreg
, 4, rawregs
[regno
]);
520 supply_register (regno
, (char *) cookedreg
);
522 store_unsigned_integer (cookedreg
, 4, rawregs
[15]);
523 supply_register (PS_REGNUM
, (char *) cookedreg
);
524 arm_rdi_fetch_registers (PC_REGNUM
);
528 if (regno
== PC_REGNUM
)
529 rdi_regmask
= RDIReg_PC
;
530 else if (regno
== PS_REGNUM
)
531 rdi_regmask
= RDIReg_CPSR
;
532 else if (regno
< 0 || regno
> 15)
535 supply_register (regno
, (char *) &rawreg
);
539 rdi_regmask
= 1 << regno
;
541 rslt
= angel_RDI_CPUread (255, rdi_regmask
, &rawreg
);
544 printf_filtered ("RDI_CPUread: %s\n", rdi_error_message (rslt
));
546 store_unsigned_integer (cookedreg
, 4, rawreg
);
547 supply_register (regno
, (char *) cookedreg
);
552 arm_rdi_prepare_to_store ()
557 /* Store register REGNO, or all registers if REGNO == -1, from the contents
558 of REGISTERS. FIXME: ignores errors. */
561 arm_rdi_store_registers (regno
)
564 int rslt
, rdi_regmask
;
566 /* These need to be able to take 'floating point register' contents */
567 unsigned long rawreg
[3], rawerreg
[3];
571 for (regno
= 0; regno
< NUM_REGS
; regno
++)
572 arm_rdi_store_registers (regno
);
576 read_register_gen (regno
, (char *) rawreg
);
577 /* RDI manipulates data in host byte order, so convert now. */
578 store_unsigned_integer (rawerreg
, 4, rawreg
[0]);
580 if (regno
== PC_REGNUM
)
581 rdi_regmask
= RDIReg_PC
;
582 else if (regno
== PS_REGNUM
)
583 rdi_regmask
= RDIReg_CPSR
;
584 else if (regno
< 0 || regno
> 15)
587 rdi_regmask
= 1 << regno
;
589 rslt
= angel_RDI_CPUwrite (255, rdi_regmask
, rawerreg
);
592 printf_filtered ("RDI_CPUwrite: %s\n", rdi_error_message (rslt
));
597 /* Read or write LEN bytes from inferior memory at MEMADDR,
598 transferring to or from debugger address MYADDR. Write to inferior
599 if SHOULD_WRITE is nonzero. Returns length of data written or
600 read; 0 for error. */
604 arm_rdi_xfer_memory(memaddr
, myaddr
, len
, should_write
, target
)
609 struct target_ops
*target
; /* ignored */
615 rslt
= angel_RDI_write (myaddr
, memaddr
, &len
);
618 printf_filtered ("RDI_write: %s\n", rdi_error_message (rslt
));
623 rslt
= angel_RDI_read (memaddr
, myaddr
, &len
);
626 printf_filtered ("RDI_read: %s\n", rdi_error_message (rslt
));
633 /* Display random info collected from the target. */
636 arm_rdi_files_info (ignore
)
637 struct target_ops
*ignore
;
639 char *file
= "nothing";
641 unsigned long arg1
, arg2
;
643 rslt
= angel_RDI_info (RDIInfo_Target
, &arg1
, &arg2
);
646 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
648 if (arg1
& (1 << 15))
649 printf_filtered ("Target supports Thumb code.\n");
650 if (arg1
& (1 << 14))
651 printf_filtered ("Target can do profiling.\n");
653 printf_filtered ("Target is real hardware.\n");
655 rslt
= angel_RDI_info (RDIInfo_Step
, &arg1
, &arg2
);
658 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
660 printf_filtered ("Target can%s single-step.\n", (arg1
& 0x4 ? "" : "not"));
662 rslt
= angel_RDI_info (RDIInfo_Icebreaker
, &arg1
, &arg2
);
665 printf_filtered ("RDI_info: %s\n", rdi_error_message (rslt
));
668 printf_filtered ("Target includes an EmbeddedICE.\n");
676 rslt
= angel_RDI_open (1, &gdb_config
, NULL
, NULL
);
679 printf_filtered ("RDI_open: %s\n", rdi_error_message (rslt
));
684 arm_rdi_mourn_inferior ()
686 unpush_target (&arm_rdi_ops
);
687 generic_mourn_inferior ();
690 /* While the RDI library keeps track of its own breakpoints, we need
691 to remember "handles" so that we can delete them later. Since
692 breakpoints get used for stepping, be careful not to leak memory
696 arm_rdi_insert_breakpoint (addr
, contents_cache
)
698 char *contents_cache
;
702 struct local_bp_list_entry
*entry
;
703 int type
= RDIPoint_EQ
;
705 if (arm_pc_is_thumb (addr
) || arm_pc_is_thumb_dummy (addr
))
706 type
|= RDIPoint_16Bit
;
707 rslt
= angel_RDI_setbreak (addr
, type
, 0, &point
);
710 printf_filtered ("RDI_setbreak: %s\n", rdi_error_message (rslt
));
713 (struct local_bp_list_entry
*) xmalloc (sizeof (struct local_bp_list_entry
));
715 entry
->point
= point
;
716 entry
->next
= local_bp_list
;
717 local_bp_list
= entry
;
722 arm_rdi_remove_breakpoint (addr
, contents_cache
)
724 char *contents_cache
;
728 struct local_bp_list_entry
*entry
, *preventry
;
730 for (entry
= local_bp_list
; entry
!= NULL
; entry
= entry
->next
)
732 if (entry
->addr
== addr
)
740 rslt
= angel_RDI_clearbreak (entry
->point
);
743 printf_filtered ("RDI_clearbreak: %s\n", rdi_error_message (rslt
));
745 /* Delete the breakpoint entry locally. */
746 if (entry
== local_bp_list
)
748 local_bp_list
= entry
->next
;
752 preventry
->next
= entry
->next
;
760 rdi_error_message (err
)
765 case RDIError_NoError
:
768 return "debuggee reset";
769 case RDIError_UndefinedInstruction
:
770 return "undefined instruction";
771 case RDIError_SoftwareInterrupt
:
772 return "SWI trapped";
773 case RDIError_PrefetchAbort
:
774 return "prefetch abort, execution ran into unmapped memory?";
775 case RDIError_DataAbort
:
776 return "data abort, no memory at specified address?";
777 case RDIError_AddressException
:
778 return "address exception, access >26bit in 26bit mode";
780 return "IRQ, interrupt trapped";
782 return "FIQ, fast interrupt trapped";
784 return "a miscellaneous type of error";
785 case RDIError_BranchThrough0
:
786 return "branch through location 0";
787 case RDIError_NotInitialised
:
788 return "internal error, RDI_open not called first";
789 case RDIError_UnableToInitialise
:
790 return "internal error, target world is broken";
791 case RDIError_WrongByteSex
:
792 return "See Operator: WrongByteSex";
793 case RDIError_UnableToTerminate
:
794 return "See Operator: Unable to Terminate";
795 case RDIError_BadInstruction
:
796 return "bad instruction, illegal to execute this instruction";
797 case RDIError_IllegalInstruction
:
798 return "illegal instruction, the effect of executing it is undefined";
799 case RDIError_BadCPUStateSetting
:
800 return "internal error, tried to set SPSR of user mode";
801 case RDIError_UnknownCoPro
:
802 return "unknown co-processor";
803 case RDIError_UnknownCoProState
:
804 return "cannot execute co-processor request";
805 case RDIError_BadCoProState
:
806 return "recognizably broken co-processor request";
807 case RDIError_BadPointType
:
808 return "internal error, bad point yype";
809 case RDIError_UnimplementedType
:
810 return "internal error, unimplemented type";
811 case RDIError_BadPointSize
:
812 return "internal error, bad point size";
813 case RDIError_UnimplementedSize
:
814 return "internal error, unimplemented size";
815 case RDIError_NoMorePoints
:
816 return "last break/watch point was used";
817 case RDIError_BreakpointReached
:
818 return "breakpoint reached";
819 case RDIError_WatchpointAccessed
:
820 return "watchpoint accessed";
821 case RDIError_NoSuchPoint
:
822 return "attempted to clear non-existent break/watch point";
823 case RDIError_ProgramFinishedInStep
:
824 return "end of the program reached while stepping";
825 case RDIError_UserInterrupt
:
826 return "you pressed Escape";
827 case RDIError_CantSetPoint
:
828 return "no more break/watch points available";
829 case RDIError_IncompatibleRDILevels
:
830 return "incompatible RDI levels";
831 case RDIError_LittleEndian
:
832 return "debuggee is little endian";
833 case RDIError_BigEndian
:
834 return "debuggee is big endian";
835 case RDIError_SoftInitialiseError
:
836 return "recoverable error in RDI initialization";
837 case RDIError_InsufficientPrivilege
:
838 return "internal error, supervisor state not accessible to monitor";
839 case RDIError_UnimplementedMessage
:
840 return "internal error, unimplemented message";
841 case RDIError_UndefinedMessage
:
842 return "internal error, undefined message";
844 return "undefined error message, should reset target";
848 /* Convert the ARM error messages to signals that GDB knows about. */
850 static enum target_signal
851 rdi_error_signal (err
)
856 case RDIError_NoError
:
859 return TARGET_SIGNAL_TERM
; /* ??? */
860 case RDIError_UndefinedInstruction
:
861 return TARGET_SIGNAL_ILL
;
862 case RDIError_SoftwareInterrupt
:
863 case RDIError_PrefetchAbort
:
864 case RDIError_DataAbort
:
865 return TARGET_SIGNAL_TRAP
;
866 case RDIError_AddressException
:
867 return TARGET_SIGNAL_SEGV
;
870 return TARGET_SIGNAL_TRAP
;
872 return TARGET_SIGNAL_TERM
;
873 case RDIError_BranchThrough0
:
874 return TARGET_SIGNAL_TRAP
;
875 case RDIError_NotInitialised
:
876 case RDIError_UnableToInitialise
:
877 case RDIError_WrongByteSex
:
878 case RDIError_UnableToTerminate
:
879 return TARGET_SIGNAL_UNKNOWN
;
880 case RDIError_BadInstruction
:
881 case RDIError_IllegalInstruction
:
882 return TARGET_SIGNAL_ILL
;
883 case RDIError_BadCPUStateSetting
:
884 case RDIError_UnknownCoPro
:
885 case RDIError_UnknownCoProState
:
886 case RDIError_BadCoProState
:
887 case RDIError_BadPointType
:
888 case RDIError_UnimplementedType
:
889 case RDIError_BadPointSize
:
890 case RDIError_UnimplementedSize
:
891 case RDIError_NoMorePoints
:
892 return TARGET_SIGNAL_UNKNOWN
;
893 case RDIError_BreakpointReached
:
894 case RDIError_WatchpointAccessed
:
895 return TARGET_SIGNAL_TRAP
;
896 case RDIError_NoSuchPoint
:
897 case RDIError_ProgramFinishedInStep
:
898 return TARGET_SIGNAL_UNKNOWN
;
899 case RDIError_UserInterrupt
:
900 return TARGET_SIGNAL_INT
;
901 case RDIError_IncompatibleRDILevels
:
902 case RDIError_LittleEndian
:
903 case RDIError_BigEndian
:
904 case RDIError_SoftInitialiseError
:
905 case RDIError_InsufficientPrivilege
:
906 case RDIError_UnimplementedMessage
:
907 case RDIError_UndefinedMessage
:
909 return TARGET_SIGNAL_UNKNOWN
;
913 /* Define the target operations structure. */
918 arm_rdi_ops
.to_shortname
= "rdi";
919 arm_rdi_ops
.to_longname
= "ARM RDI";
920 arm_rdi_ops
.to_doc
= "Use a remote ARM-based computer; via the RDI library.\n\
921 Specify the serial device it is connected to (e.g. /dev/ttya)." ;
922 arm_rdi_ops
.to_open
= arm_rdi_open
;
923 arm_rdi_ops
.to_close
= arm_rdi_close
;
924 arm_rdi_ops
.to_detach
= arm_rdi_detach
;
925 arm_rdi_ops
.to_resume
= arm_rdi_resume
;
926 arm_rdi_ops
.to_wait
= arm_rdi_wait
;
927 arm_rdi_ops
.to_fetch_registers
= arm_rdi_fetch_registers
;
928 arm_rdi_ops
.to_store_registers
= arm_rdi_store_registers
;
929 arm_rdi_ops
.to_prepare_to_store
= arm_rdi_prepare_to_store
;
930 arm_rdi_ops
.to_xfer_memory
= arm_rdi_xfer_memory
;
931 arm_rdi_ops
.to_files_info
= arm_rdi_files_info
;
932 arm_rdi_ops
.to_insert_breakpoint
= arm_rdi_insert_breakpoint
;
933 arm_rdi_ops
.to_remove_breakpoint
= arm_rdi_remove_breakpoint
;
934 arm_rdi_ops
.to_kill
= arm_rdi_kill
;
935 arm_rdi_ops
.to_load
= generic_load
;
936 arm_rdi_ops
.to_create_inferior
= arm_rdi_create_inferior
;
937 arm_rdi_ops
.to_mourn_inferior
= arm_rdi_mourn_inferior
;
938 arm_rdi_ops
.to_stratum
= process_stratum
;
939 arm_rdi_ops
.to_has_all_memory
= 1;
940 arm_rdi_ops
.to_has_memory
= 1;
941 arm_rdi_ops
.to_has_stack
= 1;
942 arm_rdi_ops
.to_has_registers
= 1;
943 arm_rdi_ops
.to_has_execution
= 1;
944 arm_rdi_ops
.to_magic
= OPS_MAGIC
;
948 _initialize_remote_rdi ()
951 add_target (&arm_rdi_ops
);
954 /* A little dummy to make linking with the library succeed. */