This is the mail archive of the crossgcc@cygnus.com mailing list for the crossgcc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]