#include "defs.h"
#include "inferior.h"
+#include "symfile.h"
#include "bfd.h"
#include "wait.h"
#include "gdbcmd.h"
/* This can be set to get debugging with ``set remotedebug''. */
static int mips_debug = 0;
-/* Read a character from the remote, aborting on error. Returns -2 on
- timeout (since that's what serial_readchar returns). FIXME: If we
- see the string "<IDT>" from the board, then we are debugging on the
- main console port, and we have somehow dropped out of remote
- debugging mode. In this case, we automatically go back in to
- remote debugging mode. This is a hack, put in because I can't find
- any way for a program running on the remote board to terminate
- without also ending remote debugging mode. I assume users won't
- have any trouble with this; for one thing, the IDT documentation
- generally assumes that the remote debugging port is not the console
- port. This is, however, very convenient for DejaGnu when you only
- have one connected serial port. */
+/* Handle used to access serial I/O stream. */
+static serial_t mips_desc;
+
+/* Read a character from the remote, aborting on error. Returns
+ SERIAL_TIMEOUT on timeout (since that's what SERIAL_READCHAR
+ returns). FIXME: If we see the string "<IDT>" from the board, then
+ we are debugging on the main console port, and we have somehow
+ dropped out of remote debugging mode. In this case, we
+ automatically go back in to remote debugging mode. This is a hack,
+ put in because I can't find any way for a program running on the
+ remote board to terminate without also ending remote debugging
+ mode. I assume users won't have any trouble with this; for one
+ thing, the IDT documentation generally assumes that the remote
+ debugging port is not the console port. This is, however, very
+ convenient for DejaGnu when you only have one connected serial
+ port. */
static int
mips_readchar (timeout)
static int state = 0;
static char nextstate[5] = { '<', 'I', 'D', 'T', '>' };
- ch = serial_readchar (timeout);
- if (ch == EOF)
+ ch = SERIAL_READCHAR (mips_desc, timeout);
+ if (ch == SERIAL_EOF)
error ("End of file from remote");
- if (ch == -3)
+ if (ch == SERIAL_ERROR)
error ("Error reading from remote: %s", safe_strerror (errno));
if (mips_debug > 1)
{
- if (ch != -2)
+ if (ch != SERIAL_TIMEOUT)
printf_filtered ("Read '%c' %d 0x%x\n", ch, ch, ch);
else
printf_filtered ("Timed out in read\n");
described above. The first character in a packet after the SYN
(which is not echoed) is always an @ unless the packet is more
than 64 characters long, which ours never are. */
- if ((ch == -2 || ch == '@')
+ if ((ch == SERIAL_TIMEOUT || ch == '@')
&& state == 5
&& ! mips_initializing)
{
if (mips_debug > 0)
printf_filtered ("Reinitializing MIPS debugging mode\n");
- serial_write ("\rdb tty0\r", sizeof "\rdb tty0\r" - 1);
+ SERIAL_WRITE (mips_desc, "\rdb tty0\r", sizeof "\rdb tty0\r" - 1);
sleep (1);
mips_need_reply = 0;
while (ch != SYN)
{
ch = mips_readchar (timeout);
- if (ch == -2)
+ if (ch == SERIAL_TIMEOUT)
return -1;
if (ch != SYN)
{
for (i = 1; i < HDR_LENGTH; i++)
{
ch = mips_readchar (timeout);
- if (ch == -2)
+ if (ch == SERIAL_TIMEOUT)
return -1;
/* Make sure this is a header byte. */
{
ch = mips_readchar (timeout);
*pch = ch;
- if (ch == -2)
+ if (ch == SERIAL_TIMEOUT)
return -1;
if (! TRLR_CHECK (ch))
return -2;
printf_filtered ("Writing \"%s\"\n", packet + 1);
}
- if (serial_write (packet, HDR_LENGTH + len + TRLR_LENGTH) == 0)
+ if (SERIAL_WRITE (mips_desc, packet,
+ HDR_LENGTH + len + TRLR_LENGTH) != 0)
error ("write to target failed: %s", safe_strerror (errno));
garbage = 0;
ch = SYN;
break;
}
- if (rch == -2)
+ if (rch == SERIAL_TIMEOUT)
error ("Timed out waiting for remote packet");
buff[i] = rch;
}
ack + 1);
}
- if (serial_write (ack, HDR_LENGTH + TRLR_LENGTH) == 0)
+ if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
error ("write to target failed: %s", safe_strerror (errno));
}
ack + 1);
}
- if (serial_write (ack, HDR_LENGTH + TRLR_LENGTH) == 0)
+ if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
error ("write to target failed: %s", safe_strerror (errno));
return len;
it means. The packet seems to be triggered by a carriage return
character, although perhaps any character would do. */
cr = '\r';
- serial_write (&cr, 1);
+ SERIAL_WRITE (mips_desc, &cr, 1);
hold_wait = mips_receive_wait;
mips_receive_wait = 3;
board and trying again. */
printf_filtered ("Failed to initialize; trying to reset board\n");
cc = '\003';
- serial_write (&cc, 1);
+ SERIAL_WRITE (mips_desc, &cc, 1);
sleep (2);
- serial_write ("\rdb tty0\r", sizeof "\rdb tty0\r" - 1);
+ SERIAL_WRITE (mips_desc, "\rdb tty0\r", sizeof "\rdb tty0\r" - 1);
sleep (1);
cr = '\r';
- serial_write (&cr, 1);
+ SERIAL_WRITE (mips_desc, &cr, 1);
}
mips_receive_wait = hold_wait;
if (mips_is_open)
unpush_target (&mips_ops);
- if (serial_open (name) == 0)
+ mips_desc = SERIAL_OPEN (name);
+ if (mips_desc == (serial_t) NULL)
perror_with_name (name);
+ SERIAL_RAW (mips_desc);
+
mips_is_open = 1;
mips_initialize ();
/* Get the board out of remote debugging mode. */
mips_request ('x', (unsigned int) 0, (unsigned int) 0, &err);
- serial_close ();
+ SERIAL_CLOSE (mips_desc);
}
}
/* Send a ^C. */
cc = '\003';
- serial_write (&cc, 1);
+ SERIAL_WRITE (mips_desc, &cc, 1);
sleep (1);
target_mourn_inferior ();
}
#endif
}
-/* Load an executable onto the board. */
-
-static void
-mips_load (args, from_tty)
- char *args;
- int from_tty;
-{
- bfd *abfd;
- asection *s;
- int err;
- CORE_ADDR text;
-
- abfd = bfd_openr (args, 0);
- if (abfd == (bfd *) NULL)
- error ("Unable to open file %s", args);
-
- if (bfd_check_format (abfd, bfd_object) == 0)
- error ("%s: Not an object file", args);
-
- text = UINT_MAX;
- for (s = abfd->sections; s != (asection *) NULL; s = s->next)
- {
- if ((s->flags & SEC_LOAD) != 0)
- {
- bfd_size_type size;
-
- size = bfd_get_section_size_before_reloc (s);
- if (size > 0)
- {
- char *buffer;
- struct cleanup *old_chain;
- bfd_vma vma;
-
- buffer = xmalloc (size);
- old_chain = make_cleanup (free, buffer);
-
- vma = bfd_get_section_vma (abfd, s);
- printf_filtered ("Loading section %s, size 0x%x vma 0x%x\n",
- bfd_get_section_name (abfd, s), size, vma);
- bfd_get_section_contents (abfd, s, buffer, 0, size);
- mips_xfer_memory (vma, buffer, size, 1, &mips_ops);
-
- do_cleanups (old_chain);
-
- if ((bfd_get_section_flags (abfd, s) & SEC_CODE) != 0
- && vma < text)
- text = vma;
- }
- }
- }
-
- mips_request ('R', (unsigned int) mips_map_regno (PC_REGNUM),
- (unsigned int) abfd->start_address,
- &err);
- if (err)
- error ("Can't write PC register: %s", safe_strerror (errno));
-
- bfd_close (abfd);
-
- /* FIXME: Should we call symbol_file_add here? The local variable
- text exists just for this call. Making the call seems to confuse
- gdb if more than one file is loaded in. Perhaps passing MAINLINE
- as 1 would fix this, but it's not clear that that is correct
- either since it is possible to load several files onto the board.
-
- symbol_file_add (args, from_tty, text, 0, 0, 0); */
-}
-
/* Start running on the target board. */
static void
static void
mips_mourn_inferior ()
{
+ unpush_target (&mips_ops);
generic_mourn_inferior ();
}
\f
NULL, /* to_terminal_ours */
NULL, /* to_terminal_info */
mips_kill, /* to_kill */
- mips_load, /* to_load */
+ generic_load, /* to_load */
NULL, /* to_lookup_symbol */
mips_create_inferior, /* to_create_inferior */
mips_mourn_inferior, /* to_mourn_inferior */