1e93f7393Sniklas /* Select target systems and architectures at runtime for GDB.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4b725ae77Skettenis 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5b725ae77Skettenis
6e93f7393Sniklas Contributed by Cygnus Support.
7e93f7393Sniklas
8e93f7393Sniklas This file is part of GDB.
9e93f7393Sniklas
10e93f7393Sniklas This program is free software; you can redistribute it and/or modify
11e93f7393Sniklas it under the terms of the GNU General Public License as published by
12e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
13e93f7393Sniklas (at your option) any later version.
14e93f7393Sniklas
15e93f7393Sniklas This program is distributed in the hope that it will be useful,
16e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
17e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18e93f7393Sniklas GNU General Public License for more details.
19e93f7393Sniklas
20e93f7393Sniklas You should have received a copy of the GNU General Public License
21e93f7393Sniklas along with this program; if not, write to the Free Software
22b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
23b725ae77Skettenis Boston, MA 02111-1307, USA. */
24e93f7393Sniklas
25e93f7393Sniklas #include "defs.h"
26e93f7393Sniklas #include <errno.h>
27e93f7393Sniklas #include "gdb_string.h"
28e93f7393Sniklas #include "target.h"
29e93f7393Sniklas #include "gdbcmd.h"
30e93f7393Sniklas #include "symtab.h"
31e93f7393Sniklas #include "inferior.h"
32e93f7393Sniklas #include "bfd.h"
33e93f7393Sniklas #include "symfile.h"
34e93f7393Sniklas #include "objfiles.h"
35b725ae77Skettenis #include "gdb_wait.h"
36b725ae77Skettenis #include "dcache.h"
37e93f7393Sniklas #include <signal.h>
38b725ae77Skettenis #include "regcache.h"
39b725ae77Skettenis #include "gdb_assert.h"
40b725ae77Skettenis #include "gdbcore.h"
41e93f7393Sniklas
42b725ae77Skettenis static void target_info (char *, int);
43e93f7393Sniklas
44b725ae77Skettenis static void maybe_kill_then_attach (char *, int);
45e93f7393Sniklas
46b725ae77Skettenis static void kill_or_be_killed (int);
47e93f7393Sniklas
48b725ae77Skettenis static void default_terminal_info (char *, int);
49e93f7393Sniklas
50b725ae77Skettenis static int default_region_size_ok_for_hw_watchpoint (int);
51e93f7393Sniklas
52b725ae77Skettenis static int nosymbol (char *, CORE_ADDR *);
53e93f7393Sniklas
54b725ae77Skettenis static void tcomplain (void);
55e93f7393Sniklas
56b725ae77Skettenis static int nomemory (CORE_ADDR, char *, int, int, struct target_ops *);
57e93f7393Sniklas
58b725ae77Skettenis static int return_zero (void);
59e93f7393Sniklas
60b725ae77Skettenis static int return_one (void);
61e93f7393Sniklas
62b725ae77Skettenis static int return_minus_one (void);
63e93f7393Sniklas
64b725ae77Skettenis void target_ignore (void);
65e93f7393Sniklas
66b725ae77Skettenis static void target_command (char *, int);
67e93f7393Sniklas
68b725ae77Skettenis static struct target_ops *find_default_run_target (char *);
69e93f7393Sniklas
70b725ae77Skettenis static void nosupport_runtime (void);
71e93f7393Sniklas
72b725ae77Skettenis static LONGEST default_xfer_partial (struct target_ops *ops,
73b725ae77Skettenis enum target_object object,
74b725ae77Skettenis const char *annex, void *readbuf,
75b725ae77Skettenis const void *writebuf,
76b725ae77Skettenis ULONGEST offset, LONGEST len);
77e93f7393Sniklas
78b725ae77Skettenis /* Transfer LEN bytes between target address MEMADDR and GDB address
79b725ae77Skettenis MYADDR. Returns 0 for success, errno code for failure (which
80b725ae77Skettenis includes partial transfers -- if you want a more useful response to
81b725ae77Skettenis partial transfers, try either target_read_memory_partial or
82b725ae77Skettenis target_write_memory_partial). */
83e93f7393Sniklas
84b725ae77Skettenis static int target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
85b725ae77Skettenis int write);
86e93f7393Sniklas
87b725ae77Skettenis static void init_dummy_target (void);
88e93f7393Sniklas
89*63addd46Skettenis static struct target_ops debug_target;
90*63addd46Skettenis
91b725ae77Skettenis static void debug_to_open (char *, int);
92e93f7393Sniklas
93b725ae77Skettenis static void debug_to_close (int);
94e93f7393Sniklas
95b725ae77Skettenis static void debug_to_attach (char *, int);
96e93f7393Sniklas
97b725ae77Skettenis static void debug_to_detach (char *, int);
98e93f7393Sniklas
99b725ae77Skettenis static void debug_to_disconnect (char *, int);
100e93f7393Sniklas
101b725ae77Skettenis static void debug_to_resume (ptid_t, int, enum target_signal);
102e93f7393Sniklas
103b725ae77Skettenis static ptid_t debug_to_wait (ptid_t, struct target_waitstatus *);
104e93f7393Sniklas
105b725ae77Skettenis static void debug_to_fetch_registers (int);
106e93f7393Sniklas
107b725ae77Skettenis static void debug_to_store_registers (int);
108e93f7393Sniklas
109b725ae77Skettenis static void debug_to_prepare_to_store (void);
110e93f7393Sniklas
111*63addd46Skettenis static int deprecated_debug_xfer_memory (CORE_ADDR, char *, int, int,
112*63addd46Skettenis struct mem_attrib *,
113*63addd46Skettenis struct target_ops *);
114e93f7393Sniklas
115b725ae77Skettenis static void debug_to_files_info (struct target_ops *);
116e93f7393Sniklas
117b725ae77Skettenis static int debug_to_insert_breakpoint (CORE_ADDR, char *);
118e93f7393Sniklas
119b725ae77Skettenis static int debug_to_remove_breakpoint (CORE_ADDR, char *);
120e93f7393Sniklas
121b725ae77Skettenis static int debug_to_can_use_hw_breakpoint (int, int, int);
122e93f7393Sniklas
123b725ae77Skettenis static int debug_to_insert_hw_breakpoint (CORE_ADDR, char *);
124e93f7393Sniklas
125b725ae77Skettenis static int debug_to_remove_hw_breakpoint (CORE_ADDR, char *);
126e93f7393Sniklas
127b725ae77Skettenis static int debug_to_insert_watchpoint (CORE_ADDR, int, int);
128e93f7393Sniklas
129b725ae77Skettenis static int debug_to_remove_watchpoint (CORE_ADDR, int, int);
130e93f7393Sniklas
131b725ae77Skettenis static int debug_to_stopped_by_watchpoint (void);
132e93f7393Sniklas
133*63addd46Skettenis static int debug_to_stopped_data_address (struct target_ops *, CORE_ADDR *);
134e93f7393Sniklas
135b725ae77Skettenis static int debug_to_region_size_ok_for_hw_watchpoint (int);
136b725ae77Skettenis
137b725ae77Skettenis static void debug_to_terminal_init (void);
138b725ae77Skettenis
139b725ae77Skettenis static void debug_to_terminal_inferior (void);
140b725ae77Skettenis
141b725ae77Skettenis static void debug_to_terminal_ours_for_output (void);
142b725ae77Skettenis
143b725ae77Skettenis static void debug_to_terminal_save_ours (void);
144b725ae77Skettenis
145b725ae77Skettenis static void debug_to_terminal_ours (void);
146b725ae77Skettenis
147b725ae77Skettenis static void debug_to_terminal_info (char *, int);
148b725ae77Skettenis
149b725ae77Skettenis static void debug_to_kill (void);
150b725ae77Skettenis
151b725ae77Skettenis static void debug_to_load (char *, int);
152b725ae77Skettenis
153b725ae77Skettenis static int debug_to_lookup_symbol (char *, CORE_ADDR *);
154b725ae77Skettenis
155b725ae77Skettenis static void debug_to_mourn_inferior (void);
156b725ae77Skettenis
157b725ae77Skettenis static int debug_to_can_run (void);
158b725ae77Skettenis
159b725ae77Skettenis static void debug_to_notice_signals (ptid_t);
160b725ae77Skettenis
161b725ae77Skettenis static int debug_to_thread_alive (ptid_t);
162b725ae77Skettenis
163b725ae77Skettenis static void debug_to_stop (void);
164e93f7393Sniklas
165*63addd46Skettenis /* NOTE: cagney/2004-09-29: Many targets reference this variable in
166*63addd46Skettenis wierd and mysterious ways. Putting the variable here lets those
167*63addd46Skettenis wierd and mysterious ways keep building while they are being
168*63addd46Skettenis converted to the inferior inheritance structure. */
169*63addd46Skettenis struct target_ops deprecated_child_ops;
170*63addd46Skettenis
171e93f7393Sniklas /* Pointer to array of target architecture structures; the size of the
172e93f7393Sniklas array; the current index into the array; the allocated size of the
173e93f7393Sniklas array. */
174e93f7393Sniklas struct target_ops **target_structs;
175e93f7393Sniklas unsigned target_struct_size;
176e93f7393Sniklas unsigned target_struct_index;
177e93f7393Sniklas unsigned target_struct_allocsize;
178e93f7393Sniklas #define DEFAULT_ALLOCSIZE 10
179e93f7393Sniklas
180e93f7393Sniklas /* The initial current target, so that there is always a semi-valid
181e93f7393Sniklas current target. */
182e93f7393Sniklas
183b725ae77Skettenis static struct target_ops dummy_target;
184e93f7393Sniklas
185e93f7393Sniklas /* Top of target stack. */
186e93f7393Sniklas
187b725ae77Skettenis static struct target_ops *target_stack;
188e93f7393Sniklas
189e93f7393Sniklas /* The target structure we are currently using to talk to a process
190e93f7393Sniklas or file or whatever "inferior" we have. */
191e93f7393Sniklas
192e93f7393Sniklas struct target_ops current_target;
193e93f7393Sniklas
194e93f7393Sniklas /* Command list for target. */
195e93f7393Sniklas
196e93f7393Sniklas static struct cmd_list_element *targetlist = NULL;
197e93f7393Sniklas
198e93f7393Sniklas /* Nonzero if we are debugging an attached outside process
199e93f7393Sniklas rather than an inferior. */
200e93f7393Sniklas
201e93f7393Sniklas int attach_flag;
202e93f7393Sniklas
203e93f7393Sniklas /* Non-zero if we want to see trace of target level stuff. */
204e93f7393Sniklas
205e93f7393Sniklas static int targetdebug = 0;
206e93f7393Sniklas
207b725ae77Skettenis static void setup_target_debug (void);
208e93f7393Sniklas
209b725ae77Skettenis DCACHE *target_dcache;
210e93f7393Sniklas
211e93f7393Sniklas /* The user just typed 'target' without the name of a target. */
212e93f7393Sniklas
213e93f7393Sniklas static void
target_command(char * arg,int from_tty)214b725ae77Skettenis target_command (char *arg, int from_tty)
215e93f7393Sniklas {
216e93f7393Sniklas fputs_filtered ("Argument required (target name). Try `help target'\n",
217e93f7393Sniklas gdb_stdout);
218e93f7393Sniklas }
219e93f7393Sniklas
220e93f7393Sniklas /* Add a possible target architecture to the list. */
221e93f7393Sniklas
222e93f7393Sniklas void
add_target(struct target_ops * t)223b725ae77Skettenis add_target (struct target_ops *t)
224e93f7393Sniklas {
225b725ae77Skettenis /* Provide default values for all "must have" methods. */
226b725ae77Skettenis if (t->to_xfer_partial == NULL)
227b725ae77Skettenis t->to_xfer_partial = default_xfer_partial;
228b725ae77Skettenis
229e93f7393Sniklas if (!target_structs)
230e93f7393Sniklas {
231e93f7393Sniklas target_struct_allocsize = DEFAULT_ALLOCSIZE;
232e93f7393Sniklas target_structs = (struct target_ops **) xmalloc
233e93f7393Sniklas (target_struct_allocsize * sizeof (*target_structs));
234e93f7393Sniklas }
235e93f7393Sniklas if (target_struct_size >= target_struct_allocsize)
236e93f7393Sniklas {
237e93f7393Sniklas target_struct_allocsize *= 2;
238e93f7393Sniklas target_structs = (struct target_ops **)
239e93f7393Sniklas xrealloc ((char *) target_structs,
240e93f7393Sniklas target_struct_allocsize * sizeof (*target_structs));
241e93f7393Sniklas }
242e93f7393Sniklas target_structs[target_struct_size++] = t;
243e93f7393Sniklas
244e93f7393Sniklas if (targetlist == NULL)
245e93f7393Sniklas add_prefix_cmd ("target", class_run, target_command,
246e93f7393Sniklas "Connect to a target machine or process.\n\
247e93f7393Sniklas The first argument is the type or protocol of the target machine.\n\
248e93f7393Sniklas Remaining arguments are interpreted by the target protocol. For more\n\
249e93f7393Sniklas information on the arguments for a particular protocol, type\n\
250e93f7393Sniklas `help target ' followed by the protocol name.",
251e93f7393Sniklas &targetlist, "target ", 0, &cmdlist);
252e93f7393Sniklas add_cmd (t->to_shortname, no_class, t->to_open, t->to_doc, &targetlist);
253e93f7393Sniklas }
254e93f7393Sniklas
255e93f7393Sniklas /* Stub functions */
256e93f7393Sniklas
257b725ae77Skettenis void
target_ignore(void)258b725ae77Skettenis target_ignore (void)
259e93f7393Sniklas {
260e93f7393Sniklas }
261e93f7393Sniklas
262b725ae77Skettenis void
target_load(char * arg,int from_tty)263b725ae77Skettenis target_load (char *arg, int from_tty)
264b725ae77Skettenis {
265b725ae77Skettenis dcache_invalidate (target_dcache);
266b725ae77Skettenis (*current_target.to_load) (arg, from_tty);
267b725ae77Skettenis }
268b725ae77Skettenis
269e93f7393Sniklas static int
nomemory(CORE_ADDR memaddr,char * myaddr,int len,int write,struct target_ops * t)270b725ae77Skettenis nomemory (CORE_ADDR memaddr, char *myaddr, int len, int write,
271b725ae77Skettenis struct target_ops *t)
272e93f7393Sniklas {
273e93f7393Sniklas errno = EIO; /* Can't read/write this location */
274e93f7393Sniklas return 0; /* No bytes handled */
275e93f7393Sniklas }
276e93f7393Sniklas
277e93f7393Sniklas static void
tcomplain(void)278b725ae77Skettenis tcomplain (void)
279e93f7393Sniklas {
280e93f7393Sniklas error ("You can't do that when your target is `%s'",
281e93f7393Sniklas current_target.to_shortname);
282e93f7393Sniklas }
283e93f7393Sniklas
284e93f7393Sniklas void
noprocess(void)285b725ae77Skettenis noprocess (void)
286e93f7393Sniklas {
287b725ae77Skettenis error ("You can't do that without a process to debug.");
288e93f7393Sniklas }
289e93f7393Sniklas
290e93f7393Sniklas static int
nosymbol(char * name,CORE_ADDR * addrp)291b725ae77Skettenis nosymbol (char *name, CORE_ADDR *addrp)
292e93f7393Sniklas {
293e93f7393Sniklas return 1; /* Symbol does not exist in target env */
294e93f7393Sniklas }
295e93f7393Sniklas
296e93f7393Sniklas static void
nosupport_runtime(void)297b725ae77Skettenis nosupport_runtime (void)
298b725ae77Skettenis {
299b725ae77Skettenis if (ptid_equal (inferior_ptid, null_ptid))
300b725ae77Skettenis noprocess ();
301b725ae77Skettenis else
302b725ae77Skettenis error ("No run-time support for this");
303b725ae77Skettenis }
304b725ae77Skettenis
305b725ae77Skettenis
306b725ae77Skettenis static void
default_terminal_info(char * args,int from_tty)307b725ae77Skettenis default_terminal_info (char *args, int from_tty)
308e93f7393Sniklas {
309e93f7393Sniklas printf_unfiltered ("No saved terminal information.\n");
310e93f7393Sniklas }
311e93f7393Sniklas
312e93f7393Sniklas /* This is the default target_create_inferior and target_attach function.
313e93f7393Sniklas If the current target is executing, it asks whether to kill it off.
314e93f7393Sniklas If this function returns without calling error(), it has killed off
315e93f7393Sniklas the target, and the operation should be attempted. */
316e93f7393Sniklas
317e93f7393Sniklas static void
kill_or_be_killed(int from_tty)318b725ae77Skettenis kill_or_be_killed (int from_tty)
319e93f7393Sniklas {
320e93f7393Sniklas if (target_has_execution)
321e93f7393Sniklas {
322e93f7393Sniklas printf_unfiltered ("You are already running a program:\n");
323e93f7393Sniklas target_files_info ();
324b725ae77Skettenis if (query ("Kill it? "))
325b725ae77Skettenis {
326e93f7393Sniklas target_kill ();
327e93f7393Sniklas if (target_has_execution)
328e93f7393Sniklas error ("Killing the program did not help.");
329e93f7393Sniklas return;
330b725ae77Skettenis }
331b725ae77Skettenis else
332b725ae77Skettenis {
333e93f7393Sniklas error ("Program not killed.");
334e93f7393Sniklas }
335e93f7393Sniklas }
336e93f7393Sniklas tcomplain ();
337e93f7393Sniklas }
338e93f7393Sniklas
339e93f7393Sniklas static void
maybe_kill_then_attach(char * args,int from_tty)340b725ae77Skettenis maybe_kill_then_attach (char *args, int from_tty)
341e93f7393Sniklas {
342e93f7393Sniklas kill_or_be_killed (from_tty);
343e93f7393Sniklas target_attach (args, from_tty);
344e93f7393Sniklas }
345e93f7393Sniklas
346e93f7393Sniklas static void
maybe_kill_then_create_inferior(char * exec,char * args,char ** env,int from_tty)347*63addd46Skettenis maybe_kill_then_create_inferior (char *exec, char *args, char **env,
348*63addd46Skettenis int from_tty)
349e93f7393Sniklas {
350e93f7393Sniklas kill_or_be_killed (0);
351*63addd46Skettenis target_create_inferior (exec, args, env, from_tty);
352e93f7393Sniklas }
353e93f7393Sniklas
354b725ae77Skettenis /* Go through the target stack from top to bottom, copying over zero
355b725ae77Skettenis entries in current_target, then filling in still empty entries. In
356b725ae77Skettenis effect, we are doing class inheritance through the pushed target
357b725ae77Skettenis vectors.
358b725ae77Skettenis
359b725ae77Skettenis NOTE: cagney/2003-10-17: The problem with this inheritance, as it
360b725ae77Skettenis is currently implemented, is that it discards any knowledge of
361b725ae77Skettenis which target an inherited method originally belonged to.
362b725ae77Skettenis Consequently, new new target methods should instead explicitly and
363b725ae77Skettenis locally search the target stack for the target that can handle the
364b725ae77Skettenis request. */
365e93f7393Sniklas
366e93f7393Sniklas static void
update_current_target(void)367b725ae77Skettenis update_current_target (void)
368e93f7393Sniklas {
369e93f7393Sniklas struct target_ops *t;
370e93f7393Sniklas
371b725ae77Skettenis /* First, reset curren'ts contents. */
372b725ae77Skettenis memset (¤t_target, 0, sizeof (current_target));
373e93f7393Sniklas
374e93f7393Sniklas #define INHERIT(FIELD, TARGET) \
375e93f7393Sniklas if (!current_target.FIELD) \
376b725ae77Skettenis current_target.FIELD = (TARGET)->FIELD
377e93f7393Sniklas
378b725ae77Skettenis for (t = target_stack; t; t = t->beneath)
379b725ae77Skettenis {
380e93f7393Sniklas INHERIT (to_shortname, t);
381e93f7393Sniklas INHERIT (to_longname, t);
382e93f7393Sniklas INHERIT (to_doc, t);
383e93f7393Sniklas INHERIT (to_open, t);
384e93f7393Sniklas INHERIT (to_close, t);
385e93f7393Sniklas INHERIT (to_attach, t);
386b725ae77Skettenis INHERIT (to_post_attach, t);
387e93f7393Sniklas INHERIT (to_detach, t);
388b725ae77Skettenis INHERIT (to_disconnect, t);
389e93f7393Sniklas INHERIT (to_resume, t);
390e93f7393Sniklas INHERIT (to_wait, t);
391e93f7393Sniklas INHERIT (to_fetch_registers, t);
392e93f7393Sniklas INHERIT (to_store_registers, t);
393e93f7393Sniklas INHERIT (to_prepare_to_store, t);
394*63addd46Skettenis INHERIT (deprecated_xfer_memory, t);
395e93f7393Sniklas INHERIT (to_files_info, t);
396e93f7393Sniklas INHERIT (to_insert_breakpoint, t);
397e93f7393Sniklas INHERIT (to_remove_breakpoint, t);
398b725ae77Skettenis INHERIT (to_can_use_hw_breakpoint, t);
399b725ae77Skettenis INHERIT (to_insert_hw_breakpoint, t);
400b725ae77Skettenis INHERIT (to_remove_hw_breakpoint, t);
401b725ae77Skettenis INHERIT (to_insert_watchpoint, t);
402b725ae77Skettenis INHERIT (to_remove_watchpoint, t);
403b725ae77Skettenis INHERIT (to_stopped_data_address, t);
404b725ae77Skettenis INHERIT (to_stopped_by_watchpoint, t);
405b725ae77Skettenis INHERIT (to_have_continuable_watchpoint, t);
406b725ae77Skettenis INHERIT (to_region_size_ok_for_hw_watchpoint, t);
407e93f7393Sniklas INHERIT (to_terminal_init, t);
408e93f7393Sniklas INHERIT (to_terminal_inferior, t);
409e93f7393Sniklas INHERIT (to_terminal_ours_for_output, t);
410e93f7393Sniklas INHERIT (to_terminal_ours, t);
411b725ae77Skettenis INHERIT (to_terminal_save_ours, t);
412e93f7393Sniklas INHERIT (to_terminal_info, t);
413e93f7393Sniklas INHERIT (to_kill, t);
414e93f7393Sniklas INHERIT (to_load, t);
415e93f7393Sniklas INHERIT (to_lookup_symbol, t);
416e93f7393Sniklas INHERIT (to_create_inferior, t);
417b725ae77Skettenis INHERIT (to_post_startup_inferior, t);
418b725ae77Skettenis INHERIT (to_acknowledge_created_inferior, t);
419b725ae77Skettenis INHERIT (to_insert_fork_catchpoint, t);
420b725ae77Skettenis INHERIT (to_remove_fork_catchpoint, t);
421b725ae77Skettenis INHERIT (to_insert_vfork_catchpoint, t);
422b725ae77Skettenis INHERIT (to_remove_vfork_catchpoint, t);
423b725ae77Skettenis INHERIT (to_follow_fork, t);
424b725ae77Skettenis INHERIT (to_insert_exec_catchpoint, t);
425b725ae77Skettenis INHERIT (to_remove_exec_catchpoint, t);
426b725ae77Skettenis INHERIT (to_reported_exec_events_per_exec_call, t);
427b725ae77Skettenis INHERIT (to_has_exited, t);
428e93f7393Sniklas INHERIT (to_mourn_inferior, t);
429e93f7393Sniklas INHERIT (to_can_run, t);
430e93f7393Sniklas INHERIT (to_notice_signals, t);
431e93f7393Sniklas INHERIT (to_thread_alive, t);
432b725ae77Skettenis INHERIT (to_find_new_threads, t);
433b725ae77Skettenis INHERIT (to_pid_to_str, t);
434b725ae77Skettenis INHERIT (to_extra_thread_info, t);
435e93f7393Sniklas INHERIT (to_stop, t);
436b725ae77Skettenis /* Do not inherit to_xfer_partial. */
437b725ae77Skettenis INHERIT (to_rcmd, t);
438b725ae77Skettenis INHERIT (to_enable_exception_callback, t);
439b725ae77Skettenis INHERIT (to_get_current_exception_event, t);
440b725ae77Skettenis INHERIT (to_pid_to_exec_file, t);
441e93f7393Sniklas INHERIT (to_stratum, t);
442e93f7393Sniklas INHERIT (to_has_all_memory, t);
443e93f7393Sniklas INHERIT (to_has_memory, t);
444e93f7393Sniklas INHERIT (to_has_stack, t);
445e93f7393Sniklas INHERIT (to_has_registers, t);
446e93f7393Sniklas INHERIT (to_has_execution, t);
447b725ae77Skettenis INHERIT (to_has_thread_control, t);
448e93f7393Sniklas INHERIT (to_sections, t);
449e93f7393Sniklas INHERIT (to_sections_end, t);
450b725ae77Skettenis INHERIT (to_can_async_p, t);
451b725ae77Skettenis INHERIT (to_is_async_p, t);
452b725ae77Skettenis INHERIT (to_async, t);
453b725ae77Skettenis INHERIT (to_async_mask_value, t);
454b725ae77Skettenis INHERIT (to_find_memory_regions, t);
455b725ae77Skettenis INHERIT (to_make_corefile_notes, t);
456b725ae77Skettenis INHERIT (to_get_thread_local_address, t);
457e93f7393Sniklas INHERIT (to_magic, t);
458e93f7393Sniklas }
459b725ae77Skettenis #undef INHERIT
460b725ae77Skettenis
461b725ae77Skettenis /* Clean up a target struct so it no longer has any zero pointers in
462b725ae77Skettenis it. Some entries are defaulted to a method that print an error,
463b725ae77Skettenis others are hard-wired to a standard recursive default. */
464b725ae77Skettenis
465b725ae77Skettenis #define de_fault(field, value) \
466b725ae77Skettenis if (!current_target.field) \
467b725ae77Skettenis current_target.field = value
468b725ae77Skettenis
469b725ae77Skettenis de_fault (to_open,
470b725ae77Skettenis (void (*) (char *, int))
471b725ae77Skettenis tcomplain);
472b725ae77Skettenis de_fault (to_close,
473b725ae77Skettenis (void (*) (int))
474b725ae77Skettenis target_ignore);
475b725ae77Skettenis de_fault (to_attach,
476b725ae77Skettenis maybe_kill_then_attach);
477b725ae77Skettenis de_fault (to_post_attach,
478b725ae77Skettenis (void (*) (int))
479b725ae77Skettenis target_ignore);
480b725ae77Skettenis de_fault (to_detach,
481b725ae77Skettenis (void (*) (char *, int))
482b725ae77Skettenis target_ignore);
483b725ae77Skettenis de_fault (to_disconnect,
484b725ae77Skettenis (void (*) (char *, int))
485b725ae77Skettenis tcomplain);
486b725ae77Skettenis de_fault (to_resume,
487b725ae77Skettenis (void (*) (ptid_t, int, enum target_signal))
488b725ae77Skettenis noprocess);
489b725ae77Skettenis de_fault (to_wait,
490b725ae77Skettenis (ptid_t (*) (ptid_t, struct target_waitstatus *))
491b725ae77Skettenis noprocess);
492b725ae77Skettenis de_fault (to_fetch_registers,
493b725ae77Skettenis (void (*) (int))
494b725ae77Skettenis target_ignore);
495b725ae77Skettenis de_fault (to_store_registers,
496b725ae77Skettenis (void (*) (int))
497b725ae77Skettenis noprocess);
498b725ae77Skettenis de_fault (to_prepare_to_store,
499b725ae77Skettenis (void (*) (void))
500b725ae77Skettenis noprocess);
501*63addd46Skettenis de_fault (deprecated_xfer_memory,
502b725ae77Skettenis (int (*) (CORE_ADDR, char *, int, int, struct mem_attrib *, struct target_ops *))
503b725ae77Skettenis nomemory);
504b725ae77Skettenis de_fault (to_files_info,
505b725ae77Skettenis (void (*) (struct target_ops *))
506b725ae77Skettenis target_ignore);
507b725ae77Skettenis de_fault (to_insert_breakpoint,
508b725ae77Skettenis memory_insert_breakpoint);
509b725ae77Skettenis de_fault (to_remove_breakpoint,
510b725ae77Skettenis memory_remove_breakpoint);
511b725ae77Skettenis de_fault (to_can_use_hw_breakpoint,
512b725ae77Skettenis (int (*) (int, int, int))
513b725ae77Skettenis return_zero);
514b725ae77Skettenis de_fault (to_insert_hw_breakpoint,
515b725ae77Skettenis (int (*) (CORE_ADDR, char *))
516b725ae77Skettenis return_minus_one);
517b725ae77Skettenis de_fault (to_remove_hw_breakpoint,
518b725ae77Skettenis (int (*) (CORE_ADDR, char *))
519b725ae77Skettenis return_minus_one);
520b725ae77Skettenis de_fault (to_insert_watchpoint,
521b725ae77Skettenis (int (*) (CORE_ADDR, int, int))
522b725ae77Skettenis return_minus_one);
523b725ae77Skettenis de_fault (to_remove_watchpoint,
524b725ae77Skettenis (int (*) (CORE_ADDR, int, int))
525b725ae77Skettenis return_minus_one);
526b725ae77Skettenis de_fault (to_stopped_by_watchpoint,
527b725ae77Skettenis (int (*) (void))
528b725ae77Skettenis return_zero);
529b725ae77Skettenis de_fault (to_stopped_data_address,
530*63addd46Skettenis (int (*) (struct target_ops *, CORE_ADDR *))
531b725ae77Skettenis return_zero);
532b725ae77Skettenis de_fault (to_region_size_ok_for_hw_watchpoint,
533b725ae77Skettenis default_region_size_ok_for_hw_watchpoint);
534b725ae77Skettenis de_fault (to_terminal_init,
535b725ae77Skettenis (void (*) (void))
536b725ae77Skettenis target_ignore);
537b725ae77Skettenis de_fault (to_terminal_inferior,
538b725ae77Skettenis (void (*) (void))
539b725ae77Skettenis target_ignore);
540b725ae77Skettenis de_fault (to_terminal_ours_for_output,
541b725ae77Skettenis (void (*) (void))
542b725ae77Skettenis target_ignore);
543b725ae77Skettenis de_fault (to_terminal_ours,
544b725ae77Skettenis (void (*) (void))
545b725ae77Skettenis target_ignore);
546b725ae77Skettenis de_fault (to_terminal_save_ours,
547b725ae77Skettenis (void (*) (void))
548b725ae77Skettenis target_ignore);
549b725ae77Skettenis de_fault (to_terminal_info,
550b725ae77Skettenis default_terminal_info);
551b725ae77Skettenis de_fault (to_kill,
552b725ae77Skettenis (void (*) (void))
553b725ae77Skettenis noprocess);
554b725ae77Skettenis de_fault (to_load,
555b725ae77Skettenis (void (*) (char *, int))
556b725ae77Skettenis tcomplain);
557b725ae77Skettenis de_fault (to_lookup_symbol,
558b725ae77Skettenis (int (*) (char *, CORE_ADDR *))
559b725ae77Skettenis nosymbol);
560b725ae77Skettenis de_fault (to_create_inferior,
561b725ae77Skettenis maybe_kill_then_create_inferior);
562b725ae77Skettenis de_fault (to_post_startup_inferior,
563b725ae77Skettenis (void (*) (ptid_t))
564b725ae77Skettenis target_ignore);
565b725ae77Skettenis de_fault (to_acknowledge_created_inferior,
566b725ae77Skettenis (void (*) (int))
567b725ae77Skettenis target_ignore);
568b725ae77Skettenis de_fault (to_insert_fork_catchpoint,
569b725ae77Skettenis (int (*) (int))
570b725ae77Skettenis tcomplain);
571b725ae77Skettenis de_fault (to_remove_fork_catchpoint,
572b725ae77Skettenis (int (*) (int))
573b725ae77Skettenis tcomplain);
574b725ae77Skettenis de_fault (to_insert_vfork_catchpoint,
575b725ae77Skettenis (int (*) (int))
576b725ae77Skettenis tcomplain);
577b725ae77Skettenis de_fault (to_remove_vfork_catchpoint,
578b725ae77Skettenis (int (*) (int))
579b725ae77Skettenis tcomplain);
580b725ae77Skettenis de_fault (to_follow_fork,
581b725ae77Skettenis (int (*) (int))
582b725ae77Skettenis target_ignore);
583b725ae77Skettenis de_fault (to_insert_exec_catchpoint,
584b725ae77Skettenis (int (*) (int))
585b725ae77Skettenis tcomplain);
586b725ae77Skettenis de_fault (to_remove_exec_catchpoint,
587b725ae77Skettenis (int (*) (int))
588b725ae77Skettenis tcomplain);
589b725ae77Skettenis de_fault (to_reported_exec_events_per_exec_call,
590b725ae77Skettenis (int (*) (void))
591b725ae77Skettenis return_one);
592b725ae77Skettenis de_fault (to_has_exited,
593b725ae77Skettenis (int (*) (int, int, int *))
594b725ae77Skettenis return_zero);
595b725ae77Skettenis de_fault (to_mourn_inferior,
596b725ae77Skettenis (void (*) (void))
597b725ae77Skettenis noprocess);
598b725ae77Skettenis de_fault (to_can_run,
599b725ae77Skettenis return_zero);
600b725ae77Skettenis de_fault (to_notice_signals,
601b725ae77Skettenis (void (*) (ptid_t))
602b725ae77Skettenis target_ignore);
603b725ae77Skettenis de_fault (to_thread_alive,
604b725ae77Skettenis (int (*) (ptid_t))
605b725ae77Skettenis return_zero);
606b725ae77Skettenis de_fault (to_find_new_threads,
607b725ae77Skettenis (void (*) (void))
608b725ae77Skettenis target_ignore);
609b725ae77Skettenis de_fault (to_extra_thread_info,
610b725ae77Skettenis (char *(*) (struct thread_info *))
611b725ae77Skettenis return_zero);
612b725ae77Skettenis de_fault (to_stop,
613b725ae77Skettenis (void (*) (void))
614b725ae77Skettenis target_ignore);
615b725ae77Skettenis current_target.to_xfer_partial = default_xfer_partial;
616b725ae77Skettenis de_fault (to_rcmd,
617b725ae77Skettenis (void (*) (char *, struct ui_file *))
618b725ae77Skettenis tcomplain);
619b725ae77Skettenis de_fault (to_enable_exception_callback,
620b725ae77Skettenis (struct symtab_and_line * (*) (enum exception_event_kind, int))
621b725ae77Skettenis nosupport_runtime);
622b725ae77Skettenis de_fault (to_get_current_exception_event,
623b725ae77Skettenis (struct exception_event_record * (*) (void))
624b725ae77Skettenis nosupport_runtime);
625b725ae77Skettenis de_fault (to_pid_to_exec_file,
626b725ae77Skettenis (char *(*) (int))
627b725ae77Skettenis return_zero);
628b725ae77Skettenis de_fault (to_can_async_p,
629b725ae77Skettenis (int (*) (void))
630b725ae77Skettenis return_zero);
631b725ae77Skettenis de_fault (to_is_async_p,
632b725ae77Skettenis (int (*) (void))
633b725ae77Skettenis return_zero);
634b725ae77Skettenis de_fault (to_async,
635b725ae77Skettenis (void (*) (void (*) (enum inferior_event_type, void*), void*))
636b725ae77Skettenis tcomplain);
637b725ae77Skettenis #undef de_fault
638b725ae77Skettenis
639b725ae77Skettenis /* Finally, position the target-stack beneath the squashed
640b725ae77Skettenis "current_target". That way code looking for a non-inherited
641b725ae77Skettenis target method can quickly and simply find it. */
642b725ae77Skettenis current_target.beneath = target_stack;
643e93f7393Sniklas }
644e93f7393Sniklas
645e93f7393Sniklas /* Push a new target type into the stack of the existing target accessors,
646e93f7393Sniklas possibly superseding some of the existing accessors.
647e93f7393Sniklas
648e93f7393Sniklas Result is zero if the pushed target ended up on top of the stack,
649e93f7393Sniklas nonzero if at least one target is on top of it.
650e93f7393Sniklas
651e93f7393Sniklas Rather than allow an empty stack, we always have the dummy target at
652e93f7393Sniklas the bottom stratum, so we can call the function vectors without
653e93f7393Sniklas checking them. */
654e93f7393Sniklas
655e93f7393Sniklas int
push_target(struct target_ops * t)656b725ae77Skettenis push_target (struct target_ops *t)
657e93f7393Sniklas {
658b725ae77Skettenis struct target_ops **cur;
659e93f7393Sniklas
660e93f7393Sniklas /* Check magic number. If wrong, it probably means someone changed
661e93f7393Sniklas the struct definition, but not all the places that initialize one. */
662e93f7393Sniklas if (t->to_magic != OPS_MAGIC)
663e93f7393Sniklas {
664e93f7393Sniklas fprintf_unfiltered (gdb_stderr,
665e93f7393Sniklas "Magic number of %s target struct wrong\n",
666e93f7393Sniklas t->to_shortname);
667b725ae77Skettenis internal_error (__FILE__, __LINE__, "failed internal consistency check");
668e93f7393Sniklas }
669e93f7393Sniklas
670e93f7393Sniklas /* Find the proper stratum to install this target in. */
671b725ae77Skettenis for (cur = &target_stack; (*cur) != NULL; cur = &(*cur)->beneath)
672e93f7393Sniklas {
673b725ae77Skettenis if ((int) (t->to_stratum) >= (int) (*cur)->to_stratum)
674e93f7393Sniklas break;
675e93f7393Sniklas }
676e93f7393Sniklas
677e93f7393Sniklas /* If there's already targets at this stratum, remove them. */
678b725ae77Skettenis /* FIXME: cagney/2003-10-15: I think this should be poping all
679b725ae77Skettenis targets to CUR, and not just those at this stratum level. */
680b725ae77Skettenis while ((*cur) != NULL && t->to_stratum == (*cur)->to_stratum)
681e93f7393Sniklas {
682b725ae77Skettenis /* There's already something at this stratum level. Close it,
683b725ae77Skettenis and un-hook it from the stack. */
684b725ae77Skettenis struct target_ops *tmp = (*cur);
685b725ae77Skettenis (*cur) = (*cur)->beneath;
686b725ae77Skettenis tmp->beneath = NULL;
687b725ae77Skettenis target_close (tmp, 0);
688e93f7393Sniklas }
689e93f7393Sniklas
690e93f7393Sniklas /* We have removed all targets in our stratum, now add the new one. */
691b725ae77Skettenis t->beneath = (*cur);
692b725ae77Skettenis (*cur) = t;
693e93f7393Sniklas
694e93f7393Sniklas update_current_target ();
695e93f7393Sniklas
696e93f7393Sniklas if (targetdebug)
697e93f7393Sniklas setup_target_debug ();
698e93f7393Sniklas
699b725ae77Skettenis /* Not on top? */
700b725ae77Skettenis return (t != target_stack);
701e93f7393Sniklas }
702e93f7393Sniklas
703e93f7393Sniklas /* Remove a target_ops vector from the stack, wherever it may be.
704e93f7393Sniklas Return how many times it was removed (0 or 1). */
705e93f7393Sniklas
706e93f7393Sniklas int
unpush_target(struct target_ops * t)707b725ae77Skettenis unpush_target (struct target_ops *t)
708e93f7393Sniklas {
709b725ae77Skettenis struct target_ops **cur;
710b725ae77Skettenis struct target_ops *tmp;
711e93f7393Sniklas
712e93f7393Sniklas /* Look for the specified target. Note that we assume that a target
713e93f7393Sniklas can only occur once in the target stack. */
714e93f7393Sniklas
715b725ae77Skettenis for (cur = &target_stack; (*cur) != NULL; cur = &(*cur)->beneath)
716b725ae77Skettenis {
717b725ae77Skettenis if ((*cur) == t)
718e93f7393Sniklas break;
719b725ae77Skettenis }
720e93f7393Sniklas
721b725ae77Skettenis if ((*cur) == NULL)
722e93f7393Sniklas return 0; /* Didn't find target_ops, quit now */
723e93f7393Sniklas
724b725ae77Skettenis /* NOTE: cagney/2003-12-06: In '94 the close call was made
725b725ae77Skettenis unconditional by moving it to before the above check that the
726b725ae77Skettenis target was in the target stack (something about "Change the way
727b725ae77Skettenis pushing and popping of targets work to support target overlays
728b725ae77Skettenis and inheritance"). This doesn't make much sense - only open
729b725ae77Skettenis targets should be closed. */
730b725ae77Skettenis target_close (t, 0);
731b725ae77Skettenis
732e93f7393Sniklas /* Unchain the target */
733b725ae77Skettenis tmp = (*cur);
734b725ae77Skettenis (*cur) = (*cur)->beneath;
735b725ae77Skettenis tmp->beneath = NULL;
736e93f7393Sniklas
737e93f7393Sniklas update_current_target ();
738e93f7393Sniklas
739e93f7393Sniklas return 1;
740e93f7393Sniklas }
741e93f7393Sniklas
742e93f7393Sniklas void
pop_target(void)743b725ae77Skettenis pop_target (void)
744e93f7393Sniklas {
745b725ae77Skettenis target_close (¤t_target, 0); /* Let it clean up */
746b725ae77Skettenis if (unpush_target (target_stack) == 1)
747e93f7393Sniklas return;
748e93f7393Sniklas
749e93f7393Sniklas fprintf_unfiltered (gdb_stderr,
750e93f7393Sniklas "pop_target couldn't find target %s\n",
751e93f7393Sniklas current_target.to_shortname);
752b725ae77Skettenis internal_error (__FILE__, __LINE__, "failed internal consistency check");
753e93f7393Sniklas }
754e93f7393Sniklas
755e93f7393Sniklas #undef MIN
756e93f7393Sniklas #define MIN(A, B) (((A) <= (B)) ? (A) : (B))
757e93f7393Sniklas
758e93f7393Sniklas /* target_read_string -- read a null terminated string, up to LEN bytes,
759e93f7393Sniklas from MEMADDR in target. Set *ERRNOP to the errno code, or 0 if successful.
760e93f7393Sniklas Set *STRING to a pointer to malloc'd memory containing the data; the caller
761e93f7393Sniklas is responsible for freeing it. Return the number of bytes successfully
762e93f7393Sniklas read. */
763e93f7393Sniklas
764e93f7393Sniklas int
target_read_string(CORE_ADDR memaddr,char ** string,int len,int * errnop)765b725ae77Skettenis target_read_string (CORE_ADDR memaddr, char **string, int len, int *errnop)
766e93f7393Sniklas {
767e93f7393Sniklas int tlen, origlen, offset, i;
768e93f7393Sniklas char buf[4];
769e93f7393Sniklas int errcode = 0;
770e93f7393Sniklas char *buffer;
771e93f7393Sniklas int buffer_allocated;
772e93f7393Sniklas char *bufptr;
773e93f7393Sniklas unsigned int nbytes_read = 0;
774e93f7393Sniklas
775e93f7393Sniklas /* Small for testing. */
776e93f7393Sniklas buffer_allocated = 4;
777e93f7393Sniklas buffer = xmalloc (buffer_allocated);
778e93f7393Sniklas bufptr = buffer;
779e93f7393Sniklas
780e93f7393Sniklas origlen = len;
781e93f7393Sniklas
782e93f7393Sniklas while (len > 0)
783e93f7393Sniklas {
784e93f7393Sniklas tlen = MIN (len, 4 - (memaddr & 3));
785e93f7393Sniklas offset = memaddr & 3;
786e93f7393Sniklas
787*63addd46Skettenis errcode = target_read_memory (memaddr & ~3, buf, 4);
788e93f7393Sniklas if (errcode != 0)
789b725ae77Skettenis {
790b725ae77Skettenis /* The transfer request might have crossed the boundary to an
791b725ae77Skettenis unallocated region of memory. Retry the transfer, requesting
792b725ae77Skettenis a single byte. */
793b725ae77Skettenis tlen = 1;
794b725ae77Skettenis offset = 0;
795*63addd46Skettenis errcode = target_read_memory (memaddr, buf, 1);
796b725ae77Skettenis if (errcode != 0)
797e93f7393Sniklas goto done;
798b725ae77Skettenis }
799e93f7393Sniklas
800e93f7393Sniklas if (bufptr - buffer + tlen > buffer_allocated)
801e93f7393Sniklas {
802e93f7393Sniklas unsigned int bytes;
803e93f7393Sniklas bytes = bufptr - buffer;
804e93f7393Sniklas buffer_allocated *= 2;
805e93f7393Sniklas buffer = xrealloc (buffer, buffer_allocated);
806e93f7393Sniklas bufptr = buffer + bytes;
807e93f7393Sniklas }
808e93f7393Sniklas
809e93f7393Sniklas for (i = 0; i < tlen; i++)
810e93f7393Sniklas {
811e93f7393Sniklas *bufptr++ = buf[i + offset];
812e93f7393Sniklas if (buf[i + offset] == '\000')
813e93f7393Sniklas {
814e93f7393Sniklas nbytes_read += i + 1;
815e93f7393Sniklas goto done;
816e93f7393Sniklas }
817e93f7393Sniklas }
818e93f7393Sniklas
819e93f7393Sniklas memaddr += tlen;
820e93f7393Sniklas len -= tlen;
821e93f7393Sniklas nbytes_read += tlen;
822e93f7393Sniklas }
823e93f7393Sniklas done:
824e93f7393Sniklas if (errnop != NULL)
825e93f7393Sniklas *errnop = errcode;
826e93f7393Sniklas if (string != NULL)
827e93f7393Sniklas *string = buffer;
828e93f7393Sniklas return nbytes_read;
829e93f7393Sniklas }
830e93f7393Sniklas
831b725ae77Skettenis /* Find a section containing ADDR. */
832b725ae77Skettenis struct section_table *
target_section_by_addr(struct target_ops * target,CORE_ADDR addr)833b725ae77Skettenis target_section_by_addr (struct target_ops *target, CORE_ADDR addr)
834b725ae77Skettenis {
835b725ae77Skettenis struct section_table *secp;
836b725ae77Skettenis for (secp = target->to_sections;
837b725ae77Skettenis secp < target->to_sections_end;
838b725ae77Skettenis secp++)
839b725ae77Skettenis {
840b725ae77Skettenis if (addr >= secp->addr && addr < secp->endaddr)
841b725ae77Skettenis return secp;
842b725ae77Skettenis }
843b725ae77Skettenis return NULL;
844b725ae77Skettenis }
845b725ae77Skettenis
846*63addd46Skettenis /* Return non-zero when the target vector has supplied an xfer_partial
847*63addd46Skettenis method and it, rather than xfer_memory, should be used. */
848*63addd46Skettenis static int
target_xfer_partial_p(void)849*63addd46Skettenis target_xfer_partial_p (void)
850*63addd46Skettenis {
851*63addd46Skettenis return (target_stack != NULL
852*63addd46Skettenis && target_stack->to_xfer_partial != default_xfer_partial);
853*63addd46Skettenis }
854*63addd46Skettenis
855*63addd46Skettenis static LONGEST
target_xfer_partial(struct target_ops * ops,enum target_object object,const char * annex,void * readbuf,const void * writebuf,ULONGEST offset,LONGEST len)856*63addd46Skettenis target_xfer_partial (struct target_ops *ops,
857*63addd46Skettenis enum target_object object, const char *annex,
858*63addd46Skettenis void *readbuf, const void *writebuf,
859*63addd46Skettenis ULONGEST offset, LONGEST len)
860*63addd46Skettenis {
861*63addd46Skettenis LONGEST retval;
862*63addd46Skettenis
863*63addd46Skettenis gdb_assert (ops->to_xfer_partial != NULL);
864*63addd46Skettenis retval = ops->to_xfer_partial (ops, object, annex, readbuf, writebuf,
865*63addd46Skettenis offset, len);
866*63addd46Skettenis if (targetdebug)
867*63addd46Skettenis {
868*63addd46Skettenis const unsigned char *myaddr = NULL;
869*63addd46Skettenis
870*63addd46Skettenis fprintf_unfiltered (gdb_stdlog,
871*63addd46Skettenis "%s:target_xfer_partial (%d, %s, 0x%lx, 0x%lx, 0x%s, %s) = %s",
872*63addd46Skettenis ops->to_shortname,
873*63addd46Skettenis (int) object,
874*63addd46Skettenis (annex ? annex : "(null)"),
875*63addd46Skettenis (long) readbuf, (long) writebuf,
876*63addd46Skettenis paddr_nz (offset), paddr_d (len), paddr_d (retval));
877*63addd46Skettenis
878*63addd46Skettenis if (readbuf)
879*63addd46Skettenis myaddr = readbuf;
880*63addd46Skettenis if (writebuf)
881*63addd46Skettenis myaddr = writebuf;
882*63addd46Skettenis if (retval > 0 && myaddr != NULL)
883*63addd46Skettenis {
884*63addd46Skettenis int i;
885*63addd46Skettenis
886*63addd46Skettenis fputs_unfiltered (", bytes =", gdb_stdlog);
887*63addd46Skettenis for (i = 0; i < retval; i++)
888*63addd46Skettenis {
889*63addd46Skettenis if ((((long) &(myaddr[i])) & 0xf) == 0)
890*63addd46Skettenis {
891*63addd46Skettenis if (targetdebug < 2 && i > 0)
892*63addd46Skettenis {
893*63addd46Skettenis fprintf_unfiltered (gdb_stdlog, " ...");
894*63addd46Skettenis break;
895*63addd46Skettenis }
896*63addd46Skettenis fprintf_unfiltered (gdb_stdlog, "\n");
897*63addd46Skettenis }
898*63addd46Skettenis
899*63addd46Skettenis fprintf_unfiltered (gdb_stdlog, " %02x", myaddr[i] & 0xff);
900*63addd46Skettenis }
901*63addd46Skettenis }
902*63addd46Skettenis
903*63addd46Skettenis fputc_unfiltered ('\n', gdb_stdlog);
904*63addd46Skettenis }
905*63addd46Skettenis return retval;
906*63addd46Skettenis }
907*63addd46Skettenis
908*63addd46Skettenis /* Attempt a transfer all LEN bytes starting at OFFSET between the
909*63addd46Skettenis inferior's KIND:ANNEX space and GDB's READBUF/WRITEBUF buffer. If
910*63addd46Skettenis the transfer succeeds, return zero, otherwize the host ERRNO is
911*63addd46Skettenis returned.
912*63addd46Skettenis
913*63addd46Skettenis The inferior is formed from several layers. In the case of
914*63addd46Skettenis corefiles, inf-corefile is layered above inf-exec and a request for
915*63addd46Skettenis text (corefiles do not include text pages) will be first sent to
916*63addd46Skettenis the core-stratum, fail, and then sent to the object-file where it
917*63addd46Skettenis will succeed.
918*63addd46Skettenis
919*63addd46Skettenis NOTE: cagney/2004-09-30:
920*63addd46Skettenis
921*63addd46Skettenis The old code tried to use four separate mechanisms for mapping an
922*63addd46Skettenis object:offset:len tuple onto an inferior and its address space: the
923*63addd46Skettenis target stack; the inferior's TO_SECTIONS; solib's SO_LIST;
924*63addd46Skettenis overlays.
925*63addd46Skettenis
926*63addd46Skettenis This is stupid.
927*63addd46Skettenis
928*63addd46Skettenis The code below is instead using a single mechanism (currently
929*63addd46Skettenis strata). If that mechanism proves insufficient then re-factor it
930*63addd46Skettenis implementing another singluar mechanism (for instance, a generic
931*63addd46Skettenis object:annex onto inferior:object:annex say). */
932*63addd46Skettenis
933*63addd46Skettenis static LONGEST
xfer_using_stratum(enum target_object object,const char * annex,ULONGEST offset,LONGEST len,void * readbuf,const void * writebuf)934*63addd46Skettenis xfer_using_stratum (enum target_object object, const char *annex,
935*63addd46Skettenis ULONGEST offset, LONGEST len, void *readbuf,
936*63addd46Skettenis const void *writebuf)
937*63addd46Skettenis {
938*63addd46Skettenis LONGEST xfered;
939*63addd46Skettenis struct target_ops *target;
940*63addd46Skettenis
941*63addd46Skettenis /* Always successful. */
942*63addd46Skettenis if (len == 0)
943*63addd46Skettenis return 0;
944*63addd46Skettenis /* Never successful. */
945*63addd46Skettenis if (target_stack == NULL)
946*63addd46Skettenis return EIO;
947*63addd46Skettenis
948*63addd46Skettenis target = target_stack;
949*63addd46Skettenis while (1)
950*63addd46Skettenis {
951*63addd46Skettenis xfered = target_xfer_partial (target, object, annex,
952*63addd46Skettenis readbuf, writebuf, offset, len);
953*63addd46Skettenis if (xfered > 0)
954*63addd46Skettenis {
955*63addd46Skettenis /* The partial xfer succeeded, update the counts, check that
956*63addd46Skettenis the xfer hasn't finished and if it hasn't set things up
957*63addd46Skettenis for the next round. */
958*63addd46Skettenis len -= xfered;
959*63addd46Skettenis if (len <= 0)
960*63addd46Skettenis return 0;
961*63addd46Skettenis offset += xfered;
962*63addd46Skettenis if (readbuf != NULL)
963*63addd46Skettenis readbuf = (bfd_byte *) readbuf + xfered;
964*63addd46Skettenis if (writebuf != NULL)
965*63addd46Skettenis writebuf = (bfd_byte *) writebuf + xfered;
966*63addd46Skettenis target = target_stack;
967*63addd46Skettenis }
968*63addd46Skettenis else if (xfered < 0)
969*63addd46Skettenis {
970*63addd46Skettenis /* Something totally screwed up, abandon the attempt to
971*63addd46Skettenis xfer. */
972*63addd46Skettenis if (errno)
973*63addd46Skettenis return errno;
974*63addd46Skettenis else
975*63addd46Skettenis return EIO;
976*63addd46Skettenis }
977*63addd46Skettenis else
978*63addd46Skettenis {
979*63addd46Skettenis /* This "stratum" didn't work, try the next one down. */
980*63addd46Skettenis target = target->beneath;
981*63addd46Skettenis if (target == NULL)
982*63addd46Skettenis return EIO;
983*63addd46Skettenis }
984*63addd46Skettenis }
985*63addd46Skettenis }
986*63addd46Skettenis
987e93f7393Sniklas /* Read LEN bytes of target memory at address MEMADDR, placing the results in
988e93f7393Sniklas GDB's memory at MYADDR. Returns either 0 for success or an errno value
989e93f7393Sniklas if any error occurs.
990e93f7393Sniklas
991e93f7393Sniklas If an error occurs, no guarantee is made about the contents of the data at
992e93f7393Sniklas MYADDR. In particular, the caller should not depend upon partial reads
993e93f7393Sniklas filling the buffer with good data. There is no way for the caller to know
994e93f7393Sniklas how much good data might have been transfered anyway. Callers that can
995e93f7393Sniklas deal with partial reads should call target_read_memory_partial. */
996e93f7393Sniklas
997e93f7393Sniklas int
target_read_memory(CORE_ADDR memaddr,char * myaddr,int len)998b725ae77Skettenis target_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
999e93f7393Sniklas {
1000*63addd46Skettenis if (target_xfer_partial_p ())
1001*63addd46Skettenis return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL,
1002*63addd46Skettenis memaddr, len, myaddr, NULL);
1003*63addd46Skettenis else
1004e93f7393Sniklas return target_xfer_memory (memaddr, myaddr, len, 0);
1005e93f7393Sniklas }
1006e93f7393Sniklas
1007e93f7393Sniklas int
target_write_memory(CORE_ADDR memaddr,char * myaddr,int len)1008b725ae77Skettenis target_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
1009e93f7393Sniklas {
1010*63addd46Skettenis if (target_xfer_partial_p ())
1011*63addd46Skettenis return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL,
1012*63addd46Skettenis memaddr, len, NULL, myaddr);
1013*63addd46Skettenis else
1014e93f7393Sniklas return target_xfer_memory (memaddr, myaddr, len, 1);
1015e93f7393Sniklas }
1016e93f7393Sniklas
1017*63addd46Skettenis #ifndef target_stopped_data_address_p
1018*63addd46Skettenis int
target_stopped_data_address_p(struct target_ops * target)1019*63addd46Skettenis target_stopped_data_address_p (struct target_ops *target)
1020*63addd46Skettenis {
1021*63addd46Skettenis if (target->to_stopped_data_address
1022*63addd46Skettenis == (int (*) (struct target_ops *, CORE_ADDR *)) return_zero)
1023*63addd46Skettenis return 0;
1024*63addd46Skettenis if (target->to_stopped_data_address == debug_to_stopped_data_address
1025*63addd46Skettenis && (debug_target.to_stopped_data_address
1026*63addd46Skettenis == (int (*) (struct target_ops *, CORE_ADDR *)) return_zero))
1027*63addd46Skettenis return 0;
1028*63addd46Skettenis return 1;
1029*63addd46Skettenis }
1030*63addd46Skettenis #endif
1031*63addd46Skettenis
1032b725ae77Skettenis static int trust_readonly = 0;
1033e93f7393Sniklas
1034b725ae77Skettenis /* Move memory to or from the targets. The top target gets priority;
1035b725ae77Skettenis if it cannot handle it, it is offered to the next one down, etc.
1036b725ae77Skettenis
1037b725ae77Skettenis Result is -1 on error, or the number of bytes transfered. */
1038e93f7393Sniklas
1039e93f7393Sniklas int
do_xfer_memory(CORE_ADDR memaddr,char * myaddr,int len,int write,struct mem_attrib * attrib)1040b725ae77Skettenis do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
1041b725ae77Skettenis struct mem_attrib *attrib)
1042e93f7393Sniklas {
1043e93f7393Sniklas int res;
1044b725ae77Skettenis int done = 0;
1045e93f7393Sniklas struct target_ops *t;
1046b725ae77Skettenis
1047b725ae77Skettenis /* Zero length requests are ok and require no work. */
1048b725ae77Skettenis if (len == 0)
1049b725ae77Skettenis return 0;
1050e93f7393Sniklas
1051*63addd46Skettenis /* deprecated_xfer_memory is not guaranteed to set errno, even when
1052*63addd46Skettenis it returns 0. */
1053e93f7393Sniklas errno = 0;
1054e93f7393Sniklas
1055b725ae77Skettenis if (!write && trust_readonly)
1056b725ae77Skettenis {
1057b725ae77Skettenis struct section_table *secp;
1058b725ae77Skettenis /* User-settable option, "trust-readonly-sections". If true,
1059b725ae77Skettenis then memory from any SEC_READONLY bfd section may be read
1060b725ae77Skettenis directly from the bfd file. */
1061b725ae77Skettenis secp = target_section_by_addr (¤t_target, memaddr);
1062b725ae77Skettenis if (secp != NULL
1063b725ae77Skettenis && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section)
1064b725ae77Skettenis & SEC_READONLY))
1065b725ae77Skettenis return xfer_memory (memaddr, myaddr, len, 0, attrib, ¤t_target);
1066b725ae77Skettenis }
1067b725ae77Skettenis
1068b725ae77Skettenis /* The quick case is that the top target can handle the transfer. */
1069*63addd46Skettenis res = current_target.deprecated_xfer_memory
1070b725ae77Skettenis (memaddr, myaddr, len, write, attrib, ¤t_target);
1071e93f7393Sniklas
1072e93f7393Sniklas /* If res <= 0 then we call it again in the loop. Ah well. */
1073b725ae77Skettenis if (res <= 0)
1074e93f7393Sniklas {
1075b725ae77Skettenis for (t = target_stack; t != NULL; t = t->beneath)
1076e93f7393Sniklas {
1077e93f7393Sniklas if (!t->to_has_memory)
1078e93f7393Sniklas continue;
1079e93f7393Sniklas
1080*63addd46Skettenis res = t->deprecated_xfer_memory (memaddr, myaddr, len, write, attrib, t);
1081e93f7393Sniklas if (res > 0)
1082e93f7393Sniklas break; /* Handled all or part of xfer */
1083e93f7393Sniklas if (t->to_has_all_memory)
1084e93f7393Sniklas break;
1085e93f7393Sniklas }
1086e93f7393Sniklas
1087e93f7393Sniklas if (res <= 0)
1088b725ae77Skettenis return -1;
1089b725ae77Skettenis }
1090b725ae77Skettenis
1091b725ae77Skettenis return res;
1092b725ae77Skettenis }
1093b725ae77Skettenis
1094b725ae77Skettenis
1095b725ae77Skettenis /* Perform a memory transfer. Iterate until the entire region has
1096b725ae77Skettenis been transfered.
1097b725ae77Skettenis
1098b725ae77Skettenis Result is 0 or errno value. */
1099b725ae77Skettenis
1100b725ae77Skettenis static int
target_xfer_memory(CORE_ADDR memaddr,char * myaddr,int len,int write)1101b725ae77Skettenis target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
1102e93f7393Sniklas {
1103b725ae77Skettenis int res;
1104b725ae77Skettenis int reg_len;
1105b725ae77Skettenis struct mem_region *region;
1106b725ae77Skettenis
1107b725ae77Skettenis /* Zero length requests are ok and require no work. */
1108b725ae77Skettenis if (len == 0)
1109b725ae77Skettenis {
1110b725ae77Skettenis return 0;
1111b725ae77Skettenis }
1112b725ae77Skettenis
1113b725ae77Skettenis while (len > 0)
1114b725ae77Skettenis {
1115b725ae77Skettenis region = lookup_mem_region(memaddr);
1116b725ae77Skettenis if (memaddr + len < region->hi)
1117b725ae77Skettenis reg_len = len;
1118b725ae77Skettenis else
1119b725ae77Skettenis reg_len = region->hi - memaddr;
1120b725ae77Skettenis
1121b725ae77Skettenis switch (region->attrib.mode)
1122b725ae77Skettenis {
1123b725ae77Skettenis case MEM_RO:
1124b725ae77Skettenis if (write)
1125b725ae77Skettenis return EIO;
1126b725ae77Skettenis break;
1127b725ae77Skettenis
1128b725ae77Skettenis case MEM_WO:
1129b725ae77Skettenis if (!write)
1130b725ae77Skettenis return EIO;
1131b725ae77Skettenis break;
1132b725ae77Skettenis }
1133b725ae77Skettenis
1134b725ae77Skettenis while (reg_len > 0)
1135b725ae77Skettenis {
1136b725ae77Skettenis if (region->attrib.cache)
1137b725ae77Skettenis res = dcache_xfer_memory (target_dcache, memaddr, myaddr,
1138b725ae77Skettenis reg_len, write);
1139b725ae77Skettenis else
1140b725ae77Skettenis res = do_xfer_memory (memaddr, myaddr, reg_len, write,
1141b725ae77Skettenis ®ion->attrib);
1142b725ae77Skettenis
1143b725ae77Skettenis if (res <= 0)
1144b725ae77Skettenis {
1145b725ae77Skettenis /* If this address is for nonexistent memory, read zeros
1146b725ae77Skettenis if reading, or do nothing if writing. Return
1147b725ae77Skettenis error. */
1148e93f7393Sniklas if (!write)
1149e93f7393Sniklas memset (myaddr, 0, len);
1150e93f7393Sniklas if (errno == 0)
1151e93f7393Sniklas return EIO;
1152e93f7393Sniklas else
1153e93f7393Sniklas return errno;
1154e93f7393Sniklas }
1155b725ae77Skettenis
1156e93f7393Sniklas memaddr += res;
1157e93f7393Sniklas myaddr += res;
1158e93f7393Sniklas len -= res;
1159b725ae77Skettenis reg_len -= res;
1160e93f7393Sniklas }
1161b725ae77Skettenis }
1162b725ae77Skettenis
1163e93f7393Sniklas return 0; /* We managed to cover it all somehow. */
1164e93f7393Sniklas }
1165e93f7393Sniklas
1166e93f7393Sniklas
1167b725ae77Skettenis /* Perform a partial memory transfer.
1168b725ae77Skettenis
1169b725ae77Skettenis Result is -1 on error, or the number of bytes transfered. */
1170b725ae77Skettenis
1171b725ae77Skettenis static int
target_xfer_memory_partial(CORE_ADDR memaddr,char * myaddr,int len,int write_p,int * err)1172b725ae77Skettenis target_xfer_memory_partial (CORE_ADDR memaddr, char *myaddr, int len,
1173b725ae77Skettenis int write_p, int *err)
1174b725ae77Skettenis {
1175b725ae77Skettenis int res;
1176b725ae77Skettenis int reg_len;
1177b725ae77Skettenis struct mem_region *region;
1178b725ae77Skettenis
1179b725ae77Skettenis /* Zero length requests are ok and require no work. */
1180b725ae77Skettenis if (len == 0)
1181b725ae77Skettenis {
1182b725ae77Skettenis *err = 0;
1183b725ae77Skettenis return 0;
1184b725ae77Skettenis }
1185b725ae77Skettenis
1186b725ae77Skettenis region = lookup_mem_region(memaddr);
1187b725ae77Skettenis if (memaddr + len < region->hi)
1188b725ae77Skettenis reg_len = len;
1189b725ae77Skettenis else
1190b725ae77Skettenis reg_len = region->hi - memaddr;
1191b725ae77Skettenis
1192b725ae77Skettenis switch (region->attrib.mode)
1193b725ae77Skettenis {
1194b725ae77Skettenis case MEM_RO:
1195b725ae77Skettenis if (write_p)
1196b725ae77Skettenis {
1197b725ae77Skettenis *err = EIO;
1198b725ae77Skettenis return -1;
1199b725ae77Skettenis }
1200b725ae77Skettenis break;
1201b725ae77Skettenis
1202b725ae77Skettenis case MEM_WO:
1203b725ae77Skettenis if (write_p)
1204b725ae77Skettenis {
1205b725ae77Skettenis *err = EIO;
1206b725ae77Skettenis return -1;
1207b725ae77Skettenis }
1208b725ae77Skettenis break;
1209b725ae77Skettenis }
1210b725ae77Skettenis
1211b725ae77Skettenis if (region->attrib.cache)
1212b725ae77Skettenis res = dcache_xfer_memory (target_dcache, memaddr, myaddr,
1213b725ae77Skettenis reg_len, write_p);
1214b725ae77Skettenis else
1215b725ae77Skettenis res = do_xfer_memory (memaddr, myaddr, reg_len, write_p,
1216b725ae77Skettenis ®ion->attrib);
1217b725ae77Skettenis
1218b725ae77Skettenis if (res <= 0)
1219b725ae77Skettenis {
1220b725ae77Skettenis if (errno != 0)
1221b725ae77Skettenis *err = errno;
1222b725ae77Skettenis else
1223b725ae77Skettenis *err = EIO;
1224b725ae77Skettenis
1225b725ae77Skettenis return -1;
1226b725ae77Skettenis }
1227b725ae77Skettenis
1228b725ae77Skettenis *err = 0;
1229b725ae77Skettenis return res;
1230b725ae77Skettenis }
1231b725ae77Skettenis
1232b725ae77Skettenis int
target_read_memory_partial(CORE_ADDR memaddr,char * buf,int len,int * err)1233b725ae77Skettenis target_read_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
1234b725ae77Skettenis {
1235*63addd46Skettenis if (target_xfer_partial_p ())
1236*63addd46Skettenis return target_xfer_partial (target_stack, TARGET_OBJECT_MEMORY, NULL,
1237*63addd46Skettenis buf, NULL, memaddr, len);
1238*63addd46Skettenis else
1239b725ae77Skettenis return target_xfer_memory_partial (memaddr, buf, len, 0, err);
1240b725ae77Skettenis }
1241b725ae77Skettenis
1242b725ae77Skettenis int
target_write_memory_partial(CORE_ADDR memaddr,char * buf,int len,int * err)1243b725ae77Skettenis target_write_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
1244b725ae77Skettenis {
1245*63addd46Skettenis if (target_xfer_partial_p ())
1246*63addd46Skettenis return target_xfer_partial (target_stack, TARGET_OBJECT_MEMORY, NULL,
1247*63addd46Skettenis NULL, buf, memaddr, len);
1248*63addd46Skettenis else
1249b725ae77Skettenis return target_xfer_memory_partial (memaddr, buf, len, 1, err);
1250b725ae77Skettenis }
1251b725ae77Skettenis
1252b725ae77Skettenis /* More generic transfers. */
1253b725ae77Skettenis
1254b725ae77Skettenis static LONGEST
default_xfer_partial(struct target_ops * ops,enum target_object object,const char * annex,void * readbuf,const void * writebuf,ULONGEST offset,LONGEST len)1255b725ae77Skettenis default_xfer_partial (struct target_ops *ops, enum target_object object,
1256b725ae77Skettenis const char *annex, void *readbuf,
1257b725ae77Skettenis const void *writebuf, ULONGEST offset, LONGEST len)
1258b725ae77Skettenis {
1259b725ae77Skettenis if (object == TARGET_OBJECT_MEMORY
1260*63addd46Skettenis && ops->deprecated_xfer_memory != NULL)
1261*63addd46Skettenis /* If available, fall back to the target's
1262*63addd46Skettenis "deprecated_xfer_memory" method. */
1263b725ae77Skettenis {
1264b725ae77Skettenis int xfered = -1;
1265b725ae77Skettenis errno = 0;
1266b725ae77Skettenis if (writebuf != NULL)
1267b725ae77Skettenis {
1268b725ae77Skettenis void *buffer = xmalloc (len);
1269b725ae77Skettenis struct cleanup *cleanup = make_cleanup (xfree, buffer);
1270b725ae77Skettenis memcpy (buffer, writebuf, len);
1271*63addd46Skettenis xfered = ops->deprecated_xfer_memory (offset, buffer, len,
1272*63addd46Skettenis 1/*write*/, NULL, ops);
1273b725ae77Skettenis do_cleanups (cleanup);
1274b725ae77Skettenis }
1275b725ae77Skettenis if (readbuf != NULL)
1276*63addd46Skettenis xfered = ops->deprecated_xfer_memory (offset, readbuf, len, 0/*read*/,
1277*63addd46Skettenis NULL, ops);
1278b725ae77Skettenis if (xfered > 0)
1279b725ae77Skettenis return xfered;
1280b725ae77Skettenis else if (xfered == 0 && errno == 0)
1281*63addd46Skettenis /* "deprecated_xfer_memory" uses 0, cross checked against
1282*63addd46Skettenis ERRNO as one indication of an error. */
1283b725ae77Skettenis return 0;
1284b725ae77Skettenis else
1285b725ae77Skettenis return -1;
1286b725ae77Skettenis }
1287b725ae77Skettenis else if (ops->beneath != NULL)
1288*63addd46Skettenis return target_xfer_partial (ops->beneath, object, annex,
1289b725ae77Skettenis readbuf, writebuf, offset, len);
1290b725ae77Skettenis else
1291b725ae77Skettenis return -1;
1292b725ae77Skettenis }
1293b725ae77Skettenis
1294b725ae77Skettenis /* Target vector read/write partial wrapper functions.
1295b725ae77Skettenis
1296b725ae77Skettenis NOTE: cagney/2003-10-21: I wonder if having "to_xfer_partial
1297b725ae77Skettenis (inbuf, outbuf)", instead of separate read/write methods, make life
1298b725ae77Skettenis easier. */
1299b725ae77Skettenis
1300b725ae77Skettenis LONGEST
target_read_partial(struct target_ops * ops,enum target_object object,const char * annex,void * buf,ULONGEST offset,LONGEST len)1301b725ae77Skettenis target_read_partial (struct target_ops *ops,
1302b725ae77Skettenis enum target_object object,
1303b725ae77Skettenis const char *annex, void *buf,
1304b725ae77Skettenis ULONGEST offset, LONGEST len)
1305b725ae77Skettenis {
1306*63addd46Skettenis return target_xfer_partial (ops, object, annex, buf, NULL, offset, len);
1307b725ae77Skettenis }
1308b725ae77Skettenis
1309b725ae77Skettenis LONGEST
target_write_partial(struct target_ops * ops,enum target_object object,const char * annex,const void * buf,ULONGEST offset,LONGEST len)1310b725ae77Skettenis target_write_partial (struct target_ops *ops,
1311b725ae77Skettenis enum target_object object,
1312b725ae77Skettenis const char *annex, const void *buf,
1313b725ae77Skettenis ULONGEST offset, LONGEST len)
1314b725ae77Skettenis {
1315*63addd46Skettenis return target_xfer_partial (ops, object, annex, NULL, buf, offset, len);
1316b725ae77Skettenis }
1317b725ae77Skettenis
1318b725ae77Skettenis /* Wrappers to perform the full transfer. */
1319b725ae77Skettenis LONGEST
target_read(struct target_ops * ops,enum target_object object,const char * annex,void * buf,ULONGEST offset,LONGEST len)1320b725ae77Skettenis target_read (struct target_ops *ops,
1321b725ae77Skettenis enum target_object object,
1322b725ae77Skettenis const char *annex, void *buf,
1323b725ae77Skettenis ULONGEST offset, LONGEST len)
1324b725ae77Skettenis {
1325b725ae77Skettenis LONGEST xfered = 0;
1326b725ae77Skettenis while (xfered < len)
1327b725ae77Skettenis {
1328b725ae77Skettenis LONGEST xfer = target_read_partial (ops, object, annex,
1329b725ae77Skettenis (bfd_byte *) buf + xfered,
1330b725ae77Skettenis offset + xfered, len - xfered);
1331b725ae77Skettenis /* Call an observer, notifying them of the xfer progress? */
1332b725ae77Skettenis if (xfer <= 0)
1333b725ae77Skettenis /* Call memory_error? */
1334b725ae77Skettenis return -1;
1335b725ae77Skettenis xfered += xfer;
1336b725ae77Skettenis QUIT;
1337b725ae77Skettenis }
1338b725ae77Skettenis return len;
1339b725ae77Skettenis }
1340b725ae77Skettenis
1341b725ae77Skettenis LONGEST
target_write(struct target_ops * ops,enum target_object object,const char * annex,const void * buf,ULONGEST offset,LONGEST len)1342b725ae77Skettenis target_write (struct target_ops *ops,
1343b725ae77Skettenis enum target_object object,
1344b725ae77Skettenis const char *annex, const void *buf,
1345b725ae77Skettenis ULONGEST offset, LONGEST len)
1346b725ae77Skettenis {
1347b725ae77Skettenis LONGEST xfered = 0;
1348b725ae77Skettenis while (xfered < len)
1349b725ae77Skettenis {
1350b725ae77Skettenis LONGEST xfer = target_write_partial (ops, object, annex,
1351b725ae77Skettenis (bfd_byte *) buf + xfered,
1352b725ae77Skettenis offset + xfered, len - xfered);
1353b725ae77Skettenis /* Call an observer, notifying them of the xfer progress? */
1354b725ae77Skettenis if (xfer <= 0)
1355b725ae77Skettenis /* Call memory_error? */
1356b725ae77Skettenis return -1;
1357b725ae77Skettenis xfered += xfer;
1358b725ae77Skettenis QUIT;
1359b725ae77Skettenis }
1360b725ae77Skettenis return len;
1361b725ae77Skettenis }
1362b725ae77Skettenis
1363b725ae77Skettenis /* Memory transfer methods. */
1364b725ae77Skettenis
1365b725ae77Skettenis void
get_target_memory(struct target_ops * ops,CORE_ADDR addr,void * buf,LONGEST len)1366b725ae77Skettenis get_target_memory (struct target_ops *ops, CORE_ADDR addr, void *buf,
1367b725ae77Skettenis LONGEST len)
1368b725ae77Skettenis {
1369b725ae77Skettenis if (target_read (ops, TARGET_OBJECT_MEMORY, NULL, buf, addr, len)
1370b725ae77Skettenis != len)
1371b725ae77Skettenis memory_error (EIO, addr);
1372b725ae77Skettenis }
1373b725ae77Skettenis
1374b725ae77Skettenis ULONGEST
get_target_memory_unsigned(struct target_ops * ops,CORE_ADDR addr,int len)1375b725ae77Skettenis get_target_memory_unsigned (struct target_ops *ops,
1376b725ae77Skettenis CORE_ADDR addr, int len)
1377b725ae77Skettenis {
1378b725ae77Skettenis char buf[sizeof (ULONGEST)];
1379b725ae77Skettenis
1380b725ae77Skettenis gdb_assert (len <= sizeof (buf));
1381b725ae77Skettenis get_target_memory (ops, addr, buf, len);
1382b725ae77Skettenis return extract_unsigned_integer (buf, len);
1383b725ae77Skettenis }
1384b725ae77Skettenis
1385e93f7393Sniklas static void
target_info(char * args,int from_tty)1386b725ae77Skettenis target_info (char *args, int from_tty)
1387e93f7393Sniklas {
1388e93f7393Sniklas struct target_ops *t;
1389e93f7393Sniklas int has_all_mem = 0;
1390e93f7393Sniklas
1391e93f7393Sniklas if (symfile_objfile != NULL)
1392e93f7393Sniklas printf_unfiltered ("Symbols from \"%s\".\n", symfile_objfile->name);
1393e93f7393Sniklas
1394b725ae77Skettenis for (t = target_stack; t != NULL; t = t->beneath)
1395e93f7393Sniklas {
1396e93f7393Sniklas if (!t->to_has_memory)
1397e93f7393Sniklas continue;
1398e93f7393Sniklas
1399e93f7393Sniklas if ((int) (t->to_stratum) <= (int) dummy_stratum)
1400e93f7393Sniklas continue;
1401e93f7393Sniklas if (has_all_mem)
1402e93f7393Sniklas printf_unfiltered ("\tWhile running this, GDB does not access memory from...\n");
1403e93f7393Sniklas printf_unfiltered ("%s:\n", t->to_longname);
1404e93f7393Sniklas (t->to_files_info) (t);
1405e93f7393Sniklas has_all_mem = t->to_has_all_memory;
1406e93f7393Sniklas }
1407e93f7393Sniklas }
1408e93f7393Sniklas
1409e93f7393Sniklas /* This is to be called by the open routine before it does
1410e93f7393Sniklas anything. */
1411e93f7393Sniklas
1412e93f7393Sniklas void
target_preopen(int from_tty)1413b725ae77Skettenis target_preopen (int from_tty)
1414e93f7393Sniklas {
1415e93f7393Sniklas dont_repeat ();
1416e93f7393Sniklas
1417e93f7393Sniklas if (target_has_execution)
1418e93f7393Sniklas {
1419b725ae77Skettenis if (!from_tty
1420b725ae77Skettenis || query ("A program is being debugged already. Kill it? "))
1421e93f7393Sniklas target_kill ();
1422e93f7393Sniklas else
1423e93f7393Sniklas error ("Program not killed.");
1424e93f7393Sniklas }
1425e93f7393Sniklas
1426e93f7393Sniklas /* Calling target_kill may remove the target from the stack. But if
1427e93f7393Sniklas it doesn't (which seems like a win for UDI), remove it now. */
1428e93f7393Sniklas
1429e93f7393Sniklas if (target_has_execution)
1430e93f7393Sniklas pop_target ();
1431e93f7393Sniklas }
1432e93f7393Sniklas
1433e93f7393Sniklas /* Detach a target after doing deferred register stores. */
1434e93f7393Sniklas
1435e93f7393Sniklas void
target_detach(char * args,int from_tty)1436b725ae77Skettenis target_detach (char *args, int from_tty)
1437e93f7393Sniklas {
1438e93f7393Sniklas (current_target.to_detach) (args, from_tty);
1439e93f7393Sniklas }
1440e93f7393Sniklas
1441e93f7393Sniklas void
target_disconnect(char * args,int from_tty)1442b725ae77Skettenis target_disconnect (char *args, int from_tty)
1443e93f7393Sniklas {
1444b725ae77Skettenis (current_target.to_disconnect) (args, from_tty);
1445b725ae77Skettenis }
1446b725ae77Skettenis
1447b725ae77Skettenis void
target_link(char * modname,CORE_ADDR * t_reloc)1448b725ae77Skettenis target_link (char *modname, CORE_ADDR *t_reloc)
1449b725ae77Skettenis {
1450b725ae77Skettenis if (DEPRECATED_STREQ (current_target.to_shortname, "rombug"))
1451e93f7393Sniklas {
1452e93f7393Sniklas (current_target.to_lookup_symbol) (modname, t_reloc);
1453e93f7393Sniklas if (*t_reloc == 0)
1454e93f7393Sniklas error ("Unable to link to %s and get relocation in rombug", modname);
1455e93f7393Sniklas }
1456e93f7393Sniklas else
1457e93f7393Sniklas *t_reloc = (CORE_ADDR) -1;
1458e93f7393Sniklas }
1459e93f7393Sniklas
1460b725ae77Skettenis int
target_async_mask(int mask)1461b725ae77Skettenis target_async_mask (int mask)
1462b725ae77Skettenis {
1463b725ae77Skettenis int saved_async_masked_status = target_async_mask_value;
1464b725ae77Skettenis target_async_mask_value = mask;
1465b725ae77Skettenis return saved_async_masked_status;
1466b725ae77Skettenis }
1467b725ae77Skettenis
1468e93f7393Sniklas /* Look through the list of possible targets for a target that can
1469e93f7393Sniklas execute a run or attach command without any other data. This is
1470e93f7393Sniklas used to locate the default process stratum.
1471e93f7393Sniklas
1472e93f7393Sniklas Result is always valid (error() is called for errors). */
1473e93f7393Sniklas
1474e93f7393Sniklas static struct target_ops *
find_default_run_target(char * do_mesg)1475b725ae77Skettenis find_default_run_target (char *do_mesg)
1476e93f7393Sniklas {
1477e93f7393Sniklas struct target_ops **t;
1478e93f7393Sniklas struct target_ops *runable = NULL;
1479e93f7393Sniklas int count;
1480e93f7393Sniklas
1481e93f7393Sniklas count = 0;
1482e93f7393Sniklas
1483e93f7393Sniklas for (t = target_structs; t < target_structs + target_struct_size;
1484e93f7393Sniklas ++t)
1485e93f7393Sniklas {
1486e93f7393Sniklas if ((*t)->to_can_run && target_can_run (*t))
1487e93f7393Sniklas {
1488e93f7393Sniklas runable = *t;
1489e93f7393Sniklas ++count;
1490e93f7393Sniklas }
1491e93f7393Sniklas }
1492e93f7393Sniklas
1493e93f7393Sniklas if (count != 1)
1494e93f7393Sniklas error ("Don't know how to %s. Try \"help target\".", do_mesg);
1495e93f7393Sniklas
1496e93f7393Sniklas return runable;
1497e93f7393Sniklas }
1498e93f7393Sniklas
1499e93f7393Sniklas void
find_default_attach(char * args,int from_tty)1500b725ae77Skettenis find_default_attach (char *args, int from_tty)
1501e93f7393Sniklas {
1502e93f7393Sniklas struct target_ops *t;
1503e93f7393Sniklas
1504e93f7393Sniklas t = find_default_run_target ("attach");
1505e93f7393Sniklas (t->to_attach) (args, from_tty);
1506e93f7393Sniklas return;
1507e93f7393Sniklas }
1508e93f7393Sniklas
1509e93f7393Sniklas void
find_default_create_inferior(char * exec_file,char * allargs,char ** env,int from_tty)1510*63addd46Skettenis find_default_create_inferior (char *exec_file, char *allargs, char **env,
1511*63addd46Skettenis int from_tty)
1512e93f7393Sniklas {
1513e93f7393Sniklas struct target_ops *t;
1514e93f7393Sniklas
1515e93f7393Sniklas t = find_default_run_target ("run");
1516*63addd46Skettenis (t->to_create_inferior) (exec_file, allargs, env, from_tty);
1517e93f7393Sniklas return;
1518e93f7393Sniklas }
1519e93f7393Sniklas
1520e93f7393Sniklas static int
default_region_size_ok_for_hw_watchpoint(int byte_count)1521b725ae77Skettenis default_region_size_ok_for_hw_watchpoint (int byte_count)
1522b725ae77Skettenis {
1523b725ae77Skettenis return (byte_count <= TYPE_LENGTH (builtin_type_void_data_ptr));
1524b725ae77Skettenis }
1525b725ae77Skettenis
1526b725ae77Skettenis static int
return_zero(void)1527b725ae77Skettenis return_zero (void)
1528e93f7393Sniklas {
1529e93f7393Sniklas return 0;
1530e93f7393Sniklas }
1531e93f7393Sniklas
1532b725ae77Skettenis static int
return_one(void)1533b725ae77Skettenis return_one (void)
1534b725ae77Skettenis {
1535b725ae77Skettenis return 1;
1536b725ae77Skettenis }
1537b725ae77Skettenis
1538b725ae77Skettenis static int
return_minus_one(void)1539b725ae77Skettenis return_minus_one (void)
1540b725ae77Skettenis {
1541b725ae77Skettenis return -1;
1542b725ae77Skettenis }
1543b725ae77Skettenis
1544b725ae77Skettenis /*
1545b725ae77Skettenis * Resize the to_sections pointer. Also make sure that anyone that
1546b725ae77Skettenis * was holding on to an old value of it gets updated.
1547b725ae77Skettenis * Returns the old size.
1548b725ae77Skettenis */
1549b725ae77Skettenis
1550b725ae77Skettenis int
target_resize_to_sections(struct target_ops * target,int num_added)1551b725ae77Skettenis target_resize_to_sections (struct target_ops *target, int num_added)
1552b725ae77Skettenis {
1553b725ae77Skettenis struct target_ops **t;
1554b725ae77Skettenis struct section_table *old_value;
1555b725ae77Skettenis int old_count;
1556b725ae77Skettenis
1557b725ae77Skettenis old_value = target->to_sections;
1558b725ae77Skettenis
1559b725ae77Skettenis if (target->to_sections)
1560b725ae77Skettenis {
1561b725ae77Skettenis old_count = target->to_sections_end - target->to_sections;
1562b725ae77Skettenis target->to_sections = (struct section_table *)
1563b725ae77Skettenis xrealloc ((char *) target->to_sections,
1564b725ae77Skettenis (sizeof (struct section_table)) * (num_added + old_count));
1565b725ae77Skettenis }
1566b725ae77Skettenis else
1567b725ae77Skettenis {
1568b725ae77Skettenis old_count = 0;
1569b725ae77Skettenis target->to_sections = (struct section_table *)
1570b725ae77Skettenis xmalloc ((sizeof (struct section_table)) * num_added);
1571b725ae77Skettenis }
1572b725ae77Skettenis target->to_sections_end = target->to_sections + (num_added + old_count);
1573b725ae77Skettenis
1574b725ae77Skettenis /* Check to see if anyone else was pointing to this structure.
1575b725ae77Skettenis If old_value was null, then no one was. */
1576b725ae77Skettenis
1577b725ae77Skettenis if (old_value)
1578b725ae77Skettenis {
1579b725ae77Skettenis for (t = target_structs; t < target_structs + target_struct_size;
1580b725ae77Skettenis ++t)
1581b725ae77Skettenis {
1582b725ae77Skettenis if ((*t)->to_sections == old_value)
1583b725ae77Skettenis {
1584b725ae77Skettenis (*t)->to_sections = target->to_sections;
1585b725ae77Skettenis (*t)->to_sections_end = target->to_sections_end;
1586b725ae77Skettenis }
1587b725ae77Skettenis }
1588*63addd46Skettenis /* There is a flattened view of the target stack in current_target,
1589*63addd46Skettenis so its to_sections pointer might also need updating. */
1590*63addd46Skettenis if (current_target.to_sections == old_value)
1591*63addd46Skettenis {
1592*63addd46Skettenis current_target.to_sections = target->to_sections;
1593*63addd46Skettenis current_target.to_sections_end = target->to_sections_end;
1594*63addd46Skettenis }
1595b725ae77Skettenis }
1596b725ae77Skettenis
1597b725ae77Skettenis return old_count;
1598b725ae77Skettenis
1599b725ae77Skettenis }
1600b725ae77Skettenis
1601b725ae77Skettenis /* Remove all target sections taken from ABFD.
1602b725ae77Skettenis
1603b725ae77Skettenis Scan the current target stack for targets whose section tables
1604b725ae77Skettenis refer to sections from BFD, and remove those sections. We use this
1605b725ae77Skettenis when we notice that the inferior has unloaded a shared object, for
1606b725ae77Skettenis example. */
1607b725ae77Skettenis void
remove_target_sections(bfd * abfd)1608b725ae77Skettenis remove_target_sections (bfd *abfd)
1609b725ae77Skettenis {
1610b725ae77Skettenis struct target_ops **t;
1611b725ae77Skettenis
1612b725ae77Skettenis for (t = target_structs; t < target_structs + target_struct_size; t++)
1613b725ae77Skettenis {
1614b725ae77Skettenis struct section_table *src, *dest;
1615b725ae77Skettenis
1616b725ae77Skettenis dest = (*t)->to_sections;
1617b725ae77Skettenis for (src = (*t)->to_sections; src < (*t)->to_sections_end; src++)
1618b725ae77Skettenis if (src->bfd != abfd)
1619b725ae77Skettenis {
1620b725ae77Skettenis /* Keep this section. */
1621b725ae77Skettenis if (dest < src) *dest = *src;
1622b725ae77Skettenis dest++;
1623b725ae77Skettenis }
1624b725ae77Skettenis
1625b725ae77Skettenis /* If we've dropped any sections, resize the section table. */
1626b725ae77Skettenis if (dest < src)
1627b725ae77Skettenis target_resize_to_sections (*t, dest - src);
1628b725ae77Skettenis }
1629b725ae77Skettenis }
1630b725ae77Skettenis
1631b725ae77Skettenis
1632b725ae77Skettenis
1633b725ae77Skettenis
1634b725ae77Skettenis /* Find a single runnable target in the stack and return it. If for
1635b725ae77Skettenis some reason there is more than one, return NULL. */
1636b725ae77Skettenis
1637e93f7393Sniklas struct target_ops *
find_run_target(void)1638b725ae77Skettenis find_run_target (void)
1639b725ae77Skettenis {
1640b725ae77Skettenis struct target_ops **t;
1641b725ae77Skettenis struct target_ops *runable = NULL;
1642b725ae77Skettenis int count;
1643b725ae77Skettenis
1644b725ae77Skettenis count = 0;
1645b725ae77Skettenis
1646b725ae77Skettenis for (t = target_structs; t < target_structs + target_struct_size; ++t)
1647b725ae77Skettenis {
1648b725ae77Skettenis if ((*t)->to_can_run && target_can_run (*t))
1649b725ae77Skettenis {
1650b725ae77Skettenis runable = *t;
1651b725ae77Skettenis ++count;
1652b725ae77Skettenis }
1653b725ae77Skettenis }
1654b725ae77Skettenis
1655b725ae77Skettenis return (count == 1 ? runable : NULL);
1656b725ae77Skettenis }
1657b725ae77Skettenis
1658b725ae77Skettenis /* Find a single core_stratum target in the list of targets and return it.
1659b725ae77Skettenis If for some reason there is more than one, return NULL. */
1660b725ae77Skettenis
1661b725ae77Skettenis struct target_ops *
find_core_target(void)1662b725ae77Skettenis find_core_target (void)
1663e93f7393Sniklas {
1664e93f7393Sniklas struct target_ops **t;
1665e93f7393Sniklas struct target_ops *runable = NULL;
1666e93f7393Sniklas int count;
1667e93f7393Sniklas
1668e93f7393Sniklas count = 0;
1669e93f7393Sniklas
1670e93f7393Sniklas for (t = target_structs; t < target_structs + target_struct_size;
1671e93f7393Sniklas ++t)
1672e93f7393Sniklas {
1673e93f7393Sniklas if ((*t)->to_stratum == core_stratum)
1674e93f7393Sniklas {
1675e93f7393Sniklas runable = *t;
1676e93f7393Sniklas ++count;
1677e93f7393Sniklas }
1678e93f7393Sniklas }
1679e93f7393Sniklas
1680e93f7393Sniklas return (count == 1 ? runable : NULL);
1681e93f7393Sniklas }
1682b725ae77Skettenis
1683b725ae77Skettenis /*
1684b725ae77Skettenis * Find the next target down the stack from the specified target.
1685b725ae77Skettenis */
1686b725ae77Skettenis
1687b725ae77Skettenis struct target_ops *
find_target_beneath(struct target_ops * t)1688b725ae77Skettenis find_target_beneath (struct target_ops *t)
1689b725ae77Skettenis {
1690b725ae77Skettenis return t->beneath;
1691b725ae77Skettenis }
1692b725ae77Skettenis
1693e93f7393Sniklas
1694e93f7393Sniklas /* The inferior process has died. Long live the inferior! */
1695e93f7393Sniklas
1696e93f7393Sniklas void
generic_mourn_inferior(void)1697b725ae77Skettenis generic_mourn_inferior (void)
1698e93f7393Sniklas {
1699e93f7393Sniklas extern int show_breakpoint_hit_counts;
1700e93f7393Sniklas
1701b725ae77Skettenis inferior_ptid = null_ptid;
1702e93f7393Sniklas attach_flag = 0;
1703b725ae77Skettenis breakpoint_init_inferior (inf_exited);
1704e93f7393Sniklas registers_changed ();
1705e93f7393Sniklas
1706e93f7393Sniklas reopen_exec_file ();
1707e93f7393Sniklas reinit_frame_cache ();
1708e93f7393Sniklas
1709e93f7393Sniklas /* It is confusing to the user for ignore counts to stick around
1710e93f7393Sniklas from previous runs of the inferior. So clear them. */
1711e93f7393Sniklas /* However, it is more confusing for the ignore counts to disappear when
1712e93f7393Sniklas using hit counts. So don't clear them if we're counting hits. */
1713e93f7393Sniklas if (!show_breakpoint_hit_counts)
1714e93f7393Sniklas breakpoint_clear_ignore_counts ();
1715b725ae77Skettenis
1716*63addd46Skettenis if (deprecated_detach_hook)
1717*63addd46Skettenis deprecated_detach_hook ();
1718e93f7393Sniklas }
1719e93f7393Sniklas
1720e93f7393Sniklas /* Helper function for child_wait and the Lynx derivatives of child_wait.
1721e93f7393Sniklas HOSTSTATUS is the waitstatus from wait() or the equivalent; store our
1722e93f7393Sniklas translation of that in OURSTATUS. */
1723e93f7393Sniklas void
store_waitstatus(struct target_waitstatus * ourstatus,int hoststatus)1724b725ae77Skettenis store_waitstatus (struct target_waitstatus *ourstatus, int hoststatus)
1725e93f7393Sniklas {
1726e93f7393Sniklas #ifdef CHILD_SPECIAL_WAITSTATUS
1727e93f7393Sniklas /* CHILD_SPECIAL_WAITSTATUS should return nonzero and set *OURSTATUS
1728e93f7393Sniklas if it wants to deal with hoststatus. */
1729e93f7393Sniklas if (CHILD_SPECIAL_WAITSTATUS (ourstatus, hoststatus))
1730e93f7393Sniklas return;
1731e93f7393Sniklas #endif
1732e93f7393Sniklas
1733e93f7393Sniklas if (WIFEXITED (hoststatus))
1734e93f7393Sniklas {
1735e93f7393Sniklas ourstatus->kind = TARGET_WAITKIND_EXITED;
1736e93f7393Sniklas ourstatus->value.integer = WEXITSTATUS (hoststatus);
1737e93f7393Sniklas }
1738e93f7393Sniklas else if (!WIFSTOPPED (hoststatus))
1739e93f7393Sniklas {
1740e93f7393Sniklas ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
1741e93f7393Sniklas ourstatus->value.sig = target_signal_from_host (WTERMSIG (hoststatus));
1742e93f7393Sniklas }
1743e93f7393Sniklas else
1744e93f7393Sniklas {
1745e93f7393Sniklas ourstatus->kind = TARGET_WAITKIND_STOPPED;
1746e93f7393Sniklas ourstatus->value.sig = target_signal_from_host (WSTOPSIG (hoststatus));
1747e93f7393Sniklas }
1748e93f7393Sniklas }
1749e93f7393Sniklas
1750e93f7393Sniklas /* Returns zero to leave the inferior alone, one to interrupt it. */
1751b725ae77Skettenis int (*target_activity_function) (void);
1752e93f7393Sniklas int target_activity_fd;
1753e93f7393Sniklas
1754e93f7393Sniklas /* Convert a normal process ID to a string. Returns the string in a static
1755e93f7393Sniklas buffer. */
1756e93f7393Sniklas
1757e93f7393Sniklas char *
normal_pid_to_str(ptid_t ptid)1758b725ae77Skettenis normal_pid_to_str (ptid_t ptid)
1759e93f7393Sniklas {
1760e93f7393Sniklas static char buf[30];
1761e93f7393Sniklas
1762b725ae77Skettenis sprintf (buf, "process %d", PIDGET (ptid));
1763e93f7393Sniklas return buf;
1764e93f7393Sniklas }
1765b725ae77Skettenis
1766b725ae77Skettenis /* Error-catcher for target_find_memory_regions */
dummy_find_memory_regions(int (* ignore1)(),void * ignore2)1767b725ae77Skettenis static int dummy_find_memory_regions (int (*ignore1) (), void *ignore2)
1768b725ae77Skettenis {
1769b725ae77Skettenis error ("No target.");
1770b725ae77Skettenis return 0;
1771b725ae77Skettenis }
1772b725ae77Skettenis
1773b725ae77Skettenis /* Error-catcher for target_make_corefile_notes */
dummy_make_corefile_notes(bfd * ignore1,int * ignore2)1774b725ae77Skettenis static char * dummy_make_corefile_notes (bfd *ignore1, int *ignore2)
1775b725ae77Skettenis {
1776b725ae77Skettenis error ("No target.");
1777b725ae77Skettenis return NULL;
1778b725ae77Skettenis }
1779b725ae77Skettenis
1780b725ae77Skettenis /* Set up the handful of non-empty slots needed by the dummy target
1781b725ae77Skettenis vector. */
1782b725ae77Skettenis
1783b725ae77Skettenis static void
init_dummy_target(void)1784b725ae77Skettenis init_dummy_target (void)
1785b725ae77Skettenis {
1786b725ae77Skettenis dummy_target.to_shortname = "None";
1787b725ae77Skettenis dummy_target.to_longname = "None";
1788b725ae77Skettenis dummy_target.to_doc = "";
1789b725ae77Skettenis dummy_target.to_attach = find_default_attach;
1790b725ae77Skettenis dummy_target.to_create_inferior = find_default_create_inferior;
1791b725ae77Skettenis dummy_target.to_pid_to_str = normal_pid_to_str;
1792b725ae77Skettenis dummy_target.to_stratum = dummy_stratum;
1793b725ae77Skettenis dummy_target.to_find_memory_regions = dummy_find_memory_regions;
1794b725ae77Skettenis dummy_target.to_make_corefile_notes = dummy_make_corefile_notes;
1795b725ae77Skettenis dummy_target.to_xfer_partial = default_xfer_partial;
1796b725ae77Skettenis dummy_target.to_magic = OPS_MAGIC;
1797b725ae77Skettenis }
1798e93f7393Sniklas
1799e93f7393Sniklas static void
debug_to_open(char * args,int from_tty)1800b725ae77Skettenis debug_to_open (char *args, int from_tty)
1801e93f7393Sniklas {
1802e93f7393Sniklas debug_target.to_open (args, from_tty);
1803e93f7393Sniklas
1804b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_open (%s, %d)\n", args, from_tty);
1805e93f7393Sniklas }
1806e93f7393Sniklas
1807e93f7393Sniklas static void
debug_to_close(int quitting)1808b725ae77Skettenis debug_to_close (int quitting)
1809e93f7393Sniklas {
1810b725ae77Skettenis target_close (&debug_target, quitting);
1811b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_close (%d)\n", quitting);
1812b725ae77Skettenis }
1813e93f7393Sniklas
1814b725ae77Skettenis void
target_close(struct target_ops * targ,int quitting)1815b725ae77Skettenis target_close (struct target_ops *targ, int quitting)
1816b725ae77Skettenis {
1817b725ae77Skettenis if (targ->to_xclose != NULL)
1818b725ae77Skettenis targ->to_xclose (targ, quitting);
1819b725ae77Skettenis else if (targ->to_close != NULL)
1820b725ae77Skettenis targ->to_close (quitting);
1821e93f7393Sniklas }
1822e93f7393Sniklas
1823e93f7393Sniklas static void
debug_to_attach(char * args,int from_tty)1824b725ae77Skettenis debug_to_attach (char *args, int from_tty)
1825e93f7393Sniklas {
1826e93f7393Sniklas debug_target.to_attach (args, from_tty);
1827e93f7393Sniklas
1828b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_attach (%s, %d)\n", args, from_tty);
1829b725ae77Skettenis }
1830b725ae77Skettenis
1831b725ae77Skettenis
1832b725ae77Skettenis static void
debug_to_post_attach(int pid)1833b725ae77Skettenis debug_to_post_attach (int pid)
1834b725ae77Skettenis {
1835b725ae77Skettenis debug_target.to_post_attach (pid);
1836b725ae77Skettenis
1837b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_post_attach (%d)\n", pid);
1838e93f7393Sniklas }
1839e93f7393Sniklas
1840e93f7393Sniklas static void
debug_to_detach(char * args,int from_tty)1841b725ae77Skettenis debug_to_detach (char *args, int from_tty)
1842e93f7393Sniklas {
1843e93f7393Sniklas debug_target.to_detach (args, from_tty);
1844e93f7393Sniklas
1845b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_detach (%s, %d)\n", args, from_tty);
1846e93f7393Sniklas }
1847e93f7393Sniklas
1848e93f7393Sniklas static void
debug_to_disconnect(char * args,int from_tty)1849b725ae77Skettenis debug_to_disconnect (char *args, int from_tty)
1850e93f7393Sniklas {
1851b725ae77Skettenis debug_target.to_disconnect (args, from_tty);
1852e93f7393Sniklas
1853b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_disconnect (%s, %d)\n",
1854b725ae77Skettenis args, from_tty);
1855b725ae77Skettenis }
1856b725ae77Skettenis
1857b725ae77Skettenis static void
debug_to_resume(ptid_t ptid,int step,enum target_signal siggnal)1858b725ae77Skettenis debug_to_resume (ptid_t ptid, int step, enum target_signal siggnal)
1859b725ae77Skettenis {
1860b725ae77Skettenis debug_target.to_resume (ptid, step, siggnal);
1861b725ae77Skettenis
1862b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_resume (%d, %s, %s)\n", PIDGET (ptid),
1863e93f7393Sniklas step ? "step" : "continue",
1864e93f7393Sniklas target_signal_to_name (siggnal));
1865e93f7393Sniklas }
1866e93f7393Sniklas
1867b725ae77Skettenis static ptid_t
debug_to_wait(ptid_t ptid,struct target_waitstatus * status)1868b725ae77Skettenis debug_to_wait (ptid_t ptid, struct target_waitstatus *status)
1869e93f7393Sniklas {
1870b725ae77Skettenis ptid_t retval;
1871e93f7393Sniklas
1872b725ae77Skettenis retval = debug_target.to_wait (ptid, status);
1873e93f7393Sniklas
1874b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
1875b725ae77Skettenis "target_wait (%d, status) = %d, ", PIDGET (ptid),
1876b725ae77Skettenis PIDGET (retval));
1877b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "status->kind = ");
1878e93f7393Sniklas switch (status->kind)
1879e93f7393Sniklas {
1880e93f7393Sniklas case TARGET_WAITKIND_EXITED:
1881b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "exited, status = %d\n",
1882b725ae77Skettenis status->value.integer);
1883e93f7393Sniklas break;
1884e93f7393Sniklas case TARGET_WAITKIND_STOPPED:
1885b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "stopped, signal = %s\n",
1886e93f7393Sniklas target_signal_to_name (status->value.sig));
1887e93f7393Sniklas break;
1888e93f7393Sniklas case TARGET_WAITKIND_SIGNALLED:
1889b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "signalled, signal = %s\n",
1890e93f7393Sniklas target_signal_to_name (status->value.sig));
1891e93f7393Sniklas break;
1892e93f7393Sniklas case TARGET_WAITKIND_LOADED:
1893b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "loaded\n");
1894b725ae77Skettenis break;
1895b725ae77Skettenis case TARGET_WAITKIND_FORKED:
1896b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "forked\n");
1897b725ae77Skettenis break;
1898b725ae77Skettenis case TARGET_WAITKIND_VFORKED:
1899b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "vforked\n");
1900b725ae77Skettenis break;
1901b725ae77Skettenis case TARGET_WAITKIND_EXECD:
1902b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "execd\n");
1903e93f7393Sniklas break;
1904e93f7393Sniklas case TARGET_WAITKIND_SPURIOUS:
1905b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "spurious\n");
1906e93f7393Sniklas break;
1907e93f7393Sniklas default:
1908b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "unknown???\n");
1909e93f7393Sniklas break;
1910e93f7393Sniklas }
1911e93f7393Sniklas
1912e93f7393Sniklas return retval;
1913e93f7393Sniklas }
1914e93f7393Sniklas
1915e93f7393Sniklas static void
debug_print_register(const char * func,int regno)1916b725ae77Skettenis debug_print_register (const char * func, int regno)
1917b725ae77Skettenis {
1918b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "%s ", func);
1919b725ae77Skettenis if (regno >= 0 && regno < NUM_REGS + NUM_PSEUDO_REGS
1920b725ae77Skettenis && REGISTER_NAME (regno) != NULL && REGISTER_NAME (regno)[0] != '\0')
1921b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "(%s)", REGISTER_NAME (regno));
1922b725ae77Skettenis else
1923b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "(%d)", regno);
1924b725ae77Skettenis if (regno >= 0)
1925b725ae77Skettenis {
1926b725ae77Skettenis int i;
1927b725ae77Skettenis unsigned char buf[MAX_REGISTER_SIZE];
1928b725ae77Skettenis deprecated_read_register_gen (regno, buf);
1929b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, " = ");
1930*63addd46Skettenis for (i = 0; i < register_size (current_gdbarch, regno); i++)
1931b725ae77Skettenis {
1932b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]);
1933b725ae77Skettenis }
1934*63addd46Skettenis if (register_size (current_gdbarch, regno) <= sizeof (LONGEST))
1935b725ae77Skettenis {
1936b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, " 0x%s %s",
1937b725ae77Skettenis paddr_nz (read_register (regno)),
1938b725ae77Skettenis paddr_d (read_register (regno)));
1939b725ae77Skettenis }
1940b725ae77Skettenis }
1941b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "\n");
1942b725ae77Skettenis }
1943b725ae77Skettenis
1944b725ae77Skettenis static void
debug_to_fetch_registers(int regno)1945b725ae77Skettenis debug_to_fetch_registers (int regno)
1946e93f7393Sniklas {
1947e93f7393Sniklas debug_target.to_fetch_registers (regno);
1948b725ae77Skettenis debug_print_register ("target_fetch_registers", regno);
1949e93f7393Sniklas }
1950e93f7393Sniklas
1951e93f7393Sniklas static void
debug_to_store_registers(int regno)1952b725ae77Skettenis debug_to_store_registers (int regno)
1953e93f7393Sniklas {
1954e93f7393Sniklas debug_target.to_store_registers (regno);
1955b725ae77Skettenis debug_print_register ("target_store_registers", regno);
1956b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "\n");
1957e93f7393Sniklas }
1958e93f7393Sniklas
1959e93f7393Sniklas static void
debug_to_prepare_to_store(void)1960b725ae77Skettenis debug_to_prepare_to_store (void)
1961e93f7393Sniklas {
1962e93f7393Sniklas debug_target.to_prepare_to_store ();
1963e93f7393Sniklas
1964b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_prepare_to_store ()\n");
1965e93f7393Sniklas }
1966e93f7393Sniklas
1967e93f7393Sniklas static int
deprecated_debug_xfer_memory(CORE_ADDR memaddr,char * myaddr,int len,int write,struct mem_attrib * attrib,struct target_ops * target)1968*63addd46Skettenis deprecated_debug_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
1969*63addd46Skettenis int write, struct mem_attrib *attrib,
1970b725ae77Skettenis struct target_ops *target)
1971e93f7393Sniklas {
1972e93f7393Sniklas int retval;
1973e93f7393Sniklas
1974*63addd46Skettenis retval = debug_target.deprecated_xfer_memory (memaddr, myaddr, len, write,
1975b725ae77Skettenis attrib, target);
1976e93f7393Sniklas
1977b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
1978e93f7393Sniklas "target_xfer_memory (0x%x, xxx, %d, %s, xxx) = %d",
1979b725ae77Skettenis (unsigned int) memaddr, /* possable truncate long long */
1980b725ae77Skettenis len, write ? "write" : "read", retval);
1981b725ae77Skettenis
1982e93f7393Sniklas if (retval > 0)
1983e93f7393Sniklas {
1984e93f7393Sniklas int i;
1985e93f7393Sniklas
1986b725ae77Skettenis fputs_unfiltered (", bytes =", gdb_stdlog);
1987e93f7393Sniklas for (i = 0; i < retval; i++)
1988e93f7393Sniklas {
1989e93f7393Sniklas if ((((long) &(myaddr[i])) & 0xf) == 0)
1990*63addd46Skettenis {
1991*63addd46Skettenis if (targetdebug < 2 && i > 0)
1992*63addd46Skettenis {
1993*63addd46Skettenis fprintf_unfiltered (gdb_stdlog, " ...");
1994*63addd46Skettenis break;
1995*63addd46Skettenis }
1996b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "\n");
1997*63addd46Skettenis }
1998*63addd46Skettenis
1999b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, " %02x", myaddr[i] & 0xff);
2000e93f7393Sniklas }
2001e93f7393Sniklas }
2002e93f7393Sniklas
2003b725ae77Skettenis fputc_unfiltered ('\n', gdb_stdlog);
2004e93f7393Sniklas
2005e93f7393Sniklas return retval;
2006e93f7393Sniklas }
2007e93f7393Sniklas
2008e93f7393Sniklas static void
debug_to_files_info(struct target_ops * target)2009b725ae77Skettenis debug_to_files_info (struct target_ops *target)
2010e93f7393Sniklas {
2011e93f7393Sniklas debug_target.to_files_info (target);
2012e93f7393Sniklas
2013b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_files_info (xxx)\n");
2014e93f7393Sniklas }
2015e93f7393Sniklas
2016e93f7393Sniklas static int
debug_to_insert_breakpoint(CORE_ADDR addr,char * save)2017b725ae77Skettenis debug_to_insert_breakpoint (CORE_ADDR addr, char *save)
2018e93f7393Sniklas {
2019e93f7393Sniklas int retval;
2020e93f7393Sniklas
2021e93f7393Sniklas retval = debug_target.to_insert_breakpoint (addr, save);
2022e93f7393Sniklas
2023b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2024b725ae77Skettenis "target_insert_breakpoint (0x%lx, xxx) = %ld\n",
2025b725ae77Skettenis (unsigned long) addr,
2026b725ae77Skettenis (unsigned long) retval);
2027e93f7393Sniklas return retval;
2028e93f7393Sniklas }
2029e93f7393Sniklas
2030e93f7393Sniklas static int
debug_to_remove_breakpoint(CORE_ADDR addr,char * save)2031b725ae77Skettenis debug_to_remove_breakpoint (CORE_ADDR addr, char *save)
2032e93f7393Sniklas {
2033e93f7393Sniklas int retval;
2034e93f7393Sniklas
2035e93f7393Sniklas retval = debug_target.to_remove_breakpoint (addr, save);
2036e93f7393Sniklas
2037b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2038b725ae77Skettenis "target_remove_breakpoint (0x%lx, xxx) = %ld\n",
2039b725ae77Skettenis (unsigned long) addr,
2040b725ae77Skettenis (unsigned long) retval);
2041b725ae77Skettenis return retval;
2042b725ae77Skettenis }
2043b725ae77Skettenis
2044b725ae77Skettenis static int
debug_to_can_use_hw_breakpoint(int type,int cnt,int from_tty)2045b725ae77Skettenis debug_to_can_use_hw_breakpoint (int type, int cnt, int from_tty)
2046b725ae77Skettenis {
2047b725ae77Skettenis int retval;
2048b725ae77Skettenis
2049b725ae77Skettenis retval = debug_target.to_can_use_hw_breakpoint (type, cnt, from_tty);
2050b725ae77Skettenis
2051b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2052b725ae77Skettenis "target_can_use_hw_breakpoint (%ld, %ld, %ld) = %ld\n",
2053b725ae77Skettenis (unsigned long) type,
2054b725ae77Skettenis (unsigned long) cnt,
2055b725ae77Skettenis (unsigned long) from_tty,
2056b725ae77Skettenis (unsigned long) retval);
2057b725ae77Skettenis return retval;
2058b725ae77Skettenis }
2059b725ae77Skettenis
2060b725ae77Skettenis static int
debug_to_region_size_ok_for_hw_watchpoint(int byte_count)2061b725ae77Skettenis debug_to_region_size_ok_for_hw_watchpoint (int byte_count)
2062b725ae77Skettenis {
2063b725ae77Skettenis CORE_ADDR retval;
2064b725ae77Skettenis
2065b725ae77Skettenis retval = debug_target.to_region_size_ok_for_hw_watchpoint (byte_count);
2066b725ae77Skettenis
2067b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2068b725ae77Skettenis "TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT (%ld) = 0x%lx\n",
2069b725ae77Skettenis (unsigned long) byte_count,
2070b725ae77Skettenis (unsigned long) retval);
2071b725ae77Skettenis return retval;
2072b725ae77Skettenis }
2073b725ae77Skettenis
2074b725ae77Skettenis static int
debug_to_stopped_by_watchpoint(void)2075b725ae77Skettenis debug_to_stopped_by_watchpoint (void)
2076b725ae77Skettenis {
2077b725ae77Skettenis int retval;
2078b725ae77Skettenis
2079b725ae77Skettenis retval = debug_target.to_stopped_by_watchpoint ();
2080b725ae77Skettenis
2081b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2082b725ae77Skettenis "STOPPED_BY_WATCHPOINT () = %ld\n",
2083b725ae77Skettenis (unsigned long) retval);
2084b725ae77Skettenis return retval;
2085b725ae77Skettenis }
2086b725ae77Skettenis
2087*63addd46Skettenis static int
debug_to_stopped_data_address(struct target_ops * target,CORE_ADDR * addr)2088*63addd46Skettenis debug_to_stopped_data_address (struct target_ops *target, CORE_ADDR *addr)
2089b725ae77Skettenis {
2090*63addd46Skettenis int retval;
2091b725ae77Skettenis
2092*63addd46Skettenis retval = debug_target.to_stopped_data_address (target, addr);
2093b725ae77Skettenis
2094b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2095*63addd46Skettenis "target_stopped_data_address ([0x%lx]) = %ld\n",
2096*63addd46Skettenis (unsigned long)*addr,
2097b725ae77Skettenis (unsigned long)retval);
2098b725ae77Skettenis return retval;
2099b725ae77Skettenis }
2100b725ae77Skettenis
2101b725ae77Skettenis static int
debug_to_insert_hw_breakpoint(CORE_ADDR addr,char * save)2102b725ae77Skettenis debug_to_insert_hw_breakpoint (CORE_ADDR addr, char *save)
2103b725ae77Skettenis {
2104b725ae77Skettenis int retval;
2105b725ae77Skettenis
2106b725ae77Skettenis retval = debug_target.to_insert_hw_breakpoint (addr, save);
2107b725ae77Skettenis
2108b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2109b725ae77Skettenis "target_insert_hw_breakpoint (0x%lx, xxx) = %ld\n",
2110b725ae77Skettenis (unsigned long) addr,
2111b725ae77Skettenis (unsigned long) retval);
2112b725ae77Skettenis return retval;
2113b725ae77Skettenis }
2114b725ae77Skettenis
2115b725ae77Skettenis static int
debug_to_remove_hw_breakpoint(CORE_ADDR addr,char * save)2116b725ae77Skettenis debug_to_remove_hw_breakpoint (CORE_ADDR addr, char *save)
2117b725ae77Skettenis {
2118b725ae77Skettenis int retval;
2119b725ae77Skettenis
2120b725ae77Skettenis retval = debug_target.to_remove_hw_breakpoint (addr, save);
2121b725ae77Skettenis
2122b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2123b725ae77Skettenis "target_remove_hw_breakpoint (0x%lx, xxx) = %ld\n",
2124b725ae77Skettenis (unsigned long) addr,
2125b725ae77Skettenis (unsigned long) retval);
2126b725ae77Skettenis return retval;
2127b725ae77Skettenis }
2128b725ae77Skettenis
2129b725ae77Skettenis static int
debug_to_insert_watchpoint(CORE_ADDR addr,int len,int type)2130b725ae77Skettenis debug_to_insert_watchpoint (CORE_ADDR addr, int len, int type)
2131b725ae77Skettenis {
2132b725ae77Skettenis int retval;
2133b725ae77Skettenis
2134b725ae77Skettenis retval = debug_target.to_insert_watchpoint (addr, len, type);
2135b725ae77Skettenis
2136b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2137b725ae77Skettenis "target_insert_watchpoint (0x%lx, %d, %d) = %ld\n",
2138b725ae77Skettenis (unsigned long) addr, len, type, (unsigned long) retval);
2139b725ae77Skettenis return retval;
2140b725ae77Skettenis }
2141b725ae77Skettenis
2142b725ae77Skettenis static int
debug_to_remove_watchpoint(CORE_ADDR addr,int len,int type)2143b725ae77Skettenis debug_to_remove_watchpoint (CORE_ADDR addr, int len, int type)
2144b725ae77Skettenis {
2145b725ae77Skettenis int retval;
2146b725ae77Skettenis
2147b725ae77Skettenis retval = debug_target.to_insert_watchpoint (addr, len, type);
2148b725ae77Skettenis
2149b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2150b725ae77Skettenis "target_insert_watchpoint (0x%lx, %d, %d) = %ld\n",
2151b725ae77Skettenis (unsigned long) addr, len, type, (unsigned long) retval);
2152e93f7393Sniklas return retval;
2153e93f7393Sniklas }
2154e93f7393Sniklas
2155e93f7393Sniklas static void
debug_to_terminal_init(void)2156b725ae77Skettenis debug_to_terminal_init (void)
2157e93f7393Sniklas {
2158e93f7393Sniklas debug_target.to_terminal_init ();
2159e93f7393Sniklas
2160b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_terminal_init ()\n");
2161e93f7393Sniklas }
2162e93f7393Sniklas
2163e93f7393Sniklas static void
debug_to_terminal_inferior(void)2164b725ae77Skettenis debug_to_terminal_inferior (void)
2165e93f7393Sniklas {
2166e93f7393Sniklas debug_target.to_terminal_inferior ();
2167e93f7393Sniklas
2168b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_terminal_inferior ()\n");
2169e93f7393Sniklas }
2170e93f7393Sniklas
2171e93f7393Sniklas static void
debug_to_terminal_ours_for_output(void)2172b725ae77Skettenis debug_to_terminal_ours_for_output (void)
2173e93f7393Sniklas {
2174e93f7393Sniklas debug_target.to_terminal_ours_for_output ();
2175e93f7393Sniklas
2176b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_terminal_ours_for_output ()\n");
2177e93f7393Sniklas }
2178e93f7393Sniklas
2179e93f7393Sniklas static void
debug_to_terminal_ours(void)2180b725ae77Skettenis debug_to_terminal_ours (void)
2181e93f7393Sniklas {
2182e93f7393Sniklas debug_target.to_terminal_ours ();
2183e93f7393Sniklas
2184b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_terminal_ours ()\n");
2185e93f7393Sniklas }
2186e93f7393Sniklas
2187e93f7393Sniklas static void
debug_to_terminal_save_ours(void)2188b725ae77Skettenis debug_to_terminal_save_ours (void)
2189b725ae77Skettenis {
2190b725ae77Skettenis debug_target.to_terminal_save_ours ();
2191b725ae77Skettenis
2192b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_terminal_save_ours ()\n");
2193b725ae77Skettenis }
2194b725ae77Skettenis
2195b725ae77Skettenis static void
debug_to_terminal_info(char * arg,int from_tty)2196b725ae77Skettenis debug_to_terminal_info (char *arg, int from_tty)
2197e93f7393Sniklas {
2198e93f7393Sniklas debug_target.to_terminal_info (arg, from_tty);
2199e93f7393Sniklas
2200b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_terminal_info (%s, %d)\n", arg,
2201e93f7393Sniklas from_tty);
2202e93f7393Sniklas }
2203e93f7393Sniklas
2204e93f7393Sniklas static void
debug_to_kill(void)2205b725ae77Skettenis debug_to_kill (void)
2206e93f7393Sniklas {
2207e93f7393Sniklas debug_target.to_kill ();
2208e93f7393Sniklas
2209b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_kill ()\n");
2210e93f7393Sniklas }
2211e93f7393Sniklas
2212e93f7393Sniklas static void
debug_to_load(char * args,int from_tty)2213b725ae77Skettenis debug_to_load (char *args, int from_tty)
2214e93f7393Sniklas {
2215e93f7393Sniklas debug_target.to_load (args, from_tty);
2216e93f7393Sniklas
2217b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_load (%s, %d)\n", args, from_tty);
2218e93f7393Sniklas }
2219e93f7393Sniklas
2220e93f7393Sniklas static int
debug_to_lookup_symbol(char * name,CORE_ADDR * addrp)2221b725ae77Skettenis debug_to_lookup_symbol (char *name, CORE_ADDR *addrp)
2222e93f7393Sniklas {
2223e93f7393Sniklas int retval;
2224e93f7393Sniklas
2225e93f7393Sniklas retval = debug_target.to_lookup_symbol (name, addrp);
2226e93f7393Sniklas
2227b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_lookup_symbol (%s, xxx)\n", name);
2228e93f7393Sniklas
2229e93f7393Sniklas return retval;
2230e93f7393Sniklas }
2231e93f7393Sniklas
2232e93f7393Sniklas static void
debug_to_create_inferior(char * exec_file,char * args,char ** env,int from_tty)2233*63addd46Skettenis debug_to_create_inferior (char *exec_file, char *args, char **env,
2234*63addd46Skettenis int from_tty)
2235e93f7393Sniklas {
2236*63addd46Skettenis debug_target.to_create_inferior (exec_file, args, env, from_tty);
2237e93f7393Sniklas
2238*63addd46Skettenis fprintf_unfiltered (gdb_stdlog, "target_create_inferior (%s, %s, xxx, %d)\n",
2239*63addd46Skettenis exec_file, args, from_tty);
2240e93f7393Sniklas }
2241e93f7393Sniklas
2242e93f7393Sniklas static void
debug_to_post_startup_inferior(ptid_t ptid)2243b725ae77Skettenis debug_to_post_startup_inferior (ptid_t ptid)
2244e93f7393Sniklas {
2245b725ae77Skettenis debug_target.to_post_startup_inferior (ptid);
2246e93f7393Sniklas
2247b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_post_startup_inferior (%d)\n",
2248b725ae77Skettenis PIDGET (ptid));
2249b725ae77Skettenis }
2250b725ae77Skettenis
2251b725ae77Skettenis static void
debug_to_acknowledge_created_inferior(int pid)2252b725ae77Skettenis debug_to_acknowledge_created_inferior (int pid)
2253b725ae77Skettenis {
2254b725ae77Skettenis debug_target.to_acknowledge_created_inferior (pid);
2255b725ae77Skettenis
2256b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_acknowledge_created_inferior (%d)\n",
2257b725ae77Skettenis pid);
2258e93f7393Sniklas }
2259e93f7393Sniklas
2260e93f7393Sniklas static int
debug_to_insert_fork_catchpoint(int pid)2261b725ae77Skettenis debug_to_insert_fork_catchpoint (int pid)
2262b725ae77Skettenis {
2263b725ae77Skettenis int retval;
2264b725ae77Skettenis
2265b725ae77Skettenis retval = debug_target.to_insert_fork_catchpoint (pid);
2266b725ae77Skettenis
2267b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_insert_fork_catchpoint (%d) = %d\n",
2268b725ae77Skettenis pid, retval);
2269b725ae77Skettenis
2270b725ae77Skettenis return retval;
2271b725ae77Skettenis }
2272b725ae77Skettenis
2273b725ae77Skettenis static int
debug_to_remove_fork_catchpoint(int pid)2274b725ae77Skettenis debug_to_remove_fork_catchpoint (int pid)
2275b725ae77Skettenis {
2276b725ae77Skettenis int retval;
2277b725ae77Skettenis
2278b725ae77Skettenis retval = debug_target.to_remove_fork_catchpoint (pid);
2279b725ae77Skettenis
2280b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_remove_fork_catchpoint (%d) = %d\n",
2281b725ae77Skettenis pid, retval);
2282b725ae77Skettenis
2283b725ae77Skettenis return retval;
2284b725ae77Skettenis }
2285b725ae77Skettenis
2286b725ae77Skettenis static int
debug_to_insert_vfork_catchpoint(int pid)2287b725ae77Skettenis debug_to_insert_vfork_catchpoint (int pid)
2288b725ae77Skettenis {
2289b725ae77Skettenis int retval;
2290b725ae77Skettenis
2291b725ae77Skettenis retval = debug_target.to_insert_vfork_catchpoint (pid);
2292b725ae77Skettenis
2293b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_insert_vfork_catchpoint (%d)= %d\n",
2294b725ae77Skettenis pid, retval);
2295b725ae77Skettenis
2296b725ae77Skettenis return retval;
2297b725ae77Skettenis }
2298b725ae77Skettenis
2299b725ae77Skettenis static int
debug_to_remove_vfork_catchpoint(int pid)2300b725ae77Skettenis debug_to_remove_vfork_catchpoint (int pid)
2301b725ae77Skettenis {
2302b725ae77Skettenis int retval;
2303b725ae77Skettenis
2304b725ae77Skettenis retval = debug_target.to_remove_vfork_catchpoint (pid);
2305b725ae77Skettenis
2306b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_remove_vfork_catchpoint (%d) = %d\n",
2307b725ae77Skettenis pid, retval);
2308b725ae77Skettenis
2309b725ae77Skettenis return retval;
2310b725ae77Skettenis }
2311b725ae77Skettenis
2312b725ae77Skettenis static int
debug_to_follow_fork(int follow_child)2313b725ae77Skettenis debug_to_follow_fork (int follow_child)
2314b725ae77Skettenis {
2315b725ae77Skettenis int retval = debug_target.to_follow_fork (follow_child);
2316b725ae77Skettenis
2317b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_follow_fork (%d) = %d\n",
2318b725ae77Skettenis follow_child, retval);
2319b725ae77Skettenis
2320b725ae77Skettenis return retval;
2321b725ae77Skettenis }
2322b725ae77Skettenis
2323b725ae77Skettenis static int
debug_to_insert_exec_catchpoint(int pid)2324b725ae77Skettenis debug_to_insert_exec_catchpoint (int pid)
2325b725ae77Skettenis {
2326b725ae77Skettenis int retval;
2327b725ae77Skettenis
2328b725ae77Skettenis retval = debug_target.to_insert_exec_catchpoint (pid);
2329b725ae77Skettenis
2330b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_insert_exec_catchpoint (%d) = %d\n",
2331b725ae77Skettenis pid, retval);
2332b725ae77Skettenis
2333b725ae77Skettenis return retval;
2334b725ae77Skettenis }
2335b725ae77Skettenis
2336b725ae77Skettenis static int
debug_to_remove_exec_catchpoint(int pid)2337b725ae77Skettenis debug_to_remove_exec_catchpoint (int pid)
2338b725ae77Skettenis {
2339b725ae77Skettenis int retval;
2340b725ae77Skettenis
2341b725ae77Skettenis retval = debug_target.to_remove_exec_catchpoint (pid);
2342b725ae77Skettenis
2343b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_remove_exec_catchpoint (%d) = %d\n",
2344b725ae77Skettenis pid, retval);
2345b725ae77Skettenis
2346b725ae77Skettenis return retval;
2347b725ae77Skettenis }
2348b725ae77Skettenis
2349b725ae77Skettenis static int
debug_to_reported_exec_events_per_exec_call(void)2350b725ae77Skettenis debug_to_reported_exec_events_per_exec_call (void)
2351b725ae77Skettenis {
2352b725ae77Skettenis int reported_exec_events;
2353b725ae77Skettenis
2354b725ae77Skettenis reported_exec_events = debug_target.to_reported_exec_events_per_exec_call ();
2355b725ae77Skettenis
2356b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2357b725ae77Skettenis "target_reported_exec_events_per_exec_call () = %d\n",
2358b725ae77Skettenis reported_exec_events);
2359b725ae77Skettenis
2360b725ae77Skettenis return reported_exec_events;
2361b725ae77Skettenis }
2362b725ae77Skettenis
2363b725ae77Skettenis static int
debug_to_has_exited(int pid,int wait_status,int * exit_status)2364b725ae77Skettenis debug_to_has_exited (int pid, int wait_status, int *exit_status)
2365b725ae77Skettenis {
2366b725ae77Skettenis int has_exited;
2367b725ae77Skettenis
2368b725ae77Skettenis has_exited = debug_target.to_has_exited (pid, wait_status, exit_status);
2369b725ae77Skettenis
2370b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_has_exited (%d, %d, %d) = %d\n",
2371b725ae77Skettenis pid, wait_status, *exit_status, has_exited);
2372b725ae77Skettenis
2373b725ae77Skettenis return has_exited;
2374b725ae77Skettenis }
2375b725ae77Skettenis
2376b725ae77Skettenis static void
debug_to_mourn_inferior(void)2377b725ae77Skettenis debug_to_mourn_inferior (void)
2378b725ae77Skettenis {
2379b725ae77Skettenis debug_target.to_mourn_inferior ();
2380b725ae77Skettenis
2381b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_mourn_inferior ()\n");
2382b725ae77Skettenis }
2383b725ae77Skettenis
2384b725ae77Skettenis static int
debug_to_can_run(void)2385b725ae77Skettenis debug_to_can_run (void)
2386e93f7393Sniklas {
2387e93f7393Sniklas int retval;
2388e93f7393Sniklas
2389e93f7393Sniklas retval = debug_target.to_can_run ();
2390e93f7393Sniklas
2391b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_can_run () = %d\n", retval);
2392e93f7393Sniklas
2393e93f7393Sniklas return retval;
2394e93f7393Sniklas }
2395e93f7393Sniklas
2396e93f7393Sniklas static void
debug_to_notice_signals(ptid_t ptid)2397b725ae77Skettenis debug_to_notice_signals (ptid_t ptid)
2398e93f7393Sniklas {
2399b725ae77Skettenis debug_target.to_notice_signals (ptid);
2400e93f7393Sniklas
2401b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_notice_signals (%d)\n",
2402b725ae77Skettenis PIDGET (ptid));
2403e93f7393Sniklas }
2404e93f7393Sniklas
2405e93f7393Sniklas static int
debug_to_thread_alive(ptid_t ptid)2406b725ae77Skettenis debug_to_thread_alive (ptid_t ptid)
2407e93f7393Sniklas {
2408e93f7393Sniklas int retval;
2409e93f7393Sniklas
2410b725ae77Skettenis retval = debug_target.to_thread_alive (ptid);
2411e93f7393Sniklas
2412b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_thread_alive (%d) = %d\n",
2413b725ae77Skettenis PIDGET (ptid), retval);
2414e93f7393Sniklas
2415e93f7393Sniklas return retval;
2416e93f7393Sniklas }
2417e93f7393Sniklas
2418e93f7393Sniklas static void
debug_to_find_new_threads(void)2419b725ae77Skettenis debug_to_find_new_threads (void)
2420e93f7393Sniklas {
2421b725ae77Skettenis debug_target.to_find_new_threads ();
2422e93f7393Sniklas
2423b725ae77Skettenis fputs_unfiltered ("target_find_new_threads ()\n", gdb_stdlog);
2424e93f7393Sniklas }
2425e93f7393Sniklas
2426e93f7393Sniklas static void
debug_to_stop(void)2427b725ae77Skettenis debug_to_stop (void)
2428b725ae77Skettenis {
2429b725ae77Skettenis debug_target.to_stop ();
2430b725ae77Skettenis
2431b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_stop ()\n");
2432b725ae77Skettenis }
2433b725ae77Skettenis
2434b725ae77Skettenis static void
debug_to_rcmd(char * command,struct ui_file * outbuf)2435b725ae77Skettenis debug_to_rcmd (char *command,
2436b725ae77Skettenis struct ui_file *outbuf)
2437b725ae77Skettenis {
2438b725ae77Skettenis debug_target.to_rcmd (command, outbuf);
2439b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_rcmd (%s, ...)\n", command);
2440b725ae77Skettenis }
2441b725ae77Skettenis
2442b725ae77Skettenis static struct symtab_and_line *
debug_to_enable_exception_callback(enum exception_event_kind kind,int enable)2443b725ae77Skettenis debug_to_enable_exception_callback (enum exception_event_kind kind, int enable)
2444b725ae77Skettenis {
2445b725ae77Skettenis struct symtab_and_line *result;
2446b725ae77Skettenis result = debug_target.to_enable_exception_callback (kind, enable);
2447b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
2448b725ae77Skettenis "target get_exception_callback_sal (%d, %d)\n",
2449b725ae77Skettenis kind, enable);
2450b725ae77Skettenis return result;
2451b725ae77Skettenis }
2452b725ae77Skettenis
2453b725ae77Skettenis static struct exception_event_record *
debug_to_get_current_exception_event(void)2454b725ae77Skettenis debug_to_get_current_exception_event (void)
2455b725ae77Skettenis {
2456b725ae77Skettenis struct exception_event_record *result;
2457b725ae77Skettenis result = debug_target.to_get_current_exception_event ();
2458b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target get_current_exception_event ()\n");
2459b725ae77Skettenis return result;
2460b725ae77Skettenis }
2461b725ae77Skettenis
2462b725ae77Skettenis static char *
debug_to_pid_to_exec_file(int pid)2463b725ae77Skettenis debug_to_pid_to_exec_file (int pid)
2464b725ae77Skettenis {
2465b725ae77Skettenis char *exec_file;
2466b725ae77Skettenis
2467b725ae77Skettenis exec_file = debug_target.to_pid_to_exec_file (pid);
2468b725ae77Skettenis
2469b725ae77Skettenis fprintf_unfiltered (gdb_stdlog, "target_pid_to_exec_file (%d) = %s\n",
2470b725ae77Skettenis pid, exec_file);
2471b725ae77Skettenis
2472b725ae77Skettenis return exec_file;
2473b725ae77Skettenis }
2474b725ae77Skettenis
2475b725ae77Skettenis static void
setup_target_debug(void)2476b725ae77Skettenis setup_target_debug (void)
2477e93f7393Sniklas {
2478e93f7393Sniklas memcpy (&debug_target, ¤t_target, sizeof debug_target);
2479e93f7393Sniklas
2480e93f7393Sniklas current_target.to_open = debug_to_open;
2481e93f7393Sniklas current_target.to_close = debug_to_close;
2482e93f7393Sniklas current_target.to_attach = debug_to_attach;
2483b725ae77Skettenis current_target.to_post_attach = debug_to_post_attach;
2484e93f7393Sniklas current_target.to_detach = debug_to_detach;
2485b725ae77Skettenis current_target.to_disconnect = debug_to_disconnect;
2486e93f7393Sniklas current_target.to_resume = debug_to_resume;
2487e93f7393Sniklas current_target.to_wait = debug_to_wait;
2488e93f7393Sniklas current_target.to_fetch_registers = debug_to_fetch_registers;
2489e93f7393Sniklas current_target.to_store_registers = debug_to_store_registers;
2490e93f7393Sniklas current_target.to_prepare_to_store = debug_to_prepare_to_store;
2491*63addd46Skettenis current_target.deprecated_xfer_memory = deprecated_debug_xfer_memory;
2492e93f7393Sniklas current_target.to_files_info = debug_to_files_info;
2493e93f7393Sniklas current_target.to_insert_breakpoint = debug_to_insert_breakpoint;
2494e93f7393Sniklas current_target.to_remove_breakpoint = debug_to_remove_breakpoint;
2495b725ae77Skettenis current_target.to_can_use_hw_breakpoint = debug_to_can_use_hw_breakpoint;
2496b725ae77Skettenis current_target.to_insert_hw_breakpoint = debug_to_insert_hw_breakpoint;
2497b725ae77Skettenis current_target.to_remove_hw_breakpoint = debug_to_remove_hw_breakpoint;
2498b725ae77Skettenis current_target.to_insert_watchpoint = debug_to_insert_watchpoint;
2499b725ae77Skettenis current_target.to_remove_watchpoint = debug_to_remove_watchpoint;
2500b725ae77Skettenis current_target.to_stopped_by_watchpoint = debug_to_stopped_by_watchpoint;
2501b725ae77Skettenis current_target.to_stopped_data_address = debug_to_stopped_data_address;
2502b725ae77Skettenis current_target.to_region_size_ok_for_hw_watchpoint = debug_to_region_size_ok_for_hw_watchpoint;
2503e93f7393Sniklas current_target.to_terminal_init = debug_to_terminal_init;
2504e93f7393Sniklas current_target.to_terminal_inferior = debug_to_terminal_inferior;
2505e93f7393Sniklas current_target.to_terminal_ours_for_output = debug_to_terminal_ours_for_output;
2506e93f7393Sniklas current_target.to_terminal_ours = debug_to_terminal_ours;
2507b725ae77Skettenis current_target.to_terminal_save_ours = debug_to_terminal_save_ours;
2508e93f7393Sniklas current_target.to_terminal_info = debug_to_terminal_info;
2509e93f7393Sniklas current_target.to_kill = debug_to_kill;
2510e93f7393Sniklas current_target.to_load = debug_to_load;
2511e93f7393Sniklas current_target.to_lookup_symbol = debug_to_lookup_symbol;
2512e93f7393Sniklas current_target.to_create_inferior = debug_to_create_inferior;
2513b725ae77Skettenis current_target.to_post_startup_inferior = debug_to_post_startup_inferior;
2514b725ae77Skettenis current_target.to_acknowledge_created_inferior = debug_to_acknowledge_created_inferior;
2515b725ae77Skettenis current_target.to_insert_fork_catchpoint = debug_to_insert_fork_catchpoint;
2516b725ae77Skettenis current_target.to_remove_fork_catchpoint = debug_to_remove_fork_catchpoint;
2517b725ae77Skettenis current_target.to_insert_vfork_catchpoint = debug_to_insert_vfork_catchpoint;
2518b725ae77Skettenis current_target.to_remove_vfork_catchpoint = debug_to_remove_vfork_catchpoint;
2519b725ae77Skettenis current_target.to_follow_fork = debug_to_follow_fork;
2520b725ae77Skettenis current_target.to_insert_exec_catchpoint = debug_to_insert_exec_catchpoint;
2521b725ae77Skettenis current_target.to_remove_exec_catchpoint = debug_to_remove_exec_catchpoint;
2522b725ae77Skettenis current_target.to_reported_exec_events_per_exec_call = debug_to_reported_exec_events_per_exec_call;
2523b725ae77Skettenis current_target.to_has_exited = debug_to_has_exited;
2524e93f7393Sniklas current_target.to_mourn_inferior = debug_to_mourn_inferior;
2525e93f7393Sniklas current_target.to_can_run = debug_to_can_run;
2526e93f7393Sniklas current_target.to_notice_signals = debug_to_notice_signals;
2527e93f7393Sniklas current_target.to_thread_alive = debug_to_thread_alive;
2528b725ae77Skettenis current_target.to_find_new_threads = debug_to_find_new_threads;
2529e93f7393Sniklas current_target.to_stop = debug_to_stop;
2530b725ae77Skettenis current_target.to_rcmd = debug_to_rcmd;
2531b725ae77Skettenis current_target.to_enable_exception_callback = debug_to_enable_exception_callback;
2532b725ae77Skettenis current_target.to_get_current_exception_event = debug_to_get_current_exception_event;
2533b725ae77Skettenis current_target.to_pid_to_exec_file = debug_to_pid_to_exec_file;
2534b725ae77Skettenis
2535e93f7393Sniklas }
2536e93f7393Sniklas
2537b725ae77Skettenis
2538e93f7393Sniklas static char targ_desc[] =
2539e93f7393Sniklas "Names of targets and files being debugged.\n\
2540e93f7393Sniklas Shows the entire stack of targets currently in use (including the exec-file,\n\
2541e93f7393Sniklas core-file, and process, if any), as well as the symbol file name.";
2542e93f7393Sniklas
2543b725ae77Skettenis static void
do_monitor_command(char * cmd,int from_tty)2544b725ae77Skettenis do_monitor_command (char *cmd,
2545b725ae77Skettenis int from_tty)
2546e93f7393Sniklas {
2547b725ae77Skettenis if ((current_target.to_rcmd
2548b725ae77Skettenis == (void (*) (char *, struct ui_file *)) tcomplain)
2549b725ae77Skettenis || (current_target.to_rcmd == debug_to_rcmd
2550b725ae77Skettenis && (debug_target.to_rcmd
2551b725ae77Skettenis == (void (*) (char *, struct ui_file *)) tcomplain)))
2552b725ae77Skettenis {
2553b725ae77Skettenis error ("\"monitor\" command not supported by this target.\n");
2554b725ae77Skettenis }
2555b725ae77Skettenis target_rcmd (cmd, gdb_stdtarg);
2556b725ae77Skettenis }
2557b725ae77Skettenis
2558b725ae77Skettenis void
initialize_targets(void)2559b725ae77Skettenis initialize_targets (void)
2560b725ae77Skettenis {
2561b725ae77Skettenis init_dummy_target ();
2562e93f7393Sniklas push_target (&dummy_target);
2563e93f7393Sniklas
2564e93f7393Sniklas add_info ("target", target_info, targ_desc);
2565e93f7393Sniklas add_info ("files", target_info, targ_desc);
2566e93f7393Sniklas
2567*63addd46Skettenis deprecated_add_show_from_set
2568b725ae77Skettenis (add_set_cmd ("target", class_maintenance, var_zinteger,
2569e93f7393Sniklas (char *) &targetdebug,
2570e93f7393Sniklas "Set target debugging.\n\
2571*63addd46Skettenis When non-zero, target debugging is enabled. Higher numbers are more\n\
2572*63addd46Skettenis verbose. Changes do not take effect until the next \"run\" or \"target\"\n\
2573*63addd46Skettenis command.", &setdebuglist),
2574b725ae77Skettenis &showdebuglist);
2575e93f7393Sniklas
2576b725ae77Skettenis add_setshow_boolean_cmd ("trust-readonly-sections", class_support,
2577b725ae77Skettenis &trust_readonly, "\
2578*63addd46Skettenis Set mode for reading from readonly sections.", "\
2579*63addd46Skettenis Show mode for reading from readonly sections.", "\
2580b725ae77Skettenis When this mode is on, memory reads from readonly sections (such as .text)\n\
2581b725ae77Skettenis will be read from the object file instead of from the target. This will\n\
2582b725ae77Skettenis result in significant performance improvement for remote targets.", "\
2583*63addd46Skettenis Mode for reading from readonly sections is %s.",
2584b725ae77Skettenis NULL, NULL,
2585b725ae77Skettenis &setlist, &showlist);
2586b725ae77Skettenis
2587b725ae77Skettenis add_com ("monitor", class_obscure, do_monitor_command,
2588b725ae77Skettenis "Send a command to the remote monitor (remote targets only).");
2589b725ae77Skettenis
2590b725ae77Skettenis target_dcache = dcache_init ();
2591e93f7393Sniklas }
2592