aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote-hms.c
diff options
context:
space:
mode:
authorSteve Chamberlain <sac@cygnus>1992-02-06 20:03:31 +0000
committerSteve Chamberlain <sac@cygnus>1992-02-06 20:03:31 +0000
commit1f46923ff419face15f7232a8c33efc5beecea15 (patch)
tree92292b563912f3e2b22b2964cfc51a99a5156f4b /gdb/remote-hms.c
parentab6c26bae16d9b02b20fb5e98dbae1d63f22e8e6 (diff)
downloadgdb-1f46923ff419face15f7232a8c33efc5beecea15.zip
gdb-1f46923ff419face15f7232a8c33efc5beecea15.tar.gz
gdb-1f46923ff419face15f7232a8c33efc5beecea15.tar.bz2
* coffread.c (read_enum_type): Use the size of a target int when
describing enum. * defs.h: added new #define for TARGET_PTR_BIT, defaults to size of target int. * h8300-tdep.c, remote-hms.c, tm-h8300.h: too many changes to count * symtab.c (lookup_reference_type, lookup_ptr_type): use TARGET_PTR_BIT to determine size of a pointer * values.c (unpack_long): when unpacking a REF or a PTR don't assume the size of the type.
Diffstat (limited to 'gdb/remote-hms.c')
-rw-r--r--gdb/remote-hms.c467
1 files changed, 337 insertions, 130 deletions
diff --git a/gdb/remote-hms.c b/gdb/remote-hms.c
index 19df127..48df7a7 100644
--- a/gdb/remote-hms.c
+++ b/gdb/remote-hms.c
@@ -1,4 +1,4 @@
-/* Remote debugging interface for HMS Monitor Version 1.0
+/* Remote debugging interface for Hitachi HMS Monitor Version 1.0
Copyright 1992 Free Software Foundation, Inc.
@@ -55,22 +55,197 @@ static int hms_clear_breakpoints();
extern struct target_ops hms_ops;
-#define DEBUG
+static int quiet = 1;
+
#ifdef DEBUG
-# define DENTER(NAME) (printf_filtered("Entering %s\n",NAME), fflush(stdout))
-# define DEXIT(NAME) (printf_filtered("Exiting %s\n",NAME), fflush(stdout))
+# define DENTER(NAME) if (!quiet) (printf_filtered("Entering %s\n",NAME), fflush(stdout))
+# define DEXIT(NAME) if (!quiet) (printf_filtered("Exiting %s\n",NAME), fflush(stdout))
#else
# define DENTER(NAME)
# define DEXIT(NAME)
#endif
+/***********************************************************************/
+/* Caching stuff stolen from remote-nindy.c */
+
+/* The data cache records all the data read from the remote machine
+ since the last time it stopped.
+
+ Each cache block holds LINE_SIZE bytes of data
+ starting at a multiple-of-LINE_SIZE address. */
+
+
+#define LINE_SIZE_POWER 4
+#define LINE_SIZE (1<<LINE_SIZE_POWER) /* eg 1<<3 == 8 */
+#define LINE_SIZE_MASK ((LINE_SIZE-1)) /* eg 7*2+1= 111*/
+#define DCACHE_SIZE 64 /* Number of cache blocks */
+#define XFORM(x) ((x&LINE_SIZE_MASK)>>2)
+struct dcache_block {
+ struct dcache_block *next, *last;
+ unsigned int addr; /* Address for which data is recorded. */
+ int data[LINE_SIZE/sizeof(int)];
+};
+
+struct dcache_block dcache_free, dcache_valid;
+
+/* Free all the data cache blocks, thus discarding all cached data. */
+static
+void
+dcache_flush ()
+{
+ register struct dcache_block *db;
+
+ while ((db = dcache_valid.next) != &dcache_valid)
+ {
+ remque (db);
+ insque (db, &dcache_free);
+ }
+}
+
+/*
+ * If addr is present in the dcache, return the address of the block
+ * containing it.
+ */
+static
+struct dcache_block *
+dcache_hit (addr)
+ unsigned int addr;
+{
+ register struct dcache_block *db;
+
+ if (addr & 3)
+ abort ();
+
+ /* Search all cache blocks for one that is at this address. */
+ db = dcache_valid.next;
+ while (db != &dcache_valid)
+ {
+ if ((addr & ~LINE_SIZE_MASK)== db->addr)
+ return db;
+ db = db->next;
+ }
+ return NULL;
+}
+
+/* Return the int data at address ADDR in dcache block DC. */
+static
+int
+dcache_value (db, addr)
+ struct dcache_block *db;
+ unsigned int addr;
+{
+ if (addr & 3)
+ abort ();
+ return (db->data[XFORM(addr)]);
+}
+
+/* Get a free cache block, put or keep it on the valid list,
+ and return its address. The caller should store into the block
+ the address and data that it describes, then remque it from the
+ free list and insert it into the valid list. This procedure
+ prevents errors from creeping in if a ninMemGet is interrupted
+ (which used to put garbage blocks in the valid list...). */
+static
+struct dcache_block *
+dcache_alloc ()
+{
+ register struct dcache_block *db;
+
+ if ((db = dcache_free.next) == &dcache_free)
+ {
+ /* If we can't get one from the free list, take last valid and put
+ it on the free list. */
+ db = dcache_valid.last;
+ remque (db);
+ insque (db, &dcache_free);
+ }
+
+ remque (db);
+ insque (db, &dcache_valid);
+ return (db);
+}
+
+/* Return the contents of the word at address ADDR in the remote machine,
+ using the data cache. */
+static
+int
+dcache_fetch (addr)
+ CORE_ADDR addr;
+{
+ register struct dcache_block *db;
+
+ db = dcache_hit (addr);
+ if (db == 0)
+ {
+ db = dcache_alloc ();
+ immediate_quit++;
+ hms_read_inferior_memory(addr & ~LINE_SIZE_MASK, (unsigned char *)db->data, LINE_SIZE);
+ immediate_quit--;
+ db->addr = addr & ~LINE_SIZE_MASK;
+ remque (db); /* Off the free list */
+ insque (db, &dcache_valid); /* On the valid list */
+ }
+ return (dcache_value (db, addr));
+}
+
+/* Write the word at ADDR both in the data cache and in the remote machine. */
+static void
+dcache_poke (addr, data)
+ CORE_ADDR addr;
+ int data;
+{
+ register struct dcache_block *db;
+
+ /* First make sure the word is IN the cache. DB is its cache block. */
+ db = dcache_hit (addr);
+ if (db == 0)
+ {
+ db = dcache_alloc ();
+ immediate_quit++;
+ hms_write_inferior_memory(addr & ~LINE_SIZE_MASK, (unsigned char *)db->data, LINE_SIZE);
+ immediate_quit--;
+ db->addr = addr & ~LINE_SIZE_MASK;
+ remque (db); /* Off the free list */
+ insque (db, &dcache_valid); /* On the valid list */
+ }
+
+ /* Modify the word in the cache. */
+ db->data[XFORM(addr)] = data;
+
+ /* Send the changed word. */
+ immediate_quit++;
+ hms_write_inferior_memory(addr, (unsigned char *)&data, 4);
+ immediate_quit--;
+}
+
+/* The cache itself. */
+struct dcache_block the_cache[DCACHE_SIZE];
+
+/* Initialize the data cache. */
+static void
+dcache_init ()
+{
+ register i;
+ register struct dcache_block *db;
+
+ db = the_cache;
+ dcache_free.next = dcache_free.last = &dcache_free;
+ dcache_valid.next = dcache_valid.last = &dcache_valid;
+ for (i=0;i<DCACHE_SIZE;i++,db++)
+ insque (db, &dcache_free);
+}
-static int timeout = 5;
+
+/***********************************************************************
+ * I/O stuff stolen from remote-eb.c
+ ***********************************************************************/
+
+static int timeout = 2;
static char *dev_name = "/dev/ttya";
-static int quiet;
+
/* Descriptor for I/O to remote machine. Initialize it to -1 so that
hms_open knows that we don't have a file open when the program
@@ -79,6 +254,8 @@ int hms_desc = -1;
#define OPEN(x) ((x) >= 0)
+void hms_open();
+
#define ON 1
#define OFF 0
static void
@@ -109,25 +286,41 @@ int turnon;
ioctl (desc, TIOCSETP, &sg);
}
-/* Suck up all the input from the hms */
-slurp_input()
+
+/* Read a character from the remote system, doing all the fancy
+ timeout stuff. */
+static int
+readchar ()
{
- char buf[8];
+ char buf;
+ buf = '\0';
#ifdef HAVE_TERMIO
/* termio does the timeout for us. */
- while (read (hms_desc, buf, 8) > 0);
+ read (hms_desc, &buf, 1);
#else
alarm (timeout);
- while (read (hms_desc, buf, 8) > 0);
+ if (read (hms_desc, &buf, 1) < 0)
+ {
+ if (errno == EINTR)
+ error ("Timeout reading from remote system.");
+ else
+ perror_with_name ("remote");
+ }
alarm (0);
#endif
+
+ if (buf == '\0')
+ error ("Timeout reading from remote system.");
+
+ if (!quiet)
+ printf("%c",buf);
+
+ return buf & 0x7f;
}
-/* Read a character from the remote system, doing all the fancy
- timeout stuff. */
static int
-readchar ()
+readchar_nofail ()
{
char buf;
@@ -138,21 +331,16 @@ readchar ()
#else
alarm (timeout);
if (read (hms_desc, &buf, 1) < 0)
- {
- if (errno == EINTR)
- error ("Timeout reading from remote system.");
- else
- perror_with_name ("remote");
- }
+ {
+ return 0;
+ }
alarm (0);
#endif
- if (buf == '\0')
- error ("Timeout reading from remote system.");
-
-if (!quiet)
- printf("'%c'",buf);
-
+ if (buf == '\0')
+ {
+ return 0;
+ }
return buf & 0x7f;
}
@@ -267,16 +455,10 @@ volatile int n_alarms;
void
hms_timer ()
{
-#if 0
- if (kiodebug)
- printf ("hms_timer called\n");
-#endif
n_alarms++;
}
#endif
-/* malloc'd name of the program on the remote system. */
-static char *prog_name = NULL;
/* Number of SIGTRAPs we need to simulate. That is, the next
NEED_ARTIFICIAL_TRAP calls to hms_wait should just return
@@ -289,15 +471,16 @@ hms_kill(arg,from_tty)
char *arg;
int from_tty;
{
-#if 0
- DENTER("hms_kill()");
- fprintf (hms_stream, "K");
- fprintf (hms_stream, "\r");
- expect_prompt ();
- DEXIT("hms_kill()");
-#endif
}
+
+static check_open()
+{
+ if (!OPEN(hms_desc)) {
+ hms_open("",0);
+ }
+}
+
/*
* Download a file specified in 'args', to the hms.
*/
@@ -312,15 +495,14 @@ int fromtty;
char buffer[1024];
DENTER("hms_load()");
- if (!OPEN(hms_desc))
- {
- printf_filtered("HMS not open. Use 'target' command to open HMS\n");
- return;
- }
+ check_open();
+
+ dcache_flush();
+ inferior_pid = 0;
abfd = bfd_openr(args,"coff-h8300");
if (!abfd)
{
- printf_filtered("Can't open a bfd on file\n");
+ printf_filtered("Unable to open file %s\n", args);
return;
}
@@ -366,7 +548,8 @@ hms_create_inferior (execfile, args, env)
error ("No exec file specified");
entry_pt = (int) bfd_get_start_address (exec_bfd);
-
+ check_open();
+
if (OPEN(hms_desc))
{
@@ -376,28 +559,17 @@ hms_create_inferior (execfile, args, env)
/* Clear the input because what the hms sends back is different
* depending on whether it was running or not.
*/
- /* slurp_input(); /* After this there should be a prompt */
+
hms_write_cr("r");
expect_prompt();
- printf_filtered("Do you want to download '%s' (y/n)? [y] : ",prog_name);
- {
- char buffer[10];
- gets(buffer);
- if (*buffer != 'n') {
- hms_load(prog_name,0);
- }
- }
insert_breakpoints (); /* Needed to get correct instruction in cache */
proceed(entry_pt, -1, 0);
- } else
- {
- printf_filtered("Hms not open yet.\n");
- }
+ }
DEXIT("hms_create_inferior()");
}
@@ -412,22 +584,12 @@ hms_create_inferior (execfile, args, env)
#endif
static struct {int rate, damn_b;} baudtab[] = {
- {0, B0},
- {50, B50},
- {75, B75},
- {110, B110},
- {134, B134},
- {150, B150},
- {200, B200},
+ {9600, B9600},
+ {19200, B19200},
{300, B300},
- {600, B600},
{1200, B1200},
- {1800, B1800},
{2400, B2400},
{4800, B4800},
- {9600, B9600},
- {19200, B19200},
- {38400, B38400},
{-1, -1},
};
@@ -438,7 +600,7 @@ static int damn_b (rate)
for (i = 0; baudtab[i].rate != -1; i++)
if (rate == baudtab[i].rate) return baudtab[i].damn_b;
- return B38400; /* Random */
+ return B19200;
}
@@ -485,12 +647,78 @@ char **p;
}
static int baudrate = 9600;
+
+static int
+is_baudrate_right()
+{
+
+
+ /* Put this port into NORMAL mode, send the 'normal' character */
+ hms_write("\001", 1); /* Control A */
+ hms_write("\r", 1); /* Cr */
+
+ while ( readchar_nofail()) /* Skip noise we put there */
+ ;
+
+ hms_write("r");
+ if (readchar_nofail() == 'r')
+ return 1;
+
+ /* Not the right baudrate, or the board's not on */
+ return 0;
+
+
+}
+static void
+set_rate()
+{
+ TERMINAL sg;
+ ioctl (hms_desc, TIOCGETP, &sg);
+#ifdef HAVE_TERMIO
+ sg.c_cc[VMIN] = 0; /* read with timeout. */
+ sg.c_cc[VTIME] = timeout * 10;
+ sg.c_lflag &= ~(ICANON | ECHO);
+ sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
+#else
+ sg.sg_ispeed = damn_b (baudrate);
+ sg.sg_ospeed = damn_b (baudrate);
+ sg.sg_flags |= RAW | ANYP;
+ sg.sg_flags &= ~ECHO;
+#endif
+
+ ioctl (hms_desc, TIOCSETP, &sg);
+}
+
+static void
+get_baudrate_right()
+{
+
+ int which_rate = 0;
+
+ while (!is_baudrate_right())
+ {
+ if (baudtab[which_rate].rate == -1)
+ {
+ which_rate = 0;
+ }
+ else
+ {
+ which_rate++;
+ }
+
+ baudrate = baudtab[which_rate].rate;
+ printf_filtered("Board not responding, trying %d baud\n",baudrate);
+ QUIT;
+ set_rate();
+ }
+}
+
static void
hms_open (name, from_tty)
char *name;
int from_tty;
{
- TERMINAL sg;
+
unsigned int prl;
char *p;
@@ -501,32 +729,17 @@ hms_open (name, from_tty)
}
- printf("Input string %s\n", name);
-
- prog_name = get_word(&name);
-
hms_close (0);
hms_desc = open (dev_name, O_RDWR);
if (hms_desc < 0)
perror_with_name (dev_name);
- ioctl (hms_desc, TIOCGETP, &sg);
-#ifdef HAVE_TERMIO
- sg.c_cc[VMIN] = 0; /* read with timeout. */
- sg.c_cc[VTIME] = timeout * 10;
- sg.c_lflag &= ~(ICANON | ECHO);
- sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
-#else
- sg.sg_ispeed = damn_b (baudrate);
- sg.sg_ospeed = damn_b (baudrate);
- sg.sg_flags |= RAW | ANYP;
- sg.sg_flags &= ~ECHO;
-#endif
- ioctl (hms_desc, TIOCSETP, &sg);
+ set_rate();
+
+ dcache_init();
- push_target (&hms_ops);
/* start_remote (); /* Initialize gdb process mechanisms */
@@ -543,11 +756,7 @@ hms_open (name, from_tty)
perror ("hms_open: error in signal");
#endif
-
- /* Put this port into NORMAL mode, send the 'normal' character */
- hms_write("\001", 1); /* Control A */
- hms_write("\r", 1); /* Cr */
- expect_prompt ();
+ get_baudrate_right();
/* Hello? Are you there? */
write (hms_desc, "\r", 1);
@@ -558,7 +767,7 @@ hms_open (name, from_tty)
hms_clear_breakpoints();
- printf_filtered("Remote debugging on an H8/300 HMS via %s %s.\n",dev_name,prog_name);
+ printf_filtered("Remote debugging on an H8/300 HMS via %s.\n",dev_name);
DEXIT("hms_open()");
}
@@ -603,8 +812,6 @@ hms_attach (args, from_tty)
{
DENTER("hms_attach()");
- if (from_tty)
- printf_filtered ("Attaching to remote program %s.\n", prog_name);
/* push_target(&hms_ops); /* This done in hms_open() */
@@ -655,6 +862,8 @@ hms_resume (step, sig)
int step, sig;
{
DENTER("hms_resume()");
+ dcache_flush();
+
if (step)
{
hms_write_cr("s");
@@ -686,7 +895,7 @@ hms_wait (status)
of the string cannot recur in the string, or we will not
find some cases of the string in the input. */
- static char bpt[] = "At breakpoint:";
+ static char bpt[] = "At breakpoint:\r";
/* It would be tempting to look for "\n[__exit + 0x8]\n"
but that requires loading symbols with "yc i" and even if
we did do that we don't know that the file has symbols. */
@@ -703,43 +912,44 @@ hms_wait (status)
int ch_handled;
int old_timeout = timeout;
int old_immediate_quit = immediate_quit;
-
+ int swallowed_cr = 0;
+
DENTER("hms_wait()");
WSETEXIT ((*status), 0);
if (need_artificial_trap != 0)
- {
- WSETSTOP ((*status), SIGTRAP);
- need_artificial_trap--;
- return 0;
- }
+ {
+ WSETSTOP ((*status), SIGTRAP);
+ need_artificial_trap--;
+ return 0;
+ }
- timeout = 0; /* Don't time out -- user program is running. */
- immediate_quit = 1; /* Helps ability to QUIT */
+ timeout = 0; /* Don't time out -- user program is running. */
+ immediate_quit = 1; /* Helps ability to QUIT */
while (1) {
- QUIT; /* Let user quit and leave process running */
+ QUIT; /* Let user quit and leave process running */
ch_handled = 0;
ch = readchar ();
if (ch == *bp) {
bp++;
if (*bp == '\0')
- break;
+ break;
ch_handled = 1;
*swallowed_p++ = ch;
- } else
- bp = bpt;
+ } else
+ bp = bpt;
if (ch == *ep || *ep == '?') {
ep++;
if (*ep == '\0')
- break;
+ break;
if (!ch_handled)
- *swallowed_p++ = ch;
+ *swallowed_p++ = ch;
ch_handled = 1;
- }, sal.line);
-d979 3
+ } else
+ ep = exitmsg;
if (!ch_handled) {
char *p;
/* Print out any characters which have been swallowed. */
@@ -769,9 +979,6 @@ d979 3
timeout = old_timeout;
immediate_quit = old_immediate_quit;
- printf ("%s is at %s:%d.\n",
- local_hex_string(sal.pc),
- sal.symtab->filename, sal.line);
DEXIT("hms_wait()");
return 0;
}
@@ -851,15 +1058,15 @@ if (!quiet)
}
}
- printf ("Line %d of \"%s\" is at pc %s but contains no code.\n",
- sal.line, sal.symtab->filename, local_hex_string(start_pc));
+hms_write_cr(s)
+char *s;
{
hms_write( s, strlen(s));
- printf ("Line %d of \"%s\" starts at pc %s",
- sal.line, sal.symtab->filename,
- local_hex_string(start_pc));
- printf (" and ends at %s.\n",
- local_hex_string(end_pc));
+hms_write("\r",1);
+}
+
+static void
+hms_fetch_registers ()
{
#define REGREPLY_SIZE 79
char linebuf[REGREPLY_SIZE+1];
@@ -867,8 +1074,8 @@ hms_write( s, strlen(s));
int s ;
int gottok;
- printf ("Line number %d is out of range for \"%s\".\n",
- sal.line, sal.symtab->filename);
+ REGISTER_TYPE reg[NUM_REGS];
+ int foo[8];
check_open();
do
@@ -942,7 +1149,7 @@ hms_store_register (regno)
int regno;
{
- printf ("Expression not found\n");
+ /* printf("hms_store_register() called.\n"); fflush(stdout); /* */
if (regno == -1)
hms_store_registers ();
else
@@ -1020,7 +1227,7 @@ hms_xfer_inferior_memory(memaddr, myaddr, len, write, target)
addr = memaddr & - sizeof (int);
count = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
- printf ("Expression not found\n");
+
buffer = (int *)alloca (count * sizeof (int));
if (write)
{