]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/gdbserver/target.c
Implement TARGET_WAITKIND_NO_RESUMED in the remote protocol
[thirdparty/binutils-gdb.git] / gdb / gdbserver / target.c
CommitLineData
ce3a066d 1/* Target operations for the remote server for GDB.
32d0add0 2 Copyright (C) 2002-2015 Free Software Foundation, Inc.
ce3a066d
DJ
3
4 Contributed by MontaVista Software.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
ce3a066d
DJ
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
ce3a066d
DJ
20
21#include "server.h"
c144c7a0 22#include "tracepoint.h"
ce3a066d
DJ
23
24struct target_ops *the_target;
25
f0db101d 26int
0bfdf32f 27set_desired_thread (int use_general)
0d62e5e8
DJ
28{
29 struct thread_info *found;
30
31 if (use_general == 1)
e09875d4 32 found = find_thread_ptid (general_thread);
0d62e5e8 33 else
943ca1dd 34 found = find_thread_ptid (cont_thread);
0d62e5e8 35
f0db101d
PA
36 current_thread = found;
37 return (current_thread != NULL);
0d62e5e8
DJ
38}
39
c3e735a6 40int
f450004a 41read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
611cb4a5 42{
c3e735a6
DJ
43 int res;
44 res = (*the_target->read_memory) (memaddr, myaddr, len);
611cb4a5 45 check_mem_read (memaddr, myaddr, len);
c3e735a6 46 return res;
611cb4a5
DJ
47}
48
721ec300
GB
49/* See target/target.h. */
50
51int
52target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
53{
54 return read_inferior_memory (memaddr, myaddr, len);
55}
56
57/* See target/target.h. */
58
59int
60target_read_uint32 (CORE_ADDR memaddr, uint32_t *result)
61{
62 return read_inferior_memory (memaddr, (gdb_byte *) result, sizeof (*result));
63}
64
611cb4a5 65int
f450004a
DJ
66write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
67 int len)
0d62e5e8
DJ
68{
69 /* Lacking cleanups, there is some potential for a memory leak if the
70 write fails and we go through error(). Make sure that no more than
71 one buffer is ever pending by making BUFFER static. */
f450004a 72 static unsigned char *buffer = 0;
0d62e5e8
DJ
73 int res;
74
75 if (buffer != NULL)
76 free (buffer);
77
224c3ddb 78 buffer = (unsigned char *) xmalloc (len);
0d62e5e8 79 memcpy (buffer, myaddr, len);
b9fd1791 80 check_mem_write (memaddr, buffer, myaddr, len);
0d62e5e8
DJ
81 res = (*the_target->write_memory) (memaddr, buffer, len);
82 free (buffer);
83 buffer = NULL;
84
85 return res;
86}
87
721ec300
GB
88/* See target/target.h. */
89
90int
91target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
92{
93 return write_inferior_memory (memaddr, myaddr, len);
94}
95
95954743
PA
96ptid_t
97mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options,
bd99dc85 98 int connected_wait)
611cb4a5 99{
95954743 100 ptid_t ret;
0d62e5e8
DJ
101
102 if (connected_wait)
103 server_waiting = 1;
104
95954743 105 ret = (*the_target->wait) (ptid, ourstatus, options);
bd99dc85 106
4210d83e
PA
107 /* We don't expose _LOADED events to gdbserver core. See the
108 `dlls_changed' global. */
109 if (ourstatus->kind == TARGET_WAITKIND_LOADED)
110 ourstatus->kind = TARGET_WAITKIND_STOPPED;
111
1a3d890b
PA
112 /* If GDB is connected through TCP/serial, then GDBserver will most
113 probably be running on its own terminal/console, so it's nice to
114 print there why is GDBserver exiting. If however, GDB is
115 connected through stdio, then there's no need to spam the GDB
116 console with this -- the user will already see the exit through
117 regular GDB output, in that same terminal. */
118 if (!remote_connection_is_stdio ())
119 {
120 if (ourstatus->kind == TARGET_WAITKIND_EXITED)
121 fprintf (stderr,
122 "\nChild exited with status %d\n", ourstatus->value.integer);
123 else if (ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
124 fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n",
125 gdb_signal_to_host (ourstatus->value.sig),
126 gdb_signal_to_name (ourstatus->value.sig));
127 }
0d62e5e8
DJ
128
129 if (connected_wait)
130 server_waiting = 0;
131
132 return ret;
611cb4a5
DJ
133}
134
f8c1d06b
GB
135/* See target/target.h. */
136
137void
03f4463b 138target_stop_and_wait (ptid_t ptid)
f8c1d06b
GB
139{
140 struct target_waitstatus status;
141 int was_non_stop = non_stop;
142 struct thread_resume resume_info;
143
144 resume_info.thread = ptid;
145 resume_info.kind = resume_stop;
146 resume_info.sig = GDB_SIGNAL_0;
147 (*the_target->resume) (&resume_info, 1);
148
149 non_stop = 1;
150 mywait (ptid, &status, 0, 0);
151 non_stop = was_non_stop;
152}
153
154/* See target/target.h. */
155
156void
03f4463b 157target_continue_no_signal (ptid_t ptid)
f8c1d06b
GB
158{
159 struct thread_resume resume_info;
160
161 resume_info.thread = ptid;
162 resume_info.kind = resume_continue;
163 resume_info.sig = GDB_SIGNAL_0;
164 (*the_target->resume) (&resume_info, 1);
165}
166
bd99dc85
PA
167int
168start_non_stop (int nonstop)
169{
170 if (the_target->start_non_stop == NULL)
171 {
172 if (nonstop)
173 return -1;
174 else
175 return 0;
176 }
177
178 return (*the_target->start_non_stop) (nonstop);
179}
180
ce3a066d
DJ
181void
182set_target_ops (struct target_ops *target)
183{
8d749320 184 the_target = XNEW (struct target_ops);
ce3a066d
DJ
185 memcpy (the_target, target, sizeof (*the_target));
186}
95954743
PA
187
188/* Convert pid to printable format. */
189
190const char *
191target_pid_to_str (ptid_t ptid)
192{
193 static char buf[80];
194
195 if (ptid_equal (ptid, minus_one_ptid))
6cebaf6e 196 xsnprintf (buf, sizeof (buf), "<all threads>");
95954743 197 else if (ptid_equal (ptid, null_ptid))
6cebaf6e 198 xsnprintf (buf, sizeof (buf), "<null thread>");
95954743 199 else if (ptid_get_tid (ptid) != 0)
6cebaf6e 200 xsnprintf (buf, sizeof (buf), "Thread %d.0x%lx",
201 ptid_get_pid (ptid), ptid_get_tid (ptid));
95954743 202 else if (ptid_get_lwp (ptid) != 0)
6cebaf6e 203 xsnprintf (buf, sizeof (buf), "LWP %d.%ld",
204 ptid_get_pid (ptid), ptid_get_lwp (ptid));
95954743 205 else
6cebaf6e 206 xsnprintf (buf, sizeof (buf), "Process %d",
207 ptid_get_pid (ptid));
95954743
PA
208
209 return buf;
210}
8336d594 211
7255706c
YQ
212int
213kill_inferior (int pid)
214{
215 gdb_agent_about_to_close (pid);
216
217 return (*the_target->kill) (pid);
218}
70b90b91
YQ
219
220/* Target can do hardware single step. */
221
222int
223target_can_do_hardware_single_step (void)
224{
225 return 1;
226}
2e6ee069
AT
227
228/* Default implementation for breakpoint_kind_for_pc.
229
230 The default behavior for targets that don't implement breakpoint_kind_for_pc
231 is to use the size of a breakpoint as the kind. */
232
233int
234default_breakpoint_kind_from_pc (CORE_ADDR *pcptr)
235{
236 int size = 0;
237
238 gdb_assert (the_target->sw_breakpoint_from_kind != NULL);
239
240 (*the_target->sw_breakpoint_from_kind) (0, &size);
241 return size;
242}