#include "defs.h"
#include "inferior.h"
-#include "symfile.h"
#include "bfd.h"
+#include "symfile.h"
#include "wait.h"
#include "gdbcmd.h"
#include "gdbcore.h"
#include "serial.h"
#include "target.h"
+#include "remote-utils.h"
#include <signal.h>
\f
mips_detach PARAMS ((char *args, int from_tty));
static void
-mips_resume PARAMS ((int step, int siggnal));
+mips_resume PARAMS ((int pid, int step, int siggnal));
static int
mips_wait PARAMS ((WAITTYPE *status));
a reply. */
static int mips_need_reply = 0;
-/* This can be set to get debugging with ``set remotedebug''. */
-static int mips_debug = 0;
-
/* Handle used to access serial I/O stream. */
static serial_t mips_desc;
error ("End of file from remote");
if (ch == SERIAL_ERROR)
error ("Error reading from remote: %s", safe_strerror (errno));
- if (mips_debug > 1)
+ if (sr_get_debug () > 1)
{
if (ch != SERIAL_TIMEOUT)
printf_filtered ("Read '%c' %d 0x%x\n", ch, ch, ch);
&& state == 5
&& ! mips_initializing)
{
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
printf_filtered ("Reinitializing MIPS debugging mode\n");
SERIAL_WRITE (mips_desc, "\rdb tty0\r", sizeof "\rdb tty0\r" - 1);
sleep (1);
what the program is outputting, if the debugging is
being done on the console port. FIXME: Perhaps this
should be filtered? */
- if (! mips_initializing || mips_debug > 0)
+ if (! mips_initializing || sr_get_debug () > 0)
{
putchar (ch);
fflush (stdout);
int garbage;
int ch;
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
{
packet[HDR_LENGTH + len + TRLR_LENGTH] = '\0';
printf_filtered ("Writing \"%s\"\n", packet + 1);
!= TRLR_GET_CKSUM (trlr))
continue;
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
{
hdr[HDR_LENGTH] = '\0';
trlr[TRLR_LENGTH] = '\0';
/* An acknowledgement is probably a duplicate; ignore it. */
if (! HDR_IS_DATA (hdr))
{
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
printf_filtered ("Ignoring unexpected ACK\n");
continue;
}
/* If this is the wrong sequence number, ignore it. */
if (HDR_GET_SEQ (hdr) != mips_receive_seq)
{
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
printf_filtered ("Ignoring sequence number %d (want %d)\n",
HDR_GET_SEQ (hdr), mips_receive_seq);
continue;
if (i < len)
{
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
printf_filtered ("Got new SYN after %d chars (wanted %d)\n",
i, len);
continue;
error ("Timed out waiting for packet");
if (err == -2)
{
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
printf_filtered ("Got SYN when wanted trailer\n");
continue;
}
if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr))
break;
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
printf_filtered ("Bad checksum; data %d, trailer %d\n",
mips_cksum (hdr, buff, len),
TRLR_GET_CKSUM (trlr));
ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
{
ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
printf_filtered ("Writing ack %d \"%s\"\n", mips_receive_seq,
error ("write to target failed: %s", safe_strerror (errno));
}
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
{
buff[len] = '\0';
printf_filtered ("Got packet \"%s\"\n", buff);
ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
- if (mips_debug > 0)
+ if (sr_get_debug () > 0)
{
ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
printf_filtered ("Writing ack %d \"%s\"\n", mips_receive_seq,
mips_receive_wait = 3;
tries = 0;
- while (catch_errors (mips_receive_packet, buff, (char *) NULL) == 0)
+ while (catch_errors (mips_receive_packet, buff, (char *) NULL,
+ RETURN_MASK_ALL)
+ == 0)
{
char cc;
from the board. */
static void
-mips_resume (step, siggnal)
- int step, siggnal;
+mips_resume (pid, step, siggnal)
+ int pid, step, siggnal;
{
if (siggnal)
error ("Can't send signals to a remote system. Try `handle %d ignore'.",
if (err)
error ("Can't read register %d: %s", regno, safe_strerror (errno));
- /* We got the number the register holds, but gdb expects to see a
- value in the target byte ordering. */
- SWAP_TARGET_AND_HOST (&val, sizeof (REGISTER_TYPE));
- supply_register (regno, (char *) &val);
+ {
+ char buf[MAX_REGISTER_RAW_SIZE];
+
+ /* We got the number the register holds, but gdb expects to see a
+ value in the target byte ordering. */
+ store_unsigned_integer (buf, REGISTER_RAW_SIZE (regno), val);
+ supply_register (regno, buf);
+ }
}
/* Prepare to store registers. The MIPS protocol can store individual
/* Round ending address up; get number of longwords that makes. */
register int count = (((memaddr + len) - addr) + 3) / 4;
/* Allocate buffer of that many longwords. */
- register unsigned int *buffer = (unsigned int *) alloca (count * 4);
+ register char *buffer = alloca (count * 4);
if (write)
{
if (addr != memaddr || len < 4)
{
/* Need part of initial word -- fetch it. */
- buffer[0] = mips_fetch_word (addr);
- SWAP_TARGET_AND_HOST (buffer, 4);
+ store_unsigned_integer (&buffer[0], 4, mips_fetch_word (addr));
}
- if (count > 1) /* FIXME, avoid if even boundary */
+ if (count > 1)
{
- buffer[count - 1] = mips_fetch_word (addr + (count - 1) * 4);
- SWAP_TARGET_AND_HOST (buffer + (count - 1) * 4, 4);
+ /* Need part of last word -- fetch it. FIXME: we do this even
+ if we don't need it. */
+ store_unsigned_integer (&buffer[(count - 1) * 4], 4,
+ mips_fetch_word (addr + (count - 1) * 4));
}
/* Copy data to be written over corresponding part of buffer */
for (i = 0; i < count; i++, addr += 4)
{
- SWAP_TARGET_AND_HOST (buffer + i, 4);
- mips_store_word (addr, buffer[i]);
+ mips_store_word (addr, extract_unsigned_integer (&buffer[i*4], 4));
+ /* FIXME: Do we want a QUIT here? */
}
}
else
/* Read all the longwords */
for (i = 0; i < count; i++, addr += 4)
{
- buffer[i] = mips_fetch_word (addr);
- SWAP_TARGET_AND_HOST (buffer + i, 4);
+ store_unsigned_integer (&buffer[i*4], 4, mips_fetch_word (addr));
QUIT;
}
/* Copy appropriate bytes out of the buffer. */
- memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
+ memcpy (myaddr, buffer + (memaddr & 3), len);
}
return len;
}
add_target (&mips_ops);
add_show_from_set (
- add_set_cmd ("remotedebug", no_class, var_zinteger, (char *) &mips_debug,
- "Set debugging of remote MIPS serial I/O.\n\
-When non-zero, each packet sent or received with the remote target\n\
-is displayed. Higher numbers produce more debugging.", &setlist),
+ add_set_cmd ("timeout", no_class, var_zinteger,
+ (char *) &mips_receive_wait,
+ "Set timeout in seconds for remote MIPS serial I/O.",
+ &setlist),
+ &showlist);
+
+ add_show_from_set (
+ add_set_cmd ("retransmit-timeout", no_class, var_zinteger,
+ (char *) &mips_retransmit_wait,
+ "Set retransmit timeout in seconds for remote MIPS serial I/O.\n\
+This is the number of seconds to wait for an acknowledgement to a packet\n\
+before resending the packet.", &setlist),
&showlist);
}