Introduce common/symbol.h
[deliverable/binutils-gdb.git] / gdb / gdbserver / target.c
CommitLineData
ce3a066d 1/* Target operations for the remote server for GDB.
ecd75fc8 2 Copyright (C) 2002-2014 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
0d62e5e8
DJ
26void
27set_desired_inferior (int use_general)
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
DJ
35
36 if (found == NULL)
649ebbca 37 current_inferior = get_first_thread ();
0d62e5e8
DJ
38 else
39 current_inferior = found;
40}
41
c3e735a6 42int
f450004a 43read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
611cb4a5 44{
c3e735a6
DJ
45 int res;
46 res = (*the_target->read_memory) (memaddr, myaddr, len);
611cb4a5 47 check_mem_read (memaddr, myaddr, len);
c3e735a6 48 return res;
611cb4a5
DJ
49}
50
721ec300
GB
51/* See target/target.h. */
52
53int
54target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
55{
56 return read_inferior_memory (memaddr, myaddr, len);
57}
58
59/* See target/target.h. */
60
61int
62target_read_uint32 (CORE_ADDR memaddr, uint32_t *result)
63{
64 return read_inferior_memory (memaddr, (gdb_byte *) result, sizeof (*result));
65}
66
611cb4a5 67int
f450004a
DJ
68write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
69 int len)
0d62e5e8
DJ
70{
71 /* Lacking cleanups, there is some potential for a memory leak if the
72 write fails and we go through error(). Make sure that no more than
73 one buffer is ever pending by making BUFFER static. */
f450004a 74 static unsigned char *buffer = 0;
0d62e5e8
DJ
75 int res;
76
77 if (buffer != NULL)
78 free (buffer);
79
bca929d3 80 buffer = xmalloc (len);
0d62e5e8 81 memcpy (buffer, myaddr, len);
b9fd1791 82 check_mem_write (memaddr, buffer, myaddr, len);
0d62e5e8
DJ
83 res = (*the_target->write_memory) (memaddr, buffer, len);
84 free (buffer);
85 buffer = NULL;
86
87 return res;
88}
89
721ec300
GB
90/* See target/target.h. */
91
92int
93target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
94{
95 return write_inferior_memory (memaddr, myaddr, len);
96}
97
95954743
PA
98ptid_t
99mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options,
bd99dc85 100 int connected_wait)
611cb4a5 101{
95954743 102 ptid_t ret;
0d62e5e8
DJ
103
104 if (connected_wait)
105 server_waiting = 1;
106
95954743 107 ret = (*the_target->wait) (ptid, ourstatus, options);
bd99dc85 108
4210d83e
PA
109 /* We don't expose _LOADED events to gdbserver core. See the
110 `dlls_changed' global. */
111 if (ourstatus->kind == TARGET_WAITKIND_LOADED)
112 ourstatus->kind = TARGET_WAITKIND_STOPPED;
113
1a3d890b
PA
114 /* If GDB is connected through TCP/serial, then GDBserver will most
115 probably be running on its own terminal/console, so it's nice to
116 print there why is GDBserver exiting. If however, GDB is
117 connected through stdio, then there's no need to spam the GDB
118 console with this -- the user will already see the exit through
119 regular GDB output, in that same terminal. */
120 if (!remote_connection_is_stdio ())
121 {
122 if (ourstatus->kind == TARGET_WAITKIND_EXITED)
123 fprintf (stderr,
124 "\nChild exited with status %d\n", ourstatus->value.integer);
125 else if (ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
126 fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n",
127 gdb_signal_to_host (ourstatus->value.sig),
128 gdb_signal_to_name (ourstatus->value.sig));
129 }
0d62e5e8
DJ
130
131 if (connected_wait)
132 server_waiting = 0;
133
134 return ret;
611cb4a5
DJ
135}
136
f8c1d06b
GB
137/* See target/target.h. */
138
139void
140target_stop_ptid (ptid_t ptid)
141{
142 struct target_waitstatus status;
143 int was_non_stop = non_stop;
144 struct thread_resume resume_info;
145
146 resume_info.thread = ptid;
147 resume_info.kind = resume_stop;
148 resume_info.sig = GDB_SIGNAL_0;
149 (*the_target->resume) (&resume_info, 1);
150
151 non_stop = 1;
152 mywait (ptid, &status, 0, 0);
153 non_stop = was_non_stop;
154}
155
156/* See target/target.h. */
157
158void
159target_continue_ptid (ptid_t ptid)
160{
161 struct thread_resume resume_info;
162
163 resume_info.thread = ptid;
164 resume_info.kind = resume_continue;
165 resume_info.sig = GDB_SIGNAL_0;
166 (*the_target->resume) (&resume_info, 1);
167}
168
bd99dc85
PA
169int
170start_non_stop (int nonstop)
171{
172 if (the_target->start_non_stop == NULL)
173 {
174 if (nonstop)
175 return -1;
176 else
177 return 0;
178 }
179
180 return (*the_target->start_non_stop) (nonstop);
181}
182
ce3a066d
DJ
183void
184set_target_ops (struct target_ops *target)
185{
bca929d3 186 the_target = (struct target_ops *) xmalloc (sizeof (*the_target));
ce3a066d
DJ
187 memcpy (the_target, target, sizeof (*the_target));
188}
95954743
PA
189
190/* Convert pid to printable format. */
191
192const char *
193target_pid_to_str (ptid_t ptid)
194{
195 static char buf[80];
196
197 if (ptid_equal (ptid, minus_one_ptid))
6cebaf6e 198 xsnprintf (buf, sizeof (buf), "<all threads>");
95954743 199 else if (ptid_equal (ptid, null_ptid))
6cebaf6e 200 xsnprintf (buf, sizeof (buf), "<null thread>");
95954743 201 else if (ptid_get_tid (ptid) != 0)
6cebaf6e 202 xsnprintf (buf, sizeof (buf), "Thread %d.0x%lx",
203 ptid_get_pid (ptid), ptid_get_tid (ptid));
95954743 204 else if (ptid_get_lwp (ptid) != 0)
6cebaf6e 205 xsnprintf (buf, sizeof (buf), "LWP %d.%ld",
206 ptid_get_pid (ptid), ptid_get_lwp (ptid));
95954743 207 else
6cebaf6e 208 xsnprintf (buf, sizeof (buf), "Process %d",
209 ptid_get_pid (ptid));
95954743
PA
210
211 return buf;
212}
8336d594 213
7255706c
YQ
214int
215kill_inferior (int pid)
216{
217 gdb_agent_about_to_close (pid);
218
219 return (*the_target->kill) (pid);
220}
This page took 0.960786 seconds and 4 git commands to generate.