#include "defs.h"
#include "gdbcore.h"
#include "target.h"
#include "monitor.h"
#include "serial.h"
#include "srec.h"
#include "symtab.h"
#include "symfile.h"
#include "regcache.h"
#include <time.h>
extern void report_transfer_performance (unsigned long, time_t, time_t);
static struct target_ops sparclet_ops;
static void sparclet_open (char *args, int from_tty);
static char *sparclet_regnames[] = {
"g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
"o0", "o1", "o2", "o3", "o4", "o5", "o6", "o7",
"l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
"i0", "i1", "i2", "i3", "i4", "i5", "i6", "i7",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"y", "psr", "wim", "tbr", "pc", "npc", "", "",
"ccsr", "ccpr", "cccrcr", "ccor", "ccobr", "ccibr", "ccir", "",
"asr1", "", "asr17", "asr18", "", "asr20", "asr21", "asr22",
};
static void
sparclet_supply_register (char *regname, int regnamelen, char *val, int vallen)
{
return;
}
static void
sparclet_load (struct serial *desc, char *file, int hashmark)
{
bfd *abfd;
asection *s;
int i;
CORE_ADDR load_offset;
time_t start_time, end_time;
unsigned long data_count = 0;
i = sscanf (file, "%*s 0x%lx", &load_offset);
if (i >= 1)
{
char *p;
for (p = file; *p != '\000' && !isspace (*p); p++);
*p = '\000';
}
else
load_offset = 0;
abfd = bfd_openr (file, 0);
if (!abfd)
{
printf_filtered ("Unable to open file %s\n", file);
return;
}
if (bfd_check_format (abfd, bfd_object) == 0)
{
printf_filtered ("File is not an object file\n");
return;
}
start_time = time (NULL);
for (s = abfd->sections; s; s = s->next)
if (s->flags & SEC_LOAD)
{
bfd_size_type section_size;
bfd_vma vma;
vma = bfd_get_section_vma (abfd, s) + load_offset;
section_size = bfd_section_size (abfd, s);
data_count += section_size;
printf_filtered ("%s\t: 0x%4x .. 0x%4x ",
bfd_get_section_name (abfd, s), vma,
vma + section_size);
gdb_flush (gdb_stdout);
monitor_printf ("load c r %x %x\r", vma, section_size);
monitor_expect ("load: loading ", NULL, 0);
monitor_expect ("\r", NULL, 0);
for (i = 0; i < section_size; i += 2048)
{
int numbytes;
char buf[2048];
numbytes = min (sizeof buf, section_size - i);
bfd_get_section_contents (abfd, s, buf, i, numbytes);
serial_write (desc, buf, numbytes);
if (hashmark)
{
putchar_unfiltered ('#');
gdb_flush (gdb_stdout);
}
}
monitor_expect_prompt (NULL, 0);
putchar_unfiltered ('\n');
}
monitor_printf ("reg pc %x\r", bfd_get_start_address (abfd));
monitor_expect_prompt (NULL, 0);
monitor_printf ("reg npc %x\r", bfd_get_start_address (abfd) + 4);
monitor_expect_prompt (NULL, 0);
monitor_printf ("run\r");
end_time = time (NULL);
if (hashmark)
putchar_unfiltered ('\n');
report_transfer_performance (data_count, start_time, end_time);
pop_target ();
push_remote_target (monitor_get_dev_name (), 1);
return_to_top_level (RETURN_QUIT);
}
static char *sparclet_inits[] =
{"\n\r\r\n", NULL};
static struct monitor_ops sparclet_cmds;
static void
init_sparclet_cmds (void)
{
sparclet_cmds.flags = MO_CLR_BREAK_USES_ADDR |
MO_HEX_PREFIX |
MO_NO_ECHO_ON_OPEN |
MO_NO_ECHO_ON_SETMEM |
MO_RUN_FIRST_TIME |
MO_GETMEM_READ_SINGLE;
sparclet_cmds.init = sparclet_inits;
sparclet_cmds.cont = "cont\r";
sparclet_cmds.step = "step\r";
sparclet_cmds.stop = "\r";
sparclet_cmds.set_break = "+bp %x\r";
sparclet_cmds.clr_break = "-bp %x\r";
sparclet_cmds.clr_all_break = "-bp %x\r";
"-bp\r";
sparclet_cmds.fill = "fill %x -n %x -v %x -b\r";
sparclet_cmds.setmem.cmdb = "ex %x -b\r%x\rq\r";
sparclet_cmds.setmem.cmdw = "ex %x -s\r%x\rq\r";
sparclet_cmds.setmem.cmdl = "ex %x -l\r%x\rq\r";
sparclet_cmds.setmem.cmdll = NULL;
sparclet_cmds.setmem.resp_delim = NULL;
sparclet_cmds.setmem.term = NULL;
sparclet_cmds.setmem.term_cmd = NULL;
sparclet_cmds.getmem.cmdb = "ex %x -n 1 -b\r";
sparclet_cmds.getmem.cmdw = "ex %x -n 1 -s\r";
sparclet_cmds.getmem.cmdl = "ex %x -n 1 -l\r";
sparclet_cmds.getmem.cmdll = NULL;
sparclet_cmds.getmem.resp_delim = ": ";
sparclet_cmds.getmem.term = NULL;
sparclet_cmds.getmem.term_cmd = NULL;
sparclet_cmds.setreg.cmd = "reg %s 0x%x\r";
sparclet_cmds.setreg.resp_delim = NULL;
sparclet_cmds.setreg.term = NULL;
sparclet_cmds.setreg.term_cmd = NULL;
sparclet_cmds.getreg.cmd = "reg %s\r";
sparclet_cmds.getreg.resp_delim = " ";
sparclet_cmds.getreg.term = NULL;
sparclet_cmds.getreg.term_cmd = NULL;
sparclet_cmds.dump_registers = "reg\r";
sparclet_cmds.register_pattern = "\\(\\w+\\)=\\([0-9a-fA-F]+\\)";
sparclet_cmds.supply_register = sparclet_supply_register;
sparclet_cmds.load_routine = sparclet_load;
sparclet_cmds.load = NULL;
sparclet_cmds.loadresp = NULL;
sparclet_cmds.prompt = "monitor>";
sparclet_cmds.line_term = "\r";
sparclet_cmds.cmd_end = NULL;
sparclet_cmds.target = &sparclet_ops;
sparclet_cmds.stopbits = SERIAL_1_STOPBITS;
sparclet_cmds.regnames = sparclet_regnames;
sparclet_cmds.magic = MONITOR_OPS_MAGIC;
};
static void
sparclet_open (char *args, int from_tty)
{
monitor_open (args, &sparclet_cmds, from_tty);
}
void
_initialize_sparclet (void)
{
int i;
init_sparclet_cmds ();
for (i = 0; i < NUM_REGS; i++)
if (sparclet_regnames[i][0] == 'c' ||
sparclet_regnames[i][0] == 'a')
sparclet_regnames[i] = 0;
sparclet_regnames[0] = 0;
init_monitor_ops (&sparclet_ops);
sparclet_ops.to_shortname = "sparclet";
sparclet_ops.to_longname = "SPARC Sparclet monitor";
sparclet_ops.to_insert_breakpoint = memory_insert_breakpoint;
sparclet_ops.to_remove_breakpoint = memory_remove_breakpoint;
sparclet_ops.to_doc =
"Use a board running the Sparclet debug monitor.\n\
Specify the serial device it is connected to (e.g. /dev/ttya).";
sparclet_ops.to_open = sparclet_open;
add_target (&sparclet_ops);
}