This is the mail archive of the
crossgcc@cygnus.com
mailing list for the crossgcc project.
Re: gdb via BDM or Ethernet?
Vaughan,
Like I said, the BDM hardware is certainly not free.
However, I have attached the two files that allow you
to build a powerpc-eabi-gdb.
The remote-estppc.c file goes in the gdb-4.17/gdb
directory. The ppc-sim.mt file goes in the
gdb-4.17/gdb/config/powerpc directory.
When you connect to the BDM, use the
"target estppc hostname" command...
Or something like that...
peace,
mike
Vaughan Hillman wrote:
> --- Mike Moran <moran@mindspring.com> wrote:
> > Dr. Pollak,
> >
> > If you are willing to cough-up the cash for an EST
> > Corporation "VisionNet"
> > BDM for the MPC8XX, I can give you a copy of the GDB
> > backend that will
> > work with it.
>
> Is this something that is publicly available?
> I would be interested in the BDM backend for GDB.
>
> > I've used the EST boxes for the CPU32
> > and the MPC860. The
> > VisionNet has an ethernet port and a serial port.
> > The backend will work with
> > either. The cost is around $2.5K if I remember
> > correctly, however, it provides
> > what I consider a nice solution. A cheaper version
> > without the ethernet
> > is available, but the download speeds are
> > considerably slower, and its more
> > difficult to share the target with others in a
> > group.
> >
> > let me know,
> > mike
> >
>
> Thanks,
> Vaughan
/* Remote debugging interface for EST-300 ICE, for GDB
Copyright 1995 Free Software Foundation, Inc.
Contributed by Cygnus Support.
Written by Steve Chamberlain for Cygnus Support.
Re-written by Stu Grossman of Cygnus Support
This file is part of GDB.
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "defs.h"
#include "gdbcore.h"
#include "target.h"
#include "monitor.h"
#include "serial.h"
static void estppc_open PARAMS ((char *args, int from_tty));
static void
estppc_supply_register (regname, regnamelen, val, vallen)
char *regname;
int regnamelen;
char *val;
int vallen;
{
int regno = 0, base = 0;
if (regnamelen < 2 || regnamelen > 4)
return;
switch (regname[0])
{
case 'R':
if (regname[1] < '0' || regname[1] > '9') return;
if (regnamelen == 2)
regno = regname[1] - '0';
else if (regnamelen == 3 && regname[2] >= '0' && regname[2] <= '9')
regno = (regname[1] - '0') * 10 + (regname[2] - '0');
else
return;
break;
case 'P':
if (regnamelen != 2 || regname[1] != 'C') return;
regno = 64; /* pc */
break;
case 'M':
if (regnamelen != 3 || regname[1] != 'S' || regname[2] != 'R') return;
regno = 65; /* msr */
break;
case 'C':
if (regnamelen == 2 && regname[1] == 'R'){
regno = 66; /* cnd */
}
else if (regnamelen == 3 && regname[1] == 'T' && regname[2] == 'R'){
regno = 68; /* ctr */
}
else return;
break;
case 'L':
if (regnamelen != 2 || regname[1] != 'R') return;
regno = 67;
break;
case 'X':
if (regnamelen != 3 && regname[1] != 'E' && regname[2] != 'R') return;
regno = 69;
break;
default:
return;
}
monitor_supply_register (regno, val);
}
/*
* This array of registers needs to match the indexes used by GDB. The
* whole reason this exists is because the various ROM monitors use
* different names than GDB does, and don't support all the
* registers either. So, typing "info reg sp" becomes a "r30".
*/
static char *estppc_regnames[NUM_REGS] =
{
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
"r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
"fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
"fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
"fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",
"fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31",
/* pc ps cnd lr cnt xer mq */
#if 1
"pc", "msr", "cr", "lr", "ctr", "xer", "spr0"
#else
"ip", "msr", "cr", "spr8", "spr9", "spr1", "spr0"
#endif
};
/*
* Define the monitor command strings. Since these are passed directly
* through to a printf style function, we need can include formatting
* strings. We also need a CR or LF on the end.
*/
static struct target_ops estppc_ops;
static char *estppc_inits[] = {"he\r", /* Resets the prompt, and clears repeated cmds */
NULL};
static struct monitor_ops estppc_cmds =
{
MO_CLR_BREAK_USES_ADDR | MO_FILL_USES_ADDR | MO_NEED_REGDUMP_AFTER_CONT |
MO_SREC_ACK | MO_SREC_ACK_PLUS,
estppc_inits, /* Init strings */
"go\r", /* continue command */
"sidr\r", /* single step */
"\003", /* ^C interrupts the program */
"sb %x\r", /* set a breakpoint */
"rb %x\r", /* clear a breakpoint */
"rb\r", /* clear all breakpoints */
"bfb %x %x %x\r", /* fill (start end val) */
{
"smb %x %x\r", /* setmem.cmdb (addr, value) */
"smw %x %x\r", /* setmem.cmdw (addr, value) */
"sml %x %x\r", /* setmem.cmdl (addr, value) */
NULL, /* setmem.cmdll (addr, value) */
NULL, /* setreg.resp_delim */
NULL, /* setreg.term */
NULL, /* setreg.term_cmd */
},
{
"dmb %x %x\r", /* getmem.cmdb (addr, len) */
"dmw %x %x\r", /* getmem.cmdw (addr, len) */
"dml %x %x\r", /* getmem.cmdl (addr, len) */
NULL, /* getmem.cmdll (addr, len) */
": ", /* getmem.resp_delim */
NULL, /* getmem.term */
NULL, /* getmem.term_cmd */
},
{
"sr %s %x\r", /* setreg.cmd (name, value) */
NULL, /* setreg.resp_delim */
NULL, /* setreg.term */
NULL /* setreg.term_cmd */
},
{
"dr %s\r", /* getreg.cmd (name) */
" = ", /* getreg.resp_delim */
NULL, /* getreg.term */
NULL /* getreg.term_cmd */
},
"dr\r", /* dump_registers */
"\\(\\w+\\) = \\([0-9a-fA-F]+\\)", /* register_pattern */
estppc_supply_register, /* supply_register */
NULL, /* load_routine (defaults to SRECs) */
"dl\r", /* download command */
"+", /* load response */
">BKM>", /* monitor command prompt */
"\r", /* end-of-line terminator */
NULL, /* optional command terminator */
&estppc_ops, /* target operations */
SERIAL_1_STOPBITS, /* number of stop bits */
estppc_regnames, /* registers names */
MONITOR_OPS_MAGIC /* magic */
};
static void
estppc_open(args, from_tty)
char *args;
int from_tty;
{
monitor_open (args, &estppc_cmds, from_tty);
}
void
_initialize_est ()
{
init_monitor_ops (&estppc_ops);
estppc_ops.to_shortname = "estppc";
estppc_ops.to_longname = "EST PowerPC background debug monitor";
estppc_ops.to_doc = "Debug via the EST PowerPC BDM.\n\
Specify the serial device it is connected to (e.g. /dev/ttya).";
estppc_ops.to_open = estppc_open;
add_target (&estppc_ops);
}
# Target: PowerPC running eabi and including the simulator
TDEPFILES= ser-ocd.o rs6000-tdep.o monitor.o dsrec.o ppcbug-rom.o dink32-rom.o ppc-bdm.o ocd.o remote-sds.o remote-estppc.o
TM_FILE= tm-ppc-eabi.h
SIM_OBS = remote-sim.o
SIM = ../sim/ppc/libsim.a