Do the target-waiting within do_initial_child_stuff on Windows.
[deliverable/binutils-gdb.git] / gdb / gdbserver / target.c
CommitLineData
ce3a066d 1/* Target operations for the remote server for GDB.
28e7fd62 2 Copyright (C) 2002-2013 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)
37 current_inferior = (struct thread_info *) all_threads.head;
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
51int
f450004a
DJ
52write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
53 int len)
0d62e5e8
DJ
54{
55 /* Lacking cleanups, there is some potential for a memory leak if the
56 write fails and we go through error(). Make sure that no more than
57 one buffer is ever pending by making BUFFER static. */
f450004a 58 static unsigned char *buffer = 0;
0d62e5e8
DJ
59 int res;
60
61 if (buffer != NULL)
62 free (buffer);
63
bca929d3 64 buffer = xmalloc (len);
0d62e5e8 65 memcpy (buffer, myaddr, len);
b9fd1791 66 check_mem_write (memaddr, buffer, myaddr, len);
0d62e5e8
DJ
67 res = (*the_target->write_memory) (memaddr, buffer, len);
68 free (buffer);
69 buffer = NULL;
70
71 return res;
72}
73
95954743
PA
74ptid_t
75mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options,
bd99dc85 76 int connected_wait)
611cb4a5 77{
95954743 78 ptid_t ret;
0d62e5e8
DJ
79
80 if (connected_wait)
81 server_waiting = 1;
82
95954743 83 ret = (*the_target->wait) (ptid, ourstatus, options);
bd99dc85 84
4210d83e
PA
85 /* We don't expose _LOADED events to gdbserver core. See the
86 `dlls_changed' global. */
87 if (ourstatus->kind == TARGET_WAITKIND_LOADED)
88 ourstatus->kind = TARGET_WAITKIND_STOPPED;
89
1a3d890b
PA
90 /* If GDB is connected through TCP/serial, then GDBserver will most
91 probably be running on its own terminal/console, so it's nice to
92 print there why is GDBserver exiting. If however, GDB is
93 connected through stdio, then there's no need to spam the GDB
94 console with this -- the user will already see the exit through
95 regular GDB output, in that same terminal. */
96 if (!remote_connection_is_stdio ())
97 {
98 if (ourstatus->kind == TARGET_WAITKIND_EXITED)
99 fprintf (stderr,
100 "\nChild exited with status %d\n", ourstatus->value.integer);
101 else if (ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
102 fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n",
103 gdb_signal_to_host (ourstatus->value.sig),
104 gdb_signal_to_name (ourstatus->value.sig));
105 }
0d62e5e8
DJ
106
107 if (connected_wait)
108 server_waiting = 0;
109
110 return ret;
611cb4a5
DJ
111}
112
bd99dc85
PA
113int
114start_non_stop (int nonstop)
115{
116 if (the_target->start_non_stop == NULL)
117 {
118 if (nonstop)
119 return -1;
120 else
121 return 0;
122 }
123
124 return (*the_target->start_non_stop) (nonstop);
125}
126
ce3a066d
DJ
127void
128set_target_ops (struct target_ops *target)
129{
bca929d3 130 the_target = (struct target_ops *) xmalloc (sizeof (*the_target));
ce3a066d
DJ
131 memcpy (the_target, target, sizeof (*the_target));
132}
95954743
PA
133
134/* Convert pid to printable format. */
135
136const char *
137target_pid_to_str (ptid_t ptid)
138{
139 static char buf[80];
140
141 if (ptid_equal (ptid, minus_one_ptid))
6cebaf6e 142 xsnprintf (buf, sizeof (buf), "<all threads>");
95954743 143 else if (ptid_equal (ptid, null_ptid))
6cebaf6e 144 xsnprintf (buf, sizeof (buf), "<null thread>");
95954743 145 else if (ptid_get_tid (ptid) != 0)
6cebaf6e 146 xsnprintf (buf, sizeof (buf), "Thread %d.0x%lx",
147 ptid_get_pid (ptid), ptid_get_tid (ptid));
95954743 148 else if (ptid_get_lwp (ptid) != 0)
6cebaf6e 149 xsnprintf (buf, sizeof (buf), "LWP %d.%ld",
150 ptid_get_pid (ptid), ptid_get_lwp (ptid));
95954743 151 else
6cebaf6e 152 xsnprintf (buf, sizeof (buf), "Process %d",
153 ptid_get_pid (ptid));
95954743
PA
154
155 return buf;
156}
8336d594 157
7255706c
YQ
158int
159kill_inferior (int pid)
160{
161 gdb_agent_about_to_close (pid);
162
163 return (*the_target->kill) (pid);
164}
This page took 0.877835 seconds and 4 git commands to generate.