Sun Aug 10 16:49:09 1997 Geoffrey Noer <noer@cygnus.com>
* ocd.c: move ocd_write_bytes proto to ocd.h since it is used by ppc-bdm.c, use OCD_LOG_FILE to help debugging, define BDM_BREAKPOINT if not defined in tm.h (ocd_error): add new error cases (ocd_start_remote): send the OCD_INIT command before OCD_AYT and OCD_GET_VERSION calls (ocd_write_bytes): no longer static (ocd_insert_breakpoint): no longer static (ocd_remove_breakpoint): new * ocd.h: add protos for ocd_write_bytes, ocd_insert_breakpoint, and ocd_remove_breakpoint * ppc-bdm.c: change bdm_ppc_ops so we call ocd_insert_breakpoint and ocd_remove_breakpoint instead of memory_insert_breakpoint and memory_remove_breakpoint. (bdm_ppc_open): after calling ocd_open, modify DER register so interrupts will drop us into debugging mode, finally disable the watchdog timer on the board so we don't leave BDM mode unexpectedly.
This commit is contained in:
parent
210e033e19
commit
160db9b295
4 changed files with 95 additions and 23 deletions
|
@ -1,3 +1,24 @@
|
|||
Sun Aug 10 16:49:09 1997 Geoffrey Noer <noer@cygnus.com>
|
||||
|
||||
* ocd.c: move ocd_write_bytes proto to ocd.h since it is used
|
||||
by ppc-bdm.c, use OCD_LOG_FILE to help debugging, define
|
||||
BDM_BREAKPOINT if not defined in tm.h
|
||||
(ocd_error): add new error cases
|
||||
(ocd_start_remote): send the OCD_INIT command before
|
||||
OCD_AYT and OCD_GET_VERSION calls
|
||||
(ocd_write_bytes): no longer static
|
||||
(ocd_insert_breakpoint): no longer static
|
||||
(ocd_remove_breakpoint): new
|
||||
* ocd.h: add protos for ocd_write_bytes, ocd_insert_breakpoint,
|
||||
and ocd_remove_breakpoint
|
||||
* ppc-bdm.c: change bdm_ppc_ops so we call ocd_insert_breakpoint
|
||||
and ocd_remove_breakpoint instead of memory_insert_breakpoint
|
||||
and memory_remove_breakpoint.
|
||||
(bdm_ppc_open): after calling ocd_open, modify DER
|
||||
register so interrupts will drop us into debugging mode, finally
|
||||
disable the watchdog timer on the board so we don't leave BDM
|
||||
mode unexpectedly.
|
||||
|
||||
Sat Aug 9 01:50:14 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||
|
||||
* values.c (value_primitive_field): Account for offset when
|
||||
|
|
77
gdb/ocd.c
77
gdb/ocd.c
|
@ -1,4 +1,4 @@
|
|||
/* Remote target communications for the Macraigor Systems BDM Wiggler
|
||||
/* Target communications support for Macraigor Systems' On-Chip Debugging
|
||||
Copyright 1996, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
@ -38,9 +38,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
|
||||
/* Prototypes for local functions */
|
||||
|
||||
static int ocd_write_bytes PARAMS ((CORE_ADDR memaddr,
|
||||
char *myaddr, int len));
|
||||
|
||||
static int ocd_read_bytes PARAMS ((CORE_ADDR memaddr,
|
||||
char *myaddr, int len));
|
||||
|
||||
|
@ -101,16 +98,17 @@ ocd_error (s, error_code)
|
|||
case 0x1: s = "Unknown fault"; break;
|
||||
case 0x2: s = "Power failed"; break;
|
||||
case 0x3: s = "Cable disconnected"; break;
|
||||
case 0x4: s = "Couldn't enter BDM"; break;
|
||||
case 0x4: s = "Couldn't enter OCD mode"; break;
|
||||
case 0x5: s = "Target stuck in reset"; break;
|
||||
case 0x6: s = "Port not configured"; break;
|
||||
case 0x6: s = "OCD hasn't been initialized"; break;
|
||||
case 0x7: s = "Write verify failed"; break;
|
||||
case 0x8: s = "Reg buff error (during MPC5xx fp reg read/write)"; break;
|
||||
case 0x9: s = "Invalid CPU register access attempt failed"; break;
|
||||
case 0x11: s = "Bus error"; break;
|
||||
case 0x12: s = "Checksum error"; break;
|
||||
case 0x13: s = "Illegal command"; break;
|
||||
case 0x14: s = "Parameter error"; break;
|
||||
case 0x15: s = "Internal error"; break;
|
||||
case 0x16: s = "Register buffer error"; break;
|
||||
case 0x80: s = "Flash erase error"; break;
|
||||
default:
|
||||
sprintf (buf, "Unknown error code %d", error_code);
|
||||
|
@ -160,15 +158,7 @@ ocd_start_remote (dummy)
|
|||
|
||||
SERIAL_SEND_BREAK (ocd_desc); /* Wake up the wiggler */
|
||||
|
||||
ocd_do_command (OCD_AYT, &status, &pktlen);
|
||||
|
||||
p = ocd_do_command (OCD_GET_VERSION, &status, &pktlen);
|
||||
|
||||
printf_unfiltered ("[Wiggler version %x.%x, capability 0x%x]\n",
|
||||
p[0], p[1], (p[2] << 16) | p[3]);
|
||||
|
||||
#if 1
|
||||
speed = 0; /* 80; /* Divide clock by 4000 */
|
||||
speed = 0; /* 80; /* Divide clock by 4000 */
|
||||
|
||||
buf[0] = OCD_INIT;
|
||||
buf[1] = speed >> 8;
|
||||
|
@ -185,7 +175,13 @@ ocd_start_remote (dummy)
|
|||
|
||||
if (error_code != 0)
|
||||
ocd_error ("OCD_INIT:", error_code);
|
||||
#endif
|
||||
|
||||
ocd_do_command (OCD_AYT, &status, &pktlen);
|
||||
|
||||
p = ocd_do_command (OCD_GET_VERSION, &status, &pktlen);
|
||||
|
||||
printf_unfiltered ("[Wiggler version %x.%x, capability 0x%x]\n",
|
||||
p[0], p[1], (p[2] << 16) | p[3]);
|
||||
|
||||
#if 0
|
||||
/* Reset the target */
|
||||
|
@ -236,6 +232,11 @@ ocd_start_remote (dummy)
|
|||
ocd_put_packet (buf, 2);
|
||||
p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
|
||||
|
||||
buf[0] = OCD_LOG_FILE;
|
||||
buf[1] = 2; /* append to existing WIGGLERS.LOG */
|
||||
ocd_put_packet (buf, 2);
|
||||
p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -606,7 +607,7 @@ ocd_prepare_to_store ()
|
|||
|
||||
static int write_mem_command = OCD_WRITE_MEM;
|
||||
|
||||
static int
|
||||
int
|
||||
ocd_write_bytes (memaddr, myaddr, len)
|
||||
CORE_ADDR memaddr;
|
||||
char *myaddr;
|
||||
|
@ -1180,6 +1181,9 @@ ocd_do_command (cmd, statusp, lenp)
|
|||
int status, error_code;
|
||||
char errbuf[100];
|
||||
|
||||
unsigned char logbuf[100];
|
||||
int logpktlen;
|
||||
|
||||
buf[0] = cmd;
|
||||
ocd_put_packet (buf, 1); /* Send command */
|
||||
p = ocd_get_packet (*buf, lenp, remote_timeout);
|
||||
|
@ -1203,6 +1207,16 @@ ocd_do_command (cmd, statusp, lenp)
|
|||
|
||||
*statusp = status;
|
||||
|
||||
logbuf[0] = OCD_LOG_FILE;
|
||||
logbuf[1] = 3; /* close existing WIGGLERS.LOG */
|
||||
ocd_put_packet (logbuf, 2);
|
||||
ocd_get_packet (logbuf[0], &logpktlen, remote_timeout);
|
||||
|
||||
logbuf[0] = OCD_LOG_FILE;
|
||||
logbuf[1] = 2; /* append to existing WIGGLERS.LOG */
|
||||
ocd_put_packet (logbuf, 2);
|
||||
ocd_get_packet (logbuf[0], &logpktlen, remote_timeout);
|
||||
|
||||
return p + 3;
|
||||
}
|
||||
|
||||
|
@ -1264,9 +1278,17 @@ ocd_load (args, from_tty)
|
|||
clear_symtab_users ();
|
||||
}
|
||||
|
||||
/* This should be defined in each targets tm.h file */
|
||||
/* But we want to be able to compile this file for some configurations
|
||||
not yet supported fully */
|
||||
|
||||
#ifndef BDM_BREAKPOINT
|
||||
#define BDM_BREAKPOINT 0x4a, 0xfa /* BGND insn on CPU32*/
|
||||
#endif
|
||||
|
||||
/* BDM (at least on CPU32) uses a different breakpoint */
|
||||
|
||||
static int
|
||||
int
|
||||
ocd_insert_breakpoint (addr, contents_cache)
|
||||
CORE_ADDR addr;
|
||||
char *contents_cache;
|
||||
|
@ -1274,10 +1296,23 @@ ocd_insert_breakpoint (addr, contents_cache)
|
|||
static char break_insn[] = {BDM_BREAKPOINT};
|
||||
int val;
|
||||
|
||||
val = target_read_memory (addr, contents_cache, sizeof break_insn);
|
||||
val = target_read_memory (addr, contents_cache, sizeof (break_insn));
|
||||
|
||||
if (val == 0)
|
||||
val = target_write_memory (addr, break_insn, sizeof break_insn);
|
||||
val = target_write_memory (addr, break_insn, sizeof (break_insn));
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
int
|
||||
ocd_remove_breakpoint (addr, contents_cache)
|
||||
CORE_ADDR addr;
|
||||
char *contents_cache;
|
||||
{
|
||||
static char break_insn[] = {BDM_BREAKPOINT};
|
||||
int val;
|
||||
|
||||
val = target_write_memory (addr, contents_cache, sizeof (break_insn));
|
||||
|
||||
return val;
|
||||
}
|
||||
|
|
|
@ -131,4 +131,9 @@ void ocd_write_bdm_register PARAMS ((int bdm_regno, CORE_ADDR reg));
|
|||
|
||||
int ocd_wait PARAMS ((void));
|
||||
|
||||
int ocd_insert_breakpoint PARAMS ((CORE_ADDR addr, char *contents_cache));
|
||||
int ocd_remove_breakpoint PARAMS ((CORE_ADDR addr, char *contents_cache));
|
||||
|
||||
int ocd_write_bytes PARAMS ((CORE_ADDR memaddr, char *myaddr, int len));
|
||||
|
||||
#endif /* OCD_H */
|
||||
|
|
|
@ -50,12 +50,23 @@ extern struct target_ops bdm_ppc_ops; /* Forward decl */
|
|||
/* Open a connection to a remote debugger.
|
||||
NAME is the filename used for communication. */
|
||||
|
||||
char nowatchdog[4] = {0xff,0xff,0xff,0x88};
|
||||
|
||||
static void
|
||||
bdm_ppc_open (name, from_tty)
|
||||
char *name;
|
||||
int from_tty;
|
||||
{
|
||||
CORE_ADDR watchdogaddr = 0xff000004;
|
||||
|
||||
ocd_open (name, from_tty, OCD_TARGET_MOTO_PPC, &bdm_ppc_ops);
|
||||
|
||||
/* We want interrupts to drop us into debugging mode. */
|
||||
/* Modify the DER register to accomplish this. */
|
||||
ocd_write_bdm_register (149, 0x20024000);
|
||||
|
||||
/* Disable watchdog timer on the board */
|
||||
ocd_write_bytes (watchdogaddr, nowatchdog, 4);
|
||||
}
|
||||
|
||||
/* Wait until the remote machine stops, then return,
|
||||
|
@ -225,8 +236,8 @@ struct target_ops bdm_ppc_ops = {
|
|||
ocd_prepare_to_store, /* to_prepare_to_store */
|
||||
ocd_xfer_memory, /* to_xfer_memory */
|
||||
ocd_files_info, /* to_files_info */
|
||||
memory_insert_breakpoint, /* to_insert_breakpoint */
|
||||
memory_remove_breakpoint, /* to_remove_breakpoint */
|
||||
ocd_insert_breakpoint, /* to_insert_breakpoint */
|
||||
ocd_remove_breakpoint, /* to_remove_breakpoint */
|
||||
NULL, /* to_terminal_init */
|
||||
NULL, /* to_terminal_inferior */
|
||||
NULL, /* to_terminal_ours_for_output */
|
||||
|
|
Loading…
Reference in a new issue