Non-stop mode support.
[deliverable/binutils-gdb.git] / gdb / gdbserver / target.c
CommitLineData
ce3a066d 1/* Target operations for the remote server for GDB.
0fb0cc75
JB
2 Copyright (C) 2002, 2004, 2005, 2007, 2008, 2009
3 Free Software Foundation, Inc.
ce3a066d
DJ
4
5 Contributed by MontaVista Software.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
ce3a066d
DJ
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
ce3a066d
DJ
21
22#include "server.h"
23
24struct target_ops *the_target;
25
0d62e5e8
DJ
26void
27set_desired_inferior (int use_general)
28{
29 struct thread_info *found;
30
31 if (use_general == 1)
32 {
33 found = (struct thread_info *) find_inferior_id (&all_threads,
34 general_thread);
35 }
36 else
37 {
38 found = NULL;
39
40 /* If we are continuing any (all) thread(s), use step_thread
41 to decide which thread to step and/or send the specified
42 signal to. */
d592fa2f
DJ
43 if ((step_thread != 0 && step_thread != -1)
44 && (cont_thread == 0 || cont_thread == -1))
0d62e5e8
DJ
45 found = (struct thread_info *) find_inferior_id (&all_threads,
46 step_thread);
47
48 if (found == NULL)
49 found = (struct thread_info *) find_inferior_id (&all_threads,
50 cont_thread);
51 }
52
53 if (found == NULL)
54 current_inferior = (struct thread_info *) all_threads.head;
55 else
56 current_inferior = found;
57}
58
c3e735a6 59int
f450004a 60read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
611cb4a5 61{
c3e735a6
DJ
62 int res;
63 res = (*the_target->read_memory) (memaddr, myaddr, len);
611cb4a5 64 check_mem_read (memaddr, myaddr, len);
c3e735a6 65 return res;
611cb4a5
DJ
66}
67
68int
f450004a
DJ
69write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
70 int len)
0d62e5e8
DJ
71{
72 /* Lacking cleanups, there is some potential for a memory leak if the
73 write fails and we go through error(). Make sure that no more than
74 one buffer is ever pending by making BUFFER static. */
f450004a 75 static unsigned char *buffer = 0;
0d62e5e8
DJ
76 int res;
77
78 if (buffer != NULL)
79 free (buffer);
80
bca929d3 81 buffer = xmalloc (len);
0d62e5e8
DJ
82 memcpy (buffer, myaddr, len);
83 check_mem_write (memaddr, buffer, len);
84 res = (*the_target->write_memory) (memaddr, buffer, len);
85 free (buffer);
86 buffer = NULL;
87
88 return res;
89}
90
5b1c542e 91unsigned long
bd99dc85
PA
92mywait (struct target_waitstatus *ourstatus, int options,
93 int connected_wait)
611cb4a5 94{
5b1c542e 95 unsigned long ret;
0d62e5e8
DJ
96
97 if (connected_wait)
98 server_waiting = 1;
99
bd99dc85
PA
100 ret = (*the_target->wait) (ourstatus, options);
101
102 if (ourstatus->kind == TARGET_WAITKIND_EXITED
103 || ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
104 {
105 if (ourstatus->kind == TARGET_WAITKIND_EXITED)
106 fprintf (stderr,
107 "\nChild exited with status %d\n", ourstatus->value.sig);
108 if (ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
109 fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n",
110 target_signal_to_host (ourstatus->value.sig),
111 target_signal_to_name (ourstatus->value.sig));
112 }
0d62e5e8
DJ
113
114 if (connected_wait)
115 server_waiting = 0;
116
117 return ret;
611cb4a5
DJ
118}
119
bd99dc85
PA
120int
121start_non_stop (int nonstop)
122{
123 if (the_target->start_non_stop == NULL)
124 {
125 if (nonstop)
126 return -1;
127 else
128 return 0;
129 }
130
131 return (*the_target->start_non_stop) (nonstop);
132}
133
ce3a066d
DJ
134void
135set_target_ops (struct target_ops *target)
136{
bca929d3 137 the_target = (struct target_ops *) xmalloc (sizeof (*the_target));
ce3a066d
DJ
138 memcpy (the_target, target, sizeof (*the_target));
139}
This page took 0.522473 seconds and 4 git commands to generate.