* remote-hms.c (hms_ops): Change ref of hr_load_image
to gr_load_image. (dcache_flush, dcache_hit, dcache_value, dcache_fetch, dcache_poke, dcache_init): Deleted. (hms_open, hms_resume, hms_fetch_word, hms_store_word): Use dcache routines provided by remote-util.h
This commit is contained in:
parent
d2d0e51de4
commit
03fc5a0b43
2 changed files with 131 additions and 291 deletions
|
@ -2,6 +2,10 @@ Thu Jan 26 10:49:59 1995 Steve Chamberlain <sac@splat>
|
||||||
|
|
||||||
* remote-hms.c (hms_ops): Change ref of hr_load_image
|
* remote-hms.c (hms_ops): Change ref of hr_load_image
|
||||||
to gr_load_image.
|
to gr_load_image.
|
||||||
|
(dcache_flush, dcache_hit, dcache_value, dcache_fetch,
|
||||||
|
dcache_poke, dcache_init): Deleted.
|
||||||
|
(hms_open, hms_resume, hms_fetch_word, hms_store_word):
|
||||||
|
Use dcache routines provided by remote-util.h
|
||||||
|
|
||||||
Thu Jan 26 12:08:31 1995 Michael Meissner <meissner@cygnus.com>
|
Thu Jan 26 12:08:31 1995 Michael Meissner <meissner@cygnus.com>
|
||||||
|
|
||||||
|
|
418
gdb/remote-hms.c
418
gdb/remote-hms.c
|
@ -1,23 +1,23 @@
|
||||||
/* Remote debugging interface for Hitachi HMS Monitor Version 1.0
|
/* Remote debugging interface for Hitachi HMS Monitor Version 1.0
|
||||||
Copyright 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||||
Contributed by Cygnus Support. Written by Steve Chamberlain
|
Contributed by Cygnus Support. Written by Steve Chamberlain
|
||||||
(sac@cygnus.com).
|
(sac@cygnus.com).
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "inferior.h"
|
#include "inferior.h"
|
||||||
|
@ -33,7 +33,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
|
#include "remote-utils.h"
|
||||||
/* External data declarations */
|
/* External data declarations */
|
||||||
extern int stop_soon_quietly; /* for wait_for_inferior */
|
extern int stop_soon_quietly; /* for wait_for_inferior */
|
||||||
|
|
||||||
|
@ -51,180 +51,11 @@ static void hms_drain ();
|
||||||
static void add_commands ();
|
static void add_commands ();
|
||||||
static void remove_commands ();
|
static void remove_commands ();
|
||||||
|
|
||||||
static int quiet = 1; /* FIXME - can be removed after Dec '94 */
|
static int quiet = 1; /* FIXME - can be removed after Dec '94 */
|
||||||
|
|
||||||
|
|
||||||
|
static DCACHE *remote_dcache;
|
||||||
serial_t desc;
|
serial_t desc;
|
||||||
|
|
||||||
/***********************************************************************/
|
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* I/O stuff stolen from remote-eb.c
|
* I/O stuff stolen from remote-eb.c
|
||||||
|
@ -244,9 +75,9 @@ static int after = 0xdead;
|
||||||
int
|
int
|
||||||
check_open ()
|
check_open ()
|
||||||
{
|
{
|
||||||
if (before != 0xdead
|
if (before != 0xdead
|
||||||
|| after != 0xdead)
|
|| after != 0xdead)
|
||||||
printf("OUTCH! \n");
|
printf ("OUTCH! \n");
|
||||||
if (!is_open)
|
if (!is_open)
|
||||||
{
|
{
|
||||||
error ("remote device not open");
|
error ("remote device not open");
|
||||||
|
@ -281,7 +112,8 @@ readchar ()
|
||||||
return buf & 0x7f;
|
return buf & 0x7f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void flush()
|
static void
|
||||||
|
flush ()
|
||||||
{
|
{
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
@ -317,7 +149,7 @@ expect (string)
|
||||||
immediate_quit = 1;
|
immediate_quit = 1;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
c = readchar();
|
c = readchar ();
|
||||||
if (c == *p)
|
if (c == *p)
|
||||||
{
|
{
|
||||||
p++;
|
p++;
|
||||||
|
@ -327,7 +159,7 @@ expect (string)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p = string;
|
p = string;
|
||||||
if (c == *p)
|
if (c == *p)
|
||||||
|
@ -533,41 +365,6 @@ set_rate ()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
hms_open (name, from_tty)
|
|
||||||
char *name;
|
|
||||||
int from_tty;
|
|
||||||
{
|
|
||||||
unsigned int prl;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if (name == 0)
|
|
||||||
{
|
|
||||||
name = "";
|
|
||||||
}
|
|
||||||
if (is_open)
|
|
||||||
hms_close (0);
|
|
||||||
dev_name = strdup (name);
|
|
||||||
|
|
||||||
if (!(desc = SERIAL_OPEN (dev_name)))
|
|
||||||
perror_with_name ((char *) dev_name);
|
|
||||||
|
|
||||||
SERIAL_RAW (desc);
|
|
||||||
is_open = 1;
|
|
||||||
push_target (&hms_ops);
|
|
||||||
dcache_init ();
|
|
||||||
|
|
||||||
/* Hello? Are you there? */
|
|
||||||
SERIAL_WRITE (desc, "\r\n", 2);
|
|
||||||
expect_prompt ();
|
|
||||||
|
|
||||||
/* Clear any break points */
|
|
||||||
hms_clear_breakpoints ();
|
|
||||||
|
|
||||||
printf_filtered ("Connected to remote board running HMS monitor.\n");
|
|
||||||
add_commands ();
|
|
||||||
/* hms_drain ();*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Close out all files and local state before this target loses control. */
|
/* Close out all files and local state before this target loses control. */
|
||||||
|
|
||||||
|
@ -588,7 +385,7 @@ hms_close (quitting)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Terminate the open connection to the remote debugger. Use this
|
/* Terminate the open connection to the remote debugger. Use this
|
||||||
when you want to detach and do something else with your gdb. */ void
|
when you want to detach and do something else with your gdb. */ void
|
||||||
hms_detach (args, from_tty)
|
hms_detach (args, from_tty)
|
||||||
char *args;
|
char *args;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
|
@ -599,7 +396,7 @@ hms_detach (args, from_tty)
|
||||||
}
|
}
|
||||||
|
|
||||||
pop_target (); /* calls hms_close to do the real work
|
pop_target (); /* calls hms_close to do the real work
|
||||||
*/
|
*/
|
||||||
if (from_tty)
|
if (from_tty)
|
||||||
printf_filtered ("Ending remote %s debugging\n",
|
printf_filtered ("Ending remote %s debugging\n",
|
||||||
target_shortname);
|
target_shortname);
|
||||||
|
@ -613,7 +410,7 @@ hms_resume (pid, step, sig)
|
||||||
enum target_signal
|
enum target_signal
|
||||||
sig;
|
sig;
|
||||||
{
|
{
|
||||||
dcache_flush ();
|
dcache_flush (remote_dcache);
|
||||||
|
|
||||||
if (step)
|
if (step)
|
||||||
{
|
{
|
||||||
|
@ -621,8 +418,8 @@ hms_resume (pid, step, sig)
|
||||||
expect ("Step>");
|
expect ("Step>");
|
||||||
|
|
||||||
/* Force the next hms_wait to return a trap. Not doing anything
|
/* Force the next hms_wait to return a trap. Not doing anything
|
||||||
about I/O from the target means that the user has to type "continue"
|
about I/O from the target means that the user has to type "continue"
|
||||||
to see any. FIXME, this should be fixed. */
|
to see any. FIXME, this should be fixed. */
|
||||||
need_artificial_trap = 1;
|
need_artificial_trap = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -633,7 +430,7 @@ hms_resume (pid, step, sig)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait until the remote machine stops, then return, storing status in
|
/* Wait until the remote machine stops, then return, storing status in
|
||||||
STATUS just as `wait' would. */
|
STATUS just as `wait' would. */
|
||||||
|
|
||||||
int
|
int
|
||||||
hms_wait (pid, status)
|
hms_wait (pid, status)
|
||||||
|
@ -649,8 +446,8 @@ hms_wait (pid, status)
|
||||||
|
|
||||||
/* It would be tempting to look for "\n[__exit + 0x8]\n" but that
|
/* 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
|
requires loading symbols with "yc i" and even if we did do that we
|
||||||
don't know that the file has symbols. */
|
don't know that the file has symbols. */
|
||||||
static char exitmsg[] = "HMS>";
|
static char exitmsg[] = "HMS>";
|
||||||
char *bp = bpt;
|
char *bp = bpt;
|
||||||
char *ep = exitmsg;
|
char *ep = exitmsg;
|
||||||
|
|
||||||
|
@ -703,16 +500,16 @@ hms_wait (pid, status)
|
||||||
}
|
}
|
||||||
if
|
if
|
||||||
(ch == *ep || *ep == '?')
|
(ch == *ep || *ep == '?')
|
||||||
{
|
{
|
||||||
ep++;
|
ep++;
|
||||||
if (*ep == '\0')
|
if (*ep == '\0')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!ch_handled)
|
if (!ch_handled)
|
||||||
*swallowed_p++ = ch;
|
*swallowed_p++ = ch;
|
||||||
ch_handled =
|
ch_handled =
|
||||||
1;
|
1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ep = exitmsg;
|
ep = exitmsg;
|
||||||
|
@ -756,7 +553,7 @@ hms_wait (pid, status)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the name of register number REGNO in the form input and
|
/* Return the name of register number REGNO in the form input and
|
||||||
output by hms.
|
output by hms.
|
||||||
|
|
||||||
Returns a pointer to a static buffer containing the answer. */
|
Returns a pointer to a static buffer containing the answer. */
|
||||||
static char *
|
static char *
|
||||||
|
@ -769,7 +566,7 @@ get_reg_name (regno)
|
||||||
return rn[regno];
|
return rn[regno];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read the remote registers. */
|
/* Read the remote registers. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gethex (length, start, ok)
|
gethex (length, start, ok)
|
||||||
|
@ -793,9 +590,9 @@ gethex (length, start, ok)
|
||||||
}
|
}
|
||||||
else if
|
else if
|
||||||
(*start >= '0' && *start <= '9')
|
(*start >= '0' && *start <= '9')
|
||||||
{
|
{
|
||||||
result += *start - '0';
|
result += *start - '0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*ok = 0;
|
*ok = 0;
|
||||||
start++;
|
start++;
|
||||||
|
@ -855,13 +652,13 @@ hms_write_cr (s)
|
||||||
|
|
||||||
/* H8/500 monitor reg dump looks like:
|
/* H8/500 monitor reg dump looks like:
|
||||||
|
|
||||||
HMS>r
|
HMS>r
|
||||||
PC:8000 SR:070C .7NZ.. CP:00 DP:00 EP:00 TP:00 BR:00
|
PC:8000 SR:070C .7NZ.. CP:00 DP:00 EP:00 TP:00 BR:00
|
||||||
R0-R7: FF5A 0001 F4FE F500 0000 F528 F528 F4EE
|
R0-R7: FF5A 0001 F4FE F500 0000 F528 F528 F4EE
|
||||||
HMS>
|
HMS>
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
supply_val (n, size, ptr, segptr)
|
supply_val (n, size, ptr, segptr)
|
||||||
int n;
|
int n;
|
||||||
|
@ -926,18 +723,18 @@ hms_fetch_register (dummy)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
012
|
012
|
||||||
r**
|
r**
|
||||||
-------1---------2---------3---------4---------5-----
|
-------1---------2---------3---------4---------5-----
|
||||||
345678901234567890123456789012345678901234567890123456
|
345678901234567890123456789012345678901234567890123456
|
||||||
PC:8000 SR:070C .7NZ.. CP:00 DP:00 EP:00 TP:00 BR:00**
|
PC:8000 SR:070C .7NZ.. CP:00 DP:00 EP:00 TP:00 BR:00**
|
||||||
---6---------7---------8---------9--------10----
|
---6---------7---------8---------9--------10----
|
||||||
789012345678901234567890123456789012345678901234
|
789012345678901234567890123456789012345678901234
|
||||||
R0-R7: FF5A 0001 F4FE F500 0000 F528 F528 F4EE**
|
R0-R7: FF5A 0001 F4FE F500 0000 F528 F528 F4EE**
|
||||||
|
|
||||||
56789
|
56789
|
||||||
HMS>
|
HMS>
|
||||||
*/
|
*/
|
||||||
gottok = 1;
|
gottok = 1;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1008,10 +805,10 @@ hms_fetch_register (dummy)
|
||||||
linebuf[77] == 'S')
|
linebuf[77] == 'S')
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
PC=XXXX CCR=XX:XXXXXXXX R0-R7= XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
|
PC=XXXX CCR=XX:XXXXXXXX R0-R7= XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
|
||||||
5436789012345678901234567890123456789012345678901234567890123456789012
|
5436789012345678901234567890123456789012345678901234567890123456789012
|
||||||
0 1 2 3 4 5 6
|
0 1 2 3 4 5 6
|
||||||
*/
|
*/
|
||||||
gottok = 1;
|
gottok = 1;
|
||||||
|
|
||||||
reg[PC_REGNUM] = gethex (4, linebuf + 6, &gottok);
|
reg[PC_REGNUM] = gethex (4, linebuf + 6, &gottok);
|
||||||
|
@ -1093,7 +890,7 @@ int
|
||||||
hms_fetch_word (addr)
|
hms_fetch_word (addr)
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
{
|
{
|
||||||
return dcache_fetch (addr);
|
return dcache_fetch (remote_dcache, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write a word WORD into remote address ADDR.
|
/* Write a word WORD into remote address ADDR.
|
||||||
|
@ -1104,7 +901,7 @@ hms_store_word (addr, word)
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
int word;
|
int word;
|
||||||
{
|
{
|
||||||
dcache_poke (addr, word);
|
dcache_poke (remote_dcache, addr, word);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1241,7 +1038,7 @@ hms_files_info ()
|
||||||
|
|
||||||
/* Copy LEN bytes of data from debugger memory at MYADDR
|
/* Copy LEN bytes of data from debugger memory at MYADDR
|
||||||
to inferior's memory at MEMADDR. Returns errno value.
|
to inferior's memory at MEMADDR. Returns errno value.
|
||||||
* sb/sh instructions don't work on unaligned addresses, when TU=1.
|
* sb/sh instructions don't work on unaligned addresses, when TU=1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Read LEN bytes from inferior memory at MEMADDR. Put the result
|
/* Read LEN bytes from inferior memory at MEMADDR. Put the result
|
||||||
|
@ -1261,10 +1058,10 @@ hms_read_inferior_memory (memaddr, myaddr, len)
|
||||||
int ok = 1;
|
int ok = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
AAAA: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX '................'
|
AAAA: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX '................'
|
||||||
012345678901234567890123456789012345678901234567890123456789012345
|
012345678901234567890123456789012345678901234567890123456789012345
|
||||||
0 1 2 3 4 5 6
|
0 1 2 3 4 5 6
|
||||||
*/
|
*/
|
||||||
char buffer[66];
|
char buffer[66];
|
||||||
|
|
||||||
if (memaddr & 0xf)
|
if (memaddr & 0xf)
|
||||||
|
@ -1274,9 +1071,9 @@ hms_read_inferior_memory (memaddr, myaddr, len)
|
||||||
|
|
||||||
sprintf (buffer, "m %4x %4x", start & 0xffff, end & 0xffff);
|
sprintf (buffer, "m %4x %4x", start & 0xffff, end & 0xffff);
|
||||||
|
|
||||||
flush();
|
flush ();
|
||||||
hms_write_cr (buffer);
|
hms_write_cr (buffer);
|
||||||
/* drop the echo and newline*/
|
/* drop the echo and newline */
|
||||||
for (i = 0; i < 13; i++)
|
for (i = 0; i < 13; i++)
|
||||||
readchar ();
|
readchar ();
|
||||||
|
|
||||||
|
@ -1292,22 +1089,23 @@ hms_read_inferior_memory (memaddr, myaddr, len)
|
||||||
char byte[16];
|
char byte[16];
|
||||||
|
|
||||||
buffer[0] = readchar ();
|
buffer[0] = readchar ();
|
||||||
while (buffer[0] == '\r'
|
while (buffer[0] == '\r'
|
||||||
|| buffer[0] == '\n')
|
|| buffer[0] == '\n')
|
||||||
buffer[0] = readchar ();
|
buffer[0] = readchar ();
|
||||||
|
|
||||||
if (buffer[0] == 'M')
|
if (buffer[0] == 'M')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
for (i = 1; i < 50; i++) {
|
for (i = 1; i < 50; i++)
|
||||||
buffer[i] = readchar ();
|
{
|
||||||
}
|
buffer[i] = readchar ();
|
||||||
|
}
|
||||||
/* sometimes we loose characters in the ascii representation of the
|
/* sometimes we loose characters in the ascii representation of the
|
||||||
data. I don't know where. So just scan for the end of line */
|
data. I don't know where. So just scan for the end of line */
|
||||||
i = readchar();
|
i = readchar ();
|
||||||
while (i != '\n' && i != '\r')
|
while (i != '\n' && i != '\r')
|
||||||
i = readchar();
|
i = readchar ();
|
||||||
|
|
||||||
/* Now parse the line */
|
/* Now parse the line */
|
||||||
|
|
||||||
addr = gethex (4, buffer, &ok);
|
addr = gethex (4, buffer, &ok);
|
||||||
|
@ -1428,10 +1226,47 @@ hms_com (args, fromtty)
|
||||||
/* Clear all input so only command relative output is displayed */
|
/* Clear all input so only command relative output is displayed */
|
||||||
|
|
||||||
hms_write_cr (args);
|
hms_write_cr (args);
|
||||||
/* hms_write ("\030", 1);*/
|
/* hms_write ("\030", 1); */
|
||||||
expect_prompt ();
|
expect_prompt ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
hms_open (name, from_tty)
|
||||||
|
char *name;
|
||||||
|
int from_tty;
|
||||||
|
{
|
||||||
|
unsigned int prl;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if (name == 0)
|
||||||
|
{
|
||||||
|
name = "";
|
||||||
|
}
|
||||||
|
if (is_open)
|
||||||
|
hms_close (0);
|
||||||
|
dev_name = strdup (name);
|
||||||
|
|
||||||
|
if (!(desc = SERIAL_OPEN (dev_name)))
|
||||||
|
perror_with_name ((char *) dev_name);
|
||||||
|
|
||||||
|
SERIAL_RAW (desc);
|
||||||
|
is_open = 1;
|
||||||
|
push_target (&hms_ops);
|
||||||
|
dcache_init (hms_read_inferior_memory,
|
||||||
|
hms_write_inferior_memory);
|
||||||
|
|
||||||
|
/* Hello? Are you there? */
|
||||||
|
SERIAL_WRITE (desc, "\r\n", 2);
|
||||||
|
expect_prompt ();
|
||||||
|
|
||||||
|
/* Clear any break points */
|
||||||
|
hms_clear_breakpoints ();
|
||||||
|
|
||||||
|
printf_filtered ("Connected to remote board running HMS monitor.\n");
|
||||||
|
add_commands ();
|
||||||
|
/* hms_drain (); */
|
||||||
|
}
|
||||||
|
|
||||||
/* Define the target subroutine names */
|
/* Define the target subroutine names */
|
||||||
|
|
||||||
struct target_ops hms_ops =
|
struct target_ops hms_ops =
|
||||||
|
@ -1446,7 +1281,7 @@ by a serial line.",
|
||||||
hms_prepare_to_store,
|
hms_prepare_to_store,
|
||||||
hms_xfer_inferior_memory,
|
hms_xfer_inferior_memory,
|
||||||
hms_files_info,
|
hms_files_info,
|
||||||
hms_insert_breakpoint, hms_remove_breakpoint, /* Breakpoints */
|
hms_insert_breakpoint, hms_remove_breakpoint, /* Breakpoints */
|
||||||
0, 0, 0, 0, 0, /* Terminal handling */
|
0, 0, 0, 0, 0, /* Terminal handling */
|
||||||
hms_kill, /* FIXME, kill */
|
hms_kill, /* FIXME, kill */
|
||||||
gr_load_image,
|
gr_load_image,
|
||||||
|
@ -1462,7 +1297,7 @@ by a serial line.",
|
||||||
OPS_MAGIC, /* Always the last thing */
|
OPS_MAGIC, /* Always the last thing */
|
||||||
};
|
};
|
||||||
|
|
||||||
hms_quiet () /* FIXME - this routine can be removed after Dec '94 */
|
hms_quiet () /* FIXME - this routine can be removed after Dec '94 */
|
||||||
{
|
{
|
||||||
quiet = !quiet;
|
quiet = !quiet;
|
||||||
if (quiet)
|
if (quiet)
|
||||||
|
@ -1470,7 +1305,7 @@ hms_quiet () /* FIXME - this routine can be removed after Dec '94 */
|
||||||
else
|
else
|
||||||
printf_filtered ("Snoop enabled\n");
|
printf_filtered ("Snoop enabled\n");
|
||||||
|
|
||||||
printf_filtered("`snoop' is obsolete, please use `set remotedebug'.\n");
|
printf_filtered ("`snoop' is obsolete, please use `set remotedebug'.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
hms_device (s)
|
hms_device (s)
|
||||||
|
@ -1544,6 +1379,7 @@ remove_commands ()
|
||||||
delete_cmd ("hms-drain", &cmdlist);
|
delete_cmd ("hms-drain", &cmdlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_initialize_remote_hms ()
|
_initialize_remote_hms ()
|
||||||
{
|
{
|
||||||
|
@ -1552,7 +1388,7 @@ _initialize_remote_hms ()
|
||||||
add_com ("hms <command>", class_obscure, hms_com,
|
add_com ("hms <command>", class_obscure, hms_com,
|
||||||
"Send a command to the HMS monitor.");
|
"Send a command to the HMS monitor.");
|
||||||
|
|
||||||
/* FIXME - hms_quiet and `snoop' can be removed after Dec '94 */
|
/* FIXME - hms_quiet and `snoop' can be removed after Dec '94 */
|
||||||
add_com ("snoop", class_obscure, hms_quiet,
|
add_com ("snoop", class_obscure, hms_quiet,
|
||||||
"Show what commands are going to the monitor (OBSOLETE - see 'set remotedebug')");
|
"Show what commands are going to the monitor (OBSOLETE - see 'set remotedebug')");
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue