|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/bfd/ChangeLog.M68HC11 gdb-6.4-m68hc1x/bfd/ChangeLog.M68HC11 |
|
|
--- gdb-6.4/bfd/ChangeLog.M68HC11 Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/bfd/ChangeLog.M68HC11 Sun Jan 22 22:18:25 2006 |
|
|
@@ -0,0 +1,7 @@ |
|
|
+2006-01-21 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * elf32-m68hc1x.c: Include "alloca-conf.h" |
|
|
+ |
|
|
+2004-02-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * opncls.c: Merge from mingw32 20031011 port. |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/bfd/elf32-m68hc1x.c gdb-6.4-m68hc1x/bfd/elf32-m68hc1x.c |
|
|
--- gdb-6.4/bfd/elf32-m68hc1x.c Mon Jun 20 20:12:07 2005 |
|
|
+++ gdb-6.4-m68hc1x/bfd/elf32-m68hc1x.c Sat Jan 21 17:53:08 2006 |
|
|
@@ -1,5 +1,5 @@ |
|
|
/* Motorola 68HC11/HC12-specific support for 32-bit ELF |
|
|
- Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 |
|
|
+ Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 |
|
|
Free Software Foundation, Inc. |
|
|
Contributed by Stephane Carrez (stcarrez@nerim.fr) |
|
|
|
|
|
@@ -19,6 +19,7 @@ You should have received a copy of the G |
|
|
along with this program; if not, write to the Free Software |
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
|
|
|
|
|
+#include "alloca-conf.h" |
|
|
#include "bfd.h" |
|
|
#include "sysdep.h" |
|
|
#include "bfdlink.h" |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/ChangeLog.M68HC11 gdb-6.4-m68hc1x/gdb/ChangeLog.M68HC11 |
|
|
--- gdb-6.4/gdb/ChangeLog.M68HC11 Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/ChangeLog.M68HC11 Sat Jan 21 17:14:12 2006 |
|
|
@@ -0,0 +1,147 @@ |
|
|
+2006-01-21 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * m68hc11-rom.c (dbug_xfer_memory): Use gdb_byte |
|
|
+ * remote-bdm12.c (gdbbdm12_insert_breakpoint): Use gdb_byte |
|
|
+ (gdbbdm12_remove_breakpoint): Likewise. |
|
|
+ (gdbbdm12_xfer_inferior_memory): Likewise. |
|
|
+ (gdbbdm12_fetch_register): Use regcache_raw_supply to set the |
|
|
+ register in gdb's cache. Use register_size. |
|
|
+ (gdbbdm12_store_register): Likewise. |
|
|
+ |
|
|
+2004-08-05 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * ser-mingw.c (do_mingw_readchar): Use deprecated_ui_loop_hook instead of |
|
|
+ ui_loop_hook |
|
|
+ |
|
|
+2004-08-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * signals/signals.c (SIGTRAP): Define if not defined so that the |
|
|
+ simulator works on mingw32. |
|
|
+ |
|
|
+2004-08-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ Patch Savannah/3123: |
|
|
+ From Marek Peca <marek@tynska.cuni.cz>: |
|
|
+ |
|
|
+ * remote-bdm12.c (gdbbdm12_cntrl_c): Set stop requested flag. |
|
|
+ (gdbbdm12_wait): Call gdbbdm12_stop here instead of from sig handler. |
|
|
+ * remote-bdm12.c (gdbbdm12_stop): Clear stop requested flag. |
|
|
+ |
|
|
+2004-08-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * remote-bdm12.c (gdbbdm12_create_inferior): Fix prototype. |
|
|
+ |
|
|
+2004-08-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * remote-bdm12.c (gdbbdm12_fetch_register): Use DEPRECATED_REGISTER_RAW_SIZE. |
|
|
+ (gdbbdm12_store_register): Likewise. |
|
|
+ |
|
|
+2004-02-08 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * remote-bdm12.c (gdbbdm12_wait): Use TARGET_SIGNAL_SIGABRT, |
|
|
+ TARGET_SIGNAL_INT, TARGET_SIGNAL_TRAP |
|
|
+ |
|
|
+ * bdm12.c (bdm12_stop_reason): Use TARGET_SIGNAL_TRAP and |
|
|
+ TARGET_SIGNAL_INT. |
|
|
+ |
|
|
+2004-02-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * version.in: Bump to 2004-02-01 |
|
|
+ |
|
|
+2004-02-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * bdm12.h (bdm12_create_inferior): Update prototype. |
|
|
+ Convert prototypes. |
|
|
+ * bdm12.c (bdm12_create_inferior): Use bfd type. |
|
|
+ |
|
|
+ * remote-bdm12.c (gdbbdm12_fetch_register): Use MAX_REGISTER_SIZE. |
|
|
+ (gdbbdm12_store_register): Likewise. |
|
|
+ (gdbbdm12_store_register): Use deprecated_read_register_gen. |
|
|
+ |
|
|
+2004-02-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * configure.in, environ.c, environ.h, infcmd.c, inferior.h, |
|
|
+ win32-nat.c, event-loop.c, event-loop.h, utils.c, top.c, ser-mingw.c, |
|
|
+ set-mingw.h, ser-tcp.c, ser-unix.c, inferior.h: |
|
|
+ |
|
|
+ Merge http://www.ming.org 20031011 gdb patch for Mingw32 host. |
|
|
+ |
|
|
+2002-06-15 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * remote-bdm12.c (gdbbdm12_kill): Use null_ptid. |
|
|
+ (gdbbdm12_load): Likewise. |
|
|
+ (gdbbdm12_resume): Use PIDGET. |
|
|
+ (gdbbdm12_wait): Update prototype. |
|
|
+ (pass_command): Use target_fetch_register. |
|
|
+ |
|
|
+2002-06-10 Martin Rod <martin.rod@ct.cz> |
|
|
+ |
|
|
+ * bdm12.c: Add small delay after RTS asserting (Linux) |
|
|
+ |
|
|
+2001-10-14 Stephane Carrez <Stephane.Carrez@worldnet.fr> |
|
|
+ |
|
|
+ * bdm12.c: Don't compile under Mingw32 since serial line code is |
|
|
+ not ported. |
|
|
+ * remote-bdm12.c: Likewise. |
|
|
+ |
|
|
+2001-09-28 Tim Housel <thousel@usa.net> |
|
|
+ |
|
|
+ * bdm12.c: New file (BDM12 pod communication support). |
|
|
+ * bdm12.h: New file. |
|
|
+ * remote-bdm12.c: New file (BDM12 gdb backend). |
|
|
+ * bdm12_eraseflash.h: New file. |
|
|
+ * bdm12_programflash.h: New file. |
|
|
+ * Makefile.in (ALLDEPFILES): Add new files. |
|
|
+ |
|
|
+2001-01-13 Stephane Carrez <Stephane.Carrez@worldnet.fr> |
|
|
+ |
|
|
+ * dsrec.c (load_srec): Use the LMA address when loading. |
|
|
+ |
|
|
+2001-01-06 Stephane Carrez <Stephane.Carrez@worldnet.fr> |
|
|
+ |
|
|
+ * dsrec.c (load_srec): Use serial_write function to send |
|
|
+ data on the serial line. |
|
|
+ * srec.h (load_srec): Add serial_write parameter. |
|
|
+ |
|
|
+2000-12-28 Stephane Carrez <Stephane.Carrez@worldnet.fr> |
|
|
+ |
|
|
+ * monitor.h (serial_write): New member. |
|
|
+ * monitor.c (monitor_write): Use it if it is set. |
|
|
+ (monitor_read_memory): Use monitor_write. |
|
|
+ |
|
|
+2000-12-28 Stephane Carrez <Stephane.Carrez@worldnet.fr> |
|
|
+ |
|
|
+ * m68hc11-rom.c (set_gdbarch): New function. |
|
|
+ (m68hc11_serial_write): New function. |
|
|
+ (console_input): New function. |
|
|
+ (do_console_input): New function. |
|
|
+ (m68hc11_wait_filter): New function. |
|
|
+ (init_buffalo_cmds): Install them. |
|
|
+ (dbug_dumpregs): New function. |
|
|
+ (dbug_xfer_memory): New function. |
|
|
+ (init_dbug_cmds): New function. |
|
|
+ (dbug_open): New function. |
|
|
+ (_initialize_m68hc11_rom): Register DBUG monitor. |
|
|
+ |
|
|
+2000-12-03 Stephane Carrez <Stephane.Carrez@worldnet.fr> |
|
|
+ |
|
|
+ * Makefile.in (m68hc11-tdep.o): Define dependencies. |
|
|
+ (m68hc11-rom.o): Likewise. |
|
|
+ (ALLDEPFILES): Add m68hc11-tdep.c |
|
|
+ * m68hc11-rom.c: New file for 68HC11/68HC12 monitors. |
|
|
+ * config/m68hc11/m68hc11.mt (TDEPFILES): Add files for monitor |
|
|
+ support. |
|
|
+ |
|
|
+2000-09-10 Stephane Carrez <Stephane.Carrez@worldnet.fr> |
|
|
+ |
|
|
+ * monitor.c (monitor_fetch_register): Fix allocation of zerobuf |
|
|
+ and regbuf (from GDB cvs main branch). |
|
|
+ |
|
|
+2000-09-10 Stephane Carrez <Stephane.Carrez@worldnet.fr> |
|
|
+ |
|
|
+ * monitor.c (monitor_write_memory): If setmem.resp_delim is set, |
|
|
+ use a regular expression to check the write memory command. |
|
|
+ (monitor_store_register): Likewise with setreg.resp_delim. |
|
|
+ (monitor_open): Compile the setmem and setreg regular expressions. |
|
|
+ * m68hc11-rom.c: New file for 68hc11 monitors support. |
|
|
+ * config/m68hc11/m68hc11.mt (TDEPFILES): Add the monitor support. |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/bdm12.c gdb-6.4-m68hc1x/gdb/bdm12.c |
|
|
--- gdb-6.4/gdb/bdm12.c Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/bdm12.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,1340 @@ |
|
|
+/* Target communications support for Kevin Ross' BDM12 pod for the 68HC12 |
|
|
+ Copyright 2001 |
|
|
+ Free Software Foundation, Inc. |
|
|
+ Contributed by Tim Housel (thousel@usa.net) |
|
|
+ |
|
|
+ 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 "gdb_string.h" |
|
|
+#include <fcntl.h> |
|
|
+#include "frame.h" |
|
|
+#include "inferior.h" |
|
|
+#include "bfd.h" |
|
|
+#include "symfile.h" |
|
|
+#include "target.h" |
|
|
+#include "gdbcmd.h" |
|
|
+#include "objfiles.h" |
|
|
+#include "gdb-stabs.h" |
|
|
+#include <sys/types.h> |
|
|
+#include <sys/time.h> |
|
|
+#include <signal.h> |
|
|
+#include "serial.h" |
|
|
+#include "bdm12.h" |
|
|
+#include "bdm12_eraseflash.h" |
|
|
+#include "bdm12_programflash.h" |
|
|
+ |
|
|
+#if defined(__CYGWIN32__) || defined(__MINGW32__) |
|
|
+#include <windows.h> |
|
|
+#include <io.h> |
|
|
+#else |
|
|
+/* assuming UNIX */ |
|
|
+#include <sys/ioctl.h> |
|
|
+#endif |
|
|
+ |
|
|
+#define xfree(ptr) free(ptr) |
|
|
+ |
|
|
+#define BDM12_RTS_DELAY 1 |
|
|
+ |
|
|
+/* Prototypes for local functions */ |
|
|
+ |
|
|
+static int bdm12_eeprom_write (CORE_ADDR memaddr, char *buf, int len); |
|
|
+ |
|
|
+static int bdm12_flash_write (CORE_ADDR memaddr, char *buf, int len); |
|
|
+ |
|
|
+static int erase_flash(void); |
|
|
+ |
|
|
+static int bdm12_put_packet (unsigned char *packet, int pktlen); |
|
|
+ |
|
|
+static int bdm12_get_packet (unsigned char *packet, int pktlen); |
|
|
+ |
|
|
+static void write_rts_state (int state); |
|
|
+ |
|
|
+static int read_cts_state (void); |
|
|
+ |
|
|
+static int valid_write_range (CORE_ADDR start_addr, CORE_ADDR end_addr); |
|
|
+ |
|
|
+static int valid_read_range (CORE_ADDR start_addr, CORE_ADDR end_addr); |
|
|
+ |
|
|
+static long diffms (struct timeval t1, struct timeval t2); |
|
|
+ |
|
|
+/* serial descriptor for interface to BDM pod */ |
|
|
+static struct serial* ser_desc = NULL; |
|
|
+ |
|
|
+/* since cygwin doesn't support the ioctls for manually mucking with the |
|
|
+ RTS and CTS lines, we must use win32 calls. This provides a place to |
|
|
+ store the windows handle */ |
|
|
+#if defined(__CYGWIN32__) || defined(__MINGW32__) |
|
|
+static HANDLE win_ser_desc = INVALID_HANDLE_VALUE; |
|
|
+#endif |
|
|
+ |
|
|
+static unsigned char reg_page = 0; |
|
|
+static unsigned int reg_base = 0; |
|
|
+static unsigned int ram_base = 0; |
|
|
+static unsigned int eeprom_base = 0; |
|
|
+static unsigned int flash_base = 0; |
|
|
+static int num_breakpoints = 0; |
|
|
+static int program_loaded = 0; |
|
|
+static int flash_erased = 0; |
|
|
+static int stopped = 0; |
|
|
+static int singlestepped = 1; |
|
|
+ |
|
|
+static CORE_ADDR breakpoint[BDM12_MAX_BREAKPOINTS] = {0, 0}; |
|
|
+ |
|
|
+struct memory_region_list |
|
|
+ { |
|
|
+ CORE_ADDR addr; |
|
|
+ unsigned int size; |
|
|
+ unsigned char* data; |
|
|
+ struct memory_region_list* next; |
|
|
+ struct memory_region_list* prev; |
|
|
+ } flash_regions; |
|
|
+ |
|
|
+struct memory_region_list *cur_region = &flash_regions; |
|
|
+ |
|
|
+/* Open a connection to a remote debugger. |
|
|
+ NAME is the filename used for communication. */ |
|
|
+ |
|
|
+BDM12_RC |
|
|
+bdm12_open (char **argv) |
|
|
+{ |
|
|
+ char *ser_name; |
|
|
+ unsigned char buf[5]; |
|
|
+ int erate, rc; |
|
|
+ |
|
|
+ if (argv == NULL) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ if (argv[0] == NULL) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ if (argv[1] == NULL) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ if (argv[2] == NULL) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ if (argv[3] == NULL) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ if (argv[4] == NULL) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ if (argv[5] == NULL) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ |
|
|
+ ser_name = alloca (strlen (argv[0]) + 6); /* for "/dev/\0" */ |
|
|
+ if (!ser_name) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ |
|
|
+ strcpy (ser_name, "/dev/"); |
|
|
+ strcat (ser_name, argv[0]); |
|
|
+ erate = atoi (argv[1]); |
|
|
+ switch (erate) |
|
|
+ { |
|
|
+ case 1: |
|
|
+ erate = BDM12_ECLOCK_1MHZ; |
|
|
+ break; |
|
|
+ case 2: |
|
|
+ erate = BDM12_ECLOCK_2MHZ; |
|
|
+ break; |
|
|
+ case 4: |
|
|
+ erate = BDM12_ECLOCK_4MHZ; |
|
|
+ break; |
|
|
+ case 8: |
|
|
+ erate = BDM12_ECLOCK_8MHZ; |
|
|
+ break; |
|
|
+ default: |
|
|
+ error ("bad value for target E clock rate - use 1, 2, 4, or 8)"); |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ break; |
|
|
+ } |
|
|
+ |
|
|
+ reg_base = strtoul (argv[2], NULL, 16); |
|
|
+ if (reg_base & 0x7ff) |
|
|
+ { |
|
|
+ error ("bad value for target register base - should be on 2K boundary"); |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ } |
|
|
+ |
|
|
+ ram_base = strtoul (argv[3], NULL, 16); |
|
|
+ if (ram_base & 0x7ff) |
|
|
+ { |
|
|
+ error ("bad value for target RAM base - should be on 2K boundary"); |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ } |
|
|
+ |
|
|
+ eeprom_base = strtoul (argv[4], NULL, 16); |
|
|
+ if ((eeprom_base & 0x2ff) || !((eeprom_base & 0xfff) | 0xd00)) |
|
|
+ { |
|
|
+ error ("bad value for target EEPROM base - should be on 4K boundary + 0xd00"); |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ } |
|
|
+ |
|
|
+ flash_base = strtoul (argv[5], NULL, 16); |
|
|
+ if (flash_base & 0x7fff) |
|
|
+ { |
|
|
+ error ("bad value for target FLASH base - should be on 32K boundary"); |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ } |
|
|
+ |
|
|
+ reg_page = reg_base >> 8; |
|
|
+ |
|
|
+ ser_desc = serial_open (ser_name); |
|
|
+ if (!ser_desc) |
|
|
+ { |
|
|
+ error ("unable to open serial port"); |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ } |
|
|
+ |
|
|
+#if defined(__CYGWIN32__) |
|
|
+ win_ser_desc = (HANDLE) get_osfhandle (ser_desc->fd); |
|
|
+#elif defined(__MINGW32__) |
|
|
+ win_ser_desc = (HANDLE) ser_desc->fd; |
|
|
+#endif |
|
|
+ |
|
|
+ if (!ser_desc) |
|
|
+ { |
|
|
+ perror_with_name (ser_name); |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ } |
|
|
+ |
|
|
+ if (serial_setbaudrate (ser_desc, BDM12_BAUD_RATE)) |
|
|
+ { |
|
|
+ serial_close (ser_desc); |
|
|
+ perror_with_name (ser_name); |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ } |
|
|
+ |
|
|
+ serial_raw (ser_desc); |
|
|
+ |
|
|
+ /* If there is something sitting in the buffer we might take it as a |
|
|
+ response to a command, which would be bad. */ |
|
|
+ serial_flush_input (ser_desc); |
|
|
+ |
|
|
+ rc = 0; |
|
|
+ |
|
|
+ /* synchronize the pod */ |
|
|
+ buf[0] = BDM12_CMD_SYNC; |
|
|
+ rc = bdm12_put_packet (buf, 1); |
|
|
+ /* if the first command doesn't work, bail */ |
|
|
+ if (rc) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ |
|
|
+ /* now just collect the errors for the next set of commands */ |
|
|
+ |
|
|
+ /* set the target parameters */ |
|
|
+ buf[0] = BDM12_CMD_EXT; |
|
|
+ buf[1] = BDM12_CMD_EXT_SETPARAM; |
|
|
+ buf[2] = erate; |
|
|
+ buf[3] = 0; /* We don't need no steekin' delays, I hope ;-) */ |
|
|
+ buf[4] = 0; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ /* reset the target */ |
|
|
+ buf[0] = BDM12_CMD_RESET; |
|
|
+ rc += bdm12_put_packet (buf, 1); |
|
|
+ |
|
|
+ /* make sure BDM is enabled */ |
|
|
+ buf[0] = BDM12_CMD_WRITE_BD_BYTE; |
|
|
+ buf[1] = BDM12_BDM_HI; |
|
|
+ buf[2] = BDM12_ENABLE_BDM_LO; |
|
|
+ buf[3] = BDM12_INIT_ENABLE_BDM; |
|
|
+ buf[4] = buf[3]; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ /* map the registers */ |
|
|
+ buf[0] = BDM12_CMD_WRITE_BYTE; |
|
|
+ buf[1] = 0; |
|
|
+ buf[2] = BDM12_REG_INITRG; |
|
|
+ buf[3] = reg_page; |
|
|
+ buf[4] = buf[3]; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ /* Let the POD know where we've mapped the registers */ |
|
|
+ buf[0] = BDM12_CMD_SET_REGBASE; |
|
|
+ buf[1] = reg_page; |
|
|
+ rc += bdm12_put_packet (buf, 2); |
|
|
+ |
|
|
+ /* map RAM */ |
|
|
+ buf[0] = BDM12_CMD_WRITE_BYTE; |
|
|
+ buf[2] = BDM12_REG_INITRM; |
|
|
+ buf[3] = ram_base >> 8; |
|
|
+ buf[4] = buf[3]; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ /* map EEPROM */ |
|
|
+ buf[2] = BDM12_REG_INITEE; |
|
|
+ buf[3] = ((eeprom_base >> 8) & 0xf0) | 0x1; |
|
|
+ buf[4] = buf[3]; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ /* map FLASH */ |
|
|
+ buf[2] = BDM12_REG_MISC; |
|
|
+ buf[3] = 0x0d | (flash_base >> 14); |
|
|
+ buf[4] = buf[3]; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ /* setup breakpoints */ |
|
|
+ buf[2] = BDM12_REG_BRKCT0; |
|
|
+ buf[3] = BDM12_INIT_BRKCT0; |
|
|
+ buf[4] = buf[3]; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ /* setup breakpoints */ |
|
|
+ buf[2] = BDM12_REG_BRKCT1; |
|
|
+ buf[3] = BDM12_INIT_BRKCT1; |
|
|
+ buf[4] = buf[3]; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ /* disable flash protection */ |
|
|
+ buf[2] = BDM12_REG_FEEMCR; |
|
|
+ buf[3] = BDM12_INIT_FEEMCR; |
|
|
+ buf[4] = buf[3]; |
|
|
+ rc += bdm12_put_packet (buf, 5); |
|
|
+ |
|
|
+ if (rc) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ |
|
|
+ serial_flush_input (ser_desc); |
|
|
+ return BDM12_RC_OK; |
|
|
+} |
|
|
+ |
|
|
+/* Clean up connection to a remote debugger. */ |
|
|
+ |
|
|
+void |
|
|
+bdm12_close (int quitting) |
|
|
+{ |
|
|
+ if (ser_desc) |
|
|
+ serial_close (ser_desc); |
|
|
+ ser_desc = NULL; |
|
|
+#if defined(__CYGWIN32__) || defined(__MINGW32__) |
|
|
+ win_ser_desc = INVALID_HANDLE_VALUE; |
|
|
+#endif |
|
|
+ program_loaded = 0; |
|
|
+ flash_erased = 0; |
|
|
+ stopped = 0; |
|
|
+ |
|
|
+ while (cur_region->prev != NULL) |
|
|
+ { |
|
|
+ if (cur_region->data) |
|
|
+ xfree(cur_region->data); |
|
|
+ if (cur_region->next) |
|
|
+ xfree(cur_region->next); |
|
|
+ |
|
|
+ cur_region = cur_region->prev; |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+/* Init processor state - for us just set the PC to _start from the bfd */ |
|
|
+BDM12_RC |
|
|
+bdm12_create_inferior (bfd *abfd, char **argv, char **env) |
|
|
+{ |
|
|
+ CORE_ADDR start = bfd_get_start_address (abfd); |
|
|
+ unsigned char cmdbuf[2]; |
|
|
+ |
|
|
+ /* set the PC */ |
|
|
+ cmdbuf[0] = start >> 8; |
|
|
+ cmdbuf[1] = start; |
|
|
+ return (bdm12_store_register (HARD_PC_REGNUM, cmdbuf, 2) != 2); |
|
|
+} |
|
|
+ |
|
|
+/* Tell the remote machine to resume. */ |
|
|
+ |
|
|
+int |
|
|
+bdm12_resume (int step) |
|
|
+{ |
|
|
+ unsigned char buf; |
|
|
+ int rc; |
|
|
+ |
|
|
+ if (step) |
|
|
+ { |
|
|
+ buf = BDM12_CMD_TRACE1; |
|
|
+ singlestepped = 1; |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ buf = BDM12_CMD_GO; |
|
|
+ singlestepped = 0; |
|
|
+ } |
|
|
+ |
|
|
+ if (!(rc = bdm12_put_packet (&buf, 1))) |
|
|
+ stopped = 0; |
|
|
+ return rc; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+bdm12_stop (void) |
|
|
+{ |
|
|
+ BDM12_RC rc; |
|
|
+ unsigned char buf = BDM12_CMD_BACKGROUND; |
|
|
+ |
|
|
+ rc = bdm12_put_packet (&buf, 1); |
|
|
+ if (rc == BDM12_RC_OK) |
|
|
+ stopped = 1; |
|
|
+ return !rc; |
|
|
+} |
|
|
+ |
|
|
+/* Read register */ |
|
|
+ |
|
|
+int |
|
|
+bdm12_fetch_register (int regno, unsigned char* buf, int length) |
|
|
+{ |
|
|
+ unsigned char cmdbuf[3]; |
|
|
+ int rc; |
|
|
+ |
|
|
+ switch (regno) |
|
|
+ { |
|
|
+ case HARD_A_REGNUM: |
|
|
+ case HARD_B_REGNUM: |
|
|
+ case HARD_D_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_D; |
|
|
+ break; |
|
|
+ case HARD_X_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_X; |
|
|
+ break; |
|
|
+ case HARD_Y_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_Y; |
|
|
+ break; |
|
|
+ case HARD_SP_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_SP; |
|
|
+ break; |
|
|
+ case HARD_PC_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_PC; |
|
|
+ break; |
|
|
+ case HARD_PSW_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_BD_BYTE; |
|
|
+ cmdbuf[1] = BDM12_BDM_HI; |
|
|
+ cmdbuf[2] = BDM12_CCRSAV_BDM_LO; |
|
|
+ break; |
|
|
+ default: |
|
|
+ return 0; |
|
|
+ } |
|
|
+ |
|
|
+ if (regno == HARD_PSW_REGNUM) |
|
|
+ rc = bdm12_put_packet (cmdbuf, 3); |
|
|
+ else |
|
|
+ rc = bdm12_put_packet (cmdbuf, 1); |
|
|
+ |
|
|
+ if (rc) |
|
|
+ return 0; |
|
|
+ |
|
|
+ rc = bdm12_get_packet (cmdbuf, 2); |
|
|
+ if (rc) |
|
|
+ return 0; |
|
|
+ |
|
|
+ switch (regno) |
|
|
+ { |
|
|
+ case HARD_A_REGNUM: |
|
|
+ case HARD_PSW_REGNUM: |
|
|
+ buf[0] = 0; |
|
|
+ buf[1] = cmdbuf[0]; |
|
|
+ break; |
|
|
+ case HARD_B_REGNUM: |
|
|
+ buf[0] = 0; |
|
|
+ buf[1] = cmdbuf[1]; |
|
|
+ break; |
|
|
+ default: |
|
|
+ buf[0] = cmdbuf[0]; |
|
|
+ buf[1] = cmdbuf[1]; |
|
|
+ break; |
|
|
+ } |
|
|
+ |
|
|
+ return length; |
|
|
+} |
|
|
+ |
|
|
+/* Write register */ |
|
|
+ |
|
|
+int |
|
|
+bdm12_store_register (int regno, unsigned char* buf, int length) |
|
|
+{ |
|
|
+ unsigned char cmdbuf[5]; |
|
|
+ int rc = 0; |
|
|
+ |
|
|
+ switch (regno) |
|
|
+ { |
|
|
+ case HARD_A_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_D; |
|
|
+ rc += bdm12_put_packet (cmdbuf, 1); |
|
|
+ rc += bdm12_get_packet (cmdbuf, 2); |
|
|
+ cmdbuf[2] = cmdbuf[1]; |
|
|
+ cmdbuf[1] = buf[0]; |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_D; |
|
|
+ break; |
|
|
+ case HARD_B_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_D; |
|
|
+ rc += bdm12_put_packet (cmdbuf, 1); |
|
|
+ rc += bdm12_get_packet (cmdbuf, 2); |
|
|
+ cmdbuf[2] = buf[1]; |
|
|
+ cmdbuf[1] = cmdbuf[0]; |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_D; |
|
|
+ break; |
|
|
+ case HARD_D_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_D; |
|
|
+ cmdbuf[1] = buf[0]; |
|
|
+ cmdbuf[2] = buf[1]; |
|
|
+ break; |
|
|
+ case HARD_X_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_X; |
|
|
+ cmdbuf[1] = buf[0]; |
|
|
+ cmdbuf[2] = buf[1]; |
|
|
+ break; |
|
|
+ case HARD_Y_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_Y; |
|
|
+ cmdbuf[1] = buf[0]; |
|
|
+ cmdbuf[2] = buf[1]; |
|
|
+ break; |
|
|
+ case HARD_SP_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_SP; |
|
|
+ cmdbuf[1] = buf[0]; |
|
|
+ cmdbuf[2] = buf[1]; |
|
|
+ break; |
|
|
+ case HARD_PC_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_PC; |
|
|
+ cmdbuf[1] = buf[0]; |
|
|
+ cmdbuf[2] = buf[1]; |
|
|
+ break; |
|
|
+ case HARD_PSW_REGNUM: |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_BD_BYTE; |
|
|
+ cmdbuf[1] = BDM12_BDM_HI; |
|
|
+ cmdbuf[2] = BDM12_CCRSAV_BDM_LO; |
|
|
+ cmdbuf[3] = buf[1]; |
|
|
+ cmdbuf[4] = buf[1]; |
|
|
+ break; |
|
|
+ default: |
|
|
+ return 0; |
|
|
+ } |
|
|
+ |
|
|
+ if (regno == HARD_PSW_REGNUM) |
|
|
+ rc += bdm12_put_packet (cmdbuf, 5); |
|
|
+ else |
|
|
+ rc += bdm12_put_packet (cmdbuf, 3); |
|
|
+ |
|
|
+ if (rc) |
|
|
+ return 0; |
|
|
+ |
|
|
+ return length; |
|
|
+} |
|
|
+ |
|
|
+/* Write memory to the target. */ |
|
|
+ |
|
|
+int |
|
|
+bdm12_write (CORE_ADDR memaddr, unsigned char *buf, int len) |
|
|
+{ |
|
|
+ unsigned char *cmdbuf; |
|
|
+ unsigned int numwritten = 0; |
|
|
+ int need_final_write = 0; |
|
|
+ |
|
|
+ /* allow writes to flash and eeprom if the program isn't loaded yet */ |
|
|
+ if (!program_loaded && !valid_write_range (memaddr, memaddr + len - 1)) |
|
|
+ { |
|
|
+ if (!valid_read_range (memaddr, memaddr + len - 1) || len <= 0) |
|
|
+ return 0; |
|
|
+ if (memaddr >= eeprom_base && |
|
|
+ memaddr < (eeprom_base + BDM12_SIZE_EEPROM) && |
|
|
+ (memaddr + len - 1) >= eeprom_base && |
|
|
+ (memaddr + len - 1) < (eeprom_base + BDM12_SIZE_EEPROM)) |
|
|
+ return bdm12_eeprom_write (memaddr, buf, len); |
|
|
+ else if (memaddr >= flash_base && |
|
|
+ memaddr < (flash_base + BDM12_SIZE_FLASH) && |
|
|
+ (memaddr + len - 1) >= flash_base && |
|
|
+ (memaddr + len - 1) < (flash_base + BDM12_SIZE_FLASH)) |
|
|
+ return bdm12_flash_write (memaddr, buf, len); |
|
|
+ else |
|
|
+ { |
|
|
+ error ("writing between different regions of memory"); |
|
|
+ return 0; |
|
|
+ } |
|
|
+ } |
|
|
+ else if (!valid_write_range (memaddr, memaddr + len - 1) || len <= 0) |
|
|
+ return 0; |
|
|
+ |
|
|
+ cmdbuf = alloca (len + 6); |
|
|
+ if (!cmdbuf) |
|
|
+ return 0; |
|
|
+ |
|
|
+ if (memaddr & 0x1) |
|
|
+ { |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_BYTE; |
|
|
+ cmdbuf[1] = memaddr >> 8; |
|
|
+ cmdbuf[2] = memaddr; |
|
|
+ cmdbuf[3] = *buf; |
|
|
+ cmdbuf[4] = cmdbuf[3]; |
|
|
+ if (bdm12_put_packet (cmdbuf, 5)) |
|
|
+ return numwritten; |
|
|
+ len--; |
|
|
+ buf++; |
|
|
+ numwritten++; |
|
|
+ memaddr++; |
|
|
+ } |
|
|
+ |
|
|
+ if (len & 0x1) |
|
|
+ { |
|
|
+ need_final_write = 1; |
|
|
+ len--; |
|
|
+ } |
|
|
+#if 0 /* MEMPUT command seems to cause communications hangups easily */ |
|
|
+ if (len) |
|
|
+ { |
|
|
+ cmdbuf[0] = BDM12_CMD_EXT; |
|
|
+ cmdbuf[1] = BDM12_CMD_EXT_MEMPUT; |
|
|
+ cmdbuf[2] = memaddr >> 8; |
|
|
+ cmdbuf[3] = memaddr ; |
|
|
+ cmdbuf[4] = (len / 2) >> 8; |
|
|
+ cmdbuf[5] = (len / 2); |
|
|
+ memcpy (cmdbuf + 6, buf, len); |
|
|
+ if (bdm12_put_packet (cmdbuf, len + 6)) |
|
|
+ return numwritten; |
|
|
+ buf += len; |
|
|
+ numwritten += len; |
|
|
+ memaddr += len; |
|
|
+ } |
|
|
+#endif |
|
|
+ |
|
|
+#if 1 |
|
|
+ |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_WORD; |
|
|
+ while (len) |
|
|
+ { |
|
|
+ cmdbuf[1] = memaddr >> 8; |
|
|
+ cmdbuf[2] = memaddr; |
|
|
+ cmdbuf[3] = *(buf++); |
|
|
+ cmdbuf[4] = *(buf++); |
|
|
+ if (bdm12_put_packet (cmdbuf, 5)) |
|
|
+ return numwritten; |
|
|
+ memaddr += 2; |
|
|
+ numwritten += 2; |
|
|
+ len -= 2; |
|
|
+ } |
|
|
+ |
|
|
+#endif |
|
|
+ |
|
|
+ if (need_final_write) |
|
|
+ { |
|
|
+ cmdbuf[0] = BDM12_CMD_WRITE_BYTE; |
|
|
+ cmdbuf[1] = memaddr >> 8; |
|
|
+ cmdbuf[2] = memaddr; |
|
|
+ cmdbuf[3] = *buf; |
|
|
+ cmdbuf[4] = cmdbuf[3]; |
|
|
+ if (bdm12_put_packet (cmdbuf, 5)) |
|
|
+ return numwritten; |
|
|
+ numwritten++; |
|
|
+ } |
|
|
+ |
|
|
+ return numwritten; |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+bdm12_eeprom_write (CORE_ADDR memaddr, char *buf, int len) |
|
|
+{ |
|
|
+ unsigned char cmdbuf[6], recvbuf[2]; |
|
|
+ int numwritten = 0, need_final_write = 0; |
|
|
+ |
|
|
+ if (memaddr & 0x1) |
|
|
+ { |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_BYTE; |
|
|
+ cmdbuf[1] = (memaddr - 1) >> 8; |
|
|
+ cmdbuf[2] = (memaddr - 1); |
|
|
+ if (bdm12_put_packet (cmdbuf, 3)) |
|
|
+ return numwritten; |
|
|
+ if (bdm12_get_packet (recvbuf, 2)) |
|
|
+ return numwritten; |
|
|
+ cmdbuf[0] = BDM12_CMD_EEPROM_WRITE; |
|
|
+ cmdbuf[3] = recvbuf[0]; |
|
|
+ cmdbuf[4] = *buf; |
|
|
+ if (bdm12_put_packet (cmdbuf, 5)) |
|
|
+ return numwritten; |
|
|
+ len--; |
|
|
+ buf++; |
|
|
+ numwritten++; |
|
|
+ memaddr++; |
|
|
+ } |
|
|
+ |
|
|
+ if (len & 0x1) |
|
|
+ { |
|
|
+ need_final_write = 1; |
|
|
+ len--; |
|
|
+ } |
|
|
+ |
|
|
+ while (len) |
|
|
+ { |
|
|
+ cmdbuf[1] = memaddr >> 8; |
|
|
+ cmdbuf[2] = memaddr; |
|
|
+ cmdbuf[3] = *(buf++); |
|
|
+ cmdbuf[4] = *(buf++); |
|
|
+ if (bdm12_put_packet (cmdbuf, 5)) |
|
|
+ return numwritten; |
|
|
+ memaddr += 2; |
|
|
+ numwritten += 2; |
|
|
+ len -= 2; |
|
|
+ } |
|
|
+ |
|
|
+ if (need_final_write) |
|
|
+ { |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_BYTE; |
|
|
+ cmdbuf[1] = (memaddr + 1) >> 8; |
|
|
+ cmdbuf[2] = (memaddr + 1); |
|
|
+ if (bdm12_put_packet (cmdbuf, 3)) |
|
|
+ return numwritten; |
|
|
+ if (bdm12_get_packet (recvbuf, 2)) |
|
|
+ return numwritten; |
|
|
+ cmdbuf[0] = BDM12_CMD_EEPROM_WRITE; |
|
|
+ cmdbuf[3] = *buf; |
|
|
+ cmdbuf[4] = recvbuf[1]; |
|
|
+ if (bdm12_put_packet (cmdbuf, 5)) |
|
|
+ return numwritten; |
|
|
+ numwritten++; |
|
|
+ } |
|
|
+ return numwritten; |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+bdm12_flash_write (CORE_ADDR memaddr, char *buf, int len) |
|
|
+{ |
|
|
+ unsigned char cmdbuf[2]; |
|
|
+ int numwritten = 0, dum, expectedsize, actualsize; |
|
|
+ int packetsize = BDM12_SIZE_RAM - BDM12_PROGRAMFLASH_SIZE; |
|
|
+ |
|
|
+ struct timeval start_time, cur_time; |
|
|
+ enum bdm12_stop reason; |
|
|
+ |
|
|
+ if (!flash_erased) |
|
|
+ { |
|
|
+ /* check to see if what is going to be written is the same as |
|
|
+ what is already in flash, so that we don't write to flash |
|
|
+ needlessly */ |
|
|
+ cur_region->next = xmalloc (sizeof (struct memory_region_list)); |
|
|
+ if (!cur_region->next) |
|
|
+ return numwritten; |
|
|
+ cur_region->data = xmalloc (len); |
|
|
+ if (!cur_region->data) |
|
|
+ { |
|
|
+ xfree (cur_region->next); |
|
|
+ cur_region->next = NULL; |
|
|
+ return numwritten; |
|
|
+ } |
|
|
+ if (bdm12_read (memaddr, cur_region->data, len) != len) |
|
|
+ { |
|
|
+ xfree (cur_region->next); |
|
|
+ xfree (cur_region->data); |
|
|
+ cur_region->next = NULL; |
|
|
+ cur_region->data = NULL; |
|
|
+ return numwritten; |
|
|
+ } |
|
|
+ if (memcmp (cur_region->data, buf, len) == 0) |
|
|
+ { |
|
|
+ cur_region->size = len; |
|
|
+ cur_region->addr = memaddr; |
|
|
+ cur_region->next->prev = cur_region; |
|
|
+ cur_region->next->next = NULL; |
|
|
+ cur_region->next->size = 0; |
|
|
+ cur_region->next->data = NULL; |
|
|
+ cur_region = cur_region->next; |
|
|
+ return len; |
|
|
+ } |
|
|
+ |
|
|
+ xfree(cur_region->next); |
|
|
+ cur_region->next = NULL; |
|
|
+ |
|
|
+ /* erase the flash array */ |
|
|
+ if (erase_flash ()) |
|
|
+ { |
|
|
+ error ("Unable to erase flash"); |
|
|
+ return numwritten; |
|
|
+ } |
|
|
+ flash_erased = 1; |
|
|
+ /* write the flash burning program into RAM - the program is in |
|
|
+ bdm12_programflash.h */ |
|
|
+ if (bdm12_write (ram_base, programflash, BDM12_PROGRAMFLASH_SIZE) != |
|
|
+ BDM12_PROGRAMFLASH_SIZE) |
|
|
+ return numwritten; |
|
|
+ /* tell the burn program where the registers are */ |
|
|
+ cmdbuf[0] = reg_base >> 8; |
|
|
+ cmdbuf[1] = reg_base; |
|
|
+ if (bdm12_write (ram_base + BDM12_PROGRAMFLASH_REGSTART, cmdbuf, 2) != 2) |
|
|
+ return numwritten; |
|
|
+ /* tell the burn program where the data starts */ |
|
|
+ cmdbuf[0] = (ram_base + BDM12_PROGRAMFLASH_SIZE) >> 8; |
|
|
+ cmdbuf[1] = (ram_base + BDM12_PROGRAMFLASH_SIZE); |
|
|
+ if (bdm12_write (ram_base + BDM12_PROGRAMFLASH_DATASTART, cmdbuf, 2) != 2) |
|
|
+ return numwritten; |
|
|
+ |
|
|
+ /* now write all the previously stored regions */ |
|
|
+ for (cur_region = &flash_regions; cur_region->next != NULL; |
|
|
+ cur_region = cur_region->next) |
|
|
+ { |
|
|
+ if (bdm12_flash_write (cur_region->addr, cur_region->data, |
|
|
+ cur_region->size) != cur_region->size) |
|
|
+ return numwritten; |
|
|
+ } |
|
|
+ } |
|
|
+ |
|
|
+ /* tell the burn program where flash is */ |
|
|
+ while (len > 0) |
|
|
+ { |
|
|
+ if (len < packetsize) |
|
|
+ expectedsize = len; |
|
|
+ else |
|
|
+ expectedsize = packetsize; |
|
|
+ |
|
|
+ /* write the next packet in target RAM */ |
|
|
+ if (bdm12_write (ram_base + BDM12_PROGRAMFLASH_SIZE, buf, |
|
|
+ expectedsize) != expectedsize) |
|
|
+ break; |
|
|
+ |
|
|
+ /* tell the burn program the starting flash address */ |
|
|
+ cmdbuf[0] = memaddr >> 8; |
|
|
+ cmdbuf[1] = memaddr; |
|
|
+ if (bdm12_write (ram_base + BDM12_PROGRAMFLASH_FLASHSTART, cmdbuf, 2) != 2) |
|
|
+ break; |
|
|
+ |
|
|
+ /* tell the burn program the ending flash address (noninclusive) */ |
|
|
+ cmdbuf[0] = (memaddr + expectedsize) >> 8; |
|
|
+ cmdbuf[1] = (memaddr + expectedsize); |
|
|
+ if (bdm12_write (ram_base + BDM12_PROGRAMFLASH_FLASHEND, cmdbuf, 2) != 2) |
|
|
+ break; |
|
|
+ |
|
|
+ /* set the PC */ |
|
|
+ cmdbuf[0] = (ram_base + BDM12_PROGRAMFLASH_PROGSTART) >> 8; |
|
|
+ cmdbuf[1] = (ram_base + BDM12_PROGRAMFLASH_PROGSTART); |
|
|
+ if (bdm12_store_register (HARD_PC_REGNUM, cmdbuf, 2) != 2) |
|
|
+ break; |
|
|
+ |
|
|
+ /* run the burn program */ |
|
|
+ if (bdm12_resume (0)) |
|
|
+ break; |
|
|
+ |
|
|
+ /* wait for burn program t finish; it should go back into bdm mode */ |
|
|
+ gettimeofday (&start_time, NULL); |
|
|
+ do |
|
|
+ { |
|
|
+ bdm12_stop_reason (&reason, &dum); |
|
|
+ gettimeofday (&cur_time, NULL); |
|
|
+ if (diffms (start_time, cur_time) > BDM12_PROGRAMFLASH_TIMEOUT * |
|
|
+ expectedsize) |
|
|
+ { |
|
|
+ bdm12_stop_reason (&reason, &dum); |
|
|
+ if (reason == BDM12_RUNNING) |
|
|
+ break; |
|
|
+ } |
|
|
+ } while (reason == BDM12_RUNNING); |
|
|
+ /* check error flag */ |
|
|
+ if (bdm12_read (ram_base + BDM12_PROGRAMFLASH_NUMWRITTEN, cmdbuf, 2) != 2) |
|
|
+ break; |
|
|
+ |
|
|
+ actualsize = (cmdbuf[0] << 8) + cmdbuf[1]; |
|
|
+ numwritten += actualsize; |
|
|
+ if (expectedsize != actualsize) |
|
|
+ break; |
|
|
+ memaddr += actualsize; |
|
|
+ buf += actualsize; |
|
|
+ len -= actualsize; |
|
|
+ } |
|
|
+ return numwritten; |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+erase_flash(void) |
|
|
+{ |
|
|
+ unsigned char buf[2]; |
|
|
+ struct timeval start_time, cur_time; |
|
|
+ int dum; |
|
|
+ enum bdm12_stop reason; |
|
|
+ |
|
|
+ /* write the erase program into RAM - the program is in bdm12_eraseflash.h */ |
|
|
+ if (bdm12_write (ram_base, eraseflash, BDM12_ERASEFLASH_SIZE) != |
|
|
+ BDM12_ERASEFLASH_SIZE) |
|
|
+ return 1; |
|
|
+ |
|
|
+ /* tell the erase program where flash is */ |
|
|
+ buf[0] = flash_base >> 8; |
|
|
+ buf[1] = flash_base; |
|
|
+ if (bdm12_write (ram_base + BDM12_ERASEFLASH_FLASHSTART, buf, 2) != 2) |
|
|
+ return 1; |
|
|
+ |
|
|
+ /* tell the erase program where the registers are */ |
|
|
+ buf[0] = reg_base >> 8; |
|
|
+ buf[1] = reg_base; |
|
|
+ if (bdm12_write (ram_base + BDM12_ERASEFLASH_REGSTART, buf, 2) != 2) |
|
|
+ return 1; |
|
|
+ |
|
|
+ /* set the PC */ |
|
|
+ buf[0] = (ram_base + BDM12_ERASEFLASH_PROGSTART) >> 8; |
|
|
+ buf[1] = (ram_base + BDM12_ERASEFLASH_PROGSTART); |
|
|
+ if (bdm12_store_register (HARD_PC_REGNUM, buf, 2) != 2) |
|
|
+ return 1; |
|
|
+ |
|
|
+ /* run the erase program */ |
|
|
+ if (bdm12_resume (0)) |
|
|
+ return 1; |
|
|
+ /* wait for erase program to finish; it should go back into bdm mode */ |
|
|
+ |
|
|
+ gettimeofday (&start_time, NULL); |
|
|
+ do |
|
|
+ { |
|
|
+ bdm12_stop_reason (&reason, &dum); |
|
|
+ gettimeofday (&cur_time, NULL); |
|
|
+ if (diffms (start_time, cur_time) > BDM12_ERASEFLASH_TIMEOUT) |
|
|
+ { |
|
|
+ bdm12_stop_reason (&reason, &dum); |
|
|
+ if (reason == BDM12_RUNNING) |
|
|
+ return 1; |
|
|
+ } |
|
|
+ } while (reason == BDM12_RUNNING); |
|
|
+ |
|
|
+ /* check error flag */ |
|
|
+ if (bdm12_read (ram_base + BDM12_ERASEFLASH_ERRORFLAG, buf, 1) != 1) |
|
|
+ return 1; |
|
|
+ |
|
|
+ return buf[0]; |
|
|
+} |
|
|
+ |
|
|
+void |
|
|
+bdm12_stop_reason (enum bdm12_stop *reason, int *sigrc) |
|
|
+{ |
|
|
+ unsigned char buf[3]; |
|
|
+ |
|
|
+ buf[0] = BDM12_CMD_READ_BD_BYTE; |
|
|
+ buf[1] = BDM12_BDM_HI; |
|
|
+ buf[2] = BDM12_ENABLE_BDM_LO; |
|
|
+ if (bdm12_put_packet (buf, 3)) |
|
|
+ { |
|
|
+ *reason = BDM12_POLLING; |
|
|
+ return; |
|
|
+ } |
|
|
+ if (bdm12_get_packet (buf, 2)) |
|
|
+ { |
|
|
+ *reason = BDM12_POLLING; |
|
|
+ return; |
|
|
+ } |
|
|
+ |
|
|
+ if (!(buf[1] & BDM12_STATUS_STOPPED)) |
|
|
+ { |
|
|
+ *reason = BDM12_RUNNING; |
|
|
+ return; |
|
|
+ } |
|
|
+ if (num_breakpoints > 0) |
|
|
+ { |
|
|
+ unsigned char pcbuf[2]; |
|
|
+ CORE_ADDR pc; |
|
|
+ if (bdm12_fetch_register (HARD_PC_REGNUM, pcbuf, 2) != 2) |
|
|
+ { |
|
|
+ *reason = BDM12_POLLING; |
|
|
+ return; |
|
|
+ } |
|
|
+ pc = (pcbuf[0] << 8) + pcbuf[1]; |
|
|
+ if (pc == breakpoint[0]) |
|
|
+ { |
|
|
+ *reason = BDM12_STOPPED; |
|
|
+ *sigrc = TARGET_SIGNAL_TRAP; |
|
|
+ return; |
|
|
+ } |
|
|
+ if ((num_breakpoints == 2) && (pc == breakpoint[1])) |
|
|
+ { |
|
|
+ *reason = BDM12_STOPPED; |
|
|
+ *sigrc = TARGET_SIGNAL_TRAP; |
|
|
+ return; |
|
|
+ } |
|
|
+ } |
|
|
+ |
|
|
+ if (stopped) |
|
|
+ { |
|
|
+ *reason = BDM12_STOPPED; |
|
|
+ *sigrc = TARGET_SIGNAL_INT; |
|
|
+ return; |
|
|
+ } |
|
|
+ if (singlestepped) |
|
|
+ { |
|
|
+ *reason = BDM12_STOPPED; |
|
|
+ *sigrc = TARGET_SIGNAL_TRAP; |
|
|
+ return; |
|
|
+ } |
|
|
+ |
|
|
+ /* don't know why we stopped */ |
|
|
+ *reason = BDM12_POLLING; |
|
|
+ return; |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+valid_write_range (CORE_ADDR start_addr, CORE_ADDR end_addr) |
|
|
+{ |
|
|
+ if (((start_addr >= reg_base && start_addr < (reg_base + BDM12_SIZE_REG)) && |
|
|
+ (end_addr >= reg_base && end_addr < (reg_base + BDM12_SIZE_RAM))) || |
|
|
+ ((start_addr >= ram_base && start_addr < (ram_base + BDM12_SIZE_RAM)) && |
|
|
+ (end_addr >= ram_base && end_addr < (ram_base + BDM12_SIZE_RAM)))) |
|
|
+ return 1; |
|
|
+ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+/* Read memory from the target. */ |
|
|
+ |
|
|
+int |
|
|
+bdm12_read (CORE_ADDR memaddr, unsigned char *buf, int len) |
|
|
+{ |
|
|
+ unsigned char cmdbuf[6], *recvbuf; |
|
|
+ unsigned int numread = 0; |
|
|
+ int need_final_read = 0; |
|
|
+ |
|
|
+ if (!valid_read_range (memaddr, memaddr + len - 1) || len < 0) |
|
|
+ return 0; |
|
|
+ |
|
|
+ if (len == 0) |
|
|
+ return 0; |
|
|
+ |
|
|
+ recvbuf = alloca (len); |
|
|
+ if (!recvbuf) |
|
|
+ return 0; |
|
|
+ |
|
|
+ if (memaddr & 0x1) |
|
|
+ { |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_BYTE; |
|
|
+ cmdbuf[1] = memaddr >> 8; |
|
|
+ cmdbuf[2] = memaddr; |
|
|
+ if (bdm12_put_packet (cmdbuf, 3)) |
|
|
+ return numread; |
|
|
+ if (bdm12_get_packet (recvbuf, 2)) |
|
|
+ return numread; |
|
|
+ *(buf++) = recvbuf[1]; |
|
|
+ len--; |
|
|
+ numread++; |
|
|
+ memaddr++; |
|
|
+ } |
|
|
+ |
|
|
+ if (len & 0x1) |
|
|
+ { |
|
|
+ need_final_read = 1; |
|
|
+ len--; |
|
|
+ } |
|
|
+ |
|
|
+ if (len) |
|
|
+ { |
|
|
+ cmdbuf[0] = BDM12_CMD_EXT; |
|
|
+ cmdbuf[1] = BDM12_CMD_EXT_MEMDUMP; |
|
|
+ cmdbuf[2] = memaddr >> 8; |
|
|
+ cmdbuf[3] = memaddr ; |
|
|
+ cmdbuf[4] = (len / 2) >> 8; |
|
|
+ cmdbuf[5] = (len / 2); |
|
|
+ if (bdm12_put_packet (cmdbuf, 6)) |
|
|
+ return numread; |
|
|
+ if (bdm12_get_packet (recvbuf, len)) |
|
|
+ return numread; |
|
|
+ memcpy (buf, recvbuf, len); |
|
|
+ buf += len; |
|
|
+ numread += len; |
|
|
+ memaddr += len; |
|
|
+ } |
|
|
+ |
|
|
+ if (need_final_read) |
|
|
+ { |
|
|
+ cmdbuf[0] = BDM12_CMD_READ_BYTE; |
|
|
+ cmdbuf[1] = memaddr >> 8; |
|
|
+ cmdbuf[2] = memaddr; |
|
|
+ if (bdm12_put_packet (cmdbuf, 3)) |
|
|
+ return numread; |
|
|
+ if (bdm12_get_packet (recvbuf, 2)) |
|
|
+ return numread; |
|
|
+ *(buf++) = recvbuf[0]; |
|
|
+ numread++; |
|
|
+ } |
|
|
+ |
|
|
+ return numread; |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+valid_read_range (CORE_ADDR start_addr, CORE_ADDR end_addr) |
|
|
+{ |
|
|
+ if (((start_addr >= reg_base && start_addr < (reg_base + BDM12_SIZE_REG)) && |
|
|
+ (end_addr >= reg_base && end_addr < (reg_base + BDM12_SIZE_REG))) || |
|
|
+ ((start_addr >= ram_base && start_addr < (ram_base + BDM12_SIZE_RAM)) && |
|
|
+ (end_addr >= ram_base && end_addr < (ram_base + BDM12_SIZE_RAM))) || |
|
|
+ ((start_addr >= eeprom_base && start_addr < (eeprom_base + BDM12_SIZE_EEPROM)) && |
|
|
+ (end_addr >= eeprom_base && end_addr < (eeprom_base + BDM12_SIZE_EEPROM))) || |
|
|
+ ((start_addr >= flash_base && start_addr < (flash_base + BDM12_SIZE_FLASH)) && |
|
|
+ (end_addr >= flash_base && end_addr < (flash_base + BDM12_SIZE_FLASH)))) |
|
|
+ return 1; |
|
|
+ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+/* Send a packet to the BDM12 pod. This is basically copied from Kevin's |
|
|
+ BDM12 User Manual */ |
|
|
+ |
|
|
+static int |
|
|
+bdm12_put_packet (unsigned char *packet, int len) |
|
|
+{ |
|
|
+ int i, iloop; |
|
|
+ struct timeval start_time, cur_time; |
|
|
+ |
|
|
+ for (i = 0; i < len; i++) |
|
|
+ { |
|
|
+ write_rts_state (1); |
|
|
+ |
|
|
+ iloop = 5; |
|
|
+ gettimeofday (&start_time, NULL); |
|
|
+ cur_time = start_time; |
|
|
+ while ((diffms (start_time, cur_time) < BDM12_COMM_TIMEOUT) || iloop) |
|
|
+ { |
|
|
+ if (read_cts_state ()) |
|
|
+ break; |
|
|
+ |
|
|
+ write_rts_state (0); |
|
|
+ gettimeofday (&cur_time, NULL); |
|
|
+ if (iloop) |
|
|
+ --iloop; |
|
|
+ |
|
|
+ write_rts_state (1); |
|
|
+ } |
|
|
+ if (!read_cts_state ()) |
|
|
+ { |
|
|
+ error ("bdm12_put_packet RTS1->CTS1: Couldn't communicate with BDM12 pod"); |
|
|
+ return 1; |
|
|
+ } |
|
|
+ |
|
|
+ if (serial_write (ser_desc, packet, 1)) |
|
|
+ { |
|
|
+ write_rts_state (0); |
|
|
+ perror_with_name ("bdm12_put_packet"); |
|
|
+ return 1; |
|
|
+ } |
|
|
+ |
|
|
+ iloop = 5; |
|
|
+ gettimeofday (&start_time, NULL); |
|
|
+ cur_time = start_time; |
|
|
+ while ((diffms (start_time, cur_time) < BDM12_COMM_TIMEOUT) || iloop) |
|
|
+ { |
|
|
+ if (!read_cts_state ()) |
|
|
+ break; |
|
|
+ |
|
|
+ gettimeofday (&cur_time, NULL); |
|
|
+ if (iloop) |
|
|
+ --iloop; |
|
|
+ |
|
|
+ } |
|
|
+ write_rts_state (0); |
|
|
+ if (read_cts_state ()) |
|
|
+ { |
|
|
+ error ("bdm12_put_packet RTS0->CTS0: Couldn't communicate with BDM12 pod"); |
|
|
+ return 1; |
|
|
+ } |
|
|
+ packet++; |
|
|
+ } |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+/* Raise or lower the RTS line (clear if state==0, set otherwise). This is |
|
|
+ also based on code from Kevin's BDM12 User's Manual. */ |
|
|
+ |
|
|
+static void |
|
|
+write_rts_state (int state) |
|
|
+{ |
|
|
+ |
|
|
+#if defined(__CYGWIN32__) || defined(__MINGW32__) |
|
|
+ EscapeCommFunction (win_ser_desc, state ? SETRTS : CLRRTS); |
|
|
+#else |
|
|
+ struct timeval start_time, cur_time; |
|
|
+ |
|
|
+ int tiocm = TIOCM_RTS; |
|
|
+ ioctl (ser_desc->fd, state ? TIOCMBIS : TIOCMBIC, &tiocm); |
|
|
+ |
|
|
+ gettimeofday (&start_time, NULL); |
|
|
+ cur_time = start_time; |
|
|
+ while ((diffms (start_time, cur_time) < BDM12_RTS_DELAY)) |
|
|
+ { |
|
|
+ gettimeofday (&cur_time, NULL); |
|
|
+ } |
|
|
+#endif |
|
|
+} |
|
|
+ |
|
|
+/* Return the state of the CTS line (0 if clear, 1 if set). This is also |
|
|
+ based on code from Kevin's BDM12 User's Manual. */ |
|
|
+ |
|
|
+static int |
|
|
+read_cts_state (void) |
|
|
+{ |
|
|
+#if defined(__CYGWIN32__) || defined(__MINGW32__) |
|
|
+ DWORD cts_state; |
|
|
+ GetCommModemStatus (win_ser_desc, &cts_state); |
|
|
+ return (cts_state & MS_CTS_ON) ? 1 : 0; |
|
|
+#else |
|
|
+ /* assuming UNIX - if not, add your own #elseif above */ |
|
|
+ unsigned int cts_state; |
|
|
+ ioctl (ser_desc->fd, TIOCMGET, &cts_state); |
|
|
+ return (cts_state & TIOCM_CTS) ? 1 : 0; |
|
|
+#endif |
|
|
+} |
|
|
+ |
|
|
+/* take the difference of t2 - t1 in milliseconds */ |
|
|
+ |
|
|
+static long |
|
|
+diffms (struct timeval t1, struct timeval t2) |
|
|
+{ |
|
|
+ long diffsec, diffusec; |
|
|
+ |
|
|
+ diffsec = t2.tv_sec - t1.tv_sec; |
|
|
+ diffusec = t2.tv_usec - t1.tv_usec; |
|
|
+ |
|
|
+ if (diffusec < 0) |
|
|
+ { |
|
|
+ diffsec--; |
|
|
+ diffusec += 1000000; |
|
|
+ } |
|
|
+ |
|
|
+ return (diffsec * 1000) + (diffusec / 1000); |
|
|
+} |
|
|
+ |
|
|
+/* Get a packet from the BDM12. Timeout is only enforced for the |
|
|
+ first byte of the packet. Subsequent bytes are expected to arrive in |
|
|
+ time <= remote_timeout. Returns a pointer to a static buffer containing |
|
|
+ the payload of the packet. *LENP contains the length of the packet. |
|
|
+ */ |
|
|
+ |
|
|
+static int bdm12_get_packet (unsigned char *packet, int pktlen) |
|
|
+{ |
|
|
+ int i, ch; |
|
|
+ |
|
|
+ for (i = 0; i < pktlen; i++) |
|
|
+ { |
|
|
+ ch = serial_readchar (ser_desc, BDM12_COMM_TIMEOUT); |
|
|
+ switch (ch) |
|
|
+ { |
|
|
+ case SERIAL_EOF: |
|
|
+ error ("Remote connection closed"); |
|
|
+ return 1; |
|
|
+ break; |
|
|
+ case SERIAL_ERROR: |
|
|
+ perror_with_name ("bdm12_get_packet"); |
|
|
+ return 1; |
|
|
+ break; |
|
|
+ case SERIAL_TIMEOUT: |
|
|
+ error ("Remote connection timed out"); |
|
|
+ return 1; |
|
|
+ break; |
|
|
+ default: |
|
|
+ *(packet++) = ch; |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+/* All we actually do is set the PC to the start address of exec_bfd, and start |
|
|
+ the program at that point. */ |
|
|
+ |
|
|
+/* load a program into target memory, the bfd struct is not used here */ |
|
|
+ |
|
|
+BDM12_RC |
|
|
+bdm12_load (char *prog, struct _bfd *abfd, int from_tty) |
|
|
+{ |
|
|
+ generic_load (prog, from_tty); |
|
|
+ |
|
|
+ program_loaded = 1; |
|
|
+/* This is necessary because many things were based on the PC at the time that |
|
|
+ we attached to the monitor, which is no longer valid now that we have loaded |
|
|
+ new code (and just changed the PC). Another way to do this might be to call |
|
|
+ normal_stop, except that the stack may not be valid, and things would get |
|
|
+ horribly confused... */ |
|
|
+ |
|
|
+ clear_symtab_users (); |
|
|
+ return BDM12_RC_OK; |
|
|
+} |
|
|
+ |
|
|
+BDM12_RC |
|
|
+bdm12_set_breakpoint (CORE_ADDR addr) |
|
|
+{ |
|
|
+ unsigned char buf[5]; |
|
|
+ |
|
|
+ if (num_breakpoints >= BDM12_MAX_BREAKPOINTS) |
|
|
+ { |
|
|
+ error ("Maximum breakpoints have already been set"); |
|
|
+ return BDM12_RC_INSUFFICIENT_RESOURCES; |
|
|
+ } |
|
|
+ |
|
|
+ if (num_breakpoints == 0) |
|
|
+ buf[2] = BDM12_REG_BRKAH; |
|
|
+ else |
|
|
+ buf[2] = BDM12_REG_BRKDH; |
|
|
+ |
|
|
+ buf[0] = BDM12_CMD_WRITE_WORD; |
|
|
+ buf[1] = reg_page; |
|
|
+ buf[3] = addr >> 8; |
|
|
+ buf[4] = addr; |
|
|
+ if (bdm12_put_packet (buf, 5)) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ breakpoint[num_breakpoints] = addr; |
|
|
+ num_breakpoints++; |
|
|
+ return BDM12_RC_OK; |
|
|
+} |
|
|
+ |
|
|
+BDM12_RC |
|
|
+bdm12_clear_breakpoint (CORE_ADDR addr) |
|
|
+{ |
|
|
+ unsigned char buf[5]; |
|
|
+ if (breakpoint[0] == addr) |
|
|
+ { |
|
|
+ buf[2] = BDM12_REG_BRKAH; |
|
|
+ breakpoint[0] = 0; |
|
|
+ } |
|
|
+ else if (breakpoint[1] == addr) |
|
|
+ { |
|
|
+ buf[2] = BDM12_REG_BRKDH; |
|
|
+ breakpoint[1] = 0; |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ error ("breakpoint doesn't exist"); |
|
|
+ return BDM12_RC_UNKNOWN_BREAKPOINT; |
|
|
+ } |
|
|
+ |
|
|
+ buf[0] = BDM12_CMD_WRITE_WORD; |
|
|
+ buf[1] = reg_page; |
|
|
+ buf[3] = 0; |
|
|
+ buf[4] = 0; |
|
|
+ if (bdm12_put_packet (buf, 5)) |
|
|
+ return BDM12_RC_FAIL; |
|
|
+ |
|
|
+ num_breakpoints--; |
|
|
+ return BDM12_RC_OK; |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+void |
|
|
+_initialize_bdm12 (void) |
|
|
+{ |
|
|
+ flash_regions.next = NULL; |
|
|
+ flash_regions.prev = NULL; |
|
|
+ flash_regions.data = NULL; |
|
|
+ flash_regions.size = 0; |
|
|
+} |
|
|
+ |
|
|
+#if 0 |
|
|
+/* maybe I should do something like this - later*/ |
|
|
+void _initialize_remote_ocd (void) |
|
|
+{ |
|
|
+ extern struct cmd_list_element *cmdlist; |
|
|
+ static struct cmd_list_element *ocd_cmd_list = NULL; |
|
|
+ |
|
|
+ add_show_from_set (add_set_cmd ("remotetimeout", no_class, |
|
|
+ var_integer, (char *) &remote_timeout, |
|
|
+ "Set timeout value for remote read.\n", &setlist), |
|
|
+ &showlist); |
|
|
+ |
|
|
+ add_prefix_cmd ("ocd", class_obscure, bdm_command, "", &ocd_cmd_list, "ocd ", |
|
|
+ 0, &cmdlist); |
|
|
+ |
|
|
+ add_cmd ("reset", class_obscure, bdm_reset_command, "", &ocd_cmd_list); |
|
|
+ add_cmd ("restart", class_obscure, bdm_restart_command, "", &ocd_cmd_list); |
|
|
+ add_cmd ("update-flash", class_obscure, bdm_update_flash_command, "", &ocd_cmd_list); |
|
|
+} |
|
|
+#endif |
|
|
+ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/bdm12.h gdb-6.4-m68hc1x/gdb/bdm12.h |
|
|
--- gdb-6.4/gdb/bdm12.h Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/bdm12.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,289 @@ |
|
|
+/* This file defines the interface between the BDM12 target and gdb. |
|
|
+ Copyright (C) 2001, 2004 Free Software Foundation, Inc. |
|
|
+ Contributed by Tim Housel (thousel@usa.net) |
|
|
+ |
|
|
+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. */ |
|
|
+ |
|
|
+/* This is basically */ |
|
|
+#if !defined (BDM12_H) |
|
|
+#define BDM12_H 1 |
|
|
+ |
|
|
+#ifdef __cplusplus |
|
|
+extern "C" { |
|
|
+#endif |
|
|
+ |
|
|
+#ifndef REGISTER_BDM12_REGNO |
|
|
+#define REGISTER_BDM12_REGNO(N) (N) |
|
|
+#endif |
|
|
+ |
|
|
+/* Return codes from various functions. */ |
|
|
+ |
|
|
+typedef enum { |
|
|
+ BDM12_RC_FAIL = 0, |
|
|
+ BDM12_RC_OK = 1, |
|
|
+ BDM12_RC_UNKNOWN_BREAKPOINT = 2, |
|
|
+ BDM12_RC_INSUFFICIENT_RESOURCES = 3, |
|
|
+ BDM12_RC_DUPLICATE_BREAKPOINT = 4 |
|
|
+} BDM12_RC; |
|
|
+ |
|
|
+/* these defines were pulled from Stephane's code in |
|
|
+ m68hc11-tdep.c */ |
|
|
+ |
|
|
+#define HARD_X_REGNUM 0 |
|
|
+#define HARD_D_REGNUM 1 |
|
|
+#define HARD_Y_REGNUM 2 |
|
|
+#define HARD_SP_REGNUM 3 |
|
|
+#define HARD_PC_REGNUM 4 |
|
|
+#define HARD_A_REGNUM 5 |
|
|
+#define HARD_B_REGNUM 6 |
|
|
+#define HARD_PSW_REGNUM 7 |
|
|
+ |
|
|
+/* commands for the BDM12 pod */ |
|
|
+ |
|
|
+typedef enum { |
|
|
+ BDM12_CMD_SYNC = 0x0, |
|
|
+ BDM12_CMD_RESET = 0x1, |
|
|
+ BDM12_CMD_EXT = 0x4, |
|
|
+ BDM12_CMD_EXT_MEMDUMP = 0x3, |
|
|
+ BDM12_CMD_EXT_SETPARAM = 0x4, |
|
|
+ BDM12_CMD_EXT_MEMPUT = 0x6, |
|
|
+ BDM12_CMD_EEPROM_WRITE = 0x5, |
|
|
+ BDM12_CMD_SET_REGBASE = 0x6, |
|
|
+ BDM12_CMD_EEPROM_ERASE = 0x7, |
|
|
+ BDM12_CMD_BACKGROUND = 0x90, |
|
|
+ BDM12_CMD_READ_BD_BYTE = 0xe4, |
|
|
+ BDM12_CMD_READ_BD_WORD = 0xec, |
|
|
+ BDM12_CMD_READ_WORD = 0xe8, |
|
|
+ BDM12_CMD_READ_BYTE = 0xe0, |
|
|
+ BDM12_CMD_WRITE_BD_BYTE = 0xc4, |
|
|
+ BDM12_CMD_WRITE_BD_WORD = 0xcc, |
|
|
+ BDM12_CMD_WRITE_WORD = 0xc8, |
|
|
+ BDM12_CMD_WRITE_BYTE = 0xc0, |
|
|
+ BDM12_CMD_READ_NEXT = 0x62, |
|
|
+ BDM12_CMD_READ_PC = 0x63, |
|
|
+ BDM12_CMD_READ_D = 0x64, |
|
|
+ BDM12_CMD_READ_X = 0x65, |
|
|
+ BDM12_CMD_READ_Y = 0x66, |
|
|
+ BDM12_CMD_READ_SP = 0x67, |
|
|
+ BDM12_CMD_WRITE_NEXT = 0x42, |
|
|
+ BDM12_CMD_WRITE_PC = 0x43, |
|
|
+ BDM12_CMD_WRITE_D = 0x44, |
|
|
+ BDM12_CMD_WRITE_X = 0x45, |
|
|
+ BDM12_CMD_WRITE_Y = 0x46, |
|
|
+ BDM12_CMD_WRITE_SP = 0x47, |
|
|
+ BDM12_CMD_GO = 0x8, |
|
|
+ BDM12_CMD_TRACE1 = 0x10, |
|
|
+ BDM12_CMD_TAGGO = 0x18 |
|
|
+} BDM12_CMD; |
|
|
+ |
|
|
+/* e-clock rates as required by the BDM12 pod */ |
|
|
+ |
|
|
+typedef enum { |
|
|
+ BDM12_ECLOCK_1MHZ = 0x0, |
|
|
+ BDM12_ECLOCK_2MHZ = 0x1, |
|
|
+ BDM12_ECLOCK_4MHZ = 0x2, |
|
|
+ BDM12_ECLOCK_8MHZ = 0x3 |
|
|
+} BDM12_ECLOCK; |
|
|
+ |
|
|
+/* misc stuff used to avoid magic constants */ |
|
|
+ |
|
|
+typedef enum { |
|
|
+ BDM12_BDM_HI = 0xff, |
|
|
+ BDM12_ENABLE_BDM_LO = 0x01, |
|
|
+ BDM12_CCRSAV_BDM_LO = 0x06, |
|
|
+ BDM12_REG_INITRG = 0x11, |
|
|
+ BDM12_REG_INITRM = 0x10, |
|
|
+ BDM12_REG_INITEE = 0x12, |
|
|
+ BDM12_REG_MISC = 0x13, |
|
|
+ BDM12_REG_BRKCT0 = 0x20, |
|
|
+ BDM12_REG_BRKCT1 = 0x21, |
|
|
+ BDM12_REG_BRKAH = 0x22, |
|
|
+ BDM12_REG_BRKAL = 0x23, |
|
|
+ BDM12_REG_BRKDH = 0x24, |
|
|
+ BDM12_REG_BRKDL = 0x25, |
|
|
+ BDM12_REG_FEEMCR = 0xf5, |
|
|
+ BDM12_SIZE_REG = 512, |
|
|
+ BDM12_SIZE_RAM = 1024, |
|
|
+ BDM12_SIZE_EEPROM = 768, |
|
|
+ BDM12_SIZE_FLASH = 32768, |
|
|
+ BDM12_INIT_ENABLE_BDM = 0x80, |
|
|
+ BDM12_INIT_BRKCT0 = 0xec, |
|
|
+ BDM12_INIT_BRKCT1 = 0x40, |
|
|
+ BDM12_INIT_FEEMCR = 0x0, |
|
|
+ BDM12_STATUS_STOPPED = 0x40, |
|
|
+ BDM12_MAX_BREAKPOINTS = 2, |
|
|
+ BDM12_BAUD_RATE = 115200, |
|
|
+ BDM12_COMM_TIMEOUT = 1, /* 1s timeout for serial ops */ |
|
|
+ BDM12_ERASEFLASH_TIMEOUT = 1000, /* 200 ms timeout for flash erase program */ |
|
|
+ BDM12_PROGRAMFLASH_TIMEOUT = 3 /* 3 ms/byte timeout for flash burn program */ |
|
|
+} BDM12_MISC; |
|
|
+ |
|
|
+/* The bfd struct, as an opaque type. */ |
|
|
+ |
|
|
+struct _bfd; |
|
|
+ |
|
|
+ |
|
|
+/* Main bdm12 entry points. */ |
|
|
+ |
|
|
+ |
|
|
+/* Create a fully initialized bdm12 instance. |
|
|
+ |
|
|
+ (This function is called when the bdm12 target is selected from the |
|
|
+ gdb command line.) |
|
|
+ |
|
|
+ ARGV is a standard ARGV pointer such as that passed from the |
|
|
+ command line. The syntax of the argument list is is assumed to be |
|
|
+ ``BDM12 { BDM12-OPTION }''. |
|
|
+ |
|
|
+ While the bdm12 configuration can be parameterized by (in decreasing |
|
|
+ precedence) ARGV's BDM12-OPTION and the ABFD argument, the |
|
|
+ successful creation of the bdm12 target shall not be dependent on the |
|
|
+ presence of any of these arguments/options. */ |
|
|
+ |
|
|
+ |
|
|
+extern BDM12_RC bdm12_open (char **argv); |
|
|
+ |
|
|
+ |
|
|
+/* Destory a bdm12 instance. |
|
|
+ |
|
|
+ QUITTING is non-zero if we cannot hang on errors. |
|
|
+*/ |
|
|
+ |
|
|
+extern void bdm12_close (int quitting); |
|
|
+ |
|
|
+ |
|
|
+/* Load program PROG into the target memory. |
|
|
+ |
|
|
+ If ABFD is non-NULL, the bfd for the file has already been opened. |
|
|
+ The result is a return code indicating success. */ |
|
|
+ |
|
|
+extern BDM12_RC bdm12_load (char *prog, struct _bfd *abfd, int from_tty); |
|
|
+ |
|
|
+ |
|
|
+/* Prepare to run the program. |
|
|
+ |
|
|
+ ABFD, if not NULL, provides initial processor state information. |
|
|
+ ARGV and ENV, if non NULL, are NULL terminated lists of pointers. |
|
|
+ |
|
|
+ This function shall initialize the processor |
|
|
+ registers to a known value. The program counter and possibly stack |
|
|
+ pointer shall be set using information obtained from ABFD (or |
|
|
+ hardware reset defaults). ARGV and ENV, dependant on the target |
|
|
+ ABI, may be written to memory. */ |
|
|
+ |
|
|
+extern BDM12_RC bdm12_create_inferior (bfd *abfd, char **argv, char **env); |
|
|
+ |
|
|
+ |
|
|
+/* Fetch LENGTH bytes of the target's memory. Start fetch |
|
|
+ at virtual address MEM and store in BUF. Result is number of bytes |
|
|
+ read, or zero if error. */ |
|
|
+ |
|
|
+extern int bdm12_read (CORE_ADDR mem, unsigned char *buf, int length); |
|
|
+ |
|
|
+ |
|
|
+/* Store LENGTH bytes from BUF into the target's |
|
|
+ memory. Store bytes starting at virtual address MEM. Result is |
|
|
+ number of bytes write, or zero if error. */ |
|
|
+ |
|
|
+extern int bdm12_write (CORE_ADDR mem, unsigned char *buf, int length); |
|
|
+ |
|
|
+ |
|
|
+/* Fetch register REGNO storing its raw (target endian) value in the |
|
|
+ LENGTH byte buffer BUF. Return the actual size of the register or |
|
|
+ zero if REGNO is not applicable. |
|
|
+ |
|
|
+ Legacy implementations ignore LENGTH and always return -1. |
|
|
+ |
|
|
+ If LENGTH does not match the size of REGNO no data is transfered |
|
|
+ (the actual register size is still returned). */ |
|
|
+ |
|
|
+extern int bdm12_fetch_register (int regno, unsigned char *buf, int length); |
|
|
+ |
|
|
+ |
|
|
+/* Store register REGNO from the raw (target endian) value in BUF. |
|
|
+ Return the actual size of the register or zero if REGNO is not |
|
|
+ applicable. |
|
|
+ |
|
|
+ Legacy implementations ignore LENGTH and always return -1. |
|
|
+ |
|
|
+ If LENGTH does not match the size of REGNO no data is transfered |
|
|
+ (the actual register size is still returned). */ |
|
|
+ |
|
|
+extern int bdm12_store_register (int regno, unsigned char *buf, int length); |
|
|
+ |
|
|
+ |
|
|
+/* Run (or resume) the program. |
|
|
+ |
|
|
+ STEP, when non-zero indicates that only a single instruction |
|
|
+ should be executed. */ |
|
|
+ |
|
|
+extern int bdm12_resume (int step); |
|
|
+ |
|
|
+ |
|
|
+/* Asynchronous request to stop execution. |
|
|
+ A nonzero return indicates that the target is able to handle |
|
|
+ the request */ |
|
|
+ |
|
|
+extern int bdm12_stop (void); |
|
|
+ |
|
|
+ |
|
|
+/* Fetch the REASON why the program stopped. |
|
|
+ |
|
|
+ BDM12_EXITED: The program has terminated. SIGRC indicates the target |
|
|
+ dependant exit status. |
|
|
+ |
|
|
+ BDM12_STOPPED: The program has stopped. SIGRC uses the host's signal |
|
|
+ numbering as a way of identifying the reaon: program interrupted by |
|
|
+ user via a bdm12_stop request (SIGINT); a breakpoint instruction |
|
|
+ (SIGTRAP); a completed single step (SIGTRAP); an internal error |
|
|
+ condition (SIGABRT); an illegal instruction (SIGILL); Access to an |
|
|
+ undefined memory region (SIGSEGV); Mis-aligned memory access |
|
|
+ (SIGBUS). For some signals information in addition to the signal |
|
|
+ number may be retained by the target (e.g. offending address); |
|
|
+ that information is not directly accessable via this interface. |
|
|
+ |
|
|
+ BDM12_SIGNALLED: The program has been terminated by a signal. The |
|
|
+ target has encountered code that causes the the program |
|
|
+ to exit with signal SIGRC. |
|
|
+ |
|
|
+ BDM12_RUNNING, BDM12_POLLING: The return of one of these values |
|
|
+ indicates a problem internal to the BDM12 interface. */ |
|
|
+ |
|
|
+enum bdm12_stop { BDM12_RUNNING, BDM12_POLLING, BDM12_EXITED, BDM12_STOPPED, BDM12_SIGNALLED }; |
|
|
+ |
|
|
+extern void bdm12_stop_reason (enum bdm12_stop *reason, int *sigrc); |
|
|
+ |
|
|
+#if 0 |
|
|
+/* implement later */ |
|
|
+/* Passthru for other commands that the bdm12 interface might support. |
|
|
+ The interface should be prepared to deal with any combination of NULL |
|
|
+ or empty CMD. */ |
|
|
+ |
|
|
+void bdm12_do_command PARAMS ((char *cmd)); |
|
|
+ |
|
|
+#endif |
|
|
+ |
|
|
+/* Call these functions to set and clear breakpoints at ADDR. */ |
|
|
+ |
|
|
+extern BDM12_RC bdm12_set_breakpoint (CORE_ADDR addr); |
|
|
+extern BDM12_RC bdm12_clear_breakpoint (CORE_ADDR addr); |
|
|
+ |
|
|
+#ifdef __cplusplus |
|
|
+} |
|
|
+#endif |
|
|
+ |
|
|
+#endif /* !defined (BDM12_H) */ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/bdm12_eraseflash.h gdb-6.4-m68hc1x/gdb/bdm12_eraseflash.h |
|
|
--- gdb-6.4/gdb/bdm12_eraseflash.h Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/bdm12_eraseflash.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,249 @@ |
|
|
+#define BDM12_ERASEFLASH_SIZE 208 |
|
|
+#define BDM12_ERASEFLASH_FLASHSTART 0 |
|
|
+#define BDM12_ERASEFLASH_REGSTART 2 |
|
|
+#define BDM12_ERASEFLASH_ERRORFLAG 9 |
|
|
+#define BDM12_ERASEFLASH_PROGSTART 10 |
|
|
+ |
|
|
+unsigned char eraseflash[BDM12_ERASEFLASH_SIZE] = { |
|
|
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
|
+ 0x00, 0x01, 0x1B, 0xD4, 0x14, 0x10, 0xEE, 0xF2, |
|
|
+ 0x00, 0x00, 0x69, 0xF2, 0x00, 0x06, 0x69, 0xF2, |
|
|
+ 0x00, 0x07, 0x69, 0xF2, 0x00, 0x08, 0xED, 0xF2, |
|
|
+ 0x00, 0x02, 0x0F, 0xE8, 0xF7, 0x08, 0x74, 0x19, |
|
|
+ 0xE8, 0xF7, 0x18, 0x08, 0x40, 0x06, 0x6C, 0x00, |
|
|
+ 0xED, 0xF2, 0x00, 0x02, 0x0C, 0xE8, 0xF7, 0x01, |
|
|
+ 0x19, 0xC6, 0x6D, 0xF2, 0x00, 0x04, 0x20, 0x7B, |
|
|
+ 0xED, 0xF2, 0x00, 0x02, 0x0D, 0xE8, 0xF7, 0x01, |
|
|
+ 0x19, 0xC6, 0x6D, 0xF2, 0x00, 0x04, 0x20, 0x6B, |
|
|
+ 0xE7, 0xF2, 0x00, 0x07, 0x27, 0x1E, 0x63, 0xF2, |
|
|
+ 0x00, 0x06, 0x26, 0xD4, 0x19, 0xC6, 0x6D, 0xF2, |
|
|
+ 0x00, 0x04, 0x20, 0x38, 0xE7, 0xF2, 0x00, 0x08, |
|
|
+ 0x27, 0x31, 0xED, 0xF2, 0x00, 0x02, 0x0D, 0xE8, |
|
|
+ 0xF7, 0x06, 0x20, 0x22, 0x62, 0xF2, 0x00, 0x06, |
|
|
+ 0x19, 0xC6, 0x6D, 0xF2, 0x00, 0x04, 0x20, 0x1C, |
|
|
+ 0xE7, 0xF2, 0x00, 0x08, 0x26, 0x0A, 0xE6, 0xF2, |
|
|
+ 0x00, 0x06, 0xC1, 0x05, 0x23, 0xA2, 0x20, 0x0B, |
|
|
+ 0x62, 0xF2, 0x00, 0x07, 0x20, 0x9A, 0x69, 0xF2, |
|
|
+ 0x00, 0x09, 0x00, 0x00, 0x69, 0xF2, 0x00, 0x08, |
|
|
+ 0xCD, 0x3C, 0x00, 0xEE, 0xF2, 0x00, 0x00, 0xCC, |
|
|
+ 0xFF, 0xFF, 0xAC, 0x31, 0x26, 0x07, 0x04, 0x36, |
|
|
+ 0xF9, 0x62, 0xF2, 0x00, 0x08, 0xED, 0xF2, 0x00, |
|
|
+ 0x04, 0x05, 0x40, 0xCC, 0x00, 0x0A, 0x20, 0x00, |
|
|
+ 0xCE, 0x07, 0xD0, 0xA7, 0x04, 0x35, 0xFC, 0x04, |
|
|
+ 0x34, 0xF6, 0xED, 0xF2, 0x00, 0x04, 0x05, 0x40 }; |
|
|
+/* The above was produced by assembling the following program with |
|
|
+ > m6812-elf-as -o bdm12_eraseflash.o bdm12_eraseflash.s |
|
|
+ > m6812-elf-objcopy.exe --change-addresses 0x800 -O srec bdm12_eraseflash.o |
|
|
+ bdm12_eraseflash.s19 |
|
|
+ > ./convert < bdm12_eraseflash.s19 > bdm12_eraseflash.h |
|
|
+ |
|
|
+ convert.c is listed following the assembly |
|
|
+ |
|
|
+;-------------------bdm12_eraseflash.s------------------- |
|
|
+;-------------------------------------------------------- |
|
|
+;--- Application Note Source Code for AN1836 --- |
|
|
+;--- Erasing and Programming the FLASH --- |
|
|
+;--- EEPROM on the MC68HC912B32 --- |
|
|
+;--- --- |
|
|
+;--- FLASH EEPROM erase routine --- |
|
|
+;--- MC68HC912B32 1.5T FLASH Module --- |
|
|
+;--- --- |
|
|
+;--- Rev. 1.2 February 9, 2000 --- |
|
|
+;--- Fixed bug in ReadArray routine --- |
|
|
+;--- Created Bit Name Labels for easier reading --- |
|
|
+;--- Streamlined Code for efficiency --- |
|
|
+;--- Rev. 1.1 January 11, 2000 --- |
|
|
+;--- Changed to 10ms delay for tepulse --- |
|
|
+;--- to match specification change --- |
|
|
+;--- Rev. 1.0 April 16, 1998 --- |
|
|
+;--- Changed to 100ms delay for tepulse --- |
|
|
+;--- Written November 6, 1997 --- |
|
|
+;--- --- |
|
|
+;--- ASSEMBLER: IASM12 v. 3.06 --- |
|
|
+;--- P & E Microcomputer Systems --- |
|
|
+;--- --- |
|
|
+;--- by Matt Ruff, BE/OS Systems Engineering --- |
|
|
+;--- --- |
|
|
+;--- This code is intended for instructional use --- |
|
|
+;--- only. Motorola assumes no liability for use --- |
|
|
+;--- or modification of this code. It is the --- |
|
|
+;--- responsibility of the user to verify all --- |
|
|
+;--- parameters, variables, timings, etc. --- |
|
|
+;--- --- |
|
|
+;-------------------------------------------------------- |
|
|
+;----------------------------- Equates ----------------------------- |
|
|
+ |
|
|
+TmpStorage: |
|
|
+FLASHStart: .word 0x8000 ;FLASH Start address |
|
|
+REGStart: .word 0x0 ;Register Start Address |
|
|
+SavePC: .word 0x0 ;saved PC |
|
|
+Nep: .byte 0 ;Number of programming pulses applied |
|
|
+MarginFlag: .byte 0 ;Programming margin flag |
|
|
+ErasedFlag: .byte 0 ;Array Erased Flag |
|
|
+ErrorFlag: .byte 1 ;Error Flag |
|
|
+ .equ FLASHSize, 0x8000 |
|
|
+ .equ BootBlkSize, 0x800 ;Size of the boot block |
|
|
+ .equ BCFEEWords, ((FLASHSize-BootBlkSize)/2) |
|
|
+ ;Num of words to blank check |
|
|
+ .equ MaxNep, 5 ;5 pulses maximum |
|
|
+ .equ FEELCK, 0xF4 ;FLASH Lock Control Register |
|
|
+ .equ FEEMCR, 0xF5 ;FLASH Module Configuration Register |
|
|
+ .equ FEECTL, 0xF7 ;FLASH Control Register |
|
|
+ .equ LOCK, 0x01 ;Lock register Bit in FEELCK |
|
|
+ .equ BOOTP, 0x01 ;Boot Protect Bit in FEEMCR |
|
|
+ .equ SVFP, 0x08 ;Status Vfp Voltage Bit in FEECTL |
|
|
+ .equ ERAS, 0x04 ;Erase Control Bit in FEECTL |
|
|
+ .equ LAT, 0x02 ;Programming Latch Control bit in FEECTL |
|
|
+ .equ ENPE, 0x01 ;Enable Program/Erase Voltage Bit in FEECTL |
|
|
+ .equ Mult, 1000 ;Multiplier for EClock, assembler won't do |
|
|
+ ; values over 2^16 |
|
|
+ .equ EClock,(Mult*8000) ;E-clock frequency in Hz. |
|
|
+ .equ mS1LoopTime, 4 ;Num of clock cycles per loop. |
|
|
+ .equ mS1Delay, (EClock/(mS1LoopTime*1000)) |
|
|
+ ;Factor of 1000 used for base time of 1 ms. |
|
|
+ |
|
|
+Start: |
|
|
+ LEAS TmpStorage,PC |
|
|
+ SEI ;disable interrupts - no SP |
|
|
+ LDX FLASHStart,SP |
|
|
+ CLR Nep,SP ;Clear number of pulses |
|
|
+ CLR MarginFlag,SP ;Clear margin flag |
|
|
+ CLR ErasedFlag,SP ;Clear erased flag |
|
|
+ LDY REGStart,SP |
|
|
+ BRCLR FEECTL,Y, SVFP,Error |
|
|
+ ;If Vfp not present, output an error |
|
|
+;- Step 2 - |
|
|
+ LEAY FEECTL,Y |
|
|
+ MOVB #ERAS|LAT, 0,Y |
|
|
+ ;Set ERAS and LAT in FEECTL ( | is bitwise or) |
|
|
+;- Step 3 - |
|
|
+ STD 0,X ;Write some data to a valid FLASH address |
|
|
+;- Step 4 - |
|
|
+STEP4: |
|
|
+ LDY REGStart,SP |
|
|
+ BSET FEECTL,Y, ENPE ;Apply erase voltage (Set ENPE) |
|
|
+;- Step 5 - |
|
|
+ LEAY 6,PC |
|
|
+ STY SavePC,SP |
|
|
+ BRA dly_10ms ;Delay time for erase pulse (Tepulse) |
|
|
+ |
|
|
+;- Step 6 - |
|
|
+ LDY REGStart,SP |
|
|
+ BCLR FEECTL,Y, ENPE ;Remove erase voltage (Clear ENPE) |
|
|
+;- Step 7 - |
|
|
+ LEAY 6,PC |
|
|
+ STY SavePC,SP |
|
|
+ BRA dly_10ms ;Delay for high voltage turn off (Tverase) |
|
|
+ TST MarginFlag,SP ;Is margin flag set?? |
|
|
+ ; (TST sets Z bit in CCR if MarginFlag is 0) |
|
|
+ BEQ NoFlag ;If not, go bump counter and check data |
|
|
+ ; (BEQ branches if MarginFlag is 0) |
|
|
+YesFlag: |
|
|
+ DEC Nep,SP ;Decrement Nep - mod. Z bit in CCR for coming |
|
|
+ ; BNE branch |
|
|
+ BNE STEP4 ;If Nep not 0, go to Step 4 |
|
|
+ LEAY 6,PC |
|
|
+ STY SavePC,SP |
|
|
+ BRA ReadArray ;Verify entire array is erased |
|
|
+ TST ErasedFlag,SP ;Is the array erased? |
|
|
+ ; (TST sets Z bit in CCR if ErasedFlag is 0) |
|
|
+ BEQ Error ;If not, Erase failed, output an error |
|
|
+ ; (BEQ branches if ErasedFlag is 0) |
|
|
+;- Step 10 - |
|
|
+ LDY REGStart,SP |
|
|
+ BCLR FEECTL,Y, ERAS|LAT |
|
|
+ ;Clear ERAS and LAT in FEECTL |
|
|
+ BRA Done ;If so, quit. |
|
|
+NoFlag: |
|
|
+ INC Nep,SP ;Increment number of erase pulses applied |
|
|
+ LEAY 6,PC |
|
|
+ STY SavePC,SP |
|
|
+ BRA ReadArray ;Verify entire array is erased |
|
|
+ TST ErasedFlag,SP ;Is it erased? |
|
|
+ ; (TST sets Z bit in CCR if ErasedFlag is 0) |
|
|
+ BNE SetMarginFlag ;If so, set margin flag |
|
|
+ ; (BNE branches if ErasedFlag is 1) |
|
|
+ LDAB Nep,SP |
|
|
+ CMPB #MaxNep ;Have we applied max number of pulses? |
|
|
+ BLS STEP4 ;If not, continue erasing |
|
|
+ BRA Error ;If so, we have a problem |
|
|
+SetMarginFlag: |
|
|
+ INC MarginFlag,SP ;Set Margin Flag |
|
|
+ BRA STEP4 |
|
|
+Done: |
|
|
+ CLR ErrorFlag,SP |
|
|
+ BGND |
|
|
+Error: |
|
|
+ BGND |
|
|
+;----------------------------------------------------------------------- |
|
|
+;----------------- Read and Verify Erase subroutine ---------------- |
|
|
+;----------------------------------------------------------------------- |
|
|
+ReadArray: |
|
|
+ CLR ErasedFlag,SP ; Always start with clear flag. |
|
|
+ LDY #BCFEEWords ; Num of words to check in FLASH. (No boot |
|
|
+ ; block check) |
|
|
+ LDX FLASHStart,SP ; Index to the start of FLASH. |
|
|
+ LDD #0xFFFF ; Erased word value for comparison. |
|
|
+CheckLoop: |
|
|
+ CPD 2,X+ ; Is word erased? |
|
|
+ BNE VerifyBad ; If not, return without setting ErasedFlag. |
|
|
+ ; (failure) |
|
|
+ DBNE Y,CheckLoop ; Yes, Dec the word count, if not done check |
|
|
+ ; the next word. |
|
|
+ INC ErasedFlag,SP ; All words checked & are erased. Set |
|
|
+ ; ErasedFlag. |
|
|
+VerifyBad: |
|
|
+ LDY SavePC,SP |
|
|
+ JMP 0,Y |
|
|
+;----------------------------------------------------------------------- |
|
|
+;---------------------- Delay Subroutines ----------------------- |
|
|
+;----------------------------------------------------------------------- |
|
|
+dly_10ms: |
|
|
+ LDD #10 ;Delay for 10ms |
|
|
+ BRA DelaymS |
|
|
+ |
|
|
+;----------------------------------------------------------------------- |
|
|
+;--- Millisecond Delay Routine --- |
|
|
+;--- --- |
|
|
+;--- Call with the number of mS to delay in the D accumulator. --- |
|
|
+;--- The delay is not exact, but close enough when delaying ms. --- |
|
|
+;----------------------------------------------------------------------- |
|
|
+DelaymS: |
|
|
+DlyLoop1mS: |
|
|
+ LDX #mS1Delay ;Load 1ms delay count into X |
|
|
+DlyLoop: |
|
|
+ NOP ;Decrement count |
|
|
+ DBNE X,DlyLoop ;Loop until done. |
|
|
+ DBNE D,DlyLoop1mS |
|
|
+ LDY SavePC,SP |
|
|
+ JMP 0,Y |
|
|
+------------------------convert.c--------------------------------------- |
|
|
+#include <stdio.h> |
|
|
+#include <string.h> |
|
|
+main() |
|
|
+{ |
|
|
+ char line[200]; |
|
|
+ char *data = line + 8; |
|
|
+ int i; |
|
|
+ int count = 0; |
|
|
+ |
|
|
+ printf ("unsigned char prog[] = {\n "); |
|
|
+ while (fgets (line, 200, stdin)) |
|
|
+ { |
|
|
+ if (strncmp (line, "S1", 2) != 0) |
|
|
+ continue; |
|
|
+ for (i = 0; i < strlen(data) - 4; i += 2) |
|
|
+ { |
|
|
+ printf ("0x"); |
|
|
+ putchar (data[i]); |
|
|
+ putchar (data[i+1]); |
|
|
+ printf (", "); |
|
|
+ count++; |
|
|
+ if (!(count % 8)) |
|
|
+ printf("\n "); |
|
|
+ } |
|
|
+ } |
|
|
+ printf(" };\n"); |
|
|
+ printf("#define SIZE_PROG %d\n", count); |
|
|
+} |
|
|
+*/ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/bdm12_programflash.h gdb-6.4-m68hc1x/gdb/bdm12_programflash.h |
|
|
--- gdb-6.4/gdb/bdm12_programflash.h Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/bdm12_programflash.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,236 @@ |
|
|
+#define BDM12_PROGRAMFLASH_SIZE 207 |
|
|
+#define BDM12_PROGRAMFLASH_FLASHSTART 0 |
|
|
+#define BDM12_PROGRAMFLASH_FLASHEND 2 |
|
|
+#define BDM12_PROGRAMFLASH_REGSTART 4 |
|
|
+#define BDM12_PROGRAMFLASH_DATASTART 6 |
|
|
+#define BDM12_PROGRAMFLASH_NUMWRITTEN 10 |
|
|
+#define BDM12_PROGRAMFLASH_PROGSTART 14 |
|
|
+ |
|
|
+unsigned char programflash[BDM12_PROGRAMFLASH_SIZE] = { |
|
|
+ 0x80, 0x00, 0x80, 0x02, 0x00, 0x00, 0x09, 0x00, |
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xD0, |
|
|
+ 0x14, 0x10, 0x87, 0xC7, 0x6C, 0xF2, 0x00, 0x0A, |
|
|
+ 0xEE, 0xF2, 0x00, 0x00, 0xED, 0xF2, 0x00, 0x04, |
|
|
+ 0x0E, 0xE8, 0xF7, 0x08, 0x04, 0x18, 0x20, 0x00, |
|
|
+ 0x8B, 0xED, 0xF2, 0x00, 0x06, 0x69, 0xF2, 0x00, |
|
|
+ 0x0C, 0x69, 0xF2, 0x00, 0x0D, 0x6D, 0xF2, 0x00, |
|
|
+ 0x08, 0xED, 0xF2, 0x00, 0x04, 0xC6, 0x02, 0x6B, |
|
|
+ 0xE8, 0xF7, 0xED, 0xF2, 0x00, 0x08, 0xE6, 0x40, |
|
|
+ 0x6B, 0x00, 0x6D, 0xF2, 0x00, 0x08, 0xED, 0xF2, |
|
|
+ 0x00, 0x04, 0x0C, 0xE8, 0xF7, 0x01, 0x19, 0xC2, |
|
|
+ 0x20, 0x65, 0xED, 0xF2, 0x00, 0x04, 0x0D, 0xE8, |
|
|
+ 0xF7, 0x01, 0x19, 0xC2, 0x20, 0x61, 0xED, 0xF2, |
|
|
+ 0x00, 0x08, 0xE7, 0xF2, 0x00, 0x0D, 0x27, 0x2A, |
|
|
+ 0x63, 0xF2, 0x00, 0x0C, 0xE7, 0xF2, 0x00, 0x0C, |
|
|
+ 0x26, 0xD0, 0xA6, 0x00, 0xA1, 0x40, 0x26, 0x34, |
|
|
+ 0x6D, 0xF2, 0x00, 0x08, 0xED, 0xF2, 0x00, 0x04, |
|
|
+ 0x0D, 0xE8, 0xF7, 0x02, 0xED, 0xF2, 0x00, 0x08, |
|
|
+ 0x08, 0x02, 0xAE, 0xF2, 0x00, 0x02, 0x26, 0x95, |
|
|
+ 0x20, 0x1A, 0x62, 0xF2, 0x00, 0x0C, 0xA6, 0x00, |
|
|
+ 0xA1, 0x40, 0x27, 0x0A, 0xE6, 0xF2, 0x00, 0x0C, |
|
|
+ 0xC1, 0x32, 0x23, 0x9E, 0x20, 0x06, 0x62, 0xF2, |
|
|
+ 0x00, 0x0D, 0x20, 0x96, 0xB7, 0x54, 0xA3, 0xF2, |
|
|
+ 0x00, 0x00, 0x6C, 0xF2, 0x00, 0x0A, 0x00, 0xCC, |
|
|
+ 0x00, 0x34, 0x04, 0x34, 0xFD, 0x05, 0x40, 0xCC, |
|
|
+ 0x00, 0x18, 0x04, 0x34, 0xFD, 0x05, 0x40 }; |
|
|
+ |
|
|
+/* The above was produced by assembling the following program with |
|
|
+ > m6812-elf-as bdm12_programflash.s |
|
|
+ > m6812-elf-objcopy.exe --change-addresses 0x800 -O srec |
|
|
+ bdm12_programflash.o bdm12_programflash.s19 |
|
|
+ > ./convert < bdm12_programflash.s19 > bdm12_programflash.h |
|
|
+ |
|
|
+ Convert.c is listed following the assembly |
|
|
+ |
|
|
+;----------------bdm12_programflash.s----------------- |
|
|
+;----------------------------------------------------- |
|
|
+;--- Application Note Source Code for AN1836 --- |
|
|
+;--- Erasing and Programming the FLASH --- |
|
|
+;--- EEPROM on the MC68HC912B32 --- |
|
|
+;--- --- |
|
|
+;--- FLASH EEPROM program routine --- |
|
|
+;--- MC68HC912B32 1.5T FLASH Module --- |
|
|
+;--- --- |
|
|
+;--- Rev. 1.2 February 9, 2000 --- |
|
|
+;--- Created Bit Name Labels for easier reading--- |
|
|
+;--- Streamlined Code for efficiency --- |
|
|
+;--- Rev. 1.0 - April 23,1998 --- |
|
|
+;--- Fixed Tppulse = 25us and Tvprog = 10us --- |
|
|
+;--- Written November 6, 1997 --- |
|
|
+;--- --- |
|
|
+;--- ASSEMBLER: IASM12 v. 3.06 --- |
|
|
+;--- P & E Microcomputer Systems--- |
|
|
+;--- --- |
|
|
+;--- by Matt Ruff, BE/OS Systems Engineering --- |
|
|
+;--- --- |
|
|
+;--- This code is intended for instructional use --- |
|
|
+;--- only. Motorola assumes no liability for use --- |
|
|
+;--- or modification of this code. It is the --- |
|
|
+;--- responsibility of the user to verify all --- |
|
|
+;--- parameters, variables, timings, etc. --- |
|
|
+;--- --- |
|
|
+;-------------------------------------------------------- |
|
|
+;------------------------------ Equates ---------------------------------- |
|
|
+ |
|
|
+TmpStorage: |
|
|
+FLASHStart: .word 0x8000 ;FLASH Start address |
|
|
+FLASHEnd: .word 0x8002 ;FLASH End address (non-inclusive) |
|
|
+REGStart: .word 0x0 ;Register Start address |
|
|
+DATAStart: .word 0x900 ;Start of memory address to read from |
|
|
+SaveY: .word 0x0 ;tmp storage for Y since I don't want |
|
|
+ ;to mess with stack |
|
|
+NumWritten: .word 0x0 ;how many words have been written |
|
|
+Npp: .byte 0 ;Number of programming pulses applied |
|
|
+MarginFlag: .byte 0 ;Programming margin flag |
|
|
+ |
|
|
+ .equ MaxNpp, 50 ;50 pulses maximum |
|
|
+ .equ FEELCK, 0xF4 ;FLASH Lock Control Register |
|
|
+ .equ FEEMCR, 0xF5 ;FLASH Module Configuration Register |
|
|
+ .equ FEECTL, 0xF7 ;FLASH Control Register |
|
|
+ .equ LOCK, 0x01 ;Lock register Bit in FEELCK |
|
|
+ .equ BOOTP, 0x01 ;Boot Protect Bit in FEEMCR |
|
|
+ .equ SVFP, 0x08 ;Status Vfp Voltage Bit in FEECTL |
|
|
+ .equ ERASE, 0x04 ;Erase Control Bit in FEECTL |
|
|
+ .equ LAT, 0x02 ;Programming Latch Control bit in FEECTL |
|
|
+ .equ ENPE, 0x01 ;Enable Program/Erase Voltage Bit in FEECTL |
|
|
+Start: |
|
|
+ LEAS TmpStorage,PC ;Set SP to the beginning of tmp vars |
|
|
+ SEI ;disable interrupts - no SP |
|
|
+ CLRA |
|
|
+ CLRB |
|
|
+ STD NumWritten,SP ;Clear Num Bytes Written counter |
|
|
+ LDX FLASHStart,SP |
|
|
+ LDY REGStart,SP |
|
|
+ BRSET FEECTL,Y, 8,NoError |
|
|
+ ;If Vfp not present, output an error |
|
|
+ LBRA Done |
|
|
+NoError: |
|
|
+ LDY DATAStart,SP |
|
|
+Loop: |
|
|
+ CLR Npp,SP ;Clear number of pulses |
|
|
+ CLR MarginFlag,SP ;Clear MarginFlag |
|
|
+;- Step 2 - |
|
|
+ STY SaveY,SP |
|
|
+ LDY REGStart,SP |
|
|
+ LDAB #LAT |
|
|
+ STAB FEECTL,Y |
|
|
+ LDY SaveY,SP |
|
|
+ ;Set LAT in FEECTL |
|
|
+ LDAB 0,Y ;Load from RAM |
|
|
+;- Step 3 - |
|
|
+ STAB 0,X ;Store in Flash |
|
|
+;- Step 4 - |
|
|
+STEP4: |
|
|
+ STY SaveY,SP |
|
|
+ LDY REGStart,SP |
|
|
+ BSET FEECTL,Y,ENPE |
|
|
+ ;Apply programming voltage (Set ENPE) |
|
|
+;- Step 5 - |
|
|
+ LEAY 2,PC |
|
|
+ BRA dly_22us ;Delay time for prog pulse (Tppulse) |
|
|
+;- Step 6 - |
|
|
+ LDY REGStart,SP |
|
|
+ BCLR FEECTL,Y,ENPE |
|
|
+ ;Remove programming voltage (Clear ENPE) |
|
|
+;- Step 7 - |
|
|
+ LEAY 2,PC |
|
|
+ BRA dly_10us ;Delay for high voltage turn off (Tvprog) |
|
|
+ LDY SaveY,SP |
|
|
+ TST MarginFlag,SP ;Is MarginFlag set?? |
|
|
+ BEQ NoFlag ;If not, go bump counter and check data |
|
|
+YesFlag: |
|
|
+ DEC Npp,SP ;Decrement Npp |
|
|
+ TST Npp,SP ;Is Npp=0? |
|
|
+ BNE STEP4 ;If not, go to Step 4 |
|
|
+;- Step 9 - |
|
|
+ LDAA 0,X ;Read FEEPROM location to verify programming |
|
|
+ CMPA 0,Y ;Is it the same as the byte to be programmed? |
|
|
+ BNE Done ;Programming failed, output an error |
|
|
+;- Step 10 - |
|
|
+ STY SaveY,SP |
|
|
+ LDY REGStart,SP |
|
|
+ BCLR FEECTL,Y,LAT ;Clear LAT in FEECTL |
|
|
+ LDY SaveY,SP |
|
|
+ |
|
|
+ INX |
|
|
+ INY |
|
|
+ CPX FLASHEnd,SP ;Check for end |
|
|
+ BNE Loop ;If not, go back to start! |
|
|
+ BRA Done ;If so, quit. |
|
|
+NoFlag: |
|
|
+ INC Npp,SP ;Increment number of prog pulses applied |
|
|
+ LDAA 0,X ;Read FEEPROM location to verify programming |
|
|
+ CMPA 0,Y ;Is it the same as the byte to be programmed? |
|
|
+ BEQ SetMarginFlag |
|
|
+ ;If so, set the margin flag |
|
|
+ LDAB Npp,SP |
|
|
+ CMPB #MaxNpp ;Have we applied max number of pulses? |
|
|
+ BLS STEP4 ;If not, continue programming |
|
|
+ BRA Done ;If so, we have a problem |
|
|
+SetMarginFlag: |
|
|
+ INC MarginFlag,SP ;Set MarginFlag |
|
|
+ BRA STEP4 |
|
|
+Done: |
|
|
+ TFR X, D |
|
|
+ SUBD FLASHStart,SP |
|
|
+ STD NumWritten,SP |
|
|
+ BGND |
|
|
+;----------------------------------------------------------------------- |
|
|
+;---------------------- Delay Subroutines ----------------------- |
|
|
+;----------------------------------------------------------------------- |
|
|
+;----------------------------------------------------------------------- |
|
|
+;--- Microsecond Delay Routines (8MHz e clock) --- |
|
|
+;--- --- |
|
|
+;--- To reduce loop overhead, the following routines have been --- |
|
|
+;--- optimized by counting cycle time and calculating the delay --- |
|
|
+;--- based on an 8MHz system clock. --- |
|
|
+;----------------------------------------------------------------------- |
|
|
+dly_22us: ; Delay for about 22-23us |
|
|
+; JSR or BSR is 4 cycles |
|
|
+; Total delay is {4+2+(loopcount*3)+5}*125ns |
|
|
+; For a loopcount of 52 yields 20.875us |
|
|
+ LDD #52 ; -2 cycles- |
|
|
+d_22u: |
|
|
+ DBNE D,d_22u ; -3 cycles- |
|
|
+ JMP 0,Y |
|
|
+ ; -5 cycles- |
|
|
+ |
|
|
+dly_10us: ; Delay for about 10us |
|
|
+ ; JSR or BSR is 4 cycles |
|
|
+ ; Total delay is {4+2+(loopcount*3)+5}*125ns |
|
|
+ ; For a loopcount of 24 yields 10.375us |
|
|
+ LDD #24 ; -2 cycles- |
|
|
+d_10u: |
|
|
+ DBNE D,d_10u ; -3 cycles- |
|
|
+ JMP 0,Y |
|
|
+ ; -5 cycles- |
|
|
+--------------------------------convert.c------------------------------- |
|
|
+#include <stdio.h> |
|
|
+#include <string.h> |
|
|
+main() |
|
|
+{ |
|
|
+ char line[200]; |
|
|
+ char *data = line + 8; |
|
|
+ int i; |
|
|
+ int count = 0; |
|
|
+ |
|
|
+ printf ("unsigned char prog[] = {\n "); |
|
|
+ while (fgets (line, 200, stdin)) |
|
|
+ { |
|
|
+ if (strncmp (line, "S1", 2) != 0) |
|
|
+ continue; |
|
|
+ for (i = 0; i < strlen(data) - 4; i += 2) |
|
|
+ { |
|
|
+ printf ("0x"); |
|
|
+ putchar (data[i]); |
|
|
+ putchar (data[i+1]); |
|
|
+ printf (", "); |
|
|
+ count++; |
|
|
+ if (!(count % 8)) |
|
|
+ printf("\n "); |
|
|
+ } |
|
|
+ } |
|
|
+ printf(" };\n"); |
|
|
+ printf("#define SIZE_PROG %d\n", count); |
|
|
+} |
|
|
+*/ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/config/m68hc11/m68hc11.mt gdb-6.4-m68hc1x/gdb/config/m68hc11/m68hc11.mt |
|
|
--- gdb-6.4/gdb/config/m68hc11/m68hc11.mt Wed Sep 3 17:02:50 2003 |
|
|
+++ gdb-6.4-m68hc1x/gdb/config/m68hc11/m68hc11.mt Sat Jan 21 15:28:49 2006 |
|
|
@@ -1,5 +1,5 @@ |
|
|
# Target: Motorola 68HC11 processor |
|
|
-TDEPFILES= m68hc11-tdep.o |
|
|
+TDEPFILES= m68hc11-tdep.o m68hc11-rom.o monitor.o dsrec.o remote-bdm12.o bdm12.o |
|
|
SIM_OBS= remote-sim.o |
|
|
SIM= ../sim/m68hc11/libsim.a -lm |
|
|
|
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/dsrec.c gdb-6.4-m68hc1x/gdb/dsrec.c |
|
|
--- gdb-6.4/gdb/dsrec.c Sat Feb 12 01:39:18 2005 |
|
|
+++ gdb-6.4-m68hc1x/gdb/dsrec.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -49,7 +49,8 @@ static int make_srec (char *srec, CORE_A |
|
|
void |
|
|
load_srec (struct serial *desc, const char *file, bfd_vma load_offset, |
|
|
int maxrecsize, |
|
|
- int flags, int hashmark, int (*waitack) (void)) |
|
|
+ int flags, int hashmark, int (*waitack) (void), |
|
|
+ int (*serial_write) PARAMS ((struct serial*, char*, int))) |
|
|
{ |
|
|
bfd *abfd; |
|
|
asection *s; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/m68hc11-rom.c gdb-6.4-m68hc1x/gdb/m68hc11-rom.c |
|
|
--- gdb-6.4/gdb/m68hc11-rom.c Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/m68hc11-rom.c Sat Jan 21 17:12:43 2006 |
|
|
@@ -0,0 +1,732 @@ |
|
|
+/* Remote target glue for various Motorola 68HC11/68HC12 monitors. |
|
|
+ Copyright (C) 2000 Free Software Foundation, Inc. |
|
|
+ Contributed by Stephane Carrez, stcarrez@worldnet.fr |
|
|
+ |
|
|
+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" |
|
|
+#include "arch-utils.h" |
|
|
+#include "event-loop.h" |
|
|
+#include "event-top.h" |
|
|
+#include "target.h" |
|
|
+#include "inferior.h" |
|
|
+#include <bfd/libbfd.h> |
|
|
+#include <string.h> |
|
|
+#ifndef __MINGW32__ |
|
|
+#include <sys/poll.h> |
|
|
+#endif |
|
|
+ |
|
|
+/* Register numbers of various important registers. */ |
|
|
+#define HARD_X_REGNUM 0 |
|
|
+#define HARD_D_REGNUM 1 |
|
|
+#define HARD_Y_REGNUM 2 |
|
|
+#define HARD_SP_REGNUM 3 |
|
|
+#define HARD_PC_REGNUM 4 |
|
|
+ |
|
|
+#define HARD_A_REGNUM 5 |
|
|
+#define HARD_B_REGNUM 6 |
|
|
+#define HARD_CCR_REGNUM 7 |
|
|
+#define M68HC11_LAST_HARD_REG (HARD_CCR_REGNUM) |
|
|
+#define M68HC11_NUM_REGS (8) |
|
|
+ |
|
|
+/* Switch gdb to use the given architecture. The architecture is |
|
|
+ controlled by the monitor we are connected to, not by our program. |
|
|
+ Each time we connect to the monitor, update the gdb-arch to |
|
|
+ reflect the target arch. */ |
|
|
+static void |
|
|
+set_gdbarch (enum bfd_architecture arch, unsigned long mach) |
|
|
+{ |
|
|
+ struct gdbarch_info info; |
|
|
+ bfd abfd; |
|
|
+ |
|
|
+ bfd_default_set_arch_mach (&abfd, arch, mach); |
|
|
+ |
|
|
+ memset (&info, 0, sizeof info); |
|
|
+ info.bfd_arch_info = bfd_get_arch_info (&abfd); |
|
|
+ |
|
|
+ if (!gdbarch_update_p (info)) |
|
|
+ { |
|
|
+ internal_error (__FILE__, __LINE__, |
|
|
+ "monitor: failed to select architecture"); |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+/* Special write routine to send monitor commands on the serial line. |
|
|
+ The 68HC11/68HC12 have a 1 character SCI input queue. When a character |
|
|
+ is sent, it is echoed by the monitor. SCI read/write operations are |
|
|
+ made in polling mode. Due to the 1 character length, the polling |
|
|
+ and the echo, a character sent by Gdb can be lost. We pad the |
|
|
+ monitor command with a \0. If the \0 is lost we don't care and |
|
|
+ otherwise it is ignored by the monitor. */ |
|
|
+static int |
|
|
+m68hc11_serial_write (struct serial* scb, char* str, int len) |
|
|
+{ |
|
|
+ int result = 0; |
|
|
+ |
|
|
+ while (len) |
|
|
+ { |
|
|
+ result = serial_write (scb, str, 1); |
|
|
+ str++; |
|
|
+ len--; |
|
|
+ if (result) |
|
|
+ break; |
|
|
+ |
|
|
+ if (str[-1] == '\r' && len == 0) |
|
|
+ break; |
|
|
+ |
|
|
+ /* Pad with a \0. */ |
|
|
+ result = serial_write (scb, "", 1); |
|
|
+ if (result) |
|
|
+ break; |
|
|
+ } |
|
|
+ return result; |
|
|
+} |
|
|
+ |
|
|
+typedef struct console |
|
|
+{ |
|
|
+ int escaped; |
|
|
+ int escape_char; |
|
|
+ int pos; |
|
|
+ struct serial* target; |
|
|
+ char cmd[256]; |
|
|
+ int cmdlen; |
|
|
+ int interrupt; |
|
|
+} *console_t; |
|
|
+ |
|
|
+static struct console console_data; |
|
|
+ |
|
|
+static int |
|
|
+console_input (console_t cons, char c) |
|
|
+{ |
|
|
+ int result; |
|
|
+ |
|
|
+ if (cons->escaped) |
|
|
+ { |
|
|
+ if (c == '.') |
|
|
+ cons->interrupt = 1; |
|
|
+ |
|
|
+ cons->escaped = 0; |
|
|
+ return 0; |
|
|
+ } |
|
|
+ if (cons->pos == 0 && cons->escape_char == c) |
|
|
+ { |
|
|
+ cons->escaped = 1; |
|
|
+ return 0; |
|
|
+ } |
|
|
+ |
|
|
+ result = serial_write (cons->target, &c, 1); |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+static void |
|
|
+do_console_input (gdb_client_data d) |
|
|
+{ |
|
|
+ char c; |
|
|
+ int result; |
|
|
+ |
|
|
+ result = read (input_fd, &c, 1); |
|
|
+ if (result == 1) |
|
|
+ { |
|
|
+ console_input (&console_data, c); |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+m68hc11_wait_filter (char *buf, |
|
|
+ int bufmax, |
|
|
+ int *ext_resp_len, |
|
|
+ struct target_waitstatus *status) |
|
|
+{ |
|
|
+ char c; |
|
|
+ int result; |
|
|
+ extern struct serial* monitor_desc; |
|
|
+ int seen_zero = 0; |
|
|
+ int timeout; |
|
|
+ int i, cnt; |
|
|
+#ifndef __MINGW32__ |
|
|
+ struct pollfd fds[2]; |
|
|
+ |
|
|
+ fds[0].fd = input_fd; |
|
|
+ fds[0].events = POLLIN; |
|
|
+ fds[1].fd = deprecated_serial_fd (monitor_desc); |
|
|
+ fds[1].events = POLLIN; |
|
|
+ |
|
|
+ console_data.escaped = 0; |
|
|
+ console_data.escape_char = '~'; |
|
|
+ console_data.pos = 0; |
|
|
+ console_data.target = monitor_desc; |
|
|
+ console_data.interrupt = 0; |
|
|
+ cnt = 0; |
|
|
+ timeout = -1; |
|
|
+ while (1) |
|
|
+ { |
|
|
+ gdb_flush (gdb_stdout); |
|
|
+ result = poll (fds, 2, timeout); |
|
|
+ if (result > 0 && (fds[0].revents & POLLIN)) |
|
|
+ { |
|
|
+ do_console_input (0); |
|
|
+ } |
|
|
+ if (result > 0 && (fds[1].revents & POLLIN)) |
|
|
+ { |
|
|
+ while (1) |
|
|
+ { |
|
|
+ c = serial_readchar (monitor_desc, 0); |
|
|
+ if (c == SERIAL_TIMEOUT) |
|
|
+ break; |
|
|
+ |
|
|
+ /* For Buffalo monitor, a \0 is printed before the prompt |
|
|
+ and before the monitor output in general. */ |
|
|
+ if (seen_zero && c == '>') |
|
|
+ { |
|
|
+ *ext_resp_len = 0; |
|
|
+ return 0; |
|
|
+ } |
|
|
+ |
|
|
+ /* If we see a \0, keep track of the characters for some |
|
|
+ delay to have a chance to identify the monitor prompt. |
|
|
+ If the delay is too long, what we received is printed |
|
|
+ as a standard output produced by the program. */ |
|
|
+ if (c == 0) |
|
|
+ { |
|
|
+ seen_zero++; |
|
|
+ timeout = 1000; /* 250 ms timeout */ |
|
|
+ } |
|
|
+ else if (seen_zero && step_range_end == 0) |
|
|
+ { |
|
|
+ if (cnt < bufmax) |
|
|
+ buf[cnt++] = c; |
|
|
+ } |
|
|
+ /* Don't print when doing a single step. */ |
|
|
+ else if (step_range_end == 0) |
|
|
+ { |
|
|
+ putchar_unfiltered (c); |
|
|
+ } |
|
|
+ } |
|
|
+ } |
|
|
+ else if (result < 0) |
|
|
+ { |
|
|
+ for (i = 0; i < cnt; i++) |
|
|
+ putchar_unfiltered (buf[i]); |
|
|
+ |
|
|
+ cnt = 0; |
|
|
+ seen_zero = 0; |
|
|
+ timeout = -1; |
|
|
+ } |
|
|
+ } |
|
|
+#else |
|
|
+ int dt; |
|
|
+ |
|
|
+ console_data.escaped = 0; |
|
|
+ console_data.escape_char = '~'; |
|
|
+ console_data.pos = 0; |
|
|
+ console_data.target = monitor_desc; |
|
|
+ console_data.interrupt = 0; |
|
|
+ cnt = 0; |
|
|
+ dt = 0; |
|
|
+ timeout = -1; |
|
|
+ while (1) |
|
|
+ { |
|
|
+ gdb_flush (gdb_stdout); |
|
|
+ if (_rl_input_available ()) |
|
|
+ { |
|
|
+ do_console_input (0); |
|
|
+ } |
|
|
+ result = serial_readchar (monitor_desc, 10); |
|
|
+ if (result == SERIAL_TIMEOUT && (timeout < 0 || dt > 0)) |
|
|
+ { |
|
|
+ if (timeout > 0) |
|
|
+ dt--; |
|
|
+ continue; |
|
|
+ } |
|
|
+ |
|
|
+ if (result != SERIAL_TIMEOUT) |
|
|
+ { |
|
|
+ c = result; |
|
|
+ while (1) |
|
|
+ { |
|
|
+ /* For Buffalo monitor, a \0 is printed before the prompt |
|
|
+ and before the monitor output in general. */ |
|
|
+ if (seen_zero && c == '>') |
|
|
+ { |
|
|
+ *ext_resp_len = 0; |
|
|
+ return 0; |
|
|
+ } |
|
|
+ |
|
|
+ /* If we see a \0, keep track of the characters for some |
|
|
+ delay to have a chance to identify the monitor prompt. |
|
|
+ If the delay is too long, what we received is printed |
|
|
+ as a standard output produced by the program. */ |
|
|
+ if (c == 0) |
|
|
+ { |
|
|
+ seen_zero++; |
|
|
+ timeout = 1000; /* 250 ms timeout */ |
|
|
+ } |
|
|
+ else if (seen_zero && step_range_end == 0) |
|
|
+ { |
|
|
+ if (cnt < bufmax) |
|
|
+ buf[cnt++] = c; |
|
|
+ } |
|
|
+ /* Don't print when doing a single step. */ |
|
|
+ else if (step_range_end == 0) |
|
|
+ { |
|
|
+ putchar_unfiltered (c); |
|
|
+ } |
|
|
+ |
|
|
+ c = serial_readchar (monitor_desc, 0); |
|
|
+ if (c == SERIAL_TIMEOUT) |
|
|
+ break; |
|
|
+ } |
|
|
+ if (timeout > 0) |
|
|
+ dt = timeout / 10; |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ for (i = 0; i < cnt; i++) |
|
|
+ putchar_unfiltered (buf[i]); |
|
|
+ |
|
|
+ cnt = 0; |
|
|
+ seen_zero = 0; |
|
|
+ timeout = -1; |
|
|
+ } |
|
|
+ } |
|
|
+#endif |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+/* Buffalo 68HC11 monitor. */ |
|
|
+ |
|
|
+static void buffalo_open (char *args, int from_tty); |
|
|
+ |
|
|
+/* 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 an "S". */ |
|
|
+ |
|
|
+static char *buffalo_regnames[M68HC11_NUM_REGS] = |
|
|
+{ |
|
|
+ "X", NULL, "Y", "S", "P", "A", "B", "C" |
|
|
+}; |
|
|
+ |
|
|
+static struct target_ops buffalo_ops; |
|
|
+static struct monitor_ops buffalo_cmds; |
|
|
+ |
|
|
+/* Initialization strings to wakeup the monitor. |
|
|
+ Send both \r and \030 (^X) to abort a possible current command. */ |
|
|
+static char *buffalo_inits[] = { |
|
|
+ /* First command to invalidate a possible command ('~') and |
|
|
+ to acknowledge the monitor after a reset ('\r'). */ |
|
|
+ "~\r", |
|
|
+ |
|
|
+ /* Second command ^X to abort a possible current command |
|
|
+ such as 'asm' and 'rm'. */ |
|
|
+ "\030", |
|
|
+ NULL |
|
|
+}; |
|
|
+ |
|
|
+static int |
|
|
+m68hc11_dumpregs (void) |
|
|
+{ |
|
|
+ char buf[256]; |
|
|
+ int resp_len; |
|
|
+ char *p; |
|
|
+ char reg_d[5]; |
|
|
+ |
|
|
+ /* Send the dump register command to the monitor and |
|
|
+ get the reply. */ |
|
|
+ monitor_printf ("rd\r"); |
|
|
+ resp_len = monitor_expect ("\r", buf, sizeof (buf)); |
|
|
+ |
|
|
+ memset (reg_d, 0, sizeof (reg_d)); |
|
|
+ p = buf; |
|
|
+ while (p && (p[0] == '\r' || p[0] == '\n')) |
|
|
+ p++; |
|
|
+ |
|
|
+ while (p && p[0] != '\r' && p[0] != '\n' && p[1] == '-') |
|
|
+ { |
|
|
+ int reg; |
|
|
+ char *q; |
|
|
+ |
|
|
+ if (p[0] == 'P') |
|
|
+ reg = HARD_PC_REGNUM; |
|
|
+ else if (p[0] == 'Y') |
|
|
+ reg = HARD_Y_REGNUM; |
|
|
+ else if (p[0] == 'X') |
|
|
+ reg = HARD_X_REGNUM; |
|
|
+ else if (p[0] == 'S') |
|
|
+ reg = HARD_SP_REGNUM; |
|
|
+ else if (p[0] == 'C') |
|
|
+ reg = HARD_CCR_REGNUM; |
|
|
+ else if (p[0] == 'A') |
|
|
+ reg = HARD_A_REGNUM; |
|
|
+ else if (p[0] == 'B') |
|
|
+ reg = HARD_B_REGNUM; |
|
|
+ else |
|
|
+ break; |
|
|
+ |
|
|
+ q = &p[2]; |
|
|
+ p = strchr (q, ' '); |
|
|
+ if (p == 0) |
|
|
+ p = strchr (q, '\t'); |
|
|
+ if (p == 0) |
|
|
+ p = strchr (q, '\n'); |
|
|
+ if (p) |
|
|
+ *p++ = 0; |
|
|
+ |
|
|
+ if (reg == HARD_A_REGNUM) |
|
|
+ { |
|
|
+ reg_d[0] = q[0]; |
|
|
+ reg_d[1] = q[1]; |
|
|
+ } |
|
|
+ else if (reg == HARD_B_REGNUM) |
|
|
+ { |
|
|
+ reg_d[2] = q[0]; |
|
|
+ reg_d[3] = q[1]; |
|
|
+ } |
|
|
+ monitor_supply_register (reg, q); |
|
|
+ } |
|
|
+ |
|
|
+ /* If we got the value of both A and B, set the value of D. */ |
|
|
+ if (reg_d[0] && reg_d[2]) |
|
|
+ monitor_supply_register (HARD_D_REGNUM, reg_d); |
|
|
+ |
|
|
+ |
|
|
+ monitor_expect (" ", 0, 0); |
|
|
+ monitor_printf_noecho ("\r"); |
|
|
+ monitor_expect_prompt (0, 0); |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+static void |
|
|
+init_buffalo_cmds (void) |
|
|
+{ |
|
|
+ buffalo_cmds.dumpregs = m68hc11_dumpregs; |
|
|
+ buffalo_cmds.flags = MO_NO_ECHO_ON_OPEN | MO_GETMEM_16_BOUNDARY | |
|
|
+ MO_SETMEM_INTERACTIVE | MO_SETREG_INTERACTIVE | |
|
|
+ MO_CLR_BREAK_USES_ADDR | MO_GETMEM_NEEDS_RANGE | MO_FILL_USES_ADDR; |
|
|
+ buffalo_cmds.init = buffalo_inits; /* Init strings */ |
|
|
+ buffalo_cmds.cont = "p\r"; /* continue command */ |
|
|
+ buffalo_cmds.step = "t 1\r"; /* single step */ |
|
|
+ buffalo_cmds.stop = NULL; /* interrupt command */ |
|
|
+ buffalo_cmds.set_break = "br %x\r"; /* set a breakpoint */ |
|
|
+ buffalo_cmds.clr_break = "br -%x\r"; /* clear a breakpoint */ |
|
|
+ buffalo_cmds.clr_all_break = "br -\r"; /* clear all breakpoints */ |
|
|
+ buffalo_cmds.fill = "bf %x %x %x\r"; /* fill (start end val) */ |
|
|
+ buffalo_cmds.setmem.cmdb = "mm %x\r"; /* setmem.cmdb (addr, value) */ |
|
|
+ buffalo_cmds.setmem.cmdw = NULL; |
|
|
+ buffalo_cmds.setmem.cmdl = NULL; |
|
|
+ buffalo_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */ |
|
|
+ buffalo_cmds.setmem.resp_delim = "[\r\n]*[0-9a-fA-F]+ [0-9a-fA-F]+ "; |
|
|
+ buffalo_cmds.setmem.term = NULL; /* setmem.term */ |
|
|
+ buffalo_cmds.setmem.term_cmd = NULL; /* setmem.term_cmd */ |
|
|
+ buffalo_cmds.getmem.cmdb = "md %x %x\r"; /* getmem.cmdb (addr, addr2) */ |
|
|
+ buffalo_cmds.getmem.cmdw = NULL; |
|
|
+ buffalo_cmds.getmem.cmdl = NULL; |
|
|
+ buffalo_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, addr2) */ |
|
|
+ buffalo_cmds.getmem.resp_delim = " "; /* getmem.resp_delim */ |
|
|
+ buffalo_cmds.getmem.term = NULL; /* getmem.term */ |
|
|
+ buffalo_cmds.getmem.term_cmd = NULL; /* getmem.term_cmd */ |
|
|
+ buffalo_cmds.setreg.cmd = "rm %s\r"; /* setreg.cmd (name, value) */ |
|
|
+ buffalo_cmds.setreg.resp_delim = |
|
|
+ "\nP.*S\\-[0-9a-fA-F]+ [\r\n]+.[PXYABCS]\\-[0-9a-fA-F]+ "; |
|
|
+ buffalo_cmds.setreg.term = NULL; /* setreg.term */ |
|
|
+ buffalo_cmds.setreg.term_cmd = NULL; /* setreg.term_cmd */ |
|
|
+ buffalo_cmds.getreg.cmd = NULL; /* getreg.cmd (name) */ |
|
|
+ buffalo_cmds.getreg.resp_delim = NULL;/* getreg.resp_delim */ |
|
|
+ buffalo_cmds.getreg.term = NULL; /* getreg.term */ |
|
|
+ buffalo_cmds.getreg.term_cmd = NULL; /* getreg.term_cmd */ |
|
|
+ buffalo_cmds.dump_registers = NULL; /* dump_registers */ |
|
|
+ /* register_pattern */ |
|
|
+ buffalo_cmds.register_pattern = NULL; |
|
|
+ buffalo_cmds.supply_register = NULL; /* supply_register */ |
|
|
+ buffalo_cmds.load_routine = NULL; /* load_routine (defaults to SRECs) */ |
|
|
+ buffalo_cmds.load = "load t\r"; /* download command */ |
|
|
+ buffalo_cmds.loadresp = NULL; /* load response */ |
|
|
+ buffalo_cmds.prompt = ">"; /* monitor command prompt */ |
|
|
+ buffalo_cmds.line_term = "\r"; /* end-of-line terminator */ |
|
|
+ buffalo_cmds.cmd_end = NULL; /* optional command terminator */ |
|
|
+ buffalo_cmds.target = &buffalo_ops; /* target operations */ |
|
|
+ buffalo_cmds.stopbits = SERIAL_2_STOPBITS; /* number of stop bits */ |
|
|
+ buffalo_cmds.regnames = buffalo_regnames; /* registers names */ |
|
|
+ buffalo_cmds.magic = MONITOR_OPS_MAGIC; /* magic */ |
|
|
+ buffalo_cmds.serial_write = m68hc11_serial_write; |
|
|
+ buffalo_cmds.wait_filter = m68hc11_wait_filter; |
|
|
+} |
|
|
+ |
|
|
+static void |
|
|
+buffalo_open (char *args, int from_tty) |
|
|
+{ |
|
|
+ monitor_open (args, &buffalo_cmds, from_tty); |
|
|
+ set_gdbarch (bfd_arch_m68hc11, 0); |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+/* DBug 68HC12 monitor. */ |
|
|
+ |
|
|
+static void dbug_open (char *args, int from_tty); |
|
|
+ |
|
|
+/* 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 an "S". */ |
|
|
+ |
|
|
+static char *dbug_regnames[M68HC11_NUM_REGS] = |
|
|
+{ |
|
|
+ "X", "D", "Y", "SP", "PC", "A", "B", "CCR" |
|
|
+}; |
|
|
+ |
|
|
+static struct target_ops dbug_ops; |
|
|
+static struct monitor_ops dbug_cmds; |
|
|
+ |
|
|
+/* Initialization strings to wakeup the monitor. |
|
|
+ Send both \r and \030 (^X) to abort a possible current command. */ |
|
|
+static char *dbug_inits[] = |
|
|
+{ "\r\030", NULL}; |
|
|
+ |
|
|
+static int |
|
|
+dbug_dumpregs (void) |
|
|
+{ |
|
|
+ char buf[256]; |
|
|
+ int resp_len; |
|
|
+ char *p; |
|
|
+ int i; |
|
|
+ static int reg_list[] = { |
|
|
+ HARD_PC_REGNUM, |
|
|
+ HARD_SP_REGNUM, |
|
|
+ HARD_X_REGNUM, |
|
|
+ HARD_Y_REGNUM, |
|
|
+ HARD_D_REGNUM, |
|
|
+ -1 |
|
|
+ }; |
|
|
+ |
|
|
+ /* Send the dump register command to the monitor and |
|
|
+ get the reply. */ |
|
|
+ monitor_printf ("rd\r"); |
|
|
+ monitor_printf_noecho ("\r"); |
|
|
+ resp_len = monitor_expect_prompt (buf, sizeof (buf)); |
|
|
+ |
|
|
+ p = buf; |
|
|
+ while (p && strncmp (p, "CCR = SXHI NZVC", 15) != 0) |
|
|
+ p++; |
|
|
+ |
|
|
+ if (p == 0) |
|
|
+ { |
|
|
+ return -1; |
|
|
+ } |
|
|
+ |
|
|
+ /* Skip the CCR marker. */ |
|
|
+ while (p && p[0] != '\r' && p[0] != '\n') |
|
|
+ p++; |
|
|
+ |
|
|
+ /* Skip end of line markers. */ |
|
|
+ while (p && (p[0] == '\r' || p[0] == '\n')) |
|
|
+ p++; |
|
|
+ |
|
|
+ for (i = 0; p && reg_list[i] >= 0; i++) |
|
|
+ { |
|
|
+ char *q; |
|
|
+ |
|
|
+ q = strchr (p, ' '); |
|
|
+ if (q == 0) |
|
|
+ q = strchr (p, '\t'); |
|
|
+ |
|
|
+ if (q) |
|
|
+ *q++ = 0; |
|
|
+ |
|
|
+ /* Value for register D is split with ':' ex: 45:23. */ |
|
|
+ if (p[2] == ':') |
|
|
+ { |
|
|
+ p[2] = p[1]; |
|
|
+ p[1] = p[0]; |
|
|
+ p++; |
|
|
+ } |
|
|
+ monitor_supply_register (reg_list[i], p); |
|
|
+ p = q; |
|
|
+ while (p && p[0] == ' ') |
|
|
+ p++; |
|
|
+ } |
|
|
+ |
|
|
+ /* Last value is the CCR expressed in bits. */ |
|
|
+ if (p) |
|
|
+ { |
|
|
+ int bit, val; |
|
|
+ |
|
|
+ val = 0; |
|
|
+ for (bit = 7; p[0] && bit >= 0; ) |
|
|
+ { |
|
|
+ char c = *p++; |
|
|
+ |
|
|
+ if (c == ' ') |
|
|
+ continue; |
|
|
+ |
|
|
+ if (c == '1') |
|
|
+ val |= (1 << bit); |
|
|
+ bit--; |
|
|
+ } |
|
|
+ sprintf (buf, "%x", val); |
|
|
+ monitor_supply_register (HARD_CCR_REGNUM, buf); |
|
|
+ } |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+static int (* monitor_xfer_memory) (CORE_ADDR, gdb_byte*, int, int, |
|
|
+ struct mem_attrib *attrib, |
|
|
+ struct target_ops*); |
|
|
+ |
|
|
+static int |
|
|
+dbug_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, |
|
|
+ struct mem_attrib *attrib, |
|
|
+ struct target_ops *target) |
|
|
+{ |
|
|
+ unsigned char val; |
|
|
+ int written = 0; |
|
|
+ char buf[16]; |
|
|
+ int result; |
|
|
+ |
|
|
+ if (write == 0) |
|
|
+ return monitor_xfer_memory (memaddr, myaddr, len, write, attrib, target); |
|
|
+ |
|
|
+ if (len == 0) |
|
|
+ return 0; |
|
|
+ |
|
|
+ /* Enter the sub mode */ |
|
|
+ monitor_printf ("mm %x\r", (int) memaddr); |
|
|
+ |
|
|
+ /* Wait output (7 chars); If we get the prompt, that's too bad. */ |
|
|
+ result = monitor_expect (">", buf, 8); |
|
|
+ if (result > 0) |
|
|
+ return 0; |
|
|
+ |
|
|
+ while (len) |
|
|
+ { |
|
|
+ val = *myaddr; |
|
|
+ monitor_printf ("%x\r", val); |
|
|
+ |
|
|
+ result = monitor_expect (">", buf, 8); |
|
|
+ if (result > 0) |
|
|
+ return written; |
|
|
+ |
|
|
+ myaddr++; |
|
|
+ memaddr++; |
|
|
+ written++; |
|
|
+ /* If we wanted to, here we could validate the address */ |
|
|
+ len--; |
|
|
+ } |
|
|
+ /* Now exit the sub mode */ |
|
|
+ monitor_printf (".\r"); |
|
|
+ monitor_expect_prompt (NULL, 0); |
|
|
+ return written; |
|
|
+} |
|
|
+ |
|
|
+static void |
|
|
+init_dbug_cmds (void) |
|
|
+{ |
|
|
+ dbug_cmds.dumpregs = dbug_dumpregs; |
|
|
+ dbug_cmds.flags = MO_NO_ECHO_ON_OPEN | MO_GETMEM_16_BOUNDARY | |
|
|
+ MO_SETMEM_INTERACTIVE | |
|
|
+ MO_CLR_BREAK_USES_ADDR | MO_GETMEM_NEEDS_RANGE | MO_FILL_USES_ADDR; |
|
|
+ dbug_cmds.init = dbug_inits; /* Init strings */ |
|
|
+ dbug_cmds.cont = "g\r"; /* continue command */ |
|
|
+ dbug_cmds.step = "t 1\r"; /* single step */ |
|
|
+ dbug_cmds.stop = NULL; /* interrupt command */ |
|
|
+ dbug_cmds.set_break = "br %x\r"; /* set a breakpoint */ |
|
|
+ dbug_cmds.clr_break = "nobr %x\r"; /* clear a breakpoint */ |
|
|
+ dbug_cmds.clr_all_break = "nobr\r"; /* clear all breakpoints */ |
|
|
+ dbug_cmds.fill = "bf %x %x %x\r"; /* fill (start end val) */ |
|
|
+ dbug_cmds.setmem.cmdb = "mm %x\r"; /* setmem.cmdb (addr, value) */ |
|
|
+ dbug_cmds.setmem.cmdw = NULL; |
|
|
+ dbug_cmds.setmem.cmdl = NULL; |
|
|
+ dbug_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */ |
|
|
+ dbug_cmds.setmem.resp_delim = NULL; |
|
|
+ dbug_cmds.setmem.term = NULL; /* setmem.term */ |
|
|
+ dbug_cmds.setmem.term_cmd = ".\r"; /* setmem.term_cmd */ |
|
|
+ dbug_cmds.getmem.cmdb = "md %x %x\r"; /* getmem.cmdb (addr, addr2) */ |
|
|
+ dbug_cmds.getmem.cmdw = NULL; |
|
|
+ dbug_cmds.getmem.cmdl = NULL; |
|
|
+ dbug_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, addr2) */ |
|
|
+ dbug_cmds.getmem.resp_delim = " "; /* getmem.resp_delim */ |
|
|
+ dbug_cmds.getmem.term = NULL; /* getmem.term */ |
|
|
+ dbug_cmds.getmem.term_cmd = NULL; /* getmem.term_cmd */ |
|
|
+ dbug_cmds.setreg.cmd = "%s %x\r"; /* setreg.cmd (name, value) */ |
|
|
+ dbug_cmds.setreg.resp_delim = NULL; |
|
|
+ dbug_cmds.setreg.term = NULL; /* setreg.term */ |
|
|
+ dbug_cmds.setreg.term_cmd = NULL; /* setreg.term_cmd */ |
|
|
+ dbug_cmds.getreg.cmd = NULL; /* getreg.cmd (name) */ |
|
|
+ dbug_cmds.getreg.resp_delim = " "; /* getreg.resp_delim */ |
|
|
+ dbug_cmds.getreg.term = NULL; /* getreg.term */ |
|
|
+ dbug_cmds.getreg.term_cmd = NULL; /* getreg.term_cmd */ |
|
|
+ dbug_cmds.dump_registers = NULL;; /* dump_registers */ |
|
|
+ /* register_pattern */ |
|
|
+ dbug_cmds.register_pattern = NULL; |
|
|
+ dbug_cmds.supply_register = NULL; /* supply_register */ |
|
|
+ dbug_cmds.load_routine = NULL; /* load_routine (defaults to SRECs) */ |
|
|
+ dbug_cmds.load = "load\r"; /* download command */ |
|
|
+ dbug_cmds.loadresp = NULL; /* load response */ |
|
|
+ dbug_cmds.prompt = ">"; /* monitor command prompt */ |
|
|
+ dbug_cmds.line_term = "\r"; /* end-of-line terminator */ |
|
|
+ dbug_cmds.cmd_end = NULL; /* optional command terminator */ |
|
|
+ dbug_cmds.target = &dbug_ops; /* target operations */ |
|
|
+ dbug_cmds.stopbits = SERIAL_2_STOPBITS; /* number of stop bits */ |
|
|
+ dbug_cmds.regnames = dbug_regnames; /* registers names */ |
|
|
+ dbug_cmds.magic = MONITOR_OPS_MAGIC; /* magic */ |
|
|
+} |
|
|
+ |
|
|
+static void |
|
|
+dbug_open (char *args, int from_tty) |
|
|
+{ |
|
|
+ monitor_open (args, &dbug_cmds, from_tty); |
|
|
+ set_gdbarch (bfd_arch_m68hc12, 0); |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+/* Initialize all 68HC11/68HC12 monitors. */ |
|
|
+ |
|
|
+void |
|
|
+_initialize_m68hc11_rom (void) |
|
|
+{ |
|
|
+ /* 68HC11 Buffalo monitor. */ |
|
|
+ init_buffalo_cmds (); |
|
|
+ init_monitor_ops (&buffalo_ops); |
|
|
+ |
|
|
+ buffalo_ops.to_shortname = "buffalo"; |
|
|
+ buffalo_ops.to_longname = "Buffalo monitor"; |
|
|
+ buffalo_ops.to_doc = "Debug via the Buffalo 68HC11 monitor.\n\ |
|
|
+Specify the serial device it is connected to (e.g. /dev/ttya)."; |
|
|
+ buffalo_ops.to_open = buffalo_open; |
|
|
+ |
|
|
+ add_target (&buffalo_ops); |
|
|
+ |
|
|
+ /* 68HC12 DBug monitor. */ |
|
|
+ init_dbug_cmds (); |
|
|
+ init_monitor_ops (&dbug_ops); |
|
|
+ |
|
|
+ dbug_ops.to_shortname = "dbug"; |
|
|
+ dbug_ops.to_longname = "DBug monitor"; |
|
|
+ dbug_ops.to_doc = "Debug via the DBug 68HC12 monitor.\n\ |
|
|
+Specify the serial device it is connected to (e.g. /dev/ttya)."; |
|
|
+ dbug_ops.to_open = dbug_open; |
|
|
+ monitor_xfer_memory = dbug_ops.deprecated_xfer_memory; |
|
|
+ dbug_ops.deprecated_xfer_memory = dbug_xfer_memory; |
|
|
+ |
|
|
+ add_target (&dbug_ops); |
|
|
+} |
|
|
+ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/monitor.c gdb-6.4-m68hc1x/gdb/monitor.c |
|
|
--- gdb-6.4/gdb/monitor.c Fri Feb 18 19:58:56 2005 |
|
|
+++ gdb-6.4-m68hc1x/gdb/monitor.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -122,7 +122,7 @@ static CORE_ADDR *breakaddr; |
|
|
that monitor_open knows that we don't have a file open when the |
|
|
program starts. */ |
|
|
|
|
|
-static struct serial *monitor_desc = NULL; |
|
|
+struct serial *monitor_desc = NULL; |
|
|
|
|
|
/* Pointer to regexp pattern matching data */ |
|
|
|
|
|
@@ -138,6 +138,12 @@ static char setmem_resp_delim_fastmap[25 |
|
|
static struct re_pattern_buffer setreg_resp_delim_pattern; |
|
|
static char setreg_resp_delim_fastmap[256]; |
|
|
|
|
|
+static struct re_pattern_buffer setmem_resp_delim_pattern; |
|
|
+static char setmem_resp_delim_fastmap[256]; |
|
|
+ |
|
|
+static struct re_pattern_buffer setreg_resp_delim_pattern; |
|
|
+static char setreg_resp_delim_fastmap[256]; |
|
|
+ |
|
|
static int dump_reg_flag; /* Non-zero means do a dump_registers cmd when |
|
|
monitor_wait wakes up. */ |
|
|
|
|
|
@@ -2161,7 +2167,8 @@ monitor_load (char *file, int from_tty) |
|
|
load_srec (monitor_desc, file, (bfd_vma) load_offset, |
|
|
32, SREC_ALL, hashmark, |
|
|
current_monitor->flags & MO_SREC_ACK ? |
|
|
- monitor_wait_srec_ack : NULL); |
|
|
+ monitor_wait_srec_ack : NULL, |
|
|
+ current_monitor->serial_write); |
|
|
|
|
|
monitor_expect_prompt (NULL, 0); |
|
|
} |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/monitor.h gdb-6.4-m68hc1x/gdb/monitor.h |
|
|
--- gdb-6.4/gdb/monitor.h Tue Aug 5 04:44:50 2003 |
|
|
+++ gdb-6.4-m68hc1x/gdb/monitor.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -109,6 +109,7 @@ struct monitor_ops |
|
|
int bufmax, |
|
|
int *response_length, |
|
|
struct target_waitstatus * status); |
|
|
+ int (*serial_write) (struct serial*, char* buf, int buflen); |
|
|
char *load; /* load command */ |
|
|
char *loadresp; /* Response to load command */ |
|
|
char *prompt; /* monitor command prompt */ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/remote-bdm12.c gdb-6.4-m68hc1x/gdb/remote-bdm12.c |
|
|
--- gdb-6.4/gdb/remote-bdm12.c Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/remote-bdm12.c Sat Jan 21 17:09:25 2006 |
|
|
@@ -0,0 +1,718 @@ |
|
|
+/* remote debugging interface for Kevin Ross' BDM12 BDM pod for the 68HC12. |
|
|
+ Copyright 2001 |
|
|
+ Free Software Foundation, Inc. |
|
|
+ Contributed by Tim Housel (thousel@usa.net) |
|
|
+ |
|
|
+ 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 "inferior.h" |
|
|
+#include "value.h" |
|
|
+#include "gdb_string.h" |
|
|
+#include <ctype.h> |
|
|
+#include <fcntl.h> |
|
|
+#include <signal.h> |
|
|
+#include <setjmp.h> |
|
|
+#include <errno.h> |
|
|
+#include "terminal.h" |
|
|
+#include "target.h" |
|
|
+#include "gdbcore.h" |
|
|
+#include "gdb/callback.h" |
|
|
+#include "gdb/signals.h" |
|
|
+#include "bdm12.h" |
|
|
+#include "remote-utils.h" |
|
|
+#include "command.h" |
|
|
+#include "regcache.h" |
|
|
+ |
|
|
+/* Prototypes */ |
|
|
+ |
|
|
+extern void _initialize_remote_bdm12 (void); |
|
|
+ |
|
|
+static void dump_mem (char *buf, int len); |
|
|
+ |
|
|
+static void gdbbdm12_fetch_register (int regno); |
|
|
+ |
|
|
+static void gdbbdm12_store_register (int regno); |
|
|
+ |
|
|
+static void gdbbdm12_kill (void); |
|
|
+ |
|
|
+static void gdbbdm12_load (char *prog, int fromtty); |
|
|
+ |
|
|
+static void gdbbdm12_create_inferior (char *exec_file, char *args, char **env, int); |
|
|
+ |
|
|
+static void gdbbdm12_open (char *args, int from_tty); |
|
|
+ |
|
|
+static void gdbbdm12_close (int quitting); |
|
|
+ |
|
|
+static void gdbbdm12_detach (char *args, int from_tty); |
|
|
+ |
|
|
+static void gdbbdm12_resume (ptid_t pid, int step, enum target_signal siggnal); |
|
|
+ |
|
|
+static ptid_t gdbbdm12_wait (ptid_t pid, struct target_waitstatus *status); |
|
|
+ |
|
|
+static void gdbbdm12_prepare_to_store (void); |
|
|
+struct mem_attrib; |
|
|
+static int gdbbdm12_xfer_inferior_memory (CORE_ADDR memaddr, gdb_byte *myaddr, |
|
|
+ int len, int write, |
|
|
+ struct mem_attrib *attrib, |
|
|
+ struct target_ops *target); |
|
|
+ |
|
|
+static void gdbbdm12_files_info (struct target_ops *target); |
|
|
+ |
|
|
+static void gdbbdm12_mourn_inferior (void); |
|
|
+ |
|
|
+static void gdbbdm12_stop (void); |
|
|
+ |
|
|
+static int gdbbdm12_insert_breakpoint (CORE_ADDR addr, gdb_byte *contents_cache); |
|
|
+ |
|
|
+static int gdbbdm12_remove_breakpoint (CORE_ADDR addr, gdb_byte *contents_cache); |
|
|
+ |
|
|
+void pass_command (char *args, int from_tty); |
|
|
+ |
|
|
+/* Naming convention: |
|
|
+ |
|
|
+ bdm12_* are the interface to the BDM Hardware (see bdm12.h). |
|
|
+ gdbbdm12_* are stuff which is internal to gdb. */ |
|
|
+ |
|
|
+/* Forward data declarations */ |
|
|
+extern struct target_ops gdbbdm12_ops; |
|
|
+ |
|
|
+static int program_loaded = 0; |
|
|
+ |
|
|
+/* We must keep track of whether the BDM has been opened or not because |
|
|
+ GDB can call a target's close routine twice, but bdm12_close doesn't allow |
|
|
+ this. We also need to record the result of bdm12_open so we can pass it |
|
|
+ back to the other bdm12_foo routines. */ |
|
|
+static int gdbbdm12_opened = 0; |
|
|
+ |
|
|
+static int bdm12_stop_requested = 0; |
|
|
+ |
|
|
+static void |
|
|
+dump_mem (char *buf, int len) |
|
|
+{ |
|
|
+ if (len <= 8) |
|
|
+ { |
|
|
+ if (len == 8 || len == 4) |
|
|
+ { |
|
|
+ long l[2]; |
|
|
+ memcpy (l, buf, len); |
|
|
+ printf_filtered ("\t0x%lx", l[0]); |
|
|
+ if (len == 8) |
|
|
+ printf_filtered (" 0x%lx", l[1]); |
|
|
+ printf_filtered ("\n"); |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ int i; |
|
|
+ printf_filtered ("\t"); |
|
|
+ for (i = 0; i < len; i++) |
|
|
+ printf_filtered ("0x%x ", buf[i]); |
|
|
+ printf_filtered ("\n"); |
|
|
+ } |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_fetch_register (int regno) |
|
|
+{ |
|
|
+ static int warn_user = 1; |
|
|
+ if (regno == -1) |
|
|
+ { |
|
|
+ for (regno = 0; regno < NUM_REGS; regno++) |
|
|
+ gdbbdm12_fetch_register (regno); |
|
|
+ } |
|
|
+ else if (REGISTER_NAME (regno) != NULL |
|
|
+ && *REGISTER_NAME (regno) != '\0') |
|
|
+ { |
|
|
+ char buf[MAX_REGISTER_SIZE]; |
|
|
+ int nr_bytes; |
|
|
+ if (REGISTER_BDM12_REGNO (regno) >= 0) |
|
|
+ nr_bytes = bdm12_fetch_register (REGISTER_BDM12_REGNO (regno), |
|
|
+ buf, register_size (current_gdbarch, regno)); |
|
|
+ else |
|
|
+ nr_bytes = 0; |
|
|
+ if (nr_bytes == 0) |
|
|
+ /* register not applicable, supply zero's */ |
|
|
+ memset (buf, 0, MAX_REGISTER_SIZE); |
|
|
+ else if (nr_bytes > 0 && nr_bytes != register_size (current_gdbarch, regno) |
|
|
+ && warn_user) |
|
|
+ { |
|
|
+ fprintf_unfiltered (gdb_stderr, |
|
|
+ "Size of register %s (%d/%d) incorrect (%d instead of %d))", |
|
|
+ REGISTER_NAME (regno), |
|
|
+ regno, REGISTER_BDM12_REGNO (regno), |
|
|
+ nr_bytes, register_size (current_gdbarch, regno)); |
|
|
+ warn_user = 0; |
|
|
+ } |
|
|
+ regcache_raw_supply (current_regcache, regno, buf); |
|
|
+ if (sr_get_debug ()) |
|
|
+ { |
|
|
+ printf_filtered ("gdbbdm12_fetch_register: %d", regno); |
|
|
+ /* FIXME: We could print something more intelligible. */ |
|
|
+ dump_mem (buf, register_size (current_gdbarch, regno)); |
|
|
+ } |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_store_register (int regno) |
|
|
+{ |
|
|
+ if (regno == -1) |
|
|
+ { |
|
|
+ for (regno = 0; regno < NUM_REGS; regno++) |
|
|
+ gdbbdm12_store_register (regno); |
|
|
+ } |
|
|
+ else if (REGISTER_NAME (regno) != NULL |
|
|
+ && *REGISTER_NAME (regno) != '\0' |
|
|
+ && REGISTER_BDM12_REGNO (regno) >= 0) |
|
|
+ { |
|
|
+ char tmp[MAX_REGISTER_SIZE]; |
|
|
+ int nr_bytes; |
|
|
+ deprecated_read_register_gen (regno, tmp); |
|
|
+ nr_bytes = bdm12_store_register (REGISTER_BDM12_REGNO (regno), |
|
|
+ tmp, register_size (current_gdbarch, regno)); |
|
|
+ if (nr_bytes > 0 && nr_bytes != register_size (current_gdbarch, regno)) |
|
|
+ internal_error (__FILE__, __LINE__, |
|
|
+ "Register size different than expected"); |
|
|
+ if (sr_get_debug ()) |
|
|
+ { |
|
|
+ printf_filtered ("gdbbdm12_store_register: %d", regno); |
|
|
+ /* FIXME: We could print something more intelligible. */ |
|
|
+ dump_mem (tmp, register_size (current_gdbarch, regno)); |
|
|
+ } |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+/* Kill the running program. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_kill (void) |
|
|
+{ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_kill\n"); |
|
|
+ |
|
|
+ /* make sure everything is closed up okay (e.g. serial port) */ |
|
|
+ |
|
|
+ bdm12_close (1); |
|
|
+ inferior_ptid = null_ptid; |
|
|
+} |
|
|
+ |
|
|
+/* Load an executable file into the target process. This is expected to |
|
|
+ not only bring new code into the target process, but also to update |
|
|
+ GDB's symbol tables to match. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_load (char *prog, int fromtty) |
|
|
+{ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_load: prog \"%s\"\n", prog); |
|
|
+ |
|
|
+ inferior_ptid = null_ptid; |
|
|
+ |
|
|
+ /* FIXME: We will print two messages on error. |
|
|
+ Need error to either not print anything if passed NULL or need |
|
|
+ another routine that doesn't take any arguments. */ |
|
|
+ if (bdm12_load (prog, NULL, fromtty) == BDM12_RC_FAIL) |
|
|
+ error ("unable to load program"); |
|
|
+ |
|
|
+ /* FIXME: If a load command should reset the targets registers then |
|
|
+ a call to bdm12_create_inferior() should go here. */ |
|
|
+ |
|
|
+ program_loaded = 1; |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+/* Start an inferior process and set inferior_pid to its pid. |
|
|
+ EXEC_FILE is the file to run. |
|
|
+ ARGS is a string containing the arguments to the program. |
|
|
+ ENV is the environment vector to pass. Errors reported with error(). |
|
|
+ This is called not only when we first attach, but also when the |
|
|
+ user types "run" after having attached. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_create_inferior (char *exec_file, char *args, char **env, int from_tty) |
|
|
+{ |
|
|
+ int len; |
|
|
+ char *arg_buf, **argv; |
|
|
+ |
|
|
+ if (exec_file == 0 || exec_bfd == 0) |
|
|
+ warning ("No executable file specified."); |
|
|
+ if (!program_loaded) |
|
|
+ warning ("No program loaded."); |
|
|
+ if (!gdbbdm12_opened) |
|
|
+ error ("Not connected to the bdm12 interface"); |
|
|
+ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_create_inferior: exec_file \"%s\", args \"%s\"\n", |
|
|
+ (exec_file ? exec_file : "(NULL)"), |
|
|
+ args); |
|
|
+ |
|
|
+ remove_breakpoints (); |
|
|
+ init_wait_for_inferior (); |
|
|
+ |
|
|
+ if (exec_file != NULL) |
|
|
+ { |
|
|
+ len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10; |
|
|
+ arg_buf = (char *) alloca (len); |
|
|
+ arg_buf[0] = '\0'; |
|
|
+ strcat (arg_buf, exec_file); |
|
|
+ strcat (arg_buf, " "); |
|
|
+ strcat (arg_buf, args); |
|
|
+ argv = buildargv (arg_buf); |
|
|
+ make_cleanup_freeargv (argv); |
|
|
+ } |
|
|
+ else |
|
|
+ argv = NULL; |
|
|
+ bdm12_create_inferior (exec_bfd, argv, env); |
|
|
+ |
|
|
+ inferior_ptid = pid_to_ptid (42); |
|
|
+ insert_breakpoints (); |
|
|
+ |
|
|
+ clear_proceed_status (); |
|
|
+ |
|
|
+ /* NB: Entry point already set by bdm12_create_inferior. */ |
|
|
+ proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); |
|
|
+} |
|
|
+ |
|
|
+/* The open routine takes the rest of the parameters from the command, |
|
|
+ and (if successful) pushes a new target onto the stack. |
|
|
+ Called when selecting the bdm12 target. EG: (gdb) target bdm12 name. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_open (char *args, int from_tty) |
|
|
+{ |
|
|
+ int len; |
|
|
+ char **argv; |
|
|
+ BDM12_RC retval; |
|
|
+ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_open: args \"%s\"\n", args ? args : "(null)"); |
|
|
+ |
|
|
+ /* Remove current bdm12 if one exists. Only do this if the bdm12 interface |
|
|
+ has been opened because bdm12_close requires it. |
|
|
+ This is important because the call to push_target below will cause |
|
|
+ bdm12_close to be called if the bdm12 interface is already open, but |
|
|
+ push_target is called after bdm12_open! We can't move the call to |
|
|
+ push_target before the call to bdm12_open because bdm12_open may invoke |
|
|
+ 'error'. */ |
|
|
+ |
|
|
+ if (args == NULL) |
|
|
+ error("\n\ |
|
|
+Usage: target bdm12 <serial_device> <E-clock rate (1,2,4, or 8 MHz) \n\ |
|
|
+ <register base> <ram base> <eeprom base> <flash base> \n\ |
|
|
+(ex. target bdm12 com1 8 0x0 0x800 0xd00 0x8000 on Win32, \n\ |
|
|
+ or target bdm12 ttya 8 0x0 0x800 0xd00 0x8000 on UNIX)"); |
|
|
+ |
|
|
+ if (gdbbdm12_opened != 0) |
|
|
+ unpush_target (&gdbbdm12_ops); |
|
|
+ |
|
|
+ argv = buildargv (args); |
|
|
+ if (argv == NULL) |
|
|
+ error("Insufficient memory available to allocate arg list"); |
|
|
+ make_cleanup_freeargv (argv); |
|
|
+ |
|
|
+ retval = bdm12_open (argv); |
|
|
+ if (retval != BDM12_RC_OK) |
|
|
+ error ("unable to open bdm12 interface\n\ |
|
|
+Usage: target bdm12 <serial_device> <E-clock rate (1,2,4, or 8 MHz) \n\ |
|
|
+ <register base> <ram base> <eeprom base> <flash base> \n\ |
|
|
+(ex. target bdm12 com1 8 0x0 0x800 0xd00 0x8000 on Win32, \n\ |
|
|
+ or target bdm12 ttya 8 0x0 0x800 0xd00 0x8000 on UNIX)"); |
|
|
+ else |
|
|
+ gdbbdm12_opened = 1; |
|
|
+ |
|
|
+ push_target (&gdbbdm12_ops); |
|
|
+ target_fetch_registers (-1); |
|
|
+ printf_filtered ("Connected to the bdm12 interface.\n"); |
|
|
+} |
|
|
+ |
|
|
+/* Does whatever cleanup is required for a target that we are no longer |
|
|
+ going to be calling. Argument says whether we are quitting gdb and |
|
|
+ should not get hung in case of errors, or whether we want a clean |
|
|
+ termination even if it takes a while. This routine is automatically |
|
|
+ always called just before a routine is popped off the target stack. |
|
|
+ Closing file and freeing memory are typical things it should |
|
|
+ do. */ |
|
|
+/* Close out all files and local state before this target loses control. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_close (int quitting) |
|
|
+{ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_close: quitting %d\n", quitting); |
|
|
+ |
|
|
+ program_loaded = 0; |
|
|
+ |
|
|
+ if (gdbbdm12_opened != 0) |
|
|
+ { |
|
|
+ bdm12_close (quitting); |
|
|
+ gdbbdm12_opened = 0; |
|
|
+ } |
|
|
+ |
|
|
+ generic_mourn_inferior (); |
|
|
+} |
|
|
+ |
|
|
+/* Takes a program previously attached to and detaches it. |
|
|
+ The program may resume execution (some targets do, some don't) and will |
|
|
+ no longer stop on signals, etc. We better not have left any breakpoints |
|
|
+ in the program or it'll die when it hits one. ARGS is arguments |
|
|
+ typed by the user (e.g. a signal to send the process). FROM_TTY |
|
|
+ says whether to be verbose or not. */ |
|
|
+/* Terminate the open connection to the remote debugger. |
|
|
+ Use this when you want to detach and do something else with your gdb. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_detach (char *args, int from_tty) |
|
|
+{ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_detach: args \"%s\"\n", args); |
|
|
+ |
|
|
+ pop_target (); /* calls gdbbdm12_close to do the real work */ |
|
|
+ if (from_tty) |
|
|
+ printf_filtered ("Ending %s debugging\n", target_shortname); |
|
|
+} |
|
|
+ |
|
|
+/* Resume execution of the target process. STEP says whether to single-step |
|
|
+ or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given |
|
|
+ to the target, or zero for no signal. */ |
|
|
+ |
|
|
+static enum target_signal resume_siggnal; |
|
|
+static int resume_step; |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_resume (ptid_t pid, int step, enum target_signal siggnal) |
|
|
+{ |
|
|
+ if (PIDGET (inferior_ptid) != 42) |
|
|
+ error ("The program is not being run."); |
|
|
+ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_resume: step %d, signal %d\n", step, siggnal); |
|
|
+ |
|
|
+ resume_siggnal = siggnal; |
|
|
+ resume_step = step; |
|
|
+} |
|
|
+ |
|
|
+/* Notify the bdm12 interface of an asynchronous request to stop. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_stop (void) |
|
|
+{ |
|
|
+ bdm12_stop_requested = 0; |
|
|
+ if (!bdm12_stop ()) |
|
|
+ { |
|
|
+ quit (); |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_cntrl_c (int signo) |
|
|
+{ |
|
|
+ bdm12_stop_requested = 1; |
|
|
+} |
|
|
+ |
|
|
+/* Wait for inferior process to do something. Return pid of child, |
|
|
+ or -1 in case of error; store status through argument pointer STATUS, |
|
|
+ just as `wait' would. */ |
|
|
+ |
|
|
+static ptid_t |
|
|
+gdbbdm12_wait (ptid_t pid, struct target_waitstatus *status) |
|
|
+{ |
|
|
+ static RETSIGTYPE (*prev_sigint) (); |
|
|
+ int sigrc = 0; |
|
|
+ enum bdm12_stop reason; |
|
|
+ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_wait\n"); |
|
|
+ |
|
|
+#if defined (HAVE_SIGACTION) && defined (SA_RESTART) |
|
|
+ { |
|
|
+ struct sigaction sa, osa; |
|
|
+ sa.sa_handler = gdbbdm12_cntrl_c; |
|
|
+ sigemptyset (&sa.sa_mask); |
|
|
+ sa.sa_flags = 0; |
|
|
+ sigaction (SIGINT, &sa, &osa); |
|
|
+ prev_sigint = osa.sa_handler; |
|
|
+ } |
|
|
+#else |
|
|
+ prev_sigint = signal (SIGINT, gdbbdm12_cntrl_c); |
|
|
+#endif |
|
|
+ |
|
|
+ bdm12_resume (resume_step); |
|
|
+ |
|
|
+ do |
|
|
+ bdm12_stop_reason (&reason, &sigrc); |
|
|
+ while ((reason == BDM12_RUNNING) && !bdm12_stop_requested); |
|
|
+ |
|
|
+ if (bdm12_stop_requested) |
|
|
+ gdbbdm12_stop (); |
|
|
+ |
|
|
+ signal (SIGINT, prev_sigint); |
|
|
+ resume_step = 0; |
|
|
+ |
|
|
+ switch (reason) |
|
|
+ { |
|
|
+ case BDM12_EXITED: |
|
|
+ status->kind = TARGET_WAITKIND_EXITED; |
|
|
+ status->value.integer = sigrc; |
|
|
+ break; |
|
|
+ case BDM12_STOPPED: |
|
|
+ switch (sigrc) |
|
|
+ { |
|
|
+ case TARGET_SIGNAL_ABRT: |
|
|
+ quit (); |
|
|
+ break; |
|
|
+ case TARGET_SIGNAL_INT: |
|
|
+ case TARGET_SIGNAL_TRAP: |
|
|
+ default: |
|
|
+ status->kind = TARGET_WAITKIND_STOPPED; |
|
|
+ status->value.sig = sigrc; |
|
|
+ break; |
|
|
+ } |
|
|
+ break; |
|
|
+ case BDM12_SIGNALLED: |
|
|
+ status->kind = TARGET_WAITKIND_SIGNALLED; |
|
|
+ status->value.sig = sigrc; |
|
|
+ break; |
|
|
+ case BDM12_RUNNING: |
|
|
+ case BDM12_POLLING: |
|
|
+ /* FIXME: Is this correct? */ |
|
|
+ break; |
|
|
+ } |
|
|
+ |
|
|
+ return inferior_ptid; |
|
|
+} |
|
|
+ |
|
|
+/* Get ready to modify the registers array. On machines which store |
|
|
+ individual registers, this doesn't need to do anything. On machines |
|
|
+ which store all the registers in one fell swoop, this makes sure |
|
|
+ that registers contains all the registers from the program being |
|
|
+ debugged. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_prepare_to_store (void) |
|
|
+{ |
|
|
+ /* Do nothing, since we can store individual regs */ |
|
|
+} |
|
|
+ |
|
|
+/* Transfer LEN bytes between GDB address MYADDR and target address |
|
|
+ MEMADDR. If WRITE is non-zero, transfer them to the target, |
|
|
+ otherwise transfer them from the target. TARGET is unused. |
|
|
+ |
|
|
+ Returns the number of bytes transferred. */ |
|
|
+ |
|
|
+static int |
|
|
+gdbbdm12_xfer_inferior_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, |
|
|
+ int write, |
|
|
+ struct mem_attrib *attrib ATTRIBUTE_UNUSED, |
|
|
+ struct target_ops *target ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ if (sr_get_debug ()) |
|
|
+ { |
|
|
+ /* FIXME: Send to something other than STDOUT? */ |
|
|
+ printf_filtered ("gdbbdm12_xfer_inferior_memory: myaddr 0x"); |
|
|
+ gdb_print_host_address (myaddr, gdb_stdout); |
|
|
+ printf_filtered (", memaddr 0x%s, len %d, write %d\n", |
|
|
+ paddr_nz (memaddr), len, write); |
|
|
+ if (sr_get_debug () && write) |
|
|
+ dump_mem (myaddr, len); |
|
|
+ } |
|
|
+ |
|
|
+ if (write) |
|
|
+ { |
|
|
+ len = bdm12_write (memaddr, myaddr, len); |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ len = bdm12_read (memaddr, myaddr, len); |
|
|
+ if (sr_get_debug () && len > 0) |
|
|
+ dump_mem (myaddr, len); |
|
|
+ } |
|
|
+ return len; |
|
|
+} |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_files_info (struct target_ops *target) |
|
|
+{ |
|
|
+ char *file = "nothing"; |
|
|
+ |
|
|
+ if (exec_bfd) |
|
|
+ file = bfd_get_filename (exec_bfd); |
|
|
+ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_files_info: file \"%s\"\n", file); |
|
|
+ |
|
|
+ if (exec_bfd) |
|
|
+ { |
|
|
+ printf_filtered ("\tAttached to %s running program %s\n", |
|
|
+ target_shortname, file); |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+/* Clear the BDM interface's notion of what the breakpoints are. */ |
|
|
+ |
|
|
+static void |
|
|
+gdbbdm12_mourn_inferior (void) |
|
|
+{ |
|
|
+ if (sr_get_debug ()) |
|
|
+ printf_filtered ("gdbbdm12_mourn_inferior:\n"); |
|
|
+ |
|
|
+ remove_breakpoints (); |
|
|
+ generic_mourn_inferior (); |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+gdbbdm12_insert_breakpoint (CORE_ADDR addr, gdb_byte *contents_cache) |
|
|
+{ |
|
|
+ BDM12_RC retcode; |
|
|
+ |
|
|
+ retcode = bdm12_set_breakpoint (addr); |
|
|
+ |
|
|
+ switch (retcode) |
|
|
+ { |
|
|
+ case BDM12_RC_OK: |
|
|
+ return 0; |
|
|
+ case BDM12_RC_INSUFFICIENT_RESOURCES: |
|
|
+ return ENOMEM; |
|
|
+ default: |
|
|
+ return EIO; |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+gdbbdm12_remove_breakpoint (CORE_ADDR addr, gdb_byte *contents_cache) |
|
|
+{ |
|
|
+ BDM12_RC retcode; |
|
|
+ |
|
|
+ retcode = bdm12_clear_breakpoint (addr); |
|
|
+ |
|
|
+ switch (retcode) |
|
|
+ { |
|
|
+ case BDM12_RC_OK: |
|
|
+ case BDM12_RC_UNKNOWN_BREAKPOINT: |
|
|
+ return 0; |
|
|
+ case BDM12_RC_INSUFFICIENT_RESOURCES: |
|
|
+ return ENOMEM; |
|
|
+ default: |
|
|
+ return EIO; |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+/* Pass the command argument through to the bdm12 interface verbatim. The |
|
|
+ bdm12 must do any command interpretation work. */ |
|
|
+ |
|
|
+void |
|
|
+pass_command (char *args, int from_tty) |
|
|
+{ |
|
|
+ if (gdbbdm12_opened == 0) |
|
|
+ { |
|
|
+ /* Don't send commands if the interface isn't opened! */ |
|
|
+ error ("Not connected to the bdm12 interface"); |
|
|
+ } |
|
|
+ |
|
|
+#if 0 |
|
|
+ /* implement later */ |
|
|
+ bdm12_do_command (args); |
|
|
+#endif |
|
|
+ |
|
|
+ /* Invalidate the register cache, in case the command does |
|
|
+ something funny. */ |
|
|
+ registers_changed (); |
|
|
+} |
|
|
+ |
|
|
+/* Define the target subroutine names */ |
|
|
+ |
|
|
+struct target_ops gdbbdm12_ops; |
|
|
+ |
|
|
+static void |
|
|
+init_gdbbdm12_ops (void) |
|
|
+{ |
|
|
+ gdbbdm12_ops.to_shortname = "bdm12"; |
|
|
+ gdbbdm12_ops.to_longname = "Kevin Ross' BDM12 Pod for BDM on the 68HC12"; |
|
|
+ gdbbdm12_ops.to_doc = "Debug using Kevin Ross' BDM12 Pod\n\ |
|
|
+(http://www.nwlink.com/~kevinro/bdm.html) for the Motorola 68HC12 series of\n\ |
|
|
+microcontrollers. This processor features a single wire background debug mode\n\ |
|
|
+interface.\n\ |
|
|
+Usage: target bdm12 <serial_device> <E-clock rate (1,2,4, or 8 MHz) \n\ |
|
|
+ <register base> <ram base> <eeprom base> <flash base> \n\ |
|
|
+(ex. target bdm12 com1 8 0x0 0x800 0xd00 0x8000 on Win32, \n\ |
|
|
+ or target bdm12 ttya 8 0x0 0x800 0xd00 0x8000 on UNIX)"; |
|
|
+ gdbbdm12_ops.to_open = gdbbdm12_open; |
|
|
+ gdbbdm12_ops.to_close = gdbbdm12_close; |
|
|
+ gdbbdm12_ops.to_attach = NULL; |
|
|
+ gdbbdm12_ops.to_post_attach = NULL; |
|
|
+ gdbbdm12_ops.to_detach = gdbbdm12_detach; |
|
|
+ gdbbdm12_ops.to_resume = gdbbdm12_resume; |
|
|
+ gdbbdm12_ops.to_wait = gdbbdm12_wait; |
|
|
+ gdbbdm12_ops.to_fetch_registers = gdbbdm12_fetch_register; |
|
|
+ gdbbdm12_ops.to_store_registers = gdbbdm12_store_register; |
|
|
+ gdbbdm12_ops.to_prepare_to_store = gdbbdm12_prepare_to_store; |
|
|
+ gdbbdm12_ops.deprecated_xfer_memory = gdbbdm12_xfer_inferior_memory; |
|
|
+ gdbbdm12_ops.to_files_info = gdbbdm12_files_info; |
|
|
+ gdbbdm12_ops.to_insert_breakpoint = gdbbdm12_insert_breakpoint; |
|
|
+ gdbbdm12_ops.to_remove_breakpoint = gdbbdm12_remove_breakpoint; |
|
|
+ gdbbdm12_ops.to_terminal_init = NULL; |
|
|
+ gdbbdm12_ops.to_terminal_inferior = NULL; |
|
|
+ gdbbdm12_ops.to_terminal_ours_for_output = NULL; |
|
|
+ gdbbdm12_ops.to_terminal_ours = NULL; |
|
|
+ gdbbdm12_ops.to_terminal_info = NULL; |
|
|
+ gdbbdm12_ops.to_kill = gdbbdm12_kill; |
|
|
+ gdbbdm12_ops.to_load = gdbbdm12_load; |
|
|
+ gdbbdm12_ops.to_lookup_symbol = NULL; |
|
|
+ gdbbdm12_ops.to_create_inferior = gdbbdm12_create_inferior; |
|
|
+ gdbbdm12_ops.to_post_startup_inferior = NULL; |
|
|
+ gdbbdm12_ops.to_acknowledge_created_inferior = NULL; |
|
|
+ gdbbdm12_ops.to_insert_fork_catchpoint = NULL; |
|
|
+ gdbbdm12_ops.to_remove_fork_catchpoint = NULL; |
|
|
+ gdbbdm12_ops.to_insert_vfork_catchpoint = NULL; |
|
|
+ gdbbdm12_ops.to_remove_vfork_catchpoint = NULL; |
|
|
+ gdbbdm12_ops.to_insert_exec_catchpoint = NULL; |
|
|
+ gdbbdm12_ops.to_remove_exec_catchpoint = NULL; |
|
|
+ gdbbdm12_ops.to_reported_exec_events_per_exec_call = NULL; |
|
|
+ gdbbdm12_ops.to_has_exited = NULL; |
|
|
+ gdbbdm12_ops.to_mourn_inferior = gdbbdm12_mourn_inferior; |
|
|
+ gdbbdm12_ops.to_can_run = 0; |
|
|
+ gdbbdm12_ops.to_notice_signals = 0; |
|
|
+ gdbbdm12_ops.to_thread_alive = 0; |
|
|
+ gdbbdm12_ops.to_stop = gdbbdm12_stop; |
|
|
+ gdbbdm12_ops.to_pid_to_exec_file = NULL; |
|
|
+ gdbbdm12_ops.to_stratum = process_stratum; |
|
|
+ gdbbdm12_ops.to_has_all_memory = 1; |
|
|
+ gdbbdm12_ops.to_has_memory = 1; |
|
|
+ gdbbdm12_ops.to_has_stack = 1; |
|
|
+ gdbbdm12_ops.to_has_registers = 1; |
|
|
+ gdbbdm12_ops.to_has_execution = 1; |
|
|
+ gdbbdm12_ops.to_sections = NULL; |
|
|
+ gdbbdm12_ops.to_sections_end = NULL; |
|
|
+ gdbbdm12_ops.to_magic = OPS_MAGIC; |
|
|
+ |
|
|
+#ifdef TARGET_REDEFINE_DEFAULT_OPS |
|
|
+ TARGET_REDEFINE_DEFAULT_OPS (&gdbbdm12_ops); |
|
|
+#endif |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+void |
|
|
+_initialize_remote_bdm12 (void) |
|
|
+{ |
|
|
+ init_gdbbdm12_ops (); |
|
|
+ add_target (&gdbbdm12_ops); |
|
|
+ |
|
|
+ add_com ("bdm12 <command>", class_obscure, pass_command, |
|
|
+ "Send a command to the BDM interface directly."); |
|
|
+} |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/ser-dummy.c gdb-6.4-m68hc1x/gdb/ser-dummy.c |
|
|
--- gdb-6.4/gdb/ser-dummy.c Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/ser-dummy.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,153 @@ |
|
|
+/* Dummy (do-nothing) serial interface */ |
|
|
+ |
|
|
+/* |
|
|
+ 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 "serial.h" |
|
|
+ |
|
|
+static int |
|
|
+ser_dummy_open (struct serial *scb ATTRIBUTE_UNUSED, const char *name ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ scb->fd = -1; |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+void |
|
|
+ser_dummy_close (struct serial *scb ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+} |
|
|
+ |
|
|
+/* Wait for the output to drain away, as opposed to flushing (discarding) it */ |
|
|
+ |
|
|
+serial_ttystate |
|
|
+ser_dummy_get_tty_state (struct serial *scb ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ /* allocate a dummy */ |
|
|
+ return (serial_ttystate) xmalloc (8); |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_set_tty_state (struct serial *scb ATTRIBUTE_UNUSED, serial_ttystate ttystate ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+void |
|
|
+ser_dummy_go_raw (struct serial *scb ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return; /* Always in raw mode */ |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_readchar (struct serial *scb ATTRIBUTE_UNUSED, int timeout ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return SERIAL_EOF; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_noflush_set_tty_state (struct serial *scb ATTRIBUTE_UNUSED, |
|
|
+ serial_ttystate new_ttystate ATTRIBUTE_UNUSED, |
|
|
+ serial_ttystate old_ttystate ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+void |
|
|
+ser_dummy_print_tty_state (struct serial *scb ATTRIBUTE_UNUSED, |
|
|
+ serial_ttystate ttystate ATTRIBUTE_UNUSED, |
|
|
+ struct ui_file *stream ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ /* Nothing to print. */ |
|
|
+ return; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_setbaudrate (struct serial *scb ATTRIBUTE_UNUSED, int rate ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; /* Never fails! */ |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_setstopbits (struct serial *scb ATTRIBUTE_UNUSED, int num ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; /* Never fails! */ |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_write (struct serial *scb ATTRIBUTE_UNUSED, const char *str ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_flush_output (struct serial *scb ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_flush_input (struct serial *scb ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_dummy_send_break (struct serial *scb ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+static int |
|
|
+ser_dummy_drain_output (struct serial *scb ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+/* Put the SERIAL device into/out-of ASYNC mode. */ |
|
|
+ |
|
|
+void |
|
|
+ser_dummy_async (struct serial *scb ATTRIBUTE_UNUSED, |
|
|
+ int async_p ATTRIBUTE_UNUSED) |
|
|
+{ |
|
|
+} |
|
|
+ |
|
|
+void |
|
|
+_initialize_dummy_ser_hardwire (void) |
|
|
+{ |
|
|
+ struct serial_ops *ops = (struct serial_ops *) xmalloc (sizeof (struct serial_ops)); |
|
|
+ memset (ops, sizeof (struct serial_ops), 0); |
|
|
+ ops->name = "hardwire"; |
|
|
+ ops->next = 0; |
|
|
+ ops->open = ser_dummy_open; |
|
|
+ ops->close = ser_dummy_close; |
|
|
+ ops->readchar = ser_dummy_readchar; |
|
|
+ ops->write = ser_dummy_write; |
|
|
+ ops->flush_output = ser_dummy_flush_output; |
|
|
+ ops->flush_input = ser_dummy_flush_input; |
|
|
+ ops->send_break = ser_dummy_send_break; |
|
|
+ ops->go_raw = ser_dummy_go_raw; |
|
|
+ ops->get_tty_state = ser_dummy_get_tty_state; |
|
|
+ ops->set_tty_state = ser_dummy_set_tty_state; |
|
|
+ ops->print_tty_state = ser_dummy_print_tty_state; |
|
|
+ ops->noflush_set_tty_state = ser_dummy_noflush_set_tty_state; |
|
|
+ ops->setbaudrate = ser_dummy_setbaudrate; |
|
|
+ ops->setstopbits = ser_dummy_setstopbits; |
|
|
+ ops->drain_output = ser_dummy_drain_output; |
|
|
+ ops->async = ser_dummy_async; |
|
|
+ serial_add_interface (ops); |
|
|
+} |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/ser-mingw.c gdb-6.4-m68hc1x/gdb/ser-mingw.c |
|
|
--- gdb-6.4/gdb/ser-mingw.c Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/ser-mingw.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,533 @@ |
|
|
+/* Serial interface for TCP connections on MingW Windows systems |
|
|
+ Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 |
|
|
+ Free Software Foundation, Inc. |
|
|
+ |
|
|
+ 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 "serial.h" |
|
|
+#include "ser-mingw.h" |
|
|
+ |
|
|
+#include <fcntl.h> |
|
|
+#include <sys/time.h> |
|
|
+#include <sys/timeb.h> |
|
|
+ |
|
|
+#include <winsock2.h> |
|
|
+ |
|
|
+#include "gdb_string.h" |
|
|
+#include "event-loop.h" |
|
|
+ |
|
|
+void |
|
|
+gettimeofday(struct timeval* tv, struct timezone* tz) |
|
|
+{ |
|
|
+ struct timeb tb; |
|
|
+ |
|
|
+ ftime(&tb); |
|
|
+ tv->tv_sec = (unsigned long) tb.time; |
|
|
+ tv->tv_usec = ((unsigned long) tb.millitm) * 1000L; |
|
|
+} |
|
|
+ |
|
|
+static int do_mingw_readchar (struct serial *scb, int timeout); |
|
|
+static timer_handler_func push_event; |
|
|
+static handler_func fd_event; |
|
|
+static void reschedule (struct serial *scb); |
|
|
+ |
|
|
+extern int (*deprecated_ui_loop_hook) (int); |
|
|
+ |
|
|
+/* Generic operations used by all UNIX/FD based serial interfaces. */ |
|
|
+ |
|
|
+serial_ttystate |
|
|
+ser_mingw_nop_get_tty_state (struct serial *scb) |
|
|
+{ |
|
|
+ /* allocate a dummy */ |
|
|
+ return (serial_ttystate) XMALLOC (int); |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_nop_set_tty_state (struct serial *scb, serial_ttystate ttystate) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+void |
|
|
+ser_mingw_nop_raw (struct serial *scb) |
|
|
+{ |
|
|
+ return; /* Always in raw mode */ |
|
|
+} |
|
|
+ |
|
|
+/* Wait for input on scb, with timeout seconds. Returns 0 on success, |
|
|
+ otherwise SERIAL_TIMEOUT or SERIAL_ERROR. */ |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_wait_for (struct serial *scb, int timeout) |
|
|
+{ |
|
|
+ while (1) |
|
|
+ { |
|
|
+ int numfds; |
|
|
+ struct timeval tv; |
|
|
+ fd_set readfds, exceptfds; |
|
|
+ |
|
|
+ /* NOTE: Some OS's can scramble the READFDS when the select() |
|
|
+ call fails (ex the kernel with Red Hat 5.2). Initialize all |
|
|
+ arguments before each call. */ |
|
|
+ |
|
|
+ tv.tv_sec = timeout; |
|
|
+ tv.tv_usec = 0; |
|
|
+ |
|
|
+ FD_ZERO (&readfds); |
|
|
+ FD_ZERO (&exceptfds); |
|
|
+ FD_SET (scb->fd, &readfds); |
|
|
+ FD_SET (scb->fd, &exceptfds); |
|
|
+ |
|
|
+ if (timeout >= 0) |
|
|
+ numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, &tv); |
|
|
+ else |
|
|
+ numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, 0); |
|
|
+ |
|
|
+ if (numfds <= 0) |
|
|
+ { |
|
|
+ if (numfds == 0) |
|
|
+ return SERIAL_TIMEOUT; |
|
|
+ else if (errno == EINTR) |
|
|
+ continue; |
|
|
+ else |
|
|
+ return SERIAL_ERROR; /* Got an error from select or poll */ |
|
|
+ } |
|
|
+ |
|
|
+ return 0; |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+/* Read a character with user-specified timeout. TIMEOUT is number of seconds |
|
|
+ to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns |
|
|
+ char if successful. Returns -2 if timeout expired, EOF if line dropped |
|
|
+ dead, or -3 for any other error (see errno in that case). */ |
|
|
+ |
|
|
+static int |
|
|
+do_mingw_readchar (struct serial *scb, int timeout) |
|
|
+{ |
|
|
+ int status; |
|
|
+ int delta; |
|
|
+ |
|
|
+ /* We have to be able to keep the GUI alive here, so we break the original |
|
|
+ timeout into steps of 1 second, running the "keep the GUI alive" hook |
|
|
+ each time through the loop. |
|
|
+ |
|
|
+ Also, timeout = 0 means to poll, so we just set the delta to 0, so we |
|
|
+ will only go through the loop once. */ |
|
|
+ |
|
|
+ delta = (timeout == 0 ? 0 : 1); |
|
|
+ while (1) |
|
|
+ { |
|
|
+ |
|
|
+ /* N.B. The UI may destroy our world (for instance by calling |
|
|
+ remote_stop,) in which case we want to get out of here as |
|
|
+ quickly as possible. It is not safe to touch scb, since |
|
|
+ someone else might have freed it. The ui_loop_hook signals that |
|
|
+ we should exit by returning 1. */ |
|
|
+ |
|
|
+ if (deprecated_ui_loop_hook) |
|
|
+ { |
|
|
+ if (deprecated_ui_loop_hook (0)) |
|
|
+ return SERIAL_TIMEOUT; |
|
|
+ } |
|
|
+ |
|
|
+ status = ser_mingw_wait_for (scb, delta); |
|
|
+ if (timeout > 0) |
|
|
+ timeout -= delta; |
|
|
+ |
|
|
+ /* If we got a character or an error back from wait_for, then we can |
|
|
+ break from the loop before the timeout is completed. */ |
|
|
+ |
|
|
+ if (status != SERIAL_TIMEOUT) |
|
|
+ { |
|
|
+ break; |
|
|
+ } |
|
|
+ |
|
|
+ /* If we have exhausted the original timeout, then generate |
|
|
+ a SERIAL_TIMEOUT, and pass it out of the loop. */ |
|
|
+ |
|
|
+ else if (timeout == 0) |
|
|
+ { |
|
|
+ status = SERIAL_TIMEOUT; |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+ |
|
|
+ if (status < 0) |
|
|
+ return status; |
|
|
+ |
|
|
+ while (1) |
|
|
+ { |
|
|
+ status = recv (scb->fd, scb->buf, BUFSIZ, 0); |
|
|
+ if (status != -1 || errno != EINTR) |
|
|
+ break; |
|
|
+ } |
|
|
+ |
|
|
+ if (status <= 0) |
|
|
+ { |
|
|
+ if (status == 0) |
|
|
+ return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to |
|
|
+ distinguish between EOF & timeouts |
|
|
+ someday] */ |
|
|
+ else |
|
|
+ return SERIAL_ERROR; /* Got an error from read */ |
|
|
+ } |
|
|
+ |
|
|
+ scb->bufcnt = status; |
|
|
+ scb->bufcnt--; |
|
|
+ scb->bufp = scb->buf; |
|
|
+ return *scb->bufp++; |
|
|
+} |
|
|
+ |
|
|
+/* Perform operations common to both old and new readchar. */ |
|
|
+ |
|
|
+/* Return the next character from the input FIFO. If the FIFO is |
|
|
+ empty, call the SERIAL specific routine to try and read in more |
|
|
+ characters. |
|
|
+ |
|
|
+ Initially data from the input FIFO is returned (fd_event() |
|
|
+ pre-reads the input into that FIFO. Once that has been emptied, |
|
|
+ further data is obtained by polling the input FD using the device |
|
|
+ specific readchar() function. Note: reschedule() is called after |
|
|
+ every read. This is because there is no guarentee that the lower |
|
|
+ level fd_event() poll_event() code (which also calls reschedule()) |
|
|
+ will be called. */ |
|
|
+ |
|
|
+static int |
|
|
+generic_readchar (struct serial *scb, int timeout, |
|
|
+ int (do_readchar) (struct serial *scb, int timeout)) |
|
|
+{ |
|
|
+ int ch; |
|
|
+ if (scb->bufcnt > 0) |
|
|
+ { |
|
|
+ ch = *scb->bufp; |
|
|
+ scb->bufcnt--; |
|
|
+ scb->bufp++; |
|
|
+ } |
|
|
+ else if (scb->bufcnt < 0) |
|
|
+ { |
|
|
+ /* Some errors/eof are are sticky. */ |
|
|
+ ch = scb->bufcnt; |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ ch = do_readchar (scb, timeout); |
|
|
+ if (ch < 0) |
|
|
+ { |
|
|
+ switch ((enum serial_rc) ch) |
|
|
+ { |
|
|
+ case SERIAL_EOF: |
|
|
+ case SERIAL_ERROR: |
|
|
+ /* Make the error/eof stick. */ |
|
|
+ scb->bufcnt = ch; |
|
|
+ break; |
|
|
+ case SERIAL_TIMEOUT: |
|
|
+ scb->bufcnt = 0; |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+ } |
|
|
+ reschedule (scb); |
|
|
+ return ch; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_readchar (struct serial *scb, int timeout) |
|
|
+{ |
|
|
+ return generic_readchar (scb, timeout, do_mingw_readchar); |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_nop_noflush_set_tty_state (struct serial *scb, |
|
|
+ serial_ttystate new_ttystate, |
|
|
+ serial_ttystate old_ttystate) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+void |
|
|
+ser_mingw_nop_print_tty_state (struct serial *scb, |
|
|
+ serial_ttystate ttystate, |
|
|
+ struct ui_file *stream) |
|
|
+{ |
|
|
+ /* Nothing to print. */ |
|
|
+ return; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_nop_setbaudrate (struct serial *scb, int rate) |
|
|
+{ |
|
|
+ return 0; /* Never fails! */ |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_nop_setstopbits (struct serial *scb, int num) |
|
|
+{ |
|
|
+ return 0; /* Never fails! */ |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_write (struct serial *scb, const char *str, int len) |
|
|
+{ |
|
|
+ int cc; |
|
|
+ |
|
|
+ while (len > 0) |
|
|
+ { |
|
|
+ cc = send (scb->fd, str, len, 0); |
|
|
+ |
|
|
+ if (cc < 0) |
|
|
+ return 1; |
|
|
+ len -= cc; |
|
|
+ str += cc; |
|
|
+ } |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_nop_flush_output (struct serial *scb) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_flush_input (struct serial *scb) |
|
|
+{ |
|
|
+ if (scb->bufcnt >= 0) |
|
|
+ { |
|
|
+ scb->bufcnt = 0; |
|
|
+ scb->bufp = scb->buf; |
|
|
+ return 0; |
|
|
+ } |
|
|
+ else |
|
|
+ return SERIAL_ERROR; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_nop_send_break (struct serial *scb) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+int |
|
|
+ser_mingw_nop_drain_output (struct serial *scb) |
|
|
+{ |
|
|
+ return 0; |
|
|
+} |
|
|
+ |
|
|
+ |
|
|
+ |
|
|
+/* Event handling for ASYNC serial code. |
|
|
+ |
|
|
+ At any time the SERIAL device either: has an empty FIFO and is |
|
|
+ waiting on a FD event; or has a non-empty FIFO/error condition and |
|
|
+ is constantly scheduling timer events. |
|
|
+ |
|
|
+ ASYNC only stops pestering its client when it is de-async'ed or it |
|
|
+ is told to go away. */ |
|
|
+ |
|
|
+/* Value of scb->async_state: */ |
|
|
+enum { |
|
|
+ /* >= 0 (TIMER_SCHEDULED) */ |
|
|
+ /* The ID of the currently scheduled timer event. This state is |
|
|
+ rarely encountered. Timer events are one-off so as soon as the |
|
|
+ event is delivered the state is shanged to NOTHING_SCHEDULED. */ |
|
|
+ FD_SCHEDULED = -1, |
|
|
+ /* The fd_event() handler is scheduled. It is called when ever the |
|
|
+ file descriptor becomes ready. */ |
|
|
+ NOTHING_SCHEDULED = -2 |
|
|
+ /* Either no task is scheduled (just going into ASYNC mode) or a |
|
|
+ timer event has just gone off and the current state has been |
|
|
+ forced into nothing scheduled. */ |
|
|
+}; |
|
|
+ |
|
|
+/* Identify and schedule the next ASYNC task based on scb->async_state |
|
|
+ and scb->buf* (the input FIFO). A state machine is used to avoid |
|
|
+ the need to make redundant calls into the event-loop - the next |
|
|
+ scheduled task is only changed when needed. */ |
|
|
+ |
|
|
+static void |
|
|
+reschedule (struct serial *scb) |
|
|
+{ |
|
|
+ if (serial_is_async_p (scb)) |
|
|
+ { |
|
|
+ int next_state; |
|
|
+ switch (scb->async_state) |
|
|
+ { |
|
|
+ case FD_SCHEDULED: |
|
|
+ if (scb->bufcnt == 0) |
|
|
+ next_state = FD_SCHEDULED; |
|
|
+ else |
|
|
+ { |
|
|
+ delete_file_handler (scb->fd); |
|
|
+ next_state = create_timer (0, push_event, scb); |
|
|
+ } |
|
|
+ break; |
|
|
+ case NOTHING_SCHEDULED: |
|
|
+ if (scb->bufcnt == 0) |
|
|
+ { |
|
|
+ add_file_handler (scb->fd, fd_event, scb); |
|
|
+ next_state = FD_SCHEDULED; |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ next_state = create_timer (0, push_event, scb); |
|
|
+ } |
|
|
+ break; |
|
|
+ default: /* TIMER SCHEDULED */ |
|
|
+ if (scb->bufcnt == 0) |
|
|
+ { |
|
|
+ delete_timer (scb->async_state); |
|
|
+ add_file_handler (scb->fd, fd_event, scb); |
|
|
+ next_state = FD_SCHEDULED; |
|
|
+ } |
|
|
+ else |
|
|
+ next_state = scb->async_state; |
|
|
+ break; |
|
|
+ } |
|
|
+ if (serial_debug_p (scb)) |
|
|
+ { |
|
|
+ switch (next_state) |
|
|
+ { |
|
|
+ case FD_SCHEDULED: |
|
|
+ if (scb->async_state != FD_SCHEDULED) |
|
|
+ fprintf_unfiltered (gdb_stdlog, "[fd%d->fd-scheduled]\n", |
|
|
+ scb->fd); |
|
|
+ break; |
|
|
+ default: /* TIMER SCHEDULED */ |
|
|
+ if (scb->async_state == FD_SCHEDULED) |
|
|
+ fprintf_unfiltered (gdb_stdlog, "[fd%d->timer-scheduled]\n", |
|
|
+ scb->fd); |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+ scb->async_state = next_state; |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+/* FD_EVENT: This is scheduled when the input FIFO is empty (and there |
|
|
+ is no pending error). As soon as data arrives, it is read into the |
|
|
+ input FIFO and the client notified. The client should then drain |
|
|
+ the FIFO using readchar(). If the FIFO isn't immediatly emptied, |
|
|
+ push_event() is used to nag the client until it is. */ |
|
|
+ |
|
|
+static void |
|
|
+fd_event (int error, void *context) |
|
|
+{ |
|
|
+ struct serial *scb = context; |
|
|
+ if (error != 0) |
|
|
+ { |
|
|
+ scb->bufcnt = SERIAL_ERROR; |
|
|
+ } |
|
|
+ else if (scb->bufcnt == 0) |
|
|
+ { |
|
|
+ /* Prime the input FIFO. The readchar() function is used to |
|
|
+ pull characters out of the buffer. See also |
|
|
+ generic_readchar(). */ |
|
|
+ int nr; |
|
|
+ do |
|
|
+ { |
|
|
+ nr = read (scb->fd, scb->buf, BUFSIZ); |
|
|
+ } |
|
|
+ while (nr == -1 && errno == EINTR); |
|
|
+ if (nr == 0) |
|
|
+ { |
|
|
+ scb->bufcnt = SERIAL_EOF; |
|
|
+ } |
|
|
+ else if (nr > 0) |
|
|
+ { |
|
|
+ scb->bufcnt = nr; |
|
|
+ scb->bufp = scb->buf; |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ scb->bufcnt = SERIAL_ERROR; |
|
|
+ } |
|
|
+ } |
|
|
+ scb->async_handler (scb, scb->async_context); |
|
|
+ reschedule (scb); |
|
|
+} |
|
|
+ |
|
|
+/* PUSH_EVENT: The input FIFO is non-empty (or there is a pending |
|
|
+ error). Nag the client until all the data has been read. In the |
|
|
+ case of errors, the client will need to close or de-async the |
|
|
+ device before naging stops. */ |
|
|
+ |
|
|
+static void |
|
|
+push_event (void *context) |
|
|
+{ |
|
|
+ struct serial *scb = context; |
|
|
+ scb->async_state = NOTHING_SCHEDULED; /* Timers are one-off */ |
|
|
+ scb->async_handler (scb, scb->async_context); |
|
|
+ /* re-schedule */ |
|
|
+ reschedule (scb); |
|
|
+} |
|
|
+ |
|
|
+/* Put the SERIAL device into/out-of ASYNC mode. */ |
|
|
+ |
|
|
+void |
|
|
+ser_mingw_async (struct serial *scb, |
|
|
+ int async_p) |
|
|
+{ |
|
|
+ if (async_p) |
|
|
+ { |
|
|
+ /* Force a re-schedule. */ |
|
|
+ scb->async_state = NOTHING_SCHEDULED; |
|
|
+ if (serial_debug_p (scb)) |
|
|
+ fprintf_unfiltered (gdb_stdlog, "[fd%d->asynchronous]\n", |
|
|
+ scb->fd); |
|
|
+ reschedule (scb); |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ if (serial_debug_p (scb)) |
|
|
+ fprintf_unfiltered (gdb_stdlog, "[fd%d->synchronous]\n", |
|
|
+ scb->fd); |
|
|
+ /* De-schedule whatever tasks are currently scheduled. */ |
|
|
+ switch (scb->async_state) |
|
|
+ { |
|
|
+ case FD_SCHEDULED: |
|
|
+ delete_file_handler (scb->fd); |
|
|
+ break; |
|
|
+ NOTHING_SCHEDULED: |
|
|
+ break; |
|
|
+ default: /* TIMER SCHEDULED */ |
|
|
+ delete_timer (scb->async_state); |
|
|
+ break; |
|
|
+ } |
|
|
+ } |
|
|
+} |
|
|
+ |
|
|
+void |
|
|
+ser_platform_tcp_init (struct serial_ops *ops) |
|
|
+{ |
|
|
+ ops->readchar = ser_mingw_readchar; |
|
|
+ ops->write = ser_mingw_write; |
|
|
+ ops->flush_output = ser_mingw_nop_flush_output; |
|
|
+ ops->flush_input = ser_mingw_flush_input; |
|
|
+ ops->send_break = ser_mingw_nop_send_break; |
|
|
+ ops->go_raw = ser_mingw_nop_raw; |
|
|
+ ops->get_tty_state = ser_mingw_nop_get_tty_state; |
|
|
+ ops->set_tty_state = ser_mingw_nop_set_tty_state; |
|
|
+ ops->print_tty_state = ser_mingw_nop_print_tty_state; |
|
|
+ ops->noflush_set_tty_state = ser_mingw_nop_noflush_set_tty_state; |
|
|
+ ops->setbaudrate = ser_mingw_nop_setbaudrate; |
|
|
+ ops->setstopbits = ser_mingw_nop_setstopbits; |
|
|
+ ops->drain_output = ser_mingw_nop_drain_output; |
|
|
+ ops->async = ser_mingw_async; |
|
|
+} |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/ser-mingw.h gdb-6.4-m68hc1x/gdb/ser-mingw.h |
|
|
--- gdb-6.4/gdb/ser-mingw.h Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/ser-mingw.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,51 @@ |
|
|
+/* Serial interface for MinGW Winsock file-descriptor based connection. |
|
|
+ |
|
|
+ Copyright 1999, 2000, 2002 Free Software Foundation, Inc. |
|
|
+ |
|
|
+ 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. */ |
|
|
+ |
|
|
+#ifndef SER_MINGW_H |
|
|
+#define SER_MINGW_H |
|
|
+ |
|
|
+/* Generic MinGW Winsock functions */ |
|
|
+ |
|
|
+extern int ser_mingw_nop_flush_output (struct serial *scb); |
|
|
+extern int ser_mingw_flush_input (struct serial *scb); |
|
|
+extern int ser_mingw_nop_send_break (struct serial *scb); |
|
|
+extern void ser_mingw_nop_raw (struct serial *scb); |
|
|
+extern serial_ttystate ser_mingw_nop_get_tty_state (struct serial *scb); |
|
|
+extern int ser_mingw_nop_set_tty_state (struct serial *scb, |
|
|
+ serial_ttystate ttystate); |
|
|
+extern void ser_mingw_nop_print_tty_state (struct serial *scb, |
|
|
+ serial_ttystate ttystate, |
|
|
+ struct ui_file *stream); |
|
|
+extern int ser_mingw_nop_noflush_set_tty_state (struct serial *scb, |
|
|
+ serial_ttystate new_ttystate, |
|
|
+ serial_ttystate old_ttystate); |
|
|
+extern int ser_mingw_nop_setbaudrate (struct serial *scb, int rate); |
|
|
+extern int ser_mingw_nop_setstopbits (struct serial *scb, int rate); |
|
|
+extern int ser_mingw_nop_drain_output (struct serial *scb); |
|
|
+ |
|
|
+extern int ser_mingw_wait_for (struct serial *scb, int timeout); |
|
|
+extern int ser_mingw_readchar (struct serial *scb, int timeout); |
|
|
+ |
|
|
+extern int ser_mingw_write (struct serial *scb, const char *str, int len); |
|
|
+ |
|
|
+extern void ser_mingw_async (struct serial *scb, int async_p); |
|
|
+ |
|
|
+#endif |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/serial.c gdb-6.4-m68hc1x/gdb/serial.c |
|
|
--- gdb-6.4/gdb/serial.c Mon Feb 21 05:31:58 2005 |
|
|
+++ gdb-6.4-m68hc1x/gdb/serial.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -329,12 +329,16 @@ do_serial_close (struct serial *scb, int |
|
|
void |
|
|
serial_close (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return; |
|
|
do_serial_close (scb, 1); |
|
|
} |
|
|
|
|
|
void |
|
|
serial_un_fdopen (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return; |
|
|
do_serial_close (scb, 0); |
|
|
} |
|
|
|
|
|
@@ -343,6 +347,9 @@ serial_readchar (struct serial *scb, int |
|
|
{ |
|
|
int ch; |
|
|
|
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
+ |
|
|
/* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC |
|
|
code is finished. */ |
|
|
if (0 && serial_is_async_p (scb) && timeout < 0) |
|
|
@@ -384,6 +391,9 @@ serial_write (struct serial *scb, const |
|
|
gdb_flush (serial_logfp); |
|
|
} |
|
|
|
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
+ |
|
|
return (scb->ops->write (scb, str, len)); |
|
|
} |
|
|
|
|
|
@@ -404,24 +414,33 @@ serial_printf (struct serial *desc, cons |
|
|
int |
|
|
serial_drain_output (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return scb->ops->drain_output (scb); |
|
|
} |
|
|
|
|
|
int |
|
|
serial_flush_output (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return scb->ops->flush_output (scb); |
|
|
} |
|
|
|
|
|
int |
|
|
serial_flush_input (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return scb->ops->flush_input (scb); |
|
|
} |
|
|
|
|
|
int |
|
|
serial_send_break (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
+ |
|
|
if (serial_logfp != NULL) |
|
|
serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0); |
|
|
|
|
|
@@ -431,18 +450,24 @@ serial_send_break (struct serial *scb) |
|
|
void |
|
|
serial_raw (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return; |
|
|
scb->ops->go_raw (scb); |
|
|
} |
|
|
|
|
|
serial_ttystate |
|
|
serial_get_tty_state (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return scb->ops->get_tty_state (scb); |
|
|
} |
|
|
|
|
|
int |
|
|
serial_set_tty_state (struct serial *scb, serial_ttystate ttystate) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return scb->ops->set_tty_state (scb, ttystate); |
|
|
} |
|
|
|
|
|
@@ -451,6 +476,8 @@ serial_print_tty_state (struct serial *s |
|
|
serial_ttystate ttystate, |
|
|
struct ui_file *stream) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return; |
|
|
scb->ops->print_tty_state (scb, ttystate, stream); |
|
|
} |
|
|
|
|
|
@@ -459,30 +486,40 @@ serial_noflush_set_tty_state (struct ser |
|
|
serial_ttystate new_ttystate, |
|
|
serial_ttystate old_ttystate) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return scb->ops->noflush_set_tty_state (scb, new_ttystate, old_ttystate); |
|
|
} |
|
|
|
|
|
int |
|
|
serial_setbaudrate (struct serial *scb, int rate) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return scb->ops->setbaudrate (scb, rate); |
|
|
} |
|
|
|
|
|
int |
|
|
serial_setstopbits (struct serial *scb, int num) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return scb->ops->setstopbits (scb, num); |
|
|
} |
|
|
|
|
|
int |
|
|
serial_can_async_p (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return (scb->ops->async != NULL); |
|
|
} |
|
|
|
|
|
int |
|
|
serial_is_async_p (struct serial *scb) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return 0; |
|
|
return (scb->ops->async != NULL) && (scb->async_handler != NULL); |
|
|
} |
|
|
|
|
|
@@ -491,6 +528,9 @@ serial_async (struct serial *scb, |
|
|
serial_event_ftype *handler, |
|
|
void *context) |
|
|
{ |
|
|
+ if (!scb) |
|
|
+ return; |
|
|
+ |
|
|
/* Only change mode if there is a need. */ |
|
|
if ((scb->async_handler == NULL) |
|
|
!= (handler == NULL)) |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/signals/signals.c gdb-6.4-m68hc1x/gdb/signals/signals.c |
|
|
--- gdb-6.4/gdb/signals/signals.c Sun Jun 8 20:27:14 2003 |
|
|
+++ gdb-6.4-m68hc1x/gdb/signals/signals.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -44,6 +44,11 @@ |
|
|
# endif |
|
|
#endif |
|
|
|
|
|
+/* SCz: We need SIGTRAP for interaction with the gdb simulator */ |
|
|
+#ifndef SIGTRAP |
|
|
+# define SIGTRAP 5 |
|
|
+#endif |
|
|
+ |
|
|
/* This table must match in order and size the signals in enum target_signal |
|
|
in target.h. */ |
|
|
/* *INDENT-OFF* */ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/srec.h gdb-6.4-m68hc1x/gdb/srec.h |
|
|
--- gdb-6.4/gdb/srec.h Sat Apr 12 19:41:25 2003 |
|
|
+++ gdb-6.4-m68hc1x/gdb/srec.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -22,7 +22,8 @@ struct serial; |
|
|
|
|
|
void load_srec (struct serial *desc, const char *file, bfd_vma load_offset, |
|
|
int maxrecsize, int flags, int hashmark, |
|
|
- int (*waitack) (void)); |
|
|
+ int (*waitack) (void), |
|
|
+ int (*serial_write) (struct serial*, char*, int)); |
|
|
|
|
|
/* S-record capability flags */ |
|
|
|
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/ChangeLog.M68HC11 gdb-6.4-m68hc1x/gdb/testsuite/ChangeLog.M68HC11 |
|
|
--- gdb-6.4/gdb/testsuite/ChangeLog.M68HC11 Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/ChangeLog.M68HC11 Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,22 @@ |
|
|
+2002-11-13 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * gdb.base/huge.exp: Skip this test. |
|
|
+ * gdb.fortran/types.exp: Likewise. |
|
|
+ * gdb.fortran/exprs.exp: Don't run fortran float tests for 68HC11. |
|
|
+ |
|
|
+2002-11-13 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * gdb.base/remote.exp: Compile remote.c with -mshort for 68HC11. |
|
|
+ * gdb.base/printcmds.exp: Run the test after we are in the main. |
|
|
+ * gdb.base/break.exp: Fix test because there is also a marker4() |
|
|
+ at line 46. |
|
|
+ |
|
|
+2002-08-12 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * gdb.trace/deltrace.exp: Don't fail if target does not support |
|
|
+ trace points. |
|
|
+ * gdb.trace/passcount.exp: Likewise. |
|
|
+ * gdb.trace/save-trace.exp: Likewise. |
|
|
+ * lib/gdb.exp: Don't run C++ test on 68HC11. |
|
|
+ * gdb.threads/gcore-thread.exp: Don't run the test for 68HC11. |
|
|
+ * gdb.asm/m68hc11.inc: New file. |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.base/huge.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.base/huge.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.base/huge.exp Mon Feb 2 06:15:27 2004 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.base/huge.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -32,7 +32,9 @@ set bug_id 0 |
|
|
if [target_info exists gdb,skip_huge_test] { |
|
|
return; |
|
|
} |
|
|
- |
|
|
+if [istarget "m6811-*-*"] { |
|
|
+ return; |
|
|
+} |
|
|
set testfile "huge" |
|
|
set srcfile ${testfile}.c |
|
|
set binfile ${objdir}/${subdir}/${testfile} |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.base/printcmds.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.base/printcmds.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.base/printcmds.exp Thu Feb 26 18:23:23 2004 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.base/printcmds.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -694,9 +694,9 @@ gdb_test "set print address off" "" |
|
|
gdb_test "set width 0" "" |
|
|
|
|
|
if [set_lang_c] then { |
|
|
- gdb_test "p ctable1\[120\]" "120 'x'" "p ctable1\[120\] #1" |
|
|
- |
|
|
if [runto_main] then { |
|
|
+ gdb_test "p ctable1\[120\]" "120 'x'" "p ctable1\[120\] #1" |
|
|
+ |
|
|
test_integer_literals_accepted |
|
|
test_integer_literals_rejected |
|
|
test_character_literals_accepted |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.base/remote.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.base/remote.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.base/remote.exp Fri Sep 10 03:04:58 2004 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.base/remote.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -36,7 +36,12 @@ set binfile ${objdir}/${subdir}/${testfi |
|
|
|
|
|
gdb_start |
|
|
|
|
|
-set result [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] |
|
|
+# Must compile remote.c with 16-bit int |
|
|
+if [istarget "m6811-*-*"] then { |
|
|
+ set result [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-mshort}] |
|
|
+} else { |
|
|
+ set result [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] |
|
|
+} |
|
|
if {$result != "" } then { |
|
|
gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." |
|
|
} |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.fortran/exprs.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.fortran/exprs.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.fortran/exprs.exp Tue Sep 20 08:37:03 2005 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.fortran/exprs.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -280,7 +280,9 @@ if [set_lang_fortran] then { |
|
|
test_integer_literals_rejected |
|
|
test_logical_literals_accepted |
|
|
test_character_literals_accepted |
|
|
- test_float_literals_accepted |
|
|
+ if {! [istarget "m6811-*-*"]} { |
|
|
+ test_float_literals_accepted |
|
|
+ } |
|
|
test_arithmetic_expressions |
|
|
} else { |
|
|
warning "$test_name tests suppressed." 0 |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.fortran/types.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.fortran/types.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.fortran/types.exp Mon Dec 16 20:33:53 2002 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.fortran/types.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -109,7 +109,9 @@ if [set_lang_fortran] then { |
|
|
test_integer_literal_types_rejected |
|
|
test_logical_literal_types_accepted |
|
|
test_character_literal_types_accepted |
|
|
- test_float_literal_types_accepted |
|
|
+ if {! [istarget "m6811-*-*"]} { |
|
|
+ test_float_literal_types_accepted |
|
|
+ } |
|
|
} else { |
|
|
warning "$test_name tests suppressed." 0 |
|
|
} |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.threads/gcore-thread.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.threads/gcore-thread.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.threads/gcore-thread.exp Mon Feb 2 06:15:27 2004 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.threads/gcore-thread.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -24,6 +24,11 @@ if $tracelevel then { |
|
|
strace $tracelevel |
|
|
} |
|
|
|
|
|
+# Threads are not supported for 68HC11. |
|
|
+if [istarget "m6811-*-*"] then { |
|
|
+ return; |
|
|
+} |
|
|
+ |
|
|
set prms_id 0 |
|
|
set bug_id 0 |
|
|
|
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.trace/deltrace.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.trace/deltrace.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.trace/deltrace.exp Tue Apr 17 22:16:31 2001 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.trace/deltrace.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -50,6 +50,15 @@ gdb_reinitialize_dir $srcdir/$subdir |
|
|
|
|
|
gdb_file_cmd $binfile |
|
|
|
|
|
+ |
|
|
+# We generously give ourselves one "pass" if we successfully |
|
|
+# detect that this test cannot be run on this target! |
|
|
+if { ![gdb_target_supports_trace] } then { |
|
|
+ pass "Current target does not supporst trace" |
|
|
+ return 1; |
|
|
+ |
|
|
+} |
|
|
+ |
|
|
# define relative source line numbers: |
|
|
# all subsequent line numbers are relative to this first one (baseline) |
|
|
set baseline [gdb_find_recursion_test_baseline $srcfile]; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.trace/passcount.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.trace/passcount.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.trace/passcount.exp Tue Apr 17 22:16:31 2001 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.trace/passcount.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -49,6 +49,14 @@ gdb_reinitialize_dir $srcdir/$subdir |
|
|
|
|
|
gdb_file_cmd $binfile |
|
|
|
|
|
+# We generously give ourselves one "pass" if we successfully |
|
|
+# detect that this test cannot be run on this target! |
|
|
+if { ![gdb_target_supports_trace] } then { |
|
|
+ pass "Current target does not supporst trace" |
|
|
+ return 1; |
|
|
+ |
|
|
+} |
|
|
+ |
|
|
# define relative source line numbers: |
|
|
# all subsequent line numbers are relative to this first one (baseline) |
|
|
set baseline [gdb_find_recursion_test_baseline $srcfile]; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/gdb.trace/save-trace.exp gdb-6.4-m68hc1x/gdb/testsuite/gdb.trace/save-trace.exp |
|
|
--- gdb-6.4/gdb/testsuite/gdb.trace/save-trace.exp Thu Aug 7 19:55:41 2003 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/gdb.trace/save-trace.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -58,6 +58,14 @@ if { $baseline == -1 } then { |
|
|
return; |
|
|
} |
|
|
|
|
|
+# We generously give ourselves one "pass" if we successfully |
|
|
+# detect that this test cannot be run on this target! |
|
|
+if { ![gdb_target_supports_trace] } then { |
|
|
+ pass "Current target does not supporst trace" |
|
|
+ return 1; |
|
|
+ |
|
|
+} |
|
|
+ |
|
|
set testline1 [expr $baseline + 4] |
|
|
set testline2 [expr $baseline + 5] |
|
|
set testline3 [expr $baseline + 6] |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/gdb/testsuite/lib/gdb.exp gdb-6.4-m68hc1x/gdb/testsuite/lib/gdb.exp |
|
|
--- gdb-6.4/gdb/testsuite/lib/gdb.exp Wed Sep 28 00:39:03 2005 |
|
|
+++ gdb-6.4-m68hc1x/gdb/testsuite/lib/gdb.exp Sat Jan 21 15:28:49 2006 |
|
|
@@ -1153,6 +1153,9 @@ proc skip_cplus_tests {} { |
|
|
if { [istarget "m6812-*-*"] } { |
|
|
return 1 |
|
|
} |
|
|
+ if { [istarget "m6811-*-*"] } { |
|
|
+ return 1 |
|
|
+ } |
|
|
return 0 |
|
|
} |
|
|
|
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/include/gdb/ChangeLog.M68HC11 gdb-6.4-m68hc1x/include/gdb/ChangeLog.M68HC11 |
|
|
--- gdb-6.4/include/gdb/ChangeLog.M68HC11 Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/include/gdb/ChangeLog.M68HC11 Sun Jan 22 22:19:11 2006 |
|
|
@@ -0,0 +1,4 @@ |
|
|
+2006-01-22 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * remote-sim.h (SIGTRAP): Define for mingw32 |
|
|
+ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/include/gdb/remote-sim.h gdb-6.4-m68hc1x/include/gdb/remote-sim.h |
|
|
--- gdb-6.4/include/gdb/remote-sim.h Fri Feb 28 00:13:32 2003 |
|
|
+++ gdb-6.4-m68hc1x/include/gdb/remote-sim.h Sat Jan 21 17:57:30 2006 |
|
|
@@ -22,6 +22,10 @@ Foundation, Inc., 59 Temple Place - Suit |
|
|
#if !defined (REMOTE_SIM_H) |
|
|
#define REMOTE_SIM_H 1 |
|
|
|
|
|
+#ifndef SIGTRAP |
|
|
+#define SIGTRAP 5 |
|
|
+#endif |
|
|
+ |
|
|
#ifdef __cplusplus |
|
|
extern "C" { |
|
|
#endif |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/ChangeLog.M68HC11 gdb-6.4-m68hc1x/sim/common/ChangeLog.M68HC11 |
|
|
--- gdb-6.4/sim/common/ChangeLog.M68HC11 Thu Jan 1 01:00:00 1970 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/ChangeLog.M68HC11 Sat Jan 21 15:28:49 2006 |
|
|
@@ -0,0 +1,44 @@ |
|
|
+2004-08-03 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * callback.c (os_ftruncate): Don't compile on Mingw32. |
|
|
+ (os_truncate): Likewise. |
|
|
+ (default_callback): Use null for the above |
|
|
+ |
|
|
+2004-02-01 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * aclocal.m4 (SIM_AC_COMMON): Check for winsock.h and bind(). |
|
|
+ |
|
|
+2003-10-05 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ From 2003-05-10 <fernando@seventh.com.br> |
|
|
+ * sim-io.c (sim_io_poll_read): Fix reading of input keyboard on |
|
|
+ Windows. |
|
|
+ |
|
|
+2002-08-11 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * sim-core.h: Use address_word to specify the base and size |
|
|
+ of the memory mapping (necessary when sizeof(address_word) > |
|
|
+ sizeof(unsigned_word)). |
|
|
+ * sim-memopt.h: Likewise. |
|
|
+ * hw-base.c (panic_hw_io_read_buffer): Likewise. |
|
|
+ (panic_hw_io_write_buffer): Likewise. |
|
|
+ * sim-core.c (sim_core_write_buffer): Likewise for raddr. |
|
|
+ (sim_core_read_buffer): Likewise. |
|
|
+ * dv-glue.c (hw_glue_io_read_buffer): Likewise. |
|
|
+ (hw_glue_io_write_buffer): Likewise. |
|
|
+ * dv-pal.c (hw_pal_io_write_buffer): Likewise. |
|
|
+ (hw_pal_io_read_buffer): Likewise. |
|
|
+ * sim-hw.c (sim_hw_io_read_buffer): Likewise. |
|
|
+ (sim_hw_io_write_buffer): Likewise. |
|
|
+ (sim_cpu_hw_io_read_buffer): Likewise. |
|
|
+ (sim_cpu_hw_io_write_buffer): Likewise. |
|
|
+ |
|
|
+2002-08-11 Stephane Carrez <stcarrez@nerim.fr> |
|
|
+ |
|
|
+ * hw-instances.c (panic_hw_instance_read): Use unsigned_cell for |
|
|
+ the length to conform to hw_instance_read_method type. |
|
|
+ * sim-profile.c (profile_print_addr_ranges): Compile only when |
|
|
+ SIM_HAVE_ADDR_RANGE. |
|
|
+ * sim-memopt.c: Include <unistd.h> for close prototype. |
|
|
+ (do_memopt_add): Use %ld since bytes is a unsigned long. |
|
|
+ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/aclocal.m4 gdb-6.4-m68hc1x/sim/common/aclocal.m4 |
|
|
--- gdb-6.4/sim/common/aclocal.m4 Wed Mar 23 19:55:14 2005 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/aclocal.m4 Sat Jan 21 15:28:49 2006 |
|
|
@@ -53,11 +53,37 @@ AC_CHECK_HEADERS(stdlib.h string.h strin |
|
|
AC_CHECK_HEADERS(sys/time.h sys/resource.h) |
|
|
AC_CHECK_HEADERS(fcntl.h fpu_control.h) |
|
|
AC_CHECK_HEADERS(dlfcn.h errno.h sys/stat.h) |
|
|
+AC_CHECK_HEADERS(winsock.h) |
|
|
AC_CHECK_FUNCS(getrusage time sigaction __setfpucw) |
|
|
|
|
|
# Check for socket libraries |
|
|
AC_CHECK_LIB(socket, bind) |
|
|
AC_CHECK_LIB(nsl, gethostbyname) |
|
|
+ |
|
|
+dnl Check for Windows socket library. |
|
|
+dnl We need a special program that include <winsock.h> and we must not |
|
|
+dnl define bind() because the winsock definition can be special |
|
|
+dnl (The real symbol for bind() seems to be bind@12) |
|
|
+ac_save_libs="$LIBS" |
|
|
+LIBS="-lwsock32 ${LIBS}" |
|
|
+ |
|
|
+AC_MSG_CHECKING([for bind in -lwsock32]) |
|
|
+AC_TRY_LINK([#include <winsock.h> |
|
|
+],[ |
|
|
+ bind(0, 0, 0); |
|
|
+],found=yes, found=no) |
|
|
+AC_MSG_RESULT($found) |
|
|
+if test $found = yes; then |
|
|
+ ac_tr_lib=HAVE_LIB`echo nsl | sed -e 's/[^a-zA-Z0-9_]/_/g' \ |
|
|
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` |
|
|
+ cat >> confdefs.h <<EOF |
|
|
+#define $ac_tr_lib 1 |
|
|
+EOF |
|
|
+ LIBS="-lwsock32 ${LIBS}" |
|
|
+ |
|
|
+else |
|
|
+ LIBS="$ac_save_libs" |
|
|
+fi |
|
|
|
|
|
. ${srcdir}/../../bfd/configure.host |
|
|
|
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/callback.c gdb-6.4-m68hc1x/sim/common/callback.c |
|
|
--- gdb-6.4/sim/common/callback.c Fri Jul 8 10:05:35 2005 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/callback.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -584,6 +584,7 @@ os_lstat (p, file, buf) |
|
|
#endif |
|
|
} |
|
|
|
|
|
+#if !defined(__MINGW32__) |
|
|
static int |
|
|
os_ftruncate (p, fd, len) |
|
|
host_callback *p; |
|
|
@@ -608,6 +609,7 @@ os_ftruncate (p, fd, len) |
|
|
#endif |
|
|
return result; |
|
|
} |
|
|
+#endif |
|
|
|
|
|
static int |
|
|
os_truncate (p, file, len) |
|
|
@@ -811,8 +813,12 @@ host_callback default_callback = |
|
|
os_fstat, |
|
|
os_lstat, |
|
|
|
|
|
+#if defined(__MINGW32__) |
|
|
+ 0, 0, |
|
|
+#else |
|
|
os_ftruncate, |
|
|
os_truncate, |
|
|
+#endif |
|
|
|
|
|
os_pipe, |
|
|
os_pipe_empty, |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/dv-glue.c gdb-6.4-m68hc1x/sim/common/dv-glue.c |
|
|
--- gdb-6.4/sim/common/dv-glue.c Tue May 18 23:20:07 2004 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/dv-glue.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -278,7 +278,7 @@ static unsigned |
|
|
hw_glue_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
struct hw_glue *glue = (struct hw_glue *) hw_data (me); |
|
|
@@ -298,7 +298,7 @@ static unsigned |
|
|
hw_glue_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
struct hw_glue *glue = (struct hw_glue *) hw_data (me); |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/dv-pal.c gdb-6.4-m68hc1x/sim/common/dv-pal.c |
|
|
--- gdb-6.4/sim/common/dv-pal.c Sat Nov 23 02:12:05 2002 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/dv-pal.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -341,7 +341,7 @@ static unsigned |
|
|
hw_pal_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
hw_pal_device *hw_pal = (hw_pal_device *) hw_data (me); |
|
|
@@ -426,7 +426,7 @@ static unsigned |
|
|
hw_pal_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
hw_pal_device *hw_pal = (hw_pal_device*) hw_data (me); |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/dv-sockser.c gdb-6.4-m68hc1x/sim/common/dv-sockser.c |
|
|
--- gdb-6.4/sim/common/dv-sockser.c Fri Aug 11 02:48:51 2000 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/dv-sockser.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -42,6 +42,9 @@ with this program; if not, write to the |
|
|
#include <errno.h> |
|
|
#include <sys/types.h> |
|
|
#include <sys/time.h> |
|
|
+#ifdef _WIN32 |
|
|
+#include <winsock.h> |
|
|
+#else |
|
|
#include <netinet/in.h> |
|
|
#include <arpa/inet.h> |
|
|
#include <netdb.h> |
|
|
@@ -50,6 +53,7 @@ with this program; if not, write to the |
|
|
#ifndef __CYGWIN32__ |
|
|
#include <netinet/tcp.h> |
|
|
#endif |
|
|
+#endif |
|
|
|
|
|
#include "sim-assert.h" |
|
|
#include "sim-options.h" |
|
|
@@ -198,6 +202,7 @@ dv_sockser_init (SIM_DESC sd) |
|
|
return SIM_RC_OK; |
|
|
} |
|
|
|
|
|
+#ifdef SIGPIPE |
|
|
/* Handle writes to missing client -> SIGPIPE. |
|
|
??? Need a central signal management module. */ |
|
|
{ |
|
|
@@ -207,7 +212,7 @@ dv_sockser_init (SIM_DESC sd) |
|
|
if (orig != SIG_DFL && orig != SIG_IGN) |
|
|
signal (SIGPIPE, orig); |
|
|
} |
|
|
- |
|
|
+#endif |
|
|
return SIM_RC_OK; |
|
|
} |
|
|
|
|
|
@@ -274,6 +279,7 @@ connected_p (SIM_DESC sd) |
|
|
if (sockser_fd < 0) |
|
|
return 0; |
|
|
|
|
|
+#ifdef F_GETFL |
|
|
/* Set non-blocking i/o. */ |
|
|
flags = fcntl (sockser_fd, F_GETFL); |
|
|
flags |= O_NONBLOCK | O_NDELAY; |
|
|
@@ -284,6 +290,7 @@ connected_p (SIM_DESC sd) |
|
|
sockser_fd = -1; |
|
|
return 0; |
|
|
} |
|
|
+#endif |
|
|
return 1; |
|
|
} |
|
|
|
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/hw-base.c gdb-6.4-m68hc1x/sim/common/hw-base.c |
|
|
--- gdb-6.4/sim/common/hw-base.c Sat Nov 23 02:12:05 2002 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/hw-base.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -217,7 +217,7 @@ static unsigned |
|
|
panic_hw_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
hw_abort (me, "no io-read method"); |
|
|
@@ -228,7 +228,7 @@ static unsigned |
|
|
panic_hw_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
hw_abort (me, "no io-write method"); |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/hw-device.h gdb-6.4-m68hc1x/sim/common/hw-device.h |
|
|
--- gdb-6.4/sim/common/hw-device.h Sat Nov 23 02:12:05 2002 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/hw-device.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -231,7 +231,7 @@ typedef unsigned (hw_io_read_buffer_meth |
|
|
(struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes); |
|
|
|
|
|
#define hw_io_read_buffer(hw, dest, space, addr, nr_bytes) \ |
|
|
@@ -244,7 +244,7 @@ typedef unsigned (hw_io_write_buffer_met |
|
|
(struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes); |
|
|
|
|
|
#define hw_io_write_buffer(hw, src, space, addr, nr_bytes) \ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/hw-instances.c gdb-6.4-m68hc1x/sim/common/hw-instances.c |
|
|
--- gdb-6.4/sim/common/hw-instances.c Sat Nov 23 02:12:05 2002 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/hw-instances.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -126,7 +126,7 @@ hw_instance_delete (struct hw_instance * |
|
|
static int |
|
|
panic_hw_instance_read (struct hw_instance *instance, |
|
|
void *addr, |
|
|
- unsigned_word len) |
|
|
+ unsigned_cell len) |
|
|
{ |
|
|
hw_abort (hw_instance_hw (instance), "no read method"); |
|
|
return -1; |
|
|
@@ -137,7 +137,7 @@ panic_hw_instance_read (struct hw_instan |
|
|
static int |
|
|
panic_hw_instance_write (struct hw_instance *instance, |
|
|
const void *addr, |
|
|
- unsigned_word len) |
|
|
+ unsigned_cell len) |
|
|
{ |
|
|
hw_abort (hw_instance_hw (instance), "no write method"); |
|
|
return -1; |
|
|
@@ -146,8 +146,8 @@ panic_hw_instance_write (struct hw_insta |
|
|
|
|
|
static int |
|
|
panic_hw_instance_seek (struct hw_instance *instance, |
|
|
- unsigned_word pos_hi, |
|
|
- unsigned_word pos_lo) |
|
|
+ unsigned_cell pos_hi, |
|
|
+ unsigned_cell pos_lo) |
|
|
{ |
|
|
hw_abort (hw_instance_hw (instance), "no seek method"); |
|
|
return -1; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-core.c gdb-6.4-m68hc1x/sim/common/sim-core.c |
|
|
--- gdb-6.4/sim/common/sim-core.c Fri Dec 19 12:43:56 2003 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-core.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -518,7 +518,7 @@ sim_core_read_buffer (SIM_DESC sd, |
|
|
unsigned count = 0; |
|
|
while (count < len) |
|
|
{ |
|
|
- unsigned_word raddr = addr + count; |
|
|
+ address_word raddr = addr + count; |
|
|
sim_core_mapping *mapping = |
|
|
sim_core_find_mapping (core, map, |
|
|
raddr, /*nr-bytes*/1, |
|
|
@@ -584,7 +584,7 @@ sim_core_write_buffer (SIM_DESC sd, |
|
|
unsigned count = 0; |
|
|
while (count < len) |
|
|
{ |
|
|
- unsigned_word raddr = addr + count; |
|
|
+ address_word raddr = addr + count; |
|
|
sim_core_mapping *mapping = |
|
|
sim_core_find_mapping (core, map, |
|
|
raddr, /*nr-bytes*/1, |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-core.h gdb-6.4-m68hc1x/sim/common/sim-core.h |
|
|
--- gdb-6.4/sim/common/sim-core.h Sat Nov 23 02:12:05 2002 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-core.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -51,9 +51,9 @@ struct _sim_core_mapping { |
|
|
/* common */ |
|
|
int level; |
|
|
int space; |
|
|
- unsigned_word base; |
|
|
- unsigned_word bound; |
|
|
- unsigned_word nr_bytes; |
|
|
+ address_word base; |
|
|
+ address_word bound; |
|
|
+ address_word nr_bytes; |
|
|
unsigned mask; |
|
|
/* memory map */ |
|
|
void *free_buffer; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-hw.c gdb-6.4-m68hc1x/sim/common/sim-hw.c |
|
|
--- gdb-6.4/sim/common/sim-hw.c Thu Jul 27 13:34:30 2000 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-hw.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -1,5 +1,5 @@ |
|
|
/* Simulator hardware option handling. |
|
|
- Copyright (C) 1998 Free Software Foundation, Inc. |
|
|
+ Copyright (C) 1998, 2002 Free Software Foundation, Inc. |
|
|
Contributed by Cygnus Support and Andrew Cagney. |
|
|
|
|
|
This file is part of GDB, the GNU debugger. |
|
|
@@ -339,7 +339,7 @@ sim_cpu_hw_io_read_buffer (sim_cpu *cpu, |
|
|
struct hw *hw, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd = CPU_STATE (cpu); |
|
|
@@ -355,7 +355,7 @@ sim_cpu_hw_io_write_buffer (sim_cpu *cpu |
|
|
struct hw *hw, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd = CPU_STATE (cpu); |
|
|
@@ -375,7 +375,7 @@ sim_hw_io_read_buffer (struct sim_state |
|
|
struct hw *hw, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
STATE_HW (sd)->cpu = NULL; |
|
|
@@ -387,7 +387,7 @@ sim_hw_io_write_buffer (struct sim_state |
|
|
struct hw *hw, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
STATE_HW (sd)->cpu = NULL; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-hw.h gdb-6.4-m68hc1x/sim/common/sim-hw.h |
|
|
--- gdb-6.4/sim/common/sim-hw.h Fri Apr 16 03:34:57 1999 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-hw.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -1,5 +1,5 @@ |
|
|
/* Device definitions. |
|
|
- Copyright (C) 1998 Free Software Foundation, Inc. |
|
|
+ Copyright (C) 1998, 2002 Free Software Foundation, Inc. |
|
|
Contributed by Cygnus Support. |
|
|
|
|
|
This file is part of GDB, the GNU debugger. |
|
|
@@ -62,7 +62,7 @@ void sim_cpu_hw_io_read_buffer |
|
|
struct hw *hw, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes); |
|
|
|
|
|
void sim_cpu_hw_io_write_buffer |
|
|
@@ -71,7 +71,7 @@ void sim_cpu_hw_io_write_buffer |
|
|
struct hw *hw, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes); |
|
|
|
|
|
|
|
|
@@ -83,7 +83,7 @@ unsigned sim_hw_io_read_buffer |
|
|
struct hw *hw, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes); |
|
|
|
|
|
unsigned sim_hw_io_write_buffer |
|
|
@@ -91,7 +91,7 @@ unsigned sim_hw_io_write_buffer |
|
|
struct hw *hw, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word addr, |
|
|
+ address_word addr, |
|
|
unsigned nr_bytes); |
|
|
|
|
|
|
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-io.c gdb-6.4-m68hc1x/sim/common/sim-io.c |
|
|
--- gdb-6.4/sim/common/sim-io.c Sat Nov 23 02:12:05 2002 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-io.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -386,6 +386,15 @@ sim_io_poll_read (SIM_DESC sd, |
|
|
} |
|
|
return result; |
|
|
#else |
|
|
+#ifdef _WIN32 |
|
|
+ /* For Windows, use _kbhit() to see whether some input is available. */ |
|
|
+ if (sim_io_fd == STDIN_FILENO) { |
|
|
+ int result = 0; |
|
|
+ while (_kbhit() && result < sizeof_buf) |
|
|
+ buf[result++] = _getch(); |
|
|
+ return result; |
|
|
+ } else |
|
|
+#endif |
|
|
return sim_io_read (sd, sim_io_fd, buf, sizeof_buf); |
|
|
#endif |
|
|
} |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-memopt.h gdb-6.4-m68hc1x/sim/common/sim-memopt.h |
|
|
--- gdb-6.4/sim/common/sim-memopt.h Tue Mar 20 18:13:39 2001 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-memopt.h Sat Jan 21 15:28:49 2006 |
|
|
@@ -27,8 +27,8 @@ typedef struct _sim_memopt sim_memopt; |
|
|
struct _sim_memopt { |
|
|
int level; |
|
|
int space; |
|
|
- unsigned_word addr; |
|
|
- unsigned_word nr_bytes; |
|
|
+ address_word addr; |
|
|
+ address_word nr_bytes; |
|
|
unsigned modulo; |
|
|
void *buffer; |
|
|
unsigned long munmap_length; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-profile.c gdb-6.4-m68hc1x/sim/common/sim-profile.c |
|
|
--- gdb-6.4/sim/common/sim-profile.c Thu Feb 15 22:14:40 2001 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-profile.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -1050,6 +1050,7 @@ profile_print_speed (sim_cpu *cpu) |
|
|
} |
|
|
} |
|
|
|
|
|
+#ifdef SIM_HAVE_ADDR_RANGE |
|
|
/* Print selected address ranges. */ |
|
|
|
|
|
static void |
|
|
@@ -1070,6 +1071,7 @@ profile_print_addr_ranges (sim_cpu *cpu) |
|
|
sim_io_printf (sd, "\n"); |
|
|
} |
|
|
} |
|
|
+#endif |
|
|
|
|
|
/* Top level function to print all summary profile information. |
|
|
It is [currently] intended that all such data is printed by this function. |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-signal.c gdb-6.4-m68hc1x/sim/common/sim-signal.c |
|
|
--- gdb-6.4/sim/common/sim-signal.c Fri Apr 16 03:34:59 1999 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-signal.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -27,7 +27,7 @@ with this program; if not, write to the |
|
|
to not think the process has died (so it can be debugged at the point of |
|
|
failure). */ |
|
|
|
|
|
-#ifdef _MSC_VER |
|
|
+#if defined(_MSC_VER) || defined(__MINGW32__) |
|
|
#ifndef SIGTRAP |
|
|
#define SIGTRAP 5 |
|
|
#endif |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/common/sim-trace.c gdb-6.4-m68hc1x/sim/common/sim-trace.c |
|
|
--- gdb-6.4/sim/common/sim-trace.c Fri Oct 31 06:32:46 2003 |
|
|
+++ gdb-6.4-m68hc1x/sim/common/sim-trace.c Sat Jan 21 15:28:49 2006 |
|
|
@@ -241,7 +241,9 @@ trace_option_handler (SIM_DESC sd, sim_c |
|
|
char *arg, int is_command) |
|
|
{ |
|
|
int n; |
|
|
+#ifdef SIM_HAVE_ADDR_RANGE |
|
|
int cpu_nr; |
|
|
+#endif |
|
|
|
|
|
switch (opt) |
|
|
{ |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/m68hc11/configure gdb-6.4-m68hc1x/sim/m68hc11/configure |
|
|
--- gdb-6.4/sim/m68hc11/configure Wed Mar 23 19:55:17 2005 |
|
|
+++ gdb-6.4-m68hc1x/sim/m68hc11/configure Sat Jan 21 15:28:49 2006 |
|
|
@@ -6800,6 +6800,45 @@ _ACEOF |
|
|
fi |
|
|
|
|
|
|
|
|
+ac_save_libs="$LIBS" |
|
|
+LIBS="-lwsock32 ${LIBS}" |
|
|
+ |
|
|
+echo $ac_n "checking for bind in -lwsock32""... $ac_c" 1>&6 |
|
|
+echo "configure:3297: checking for bind in -lwsock32" >&5 |
|
|
+cat > conftest.$ac_ext <<EOF |
|
|
+#line 3299 "configure" |
|
|
+#include "confdefs.h" |
|
|
+#include <winsock.h> |
|
|
+ |
|
|
+int main() { |
|
|
+ |
|
|
+ bind(0, 0, 0); |
|
|
+ |
|
|
+; return 0; } |
|
|
+EOF |
|
|
+if { (eval echo configure:3309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then |
|
|
+ rm -rf conftest* |
|
|
+ found=yes |
|
|
+else |
|
|
+ echo "configure: failed program was:" >&5 |
|
|
+ cat conftest.$ac_ext >&5 |
|
|
+ rm -rf conftest* |
|
|
+ found=no |
|
|
+fi |
|
|
+rm -f conftest* |
|
|
+echo "$ac_t""$found" 1>&6 |
|
|
+if test $found = yes; then |
|
|
+ ac_tr_lib=HAVE_LIB`echo nsl | sed -e 's/^a-zA-Z0-9_/_/g' \ |
|
|
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` |
|
|
+ cat >> confdefs.h <<EOF |
|
|
+#define $ac_tr_lib 1 |
|
|
+EOF |
|
|
+ LIBS="-lwsock32 ${LIBS}" |
|
|
+ |
|
|
+else |
|
|
+ LIBS="$ac_save_libs" |
|
|
+fi |
|
|
+ |
|
|
. ${srcdir}/../../bfd/configure.host |
|
|
|
|
|
|
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/m68hc11/dv-m68hc11.c gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11.c |
|
|
--- gdb-6.4/sim/m68hc11/dv-m68hc11.c Fri Aug 8 23:00:55 2003 |
|
|
+++ gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11.c Sat Jan 21 15:28:50 2006 |
|
|
@@ -831,7 +831,7 @@ static unsigned |
|
|
m68hc11cpu_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
@@ -981,7 +981,7 @@ m68hc11cpu_set_port (struct hw *me, sim_ |
|
|
|
|
|
static void |
|
|
m68hc11cpu_io_write (struct hw *me, sim_cpu *cpu, |
|
|
- unsigned_word addr, uint8 val) |
|
|
+ address_word addr, uint8 val) |
|
|
{ |
|
|
switch (addr) |
|
|
{ |
|
|
@@ -1079,7 +1079,7 @@ static unsigned |
|
|
m68hc11cpu_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/m68hc11/dv-m68hc11eepr.c gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11eepr.c |
|
|
--- gdb-6.4/sim/m68hc11/dv-m68hc11eepr.c Tue Aug 13 11:01:16 2002 |
|
|
+++ gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11eepr.c Sat Jan 21 15:28:50 2006 |
|
|
@@ -393,7 +393,7 @@ static unsigned |
|
|
m68hc11eepr_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
@@ -448,7 +448,7 @@ static unsigned |
|
|
m68hc11eepr_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/m68hc11/dv-m68hc11sio.c gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11sio.c |
|
|
--- gdb-6.4/sim/m68hc11/dv-m68hc11sio.c Fri Aug 8 23:02:24 2003 |
|
|
+++ gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11sio.c Sat Jan 21 15:28:50 2006 |
|
|
@@ -492,7 +492,7 @@ static unsigned |
|
|
m68hc11sio_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
@@ -537,7 +537,7 @@ static unsigned |
|
|
m68hc11sio_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/m68hc11/dv-m68hc11spi.c gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11spi.c |
|
|
--- gdb-6.4/sim/m68hc11/dv-m68hc11spi.c Fri Aug 8 23:02:24 2003 |
|
|
+++ gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11spi.c Sat Jan 21 15:28:50 2006 |
|
|
@@ -381,7 +381,7 @@ static unsigned |
|
|
m68hc11spi_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
@@ -426,7 +426,7 @@ static unsigned |
|
|
m68hc11spi_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/m68hc11/dv-m68hc11tim.c gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11tim.c |
|
|
--- gdb-6.4/sim/m68hc11/dv-m68hc11tim.c Fri Aug 8 23:02:24 2003 |
|
|
+++ gdb-6.4-m68hc1x/sim/m68hc11/dv-m68hc11tim.c Sat Jan 21 15:28:50 2006 |
|
|
@@ -638,7 +638,7 @@ static unsigned |
|
|
m68hc11tim_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
@@ -687,7 +687,7 @@ static unsigned |
|
|
m68hc11tim_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
SIM_DESC sd; |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/m68hc11/dv-nvram.c gdb-6.4-m68hc1x/sim/m68hc11/dv-nvram.c |
|
|
--- gdb-6.4/sim/m68hc11/dv-nvram.c Fri Nov 24 21:53:35 2000 |
|
|
+++ gdb-6.4-m68hc1x/sim/m68hc11/dv-nvram.c Sat Jan 21 15:28:50 2006 |
|
|
@@ -258,7 +258,7 @@ static unsigned |
|
|
nvram_io_read_buffer (struct hw *me, |
|
|
void *dest, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
struct nvram *controller = hw_data (me); |
|
|
@@ -281,7 +281,7 @@ static unsigned |
|
|
nvram_io_write_buffer (struct hw *me, |
|
|
const void *source, |
|
|
int space, |
|
|
- unsigned_word base, |
|
|
+ address_word base, |
|
|
unsigned nr_bytes) |
|
|
{ |
|
|
struct nvram *controller = hw_data (me); |
|
|
diff --exclude-from=exclude.lst -Nrup gdb-6.4/sim/m68hc11/m68hc11_sim.c gdb-6.4-m68hc1x/sim/m68hc11/m68hc11_sim.c |
|
|
--- gdb-6.4/sim/m68hc11/m68hc11_sim.c Fri Aug 8 23:00:55 2003 |
|
|
+++ gdb-6.4-m68hc1x/sim/m68hc11/m68hc11_sim.c Sat Jan 21 15:28:50 2006 |
|
|
@@ -291,8 +291,8 @@ cpu_get_indexed_operand_addr (sim_cpu* c |
|
|
return 0; |
|
|
} |
|
|
reg = (code >> 3) & 0x03; |
|
|
- addr = cpu_get_reg (cpu, reg); |
|
|
- addr += cpu_fetch16 (cpu); |
|
|
+ addr = cpu_fetch16 (cpu); |
|
|
+ addr += cpu_get_reg (cpu, reg); |
|
|
addr = memory_read16 (cpu, addr); |
|
|
cpu_add_cycles (cpu, 1); |
|
|
} |
|
|
@@ -765,7 +765,7 @@ cpu_special (sim_cpu *cpu, enum M6811_Sp |
|
|
case M6811_WAI: |
|
|
/* In the ELF-start mode, we are in a special mode where |
|
|
the WAI corresponds to an exit. */ |
|
|
- if (cpu->cpu_use_elf_start) |
|
|
+ if (cpu->cpu_use_elf_start || 1) |
|
|
{ |
|
|
cpu_set_pc (cpu, cpu->cpu_insn_pc); |
|
|
sim_engine_halt (CPU_STATE (cpu), cpu,
|
|
|
|