2002-02-19 Daniel Jacobowitz <drow@mvista.com>
[deliverable/binutils-gdb.git] / gdb / remote-nrom.c
CommitLineData
c906108c 1/* Remote debugging with the XLNT Designs, Inc (XDI) NetROM.
b6ba6518
KB
2 Copyright 1990, 1991, 1992, 1995, 1998, 1999, 2000
3 Free Software Foundation, Inc.
c906108c 4 Contributed by:
c5aa993b
JM
5 Roger Moyers
6 XLNT Designs, Inc.
7 15050 Avenue of Science, Suite 106
8 San Diego, CA 92128
9 (619)487-9320
10 roger@xlnt.com
c906108c
SS
11 Adapted from work done at Cygnus Support in remote-nindy.c,
12 later merged in by Stan Shebs at Cygnus.
13
c5aa993b 14 This file is part of GDB.
c906108c 15
c5aa993b
JM
16 This program is free software; you can redistribute it and/or modify
17 it under the terms of the GNU General Public License as published by
18 the Free Software Foundation; either version 2 of the License, or
19 (at your option) any later version.
c906108c 20
c5aa993b
JM
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
c906108c 25
c5aa993b
JM
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 59 Temple Place - Suite 330,
29 Boston, MA 02111-1307, USA. */
c906108c
SS
30
31#include "defs.h"
32#include "gdbcmd.h"
33#include "serial.h"
34#include "target.h"
35
36/* Default ports used to talk with the NetROM. */
37
38#define DEFAULT_NETROM_LOAD_PORT 1236
39#define DEFAULT_NETROM_CONTROL_PORT 1237
40
a14ed312 41static void nrom_close (int quitting);
c906108c
SS
42
43/* New commands. */
44
a14ed312 45static void nrom_passthru (char *, int);
c906108c
SS
46
47/* We talk to the NetROM over these sockets. */
48
819cc324
AC
49static struct serial *load_desc = NULL;
50static struct serial *ctrl_desc = NULL;
c906108c
SS
51
52static int load_port = DEFAULT_NETROM_LOAD_PORT;
53static int control_port = DEFAULT_NETROM_CONTROL_PORT;
54
55static char nrom_hostname[100];
56
57/* Forward data declaration. */
58
59extern struct target_ops nrom_ops;
60
61/* Scan input from the remote system, until STRING is found. Print chars that
62 don't match. */
63
64static int
fba45db2 65expect (char *string)
c906108c
SS
66{
67 char *p = string;
68 int c;
69
8edbea78 70 immediate_quit++;
c906108c
SS
71
72 while (1)
73 {
2cd58942 74 c = serial_readchar (ctrl_desc, 5);
c906108c
SS
75
76 if (c == *p++)
77 {
78 if (*p == '\0')
79 {
8edbea78 80 immediate_quit--;
c906108c
SS
81 return 0;
82 }
83 }
84 else
85 {
86 fputc_unfiltered (c, gdb_stdout);
87 p = string;
88 if (c == *p)
89 p++;
90 }
91 }
92}
93
94static void
fba45db2 95nrom_kill (void)
c906108c
SS
96{
97 nrom_close (0);
98}
99
819cc324 100static struct serial *
fba45db2 101open_socket (char *name, int port)
c906108c
SS
102{
103 char sockname[100];
819cc324 104 struct serial *desc;
c906108c
SS
105
106 sprintf (sockname, "%s:%d", name, port);
2cd58942 107 desc = serial_open (sockname);
c906108c
SS
108 if (!desc)
109 perror_with_name (sockname);
110
111 return desc;
112}
113
114static void
fba45db2 115load_cleanup (void)
c906108c 116{
2cd58942 117 serial_close (load_desc);
c906108c
SS
118 load_desc = NULL;
119}
120
121/* Download a file specified in ARGS to the netROM. */
122
123static void
fba45db2 124nrom_load (char *args, int fromtty)
c906108c
SS
125{
126 int fd, rd_amt, fsize;
127 bfd *pbfd;
128 asection *section;
129 char *downloadstring = "download 0\n";
130 struct cleanup *old_chain;
131
132 /* Tell the netrom to get ready to download. */
2cd58942 133 if (serial_write (ctrl_desc, downloadstring, strlen (downloadstring)))
c906108c
SS
134 error ("nrom_load: control_send() of `%s' failed", downloadstring);
135
136 expect ("Waiting for a connection...\n");
137
138 load_desc = open_socket (nrom_hostname, load_port);
139
140 old_chain = make_cleanup (load_cleanup, 0);
141
142 pbfd = bfd_openr (args, 0);
143
144 if (pbfd)
145 {
146 make_cleanup (bfd_close, pbfd);
147
c5aa993b 148 if (!bfd_check_format (pbfd, bfd_object))
c906108c
SS
149 error ("\"%s\": not in executable format: %s",
150 args, bfd_errmsg (bfd_get_error ()));
151
c5aa993b 152 for (section = pbfd->sections; section; section = section->next)
c906108c
SS
153 {
154 if (bfd_get_section_flags (pbfd, section) & SEC_ALLOC)
155 {
156 bfd_vma section_address;
157 unsigned long section_size;
158 const char *section_name;
159
160 section_name = bfd_get_section_name (pbfd, section);
161 section_address = bfd_get_section_vma (pbfd, section);
162 section_size = bfd_section_size (pbfd, section);
163
164 if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)
165 {
166 file_ptr fptr;
167
168 printf_filtered ("[Loading section %s at %x (%d bytes)]\n",
169 section_name, section_address,
170 section_size);
171
172 fptr = 0;
173
174 while (section_size > 0)
175 {
176 char buffer[1024];
177 int count;
c5aa993b 178
c906108c
SS
179 count = min (section_size, 1024);
180
181 bfd_get_section_contents (pbfd, section, buffer, fptr,
182 count);
183
2cd58942 184 serial_write (load_desc, buffer, count);
c906108c
SS
185 section_address += count;
186 fptr += count;
187 section_size -= count;
188 }
189 }
c5aa993b
JM
190 else
191 /* BSS and such */
c906108c
SS
192 {
193 printf_filtered ("[section %s: not loading]\n",
194 section_name);
195 }
196 }
197 }
198 }
199 else
200 error ("\"%s\": Could not open", args);
201
202 do_cleanups (old_chain);
203}
204
205/* Open a connection to the remote NetROM devices. */
206
207static void
fba45db2 208nrom_open (char *name, int from_tty)
c906108c
SS
209{
210 int errn;
211
212 if (!name || strchr (name, '/') || strchr (name, ':'))
213 error (
c5aa993b 214 "To open a NetROM connection, you must specify the hostname\n\
c906108c
SS
215or IP address of the NetROM device you wish to use.");
216
217 strcpy (nrom_hostname, name);
218
219 target_preopen (from_tty);
220
221 unpush_target (&nrom_ops);
222
223 ctrl_desc = open_socket (nrom_hostname, control_port);
224
225 push_target (&nrom_ops);
226
227 if (from_tty)
228 printf_filtered ("Connected to NetROM device \"%s\"\n", nrom_hostname);
229}
230
231/* Close out all files and local state before this target loses control. */
232
233static void
fba45db2 234nrom_close (int quitting)
c906108c
SS
235{
236 if (load_desc)
2cd58942 237 serial_close (load_desc);
c906108c 238 if (ctrl_desc)
2cd58942 239 serial_close (ctrl_desc);
c906108c
SS
240}
241
242/* Pass arguments directly to the NetROM. */
243
244static void
fba45db2 245nrom_passthru (char *args, int fromtty)
c906108c
SS
246{
247 char buf[1024];
248
249 sprintf (buf, "%s\n", args);
2cd58942 250 if (serial_write (ctrl_desc, buf, strlen (buf)))
c906108c
SS
251 error ("nrom_reset: control_send() of `%s'failed", args);
252}
253
254static void
fba45db2 255nrom_mourn (void)
c5aa993b 256{
c906108c
SS
257 unpush_target (&nrom_ops);
258 generic_mourn_inferior ();
259}
260
261/* Define the target vector. */
262
c5aa993b 263struct target_ops nrom_ops;
c906108c 264
c5aa993b
JM
265static void
266init_nrom_ops (void)
c906108c 267{
c5aa993b
JM
268 nrom_ops.to_shortname = "nrom";
269 nrom_ops.to_longname = "Remote XDI `NetROM' target";
270 nrom_ops.to_doc = "Remote debug using a NetROM over Ethernet";
271 nrom_ops.to_open = nrom_open;
272 nrom_ops.to_close = nrom_close;
273 nrom_ops.to_attach = NULL;
c906108c 274 nrom_ops.to_post_attach = NULL;
c5aa993b
JM
275 nrom_ops.to_require_attach = NULL;
276 nrom_ops.to_detach = NULL;
277 nrom_ops.to_require_detach = NULL;
278 nrom_ops.to_resume = NULL;
279 nrom_ops.to_wait = NULL;
280 nrom_ops.to_post_wait = NULL;
281 nrom_ops.to_fetch_registers = NULL;
282 nrom_ops.to_store_registers = NULL;
283 nrom_ops.to_prepare_to_store = NULL;
284 nrom_ops.to_xfer_memory = NULL;
285 nrom_ops.to_files_info = NULL;
286 nrom_ops.to_insert_breakpoint = NULL;
287 nrom_ops.to_remove_breakpoint = NULL;
288 nrom_ops.to_terminal_init = NULL;
289 nrom_ops.to_terminal_inferior = NULL;
290 nrom_ops.to_terminal_ours_for_output = NULL;
291 nrom_ops.to_terminal_ours = NULL;
292 nrom_ops.to_terminal_info = NULL;
293 nrom_ops.to_kill = nrom_kill;
294 nrom_ops.to_load = nrom_load;
295 nrom_ops.to_lookup_symbol = NULL;
296 nrom_ops.to_create_inferior = NULL;
c906108c
SS
297 nrom_ops.to_post_startup_inferior = NULL;
298 nrom_ops.to_acknowledge_created_inferior = NULL;
299 nrom_ops.to_clone_and_follow_inferior = NULL;
300 nrom_ops.to_post_follow_inferior_by_clone = NULL;
301 nrom_ops.to_insert_fork_catchpoint = NULL;
302 nrom_ops.to_remove_fork_catchpoint = NULL;
303 nrom_ops.to_insert_vfork_catchpoint = NULL;
304 nrom_ops.to_remove_vfork_catchpoint = NULL;
305 nrom_ops.to_has_forked = NULL;
306 nrom_ops.to_has_vforked = NULL;
307 nrom_ops.to_can_follow_vfork_prior_to_exec = NULL;
c5aa993b 308 nrom_ops.to_post_follow_vfork = NULL;
c906108c
SS
309 nrom_ops.to_insert_exec_catchpoint = NULL;
310 nrom_ops.to_remove_exec_catchpoint = NULL;
311 nrom_ops.to_has_execd = NULL;
312 nrom_ops.to_reported_exec_events_per_exec_call = NULL;
313 nrom_ops.to_has_exited = NULL;
c5aa993b
JM
314 nrom_ops.to_mourn_inferior = nrom_mourn;
315 nrom_ops.to_can_run = NULL;
316 nrom_ops.to_notice_signals = 0;
317 nrom_ops.to_thread_alive = 0;
318 nrom_ops.to_stop = 0;
c906108c 319 nrom_ops.to_pid_to_exec_file = NULL;
c5aa993b
JM
320 nrom_ops.to_stratum = download_stratum;
321 nrom_ops.DONT_USE = NULL;
322 nrom_ops.to_has_all_memory = 1;
323 nrom_ops.to_has_memory = 1;
324 nrom_ops.to_has_stack = 1;
325 nrom_ops.to_has_registers = 1;
326 nrom_ops.to_has_execution = 0;
327 nrom_ops.to_sections = NULL;
328 nrom_ops.to_sections_end = NULL;
329 nrom_ops.to_magic = OPS_MAGIC;
3172dc30 330}
c906108c
SS
331
332void
fba45db2 333_initialize_remote_nrom (void)
c906108c 334{
c5aa993b 335 init_nrom_ops ();
c906108c
SS
336 add_target (&nrom_ops);
337
338 add_show_from_set (
c5aa993b
JM
339 add_set_cmd ("nrom_load_port", no_class, var_zinteger, (char *) &load_port,
340 "Set the port to use for NetROM downloads\n", &setlist),
341 &showlist);
c906108c
SS
342
343 add_show_from_set (
c5aa993b
JM
344 add_set_cmd ("nrom_control_port", no_class, var_zinteger, (char *) &control_port,
345 "Set the port to use for NetROM debugger services\n", &setlist),
346 &showlist);
c906108c
SS
347
348 add_cmd ("nrom", no_class, nrom_passthru,
349 "Pass arguments as command to NetROM",
350 &cmdlist);
351}
This page took 0.216855 seconds and 4 git commands to generate.