1 /* Remote debugging with the XLNT Designs, Inc (XDI) NetROM.
2 Copyright 1990, 1991, 1992, 1995 Free Software Foundation, Inc.
6 15050 Avenue of Science, Suite 106
10 Adapted from work done at Cygnus Support in remote-nindy.c,
11 later merged in by Stan Shebs at Cygnus.
13 This file is part of GDB.
15 This program is free software; you can redistribute it and/or modify
16 it under the terms of the GNU General Public License as published by
17 the Free Software Foundation; either version 2 of the License, or
18 (at your option) any later version.
20 This program is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 GNU General Public License for more details.
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
34 /* Default ports used to talk with the NetROM. */
36 #define DEFAULT_NETROM_LOAD_PORT 1236
37 #define DEFAULT_NETROM_CONTROL_PORT 1237
39 static void nrom_close
PARAMS ((int quitting
));
43 static void nrom_passthru
PARAMS ((char *, int));
45 /* We talk to the NetROM over these sockets. */
47 static serial_t load_desc
= NULL
;
48 static serial_t ctrl_desc
= NULL
;
50 static int load_port
= DEFAULT_NETROM_LOAD_PORT
;
51 static int control_port
= DEFAULT_NETROM_CONTROL_PORT
;
53 static char nrom_hostname
[100];
55 /* Forward data declaration. */
57 extern struct target_ops nrom_ops
;
59 /* Scan input from the remote system, until STRING is found. Print chars that
73 c
= SERIAL_READCHAR (ctrl_desc
, 5);
86 fputc_unfiltered (c
, gdb_stdout
);
101 open_socket (name
, port
)
108 sprintf (sockname
, "%s:%d", name
, port
);
109 desc
= SERIAL_OPEN (sockname
);
111 perror_with_name (sockname
);
119 SERIAL_CLOSE (load_desc
);
123 /* Download a file specified in ARGS to the netROM. */
126 nrom_load (args
, fromtty
)
130 int fd
, rd_amt
, fsize
;
133 char *downloadstring
= "download 0\n";
134 struct cleanup
*old_chain
;
136 /* Tell the netrom to get ready to download. */
137 if (SERIAL_WRITE (ctrl_desc
, downloadstring
, strlen (downloadstring
)))
138 error ("nrom_load: control_send() of `%s' failed", downloadstring
);
140 expect ("Waiting for a connection...\n");
142 load_desc
= open_socket (nrom_hostname
, load_port
);
144 old_chain
= make_cleanup (load_cleanup
, 0);
146 pbfd
= bfd_openr (args
, 0);
150 make_cleanup (bfd_close
, pbfd
);
152 if (!bfd_check_format (pbfd
, bfd_object
))
153 error ("\"%s\": not in executable format: %s",
154 args
, bfd_errmsg (bfd_get_error ()));
156 for (section
= pbfd
->sections
; section
; section
= section
->next
)
158 if (bfd_get_section_flags (pbfd
, section
) & SEC_ALLOC
)
160 bfd_vma section_address
;
161 unsigned long section_size
;
162 const char *section_name
;
164 section_name
= bfd_get_section_name (pbfd
, section
);
165 section_address
= bfd_get_section_vma (pbfd
, section
);
166 section_size
= bfd_section_size (pbfd
, section
);
168 if (bfd_get_section_flags (pbfd
, section
) & SEC_LOAD
)
172 printf_filtered ("[Loading section %s at %x (%d bytes)]\n",
173 section_name
, section_address
,
178 while (section_size
> 0)
183 count
= min (section_size
, 1024);
185 bfd_get_section_contents (pbfd
, section
, buffer
, fptr
,
188 SERIAL_WRITE (load_desc
, buffer
, count
);
189 section_address
+= count
;
191 section_size
-= count
;
194 else /* BSS and such */
196 printf_filtered ("[section %s: not loading]\n",
203 error ("\"%s\": Could not open", args
);
205 do_cleanups (old_chain
);
208 /* Open a connection to the remote NetROM devices. */
211 nrom_open (name
, from_tty
)
217 if (!name
|| strchr (name
, '/') || strchr (name
, ':'))
219 "To open a NetROM connection, you must specify the hostname\n\
220 or IP address of the NetROM device you wish to use.");
222 strcpy (nrom_hostname
, name
);
224 target_preopen (from_tty
);
226 unpush_target (&nrom_ops
);
228 ctrl_desc
= open_socket (nrom_hostname
, control_port
);
230 push_target (&nrom_ops
);
233 printf_filtered ("Connected to NetROM device \"%s\"\n", nrom_hostname
);
236 /* Close out all files and local state before this target loses control. */
239 nrom_close (quitting
)
243 SERIAL_CLOSE (load_desc
);
245 SERIAL_CLOSE (ctrl_desc
);
248 /* Pass arguments directly to the NetROM. */
251 nrom_passthru (args
, fromtty
)
257 sprintf (buf
, "%s\n", args
);
258 if (SERIAL_WRITE (ctrl_desc
, buf
, strlen (buf
)))
259 error ("nrom_reset: control_send() of `%s'failed", args
);
265 unpush_target (&nrom_ops
);
266 generic_mourn_inferior ();
269 /* Define the target vector. */
271 struct target_ops nrom_ops
;
272 static void init_nrom_ops(void)
274 nrom_ops
.to_shortname
= "nrom";
275 nrom_ops
.to_longname
= "Remote XDI `NetROM' target";
276 nrom_ops
.to_doc
= "Remote debug using a NetROM over Ethernet";
277 nrom_ops
.to_open
= nrom_open
;
278 nrom_ops
.to_close
= nrom_close
;
279 nrom_ops
.to_attach
= NULL
;
280 nrom_ops
.to_post_attach
= NULL
;
281 nrom_ops
.to_require_attach
= NULL
;
282 nrom_ops
.to_detach
= NULL
;
283 nrom_ops
.to_require_detach
= NULL
;
284 nrom_ops
.to_resume
= NULL
;
285 nrom_ops
.to_wait
= NULL
;
286 nrom_ops
.to_post_wait
= NULL
;
287 nrom_ops
.to_fetch_registers
= NULL
;
288 nrom_ops
.to_store_registers
= NULL
;
289 nrom_ops
.to_prepare_to_store
= NULL
;
290 nrom_ops
.to_xfer_memory
= NULL
;
291 nrom_ops
.to_files_info
= NULL
;
292 nrom_ops
.to_insert_breakpoint
= NULL
;
293 nrom_ops
.to_remove_breakpoint
= NULL
;
294 nrom_ops
.to_terminal_init
= NULL
;
295 nrom_ops
.to_terminal_inferior
= NULL
;
296 nrom_ops
.to_terminal_ours_for_output
= NULL
;
297 nrom_ops
.to_terminal_ours
= NULL
;
298 nrom_ops
.to_terminal_info
= NULL
;
299 nrom_ops
.to_kill
= nrom_kill
;
300 nrom_ops
.to_load
= nrom_load
;
301 nrom_ops
.to_lookup_symbol
= NULL
;
302 nrom_ops
.to_create_inferior
= NULL
;
303 nrom_ops
.to_post_startup_inferior
= NULL
;
304 nrom_ops
.to_acknowledge_created_inferior
= NULL
;
305 nrom_ops
.to_clone_and_follow_inferior
= NULL
;
306 nrom_ops
.to_post_follow_inferior_by_clone
= NULL
;
307 nrom_ops
.to_insert_fork_catchpoint
= NULL
;
308 nrom_ops
.to_remove_fork_catchpoint
= NULL
;
309 nrom_ops
.to_insert_vfork_catchpoint
= NULL
;
310 nrom_ops
.to_remove_vfork_catchpoint
= NULL
;
311 nrom_ops
.to_has_forked
= NULL
;
312 nrom_ops
.to_has_vforked
= NULL
;
313 nrom_ops
.to_can_follow_vfork_prior_to_exec
= NULL
;
314 nrom_ops
.to_post_follow_vfork
= NULL
;
315 nrom_ops
.to_insert_exec_catchpoint
= NULL
;
316 nrom_ops
.to_remove_exec_catchpoint
= NULL
;
317 nrom_ops
.to_has_execd
= NULL
;
318 nrom_ops
.to_reported_exec_events_per_exec_call
= NULL
;
319 nrom_ops
.to_has_exited
= NULL
;
320 nrom_ops
.to_mourn_inferior
= nrom_mourn
;
321 nrom_ops
.to_can_run
= NULL
;
322 nrom_ops
.to_notice_signals
= 0;
323 nrom_ops
.to_thread_alive
= 0;
324 nrom_ops
.to_stop
= 0;
325 nrom_ops
.to_pid_to_exec_file
= NULL
;
326 nrom_ops
.to_core_file_to_sym_file
= NULL
;
327 nrom_ops
.to_stratum
= download_stratum
;
328 nrom_ops
.DONT_USE
= NULL
;
329 nrom_ops
.to_has_all_memory
= 1;
330 nrom_ops
.to_has_memory
= 1;
331 nrom_ops
.to_has_stack
= 1;
332 nrom_ops
.to_has_registers
= 1;
333 nrom_ops
.to_has_execution
= 0;
334 nrom_ops
.to_sections
= NULL
;
335 nrom_ops
.to_sections_end
= NULL
;
336 nrom_ops
.to_magic
= OPS_MAGIC
;
340 _initialize_remote_nrom ()
343 add_target (&nrom_ops
);
346 add_set_cmd ("nrom_load_port", no_class
, var_zinteger
, (char *)&load_port
,
347 "Set the port to use for NetROM downloads\n", &setlist
),
351 add_set_cmd ("nrom_control_port", no_class
, var_zinteger
, (char *)&control_port
,
352 "Set the port to use for NetROM debugger services\n", &setlist
),
355 add_cmd ("nrom", no_class
, nrom_passthru
,
356 "Pass arguments as command to NetROM",