summaryrefslogtreecommitdiff
path: root/cesar/ecos/packages/cygmon
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/ecos/packages/cygmon')
-rw-r--r--cesar/ecos/packages/cygmon/current/ChangeLog252
-rw-r--r--cesar/ecos/packages/cygmon/current/cdl/cygmon.cdl140
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/Notes_CygMon_PID168
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/arm/arm-mon.c281
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/arm/board.h82
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/arm/cpu.h978
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/arm/cpu_info.h100
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/board.h72
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bplist-dynamic.c234
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/breakpoints.c220
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb-cpu.c208
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb-cpu.h61
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb.h58
-rwxr-xr-xcesar/ecos/packages/cygmon/current/misc/bsp/arm/insn.h482
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/arm/singlestep.c1320
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/bsp.h445
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/breakpoint.c97
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp.c341
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_cache.c70
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_if.c160
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_if.h433
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/console-io.c140
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/debug-io.c142
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb-cpu.c61
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb-cpu.h65
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb.h103
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/generic-mem.c194
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/hex-utils.c126
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/printf.c95
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/shared-data.c59
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/singlestep.c61
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/sprintf.c86
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/syscall.c218
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/syscall.h50
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/sysinfo.c170
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/common/vprintf.c445
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/cpu.h71
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/dbg-threads-api.h148
-rwxr-xr-xcesar/ecos/packages/cygmon/current/misc/bsp/defs.h112
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/gdb-data.h126
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/hex-utils.h85
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb-cpu.c53
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb-cpu.h58
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb.h58
-rwxr-xr-xcesar/ecos/packages/cygmon/current/misc/bsp/mips/insn.h59
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mips/singlestep.c55
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb-cpu.c53
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb-cpu.h58
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb.h58
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/insn.h59
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/singlestep.c55
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/cpu-mon.c61
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/cpu_info.h69
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/ecos_bsp.c470
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/ecos_dummy.c70
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/fmt_util.h65
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/generic-stub.h54
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/generic_fmt32.c98
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/generic_mem.c99
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/ledit.c604
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/ledit.h88
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/mips/board.h110
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/mips/cpu.h59
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/mips/cpu_info.h90
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/mips/mips-mon.c183
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/mn10300/board.h103
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/mn10300/cpu.h61
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/mn10300/cpu_info.h91
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/mn10300/mn10300-mon.c206
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/monitor.c494
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/monitor.h303
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/monitor_cmd.c2549
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/monitor_cmd.h126
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/stub-tservice.h54
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/tservice.h84
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/unistd.h54
-rw-r--r--cesar/ecos/packages/cygmon/current/misc/utils.c376
77 files changed, 15946 insertions, 0 deletions
diff --git a/cesar/ecos/packages/cygmon/current/ChangeLog b/cesar/ecos/packages/cygmon/current/ChangeLog
new file mode 100644
index 0000000000..f52afbad90
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/ChangeLog
@@ -0,0 +1,252 @@
+2000-12-04 Drew Moseley <dmoseley@redhat.com>
+
+ * misc/monitor_cmd.c (breakpoint_cmd): Fix typo in printf
+ formatting for error message.
+
+2000-11-20 Drew Moseley <dmoseley@redhat.com>
+
+ * cdl/cygmon.cdl: Make sure we don't specify vectors.o and target.ld twice.
+
+2000-11-03 Jonathan Larmour <jlarmour@redhat.com>
+
+ * cdl/cygmon.cdl: Improve cygmon.elf make dependencies
+
+2000-10-17 Drew Moseley <dmoseley@redhat.com>
+
+ * misc/utils.c: Fix a typo. Also make sure we are ignoring the
+ '+' characters from gdb.
+
+ * misc/monitor_cmd.c: Add a few cache flushes.
+
+ * misc/monitor.h: Use the debug port for xvprintf.
+
+2000-08-14 Drew Moseley <dmoseley@redhat.com>
+
+ * misc/ecos_bsp.c: Added some include files to fix some build
+ failures on partially unsupported systems. (ie non-cygmon, etc).
+
+2000-08-12 Drew Moseley <dmoseley@redhat.com>
+
+ * misc/bsp/common/debug-io.c (bsp_debug_write): Use
+ output_gdb_string when stub_is_active.
+
+2000-08-10 Drew Moseley <dmoseley@redhat.com>
+
+ * misc/utils.c: Removed some unused functions. Also handle
+ printing invalid registers.
+
+ * misc/monitor_cmd.c: Handle some unprintable characters better.
+ Also handle displaying of invalid memory locations better.
+ Add handling for register validity checking.
+
+ * misc/monitor.h: Add a conditional field "reg_valid" to struct
+ regstruct.
+
+ * misc/monitor.c: Added a call to a conditionally defined routine
+ INITIALIZE_MON_EACH_TIME(). This is called everytime the monitor
+ is invoked. For instance, this is used to determine which
+ registers have actually been read.
+
+ * misc/generic_mem.c: Allow Cygmon to use the Safe memory routines
+ in the HAL.
+
+ * misc/board.h: Added MN10300 basic support.
+ * misc/cpu-mon.c: Ditto.
+ * misc/cpu_info.h: Ditto.
+ * misc/bsp/cpu.h: Ditto.
+ * misc/bsp/mn10300/gdb-cpu.c: Ditto. New file.
+ * misc/bsp/mn10300/gdb-cpu.h: Ditto. New file.
+ * misc/bsp/mn10300/gdb.h: Ditto. New file.
+ * misc/bsp/mn10300/insn.h: Ditto. New file.
+ * misc/bsp/mn10300/singlestep.c: Ditto. New file.
+ * misc/mn10300/board.h: Ditto. New file.
+ * misc/mn10300/cpu.h: Ditto. New file.
+ * misc/mn10300/cpu_info.h: Ditto. New file.
+ * misc/mn10300/mn10300-mon.c: Ditto. New file.
+
+ * cdl/cygmon.cdl: Removed dependency on the kernel and Serial I/O.
+ * misc/ecos_bsp.c: Ditto.
+ * misc/ecos_dummy.c: Ditto.
+
+2000-07-21 Drew Moseley <dmoseley@redhat.com>
+
+ * misc/ecos_bsp.c: Rearrange the linkage between Cygmon and HAL so
+ that Cygmon needs HAL but not vice-versa. ie HAL no longer calls
+ any Cygmon functions.
+ * misc/monitor.c: Ditto.
+
+2000-07-14 Drew Moseley <dmoseley@redhat.com>
+
+ * misc/bsp/mips/gdb-cpu.c: New files. Mips based Cygmon now running on top of eCos HAL.
+ * misc/bsp/mips/gdb-cpu.h: Ditto.
+ * misc/bsp/mips/gdb.h: Ditto.
+ * misc/bsp/mips/insn.h: Ditto.
+ * misc/bsp/mips/singlestep.c: Ditto.
+ * misc/mips/board.h: Ditto.
+ * misc/mips/cpu.h: Ditto.
+ * misc/mips/cpu_info.h: Ditto.
+ * misc/mips/mips-mon.c: Ditto.
+
+ * misc/bsp/common/syscall.c: Added SYS_meminfo call to find out
+ how much RAM we have.
+ * misc/bsp/common/syscall.h: Ditto.
+
+ * misc/bsp/common/breakpoint.c: Added __ECOS__ support.
+
+ * misc/monitor_cmd.c: Cleanup. Added some more error handling.
+ * misc/utils.c: Ditto.
+
+ * misc/monitor.c: Added basic syscall handling to support libgloss.
+ Added support for using more features of the HAL (ie breakpoints
+ and exceptions).
+ * misc/monitor.h: Ditto.
+ * misc/tservice.h: Ditto.
+ * misc/bsp/bsp.h: Ditto.
+ * misc/arm/cpu_info.h: Ditto.
+
+ * misc/ledit.c: Cleanup.
+
+ * misc/ecos_dummy.c: Support for reset through the HAL.
+
+ * misc/ecos_bsp.c: Filled in uart_control function for setting baud rate
+ through the HAL. Also added VIRTUAL_VECTOR_SUPPORT and support of the
+ low-level HAL-based serial driver. Also added set_memsize() support.
+
+ * misc/bplist-dynamic.c: Added option for using breakpoints in the HAL.
+ Also, various cleanups of build warnings, etc.
+ * misc/breakpoints.c: Ditto.
+
+ * cdl/cygmon.cdl: Allow cygmon to be built for either Arm or Mips.
+
+ * misc/board.h: Move architecture-dependent things out.
+ * misc/cpu-mon.c: Ditto.
+ * misc/cpu_info.h: Ditto.
+ * misc/bsp/cpu.h: Ditto.
+ * misc/bsp/common/gdb-cpu.c: Ditto.
+ * misc/bsp/common/gdb-cpu.h: Ditto.
+ * misc/bsp/common/singlestep.c: Ditto.
+
+2000-01-28 Jesper Skov <jskov@redhat.com>
+
+ * misc/Notes_CygMon_PID: Added.
+
+2000-01-27 Jesper Skov <jskov@redhat.com>
+
+ * cdl/cygmon.cdl: Include hal.h config for CygMon options defined
+ by platform CDL.
+
+2000-01-26 Jonathan Larmour <jlarmour@redhat.co.uk>
+
+ * cdl/cygmon.cdl: Remove CYGDAT_CYGMON_ENABLE - no longer required
+
+2000-01-25 Jesper Skov <jskov@cygnus.co.uk>
+
+ * cdl/cygmon.cdl: Moved console device config to target CDL.
+ Let target CDL handle binary conversion.
+
+1999-12-17 Bart Veer <bartv@cygnus.co.uk>
+
+ * cdl/cygmon.cdl:
+ Fix a requires property, getting the quoting right
+
+1999-12-14 John Dallaway <jld@cygnus.co.uk>
+
+ * cdl/cygmon.cdl: Add custom make rule to build CygMon.
+
+1999-12-06 Gary Thomas <gthomas@cygnus.co.uk>
+
+ * misc/arm/arm-mon.c (machine_syscall):
+ * misc/ecos_bsp.c (_bsp_handle_exception):
+ * misc/PKGconf.mak: Adding 'syscall' support.
+
+ * misc/CygMon_PID.cfg:
+ * misc/bsp/common/syscall.h:
+ * misc/bsp/common/syscall.c: New file(s).
+
+1999-11-26 Jonathan Larmour <jlarmour@cygnus.co.uk>
+
+ * misc/CygMon_EDB7211.cfg: Rename to misc/CygMon/EDB7xxx.cfg
+ * misc/CygMon_EDB7xxx.cfg: New file
+
+1999-11-26 Gary Thomas <gthomas@cygnus.co.uk>
+
+ * misc/ecos_bsp.c (_bsp_board_init): Use/define HAL symbols
+ for board/cpu information.
+ (_bsp_memory_list): Use MLT information here.
+
+ * misc/CygMon_EDB7211.cfg: Fix typo. Change startup to be
+ ROM which gives more useful RAM information.
+
+1999-11-19 Gary Thomas <gthomas@cygnus.co.uk>
+
+ * misc/CygMon_EDB7211.cfg: Add platform parameter. Update
+ patch for latest changes.
+
+1999-11-03 Jesper Skov <jskov@cygnus.co.uk>
+
+ * cdl/cygmon.cdl: Added.
+
+1999-10-27 Gary Thomas <gthomas@cygnus.co.uk>
+
+ * misc/PKGconf.mak: Add new targets (.bin .srec images).
+
+ * include/pkgconf/cygmon.h: Update strings to be more conformant.
+
+ * misc/CygMon_EDB7211.cfg: New file for building CygMon.
+
+ * include/pkgconf/cygmon.h: Add work-around because packages
+ can't be disabled by default.
+
+1999-10-26 Gary Thomas <gthomas@cygnus.co.uk>
+
+ * include/pkgconf/cygmon.h: Fix typo 'CYGPKC_LIBC'=>'CYGPKG_LIBC'
+ Also, node type was wrong ('radio' instead of 'boolean')
+
+1999-10-25 Gary Thomas <gthomas@cygnus.co.uk>
+
+ * include/pkgconf/cygmon.h: Add configuration options for
+ console device [name] and extended help. Remove duplicate
+ boilerplate.
+
+ * misc/board.h: Enable "help" via configuration option.
+
+ * misc/ecos_bsp.c: Cleanup/remove extra (debug) code.
+ Add support for console port configuration.
+
+ * misc/monitor.c:
+ * misc/monitor_cmd.c: Cleanup/remove some debug code.
+
+//===========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//===========================================================================
diff --git a/cesar/ecos/packages/cygmon/current/cdl/cygmon.cdl b/cesar/ecos/packages/cygmon/current/cdl/cygmon.cdl
new file mode 100644
index 0000000000..04f4645a20
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/cdl/cygmon.cdl
@@ -0,0 +1,140 @@
+# ====================================================================
+#
+# cygmon.cdl
+#
+# CygMon package configuration data
+#
+# ====================================================================
+#####ECOSGPLCOPYRIGHTBEGIN####
+## -------------------------------------------
+## This file is part of eCos, the Embedded Configurable Operating System.
+## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+##
+## eCos 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 or (at your option) any later version.
+##
+## eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+##
+## As a special exception, if other files instantiate templates or use macros
+## or inline functions from this file, or you compile this file and link it
+## with other works to produce a work based on this file, this file does not
+## by itself cause the resulting work to be covered by the GNU General Public
+## License. However the source code for this file must still be made available
+## in accordance with section (3) of the GNU General Public License.
+##
+## This exception does not invalidate any other reasons why a work based on
+## this file might be covered by the GNU General Public License.
+##
+## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+## at http://sources.redhat.com/ecos/ecos-license/
+## -------------------------------------------
+#####ECOSGPLCOPYRIGHTEND####
+# ====================================================================
+######DESCRIPTIONBEGIN####
+#
+# Author(s): jskov
+# Original data: gthomas
+# Contributors: dmoseley
+# Date: 1999-11-03
+#
+#####DESCRIPTIONEND####
+#
+# ====================================================================
+cdl_package CYGPKG_CYGMON {
+ display "CygMon ROM monitor"
+ requires CYGPKG_LIBC_STRING
+ include_dir cyg/cygmon
+ define_header cygmon.h
+ description "
+ This package supports the CygMon \[stand-alone debug monitor\]
+ using eCos as the underlying board support mechanism."
+
+
+ # Since the CYGDAT_CYGMON_CONSOLE_DEV setting ends up in the platform
+ # HAL header, we need to include that here (via hal.h).
+ define_proc {
+ puts $::cdl_header "#include <pkgconf/hal.h>"
+ }
+
+ cdl_option CYGDAT_CYGMON_USE_HELP {
+ display "Include detailed command help"
+ default_value 1
+ description "
+ When this option is selected, the CygMon image will include
+ detailed help information for all built-in commands. Without
+ it, only minimal help will be provided."
+ }
+
+ cdl_option CYGBLD_BUILD_CYGMON {
+ display "Build CygMon ROM ELF image"
+ default_value 0
+ requires { CYG_HAL_STARTUP == "ROM" }
+ requires CYGPKG_INFRA
+ requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+ requires ! CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
+ requires ! CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
+ requires ! CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
+ requires CYGPKG_LIBC_STRING
+ requires ! CYGFUN_LIBC_strtod
+ requires ! CYGPKG_LIBC_STDIO
+ requires ! CYGSEM_LIBC_SIGNALS_THREAD_SAFE
+ requires ! CYGIMP_LIBC_SIGNALS_RAISE_INLINE
+ requires ! CYGIMP_LIBC_SIGNALS_SIGNAL_INLINE
+ requires ! CYGSEM_LIBC_SIGNALS_RAISE_SETS_ERRNO
+ requires ! CYGSEM_LIBC_SIGNALS_SIGNAL_SETS_ERRNO
+ requires ! CYGFUN_LIBC_ATEXIT
+ requires ! CYGSEM_LIBC_EXIT_CALLS_FFLUSH
+ requires ! CYGPKG_LIBC_ENVIRONMENT
+ requires ! CYGSEM_LIBC_PER_THREAD_ERRNO
+ requires ! CYGSEM_LIBC_TIME_TIME_WORKING
+ requires ! CYGSEM_LIBC_TIME_SETTIME_WORKING
+ requires { CYGPKG_HAL_ARM || CYGPKG_HAL_MIPS || CYGPKG_HAL_MN10300 }
+
+ no_define
+ description "This option enables the building of the CygMon ELF image.
+ The image may require further relocation or symbol
+ stripping before being converted to a binary image.
+ This is handled by a rule in the target CDL."
+
+ make -priority 320 {
+ <PREFIX>/bin/cygmon.elf : $(PREFIX)/lib/target.ld $(PREFIX)/lib/vectors.o $(PREFIX)/lib/libtarget.a $(PREFIX)/lib/libextras.a <PACKAGE>/misc/ecos_bsp.c <PACKAGE>/misc/ecos_dummy.c <PACKAGE>/misc/cpu-mon.c <PACKAGE>/misc/monitor.c <PACKAGE>/misc/monitor_cmd.c <PACKAGE>/misc/ledit.c <PACKAGE>/misc/breakpoints.c <PACKAGE>/misc/bplist-dynamic.c <PACKAGE>/misc/utils.c <PACKAGE>/misc/generic_fmt32.c <PACKAGE>/misc/generic_mem.c <PACKAGE>/misc/bsp/common/bsp.c <PACKAGE>/misc/bsp/common/bsp_if.c <PACKAGE>/misc/bsp/common/shared-data.c <PACKAGE>/misc/bsp/common/sysinfo.c <PACKAGE>/misc/bsp/common/console-io.c <PACKAGE>/misc/bsp/common/debug-io.c <PACKAGE>/misc/bsp/common/sprintf.c <PACKAGE>/misc/bsp/common/syscall.c <PACKAGE>/misc/bsp/common/printf.c <PACKAGE>/misc/bsp/common/vprintf.c <PACKAGE>/misc/bsp/common/breakpoint.c <PACKAGE>/misc/bsp/common/singlestep.c <PACKAGE>/misc/bsp/common/generic-mem.c <PACKAGE>/misc/bsp/common/bsp_cache.c <PACKAGE>/misc/bsp/common/gdb-cpu.c <PACKAGE>/misc/bsp/common/hex-utils.c
+ @sh -c "mkdir -p misc/bsp/common $(dir $@)"
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/ecos_bsp.o $(REPOSITORY)/$(PACKAGE)/misc/ecos_bsp.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/ecos_dummy.o $(REPOSITORY)/$(PACKAGE)/misc/ecos_dummy.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/cpu-mon.o $(REPOSITORY)/$(PACKAGE)/misc/cpu-mon.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/monitor.o $(REPOSITORY)/$(PACKAGE)/misc/monitor.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/monitor_cmd.o $(REPOSITORY)/$(PACKAGE)/misc/monitor_cmd.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/ledit.o $(REPOSITORY)/$(PACKAGE)/misc/ledit.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/breakpoints.o $(REPOSITORY)/$(PACKAGE)/misc/breakpoints.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bplist-dynamic.o $(REPOSITORY)/$(PACKAGE)/misc/bplist-dynamic.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/utils.o $(REPOSITORY)/$(PACKAGE)/misc/utils.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/generic_fmt32.o $(REPOSITORY)/$(PACKAGE)/misc/generic_fmt32.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/generic_mem.o $(REPOSITORY)/$(PACKAGE)/misc/generic_mem.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/bsp.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/bsp.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/bsp_if.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/bsp_if.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/shared-data.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/shared-data.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/sysinfo.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/sysinfo.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/console-io.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/console-io.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/debug-io.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/debug-io.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/sprintf.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/sprintf.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/syscall.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/syscall.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/printf.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/printf.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/vprintf.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/vprintf.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/breakpoint.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/breakpoint.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/singlestep.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/singlestep.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/generic-mem.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/generic-mem.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/bsp_cache.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/bsp_cache.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/gdb-cpu.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/gdb-cpu.c
+ $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/bsp/common/hex-utils.o $(REPOSITORY)/$(PACKAGE)/misc/bsp/common/hex-utils.c
+ $(CC) $(LDFLAGS) -L$(PREFIX)/lib -Ttarget.ld -o $@ $(filter-out %.ld %vectors.o, $(patsubst $(REPOSITORY)/$(PACKAGE)/%.c,%.o,$^))
+ }
+ }
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/Notes_CygMon_PID b/cesar/ecos/packages/cygmon/current/misc/Notes_CygMon_PID
new file mode 100644
index 0000000000..b1fed7674b
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/Notes_CygMon_PID
@@ -0,0 +1,168 @@
+===========================================================================
+#####ECOSGPLCOPYRIGHTBEGIN####
+## -------------------------------------------
+## This file is part of eCos, the Embedded Configurable Operating System.
+## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+##
+## eCos 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 or (at your option) any later version.
+##
+## eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+##
+## As a special exception, if other files instantiate templates or use macros
+## or inline functions from this file, or you compile this file and link it
+## with other works to produce a work based on this file, this file does not
+## by itself cause the resulting work to be covered by the GNU General Public
+## License. However the source code for this file must still be made available
+## in accordance with section (3) of the GNU General Public License.
+##
+## This exception does not invalidate any other reasons why a work based on
+## this file might be covered by the GNU General Public License.
+##
+## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+## at http://sources.redhat.com/ecos/ecos-license/
+## -------------------------------------------
+#####ECOSGPLCOPYRIGHTEND####
+===========================================================================
+
+28 Jan 2000
+
+How to build and install CygMon on the PID
+
+Make CygMon image
+~~~~~~~~~~~~~~~~~
+
+Configure and build using the 'cygmon' template for the PID
+target. These are the necessary CLI instructions. It can also be done
+from the Configtool by selecting the appropriate templates.
+
+ % cd /tmp
+ % mkdir cygmon
+ % cd cygmon
+ % ecosconfig new pid cygmon
+ % ecosconfig tree
+ % make
+
+This will install some files in ./install/bin:
+
+ cygmon.elf: The built CygMon image
+ cygmon.bin: The image converted to binary (suitable for burning to ROM)
+ cygmon.img: The relocated ELF image (suitable for FLASH writing, see below)
+ cygmon.srec: The image converted to srecords
+
+Make FLASH tool
+~~~~~~~~~~~~~~~
+
+Again, these are the necessary CLI instructions. It can also be done
+from the Configtool by selecting the appropriate templates, and
+enabling the option.
+
+ % cd /tmp
+ % mkdir pid-flash
+ % cd pid-flash
+ % ecosconfig new pid
+ % <edit ecos.ecc, enabling the CYGBLD_BUILD_FLASH_TOOL option:>
+ --- ecos.ecc.orig Fri Jan 28 11:21:43 2000
+ +++ ecos.ecc Fri Jan 28 11:22:01 2000
+ @@ -150,7 +150,7 @@
+ cdl_option CYGBLD_BUILD_FLASH_TOOL {
+ # Flavor: bool
+ # No user value, uncomment the following line to provide one.
+ - # user_value 0
+ + user_value 1
+ # value_source default
+ # Default value: 0
+ # Requires: CYG_HAL_STARTUP == "RAM"
+ % ecosconfig resolve
+ % ecosconfig tree
+ % make
+
+The flash tool is installed in ./install/bin
+
+Prepare board for CygMon
+~~~~~~~~~~~~~~~~~~~~~~~~
+ 1. Set jumper 7-8 on LK6 [using the Angle code in the 16 bit EPROM]
+ 2. Set jumper 5-6 on LK6 [select 8bit ROM mode]
+ 3. Set jumper LK18 [ROM remap - this is also required for eCos]
+ 4. Set S1 to 0-0-1-1 [20MHz operation]
+
+
+Program FLASH
+~~~~~~~~~~~~~
+ 1. Download the CygMon relocated image onto the PID board:
+ % cd /tmp
+ % arm-elf-gdb -nw cygmon/install/bin/cygmon.img
+
+ (gdb) target rdi s=<serial device>
+ Angel Debug Monitor V1.04 (Advanced RISC Machines SDT 2.11a) for PID
+ Built with Serial(x1), Parallel, DCC
+ Rebuilt on Apr 7 1998 at 22:20:43
+ Serial Rate: 9600
+ Connected to ARM RDI target.
+ (gdb) load
+ Loading section .rom_vectors, size 0x60 lma 0x60000
+ Loading section .text, size 0xeea8 lma 0x60060
+ Loading section .rodata, size 0x304c lma 0x6ef08
+ Loading section .data, size 0x7f8 lma 0x71f54
+ Start address 0x60060 , load size 75596
+ Transfer rate: 5548 bits/sec.
+ (gdb) quit
+
+ This will download the stubs onto the board at 0x60000..0x80000
+
+ Use /dev/ttyS0, COM1 or similar for the <serial device> name.
+
+ 2. Now download the FLASH programmer tool
+ % arm-elf-gdb -nw pid-flash/install/bin/prog_flash.img
+
+ (gdb) target rdi s=<serial device>
+ Angel Debug Monitor V1.04 (Advanced RISC Machines SDT 2.11a) for PID
+ Built with Serial(x1), Parallel, DCC
+ Rebuilt on Apr 7 1998 at 22:20:43
+ Serial Rate: 9600
+ Connected to ARM RDI target.
+ (gdb) load
+ Loading section .rom_vectors, size 0x60 lma 0x4000
+ Loading section .text, size 0x4964 lma 0x4060
+ Loading section .rodata, size 0x384 lma 0x89c4
+ Loading section .data, size 0x28c lma 0x8d48
+ Start address 0x4060 , load size 20436
+ Transfer rate: 5449 bits/sec.
+ (gdb) cont
+
+ 3. The FLASH tool will output some text on the board serial port B at
+ 38400 baud:
+
+ ARM eCos
+ FLASH here!
+ manuf: 8, device: 40
+ Error: Wrong Manufaturer: 08
+ ... Please change FLASH jumper
+
+ 4. This text is repeated until you remove the jumper 7-8 on LK6. Then
+ the output should be:
+
+ manuf: 1F, device: A4
+ AT29C040A recognised
+ About to program FLASH using data at 60000..80000
+ *** Press RESET now to abort!
+
+ 5. You have about 10 seconds to abort the operation by pressing
+ reset. After this timeout, the FLASH programming happens:
+
+ ...Programming FLASH
+ All done!
+
+ 6. Quit/kill the GDB process which will hang.
+
+ 7. Next time you reset the board, CygMon will be in control, communicating
+ on serial port A at 38400 baud. See documentation for further details
+ on how to connect with GDB.
diff --git a/cesar/ecos/packages/cygmon/current/misc/arm/arm-mon.c b/cesar/ecos/packages/cygmon/current/misc/arm/arm-mon.c
new file mode 100644
index 0000000000..30283f72b1
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/arm/arm-mon.c
@@ -0,0 +1,281 @@
+//==========================================================================
+//
+// arm-mon.c
+//
+// Support code to extend the generic monitor code to support
+// ARM(R) processors.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Support code to extend the generic monitor code to support
+// ARM(R) processors.
+// Description: Further board specific support is in other files.
+// This file contains:
+// register names lookup table
+//
+// Empty Stubs:
+// Interval timer - This should really belong to the application
+// operating system.
+//
+// Should not contain:
+// low level uart getchar and putchar functions
+// delay function to support uart
+//
+// ARM is a Registered Trademark of Advanced RISC Machines
+// Limited.
+// Other Brands and Trademarks are the property of their
+// respective owners.
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <setjmp.h>
+#include <bsp/bsp.h>
+#include <bsp/cpu.h>
+#ifdef DISASSEMBLER
+#include <dis-asm.h>
+#endif
+
+#include "cpu_info.h"
+#include "monitor.h"
+
+/* This module is required to provide many of the services defined
+ in tservice.h */
+
+static char *apcs_names[] = {
+ "a1", "a2", "a3", "a4",
+ "v1", "v2", "v3", "v4",
+ "v5", "v6", "sl", "fp",
+ "ip", "sp", "lr", "pc",
+#if HAVE_FLOAT_REGS
+ "f0", "f1", "f2", "f3",
+ "f4", "f5", "f6", "f7",
+ "fps",
+#endif
+ "ps"
+};
+
+static char *standard_names[] =
+{
+ "r0", "r1", "r2", "r3",
+ "r4", "r5", "r6", "r7",
+ "r8", "r9", "r10", "r11",
+ "r12", "r13", "r14", "pc",
+#if HAVE_FLOAT_REGS
+ "f0", "f1", "f2", "f3",
+ "f4", "f5", "f6", "f7",
+ "fps",
+#endif
+ "ps",
+};
+
+
+void arm_othernames (void);
+
+struct regstruct regtab[] =
+{
+ { 0, REG_R0, REGTYPE_INT },
+ { 0, REG_R1, REGTYPE_INT },
+ { 0, REG_R2, REGTYPE_INT },
+ { 0, REG_R3, REGTYPE_INT },
+ { 0, REG_R4, REGTYPE_INT },
+ { 0, REG_R5, REGTYPE_INT },
+ { 0, REG_R6, REGTYPE_INT },
+ { 0, REG_R7, REGTYPE_INT },
+ { 0, REG_R8, REGTYPE_INT },
+ { 0, REG_R9, REGTYPE_INT },
+ { 0, REG_R10, REGTYPE_INT },
+ { 0, REG_R11, REGTYPE_INT },
+ { 0, REG_R12, REGTYPE_INT },
+ { 0, REG_SP, REGTYPE_INT },
+ { 0, REG_LR, REGTYPE_INT },
+ { 0, REG_PC, REGTYPE_INT },
+#if HAVE_FLOAT_REGS
+ { 0, REG_F0, REGTYPE_FLOAT },
+ { 0, REG_F1, REGTYPE_FLOAT },
+ { 0, REG_F2, REGTYPE_FLOAT },
+ { 0, REG_F3, REGTYPE_FLOAT },
+ { 0, REG_F4, REGTYPE_FLOAT },
+ { 0, REG_F5, REGTYPE_FLOAT },
+ { 0, REG_F6, REGTYPE_FLOAT },
+ { 0, REG_F6, REGTYPE_FLOAT },
+ { 0, REG_FPS, REGTYPE_FLOAT },
+#endif
+ { 0, REG_CPSR, REGTYPE_INT },
+ { 0, 0, 0 } /* Terminating element must be last */
+} ;
+
+void
+initialize_mon(void)
+{
+ /* FIXME: Convert ALL variable initializations to assignments
+ in order to support ROMABLE CODE.
+ This includes the register table
+ */
+
+ /*
+ * Call arm_othernames to sync up Cygmon and the disassembler
+ * and ensure they are using the same set of registernames
+ */
+ arm_othernames();
+
+ /*
+ * Call arm_othernames again to revert to the assembler
+ * default names
+ */
+ arm_othernames();
+
+} /* initialize_mon */
+
+
+/*
+ read_memory
+ write_memory
+ Defaults to generic_mem.c
+ */
+
+
+/* SET_BREAKPOINT -
+ CLEAR_BREAKPOINT
+ Defaults to generic_bp32.c
+ */
+
+
+#ifndef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+
+/* Return the currently-saved value corresponding to register "regnum". */
+target_regval_t
+get_register (int regnum)
+{
+ struct regstruct *p;
+ target_regval_t reg;
+ int offset, len;
+ char *dest = (char*)0;
+
+ for (p = regtab; p->registername && p->registernumber != regnum; ++p)
+ ;
+
+ if (p->registername) {
+ len = bsp_regsize(p->registernumber);
+ offset = bsp_regbyte(p->registernumber);
+ switch (p->registertype) {
+ case REGTYPE_INT:
+ dest = (char*)&(reg.i);
+ break;
+#if HAVE_FLOAT_REGS
+ case REGTYPE_FLOAT:
+ dest = (char*)&(reg.f);
+ break;
+#endif
+#if HAVE_DOUBLE_REGS
+ case REGTYPE_DOUBLE:
+ dest = (char*)&(reg.d);
+ break;
+#endif
+ }
+ if (dest)
+ memcpy(dest, (char *)mon_saved_regs + offset, len);
+ } else
+ reg.i = 0;
+
+ return reg;
+}
+
+
+
+/* Store VALUE in the register corresponding to REGNUM. */
+void
+put_register (int regnum, target_regval_t value)
+{
+ int offset, len;
+
+ len = bsp_regsize(regnum);
+ offset = bsp_regbyte(regnum);
+ memcpy((char *)mon_saved_regs + offset, &value, len);
+}
+
+#endif // !CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+
+/* Change to the alternate register set names */
+void
+arm_othernames (void)
+{
+ static int regset = 1;
+ char **name;
+ int i;
+
+#ifdef DISASSEMBLER
+ /* Change the disassembler */
+ regset = arm_toggle_regnames();
+#else
+ regset = (regset == 0) ? 1 : 0;
+#endif
+
+ /* Change cygmon */
+ if (regset == 1)
+ /* Disassembler is using apcs names. */
+ name = apcs_names;
+ else
+ /* Disassembler is using standard names. */
+ name = standard_names;
+
+ for (i = 0; i < (sizeof(apcs_names)/sizeof(apcs_names[0])); i++)
+ regtab[i].registername = name[i];
+}
+
+#ifdef __ECOS__
+
+#include <pkgconf/hal.h>
+#include <cyg/hal/hal_arch.h>
+#include "bsp/common/bsp_if.h"
+
+int
+machine_syscall(HAL_SavedRegisters *regs)
+{
+ int res, err;
+ err = _bsp_do_syscall(regs->d[0], // Function
+ regs->d[1], regs->d[2], regs->d[3], 0, // arguments,
+ &res);
+ regs->d[0] = res;
+ regs->pc += 4; // Advance PC
+ return err;
+}
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/arm/board.h b/cesar/ecos/packages/cygmon/current/misc/arm/board.h
new file mode 100644
index 0000000000..f84b8313e8
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/arm/board.h
@@ -0,0 +1,82 @@
+#ifndef __CYGMON_ARM_BOARD_H__
+#define __CYGMON_ARM_BOARD_H__
+//==========================================================================
+//
+// board.h
+//
+// Cygmon board/platform configuration file
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+// Hardware/platform/configuration specifics
+
+#include <pkgconf/hal.h>
+#include <pkgconf/cygmon.h>
+
+#define HAVE_FLOAT_REGS 0
+#define HAVE_DOUBLE_REGS 0
+#define HAVE_CACHE 0 // FIXME
+#define HAVE_USAGE 0 // FIXME
+#define USE_CYGMON_PROTOTYPES 1
+#define NOMAIN 1
+#define CYGMON_SYSTEM_SERVICES 0 // Not used, fall back to BSP support
+#ifdef CYGDAT_CYGMON_USE_HELP
+#define USE_HELP 1
+#endif
+
+// For breakpoint support
+#define NO_MALLOC 1
+#define MAX_BP_NUM 8
+#include "cpu_info.h"
+#define TRAP_SIZE 4
+#define __set_breakpoint set_breakpoint
+#define __remove_breakpoint clear_breakpoint
+#define __write_mem_safe memcpy
+#define WRITE_MEM_IS_MEMCPY
+#define _breakinst bsp_breakinsn
+
+#endif // __CYGMON_ARM_BOARD_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/arm/cpu.h b/cesar/ecos/packages/cygmon/current/misc/arm/cpu.h
new file mode 100644
index 0000000000..607f0d58a0
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/arm/cpu.h
@@ -0,0 +1,978 @@
+#ifndef __ARM_CPU_H__
+#define __ARM_CPU_H__
+//==========================================================================
+//
+// cpu.h
+//
+// ARM specific processor defines
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: ARM specific processor defines
+// Description: ARM is a Registered Trademark of Advanced RISC Machines
+// Limited.
+// Other Brands and Trademarks are the property of their
+// respective owners.
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <bsp/bsp.h>
+#include <bsp/defs.h>
+#ifdef __ECOS__
+#include <cyg/hal/hal_arch.h>
+#endif
+
+/*
+ * Only define __NEED_UNDERSCORE__ for arm-coff targets
+ */
+#if !defined(__ELF__)
+# define __NEED_UNDERSCORE__
+#endif
+
+/*
+ * Macros to glue together two tokens.
+ */
+# ifdef __STDC__
+# define XGLUE(a,b) a##b
+# else
+# define XGLUE(a,b) a/**/b
+# endif
+
+# define GLUE(a,b) XGLUE(a,b)
+
+/*
+ * Symbol Names with leading underscore if necessary
+ */
+# ifdef __NEED_UNDERSCORE__
+# define SYM_NAME(name) GLUE(_,name)
+# else
+# define SYM_NAME(name) name
+# endif /* __NEED_UNDERSCORE__ */
+
+/*
+ * Various macros to better handle assembler/object format differences
+ */
+#if defined(__ASSEMBLER__)
+
+/*
+ * Assembly function start definition
+ */
+#ifdef __NEED_UNDERSCORE__
+.macro FUNC_START name
+ .global _\name
+ .align 4
+ _\name:
+.endm
+#else
+.macro FUNC_START name
+ .global \name
+ .align 4
+ \name:
+.endm
+#endif
+
+/*
+ * Assembly function end definition
+ */
+#ifdef __NEED_UNDERSCORE__
+.macro FUNC_END name
+.endm
+#else
+.macro FUNC_END name
+.endm
+#endif
+
+/*
+ * Register Prefix
+ */
+# ifndef __REGISTER_PREFIX__
+# define __REGISTER_PREFIX__
+# endif /* __REGISTER_PREFIX__ */
+
+/*
+ * Immediate Prefix
+ */
+# ifndef __IMM_PREFIX__
+# define __IMM_PREFIX__ #
+# endif /* __IMM_PREFIX__ */
+
+/*
+ * use the right prefix for registers.
+ */
+# define REG(x) GLUE(__REGISTER_PREFIX__,x)
+
+/*
+ * use the right prefix for immediate values.
+ */
+# define IMM(x) GLUE(__IMM_PREFIX__,x)
+
+#endif /* defined(__ASSEMBLER__) */
+
+
+/*
+ * Setup register defines and such
+ */
+#if defined(__ASSEMBLER__)
+
+# define r0 REG (r0)
+# define r1 REG (r1)
+# define r2 REG (r2)
+# define r3 REG (r3)
+
+# define r4 REG (r4)
+# define r5 REG (r5)
+# define r6 REG (r6)
+# define r7 REG (r7)
+# define r8 REG (r8)
+# define r9 REG (r9)
+# define r10 REG (r10)
+# define r11 REG (r11)
+# define r12 REG (r12)
+# define r13 REG (r13)
+# define sp REG (sp)
+# define r14 REG (r14)
+# define lr REG (lr)
+# define pc REG (pc)
+
+# define f0 REG (f0)
+# define f1 REG (f1)
+# define f2 REG (f2)
+# define f3 REG (f3)
+# define f4 REG (f4)
+# define f5 REG (f5)
+# define f6 REG (f6)
+# define f7 REG (f7)
+# define fps REG (fps)
+
+# define cpsr REG (cpsr)
+# define spsr REG (spsr)
+
+/*
+ * Register offset definitions
+ * These numbers are offsets into the ex_regs_t struct.
+ */
+# define r0_o 0
+# define r1_o 4
+# define r2_o 8
+# define r3_o 12
+# define r4_o 16
+# define r5_o 20
+# define r6_o 24
+# define r7_o 28
+# define r8_o 32
+# define r9_o 36
+# define r10_o 40
+# define r11_o 44
+# define r12_o 48
+# define r13_o 52
+# define sp_o r13_o
+# define r14_o 56
+# define lr_o r14_o
+# define pc_o 60
+
+# define f0_o 64
+# define f1_o 76
+# define f2_o 88
+# define f3_o 100
+# define f4_o 112
+# define f5_o 124
+# define f6_o 136
+# define f7_o 148
+# define fps_o 160
+
+# define cpsr_o 164
+# define spsvc_o 168
+# define ARM_EX_REGS_T_SIZE 172
+
+#else /* !defined(__ASSEMBLER__) */
+
+ /*
+ * Register name that is used in help strings and such
+ */
+# define REGNAME_EXAMPLE "r0"
+
+ /*
+ * Register numbers. These are assumed to match the
+ * register numbers used by GDB.
+ */
+ enum __regnames {
+ REG_R0,
+ REG_R1,
+ REG_R2,
+ REG_R3,
+ REG_R4,
+ REG_R5,
+ REG_R6,
+ REG_R7,
+ REG_R8,
+ REG_R9,
+ REG_R10,
+ REG_R11,
+ REG_R12,
+ REG_R13,
+ REG_SP=REG_R13,
+ REG_R14,
+ REG_LR=REG_R14,
+ REG_PC,
+
+ REG_F0,
+ REG_F1,
+ REG_F2,
+ REG_F3,
+ REG_F4,
+ REG_F5,
+ REG_F6,
+ REG_F7,
+ REG_FPS,
+
+ REG_CPSR,
+ REG_SPSVC,
+ REG_MAX=REG_SPSVC
+ };
+
+ /*
+ * 12-byte struct for storing Floating point registers
+ */
+ typedef struct
+ {
+ unsigned long high;
+ unsigned long middle;
+ unsigned long low;
+ } fp_reg;
+
+ /*
+ * How registers are stored for exceptions.
+ */
+#ifdef __ECOS__
+#define ex_regs_t HAL_SavedRegisters
+#define _r0 d[0]
+#define _r1 d[1]
+#define _r2 d[2]
+#define _r3 d[3]
+#define _r4 d[4]
+#define _r5 d[5]
+#define _r6 d[6]
+#define _r7 d[7]
+#define _r8 d[8]
+#define _r9 d[9]
+#define _r10 d[10]
+#define _r11 fp
+#define _r12 ip
+#define _r13 sp
+#define _r14 lr
+#define _pc pc
+#define _cpsr cpsr
+#define _spsvc msr
+#else
+ typedef struct
+ {
+ unsigned long _r0;
+ unsigned long _r1;
+ unsigned long _r2;
+ unsigned long _r3;
+ unsigned long _r4;
+ unsigned long _r5;
+ unsigned long _r6;
+ unsigned long _r7;
+ unsigned long _r8;
+ unsigned long _r9;
+ unsigned long _r10;
+ unsigned long _r11;
+ unsigned long _r12;
+ unsigned long _r13;
+ unsigned long _r14;
+ unsigned long _pc;
+
+ fp_reg _f0;
+ fp_reg _f1;
+ fp_reg _f2;
+ fp_reg _f3;
+ fp_reg _f4;
+ fp_reg _f5;
+ fp_reg _f6;
+ fp_reg _f7;
+ unsigned long _fps;
+ unsigned long _cpsr;
+
+ unsigned long _spsvc; /* saved svc mode sp */
+
+ } ex_regs_t;
+#endif
+# define _sp _r13
+# define _lr _r14
+
+extern void __icache_flush(void *addr, int nbytes);
+extern void __dcache_flush(void *addr, int nbytes);
+
+#endif /* __ASSEMBLER__ */
+
+
+/*
+ * Program Status Register Definitions
+ */
+#if defined(__ASSEMBLER__)
+# define ARM_PSR_NEGATIVE 0x80000000 /* Negative Bit */
+# define ARM_PSR_ZERO 0x40000000 /* Zero Bit */
+# define ARM_PSR_CARRY 0x20000000 /* Carry Bit */
+# define ARM_PSR_OVERFLOW 0x10000000 /* Overflow Bit */
+# define ARM_PSR_IRQ 0x00000080 /* IRQ Bit */
+# define ARM_PSR_FIQ 0x00000040 /* FIQ Bit */
+# define ARM_PSR_THUMB_STATE 0x00000020 /* Thumb/ARM(R) Execution */
+# define ARM_PSR_MODE_MASK 0x0000001F /* ARM(R) Processor Mode Mask */
+#else /* ! defined(__ASSEMBLER__) */
+ struct psr_struct {
+ unsigned mode : 5;
+ unsigned t_bit : 1;
+ unsigned f_bit : 1;
+ unsigned i_bit : 1;
+ unsigned rsv1 : 20; /* == 0x00000 */
+ unsigned v_bit : 1;
+ unsigned c_bit : 1;
+ unsigned z_bit : 1;
+ unsigned n_bit : 1;
+ };
+
+ union arm_psr {
+ unsigned long word;
+ struct psr_struct psr;
+ };
+#endif /* __ASSEMBLER__ */
+
+/*
+ * PSR Mode values
+ */
+#define ARM_PSR_MODE_USER 0x00000010 /* User mode */
+#define ARM_PSR_MODE_FIQ 0x00000011 /* FIQ mode */
+#define ARM_PSR_MODE_IRQ 0x00000012 /* IRQ mode */
+#define ARM_PSR_MODE_SVC 0x00000013 /* SVC mode */
+#define ARM_PSR_MODE_ABORT 0x00000017 /* ABORT mode */
+#define ARM_PSR_MODE_UNDEF 0x0000001B /* UNDEF mode */
+#define ARM_PSR_MODE_SYSTEM 0x0000001F /* System Mode */
+#define ARM_PSR_NUM_MODES 7
+
+/*
+ * Core Exception vectors.
+ */
+#define BSP_CORE_EXC_RESET 0
+#define BSP_CORE_EXC_UNDEFINED_INSTRUCTION 1
+#define BSP_CORE_EXC_SOFTWARE_INTERRUPT 2
+#define BSP_CORE_EXC_PREFETCH_ABORT 3
+#define BSP_CORE_EXC_DATA_ABORT 4
+#define BSP_CORE_EXC_ADDRESS_ERROR_26_BIT 5
+#define BSP_CORE_EXC_IRQ 6
+#define BSP_CORE_EXC_FIQ 7
+#define BSP_MAX_EXCEPTIONS 8
+#define BSP_CORE_EXC(vec_num) (unsigned long*)(vec_num << 2)
+
+#define BREAKPOINT_INSN 0xE7FFDEFE /* Illegal inst opcode */
+#define SYSCALL_SWI 0x00180001
+
+#if defined(__ASSEMBLER__)
+ .macro BREAKPOINT
+ .word BREAKPOINT_INSN
+ .endm
+ .macro SYSCALL
+ swi IMM(SYSCALL_SWI)
+ .endm
+ .macro __CLI
+ stmfd sp!, {r0}
+ mrs r0, cpsr
+ bic r0, r0, IMM(ARM_PSR_IRQ | ARM_PSR_FIQ)
+ msr cpsr, r0
+ ldmfd sp!, {r0}
+ .endm
+ .macro __STI
+ stmfd sp!, {r0}
+ mrs r0, cpsr
+ orr r0, r0, IMM(ARM_PSR_IRQ | ARM_PSR_FIQ)
+ msr cpsr, r0
+ ldmfd sp!, {r0}
+ .endm
+
+# if 0
+ /*
+ * Use this code to verify a particular processing mode
+ */
+ mrs r0, cpsr
+ and r0, r0, IMM(ARM_PSR_MODE_MASK)
+ ldr r1, =ARM_PSR_MODE_IRQ
+ cmps r0, r1
+0: bne 0b
+ PORT_TOGGLE_DEBUG
+# endif /* 0 */
+
+#else /* !defined(__ASSEMBLER__) */
+
+# define BREAKPOINT() asm volatile(" .word 0xE7FFDEFE")
+# define SYSCALL() asm volatile(" swi %0" : /* No outputs */ : "i" (SYSCALL_SWI))
+# define __cli() asm volatile("
+ stmfd sp!, {r0}
+ mrs r0, cpsr
+ bic r0, r0, #0x000000C0
+ msr cpsr, r0
+ ldmfd sp!, {r0}")
+# define __sti() asm volatile("
+ stmfd sp!, {r0}
+ mrs r0, cpsr
+ orr r0, r0, #0x000000C0
+ msr cpsr, r0
+ ldmfd sp!, {r0}")
+# define __mcr(cp_num, opcode1, Rd, CRn, CRm, opcode2) \
+ asm volatile (" mcr " cp_num ", " \
+ opcode1 ", " \
+ "%0" ", " \
+ CRn ", " \
+ CRm ", " \
+ opcode2 : /* no outputs */ : "r" (Rd))
+# define __mrc(cp_num, opcode1, Rd, CRn, CRm, opcode2) \
+ asm volatile (" mrc " cp_num ", " \
+ opcode1 ", " \
+ "%0" ", " \
+ CRn ", " \
+ CRm ", " \
+ opcode2 : "=r" (Rd) : /* no inputs */)
+
+ static inline unsigned __get_cpsr(void)
+ {
+ unsigned long retval;
+ asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_cpsr(unsigned val)
+ {
+ asm volatile (" msr cpsr, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_spsr(void)
+ {
+ unsigned long retval;
+ asm volatile (" mrs %0, spsr" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_spsr(unsigned val)
+ {
+ asm volatile (" msr spsr, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_sp(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, sp" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_sp(unsigned val)
+ {
+ asm volatile (" mov sp, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_fp(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, fp" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_fp(unsigned val)
+ {
+ asm volatile (" mov fp, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_pc(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, pc" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_pc(unsigned val)
+ {
+ asm volatile (" mov pc, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_lr(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, lr" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_lr(unsigned val)
+ {
+ asm volatile (" mov lr, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_r8(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, r8" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_r8(unsigned val)
+ {
+ asm volatile (" mov r8, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_r9(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, r9" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_r9(unsigned val)
+ {
+ asm volatile (" mov r9, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_r10(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, r10" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_r10(unsigned val)
+ {
+ asm volatile (" mov r10, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_r11(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, r11" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_r11(unsigned val)
+ {
+ asm volatile (" mov r11, %0" : /* no outputs */ : "r" (val) );
+ }
+
+ static inline unsigned __get_r12(void)
+ {
+ unsigned long retval;
+ asm volatile (" mov %0, r12" : "=r" (retval) : /* no inputs */ );
+ return retval;
+ }
+
+ static inline void __set_r12(unsigned val)
+ {
+ asm volatile (" mov r12, %0" : /* no outputs */ : "r" (val) );
+ }
+
+#endif /* defined(__ASSEMBLER__) */
+
+#define GDB_BREAKPOINT_VECTOR BSP_CORE_EXC_UNDEFINED_INSTRUCTION
+#define GDB_SYSCALL_VECTOR BSP_CORE_EXC_SOFTWARE_INTERRUPT
+
+#define ARM_INST_SIZE sizeof(unsigned long)
+#define GDB_BREAKPOINT_INST_SIZE ARM_INST_SIZE
+
+#ifdef __CPU_LH77790A__
+# include <bsp/lh77790a.h>
+#endif /* __CPU_LH77790A__ */
+
+#if !defined(__ASSEMBLER__)
+/*
+ * Define the CPU specific data
+ */
+#ifdef __CPU_LH77790A__
+ typedef struct {
+ unsigned char lh77790a_port_control_shadow;
+ } arm_cpu_data;
+#endif /* __CPU_LH77790A__ */
+#endif /* !defined(__ASSEMBLER__) */
+
+#ifdef __CPU_SA110__
+#include <bsp/sa-110.h>
+#endif /* __CPU_SA110__ */
+
+#ifdef __CPU_SA1100__
+#include <bsp/sa-1100.h>
+#endif /* __CPU_SA110__ */
+
+#ifdef __CPU_710T__
+#include <bsp/arm710t.h>
+#endif /* __CPU_710T__ */
+
+#ifdef MMU
+/*
+ * ARM(R) MMU Definitions
+ */
+
+#ifndef __ASSEMBLER__
+extern void *page1;
+#endif /* __ASSEMBLER__ */
+
+/*
+ * ARM(R) Cache and MMU Control Registers
+ *
+ * Accessed through coprocessor instructions.
+ */
+#ifdef __ASSEMBLER__
+# define ARM_CACHE_COPROCESSOR_NUM p15
+# define ARM_COPROCESSOR_OPCODE_DONT_CARE 0x0
+# define ARM_COPROCESSOR_RM_DONT_CARE c0
+#else /* __ASSEMBLER__ */
+# define ARM_CACHE_COPROCESSOR_NUM "p15"
+# define ARM_COPROCESSOR_OPCODE_DONT_CARE "0x0"
+# define ARM_COPROCESSOR_RM_DONT_CARE "c0"
+#endif /* __ASSEMBLER__ */
+
+#ifdef __ASSEMBLER__
+# define ARM_ID_REGISTER c0
+# define ARM_CONTROL_REGISTER c1
+# define ARM_TRANSLATION_TABLE_BASE_REGISTER c2
+# define ARM_DOMAIN_ACCESS_CONTROL_REGISTER c3
+# define ARM_FAULT_STATUS_REGISTER c5
+# define ARM_FAULT_ADDRESS_REGISTER c6
+# define ARM_CACHE_OPERATIONS_REGISTER c7
+# define ARM_TLB_OPERATIONS_REGISTER c8
+# define ARM_READ_BUFFER_OPERATIONS_REGISTER c9
+#else /* __ASSEMBLER__ */
+# define ARM_ID_REGISTER "c0"
+# define ARM_CONTROL_REGISTER "c1"
+# define ARM_TRANSLATION_TABLE_BASE_REGISTER "c2"
+# define ARM_DOMAIN_ACCESS_CONTROL_REGISTER "c3"
+# define ARM_FAULT_STATUS_REGISTER "c5"
+# define ARM_FAULT_ADDRESS_REGISTER "c6"
+# define ARM_CACHE_OPERATIONS_REGISTER "c7"
+# define ARM_TLB_OPERATIONS_REGISTER "c8"
+# define ARM_READ_BUFFER_OPERATIONS_REGISTER "c9"
+#endif /* __ASSEMBLER__ */
+
+/*
+ * SA-1100 Cache and MMU ID Register value
+ */
+#define ARM_ID_MASK 0xFFFFFFF0
+#define ARM_ID_VALUE 0x4401a110
+
+/*
+ * SA-1100 Cache Control Register Bit Fields and Masks
+ */
+#define ARM_MMU_DISABLED 0x00000000
+#define ARM_MMU_ENABLED 0x00000001
+#define ARM_MMU_MASK 0x00000001
+#define ARM_ADDRESS_FAULT_DISABLED 0x00000000
+#define ARM_ADDRESS_FAULT_ENABLED 0x00000002
+#define ARM_ADDRESS_FAULT_MASK 0x00000002
+#define ARM_DATA_CACHE_DISABLED 0x00000000
+#define ARM_DATA_CACHE_ENABLED 0x00000004
+#define ARM_DATA_CACHE_MASK 0x00000004
+#define ARM_WRITE_BUFFER_DISABLED 0x00000000
+#define ARM_WRITE_BUFFER_ENABLED 0x00000008
+#define ARM_WRITE_BUFFER_MASK 0x00000008
+#define ARM_LITTLE_ENDIAN 0x00000000
+#define ARM_BIG_ENDIAN 0x00000080
+#define ARM_ACCESS_CHECKS_NONE 0x00000000
+#define ARM_ACCESS_CHECKS_SYSTEM 0x00000100
+#define ARM_ACCESS_CHECKS_ROM 0x00000200
+#define ARM_INSTRUCTION_CACHE_DISABLED 0x00000000
+#define ARM_INSTRUCTION_CACHE_ENABLED 0x00001000
+#define ARM_INSTRUCTION_CACHE_MASK 0x00001000
+#define ARM_VIRTUAL_IVR_BASE_00000000 0x00000000
+#define ARM_VIRTUAL_IVR_BASE_FFFF0000 0x00002000
+#define ARM_CONTROL_SBZ_MASK 0x00001FFF
+
+/*
+ * SA-1100 Translation Table Base Bit Masks
+ */
+#define ARM_TRANSLATION_TABLE_MASK 0xFFFFC000
+
+/*
+ * SA-1100 Domain Access Control Bit Masks
+ */
+#define ARM_DOMAIN_0_MASK 0x00000003
+#define ARM_DOMAIN_1_MASK 0x0000000C
+#define ARM_DOMAIN_2_MASK 0x00000030
+#define ARM_DOMAIN_3_MASK 0x000000C0
+#define ARM_DOMAIN_4_MASK 0x00000300
+#define ARM_DOMAIN_5_MASK 0x00000C00
+#define ARM_DOMAIN_6_MASK 0x00003000
+#define ARM_DOMAIN_7_MASK 0x0000C000
+#define ARM_DOMAIN_8_MASK 0x00030000
+#define ARM_DOMAIN_9_MASK 0x000C0000
+#define ARM_DOMAIN_10_MASK 0x00300000
+#define ARM_DOMAIN_11_MASK 0x00C00000
+#define ARM_DOMAIN_12_MASK 0x03000000
+#define ARM_DOMAIN_13_MASK 0x0C000000
+#define ARM_DOMAIN_14_MASK 0x30000000
+#define ARM_DOMAIN_15_MASK 0xC0000000
+
+#define ARM_ACCESS_TYPE_NO_ACCESS(domain_num) (0x0 << (domain_num))
+#define ARM_ACCESS_TYPE_CLIENT(domain_num) (0x1 << (domain_num))
+#define ARM_ACCESS_TYPE_MANAGER(domain_num) (0x3 << (domain_num))
+
+/*
+ * SA-1100 Fault Status Bit Masks
+ */
+#define ARM_FAULT_STATUS_MASK 0x0000000F
+#define ARM_DOMAIN_MASK 0x000000F0
+#define ARM_DATA_BREAKPOINT_MASK 0x00000200
+
+/*
+ * SA-1100 Cache Control Operations Definitions
+ */
+#ifdef __ASSEMBLER__
+# define ARM_FLUSH_CACHE_INST_DATA_OPCODE 0x0
+# define ARM_FLUSH_CACHE_INST_DATA_RM c7
+# define ARM_FLUSH_CACHE_INST_OPCODE 0x0
+# define ARM_FLUSH_CACHE_INST_RM c5
+# define ARM_FLUSH_CACHE_DATA_OPCODE 0x0
+# define ARM_FLUSH_CACHE_DATA_RM c6
+# define ARM_FLUSH_CACHE_DATA_SINGLE_OPCODE 0x1
+# define ARM_FLUSH_CACHE_DATA_SINGLE_RM c6
+# define ARM_CLEAN_CACHE_DATA_ENTRY_OPCODE 0x1
+# define ARM_CLEAN_CACHE_DATA_ENTRY_RM c10
+# define ARM_DRAIN_CACHE_WRITE_BUFFER_OPCODE 0x4
+# define ARM_DRAIN_CACHE_WRITE_BUFFER_RM c10
+#else /* __ASSEMBLER__ */
+# define ARM_FLUSH_CACHE_INST_DATA_OPCODE "0x0"
+# define ARM_FLUSH_CACHE_INST_DATA_RM "c7"
+# define ARM_FLUSH_CACHE_INST_OPCODE "0x0"
+# define ARM_FLUSH_CACHE_INST_RM "c5"
+# define ARM_FLUSH_CACHE_DATA_OPCODE "0x0"
+# define ARM_FLUSH_CACHE_DATA_RM "c6"
+# define ARM_FLUSH_CACHE_DATA_SINGLE_OPCODE "0x1"
+# define ARM_FLUSH_CACHE_DATA_SINGLE_RM "c6"
+# define ARM_CLEAN_CACHE_DATA_ENTRY_OPCODE "0x1"
+# define ARM_CLEAN_CACHE_DATA_ENTRY_RM "c10"
+# define ARM_DRAIN_CACHE_WRITE_BUFFER_OPCODE "0x4"
+# define ARM_DRAIN_CACHE_WRITE_BUFFER_RM "c10"
+#endif /* __ASSEMBLER__ */
+
+/*
+ * SA-1100 TLB Operations Definitions
+ */
+#ifdef __ASSEMBLER__
+# define ARM_FLUSH_INST_DATA_TLB_OPCODE 0x0
+# define ARM_FLUSH_INST_DATA_TLB_RM c7
+# define ARM_FLUSH_INST_TLB_OPCODE 0x0
+# define ARM_FLUSH_INST_TLB_RM c5
+# define ARM_FLUSH_DATA_TLB_OPCODE 0x0
+# define ARM_FLUSH_DATA_TLB_RM c6
+# define ARM_FLUSH_DATA_ENTRY_TLB_OPCODE 0x1
+# define ARM_FLUSH_DATA_ENTRY_TLB_RM c6
+#else /* __ASSEMBLER__ */
+# define ARM_FLUSH_INST_DATA_TLB_OPCODE "0x0"
+# define ARM_FLUSH_INST_DATA_TLB_RM "c7"
+# define ARM_FLUSH_INST_TLB_OPCODE "0x0"
+# define ARM_FLUSH_INST_TLB_RM "c5"
+# define ARM_FLUSH_DATA_TLB_OPCODE "0x0"
+# define ARM_FLUSH_DATA_TLB_RM "c6"
+# define ARM_FLUSH_DATA_ENTRY_TLB_OPCODE "0x1"
+# define ARM_FLUSH_DATA_ENTRY_TLB_RM "c6"
+#endif /* __ASSEMBLER__ */
+
+/*
+ * SA-1100 Read-Buffer Operations Definitions
+ */
+#ifdef __ASSEMBLER__
+# define ARM_FLUSH_ALL_BUFFERS_OPCODE 0x0
+# define ARM_FLUSH_ALL_BUFFERS_RM c0
+# define ARM_FLUSH_BUFFER_0_OPCODE 0x1
+# define ARM_FLUSH_BUFFER_0_RM c0
+# define ARM_FLUSH_BUFFER_1_OPCODE 0x1
+# define ARM_FLUSH_BUFFER_1_RM c1
+# define ARM_FLUSH_BUFFER_2_OPCODE 0x1
+# define ARM_FLUSH_BUFFER_2_RM c2
+# define ARM_FLUSH_BUFFER_3_OPCODE 0x1
+# define ARM_FLUSH_BUFFER_3_RM c3
+# define ARM_LOAD_BUFFER_0_1_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_0_1_WORD_RM c0
+# define ARM_LOAD_BUFFER_0_4_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_0_4_WORD_RM c4
+# define ARM_LOAD_BUFFER_0_8_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_0_8_WORD_RM c8
+# define ARM_LOAD_BUFFER_1_1_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_1_1_WORD_RM c1
+# define ARM_LOAD_BUFFER_1_4_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_1_4_WORD_RM c5
+# define ARM_LOAD_BUFFER_1_8_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_1_8_WORD_RM c9
+# define ARM_LOAD_BUFFER_2_1_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_2_1_WORD_RM c2
+# define ARM_LOAD_BUFFER_2_4_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_2_4_WORD_RM c6
+# define ARM_LOAD_BUFFER_2_8_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_2_8_WORD_RM cA
+# define ARM_LOAD_BUFFER_3_1_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_3_1_WORD_RM c3
+# define ARM_LOAD_BUFFER_3_4_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_3_4_WORD_RM c7
+# define ARM_LOAD_BUFFER_3_8_WORD_OPCODE 0x2
+# define ARM_LOAD_BUFFER_3_8_WORD_RM cB
+# define ARM_DISABLE_USER_MCR_ACCESS_OPCODE 0x4
+# define ARM_DISABLE_USER_MCR_ACCESS_RM c0
+# define ARM_ENABLE_USER_MCR_ACCESS_OPCODE 0x5
+# define ARM_ENABLE_USER_MCR_ACCESS_RM c0
+#else /* __ASSEMBLER__ */
+# define ARM_FLUSH_ALL_BUFFERS_OPCODE "0x0"
+# define ARM_FLUSH_ALL_BUFFERS_RM "c0"
+# define ARM_FLUSH_BUFFER_0_OPCODE "0x1"
+# define ARM_FLUSH_BUFFER_0_RM "c0"
+# define ARM_FLUSH_BUFFER_1_OPCODE "0x1"
+# define ARM_FLUSH_BUFFER_1_RM "c1"
+# define ARM_FLUSH_BUFFER_2_OPCODE "0x1"
+# define ARM_FLUSH_BUFFER_2_RM "c2"
+# define ARM_FLUSH_BUFFER_3_OPCODE "0x1"
+# define ARM_FLUSH_BUFFER_3_RM "c3"
+# define ARM_LOAD_BUFFER_0_1_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_0_1_WORD_RM "c0"
+# define ARM_LOAD_BUFFER_0_4_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_0_4_WORD_RM "c4"
+# define ARM_LOAD_BUFFER_0_8_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_0_8_WORD_RM "c8"
+# define ARM_LOAD_BUFFER_1_1_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_1_1_WORD_RM "c1"
+# define ARM_LOAD_BUFFER_1_4_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_1_4_WORD_RM "c5"
+# define ARM_LOAD_BUFFER_1_8_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_1_8_WORD_RM "c9"
+# define ARM_LOAD_BUFFER_2_1_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_2_1_WORD_RM "c2"
+# define ARM_LOAD_BUFFER_2_4_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_2_4_WORD_RM "c6"
+# define ARM_LOAD_BUFFER_2_8_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_2_8_WORD_RM "cA"
+# define ARM_LOAD_BUFFER_3_1_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_3_1_WORD_RM "c3"
+# define ARM_LOAD_BUFFER_3_4_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_3_4_WORD_RM "c7"
+# define ARM_LOAD_BUFFER_3_8_WORD_OPCODE "0x2"
+# define ARM_LOAD_BUFFER_3_8_WORD_RM "cB"
+# define ARM_DISABLE_USER_MCR_ACCESS_OPCODE "0x4"
+# define ARM_DISABLE_USER_MCR_ACCESS_RM "c0"
+# define ARM_ENABLE_USER_MCR_ACCESS_OPCODE "0x5"
+# define ARM_ENABLE_USER_MCR_ACCESS_RM "c0"
+#endif /* __ASSEMBLER__ */
+
+/*
+ * ARM(R) First Level Descriptor Format Definitions
+ */
+#ifndef __ASSEMBLER__
+struct ARM_MMU_FIRST_LEVEL_FAULT {
+ int id : 2;
+ int sbz : 30;
+};
+#define ARM_MMU_FIRST_LEVEL_FAULT_ID 0x0
+
+struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE {
+ int id : 2;
+ int imp : 2;
+ int domain : 4;
+ int sbz : 1;
+ int base_address : 23;
+};
+#define ARM_MMU_FIRST_LEVEL_PAGE_TABLE_ID 0x1
+
+struct ARM_MMU_FIRST_LEVEL_SECTION {
+ int id : 2;
+ int b : 1;
+ int c : 1;
+ int imp : 1;
+ int domain : 4;
+ int sbz0 : 1;
+ int ap : 2;
+ int sbz1 : 8;
+ int base_address : 12;
+};
+#define ARM_MMU_FIRST_LEVEL_SECTION_ID 0x2
+
+struct ARM_MMU_FIRST_LEVEL_RESERVED {
+ int id : 2;
+ int sbz : 30;
+};
+#define ARM_MMU_FIRST_LEVEL_RESERVED_ID 0x3
+
+#define ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, table_index) \
+ (unsigned long *)((unsigned long)(ttb_base) + ((table_index) << 2))
+#define ARM_MMU_SECTION(ttb_base, actual_base, virtual_base, cacheable, bufferable, perm) \
+ { \
+ register union ARM_MMU_FIRST_LEVEL_DESCRIPTOR desc; \
+ \
+ desc.word = 0; \
+ desc.section.id = ARM_MMU_FIRST_LEVEL_SECTION_ID; \
+ desc.section.domain = 0; \
+ desc.section.c = (cacheable); \
+ desc.section.b = (bufferable); \
+ desc.section.ap = (perm); \
+ desc.section.base_address = (actual_base); \
+ *ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, (virtual_base)) = desc.word; \
+ }
+
+union ARM_MMU_FIRST_LEVEL_DESCRIPTOR {
+ unsigned long word;
+ struct ARM_MMU_FIRST_LEVEL_FAULT fault;
+ struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE page_table;
+ struct ARM_MMU_FIRST_LEVEL_SECTION section;
+ struct ARM_MMU_FIRST_LEVEL_RESERVED reserved;
+};
+
+#endif /* __ASSEMBLER__ */
+
+#define ARM_UNCACHEABLE 0
+#define ARM_CACHEABLE 1
+#define ARM_UNBUFFERABLE 0
+#define ARM_BUFFERABLE 1
+
+#define ARM_ACCESS_PERM_NONE_NONE 0
+#define ARM_ACCESS_PERM_RO_NONE 0
+#define ARM_ACCESS_PERM_RO_RO 0
+#define ARM_ACCESS_PERM_RW_NONE 1
+#define ARM_ACCESS_PERM_RW_RO 2
+#define ARM_ACCESS_PERM_RW_RW 3
+
+#define ARM_SECTION_SIZE SZ_1M
+#define ARM_SMALL_PAGE_SIZE SZ_4K
+#define ARM_LARGE_PAGE_SIZE SZ_64K
+
+#define ARM_FIRST_LEVEL_PAGE_TABLE_SIZE SZ_16K
+#define ARM_SECOND_LEVEL_PAGE_TABLE_SIZE SZ_1K
+
+#endif /* MMU */
+
+#endif // __ARM_CPU_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/arm/cpu_info.h b/cesar/ecos/packages/cygmon/current/misc/arm/cpu_info.h
new file mode 100644
index 0000000000..e7fff0049c
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/arm/cpu_info.h
@@ -0,0 +1,100 @@
+#ifndef __ARM_CPU_INFO_H__
+#define __ARM_CPU_INFO_H__
+//==========================================================================
+//
+// cpu_info.h
+//
+// Architecture information for ARM processors
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description: ARM is a Registered Trademark of Advanced RISC Machines
+// Limited.
+// Other Brands and Trademarks are the property of their
+// respective owners.
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#define IS_ARM 1
+
+#ifndef __CYGMON_TYPES
+#define __CYGMON_TYPES
+typedef unsigned int uint32;
+typedef int int32;
+#endif // __CYGMON_TYPES
+
+
+/* Temporary as long a multiple protypes are copied in multiple files */
+/* This variation does NOT clone the prototypes */
+#define NO_MALLOC 1
+#define MAX_NUM_BP 32
+#define MAX_HIST_ENTS 10
+
+/* big enuf to store a trap in the BP structure */
+
+#define BP_INST_T_DEFINED 1
+typedef unsigned long bp_inst_t ;
+
+#define MEM_ADDR_DEFINED 1
+typedef struct mem_addr {
+ unsigned long addr;
+} mem_addr_t ;
+
+#ifndef TARGET_REGISTER_T_DEFINED
+#define TARGET_REGISTER_T_DEFINED
+typedef unsigned long target_register_t;
+#endif
+
+#if defined(__ARMEB__)
+#define PRINT_INSN print_insn_big_arm
+#else
+#define PRINT_INSN print_insn_little_arm
+#endif
+
+#define OTHERNAMES_CMD arm_othernames
+extern void arm_othernames (void);
+
+#undef BFD_MACH
+#define BFD_MACH 0
+
+#endif // __ARM_CPU_INFO_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/board.h b/cesar/ecos/packages/cygmon/current/misc/board.h
new file mode 100644
index 0000000000..f843f085c8
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/board.h
@@ -0,0 +1,72 @@
+#ifndef __CYGMON_BOARD_H__
+#define __CYGMON_BOARD_H__
+//==========================================================================
+//
+// board.h
+//
+// Cygmon board/platform configuration file
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+// Hardware/platform/configuration specifics
+
+#include <pkgconf/hal.h>
+#include <pkgconf/cygmon.h>
+
+#ifdef CYGPKG_HAL_ARM
+#include "arm/board.h"
+#endif
+
+#ifdef CYGPKG_HAL_MIPS
+#include "mips/board.h"
+#endif
+
+#ifdef CYGPKG_HAL_MN10300
+#include "mn10300/board.h"
+#endif
+
+#endif // __CYGMON_BOARD_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bplist-dynamic.c b/cesar/ecos/packages/cygmon/current/misc/bplist-dynamic.c
new file mode 100644
index 0000000000..1c9a864650
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bplist-dynamic.c
@@ -0,0 +1,234 @@
+//==========================================================================
+//
+// bplist-dynamic.c
+//
+// Breakpoint list using dynamic memory.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Breakpoint list using dynamic memory.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include "board.h"
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+
+#include <stdlib.h>
+
+#ifndef NO_MALLOC
+#ifndef NO_MALLOC_H
+#include "malloc.h"
+#else
+void free ();
+char *malloc ();
+#endif
+#endif
+
+#ifdef __ECOS__
+#include <cyg/hal/plf_stub.h>
+#endif /* __ECOS__ */
+
+/*
+ * A simple target breakpoint list using malloc.
+ * To use this package, you must define TRAP_SIZE to be the size
+ * in bytes of a trap instruction (max if there's more than one),
+ * and export a char array called _breakinst that contains a
+ * breakpoint trap. This package will copy trap instructions
+ * from _breakinst into the breakpoint locations.
+ */
+
+static struct breakpoint_list {
+ target_register_t addr;
+ char old_contents [TRAP_SIZE];
+ struct breakpoint_list *next;
+ char in_memory;
+} *breakpoint_list = NULL;
+
+#ifdef NO_MALLOC
+static struct breakpoint_list bp_list [MAX_BP_NUM];
+static struct breakpoint_list *free_bp_list = NULL;
+static int curr_bp_num = 0;
+#endif
+
+#ifndef BREAKINST_DEFINED
+#define BREAKINST_DEFINED
+extern unsigned char _breakinst[];
+#endif
+
+int
+__set_breakpoint (target_register_t addr)
+{
+ struct breakpoint_list **addent = &breakpoint_list;
+ struct breakpoint_list *l = breakpoint_list;
+ struct breakpoint_list *newent;
+
+ while (l != NULL && l->addr < addr)
+ {
+ addent = &l->next;
+ l = l->next;
+ }
+
+ if (l != NULL && l->addr == addr)
+ return 2;
+
+#ifdef NO_MALLOC
+ if (free_bp_list != NULL)
+ {
+ newent = free_bp_list;
+ free_bp_list = free_bp_list->next;
+ }
+ else
+ {
+ if (curr_bp_num < MAX_BP_NUM)
+ {
+ newent = &bp_list[curr_bp_num++];
+ }
+ else
+ {
+ return 1;
+ }
+ }
+#else
+ newent = (struct breakpoint_list *) malloc (sizeof (struct breakpoint_list));
+#endif
+ newent->addr = addr;
+ newent->in_memory = 0;
+ newent->next = l;
+ *addent = newent;
+ return 0;
+}
+
+int
+__remove_breakpoint (target_register_t addr)
+{
+ struct breakpoint_list *l = breakpoint_list;
+ struct breakpoint_list *prev = NULL;
+
+ while (l != NULL && l->addr < addr)
+ {
+ prev = l;
+ l = l->next;
+ }
+
+ if (l == NULL)
+ return 1;
+
+ if (l->in_memory)
+ {
+ __write_mem_safe (&l->old_contents[0],
+ (void*)l->addr,
+ sizeof (l->old_contents));
+ }
+
+ if (prev == NULL)
+ breakpoint_list = l->next;
+ else
+ prev->next = l->next;
+
+#ifdef NO_MALLOC
+ l->next = free_bp_list;
+ free_bp_list = l;
+#else
+ free (l);
+#endif
+ return 0;
+}
+
+#include <cyg/hal/generic-stub.h>
+#include <cyg/hal/hal_stub.h>
+void
+__cygmon_install_breakpoints (void)
+{
+ struct breakpoint_list *l = breakpoint_list;
+
+ while (l != NULL)
+ {
+ if (! l->in_memory)
+ {
+ int len = sizeof (l->old_contents);
+
+ if (__read_mem_safe (&l->old_contents[0], (void*)l->addr, len) == len)
+ {
+#ifdef WRITE_MEM_IS_MEMCPY
+ if (__write_mem_safe (_breakinst, (void*)l->addr, len) == (void*)l->addr)
+#else
+ if (__write_mem_safe (_breakinst, (void*)l->addr, len) == len)
+#endif
+ {
+ l->in_memory = 1;
+ }
+ }
+ }
+ l = l->next;
+ }
+ flush_i_cache ();
+}
+
+void
+__cygmon_clear_breakpoints (void)
+{
+ struct breakpoint_list *l = breakpoint_list;
+
+ while (l != NULL)
+ {
+ if (l->in_memory)
+ {
+ int len = sizeof (l->old_contents);
+
+#ifdef WRITE_MEM_IS_MEMCPY
+ if (__write_mem_safe (_breakinst, (void*)l->addr, len) == (void*)l->addr)
+#else
+ if (__write_mem_safe (&l->old_contents[0], (void*)l->addr, len) == len)
+#endif
+ {
+ l->in_memory = 0;
+ }
+ }
+ l = l->next;
+ }
+ flush_i_cache ();
+}
+
+#endif // USE_ECOS_HAL_BREAKPOINTS
diff --git a/cesar/ecos/packages/cygmon/current/misc/breakpoints.c b/cesar/ecos/packages/cygmon/current/misc/breakpoints.c
new file mode 100644
index 0000000000..0a489d3735
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/breakpoints.c
@@ -0,0 +1,220 @@
+//==========================================================================
+//
+// breakpoints.c
+//
+// Support aribtrary set of breakpoints.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include "board.h"
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+
+#include <stdlib.h>
+#ifdef HAVE_BSP
+#include <bsp/bsp.h>
+#include <bsp/cpu.h>
+#endif
+
+#include "monitor.h"
+#include "tservice.h"
+#include "stub-tservice.h"
+
+#include "fmt_util.h"
+
+
+static struct bp *last_bp_ptr;
+static struct bp *first_bp_ptr;
+
+#ifdef NO_MALLOC
+static struct bp *free_bp_list;
+static struct bp bp_list[MAX_NUM_BP];
+static int curr_bp_num;
+#endif
+
+int
+add_mon_breakpoint (mem_addr_t location)
+{
+ struct bp *ptr;
+ struct bp *new_bp_ptr;
+
+ for (ptr = first_bp_ptr; ptr != NULL; ptr = ptr->next)
+ {
+ if (MEM_ADDR_EQ_P (ptr->address, location))
+ return 1;
+ }
+#ifdef NO_MALLOC
+ if (free_bp_list != NULL)
+ {
+ new_bp_ptr = free_bp_list;
+ free_bp_list = new_bp_ptr->next;
+ }
+ else
+ {
+ if (curr_bp_num < MAX_NUM_BP)
+ {
+ new_bp_ptr = &bp_list[curr_bp_num++];
+ }
+ else
+ {
+ xprintf ("No more breakpoints\n");
+ return 1;
+ }
+ }
+#else
+ new_bp_ptr = (struct bp *)malloc (sizeof (struct bp));
+#endif
+
+ if (first_bp_ptr == NULL)
+ {
+ first_bp_ptr = new_bp_ptr;
+ }
+ else
+ {
+ last_bp_ptr->next = new_bp_ptr;
+ }
+ last_bp_ptr = new_bp_ptr;
+
+ last_bp_ptr->next = NULL;
+ last_bp_ptr->address = location;
+ last_bp_ptr->in_memory = 0;
+ return 0;
+}
+
+
+void
+install_breakpoints (void)
+{
+ struct bp *ptr = first_bp_ptr;
+ while (ptr != NULL)
+ {
+ set_breakpoint (ptr);
+ ptr = ptr->next;
+ }
+}
+
+
+void
+clear_breakpoints (void)
+{
+ struct bp *ptr = first_bp_ptr;
+
+ while (ptr != NULL)
+ {
+ clear_breakpoint (ptr);
+ ptr = ptr->next;
+ }
+}
+
+int
+show_breakpoints (void)
+{
+ struct bp *ptr;
+
+ for (ptr = first_bp_ptr; ptr != NULL; ptr = ptr->next)
+ {
+ char buf[20];
+
+ addr2str (&ptr->address, buf);
+ xprintf ("%s\n", buf);
+ }
+
+ return 0;
+}
+
+
+
+int
+clear_mon_breakpoint (mem_addr_t location)
+{
+ int error = 0;
+ struct bp *ptr = first_bp_ptr;
+ struct bp *prev_ptr = NULL;
+
+ /* Scan the list looking for the address to clear */
+ while (ptr != NULL && !MEM_ADDR_EQ_P (ptr->address, location))
+ {
+ /* keep a pointer one behind the current position */
+ prev_ptr = ptr;
+ ptr = ptr->next;
+ }
+ if (ptr == NULL)
+ {
+ xprintf ("That address has no breakpoint on it.\n");
+ error = 1;
+ }
+ else
+ {
+ /* Just in case it's still in memory. */
+ clear_breakpoint (ptr);
+
+ /* now we'll point the previous bp->next at the one after the one
+ we're deleting, unless there is no previous bp. */
+ if (prev_ptr != NULL)
+ {
+ prev_ptr->next = ptr->next;
+ }
+
+ if (first_bp_ptr == ptr)
+ first_bp_ptr = ptr->next;
+
+ if (last_bp_ptr == ptr)
+ last_bp_ptr = prev_ptr;
+
+ /* eliminate the offending bp struct */
+#ifdef NO_MALLOC
+ ptr->next = free_bp_list;
+ free_bp_list = ptr;
+#else
+ free (ptr);
+#endif
+ }
+ return error;
+}
+
+#endif /* USE_ECOS_HAL_BREAKPOINTS */
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb-cpu.c b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb-cpu.c
new file mode 100644
index 0000000000..0030982898
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb-cpu.c
@@ -0,0 +1,208 @@
+//==========================================================================
+//
+// gdb-cpu.c
+//
+// CPU specific support for GDB stub.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: CPU specific support for GDB stub.
+// Description: ARM is a Registered Trademark of Advanced RISC Machines
+// Limited.
+// Other Brands and Trademarks are the property of their
+// respective owners.
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <bsp/cpu.h>
+#include <bsp/bsp.h>
+#include "insn.h"
+#include "gdb.h"
+
+/*
+ * Return byte offset within the saved register area of the
+ * given register.
+ */
+int
+bsp_regbyte(int regno)
+{
+ switch(regno)
+ {
+ case REG_R0: return (int)&(((ex_regs_t*)0)->_r0); break;
+ case REG_R1: return (int)&(((ex_regs_t*)0)->_r1); break;
+ case REG_R2: return (int)&(((ex_regs_t*)0)->_r2); break;
+ case REG_R3: return (int)&(((ex_regs_t*)0)->_r3); break;
+ case REG_R4: return (int)&(((ex_regs_t*)0)->_r4); break;
+ case REG_R5: return (int)&(((ex_regs_t*)0)->_r5); break;
+ case REG_R6: return (int)&(((ex_regs_t*)0)->_r6); break;
+ case REG_R7: return (int)&(((ex_regs_t*)0)->_r7); break;
+ case REG_R8: return (int)&(((ex_regs_t*)0)->_r8); break;
+ case REG_R9: return (int)&(((ex_regs_t*)0)->_r9); break;
+ case REG_R10: return (int)&(((ex_regs_t*)0)->_r10); break;
+ case REG_R11: return (int)&(((ex_regs_t*)0)->_r11); break;
+ case REG_R12: return (int)&(((ex_regs_t*)0)->_r12); break;
+ case REG_SP: return (int)&(((ex_regs_t*)0)->_sp); break;
+ case REG_LR: return (int)&(((ex_regs_t*)0)->_lr); break;
+ case REG_PC: return (int)&(((ex_regs_t*)0)->_pc); break;
+
+#ifndef __ECOS__
+ case REG_F0: return (int)&(((ex_regs_t*)0)->_f0); break;
+ case REG_F1: return (int)&(((ex_regs_t*)0)->_f1); break;
+ case REG_F2: return (int)&(((ex_regs_t*)0)->_f2); break;
+ case REG_F3: return (int)&(((ex_regs_t*)0)->_f3); break;
+ case REG_F4: return (int)&(((ex_regs_t*)0)->_f4); break;
+ case REG_F5: return (int)&(((ex_regs_t*)0)->_f5); break;
+ case REG_F6: return (int)&(((ex_regs_t*)0)->_f6); break;
+ case REG_F7: return (int)&(((ex_regs_t*)0)->_f7); break;
+ case REG_FPS: return (int)&(((ex_regs_t*)0)->_fps); break;
+#endif
+
+ case REG_CPSR: return (int)&(((ex_regs_t*)0)->_cpsr); break;
+ case REG_SPSVC: return (int)&(((ex_regs_t*)0)->_spsvc); break;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Return size in bytes of given register.
+ */
+int
+bsp_regsize(int regno)
+{
+ switch(regno)
+ {
+ case REG_R0: return (sizeof (((ex_regs_t*)0)->_r0)); break;
+ case REG_R1: return (sizeof (((ex_regs_t*)0)->_r1)); break;
+ case REG_R2: return (sizeof (((ex_regs_t*)0)->_r2)); break;
+ case REG_R3: return (sizeof (((ex_regs_t*)0)->_r3)); break;
+ case REG_R4: return (sizeof (((ex_regs_t*)0)->_r4)); break;
+ case REG_R5: return (sizeof (((ex_regs_t*)0)->_r5)); break;
+ case REG_R6: return (sizeof (((ex_regs_t*)0)->_r6)); break;
+ case REG_R7: return (sizeof (((ex_regs_t*)0)->_r7)); break;
+ case REG_R8: return (sizeof (((ex_regs_t*)0)->_r8)); break;
+ case REG_R9: return (sizeof (((ex_regs_t*)0)->_r9)); break;
+ case REG_R10: return (sizeof (((ex_regs_t*)0)->_r10)); break;
+ case REG_R11: return (sizeof (((ex_regs_t*)0)->_r11)); break;
+ case REG_R12: return (sizeof (((ex_regs_t*)0)->_r12)); break;
+ case REG_SP: return (sizeof (((ex_regs_t*)0)->_sp)); break;
+ case REG_LR: return (sizeof (((ex_regs_t*)0)->_lr)); break;
+ case REG_PC: return (sizeof (((ex_regs_t*)0)->_pc)); break;
+
+#ifndef __ECOS__
+ case REG_F0: return (sizeof (((ex_regs_t*)0)->_f0)); break;
+ case REG_F1: return (sizeof (((ex_regs_t*)0)->_f1)); break;
+ case REG_F2: return (sizeof (((ex_regs_t*)0)->_f2)); break;
+ case REG_F3: return (sizeof (((ex_regs_t*)0)->_f3)); break;
+ case REG_F4: return (sizeof (((ex_regs_t*)0)->_f4)); break;
+ case REG_F5: return (sizeof (((ex_regs_t*)0)->_f5)); break;
+ case REG_F6: return (sizeof (((ex_regs_t*)0)->_f6)); break;
+ case REG_F7: return (sizeof (((ex_regs_t*)0)->_f7)); break;
+ case REG_FPS: return (sizeof (((ex_regs_t*)0)->_fps)); break;
+#endif
+
+ case REG_CPSR: return (sizeof (((ex_regs_t*)0)->_cpsr)); break;
+ case REG_SPSVC: return (sizeof (((ex_regs_t*)0)->_spsvc)); break;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Given an exception number and a pointer to saved registers,
+ * return a GDB signal value.
+ */
+int
+bsp_get_signal(int exc_nr, void *saved_regs)
+{
+ int sig = TARGET_SIGNAL_TRAP;
+ ex_regs_t *regs = (ex_regs_t *)saved_regs;
+
+ switch (exc_nr) {
+ case BSP_CORE_EXC_UNDEFINED_INSTRUCTION:
+ {
+ union arm_insn inst;
+ if (bsp_memory_read((void *)regs->_pc, 0, ARM_INST_SIZE * 8, 1, &(inst.word)) != 0)
+ {
+ /*
+ * We were able to read this address. It must be a valid address.
+ */
+ if (inst.word == BREAKPOINT_INSN)
+ sig = TARGET_SIGNAL_TRAP;
+ }
+ else
+ sig = TARGET_SIGNAL_ILL;
+ }
+ break;
+ case BSP_CORE_EXC_SOFTWARE_INTERRUPT: sig = TARGET_SIGNAL_TRAP; break;
+ case BSP_CORE_EXC_PREFETCH_ABORT: sig = TARGET_SIGNAL_BUS; break;
+ case BSP_CORE_EXC_DATA_ABORT: sig = TARGET_SIGNAL_BUS; break;
+ case BSP_CORE_EXC_ADDRESS_ERROR_26_BIT: sig = TARGET_SIGNAL_BUS; break;
+ case BSP_CORE_EXC_IRQ: sig = TARGET_SIGNAL_INT; break;
+ case BSP_CORE_EXC_FIQ: sig = TARGET_SIGNAL_INT; break;
+ default: sig = TARGET_SIGNAL_TRAP; break;
+ }
+
+ return sig;
+}
+
+
+/*
+ * Set the PC value in the saved registers.
+ */
+void
+bsp_set_pc(unsigned long pc, void *saved_regs)
+{
+ ((ex_regs_t *)saved_regs)->_pc = pc;
+}
+
+
+/*
+ * Get the PC value from the saved registers.
+ */
+unsigned long
+bsp_get_pc(void *saved_regs)
+{
+ return ((ex_regs_t *)saved_regs)->_pc;
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb-cpu.h b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb-cpu.h
new file mode 100644
index 0000000000..9ee631b9ec
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb-cpu.h
@@ -0,0 +1,61 @@
+#ifndef __BSP_ARM_GDB_CPU_H__
+#define __BSP_ARM_GDB_CPU_H__
+//==========================================================================
+//
+// gdb-cpu.h
+//
+// CPU specific definitions for GDB stub.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: CPU specific definitions for GDB stub.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+/*
+ * Number of registers that gdb is interested in.
+ */
+#define NUMREGS 26
+
+#endif // __BSP_ARM_GDB_CPU_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb.h b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb.h
new file mode 100644
index 0000000000..37906d84e4
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/gdb.h
@@ -0,0 +1,58 @@
+#ifndef __BSP_ARM_GDB_H__
+#define __BSP_ARM_GDB_H__
+//==========================================================================
+//
+// gdb.h
+//
+//
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include "../common/gdb.h"
+
+#endif // __BSP_ARM_GDB_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/arm/insn.h b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/insn.h
new file mode 100755
index 0000000000..44dc3de057
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/insn.h
@@ -0,0 +1,482 @@
+#ifndef __BSP_ARM_INSN_H__
+#define __BSP_ARM_INSN_H__
+//==========================================================================
+//
+// insn.h
+//
+// ARM(R) instruction descriptions.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: ARM(R) instruction descriptions.
+// Description: ARM is a Registered Trademark of Advanced RISC Machines
+// Limited.
+// Other Brands and Trademarks are the property of their
+// respective owners.
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+/* Data Processing Immediate Type */
+struct dpi_type {
+ unsigned immediate : 8;
+ unsigned rotate : 4;
+ unsigned Rd : 4;
+ unsigned Rn : 4;
+ unsigned S_bit : 1;
+ unsigned opcode : 4;
+ unsigned rsv1 : 3; /* == 001b */
+ unsigned cond : 4;
+};
+#define DPI_RSV1_VALUE 0x1
+
+/* Data Processing Immediate Shift Type */
+struct dpis_type {
+ unsigned Rm : 4;
+ unsigned rsv2 : 1; /* == 0b */
+ unsigned shift : 2;
+ unsigned shift_immed : 5;
+ unsigned Rd : 4;
+ unsigned Rn : 4;
+ unsigned S_bit : 1;
+ unsigned opcode : 4;
+ unsigned rsv1 : 3; /* == 000b */
+ unsigned cond : 4;
+};
+#define DPIS_RSV1_VALUE 0x0
+#define DPIS_RSV2_VALUE 0x0
+
+/* Data Processing Register Shift Type */
+struct dprs_type {
+ unsigned Rm : 4;
+ unsigned rsv3 : 1; /* == 1b */
+ unsigned shift : 2;
+ unsigned rsv2 : 1; /* == 0b */
+ unsigned Rs : 4;
+ unsigned Rd : 4;
+ unsigned Rn : 4;
+ unsigned S_bit : 1;
+ unsigned opcode : 4;
+ unsigned rsv1 : 3; /* == 000b */
+ unsigned cond : 4;
+};
+#define DPRS_RSV1_VALUE 0x0
+#define DPRS_RSV2_VALUE 0x0
+#define DPRS_RSV3_VALUE 0x1
+
+/* Multiply Type */
+struct m_type {
+ unsigned Rm : 4;
+ unsigned rsv2 : 4; /* == 1001b */
+ unsigned Rs : 4;
+ unsigned Rn : 4;
+ unsigned Rd : 4;
+ unsigned S_bit : 1;
+ unsigned A_bit : 1;
+ unsigned rsv1 : 6; /* == 000000b */
+ unsigned cond : 4;
+};
+#define M_RSV1_VALUE 0x0
+#define M_RSV2_VALUE 0x9
+
+/* Multiply Long Type */
+struct ml_type {
+ unsigned Rm : 4;
+ unsigned rsv2 : 4; /* == 1001b */
+ unsigned Rs : 4;
+ unsigned RdLo : 4;
+ unsigned RdHi : 4;
+ unsigned S_bit : 1;
+ unsigned A_bit : 1;
+ unsigned U_bit : 1;
+ unsigned rsv1 : 5; /* == 00001b */
+ unsigned cond : 4;
+};
+#define ML_RSV1_VALUE 0x1
+#define ML_RSV2_VALUE 0x9
+
+/* Move from status register Type */
+struct mrs_type {
+ unsigned SBZ : 12;
+ unsigned Rd : 4;
+ unsigned SBO : 4;
+ unsigned rsv2 : 2; /* == 00b */
+ unsigned R_bit : 1;
+ unsigned rsv1 : 5; /* == 00010b */
+ unsigned cond : 4;
+};
+#define MRS_RSV1_VALUE 0x2
+#define MRS_RSV2_VALUE 0x0
+
+/* Move Immediate to status register Type */
+struct misr_type {
+ unsigned immediate : 8;
+ unsigned rotate : 4;
+ unsigned SBO : 4;
+ unsigned mask : 4;
+ unsigned rsv2 : 2; /* == 10b */
+ unsigned R_bit : 1;
+ unsigned rsv1 : 5; /* == 00110b */
+ unsigned cond : 4;
+};
+#define MISR_RSV1_VALUE 0x6
+#define MISR_RSV2_VALUE 0x2
+
+/* Move register to status register Type */
+struct mrsr_type {
+ unsigned Rm : 4;
+ unsigned rsv3 : 1; /* == 0b */
+ unsigned SBZ : 7;
+ unsigned SBO : 4;
+ unsigned mask : 4;
+ unsigned rsv2 : 2; /* == 10b */
+ unsigned R_bit : 1;
+ unsigned rsv1 : 5; /* == 00010b */
+ unsigned cond : 4;
+};
+#define MRSR_RSV1_VALUE 0x2
+#define MRSR_RSV2_VALUE 0x2
+#define MRSR_RSV3_VALUE 0x0
+
+/* Branch/Exchange Type */
+struct bx_type {
+ unsigned Rm : 4;
+ unsigned rsv2 : 4; /* == 0001b */
+ unsigned SBO3 : 4;
+ unsigned SBO2 : 4;
+ unsigned SBO1 : 4;
+ unsigned rsv1 : 8; /* == 00010010b */
+ unsigned cond : 4;
+};
+#define BX_RSV1_VALUE 0x12
+#define BX_RSV2_VALUE 0x1
+
+/* Load/Store Immediate Offset Type */
+struct lsio_type {
+ unsigned immediate : 12;
+ unsigned Rd : 4;
+ unsigned Rn : 4;
+ unsigned L_bit : 1;
+ unsigned W_bit : 1;
+ unsigned B_bit : 1;
+ unsigned U_bit : 1;
+ unsigned P_bit : 1;
+ unsigned rsv1 : 3; /* == 010b */
+ unsigned cond : 4;
+};
+#define LSIO_RSV1_VALUE 0x2
+
+/* Load/Store Register Offset Type */
+struct lsro_type {
+ unsigned Rm : 4;
+ unsigned rsv2 : 1; /* == 0b */
+ unsigned shift : 2;
+ unsigned shift_immed : 5;
+ unsigned Rd : 4;
+ unsigned Rn : 4;
+ unsigned L_bit : 1;
+ unsigned W_bit : 1;
+ unsigned B_bit : 1;
+ unsigned U_bit : 1;
+ unsigned P_bit : 1;
+ unsigned rsv1 : 3; /* == 011b */
+ unsigned cond : 4;
+};
+#define LSRO_RSV1_VALUE 0x3
+#define LSRO_RSV2_VALUE 0x0
+
+/* Load/Store halfword/signed byte Immediate Offset Type */
+struct lshwi_type {
+ unsigned Lo_Offset : 4;
+ unsigned rsv4 : 1; /* == 1b */
+ unsigned H_bit : 1;
+ unsigned S_bit : 1;
+ unsigned rsv3 : 1; /* == 1b */
+ unsigned Hi_Offset : 4;
+ unsigned Rd : 4;
+ unsigned Rn : 4;
+ unsigned L_bit : 1;
+ unsigned W_bit : 1;
+ unsigned rsv2 : 1; /* == 1b */
+ unsigned U_bit : 1;
+ unsigned P_bit : 1;
+ unsigned rsv1 : 3; /* == 000b */
+ unsigned cond : 4;
+};
+#define LSHWI_RSV1_VALUE 0x0
+#define LSHWI_RSV2_VALUE 0x1
+#define LSHWI_RSV3_VALUE 0x1
+#define LSHWI_RSV4_VALUE 0x1
+
+/* Load/Store halfword/signed byte Register Offset Type */
+struct lshwr_type {
+ unsigned Rm : 4;
+ unsigned rsv4 : 1; /* == 1b */
+ unsigned H_bit : 1;
+ unsigned S_bit : 1;
+ unsigned rsv3 : 1; /* == 1b */
+ unsigned SBZ : 4;
+ unsigned Rd : 4;
+ unsigned Rn : 4;
+ unsigned L_bit : 1;
+ unsigned W_bit : 1;
+ unsigned rsv2 : 1; /* == 0b */
+ unsigned U_bit : 1;
+ unsigned P_bit : 1;
+ unsigned rsv1 : 3; /* == 000b */
+ unsigned cond : 4;
+};
+#define LSHWR_RSV1_VALUE 0x3
+#define LSHWR_RSV2_VALUE 0x1
+#define LSHWR_RSV3_VALUE 0x1
+#define LSHWR_RSV4_VALUE 0x1
+
+/* Swap/Swap Byte Type */
+struct swap_type {
+ unsigned Rm : 4;
+ unsigned rsv3 : 4; /* == 1001b */
+ unsigned SBZ : 4;
+ unsigned Rd : 4;
+ unsigned Rn : 4;
+ unsigned rsv2 : 2; /* == 00b */
+ unsigned B_bit : 1;
+ unsigned rsv1 : 5; /* == 00010b */
+ unsigned cond : 4;
+};
+#define SWAP_RSV1_VALUE 0x2
+#define SWAP_RSV2_VALUE 0x0
+#define SWAP_RSV3_VALUE 0x9
+
+/* Load/Store Multiple Type */
+struct lsm_type {
+ unsigned Reg_List : 16 ;
+ unsigned Rn : 4;
+ unsigned L_bit : 1;
+ unsigned W_bit : 1;
+ unsigned S_bit : 1;
+ unsigned U_bit : 1;
+ unsigned P_bit : 1;
+ unsigned rsv1 : 3; /* == 100b */
+ unsigned cond : 4;
+};
+#define LSM_RSV1_VALUE 0x4
+
+/* Coprocessor Data Processing Type */
+struct cpdp_type {
+ unsigned CRm : 4;
+ unsigned rsv2 : 1; /* == 0b */
+ unsigned op2 : 3;
+ unsigned cp_num : 4;
+ unsigned CRd : 4;
+ unsigned CRn : 4;
+ unsigned op1 : 4;
+ unsigned rsv1 : 4; /* == 1110b */
+ unsigned cond : 4;
+};
+#define CPDP_RSV1_VALUE 0xE
+#define CPDP_RSV2_VALUE 0x0
+
+/* Coprocessor Register Transfer Type */
+struct cprt_type {
+ unsigned CRm : 4;
+ unsigned rsv2 : 1; /* == 1b */
+ unsigned op2 : 3;
+ unsigned cp_num : 4;
+ unsigned Rd : 4;
+ unsigned CRn : 4;
+ unsigned L_bit : 1;
+ unsigned op1 : 3;
+ unsigned rsv1 : 4; /* == 1110b */
+ unsigned cond : 4;
+};
+#define CPRT_RSV1_VALUE 0xE
+#define CPRT_RSV2_VALUE 0x1
+
+/* Coprocessor Load/Store Type */
+struct cpls_type {
+ unsigned offset : 8;
+ unsigned cp_num : 4;
+ unsigned CRd : 4;
+ unsigned Rn : 4;
+ unsigned L_bit : 1;
+ unsigned W_bit : 1;
+ unsigned N_bit : 1;
+ unsigned U_bit : 1;
+ unsigned P_bit : 1;
+ unsigned rsv1 : 3; /* == 110b */
+ unsigned cond : 4;
+};
+#define CPLS_RSV1_VALUE 0x6
+
+/* Branch/Branch w/ Link Type */
+struct bbl_type {
+ unsigned offset : 24;
+ unsigned L_bit : 1;
+ unsigned rsv1 : 3; /* == 101b */
+ unsigned cond : 4;
+};
+#define BBL_RSV1_VALUE 0x5
+
+/* SWI Type */
+struct swi_type {
+ unsigned swi_number : 24;
+ unsigned rsv1 : 4; /* == 1111b */
+ unsigned cond : 4;
+};
+#define SWI_RSV1_VALUE 0xF
+
+/* Undefined Instruction Type */
+struct undef_type {
+ unsigned pad2 : 4;
+ unsigned rsv2 : 1; /* == 1b */
+ unsigned pad1 : 20;
+ unsigned rsv1 : 3; /* == 011b */
+ unsigned cond : 4;
+};
+#define UNDEF_RSV1_VALUE 0x3
+#define UNDEF_RSV2_VALUE 0x1
+
+union arm_insn {
+ unsigned long word;
+ struct dpi_type dpi;
+ struct dpis_type dpis;
+ struct dprs_type dprs;
+ struct m_type m;
+ struct ml_type ml;
+ struct mrs_type mrs;
+ struct misr_type misr;
+ struct mrsr_type mrsr;
+ struct bx_type bx;
+ struct lsio_type lsio;
+ struct lsro_type lsro;
+ struct lshwi_type lshwi;
+ struct lshwr_type lshwr;
+ struct swap_type swap;
+ struct lsm_type lsm;
+ struct cpdp_type cpdp;
+ struct cprt_type cprt;
+ struct cpls_type cpls;
+ struct bbl_type bbl;
+ struct swi_type swi;
+ struct undef_type undef;
+};
+
+/*
+ * Conditional field values
+ */
+#define COND_EQ 0x0
+#define COND_NE 0x1
+#define COND_CS_HI 0x2
+#define COND_CC_LO 0x3
+#define COND_MI 0x4
+#define COND_PL 0x5
+#define COND_VS 0x6
+#define COND_VC 0x7
+#define COND_HI 0x8
+#define COND_LS 0x9
+#define COND_GE 0xA
+#define COND_LT 0xB
+#define COND_GT 0xC
+#define COND_LE 0xD
+#define COND_AL 0xE
+#define COND_NV 0xF
+
+/*
+ * Data Processiong Opcode field values
+ */
+#define DP_OPCODE_MOV 0xD
+#define DP_OPCODE_MVN 0xF
+#define DP_OPCODE_ADD 0x4
+#define DP_OPCODE_ADC 0x5
+#define DP_OPCODE_SUB 0x2
+#define DP_OPCODE_SBC 0x6
+#define DP_OPCODE_RSB 0x3
+#define DP_OPCODE_RSC 0x7
+#define DP_OPCODE_AND 0x0
+#define DP_OPCODE_EOR 0x1
+#define DP_OPCODE_ORR 0xC
+#define DP_OPCODE_BIC 0xE
+#define DP_OPCODE_CMP 0xA
+#define DP_OPCODE_CMN 0xB
+#define DP_OPCODE_TST 0x8
+#define DP_OPCODE_TEQ 0x9
+
+/*
+ * Shift field values
+ */
+#define SHIFT_LSL 0x0
+#define SHIFT_LSR 0x1
+#define SHIFT_ASR 0x2
+#define SHIFT_ROR 0x3
+#define SHIFT_RRX 0x3 /* Special case: ROR(0) implies RRX */
+
+/*
+ * Load/Store indexing definitions
+ */
+#define LS_INDEX_POST 0x0
+#define LS_INDEX_PRE 0x1
+
+/*
+ * Load/Store offset operation definitions
+ */
+#define LS_OFFSET_SUB 0x0
+#define LS_OFFSET_ADD 0x1
+
+/*
+ * Load/Store size definitions
+ */
+#define LS_SIZE_WORD 0x0
+#define LS_SIZE_BYTE 0x1
+
+/*
+ * Load/Store Update definitions
+ */
+#define LS_NO_UPDATE 0x0
+#define LS_UPDATE 0x1
+
+/*
+ * Load/Store Opcode definitions
+ */
+#define LS_STORE 0x0
+#define LS_LOAD 0x1
+
+#endif // __BSP_ARM_INSN_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/arm/singlestep.c b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/singlestep.c
new file mode 100644
index 0000000000..76e994c200
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/arm/singlestep.c
@@ -0,0 +1,1320 @@
+//==========================================================================
+//
+// singlestep.c
+//
+// ARM(R) specific single-step support.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: ARM(R) specific single-step support.
+// Description: ARM is a Registered Trademark of Advanced RISC Machines Limited.
+// Other Brands and Trademarks are the property of their
+// respective owners.
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <stdlib.h>
+#include <bsp/bsp.h>
+#include <bsp/cpu.h>
+#include "insn.h"
+
+#define DEBUG_SINGLESTEP 0
+#define DEBUG_SINGLESTEP_VERBOSE 0
+
+/*
+ * Structure to hold opcodes hoisted when breakpoints are
+ * set for single-stepping or async interruption.
+ */
+struct _bp_save {
+ unsigned long *addr;
+ unsigned long opcode;
+};
+
+#define NUM_BREAKS_SAVED 2
+static struct _bp_save _breaks[NUM_BREAKS_SAVED];
+
+/*
+ * Insert a breakpoint at 'pc' using first available
+ * _bp_save struct.
+ */
+static void
+insert_ss_break(unsigned long *pc)
+{
+ struct _bp_save *p = _breaks;
+ union arm_insn inst;
+
+ if (p->addr && (++p)->addr)
+ return;
+
+ /*
+ * We can't set a breakpoint at 0
+ */
+ if (pc == 0)
+ {
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at <0x%08lx>: Error\n", pc);
+#endif /* DEBUG_SINGLESTEP */
+ return;
+ }
+
+ /*
+ * Make sure we are on a long word boundary.
+ */
+ if (((unsigned long)pc & 0x3) != 0)
+ {
+ /*
+ * All ARM(R) instructions are on a word boundary.
+ * This would be invalid. Don't set a bkpt here.
+ */
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at <0x%08lx>: Error\n", pc);
+#endif /* DEBUG_SINGLESTEP */
+ return;
+ }
+
+
+ /*
+ * What is the current instruction
+ */
+ if (bsp_memory_read(pc, 0, ARM_INST_SIZE * 8, 1, &(inst.word)) == 0)
+ {
+ /*
+ * Unable to read this address, probably an invalid address.
+ * Don't set a breakpoint here, as it will likely cause a bus error
+ */
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at <0x%08lx>: Error\n", pc);
+#endif /* DEBUG_SINGLESTEP */
+ return;
+ }
+
+ if (inst.word != BREAKPOINT_INSN)
+ {
+ /*
+ * Only insert a breakpoint if we haven't done so already
+ *
+ * We may try to insert 2 breakpoints if we to a branch to
+ * the immediately following instruction.
+ */
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at <0x%08lx>: inst <0x%08lx>\n", pc, inst.word);
+#endif /* DEBUG_SINGLESTEP */
+
+ p->addr = pc;
+ p->opcode = inst.word;
+ inst.word = BREAKPOINT_INSN;
+ if (bsp_memory_write(pc, 0, ARM_INST_SIZE * 8, 1, &(inst.word)) == 0)
+ {
+ /*
+ * Unable to write this address, probably an invalid address.
+ * Don't set a breakpoint here, as it will likely cause a bus error
+ */
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at <0x%08lx>: Error\n", pc);
+#endif /* DEBUG_SINGLESTEP */
+ return;
+ }
+
+ /* flush icache and dcache, now */
+ bsp_flush_dcache((void *)pc, ARM_INST_SIZE);
+ bsp_flush_icache((void *)pc, ARM_INST_SIZE);
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Done setting BP at <0x%08lx>: inst <0x%08lx>\n", pc, *pc);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ }
+}
+
+/*
+ * Cleanup after a singlestep.
+ */
+void
+bsp_singlestep_cleanup(void *registers)
+{
+ struct _bp_save *p = _breaks;
+ int i;
+
+ for (i = 0; i < NUM_BREAKS_SAVED; i++, p++)
+ {
+ if (p->addr)
+ {
+ unsigned long *old_addr = p->addr;
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Remove BP at <0x%08lx>: inst <0x%08lx>\n", old_addr, *old_addr);
+#endif /* DEBUG_SINGLESTEP */
+ *(p->addr) = p->opcode;
+ p->addr = NULL;
+
+ /* flush icache and dcache, now */
+ bsp_flush_dcache((void *)old_addr, ARM_INST_SIZE);
+ bsp_flush_icache((void *)old_addr, ARM_INST_SIZE);
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Done removing BP at <0x%08lx>: inst <0x%08lx>\n", old_addr, *old_addr);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ }
+ }
+}
+
+/*
+ * Rotate right a value by count
+ */
+static unsigned long ror(unsigned long value, unsigned count)
+{
+ while (count-- > 0)
+ {
+ if (value & 0x1)
+ value = (value >> 1) | 0x80000000;
+ else
+ value = (value >> 1);
+ }
+
+ return(value);
+}
+
+/*
+ * Rotate right a value by 1 with extend
+ */
+static unsigned long rrx(union arm_psr sr, unsigned long value)
+{
+ if (sr.psr.c_bit)
+ value = (value >> 1) | 0x80000000;
+ else
+ value = (value >> 1);
+
+ return(value);
+}
+
+/*
+ * Logical shift left by count
+ */
+static unsigned long lsl(unsigned long value, unsigned count)
+{
+ value <<= count;
+
+ return(value);
+}
+
+/*
+ * Logical shift right by count
+ */
+static unsigned long lsr(unsigned long value, unsigned count)
+{
+ value >>= count;
+
+ return(value);
+}
+
+/*
+ * Arithmetic shift right by count
+ */
+static unsigned long asr(unsigned long value, unsigned count)
+{
+ unsigned long sign_ext_mask = 0;
+
+ if (value & 0x80000000)
+ {
+ if (count >= sizeof(value)*8)
+ sign_ext_mask = ~0;
+ else
+ sign_ext_mask = (~0 << (sizeof(value)*8 - count));
+ }
+ value = (value >> count) | sign_ext_mask;
+
+ return(value);
+}
+
+/*
+ * Calculate an immediate shift operand based on input shift operand,
+ * shift value and register address.
+ */
+static unsigned long immediate_shift_operand(ex_regs_t *regs, unsigned shift_immediate,
+ unsigned shift, unsigned Rm)
+{
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *reg_ptr = &regs_array[bsp_regbyte(Rm)];
+ unsigned long reg_value = *((unsigned long *)(reg_ptr));
+ unsigned long rc = 0;
+
+ BSP_ASSERT((shift_immediate >= 0) && (shift_immediate <= 0x1f));
+ BSP_ASSERT((shift >= 0) && (shift <= 0x3));
+ BSP_ASSERT((Rm >= 0) && (Rm <= 0xf));
+ BSP_ASSERT(bsp_regsize(Rm) == sizeof(unsigned long));
+
+ /*
+ * According to the ARM(R) Manual, if Rm is PC then,
+ * the value used is the address of the current instruction
+ * plus 8
+ */
+ if (Rm == REG_PC)
+ reg_value += 8;
+
+ switch (shift)
+ {
+ case SHIFT_LSL:
+ rc = lsl(reg_value, shift_immediate);
+ break;
+
+ case SHIFT_LSR:
+ if (shift_immediate == 0)
+ {
+ /*
+ * Special Case: LSR IMM(0) == 0
+ */
+ rc = 0;
+ } else {
+ rc = lsr(reg_value, shift_immediate);
+ }
+ break;
+
+ case SHIFT_ASR:
+ if (shift_immediate == 0)
+ {
+ /*
+ * Special Case: ASR IMM(0)
+ */
+ if (reg_value & 0x80000000)
+ {
+ rc = 0xFFFFFFFF;
+ } else {
+ rc = 0;
+ }
+ } else {
+ rc = asr(reg_value, shift_immediate);
+ }
+ break;
+
+ case SHIFT_ROR:
+ if (shift_immediate == 0)
+ {
+ /*
+ * SHIFT_RRX
+ * Special case: ROR(0) implies RRX
+ */
+ rc = rrx((union arm_psr)(unsigned long)regs->_cpsr, reg_value);
+ } else {
+ rc = ror(reg_value, shift_immediate);
+ }
+ break;
+
+ default:
+ BSP_ASSERT(0);
+ break;
+ }
+
+ return (rc);
+}
+
+/*
+ * Calculate a register shift operand based on input shift operand,
+ * and target registers.
+ */
+static unsigned long register_shift_operand(ex_regs_t *regs, unsigned Rs,
+ unsigned shift, unsigned Rm)
+{
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *Rs_ptr = &regs_array[bsp_regbyte(Rs)];
+ unsigned char *Rm_ptr = &regs_array[bsp_regbyte(Rm)];
+ unsigned long Rs_val = *((unsigned long *)(Rs_ptr));
+ unsigned long Rm_val = *((unsigned long *)(Rm_ptr));
+ unsigned long rc = 0;
+
+ /*
+ * Use only the least significant byte of Rs
+ */
+ Rs_val &= 0xFF;
+
+ BSP_ASSERT((Rs >= 0) && (Rs <= 0xf));
+ BSP_ASSERT((shift >= 0) && (shift <= 0x3));
+ BSP_ASSERT((Rm >= 0) && (Rm <= 0xf));
+ BSP_ASSERT(bsp_regsize(Rs) == sizeof(unsigned long));
+ BSP_ASSERT(bsp_regsize(Rm) == sizeof(unsigned long));
+ BSP_ASSERT((Rs_val >=0) && (Rs_val <= 0xff));
+
+ /*
+ * According to the ARM(R) Manual, if Rm is PC then,
+ * the value used is the address of the current instruction
+ * plus 8
+ */
+ if (Rm == REG_PC)
+ Rm_val += 8;
+
+ switch (shift)
+ {
+ case SHIFT_LSL: rc = lsl(Rm_val, Rs_val); break;
+ case SHIFT_LSR: rc = lsr(Rm_val, Rs_val); break;
+ case SHIFT_ASR: rc = asr(Rm_val, Rs_val); break;
+ case SHIFT_ROR: rc = ror(Rm_val, Rs_val); break;
+ default: BSP_ASSERT(0); break;
+ }
+
+ return (rc);
+}
+
+/*
+ * Calculate a branch exchange operand based on input destination register
+ */
+static unsigned long branch_exchange_operand(ex_regs_t *regs, unsigned Rm)
+{
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *reg_ptr = &regs_array[bsp_regbyte(Rm)];
+ unsigned long reg_value = *((unsigned long *)(reg_ptr));
+
+ BSP_ASSERT((Rm >= 0) && (Rm <= 0xf));
+ BSP_ASSERT(bsp_regsize(Rm) == sizeof(unsigned long));
+
+ /*
+ * Clear the low-order bit
+ */
+ return (reg_value & ~0x1);
+}
+
+/*
+ * Handle a load to the PC
+ */
+static void handle_pc_load(unsigned size, unsigned long operand)
+{
+ unsigned long mem_value = 0;
+
+ if (size == LS_SIZE_WORD)
+ {
+ if (bsp_memory_read((void*)(operand & ~0x3), 0, 32, 1, &mem_value) == 0)
+ {
+ /*
+ * Unable to read the memory address.
+ * Don't try any further.
+ */
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at *(0x%08lx): Error\n", operand & ~0x3);
+#endif /* DEBUG_SINGLESTEP */
+ return;
+ } else {
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at *(0x%08lx): data <0x%08lx>\n", operand & ~0x3, mem_value);
+#endif /* DEBUG_SINGLESTEP */
+ }
+
+ /*
+ * Handle rotations if required
+ */
+ switch (operand & 0x3)
+ {
+ case 0x0: break;
+ case 0x1: mem_value = ror(mem_value, 8); break;
+ case 0x2: mem_value = ror(mem_value, 16); break;
+ case 0x3: mem_value = ror(mem_value, 24); break;
+ }
+ } else {
+ /*
+ * Byte load of the PC
+ */
+ if (bsp_memory_read((void*)operand, 0, 8, 1, &mem_value) == 0)
+ {
+ /*
+ * Unable to read the memory address.
+ * Don't try any further.
+ */
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at *(0x%08lx): Error\n", operand & ~0x3);
+#endif /* DEBUG_SINGLESTEP */
+ return;
+ } else {
+#if DEBUG_SINGLESTEP
+ bsp_printf("Setting BP at *(0x%08lx): data <0x%08lx>\n", operand & ~0x3, mem_value);
+#endif /* DEBUG_SINGLESTEP */
+ }
+ }
+
+ insert_ss_break((unsigned long *)mem_value);
+}
+
+/*
+ * Calculate a load/store w/ Immediate offset operand based on input
+ * source register, offset value, and opcode (add/sub)
+ */
+static unsigned long load_store_immediate_operand(ex_regs_t *regs,
+ unsigned p_bit,
+ unsigned u_bit,
+ unsigned Rn,
+ unsigned offset)
+{
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *reg_ptr = &regs_array[bsp_regbyte(Rn)];
+ unsigned long rc = *((unsigned long *)(reg_ptr));
+
+ BSP_ASSERT((Rn >= 0) && (Rn <= 0xf));
+ BSP_ASSERT(bsp_regsize(Rn) == sizeof(unsigned long));
+ BSP_ASSERT((offset >= 0) && (offset <= 0xfff));
+ BSP_ASSERT((p_bit >= 0) && (p_bit <= 1));
+ BSP_ASSERT((u_bit >= 0) && (u_bit <= 1));
+
+ /*
+ * According to the ARM(R) Manual, if Rn is PC then,
+ * the value used is the address of the current instruction
+ * plus 8
+ */
+ if (Rn == REG_PC)
+ rc += 8;
+
+ /*
+ * Do the update pre-index update
+ */
+ if (p_bit == LS_INDEX_PRE)
+ {
+ if (u_bit == LS_OFFSET_SUB)
+ rc -= offset;
+ else /* opcode == LS_OFFSET_ADD */
+ rc += offset;
+ }
+
+ return (rc);
+}
+
+/*
+ * Calculate a load/store w/ Register offset operand based on input
+ * source register, offset value, and opcode (add/sub)
+ *
+ * This calculates the appropriate pre-indexed operand
+ */
+static unsigned long load_store_register_operand(ex_regs_t *regs,
+ unsigned p_bit,
+ unsigned u_bit,
+ unsigned Rn,
+ unsigned Rm,
+ unsigned shift,
+ unsigned shift_immed)
+{
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *Rn_ptr = &regs_array[bsp_regbyte(Rn)];
+ unsigned long Rn_val = *((unsigned long *)(Rn_ptr));
+ unsigned long rc, index;
+
+ BSP_ASSERT((Rn >= 0) && (Rn <= 0xf));
+ BSP_ASSERT((Rm >= 0) && (Rm <= 0xf));
+ BSP_ASSERT(bsp_regsize(Rn) == sizeof(unsigned long));
+ BSP_ASSERT(bsp_regsize(Rm) == sizeof(unsigned long));
+ BSP_ASSERT((p_bit >= 0) && (p_bit <= 1));
+ BSP_ASSERT((u_bit >= 0) && (u_bit <= 1));
+ BSP_ASSERT((shift >= 0) && (shift <= 0x3));
+ BSP_ASSERT((shift_immed >= 0) && (shift_immed <= 0x1F));
+
+ /*
+ * According to the ARM(R) Manual, if Rn is PC then
+ * the value used is the address of the current
+ * instruction plus 8
+ */
+ if (Rn == REG_PC)
+ Rn_val += 8;
+
+ /*
+ * According to the ARM(R) Manual, if Rm is PC then
+ * the result is unpredictable. Don't do anything
+ * here. Just return.
+ */
+ if (Rm == REG_PC)
+ return 0;
+
+ index = immediate_shift_operand(regs, shift_immed, shift, Rm);
+
+ rc = Rn_val;
+
+ /*
+ * Do the update pre-index update
+ */
+ if (p_bit == LS_INDEX_PRE)
+ {
+ if (u_bit == LS_OFFSET_SUB)
+ rc = Rn_val - index;
+ else /* opcode == LS_OFFSET_ADD */
+ rc = Rn_val + index;
+ }
+
+ return (rc);
+}
+
+/*
+ * Decode all data processing immediate instructions
+ */
+static void decode_dpi_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ if (inst.dpi.Rd == REG_PC)
+ {
+ unsigned long operand = ror(inst.dpi.immediate, (inst.dpi.rotate << 1));
+ unsigned long *dest = 0;
+ unsigned carry = ((union arm_psr)(unsigned long)(regs->_cpsr)).psr.c_bit;
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *Rn_ptr = &regs_array[bsp_regbyte(inst.dpi.Rn)];
+ unsigned long Rn_val = *((unsigned long *)(Rn_ptr));
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Decoded an data processing immediate instruction.\n");
+ bsp_printf("inst.dpi.immediate = 0x%x\n", inst.dpi.immediate);
+ bsp_printf("inst.dpi.rotate = 0x%x\n", inst.dpi.rotate);
+ bsp_printf("inst.dpi.Rd = 0x%x\n", inst.dpi.Rd);
+ bsp_printf("inst.dpi.Rn = 0x%x\n", inst.dpi.Rn);
+ bsp_printf("inst.dpi.S_bit = 0x%x\n", inst.dpi.S_bit);
+ bsp_printf("inst.dpi.opcode = 0x%x\n", inst.dpi.opcode);
+ bsp_printf("inst.dpi.cond = 0x%x\n", inst.dpi.cond);
+ bsp_printf("operand = 0x%x\n", operand);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ /*
+ * According to the ARM(R) Manual, if Rn is PC then
+ * the value used is the address of the current
+ * instruction plus 8
+ */
+ if (inst.dpi.Rn == REG_PC)
+ Rn_val += 8;
+
+ switch (inst.dpi.opcode) {
+ case DP_OPCODE_ADC: dest = (unsigned long *)(Rn_val + operand + carry); break;
+ case DP_OPCODE_ADD: dest = (unsigned long *)(Rn_val + operand); break;
+ case DP_OPCODE_AND: dest = (unsigned long *)(Rn_val & operand); break;
+ case DP_OPCODE_BIC: dest = (unsigned long *)(Rn_val & ~operand); break;
+ case DP_OPCODE_EOR: dest = (unsigned long *)(Rn_val ^ operand); break;
+ case DP_OPCODE_MOV: dest = (unsigned long *)operand; break;
+ case DP_OPCODE_MVN: dest = (unsigned long *)(~operand); break;
+ case DP_OPCODE_ORR: dest = (unsigned long *)(Rn_val | operand); break;
+ case DP_OPCODE_RSB: dest = (unsigned long *)(operand - Rn_val); break;
+ case DP_OPCODE_RSC: dest = (unsigned long *)(operand - Rn_val - !carry); break;
+ case DP_OPCODE_SBC: dest = (unsigned long *)(Rn_val - operand - !carry); break;
+ case DP_OPCODE_SUB: dest = (unsigned long *)(Rn_val - operand); break;
+ default: dest = (unsigned long *)0; break;
+ }
+ dest = (unsigned long *)((unsigned long)dest & ~0x3);
+ insert_ss_break(dest);
+ }
+}
+
+/*
+ * Decode all data processing immediate w/ shift instructions
+ */
+static void decode_dpis_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ if (inst.dpis.Rd == REG_PC)
+ {
+ unsigned long operand = immediate_shift_operand(regs, inst.dpis.shift_immed,
+ inst.dpis.shift, inst.dpis.Rm);
+ unsigned long *dest = 0;
+ unsigned carry = ((union arm_psr)(unsigned long)(regs->_cpsr)).psr.c_bit;
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *Rn_ptr = &regs_array[bsp_regbyte(inst.dpis.Rn)];
+ unsigned long Rn_val = *((unsigned long *)(Rn_ptr));
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Decoded an data processing immediate shift instruction.\n");
+ bsp_printf("inst.dpis.Rm = 0x%x\n", inst.dpis.Rm);
+ bsp_printf("inst.dpis.shift = 0x%x\n", inst.dpis.shift);
+ bsp_printf("inst.dpis.shift_immed = 0x%x\n", inst.dpis.shift_immed);
+ bsp_printf("inst.dpis.Rd = 0x%x\n", inst.dpis.Rd);
+ bsp_printf("inst.dpis.Rn = 0x%x\n", inst.dpis.Rn);
+ bsp_printf("inst.dpis.S_bit = 0x%x\n", inst.dpis.S_bit);
+ bsp_printf("inst.dpis.opcode = 0x%x\n", inst.dpis.opcode);
+ bsp_printf("inst.dpis.cond = 0x%x\n", inst.dpis.cond);
+ bsp_printf("operand = 0x%x\n", operand);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ /*
+ * According to the ARM(R) Manual, if Rn is PC then
+ * the value used is the address of the current
+ * instruction plus 8
+ */
+ if (inst.dpis.Rn == REG_PC)
+ Rn_val += 8;
+
+ switch (inst.dpis.opcode) {
+ case DP_OPCODE_ADC: dest = (unsigned long *)(Rn_val + operand + carry); break;
+ case DP_OPCODE_ADD: dest = (unsigned long *)(Rn_val + operand); break;
+ case DP_OPCODE_AND: dest = (unsigned long *)(Rn_val & operand); break;
+ case DP_OPCODE_BIC: dest = (unsigned long *)(Rn_val & ~operand); break;
+ case DP_OPCODE_EOR: dest = (unsigned long *)(Rn_val ^ operand); break;
+ case DP_OPCODE_MOV: dest = (unsigned long *)operand; break;
+ case DP_OPCODE_MVN: dest = (unsigned long *)(~operand); break;
+ case DP_OPCODE_ORR: dest = (unsigned long *)(Rn_val | operand); break;
+ case DP_OPCODE_RSB: dest = (unsigned long *)(operand - Rn_val); break;
+ case DP_OPCODE_RSC: dest = (unsigned long *)(operand - Rn_val - !carry); break;
+ case DP_OPCODE_SBC: dest = (unsigned long *)(Rn_val - operand - !carry); break;
+ case DP_OPCODE_SUB: dest = (unsigned long *)(Rn_val - operand); break;
+ default: dest = (unsigned long *)0; break;
+ }
+ dest = (unsigned long *)((unsigned long)dest & ~0x3);
+ insert_ss_break(dest);
+ }
+}
+
+/*
+ * Decode all data processing register w/ shift instructions
+ */
+static void decode_dprs_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ if (inst.dprs.Rd == REG_PC)
+ {
+ unsigned long operand = register_shift_operand(regs, inst.dprs.Rs,
+ inst.dprs.shift, inst.dprs.Rm);
+ unsigned long *dest = 0;
+ unsigned carry = ((union arm_psr)(unsigned long)(regs->_cpsr)).psr.c_bit;
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *Rn_ptr = &regs_array[bsp_regbyte(inst.dprs.Rn)];
+ unsigned long Rn_val = *((unsigned long *)(Rn_ptr));
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Decoded an data processing register shift instruction.\n");
+ bsp_printf("inst.dprs.Rm = 0x%x\n", inst.dprs.Rm);
+ bsp_printf("inst.dprs.rsv3 = 0x%x\n", inst.dprs.rsv3);
+ bsp_printf("inst.dprs.shift = 0x%x\n", inst.dprs.shift);
+ bsp_printf("inst.dprs.rsv2 = 0x%x\n", inst.dprs.rsv2);
+ bsp_printf("inst.dprs.Rs = 0x%x\n", inst.dprs.Rs);
+ bsp_printf("inst.dprs.Rd = 0x%x\n", inst.dprs.Rd);
+ bsp_printf("inst.dprs.Rn = 0x%x\n", inst.dprs.Rn);
+ bsp_printf("inst.dprs.S_bit = 0x%x\n", inst.dprs.S_bit);
+ bsp_printf("inst.dprs.opcode = 0x%x\n", inst.dprs.opcode);
+ bsp_printf("inst.dprs.rsv1 = 0x%x\n", inst.dprs.rsv1);
+ bsp_printf("inst.dprs.cond = 0x%x\n", inst.dprs.cond);
+ bsp_printf("operand = 0x%x\n", operand);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ /*
+ * According to the ARM(R) Manual, if Rn is PC then
+ * the value used is the address of the current
+ * instruction plus 8
+ */
+ if (inst.dprs.Rn == REG_PC)
+ Rn_val += 8;
+
+ switch (inst.dprs.opcode) {
+ case DP_OPCODE_ADC: dest = (unsigned long *)(Rn_val + operand + carry); break;
+ case DP_OPCODE_ADD: dest = (unsigned long *)(Rn_val + operand); break;
+ case DP_OPCODE_AND: dest = (unsigned long *)(Rn_val & operand); break;
+ case DP_OPCODE_BIC: dest = (unsigned long *)(Rn_val & ~operand); break;
+ case DP_OPCODE_EOR: dest = (unsigned long *)(Rn_val ^ operand); break;
+ case DP_OPCODE_MOV: dest = (unsigned long *)operand; break;
+ case DP_OPCODE_MVN: dest = (unsigned long *)(~operand); break;
+ case DP_OPCODE_ORR: dest = (unsigned long *)(Rn_val | operand); break;
+ case DP_OPCODE_RSB: dest = (unsigned long *)(operand - Rn_val); break;
+ case DP_OPCODE_RSC: dest = (unsigned long *)(operand - Rn_val - !carry); break;
+ case DP_OPCODE_SBC: dest = (unsigned long *)(Rn_val - operand - !carry); break;
+ case DP_OPCODE_SUB: dest = (unsigned long *)(Rn_val - operand); break;
+ default: dest = (unsigned long *)0; break;
+ }
+
+ dest = (unsigned long *)((unsigned long)dest & ~0x3);
+ insert_ss_break(dest);
+ }
+}
+
+/*
+ * Decode all multiply instructions
+ */
+static void decode_m_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * According to the ARM(R) Manual, if Rd is PC then
+ * the result is unpredictable. Don't do anything
+ * here. Just return.
+ */
+}
+
+/*
+ * Decode all multiply long instructions
+ */
+static void decode_ml_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * According to the ARM(R) Manual, if Rd is PC then
+ * the result is unpredictable. Don't do anything
+ * here. Just return.
+ */
+}
+
+
+/*
+ * Decode all move from status register instructions
+ */
+static void decode_mrs_inst(ex_regs_t *regs, union arm_insn inst)
+{
+#if 0
+ if (inst.mrs.Rd == REG_PC)
+ {
+ unsigned long *dest = 0;
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Decoded an move from status register instruction.\n");
+ bsp_printf("inst.mrs.SBZ = 0x%x\n", inst.mrs.SBZ);
+ bsp_printf("inst.mrs.Rd = 0x%x\n", inst.mrs.Rd);
+ bsp_printf("inst.mrs.SBO = 0x%x\n", inst.mrs.SBO);
+ bsp_printf("inst.mrs.rsv2 = 0x%x\n", inst.mrs.rsv2);
+ bsp_printf("inst.mrs.R_bit = 0x%x\n", inst.mrs.R_bit);
+ bsp_printf("inst.mrs.rsv1 = 0x%x\n", inst.mrs.rsv1);
+ bsp_printf("inst.mrs.cond = 0x%x\n", inst.mrs.cond);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ if (inst.mrs.R_bit == 1)
+ dest = (unsigned long *)regs->_spsr;
+ else
+ dest = (unsigned long *)regs->_cpsr;
+
+ dest = (unsigned long *)((unsigned long)dest & ~0x3);
+ insert_ss_break(dest);
+ }
+#endif
+}
+
+
+/*
+ * Decode all move immediate to status register instructions
+ */
+static void decode_misr_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Can't update the PC w/ this instruction.
+ * Don't set any more breakpoints
+ */
+}
+
+
+/*
+ * Decode all move register to status registers instructions
+ */
+static void decode_mrsr_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Can't update the PC w/ this instruction.
+ * Don't set any more breakpoints
+ */
+}
+
+
+/*
+ * Decode all branch/exchange instructions
+ */
+static void decode_bx_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ unsigned long operand = branch_exchange_operand(regs, inst.bx.Rm);
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Decoded an branch/exchange shift instruction.\n");
+ bsp_printf("inst.bx.Rm = 0x%x\n", inst.bx.Rm);
+ bsp_printf("inst.bx.rsv2 = 0x%x\n", inst.bx.rsv2);
+ bsp_printf("inst.bx.SBO3 = 0x%x\n", inst.bx.SBO3);
+ bsp_printf("inst.bx.SBO2 = 0x%x\n", inst.bx.SBO2);
+ bsp_printf("inst.bx.SBO1 = 0x%x\n", inst.bx.SBO1);
+ bsp_printf("inst.bx.rsv1 = 0x%x\n", inst.bx.rsv1);
+ bsp_printf("inst.bx.cond = 0x%x\n", inst.bx.cond);
+ bsp_printf("operand = 0x%x\n", operand);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ insert_ss_break((unsigned long *)operand);
+}
+
+
+/*
+ * Decode all load/store immediate offset instructions
+ */
+static void decode_lsio_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Only support direct loads of the PC
+ *
+ * According to the ARM(R) manual, automatic updates of the PC
+ * are UNPREDICTABLE (ie implementation defined).
+ */
+ if ((inst.lsio.Rd == REG_PC) && (inst.lsio.L_bit == LS_LOAD))
+ {
+ unsigned long operand = load_store_immediate_operand(regs, inst.lsio.P_bit,
+ inst.lsio.U_bit, inst.lsio.Rn,
+ inst.lsio.immediate);
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Decoded an load/store w/ immediate offset instruction.\n");
+ bsp_printf("inst.lsio.immediate = 0x%x\n", inst.lsio.immediate);
+ bsp_printf("inst.lsio.Rd = 0x%x\n", inst.lsio.Rd);
+ bsp_printf("inst.lsio.Rn = 0x%x\n", inst.lsio.Rn);
+ bsp_printf("inst.lsio.L_bit = 0x%x\n", inst.lsio.L_bit);
+ bsp_printf("inst.lsio.W_bit = 0x%x\n", inst.lsio.W_bit);
+ bsp_printf("inst.lsio.B_bit = 0x%x\n", inst.lsio.B_bit);
+ bsp_printf("inst.lsio.U_bit = 0x%x\n", inst.lsio.U_bit);
+ bsp_printf("inst.lsio.P_bit = 0x%x\n", inst.lsio.P_bit);
+ bsp_printf("inst.lsio.rsv1 = 0x%x\n", inst.lsio.rsv1);
+ bsp_printf("inst.lsio.cond = 0x%x\n", inst.lsio.cond);
+ bsp_printf("operand = 0x%x\n", operand);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ handle_pc_load(inst.lsio.B_bit, operand);
+ }
+}
+
+
+/*
+ * Decode all load/store register offset instructions
+ */
+static void decode_lsro_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Only support direct loads of the PC
+ *
+ * According to the ARM(R) manual, automatic updates of the PC
+ * are UNPREDICTABLE (ie implementation defined).
+ */
+ if ((inst.lsro.Rd == REG_PC) && (inst.lsro.L_bit == LS_LOAD))
+ {
+ unsigned long operand = load_store_register_operand(regs,
+ inst.lsro.P_bit,
+ inst.lsro.U_bit,
+ inst.lsro.Rn,
+ inst.lsro.Rm,
+ inst.lsro.shift,
+ inst.lsro.shift_immed);
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Decoded an load/store w/ register offset instruction.\n");
+ bsp_printf("inst.lsro.Rm = 0x%x\n", inst.lsro.Rm);
+ bsp_printf("inst.lsro.rsv2 = 0x%x\n", inst.lsro.rsv2);
+ bsp_printf("inst.lsro.shift = 0x%x\n", inst.lsro.shift);
+ bsp_printf("inst.lsro.shift_immed = 0x%x\n", inst.lsro.shift_immed);
+ bsp_printf("inst.lsro.Rd = 0x%x\n", inst.lsro.Rd);
+ bsp_printf("inst.lsro.Rn = 0x%x\n", inst.lsro.Rn);
+ bsp_printf("inst.lsro.L_bit = 0x%x\n", inst.lsro.L_bit);
+ bsp_printf("inst.lsro.W_bit = 0x%x\n", inst.lsro.W_bit);
+ bsp_printf("inst.lsro.B_bit = 0x%x\n", inst.lsro.B_bit);
+ bsp_printf("inst.lsro.U_bit = 0x%x\n", inst.lsro.U_bit);
+ bsp_printf("inst.lsro.P_bit = 0x%x\n", inst.lsro.P_bit);
+ bsp_printf("inst.lsro.rsv1 = 0x%x\n", inst.lsro.rsv1);
+ bsp_printf("inst.lsro.cond = 0x%x\n", inst.lsro.cond);
+ bsp_printf("operand = 0x%x\n", operand);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ handle_pc_load(inst.lsro.B_bit, operand);
+ }
+}
+
+
+/*
+ * Decode all load/store halfword/signed byte immediate offset instructions
+ */
+static void decode_lshwi_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * According to the ARM(R) Manual, if Rd is PC then
+ * the result is unpredictable. Don't do anything
+ * here. Just return.
+ */
+}
+
+
+/*
+ * Decode all load/store halfword/signed byte register offset instructions
+ */
+static void decode_lshwr_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * According to the ARM(R) Manual, if Rd is PC then
+ * the result is unpredictable. Don't do anything
+ * here. Just return.
+ */
+}
+
+
+/*
+ * Decode all swap/swap byte instructions
+ */
+static void decode_swap_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * According to the ARM(R) Manual, if Rd is PC then
+ * the result is unpredictable. Don't do anything
+ * here. Just return.
+ */
+}
+
+
+/*
+ * Decode all load/store multiple instructions
+ */
+static void decode_lsm_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Only support direct load multiples where the PC is in the
+ * register list.
+ *
+ * According to the ARM(R) manual, automatic updates of the PC
+ * are UNPREDICTABLE (ie implementation defined).
+ */
+ if ((inst.lsm.L_bit == LS_LOAD) && (inst.lsm.Reg_List & (0x1 << REG_PC)))
+ {
+ unsigned char *regs_array = (unsigned char *)regs;
+ unsigned char *Rn_ptr = &regs_array[bsp_regbyte(inst.lsm.Rn)];
+ unsigned long Rn_val = *((unsigned long *)(Rn_ptr));
+ unsigned long offset_to_pc = 0;
+ int i;
+ unsigned long **dest = 0;
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Decoded an load multiple instruction.\n");
+ bsp_printf("inst.lsm.Reg_List = 0x%x\n", inst.lsm.Reg_List);
+
+ bsp_printf("inst.lsm.Rn = 0x%x\n", inst.lsm.Rn);
+ bsp_printf("inst.lsm.L_bit = 0x%x\n", inst.lsm.L_bit);
+ bsp_printf("inst.lsm.W_bit = 0x%x\n", inst.lsm.W_bit);
+ bsp_printf("inst.lsm.S_bit = 0x%x\n", inst.lsm.S_bit);
+ bsp_printf("inst.lsm.U_bit = 0x%x\n", inst.lsm.U_bit);
+ bsp_printf("inst.lsm.P_bit = 0x%x\n", inst.lsm.P_bit);
+ bsp_printf("inst.lsm.rsv1 = 0x%x\n", inst.lsm.rsv1);
+ bsp_printf("inst.lsm.cond = 0x%x\n", inst.lsm.cond);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ if (inst.lsm.U_bit == 0)
+ {
+ /*
+ * We are using a ascending stack.
+ * That means the PC is actually the register
+ * nearest to Rn currently.
+ */
+ if (inst.lsm.P_bit == 1)
+ /*
+ * Using a pre-decrement.
+ */
+ offset_to_pc = -bsp_regsize(REG_PC);
+ else
+ offset_to_pc = 0;
+ } else {
+ /*
+ * We are using an descending stack.
+ * That means the PC is actually the register
+ * farthest from Rn currently.
+ *
+ * Find the number of registers stored before the PC
+ */
+ for (i = 0; i < REG_PC; i++)
+ {
+ if ((inst.lsm.Reg_List & (0x1 << i)) != 0)
+ {
+ /*
+ * Bit #i is set. Increment our count.
+ */
+ offset_to_pc += bsp_regsize(i);
+ }
+ }
+
+ /*
+ * Adjust the offset if we do a decrement/increment __BEFORE__
+ * the write.
+ */
+ if (inst.lsm.P_bit == 1)
+ offset_to_pc += bsp_regsize(REG_PC);
+ }
+
+ /*
+ * Now let's calculate the real address of the stored PC
+ * making sure to mask out the two LO bits.
+ */
+ dest = (unsigned long **)((Rn_val + offset_to_pc) & ~0x3);
+
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Rn_val = 0x%08lx\n", Rn_val);
+ bsp_printf("offset_to_pc = 0x%08lx\n", offset_to_pc);
+ bsp_printf("dest = 0x%08lx\n", dest);
+ bsp_printf("*dest = 0x%08lx\n", *dest);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+
+ insert_ss_break(*dest);
+ }
+}
+
+
+/*
+ * Decode all coprocessor data processing instructions
+ */
+static void decode_cpdp_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Can't possibly predict what this instruction will do.
+ * Don't do anything here. Just return.
+ */
+}
+
+
+/*
+ * Decode all coprocessor register transfer instructions
+ */
+static void decode_cprt_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Can't possibly predict what this instruction will do.
+ * Don't do anything here. Just return.
+ */
+}
+
+
+/*
+ * Decode all coprocessor load/store instructions
+ */
+static void decode_cpls_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Can't possibly predict what this instruction will do.
+ * Don't do anything here. Just return.
+ */
+}
+
+
+/*
+ * Decode all branch/branch w/ link instructions
+ */
+static void decode_bbl_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ unsigned long disp = inst.bbl.offset;
+
+ /*
+ * Sign extend the 24 bit value
+ */
+ if (disp & 0x00800000)
+ disp |= 0xff000000;
+
+ /*
+ * Convert to long words
+ */
+ disp <<= 2;
+
+ /*
+ * Note: when the processor actually executes this instruction, the pc
+ * will point to the address of the current instruction + 8 because
+ * of the fetch/decode/execute cycle
+ */
+ disp += 8;
+
+ insert_ss_break((unsigned long *)(regs->_pc + disp));
+}
+
+
+/*
+ * Decode all swi instructions
+ */
+static void decode_swi_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Can't possibly predict where we should set the breakpoint for this.
+ * Don't do anything here. Just return.
+ */
+}
+
+
+/*
+ * Decode all undefined instructions
+ */
+static void decode_undef_inst(ex_regs_t *regs, union arm_insn inst)
+{
+ /*
+ * Can't possibly predict what this instruction will do.
+ * Don't do anything here. Just return.
+ */
+}
+
+
+/*
+ * Set breakpoint instructions for single stepping.
+ */
+void
+bsp_singlestep_setup(void *registers)
+{
+ ex_regs_t *regs = (ex_regs_t *)registers;
+ union arm_insn inst;
+
+ if (bsp_memory_read((void*)(regs->_pc), 0, ARM_INST_SIZE * 8, 1, &(inst.word)) == 0)
+ {
+ /*
+ * Unable to read the instruction at the current address.
+ * Let's not do anything with this. We can't set breakpoints
+ * so let's get out now.
+ */
+ return;
+ }
+
+ /*
+ * Handle the simple case -- linear code
+ */
+ insert_ss_break((unsigned long *)(regs->_pc + ARM_INST_SIZE));
+
+ /*
+ * Now, we need to decode the instructions and figure out what
+ * they would do.
+ */
+ if ((inst.mrs.rsv1 == MRS_RSV1_VALUE) &&
+ (inst.mrs.rsv2 == MRS_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("MRS type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_mrs_inst(regs, inst);
+ } else if ((inst.misr.rsv1 == MISR_RSV1_VALUE) &&
+ (inst.misr.rsv2 == MISR_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("MISR type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_misr_inst(regs, inst);
+ } else if ((inst.mrsr.rsv1 == MRSR_RSV1_VALUE) &&
+ (inst.mrsr.rsv2 == MRSR_RSV2_VALUE) &&
+ (inst.mrsr.rsv3 == MRSR_RSV3_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("MRSR type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_mrsr_inst(regs, inst);
+ } else if (inst.dpi.rsv1 == DPI_RSV1_VALUE) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("DPI type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_dpi_inst(regs, inst);
+ } else if ((inst.bx.rsv1 == BX_RSV1_VALUE) &&
+ (inst.bx.rsv2 == BX_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("BX type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_bx_inst(regs, inst);
+ } else if ((inst.dpis.rsv1 == DPIS_RSV1_VALUE) &&
+ (inst.dpis.rsv2 == DPIS_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("DPIS type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_dpis_inst(regs, inst);
+ } else if ((inst.dprs.rsv1 == DPRS_RSV1_VALUE) &&
+ (inst.dprs.rsv2 == DPRS_RSV2_VALUE) &&
+ (inst.dprs.rsv3 == DPRS_RSV3_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("DPRS type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_dprs_inst(regs, inst);
+ } else if ((inst.m.rsv1 == M_RSV1_VALUE) &&
+ (inst.m.rsv2 == M_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("M type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_m_inst(regs, inst);
+ } else if ((inst.ml.rsv1 == ML_RSV1_VALUE) &&
+ (inst.ml.rsv2 == ML_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("ML type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_ml_inst(regs, inst);
+ } else if (inst.lsio.rsv1 == LSIO_RSV1_VALUE) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("LSIO type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_lsio_inst(regs, inst);
+ } else if ((inst.lsro.rsv1 == LSRO_RSV1_VALUE) &&
+ (inst.lsro.rsv2 == LSRO_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("LSRO type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_lsro_inst(regs, inst);
+ } else if ((inst.lshwi.rsv1 == LSHWI_RSV1_VALUE) &&
+ (inst.lshwi.rsv2 == LSHWI_RSV2_VALUE) &&
+ (inst.lshwi.rsv3 == LSHWI_RSV3_VALUE) &&
+ (inst.lshwi.rsv4 == LSHWI_RSV4_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("LSHWI type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_lshwi_inst(regs, inst);
+ } else if ((inst.lshwr.rsv1 == LSHWR_RSV1_VALUE) &&
+ (inst.lshwr.rsv2 == LSHWR_RSV2_VALUE) &&
+ (inst.lshwr.rsv3 == LSHWR_RSV3_VALUE) &&
+ (inst.lshwr.rsv4 == LSHWR_RSV4_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("LSHWR type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_lshwr_inst(regs, inst);
+ } else if ((inst.swap.rsv1 == SWAP_RSV1_VALUE) &&
+ (inst.swap.rsv2 == SWAP_RSV2_VALUE) &&
+ (inst.swap.rsv3 == SWAP_RSV3_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("SWAP type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_swap_inst(regs, inst);
+ } else if (inst.lsm.rsv1 == LSM_RSV1_VALUE) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("LSM type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_lsm_inst(regs, inst);
+ } else if ((inst.cpdp.rsv1 == CPDP_RSV1_VALUE) &&
+ (inst.cpdp.rsv2 == CPDP_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("CPDP type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_cpdp_inst(regs, inst);
+ } else if ((inst.cprt.rsv1 == CPRT_RSV1_VALUE) &&
+ (inst.cprt.rsv2 == CPRT_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("CPRT type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_cprt_inst(regs, inst);
+ } else if (inst.cpls.rsv1 == CPLS_RSV1_VALUE) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("CPLS type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_cpls_inst(regs, inst);
+ } else if (inst.bbl.rsv1 == BBL_RSV1_VALUE) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("BBL type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_bbl_inst(regs, inst);
+ } else if (inst.swi.rsv1 == SWI_RSV1_VALUE) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("SWI type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_swi_inst(regs, inst);
+ } else if ((inst.undef.rsv1 == UNDEF_RSV1_VALUE) &&
+ (inst.undef.rsv2 == UNDEF_RSV2_VALUE)) {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("UNDEF type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ decode_undef_inst(regs, inst);
+ } else {
+#if DEBUG_SINGLESTEP_VERBOSE
+ bsp_printf("Unknown instruction type: 0x%08lx\n", inst.word);
+#endif /* DEBUG_SINGLESTEP_VERBOSE */
+ }
+}
+
+void
+bsp_skip_instruction(void *registers)
+{
+ ex_regs_t *regs = (ex_regs_t *)registers;
+ regs->_pc += ARM_INST_SIZE;
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/bsp.h b/cesar/ecos/packages/cygmon/current/misc/bsp/bsp.h
new file mode 100644
index 0000000000..ce52e74c1f
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/bsp.h
@@ -0,0 +1,445 @@
+#ifndef __BSP_BSP_H__
+#define __BSP_BSP_H__
+//==========================================================================
+//
+// bsp.h
+//
+// Public interface to Red Hat BSP.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Public interface to Red Hat BSP.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#ifndef __ASSEMBLER__
+
+/* needed for _bsp_vsprintf() */
+#include <stdarg.h>
+
+/*
+ * Exception and interrupt handler type.
+ */
+#ifndef _BSP_HANDLER_T_DEFINED
+#define _BSP_HANDLER_T_DEFINED
+typedef int (*bsp_handler_t)(int __irq_nr, void *__regs);
+#endif // _BSP_HANDLER_T_DEFINED
+
+/*
+ * Vector descriptor. This is needed for chaining vectors. The interfaces use
+ * bsp_vec structure pointers instead of direct pointers to handlers. This
+ * puts the responsibility for allocating the bsp_vec structures on the
+ * caller, rather than the BSP code.
+ */
+typedef struct bsp_vec {
+ bsp_handler_t handler; /* pointer to actual ISR */
+ struct bsp_vec *next; /* for chaining */
+} bsp_vec_t;
+
+/*
+ * Valid op values for vector install routines.
+ */
+#define BSP_VEC_REPLACE 0
+#define BSP_VEC_CHAIN_FIRST 1
+#define BSP_VEC_CHAIN_LAST 2
+
+/*
+ * Valid kinds of vectors supported by vector install and remove
+ * routines.
+ */
+#define BSP_VEC_EXCEPTION 0
+#define BSP_VEC_INTERRUPT 1
+
+/*
+ * Routine to cause a breakpoint exception.
+ */
+extern void bsp_breakpoint(void);
+
+/*
+ * Dummy function whose address is the address of
+ * the breakpoint caused by calling bsp_breakpoint().
+ */
+extern void bsp_breakinsn(void);
+
+/*
+ * Enable given irq.
+ */
+extern void bsp_enable_irq(int __irq_nr);
+
+/*
+ * Disable given irq. Returns true if irq was enabled.
+ */
+extern int bsp_disable_irq(int __irq_nr);
+
+/*
+ * Remove given vector from vector chain.
+ */
+extern void bsp_remove_vec(int __vec_kind,
+ int __vec_nr,
+ bsp_vec_t *__vec);
+
+/*
+ * Install a vector chain.
+ *
+ * vec_kind may be BSP_VEC_EXCEPTION or BSP_VEC_INTERRUPT.
+ * vec_nr is the exception or interrupt number.
+ * op may be one of:
+ * BSP_VEC_REPLACE - replace existing chain.
+ * BSP_VEC_CHAIN_FIRST - install at head of chain.
+ * BSP_VEC_CHAIN_LAST - install at tail of chain.
+ *
+ */
+extern bsp_vec_t *bsp_install_vec(int __vec_kind,
+ int __vec_nr,
+ int __op,
+ bsp_vec_t *__vec);
+
+/*
+ * Install a debug handler.
+ * Returns old handler being replaced.
+ */
+extern bsp_handler_t bsp_install_dbg_handler(bsp_handler_t __new_handler);
+
+/*
+ * Sometimes it is desireable to call the debug handler directly. This routine
+ * accomplishes that. It is the responsibility of the caller to insure that
+ * interrupts are disabled before calling this routine.
+ */
+extern void bsp_invoke_dbg_handler(int __exc_nr, void *__regs);
+
+/*
+ * Install a 'kill' handler. This handler is called when debugger
+ * issues a kill command.
+ * Returns old handler being replaced.
+ */
+extern bsp_handler_t bsp_install_kill_handler(bsp_handler_t __new_handler);
+
+/*
+ * Architecure specific routine to prepare CPU to execute
+ * a single machine instruction.
+ */
+#ifndef USE_ECOS_HAL_SINGLESTEP
+extern void bsp_singlestep_setup(void *__saved_regs);
+#endif /* USE_ECOS_HAL_SINGLESTEP */
+
+/*
+ * Architecure specific routine to cleanup after a single-step
+ * completes.
+ */
+#ifndef USE_ECOS_HAL_SINGLESTEP
+extern void bsp_singlestep_cleanup(void *__saved_regs);
+#endif /* USE_ECOS_HAL_SINGLESTEP */
+
+/*
+ * Architecture specific routine to skip past the current machine instruction.
+ */
+#ifndef USE_ECOS_HAL_SINGLESTEP
+extern void bsp_skip_instruction(void *__saved_regs);
+#endif /* USE_ECOS_HAL_SINGLESTEP */
+
+/*
+ * Return byte offset within the saved register area of the
+ * given register.
+ */
+extern int bsp_regbyte(int __regno);
+
+/*
+ * Return size in bytes of given register.
+ */
+extern int bsp_regsize(int __regno);
+
+/*
+ * Setup the saved registered to establish the given Program Counter.
+ */
+#ifndef bsp_set_pc
+extern void bsp_set_pc(unsigned long __pc, void *__saved_regs);
+#endif
+
+/*
+ * Get the current Program Counter from the saved registers.
+ */
+#ifndef bsp_get_pc
+unsigned long bsp_get_pc(void *__saved_regs);
+#endif
+
+extern int bsp_memory_read(void *__addr, /* start addr of memory to read */
+ int __asid, /* address space id */
+ int __rsize, /* size of individual read ops */
+ int __nreads, /* number of read operations */
+ void *__buf); /* result buffer */
+
+extern int bsp_memory_write(void *__addr, /* start addr of memory to write */
+ int __asid, /* address space id */
+ int __wsize, /* size of individual write ops */
+ int __nwrites, /* number of write operations */
+ void *__buf); /* source buffer for write data */
+
+/*
+ * Architecture specific routines to read and write CPU registers.
+ */
+extern void bsp_set_register(int __regno, void *__saved_regs, void *__val);
+extern void bsp_get_register(int __regno, void *__saved_regs, void *__val);
+
+
+/*
+ * Architecture specific conversion of raw exception info into
+ * a signal value.
+ */
+#ifndef bsp_get_signal
+extern int bsp_get_signal(int __exc_nr, void *__saved_regs);
+#endif
+
+/* light-weight bsp printf to console port */
+extern void bsp_printf(const char *__fmt, ...);
+
+/* light-weight bsp printf to debug port */
+extern void bsp_dprintf(const char *__fmt, ...);
+
+/* bsp vsprintf */
+extern int bsp_vsprintf(char *__str, const char *__fmt, va_list __ap);
+
+/* bsp vprintf to console port */
+extern void bsp_vprintf(const char *__fmt, va_list __ap);
+
+/* bsp vprintf to debug port */
+extern void bsp_dvprintf(const char *__fmt, va_list __ap);
+
+/* bsp sprintf */
+extern void bsp_sprintf(char *str, const char *fmt, ...);
+
+#ifdef NDEBUG
+#define BSP_ASSERT(e) ((void)0)
+#else /* NDEBUG */
+extern void _bsp_assert(const char *, const int, const char *);
+#define BSP_ASSERT(e) ((e) ? (void)0 : _bsp_assert(__FILE__, __LINE__, #e))
+#endif /* NDEBUG */
+
+/*
+ * Functions for low-level console and debug i/o.
+ */
+extern void bsp_console_write(const char *__p, int __len);
+extern void bsp_console_putc(char __ch);
+extern int bsp_console_read(char *__p, int __len);
+extern int bsp_console_getc(void);
+extern void bsp_console_ungetc(char ch);
+extern void bsp_debug_write(const char *__p, int __len);
+extern int bsp_debug_read(char *__p, int __len);
+extern void bsp_debug_putc(char __ch);
+extern int bsp_debug_getc(void);
+extern void bsp_debug_ungetc(char ch);
+
+/*
+ * Disable interrupts for debug comm channel.
+ * Returns true if interrupts were previously enabled,
+ * false if interrupts were already disabled.
+ */
+extern int bsp_debug_irq_disable(void);
+extern void bsp_debug_irq_enable(void);
+
+/*
+ * Cache control functions. May be noops for architectures not
+ * supporting caches.
+ *
+ * The icache flush simply invalidates _at_least_ the range of
+ * addresses specified.
+ *
+ * The dcache flush writes back (if write-back cache) and invalidates
+ * _at_least_ the range of addresses specified.
+ *
+ */
+extern void bsp_flush_dcache(void *__p, int __nbytes);
+extern void bsp_flush_icache(void *__p, int __nbytes);
+
+/*
+ * Reset function. May be noops for architectures not
+ * supporting software reset.
+ */
+extern void bsp_reset(void);
+
+/*
+ * Generic data (board and CPU specific) handling
+ */
+extern void *bsp_cpu_data(void);
+extern void *bsp_board_data(void);
+
+/*
+ * List of board characteristics which can be read queried by BSP clients. These
+ * information IDs are passed to:
+ *
+ * int bsp_sysinfo(enum bsp_info_id id, ...);
+ *
+ * Some pieces of information may have more than one instance. For example, the
+ * BSP will likely have information on multiple memory regions. In those cases,
+ * a particular instance may be accessed using a small integer index argument.
+ *
+ * The following comments indicate what additional arguments are needed
+ * to access the specific information.
+ */
+enum bsp_info_id {
+ /*
+ * CPU and board names.
+ *
+ * err = bsp_sysinfo(BSP_INFO_PLATFORM,
+ * struct bsp_platform_info *result)
+ *
+ * err => zero if successful, -1 if unsupported.
+ */
+ BSP_INFO_PLATFORM,
+
+ /*
+ * Data, instruction, and secondary caches.
+ *
+ * err = bsp_sysinfo(BSP_INFO_[DIS]CACHE,
+ * struct bsp_cache_info *result)
+ *
+ * err => zero if successful, -1 if unsupported.
+ *
+ */
+ BSP_INFO_DCACHE,
+ BSP_INFO_ICACHE,
+ BSP_INFO_SCACHE,
+
+ /*
+ * Memory region info.
+ *
+ * err = bsp_sysinfo(BSP_INFO_MEMORY,
+ * int index,
+ * struct bsp_mem_info *result)
+ *
+ * err => zero if successful, -1 if invalid index.
+ *
+ * Caller should start index at zero, then increment index for subsequent
+ * calls until error return indicates no more memory regions.
+ */
+ BSP_INFO_MEMORY,
+
+ /*
+ * Communication channel info.
+ *
+ * err = bsp_sysinfo(BSP_INFO_COMM,
+ * int index,
+ * struct bsp_comm_info *result)
+ *
+ * err => zero if successful, -1 if invalid index.
+ *
+ * Caller should start index at zero, then increment index for subsequent
+ * calls until error return indicates no more comm channels.
+ */
+ BSP_INFO_COMM
+};
+
+
+/*
+ * Platform info.
+ */
+struct bsp_platform_info {
+ const char *cpu; /* CPU name*/
+ const char *board; /* board name */
+ const char *extra; /* extra info */
+};
+
+
+/*
+ * Cache size info.
+ */
+struct bsp_cachesize_info {
+ int size; /* total size in bytes */
+ short linesize; /* width of cacheline in bytes */
+ short ways; /* number of ways per line */
+};
+
+
+/*
+ * Memory region info.
+ * The BSP may describe multiple memory regions. For example,
+ * DRAM may be comprised of several non-contiguous regions.
+ * ROM and FLASH regions may also be described.
+ *
+ */
+struct bsp_mem_info {
+ void *phys_start; /* physical start address */
+ void *virt_start; /* virtual start address */
+ int virt_asid; /* some architectures also use an address space id */
+ long nbytes; /* length of region in bytes */
+ int kind; /* kind of memory */
+#define BSP_MEM_RAM 1
+#define BSP_MEM_FLASH 2
+#define BSP_MEM_ROM 3
+};
+
+
+struct bsp_comm_info {
+ char *name;
+ short kind;
+#define BSP_COMM_SERIAL 1
+#define BSP_COMM_ENET 2
+ short protocol;
+#define BSP_PROTO_NONE 0
+#define BSP_PROTO_UDP 1
+#define BSP_PROTO_TCP 2
+};
+
+
+extern int bsp_sysinfo(enum bsp_info_id __id, ...);
+
+/*
+ * Set or get active debug and console channels.
+ * Returns -1 if unsucessful.
+ * If the passed in __comm_id is -1, then the id of the current channel
+ * is returned.
+ */
+extern int bsp_set_debug_comm(int __comm_id);
+extern int bsp_set_console_comm(int __comm_id);
+
+/*
+ * Set or get the current baud rate of a serial comm channel.
+ * Returns -1 on if unsuccessful.
+ * If the given baud is -1, then the current baudrate is returned.
+ */
+extern int bsp_set_serial_baud(int __comm_id, int baud);
+
+#endif
+
+#endif // __BSP_BSP_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/breakpoint.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/breakpoint.c
new file mode 100644
index 0000000000..d893ce0b53
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/breakpoint.c
@@ -0,0 +1,97 @@
+//==========================================================================
+//
+// breakpoint.c
+//
+// Breakpoint generation.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Breakpoint generation.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <bsp/cpu.h>
+#include <bsp/bsp.h>
+
+#ifndef DEBUG_BREAKPOINT
+#define DEBUG_BREAKPOINT 0
+#endif
+
+#ifdef __ECOS__
+#include <cyg/hal/hal_arch.h>
+#endif /* __ECOS__ */
+
+/*
+ * Trigger a breakpoint exception.
+ */
+void
+bsp_breakpoint(void)
+{
+#if DEBUG_BREAKPOINT
+ bsp_printf("Before BP\n");
+#endif
+
+#ifdef __ECOS__
+# ifdef __NEED_UNDERSCORE__
+ HAL_BREAKPOINT(_bsp_breakinsn);
+# else
+ HAL_BREAKPOINT(bsp_breakinsn);
+# endif
+#else
+# ifdef __NEED_UNDERSCORE__
+ asm volatile (".globl _bsp_breakinsn\n"
+ "_bsp_breakinsn:\n");
+# else
+ asm volatile (".globl bsp_breakinsn\n"
+ "bsp_breakinsn:\n");
+# endif
+ BREAKPOINT();
+#endif
+
+#if DEBUG_BREAKPOINT
+ bsp_printf("After BP\n");
+#endif
+}
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp.c
new file mode 100644
index 0000000000..6b77289b0e
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp.c
@@ -0,0 +1,341 @@
+//==========================================================================
+//
+// bsp.c
+//
+// General BSP support.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: General BSP support.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <stdlib.h>
+#include <bsp/cpu.h>
+#include <bsp/bsp.h>
+#include "bsp_if.h"
+#include "gdb.h"
+
+#ifndef DEBUG_BSP_INIT
+#define DEBUG_BSP_INIT 0
+#endif
+
+struct bsp_comm_channel *_bsp_net_channel = NULL;
+
+/*
+ * This is the array of pointers to interrupt controller descriptors.
+ */
+static struct bsp_irq_controller *_bsp_ictrl_table[BSP_MAX_IRQ_CONTROLLERS];
+
+/*
+ * This is the array of second-level exception vectors.
+ */
+static bsp_vec_t *_bsp_exc_table[BSP_MAX_EXCEPTIONS];
+
+
+/*
+ * Debug (default exception) handler vector.
+ */
+bsp_handler_t _bsp_dbg_vector;
+
+
+static bsp_shared_t __bsp_shared = {
+ BSP_SHARED_DATA_VERSION, /* version */
+ (const struct bsp_irq_controller **)&_bsp_ictrl_table[0], /* __ictrl_table */
+ &_bsp_exc_table[0], /* __exc_table */
+ &_bsp_dbg_vector, /* __dbg_vector */
+ (bsp_handler_t)0, /* __kill_vector */
+ (struct bsp_comm_procs *)NULL, /* __console_procs */
+ (struct bsp_comm_procs *)NULL, /* __debug_procs */
+ (void (*)(void *, int ))NULL, /* __flush_dcache */
+ (void (*)(void *, int ))NULL, /* __flush_icache */
+ (void (*)(void ))NULL, /* __reset */
+ (void*)NULL, /* __cpu_data */
+ (void*)NULL /* __board_data */
+};
+
+
+static void
+default_cache_proc(void *p, int nbytes)
+{
+ /* do nothing */
+}
+
+
+static void
+default_reset_proc(void)
+{
+ /* do nothing */
+}
+
+
+static int
+find_comm_id(struct bsp_comm_procs *procs)
+{
+ int i;
+
+ for (i = 0; i < _bsp_num_comms; i++)
+ if (&_bsp_comm_list[i].procs == procs)
+ return i;
+
+ if (procs == &_bsp_net_channel->procs)
+ return _bsp_num_comms;
+
+ return -1;
+}
+
+
+/*
+ * Set or get active debug channel.
+ * Returns -1 if unsucessful.
+ * If the passed in comm id is -1, then the id of the current channel
+ * is returned.
+ */
+static int
+set_debug_comm(int id)
+{
+ struct bsp_comm_channel *chan;
+ struct bsp_comm_procs *procs;
+ int current_chan = find_comm_id(bsp_shared_data->__debug_procs);
+
+ if (id < 0)
+ return current_chan;
+
+ if (id > _bsp_num_comms)
+ return -1;
+
+ if (id == _bsp_num_comms && _bsp_net_channel == NULL)
+ return -1;
+
+ if (id == current_chan)
+ return 0;
+
+ /* Remove existing channel */
+ if ((procs = bsp_shared_data->__debug_procs) != NULL)
+ (*procs->__control)(procs->ch_data, COMMCTL_REMOVE_DBG_ISR);
+
+ /* Install new channel */
+ if (id == _bsp_num_comms)
+ chan = _bsp_net_channel;
+ else
+ chan = &_bsp_comm_list[id];
+ bsp_shared_data->__debug_procs = &chan->procs;
+ (*chan->procs.__control)(chan->procs.ch_data, COMMCTL_INSTALL_DBG_ISR);
+
+ return 0;
+}
+
+
+/*
+ * Set or get active console channel.
+ * Returns -1 if unsucessful.
+ * If the passed in comm id is -1, then the id of the current channel
+ * is returned.
+ */
+static int
+set_console_comm(int id)
+{
+ int current_chan = find_comm_id(bsp_shared_data->__console_procs);
+
+ if (id < 0)
+ return current_chan;
+
+ if (id > _bsp_num_comms)
+ return -1;
+
+ if (id == _bsp_num_comms && _bsp_net_channel == NULL)
+ return -1;
+
+ if (id == current_chan)
+ return 0;
+
+ /*
+ * Install new channel. If its the same as the debug channel,
+ * just clear the __console_procs and the bsp_console_*
+ * interface functions will take care of the rest.
+ */
+ if (id == _bsp_num_comms)
+ bsp_shared_data->__console_procs = &_bsp_net_channel->procs;
+ else
+ bsp_shared_data->__console_procs = &_bsp_comm_list[id].procs;
+
+ if (bsp_shared_data->__console_procs == bsp_shared_data->__debug_procs)
+ bsp_shared_data->__console_procs = NULL;
+
+ return 0;
+}
+
+
+/*
+ * Set or get the current baud rate of a serial comm channel.
+ * Returns -1 on if unsuccessful.
+ * If the given baud is -1, then the current baudrate is returned.
+ */
+int
+set_serial_baud(int id, int baud)
+{
+ struct bsp_comm_channel *chan;
+
+ if (id < 0 || id >= _bsp_num_comms)
+ return -1;
+
+ chan = &_bsp_comm_list[id];
+
+ if (chan->info.kind != BSP_COMM_SERIAL)
+ return -1;
+
+ if (baud == -1)
+ return (*chan->procs.__control)(chan->procs.ch_data,
+ COMMCTL_GETBAUD);
+
+ return (*chan->procs.__control)(chan->procs.ch_data,
+ COMMCTL_SETBAUD, baud);
+}
+
+/*
+ * Final initialization before calling main.
+ */
+void
+_bsp_init(void)
+{
+ struct bsp_comm_procs *com;
+ extern void __init_irq_controllers(void);
+
+ bsp_shared_data = &__bsp_shared;
+ _bsp_dbg_vector = (bsp_handler_t)_bsp_gdb_handler;
+ bsp_shared_data->__dbg_data = &_bsp_gdb_data;
+
+ bsp_shared_data->__flush_dcache = default_cache_proc;
+ bsp_shared_data->__flush_icache = default_cache_proc;
+
+ bsp_shared_data->__reset = default_reset_proc;
+
+ /*
+ * General BSP information access.
+ */
+ bsp_shared_data->__sysinfo = _bsp_sysinfo;
+
+ /*
+ * Setup comm port handlers.
+ */
+ bsp_shared_data->__set_debug_comm = set_debug_comm;
+ bsp_shared_data->__set_console_comm = set_console_comm;
+ bsp_shared_data->__set_serial_baud = set_serial_baud;
+
+ /*
+ * Very first thing is to initialize comm channels so
+ * we can have debug printfs working. None of this
+ * must rely on interrupts until interrupt controllers
+ * are initialized below.
+ */
+ _bsp_init_board_comm();
+
+ /*
+ * Assume first comm channel is the default.
+ */
+ bsp_shared_data->__debug_procs = &_bsp_comm_list[0].procs;
+
+ /*
+ * By default, console i/o goes through the debug channel.
+ * We indicate this by making the console i/o procs
+ * pointer NULL.
+ */
+ bsp_shared_data->__console_procs = NULL;
+
+ /*
+ * Install interrupt controllers.
+ */
+#if DEBUG_BSP_INIT
+ bsp_printf("Installing interrupt controllers...\n");
+#endif
+
+ _bsp_install_cpu_irq_controllers();
+ _bsp_install_board_irq_controllers();
+
+#if DEBUG_BSP_INIT
+ bsp_printf("Done installing interrupt controllers.\n");
+ bsp_printf("Initializing interrupt controllers...\n");
+#endif
+ /*
+ * Actually run the init routines for all installed
+ * interrupt controllers.
+ */
+ __init_irq_controllers();
+
+#if DEBUG_BSP_INIT
+ bsp_printf("Done initializing interrupt controllers.\n");
+ bsp_printf("CPU-specific initialization...\n");
+#endif
+
+ /*
+ * Final architecture specific initialization.
+ */
+ _bsp_cpu_init();
+
+#if DEBUG_BSP_INIT
+ bsp_printf("Done w/ CPU-specific initialization.\n");
+ bsp_printf("Board specific initialization...\n");
+#endif
+ /*
+ * Final board specific initialization.
+ */
+ _bsp_board_init();
+
+#if DEBUG_BSP_INIT
+ bsp_printf("Done w/ board specific initialization.\n");
+#endif
+
+ /*
+ * Now we can install the debug interrupt handler on the debug channel.
+ */
+ com = bsp_shared_data->__debug_procs;
+ (*com->__control)(com->ch_data, COMMCTL_INSTALL_DBG_ISR);
+
+
+ if (_bsp_net_channel != NULL) {
+ set_debug_comm(_bsp_num_comms);
+ set_console_comm(0);
+ }
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_cache.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_cache.c
new file mode 100644
index 0000000000..c9a5907704
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_cache.c
@@ -0,0 +1,70 @@
+//==========================================================================
+//
+// bsp_cache.c
+//
+// BSP Cache Interfaces.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: BSP Cache Interfaces.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include "bsp_if.h"
+
+void
+bsp_flush_dcache(void *p, int nbytes)
+{
+ bsp_shared_data->__flush_dcache(p, nbytes);
+}
+
+
+void
+bsp_flush_icache(void *p, int nbytes)
+{
+ bsp_shared_data->__flush_icache(p, nbytes);
+}
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_if.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_if.c
new file mode 100644
index 0000000000..9b13c824d6
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_if.c
@@ -0,0 +1,160 @@
+//==========================================================================
+//
+// bsp_if.c
+//
+// Miscellaneous BSP Interfaces.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Miscellaneous BSP Interfaces.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <bsp/bsp.h>
+#include "bsp_if.h"
+
+/*
+ * Install a debug handler.
+ * Returns old handler being replaced.
+ */
+bsp_handler_t
+bsp_install_dbg_handler(bsp_handler_t new_handler)
+{
+ bsp_handler_t old_handler;
+
+ old_handler = *bsp_shared_data->__dbg_vector;
+ *bsp_shared_data->__dbg_vector = new_handler;
+
+ return old_handler;
+}
+
+/*
+ * Sometimes it is desireable to call the debug handler directly. This routine
+ * accomplishes that. It is the responsibility of the caller to insure that
+ * interrupts are disabled before calling this routine.
+ */
+void
+bsp_invoke_dbg_handler(int exc_nr, void *regs)
+{
+ (*bsp_shared_data->__dbg_vector)(exc_nr, regs);
+}
+
+/*
+ * Install a 'kill' handler.
+ * Returns old handler being replaced.
+ */
+bsp_handler_t
+bsp_install_kill_handler(bsp_handler_t new_handler)
+{
+ bsp_handler_t old_handler;
+
+ old_handler = bsp_shared_data->__kill_vector;
+ bsp_shared_data->__kill_vector = new_handler;
+
+ return old_handler;
+}
+
+
+void *
+bsp_cpu_data(void)
+{
+ return bsp_shared_data->__cpu_data;
+}
+
+
+void *
+bsp_board_data(void)
+{
+ return bsp_shared_data->__board_data;
+}
+
+
+int
+bsp_sysinfo(enum bsp_info_id id, ...)
+{
+ int retval;
+ va_list ap;
+
+ va_start (ap, id);
+ retval = bsp_shared_data->__sysinfo(id, ap);
+ va_end(ap);
+ return retval;
+}
+
+int
+bsp_set_debug_comm(int id)
+{
+ return bsp_shared_data->__set_debug_comm(id);
+}
+
+int
+bsp_set_console_comm(int id)
+{
+ return bsp_shared_data->__set_console_comm(id);
+}
+
+int
+bsp_set_serial_baud(int id, int baud)
+{
+ return bsp_shared_data->__set_serial_baud(id, baud);
+}
+
+
+#if !defined(NDEBUG)
+
+void _bsp_assert(const char *file, const int line, const char *condition)
+{
+ bsp_printf("Assertion \"%s\" failed\n", condition);
+ bsp_printf("File \"%s\"\n", file);
+ bsp_printf("Line %d\n", line);
+#if defined(PORT_TOGGLE_DEBUG)
+ PORT_TOGGLE_DEBUG();
+#else
+ while(1) ;
+#endif /* defined(PORT_TOGGLE_DEBUG) */
+}
+
+#endif /* !defined(NDEBUG) */
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_if.h b/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_if.h
new file mode 100644
index 0000000000..268b1965f3
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/bsp_if.h
@@ -0,0 +1,433 @@
+#ifndef __BSP_COMMON_BSP_IF_H__
+#define __BSP_COMMON_BSP_IF_H__
+//==========================================================================
+//
+// bsp_if.h
+//
+// BSP interface definitions.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: BSP interface definitions.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <bsp/bsp.h>
+
+/*
+ * Maximum number of interrupt controllers supported by
+ * this bsp.
+ */
+#define BSP_MAX_IRQ_CONTROLLERS 8
+
+#ifndef __ASSEMBLER__
+
+
+/*
+ * Interrupt controller abstraction.
+ * Each interrupt controller on a given board should be described using
+ * this data structure.
+ */
+struct bsp_irq_controller {
+ /*
+ * First and last irqs handled by this controller.
+ */
+ short first;
+ short last;
+
+ /*
+ * pointer to array of bsp_vec struct pointers. These are
+ * the heads of the linked list of ISRs for each irq handled
+ * by this controller.
+ */
+ bsp_vec_t **vec_list;
+
+ /*
+ * Pointer to initialization routine which is run once at boot time.
+ */
+ void (*init)(const struct bsp_irq_controller *__ic);
+
+ /*
+ * Pointer to routines used to disable and enable interrupts handled
+ * by this controller.
+ */
+ int (*disable)(const struct bsp_irq_controller *__ic,
+ int __irq_nr);
+ void (*enable)(const struct bsp_irq_controller *__ic,
+ int __irq_nr);
+};
+
+
+/*
+ * Board specific code needs to provide at least one communication channel
+ * for use as the debug and console (stdio) channel. For each channel,
+ * there must be a set of function vectors for the common BSP code to
+ * control the channel.
+ */
+struct bsp_comm_procs {
+ /*
+ * Implementation dependent data pointer passed to the following procs.
+ */
+ void *ch_data;
+
+ /*
+ * Write a buffer of the given length. All of buffer is sent before
+ * the write call returns.
+ */
+ void (*__write)(void *ch_data, const char *buf, int len);
+
+ /*
+ * Fill a buffer with up to the given length. Returns the actual number
+ * of characters read.
+ */
+ int (*__read)(void *ch_data, char *buf, int len);
+
+ /*
+ * Send a single character.
+ */
+ void (*__putc)(void *ch_data, char ch);
+
+ /*
+ * Read a single character. If no character is immediately available, will
+ * block until one becomes available.
+ */
+ int (*__getc)(void *ch_data);
+
+ /*
+ * Catchall comm port control.
+ */
+ int (*__control)(void *ch_data, int func, ...);
+
+ /*
+ * For serial ports, the control function may be used to set and get the
+ * current baud rate. Usage:
+ *
+ * err = (*__control)(COMMCTL_SETBAUD, int bits_per_second);
+ * err => Zero if successful, -1 if error.
+ *
+ * baud = (*__control)(COMMCTL_GETBAUD);
+ * baud => -1 if error, current baud otherwise.
+ */
+#define COMMCTL_SETBAUD 0
+#define COMMCTL_GETBAUD 1
+
+ /*
+ * Install and remove debugger interrupt handlers. These are the receiver
+ * interrupt routines which are used to change control from a running
+ * program to the debugger stub.
+ */
+#define COMMCTL_INSTALL_DBG_ISR 2
+#define COMMCTL_REMOVE_DBG_ISR 3
+
+ /*
+ * Disable comm port interrupt. Returns TRUE if interrupt was enabled,
+ * FALSE otherwise.
+ */
+#define COMMCTL_IRQ_DISABLE 4
+ /*
+ * Enable comm port interrupt.
+ */
+#define COMMCTL_IRQ_ENABLE 5
+};
+
+
+/*
+ * The board specific code uses this data structure to provide information
+ * about and procedure vectors for each supported communication channel.
+ * See _bsp_comm_list below.
+ */
+struct bsp_comm_channel {
+ struct bsp_comm_info info;
+ struct bsp_comm_procs procs;
+};
+
+
+/*
+ * Number to place in the version field. If structure is changed
+ * in a way which is not backwards compatible, this number should
+ * be incremented.
+ */
+#define BSP_SHARED_DATA_VERSION 2
+
+/*
+ * Clients of this BSP will need to have access to BSP functions and
+ * data structures. Because, the client and the BSP may not be linked
+ * together, a structure of vectors is used to gain this access. A
+ * pointer to this structure can be gotten via a syscall. This syscall
+ * is made automatically from within the crt0.o file.
+ */
+typedef struct {
+ int version; /* version number for future expansion */
+
+ /*
+ * Pointer to the array of pointers to interrupt controller descriptors.
+ */
+ const struct bsp_irq_controller **__ictrl_table;
+
+ /*
+ * Pointer to the array of exception vectors.
+ */
+ bsp_vec_t **__exc_table;
+
+ /*
+ * Pointer to debug handler vector.
+ */
+ bsp_handler_t *__dbg_vector;
+
+ /*
+ * User hook to catch debugger 'kill' command.
+ */
+ bsp_handler_t __kill_vector;
+
+ /*
+ * Vectored functions for console and debug i/o.
+ */
+ struct bsp_comm_procs *__console_procs;
+ struct bsp_comm_procs *__debug_procs;
+
+ /*
+ * Vectored cache control functions.
+ */
+ void (*__flush_dcache)(void *__p, int __nbytes);
+ void (*__flush_icache)(void *__p, int __nbytes);
+
+ /*
+ * Generic data pointers
+ */
+ void *__cpu_data;
+ void *__board_data;
+
+ /*
+ * General BSP information access.
+ * See bsp.h for details.
+ */
+ int (*__sysinfo)(enum bsp_info_id __id, va_list __ap);
+
+ /*
+ * Set or get active debug and console channels.
+ * Returns -1 if unsucessful.
+ * If the passed in __comm_id is -1, then the id of the current channel
+ * is returned.
+ */
+ int (*__set_debug_comm)(int __comm_id);
+ int (*__set_console_comm)(int __comm_id);
+
+ /*
+ * Set or get the current baud rate of a serial comm channel.
+ * Returns -1 on if unsuccessful.
+ * If the given baud is -1, then the current baudrate is returned.
+ */
+ int (*__set_serial_baud)(int __comm_id, int baud);
+
+ /*
+ * Debug agent data.
+ */
+ void *__dbg_data;
+
+ /*
+ * Reset function
+ * We want to avoid calling this with a trap since
+ * we may be calling it from SWI mode (in cygmon).
+ * That is problematic, as nested SWI's are not
+ * very good.
+ */
+ void (*__reset)(void);
+
+ /*
+ * TRUE if console interrupt detected during program output.
+ */
+ int __console_interrupt_flag;
+
+} bsp_shared_t;
+
+
+extern bsp_shared_t *bsp_shared_data;
+
+/*
+ * Platform info which may be overriden/modified by arch/board specific code.
+ */
+extern struct bsp_platform_info _bsp_platform_info;
+
+/*
+ * Cache info which may be overriden/modified by arch/board specific code.
+ */
+extern struct bsp_cachesize_info _bsp_dcache_info;
+extern struct bsp_cachesize_info _bsp_icache_info;
+extern struct bsp_cachesize_info _bsp_scache_info;
+
+/*
+ * Array of comm channel descriptors which must be provided by board specific
+ * code.
+ */
+extern struct bsp_comm_channel _bsp_comm_list[];
+
+/*
+ * Number of comm channel descriptors which must be provided by board specific
+ * code.
+ */
+extern int _bsp_num_comms;
+
+
+/*
+ * Array of memory region descriptors which must be provided by board specific
+ * code.
+ */
+extern struct bsp_mem_info _bsp_memory_list[];
+
+/*
+ * Number of memory region descriptors which must be provided by board specific
+ * code.
+ */
+extern int _bsp_num_mem_regions;
+
+/*
+ * In order to construct the above _bsp_memory_list, some board specific
+ * code may have to size RAM regions. To do this easily and reliably,
+ * the code needs to run from ROM before .bss and .data sections are
+ * initialized. This leads to the problem of where to store the results
+ * of the memory sizing tests. In this case, the _bsp_init_stack routine
+ * which sizes memory and sets up the stack will place the board-specific
+ * information on the stack and return with the stack pointer pointing to
+ * a pointer to the information. That is, addr_of_info = *(void **)sp.
+ * The architecture specific code will then copy that pointer to the
+ * _bsp_ram_info_ptr variable after initializing the .data and .bss sections.
+ */
+extern void *_bsp_ram_info_ptr;
+
+/*
+ * Generic bsp initialization. Called by low level startup code
+ */
+extern void _bsp_init(void);
+
+/*
+ * Initialize board communication in polling mode. This enables
+ * debugging printf for later initializations. Interrupts for
+ * comm channels may be set up later in _bsp_board_init().
+ */
+extern void _bsp_init_board_comm(void);
+
+/*
+ * Make generic BSP aware of CPU/MCU specific interrupt controllers.
+ */
+extern void _bsp_install_cpu_irq_controllers(void);
+
+/*
+ * Make generic BSP aware of board specific interrupt controllers.
+ */
+extern void _bsp_install_board_irq_controllers(void);
+
+/*
+ * Callback used by above two routines to install a single
+ * interrupt controller.
+ */
+extern void _bsp_install_irq_controller(const struct bsp_irq_controller *__ic);
+
+/*
+ * Generic exception dispatch routine. Usually called from asm-level
+ * exception handler to call vectors in vector chain for the given
+ * exception number. Stops traversing vector chain when a called
+ * vector returns a non-zero value. If no vector returns non-zero,
+ * a default error message and register dump is printed.
+ */
+extern int _bsp_exc_dispatch(int __exc_number, void *__regs);
+
+
+/*
+ * Architecture specific routine to dump register values.
+ */
+extern void _bsp_dump_regs(void *__regs);
+
+
+/*
+ * Generic syscall handler called by architecture specific handler.
+ * Returns non-zero if given 'func' number was handled by the generic
+ * code, zero otherwise. If handled, the syscall error is returned
+ * via the err_ptr.
+ */
+extern int _bsp_do_syscall(int __func,
+ long __arg1, long __arg2, long __arg3, long __arg4,
+ int *__err_ptr);
+
+
+extern void _bsp_cpu_init(void);
+extern void _bsp_board_init(void);
+
+
+/*
+ * General interface for getting certain BSP parameters.
+ * See bsp.h for details.
+ */
+extern int _bsp_sysinfo(enum bsp_info_id __id, va_list __ap);
+
+/*
+ * Called from comm channel when a connection to host is closed.
+ */
+extern void _bsp_dbg_connect_abort(void);
+
+
+/*
+ * Pointer to a network channel. NULL if no network channel
+ * exists.
+ */
+extern struct bsp_comm_channel *_bsp_net_channel;
+
+
+/*
+ * Formatted output primitive.
+ */
+extern void __vprintf(void (*putc_func)(char c), const char *fmt0, va_list ap);
+
+
+
+#endif /* !__ASSEMBLER__ */
+
+/*
+ * SYSCALL number to use to get pointer to above bsp_shared_t structure.
+ */
+#define BSP_GET_SHARED 0xbaad
+
+#endif // __BSP_COMMON_BSP_IF_H__
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/console-io.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/console-io.c
new file mode 100644
index 0000000000..ad0450a3d7
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/console-io.c
@@ -0,0 +1,140 @@
+//==========================================================================
+//
+// console-io.c
+//
+// BSP Console Channel Interfaces.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: BSP Console Channel Interfaces.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <stdlib.h>
+#include <bsp/bsp.h>
+#include "bsp_if.h"
+
+static unsigned char __console_ungetc;
+
+void
+bsp_console_write(const char *p, int len)
+{
+ struct bsp_comm_procs *com;
+
+ if ((com = bsp_shared_data->__console_procs) != NULL)
+ com->__write(com->ch_data, p, len);
+ else
+ bsp_debug_write(p, len);
+}
+
+
+int
+bsp_console_read(char *p, int len)
+{
+ struct bsp_comm_procs *com;
+
+ if (len <= 0)
+ return 0;
+
+ if ((com = bsp_shared_data->__console_procs) != NULL) {
+ if (__console_ungetc) {
+ *p = __console_ungetc;
+ __console_ungetc = 0;
+ return 1;
+ }
+ return com->__read(com->ch_data, p, len);
+ } else
+ return bsp_debug_read(p, len);
+}
+
+/*#define PRINTABLE_ONLY*/
+#ifdef PRINTABLE_ONLY
+#include <ctype.h>
+#endif /* PRINTABLE_ONLY */
+
+void
+bsp_console_putc(char ch)
+{
+ struct bsp_comm_procs *com;
+
+#ifdef PRINTABLE_ONLY
+ if ((!isprint(ch)) && (!isspace(ch)))
+ ch = '.';
+#endif /* PRINTABLE_ONLY */
+
+ if ((com = bsp_shared_data->__console_procs) != NULL)
+ com->__putc(com->ch_data, ch);
+ else
+ bsp_debug_putc(ch);
+}
+
+int
+bsp_console_getc(void)
+{
+ struct bsp_comm_procs *com;
+ int ch;
+
+ if ((com = bsp_shared_data->__console_procs) != NULL) {
+ if (__console_ungetc) {
+ ch = __console_ungetc;
+ __console_ungetc = 0;
+ return ch;
+ }
+ return com->__getc(com->ch_data);
+ } else
+ return bsp_debug_getc();
+}
+
+
+void
+bsp_console_ungetc(char ch)
+{
+ if (bsp_shared_data->__console_procs != NULL)
+ __console_ungetc = (unsigned char)ch;
+ else
+ bsp_debug_ungetc(ch);
+}
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/debug-io.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/debug-io.c
new file mode 100644
index 0000000000..6d66771dfe
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/debug-io.c
@@ -0,0 +1,142 @@
+//==========================================================================
+//
+// debug-io.c
+//
+// BSP Debug Channel Interfaces.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: BSP Debug Channel Interfaces.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <stdlib.h>
+#include <bsp/bsp.h>
+#include "bsp_if.h"
+
+static unsigned char __debug_ungetc;
+
+extern int stub_is_active;
+extern int __output_gdb_string (const char *str, int string_len);
+void
+bsp_debug_write(const char *p, int len)
+{
+ struct bsp_comm_procs *com = bsp_shared_data->__debug_procs;
+ if (stub_is_active) {
+ // We are running in 'GDB' mode
+ __output_gdb_string(p, len);
+ } else {
+ com->__write(com->ch_data, p, len);
+ }
+}
+
+
+int
+bsp_debug_read(char *p, int len)
+{
+ struct bsp_comm_procs *com = bsp_shared_data->__debug_procs;
+
+ if (len <= 0)
+ return 0;
+
+ if (__debug_ungetc) {
+ *p = __debug_ungetc;
+ __debug_ungetc = 0;
+ return 1;
+ }
+
+ return com->__read(com->ch_data, p, len);
+}
+
+
+void
+bsp_debug_putc(char ch)
+{
+ struct bsp_comm_procs *com = bsp_shared_data->__debug_procs;
+
+ com->__putc(com->ch_data, ch);
+}
+
+int
+bsp_debug_getc(void)
+{
+ struct bsp_comm_procs *com = bsp_shared_data->__debug_procs;
+ int ch;
+
+ if (__debug_ungetc) {
+ ch = __debug_ungetc;
+ __debug_ungetc = 0;
+ } else
+ ch = com->__getc(com->ch_data);
+
+ return ch;
+}
+
+
+void
+bsp_debug_ungetc(char ch)
+{
+ __debug_ungetc = (unsigned char)ch;
+}
+
+
+int
+bsp_debug_irq_disable(void)
+{
+ struct bsp_comm_procs *com = bsp_shared_data->__debug_procs;
+
+ return com->__control(com->ch_data, COMMCTL_IRQ_DISABLE);
+}
+
+
+void
+bsp_debug_irq_enable(void)
+{
+ struct bsp_comm_procs *com = bsp_shared_data->__debug_procs;
+
+ com->__control(com->ch_data, COMMCTL_IRQ_ENABLE);
+}
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb-cpu.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb-cpu.c
new file mode 100644
index 0000000000..610b6b5044
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb-cpu.c
@@ -0,0 +1,61 @@
+//==========================================================================
+//
+// gdb-cpu.c
+//
+// Architecture specific support for GDB
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+#include <pkgconf/system.h>
+
+#ifdef CYGPKG_HAL_ARM
+#include "bsp/arm/gdb-cpu.c"
+#endif
+
+#ifdef CYGPKG_HAL_MIPS
+#include "bsp/mips/gdb-cpu.c"
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb-cpu.h b/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb-cpu.h
new file mode 100644
index 0000000000..75821cbae3
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb-cpu.h
@@ -0,0 +1,65 @@
+#ifndef __BSP_COMMON_GDB_CPU_H__
+#define __BSP_COMMON_GDB_CPU_H__
+//==========================================================================
+//
+// gdb-cpu.h
+//
+// CPU specifics for GDB
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+#include <pkgconf/system.h>
+
+#ifdef CYGPKG_HAL_ARM
+#include "../arm/gdb-cpu.h"
+#endif
+
+#ifdef CYGPKG_HAL_MIPS
+#include "../mips/gdb-cpu.h"
+#endif
+
+#endif // __BSP_COMMON_GDB_CPU_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb.h b/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb.h
new file mode 100644
index 0000000000..1ade0ff036
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/gdb.h
@@ -0,0 +1,103 @@
+#ifndef __BSP_COMMON_GDB_H__
+#define __BSP_COMMON_GDB_H__
+//==========================================================================
+//
+// gdb.h
+//
+// Definitions for GDB stub.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Definitions for GDB stub.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include "gdb-cpu.h"
+#include <bsp/gdb-data.h>
+
+#ifndef DEBUG_STUB
+#define DEBUG_STUB 0
+#endif
+
+/*
+ * These need to match the same in devo/gdb/target.h
+ */
+#define TARGET_SIGNAL_INT 2
+#define TARGET_SIGNAL_ILL 4
+#define TARGET_SIGNAL_TRAP 5
+#define TARGET_SIGNAL_ABRT 6
+#define TARGET_SIGNAL_FPE 8
+#define TARGET_SIGNAL_BUS 10
+#define TARGET_SIGNAL_SEGV 11
+
+
+/*
+ * Socket to use for tcp/ip debug channel.
+ */
+#define GDB_TCP_SOCKET 1000
+
+
+#ifndef __ASSEMBLER__
+
+/* generic gdb protocol handler */
+extern void _bsp_gdb_handler(int exc_nr, void *saved_regs);
+extern gdb_data_t _bsp_gdb_data;
+
+
+/* start forming an outgoing gdb packet */
+/* if ack is true, prepend an ack character */
+extern void _gdb_pkt_start(int ack);
+
+/* Append data to packet using formatted string. */
+extern void _gdb_pkt_append(char *fmt, ...);
+
+/* Calculate checksum and append to end of packet. */
+extern void _gdb_pkt_end(void);
+
+/* Send the packet. Blocks waiting for ACK */
+extern void _gdb_pkt_send(void);
+#endif
+
+#endif //__BSP_COMMON_GDB_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/generic-mem.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/generic-mem.c
new file mode 100644
index 0000000000..53c1985aa4
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/generic-mem.c
@@ -0,0 +1,194 @@
+//==========================================================================
+//
+// generic-mem.c
+//
+// Generic support for safe memory read/write.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Generic support for safe memory read/write.
+// Description: Some targets may need to provide their own version.
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <stdlib.h>
+#include <setjmp.h>
+#include <bsp/bsp.h>
+
+typedef void (*moveproc_t)(void *s, void *d);
+
+static jmp_buf __errjmp;
+
+/*
+ * These are globals because we want them preserved
+ * across function calls.
+ */
+static bsp_handler_t __oldtrap;
+static int __done;
+
+
+static void
+move_8(void *src, void *dest)
+{
+ *(char *)dest = *(char *)src;
+}
+
+
+static void
+move_16(void *src, void *dest)
+{
+ *(short *)dest = *(short *)src;
+}
+
+
+static void
+move_32(void *src, void *dest)
+{
+ *(int *)dest = *(int *)src;
+}
+
+
+static int
+err_trap(int exc_nr, void *regs)
+{
+ longjmp(__errjmp, 1);
+}
+
+
+int
+bsp_memory_read(void *addr, /* start addr of memory to read */
+ int asid, /* address space id */
+ int rsize, /* size of individual read operation */
+ int nreads, /* number of read operations */
+ void *buf) /* result buffer */
+{
+ if (nreads <= 0)
+ return 0;
+
+ __oldtrap = bsp_install_dbg_handler(err_trap);
+
+ if (setjmp(__errjmp) == 0) {
+ moveproc_t move_mem;
+ int incr;
+ char *src, *dest;
+
+ switch (rsize) {
+ case 8:
+ move_mem = move_8;
+ incr = 1;
+ break;
+ case 16:
+ move_mem = move_16;
+ incr = 2;
+ break;
+ case 32:
+ move_mem = move_32;
+ incr = 4;
+ break;
+ default:
+ (void)bsp_install_dbg_handler(__oldtrap);
+ return 0;
+ }
+
+ src = addr;
+ dest = buf;
+
+ for (__done = 0; __done < nreads; __done++) {
+ move_mem(src, dest);
+ src += incr;
+ dest += incr;
+ }
+ }
+
+ (void)bsp_install_dbg_handler(__oldtrap);
+ return __done;
+}
+
+
+int bsp_memory_write(void *addr, /* start addr of memory to write */
+ int asid, /* address space id */
+ int wsize, /* size of individual write operation */
+ int nwrites, /* number of write operations */
+ void *buf) /* source buffer for write data */
+{
+ if (nwrites <= 0)
+ return 0;
+
+ __oldtrap = bsp_install_dbg_handler(err_trap);
+
+ if (setjmp(__errjmp) == 0) {
+ moveproc_t move_mem;
+ int incr;
+ char *src, *dest;
+
+ switch (wsize) {
+ case 8:
+ move_mem = move_8;
+ incr = 1;
+ break;
+ case 16:
+ move_mem = move_16;
+ incr = 2;
+ break;
+ case 32:
+ move_mem = move_32;
+ incr = 4;
+ break;
+ default:
+ (void)bsp_install_dbg_handler(__oldtrap);
+ return 0;
+ }
+
+ src = buf;
+ dest = addr;
+
+ for (__done = 0; __done < nwrites; __done++) {
+ move_mem(src, dest);
+ src += incr;
+ dest += incr;
+ }
+ }
+
+ (void)bsp_install_dbg_handler(__oldtrap);
+ return __done;
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/hex-utils.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/hex-utils.c
new file mode 100644
index 0000000000..5cb2c4cb3a
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/hex-utils.c
@@ -0,0 +1,126 @@
+//==========================================================================
+//
+// hex-utils.c
+//
+// Utilities for dealing with hexadecimal strings.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <bsp/hex-utils.h>
+
+int
+__hex(char ch)
+{
+ if ((ch >= 'a') && (ch <= 'f')) return (ch-'a'+10);
+ if ((ch >= '0') && (ch <= '9')) return (ch-'0');
+ if ((ch >= 'A') && (ch <= 'F')) return (ch-'A'+10);
+ return (-1);
+}
+
+
+/*
+ * Convert the hex data in 'buf' into 'count' bytes to be placed in 'mem'.
+ * Returns a pointer to the character in mem AFTER the last byte written.
+ */
+char *
+__unpack_bytes_to_mem(char *buf, char *mem, int count)
+{
+ int i;
+ char ch;
+
+ for (i = 0; i < count; i++) {
+ ch = __hex(*buf++) << 4;
+ ch = ch + __hex(*buf++);
+ *mem++ = ch;
+ }
+ return(mem);
+}
+
+/*
+ * While finding valid hex chars, build an unsigned long int.
+ * Return number of hex chars processed.
+ */
+int
+__unpack_ulong(char **ptr, unsigned long *val)
+{
+ int numChars = 0;
+ int hexValue;
+
+ *val = 0;
+
+ while (**ptr) {
+ hexValue = __hex(**ptr);
+ if (hexValue >= 0) {
+ *val = (*val << 4) | hexValue;
+ numChars ++;
+ } else
+ break;
+ (*ptr)++;
+ }
+ return (numChars);
+}
+
+
+/*
+ * Unpack 'count' hex characters, forming them into a binary value.
+ * Return that value as an int. Adjust the source pointer accordingly.
+ */
+int
+__unpack_nibbles(char **ptr, int count)
+{
+ int value = 0;
+
+ while (--count >= 0) {
+ value = (value << 4) | __hex(**ptr);
+ (*ptr)++;
+ }
+ return value;
+}
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/printf.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/printf.c
new file mode 100644
index 0000000000..d8fdea131a
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/printf.c
@@ -0,0 +1,95 @@
+//==========================================================================
+//
+// printf.c
+//
+// Light-weight BSP printf.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Light-weight BSP printf.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <bsp/bsp.h>
+#include "bsp_if.h"
+
+
+void
+bsp_vprintf(const char *fmt, va_list ap)
+{
+ __vprintf(bsp_console_putc, fmt, ap);
+}
+
+
+void
+bsp_dvprintf(const char *fmt, va_list ap)
+{
+ __vprintf(bsp_debug_putc, fmt, ap);
+}
+
+
+void
+bsp_printf(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ __vprintf(bsp_console_putc, fmt, ap);
+ va_end (ap);
+}
+
+
+void
+bsp_dprintf(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ __vprintf(bsp_debug_putc, fmt, ap);
+ va_end (ap);
+}
+
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/shared-data.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/shared-data.c
new file mode 100644
index 0000000000..281a1032f0
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/shared-data.c
@@ -0,0 +1,59 @@
+//==========================================================================
+//
+// shared-data.c
+//
+// Declaration of bsp shared data pointer.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Declaration of bsp shared data pointer.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include "bsp_if.h"
+
+bsp_shared_t *bsp_shared_data;
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/singlestep.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/singlestep.c
new file mode 100644
index 0000000000..04cbc0bec6
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/singlestep.c
@@ -0,0 +1,61 @@
+//==========================================================================
+//
+// singlestep.c
+//
+// Architecture specific single-step support
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+#include <pkgconf/system.h>
+
+#ifdef CYGPKG_HAL_ARM
+#include "bsp/arm/singlestep.c"
+#endif
+
+#ifdef CYGPKG_HAL_MIPS
+#include "bsp/mips/singlestep.c"
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/sprintf.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/sprintf.c
new file mode 100644
index 0000000000..b05645bd53
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/sprintf.c
@@ -0,0 +1,86 @@
+//==========================================================================
+//
+// sprintf.c
+//
+// Light-weight BSP sprintf.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Light-weight BSP sprintf.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <bsp/bsp.h>
+#include "bsp_if.h"
+
+static char *str_ptr;
+
+static void
+str_putc(char ch)
+{
+ *str_ptr++ = ch;
+}
+
+int
+bsp_vsprintf(char *str, const char *fmt, va_list ap)
+{
+ str_ptr = str;
+ __vprintf(str_putc, fmt, ap);
+ *str_ptr = '\0';
+ return str_ptr - str;
+}
+
+
+void
+bsp_sprintf(char *str, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ bsp_vsprintf(str, fmt, ap);
+ va_end (ap);
+}
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/syscall.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/syscall.c
new file mode 100644
index 0000000000..120f722113
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/syscall.c
@@ -0,0 +1,218 @@
+//==========================================================================
+//
+// syscall.c
+//
+// Minimal generic syscall support.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Minimal generic syscall support.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <errno.h>
+#include <bsp/cpu.h>
+#include <bsp/bsp.h>
+#include "bsp_if.h"
+#include "syscall.h"
+
+/*
+ * read -- read bytes from the serial port. Ignore fd, since
+ * we only have stdin.
+ */
+static int
+sys_read(int fd, char *buf, int nbytes)
+{
+ int i = 0;
+
+ for (i = 0; i < nbytes; i++) {
+ *(buf + i) = bsp_console_getc();
+ if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
+ (*(buf + i + 1)) = 0;
+ break;
+ }
+ }
+ return (i);
+}
+
+
+/*
+ * write -- write bytes to the serial port. Ignore fd, since
+ * stdout and stderr are the same. Since we have no filesystem,
+ * open will only return an error.
+ */
+static int
+sys_write(int fd, char *buf, int nbytes)
+{
+#define WBUFSIZE 256
+ char ch, lbuf[WBUFSIZE];
+ int i, tosend;
+
+ tosend = nbytes;
+
+ while (tosend > 0) {
+ for (i = 0; tosend > 0 && i < (WBUFSIZE-2); tosend--) {
+ ch = *buf++;
+ if (ch == '\n')
+ lbuf[i++] = '\r';
+ lbuf[i++] = ch;
+ }
+ bsp_console_write(lbuf, i);
+ }
+
+ return (nbytes);
+}
+
+
+/*
+ * open -- open a file descriptor. We don't have a filesystem, so
+ * we return an error.
+ */
+static int
+sys_open (const char *buf, int flags, int mode)
+{
+ return (-EIO);
+}
+
+
+/*
+ * close -- We don't need to do anything, but pretend we did.
+ */
+static int
+sys_close(int fd)
+{
+ return (0);
+}
+
+
+/*
+ * lseek -- Since a serial port is non-seekable, we return an error.
+ */
+static int
+sys_lseek(int fd, int offset, int whence)
+{
+#ifdef ESPIPE
+ return (-ESPIPE);
+#else
+ return (-EIO);
+#endif
+}
+
+
+/*
+ * Generic syscall handler.
+ *
+ * Returns 0 if syscall number is not handled by this
+ * module, 1 otherwise. This allows applications to
+ * extend the syscall handler by using exception chaining.
+ */
+int
+_bsp_do_syscall(int func, /* syscall function number */
+ long arg1, long arg2, /* up to four args. */
+ long arg3, long arg4,
+ int *retval) /* syscall return value */
+{
+ int err = 0;
+
+ switch (func) {
+
+ case SYS_read:
+ err = sys_read((int)arg1, (char *)arg2, (int)arg3);
+ break;
+
+ case SYS_write:
+ err = sys_write((int)arg1, (char *)arg2, (int)arg3);
+ break;
+
+ case SYS_open:
+ err = sys_open((const char *)arg1, (int)arg2, (int)arg3);
+ break;
+
+ case SYS_close:
+ err = sys_close((int)arg1);
+ break;
+
+ case SYS_lseek:
+ err = sys_lseek((int)arg1, (int)arg2, (int)arg3);
+ break;
+
+ case BSP_GET_SHARED:
+ *(bsp_shared_t **)arg1 = bsp_shared_data;
+ break;
+
+ case SYS_meminfo:
+ {
+ // Return the top and size of memory.
+ struct bsp_mem_info mem;
+ int i;
+ unsigned long u, totmem, topmem, numbanks;
+
+ i = totmem = topmem = numbanks = 0;
+ while (bsp_sysinfo(BSP_INFO_MEMORY, i++, &mem) == 0)
+ {
+ if (mem.kind == BSP_MEM_RAM)
+ {
+ numbanks++;
+ totmem += mem.nbytes;
+ u = (unsigned long)mem.virt_start + mem.nbytes;
+ if (u > topmem)
+ topmem = u;
+ }
+ }
+ *(unsigned long *)arg1 = totmem;
+ *(unsigned long *)arg2 = topmem;
+ *retval = numbanks;
+ }
+ return 1;
+ break;
+
+ default:
+ return 0;
+ }
+
+ *retval = err;
+ return 1;
+}
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/syscall.h b/cesar/ecos/packages/cygmon/current/misc/bsp/common/syscall.h
new file mode 100644
index 0000000000..00d555f559
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/syscall.h
@@ -0,0 +1,50 @@
+/* General use syscall.h file.
+ The more ports that use this file, the simpler sim/common/nltvals.def
+ remains. */
+
+#ifndef LIBGLOSS_SYSCALL_H
+#define LIBGLOSS_SYSCALL_H
+
+/* Note: This file may be included by assembler source. */
+
+/* These should be as small as possible to allow a port to use a trap type
+ instruction, which the system call # as the trap (the d10v for instance
+ supports traps 0..31). An alternative would be to define one trap for doing
+ system calls, and put the system call number in a register that is not used
+ for the normal calling sequence (so that you don't have to shift down the
+ arguments to add the system call number). Obviously, if these system call
+ numbers are ever changed, all of the simulators and potentially user code
+ will need to be updated. */
+
+/* There is no current need for the following: SYS_execv, SYS_creat, SYS_wait,
+ etc. etc. Don't add them. */
+
+/* These are required by the ANSI C part of newlib (excluding system() of
+ course). */
+#define SYS_exit 1
+#define SYS_open 2
+#define SYS_close 3
+#define SYS_read 4
+#define SYS_write 5
+#define SYS_lseek 6
+#define SYS_unlink 7
+#define SYS_getpid 8
+#define SYS_kill 9
+#define SYS_fstat 10
+/*#define SYS_sbrk 11 - not currently a system call, but reserved. */
+
+/* ARGV support. */
+#define SYS_argvlen 12
+#define SYS_argv 13
+
+/* These are extras added for one reason or another. */
+#define SYS_chdir 14
+#define SYS_stat 15
+#define SYS_chmod 16
+#define SYS_utime 17
+#define SYS_time 18
+
+#define SYS_interrupt 1000
+
+#define SYS_meminfo 1001
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/sysinfo.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/sysinfo.c
new file mode 100644
index 0000000000..cc15801a10
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/sysinfo.c
@@ -0,0 +1,170 @@
+//==========================================================================
+//
+// sysinfo.c
+//
+// Interface for getting system information.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Interface for getting system information.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <stdlib.h>
+#include <bsp/bsp.h>
+#include "bsp_if.h"
+
+
+/*
+ * In order to construct the _bsp_memory_list, some board specific code
+ * may have to size RAM regions. To do this easily and reliably, the code
+ * needs to run from ROM before .bss and .data sections are initialized.
+ * This leads to the problem of where to store the results of the memory
+ * sizing tests. In this case, the _bsp_init_stack routine which sizes
+ * memory and sets up the stack will place the board-specific information
+ * on the stack and return with the stack pointer pointing to a pointer to
+ * the information. That is, addr_of_info = *(void **)sp. The architecture
+ * specific code will then copy that pointer to the _bsp_ram_info_ptr variable
+ * after initializing the .data and .bss sections.
+ */
+void *_bsp_ram_info_ptr;
+
+/*
+ * Name of CPU and board. Should be overridden by arch/board specific
+ * code.
+ */
+struct bsp_platform_info _bsp_platform_info = {
+ "Unknown", /* cpu name */
+ "Unknown", /* board name */
+ "" /* extra info */
+};
+
+
+/*
+ * Information about possible data cache. Should be overridden by
+ * by arch/board specific code.
+ */
+struct bsp_cachesize_info _bsp_dcache_info = {
+ 0, 0, 0
+};
+
+
+/*
+ * Information about possible instruction cache. Should be overridden by
+ * by arch/board specific code.
+ */
+struct bsp_cachesize_info _bsp_icache_info = {
+ 0, 0, 0
+};
+
+
+/*
+ * Information about possible secondary cache. Should be overridden by
+ * by arch/board specific code.
+ */
+struct bsp_cachesize_info _bsp_scache_info = {
+ 0, 0, 0
+};
+
+
+
+int
+_bsp_sysinfo(enum bsp_info_id id, va_list ap)
+{
+ int index, rval = 0;
+ void *p;
+
+ switch (id) {
+ case BSP_INFO_PLATFORM:
+ p = va_arg(ap, void *);
+ *(struct bsp_platform_info *)p = _bsp_platform_info;
+ break;
+
+ case BSP_INFO_DCACHE:
+ p = va_arg(ap, void *);
+ *(struct bsp_cachesize_info *)p = _bsp_dcache_info;
+ break;
+
+ case BSP_INFO_ICACHE:
+ p = va_arg(ap, void *);
+ *(struct bsp_cachesize_info *)p = _bsp_icache_info;
+ break;
+
+ case BSP_INFO_SCACHE:
+ p = va_arg(ap, void *);
+ *(struct bsp_cachesize_info *)p = _bsp_scache_info;
+ break;
+
+ case BSP_INFO_MEMORY:
+ index = va_arg(ap, int);
+ p = va_arg(ap, void *);
+
+ if (index >= 0 && index < _bsp_num_mem_regions)
+ *(struct bsp_mem_info *)p = _bsp_memory_list[index];
+ else
+ rval = -1;
+ break;
+
+ case BSP_INFO_COMM:
+ index = va_arg(ap, int);
+ p = va_arg(ap, void *);
+
+ if (index >= 0 && index < _bsp_num_comms)
+ *(struct bsp_comm_info *)p = _bsp_comm_list[index].info;
+ else if (index == _bsp_num_comms && _bsp_net_channel != NULL)
+ *(struct bsp_comm_info *)p = _bsp_net_channel->info;
+ else
+ rval = -1;
+ break;
+
+ default:
+ rval = -1;
+ }
+
+ return rval;
+}
+
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/common/vprintf.c b/cesar/ecos/packages/cygmon/current/misc/bsp/common/vprintf.c
new file mode 100644
index 0000000000..5d1a7e7d61
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/common/vprintf.c
@@ -0,0 +1,445 @@
+//==========================================================================
+//
+// vprintf.c
+//
+// Stripped down (no floating point) for debugging printf in ROMable BSP.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+/*
+ * Copyright (c) 1990, 1999 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Stripped down (no floating point) for debugging printf in ROMable BSP.
+ */
+#include <string.h>
+#include <stdarg.h>
+
+#define BUF 40
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+/*
+ * Macros for converting digits to letters and vice versa
+ */
+#define to_digit(c) ((c) - '0')
+#define is_digit(c) ((unsigned)to_digit(c) <= 9)
+#define to_char(n) ((n) + '0')
+
+/*
+ * Flags used during conversion.
+ */
+#define ALT 0x001 /* alternate form */
+#define HEXPREFIX 0x002 /* add 0x or 0X prefix */
+#define LADJUST 0x004 /* left adjustment */
+#define LONGDBL 0x008 /* long double; unimplemented */
+#define LONGINT 0x010 /* long integer */
+#define QUADINT 0x020 /* quad integer */
+#define SHORTINT 0x040 /* short integer */
+#define ZEROPAD 0x080 /* zero (as opposed to blank) pad */
+#define FPT 0x100 /* Floating point number */
+
+
+void
+__vprintf(void (*putc_func)(char c), const char *fmt0, va_list ap)
+{
+ char *fmt; /* format string */
+ int ch; /* character from fmt */
+ int n, m; /* handy integers (short term usage) */
+ char *cp; /* handy char pointer (short term usage) */
+ int flags; /* flags as above */
+ int width; /* width from format (%8d), or 0 */
+ int prec; /* precision from format (%.3d), or -1 */
+ char sign; /* sign prefix (' ', '+', '-', or \0) */
+ unsigned long _uquad;
+ enum {OCT, DEC, HEX} base; /* base for [diouxX] conversion */
+ int dprec; /* a copy of prec if [diouxX], 0 otherwise */
+ int realsz; /* field size expanded by dprec */
+ int size; /* size of converted field or string */
+ char *xdigs = NULL; /* digits for [xX] conversion */
+ char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */
+ char ox[2]; /* space for 0x hex-prefix */
+
+#define PRINT(ptr, len) { \
+ for(n=0;n<(len);n++) { \
+ if((ptr)[n] == '\n') \
+ (*putc_func)('\r'); \
+ (*putc_func)((ptr)[n]); \
+ } \
+}
+
+#define PAD(howmany, with) { \
+ if ((n = (howmany)) > 0) { \
+ while (n--) \
+ (*putc_func)(with); \
+ } \
+}
+
+ /*
+ * To extend shorts properly, we need both signed and unsigned
+ * argument extraction methods.
+ */
+#define SARG() \
+ (flags&LONGINT ? va_arg(ap, long) : \
+ flags&SHORTINT ? (long)(short)va_arg(ap, int) : \
+ (long)va_arg(ap, int))
+
+#define UARG() \
+ (flags&LONGINT ? va_arg(ap, unsigned long) : \
+ flags&SHORTINT ? (unsigned long)(unsigned short)va_arg(ap, int) : \
+ (unsigned long)va_arg(ap, unsigned int))
+
+ fmt = (char *)fmt0;
+
+ /*
+ * Scan the format for conversions (`%' character).
+ */
+ for (;;) {
+ cp = fmt;
+ while (*fmt && *fmt != '%')
+ fmt++;
+ if ((m = fmt - cp) != 0) {
+ PRINT(cp, m);
+ }
+
+ if (*fmt)
+ fmt++; /* skip over '%' */
+ else
+ goto done;
+
+ flags = 0;
+ dprec = 0;
+ width = 0;
+ prec = -1;
+ sign = '\0';
+
+ rflag:
+ ch = *fmt++;
+ reswitch:
+ switch (ch) {
+ case ' ':
+ /*
+ * ``If the space and + flags both appear, the space
+ * flag will be ignored.''
+ * -- ANSI X3J11
+ */
+ if (!sign)
+ sign = ' ';
+ goto rflag;
+ case '#':
+ flags |= ALT;
+ goto rflag;
+ case '*':
+ /*
+ * ``A negative field width argument is taken as a
+ * - flag followed by a positive field width.''
+ * -- ANSI X3J11
+ * They don't exclude field widths read from args.
+ */
+ if ((width = va_arg(ap, int)) >= 0)
+ goto rflag;
+ width = -width;
+ /* FALLTHROUGH */
+ case '-':
+ flags |= LADJUST;
+ goto rflag;
+ case '+':
+ sign = '+';
+ goto rflag;
+ case '.':
+ if ((ch = *fmt++) == '*') {
+ n = va_arg(ap, int);
+ prec = n < 0 ? -1 : n;
+ goto rflag;
+ }
+ n = 0;
+ while (is_digit(ch)) {
+ n = 10 * n + to_digit(ch);
+ ch = *fmt++;
+ }
+ prec = n < 0 ? -1 : n;
+ goto reswitch;
+ case '0':
+ /*
+ * ``Note that 0 is taken as a flag, not as the
+ * beginning of a field width.''
+ * -- ANSI X3J11
+ */
+ flags |= ZEROPAD;
+ goto rflag;
+ case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ n = 0;
+ do {
+ n = 10 * n + to_digit(ch);
+ ch = *fmt++;
+ } while (is_digit(ch));
+ width = n;
+ goto reswitch;
+ case 'h':
+ flags |= SHORTINT;
+ goto rflag;
+ case 'l':
+ if (*fmt == 'l') {
+ fmt++;
+ flags |= QUADINT;
+ } else {
+ flags |= LONGINT;
+ }
+ goto rflag;
+ case 'c':
+ *(cp = buf) = va_arg(ap, int);
+ size = 1;
+ sign = '\0';
+ break;
+ case 'd':
+ case 'i':
+ _uquad = SARG();
+ if ((long) _uquad < 0)
+ {
+
+ _uquad = -_uquad;
+ sign = '-';
+ }
+ base = DEC;
+ goto number;
+ case 'o':
+ _uquad = UARG();
+ base = OCT;
+ goto nosign;
+ case 's':
+ if ((cp = va_arg(ap, char *)) == NULL)
+ cp = "(null)";
+ if (prec >= 0) {
+ /*
+ * can't use strlen; can only look for the
+ * NUL in the first `prec' characters, and
+ * strlen() will go further.
+ */
+ char *p = memchr(cp, 0, prec);
+
+ if (p != NULL) {
+ size = p - cp;
+ if (size > prec)
+ size = prec;
+ } else
+ size = prec;
+ } else
+ size = strlen(cp);
+ sign = '\0';
+ break;
+ case 'u':
+ _uquad = UARG();
+ base = DEC;
+ goto nosign;
+ case 'X':
+ xdigs = "0123456789ABCDEF";
+ goto hex;
+ case 'x':
+ xdigs = "0123456789abcdef";
+ hex: _uquad = UARG();
+ base = HEX;
+ /* leading 0x/X only if non-zero */
+ if (flags & ALT && _uquad != 0)
+ flags |= HEXPREFIX;
+
+ /* unsigned conversions */
+ nosign: sign = '\0';
+ /*
+ * ``... diouXx conversions ... if a precision is
+ * specified, the 0 flag will be ignored.''
+ * -- ANSI X3J11
+ */
+ number: if ((dprec = prec) >= 0)
+ flags &= ~ZEROPAD;
+
+ /*
+ * ``The result of converting a zero value with an
+ * explicit precision of zero is no characters.''
+ * -- ANSI X3J11
+ */
+ cp = buf + BUF;
+ if (_uquad != 0 || prec != 0) {
+ /*
+ * Unsigned mod is hard, and unsigned mod
+ * by a constant is easier than that by
+ * a variable; hence this switch.
+ */
+ switch (base) {
+ case OCT:
+ do {
+ *--cp = to_char(_uquad & 7);
+ _uquad >>= 3;
+ } while (_uquad);
+ /* handle octal leading 0 */
+ if (flags & ALT && *cp != '0')
+ *--cp = '0';
+ break;
+
+ case DEC:
+ /* many numbers are 1 digit */
+ while (_uquad >= 10) {
+ *--cp = to_char(_uquad % 10);
+ _uquad /= 10;
+ }
+ *--cp = to_char(_uquad);
+ break;
+
+ case HEX:
+ do {
+ *--cp = xdigs[_uquad & 15];
+ _uquad >>= 4;
+ } while (_uquad);
+ break;
+
+ default:
+ cp = "bug in vfprintf: bad base";
+ size = strlen(cp);
+ goto skipsize;
+ }
+ }
+ size = buf + BUF - cp;
+ skipsize:
+ break;
+ default: /* "%?" prints ?, unless ? is NUL */
+ if (ch == '\0')
+ goto done;
+ /* pretend it was %c with argument ch */
+ cp = buf;
+ *cp = ch;
+ size = 1;
+ sign = '\0';
+ break;
+ }
+
+ /*
+ * All reasonable formats wind up here. At this point, `cp'
+ * points to a string which (if not flags&LADJUST) should be
+ * padded out to `width' places. If flags&ZEROPAD, it should
+ * first be prefixed by any sign or other prefix; otherwise,
+ * it should be blank padded before the prefix is emitted.
+ * After any left-hand padding and prefixing, emit zeroes
+ * required by a decimal [diouxX] precision, then print the
+ * string proper, then emit zeroes required by any leftover
+ * floating precision; finally, if LADJUST, pad with blanks.
+ *
+ * Compute actual size, so we know how much to pad.
+ * size excludes decimal prec; realsz includes it.
+ */
+ realsz = dprec > size ? dprec : size;
+ if (sign)
+ realsz++;
+ else if (flags & HEXPREFIX)
+ realsz+= 2;
+
+ /* right-adjusting blank padding */
+ if ((flags & (LADJUST|ZEROPAD)) == 0)
+ PAD(width - realsz, ' ');
+
+ /* prefix */
+ if (sign) {
+ PRINT(&sign, 1);
+ } else if (flags & HEXPREFIX) {
+ ox[0] = '0';
+ ox[1] = ch;
+ PRINT(ox, 2);
+ }
+
+ /* right-adjusting zero padding */
+ if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD)
+ PAD(width - realsz, '0');
+
+ /* leading zeroes from decimal precision */
+ PAD(dprec - size, '0');
+
+ /* the string or number proper */
+ PRINT(cp, size);
+
+ /* left-adjusting padding (always blank) */
+ if (flags & LADJUST)
+ PAD(width - realsz, ' ');
+ }
+ done:
+}
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/cpu.h b/cesar/ecos/packages/cygmon/current/misc/bsp/cpu.h
new file mode 100644
index 0000000000..66ea53a788
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/cpu.h
@@ -0,0 +1,71 @@
+#ifndef __BSP_CPU_H__
+#define __BSP_CPU_H__
+//==========================================================================
+//
+// cpu.h
+//
+// Architecture/processor specifics
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+// Pick up architecture info
+
+#include <pkgconf/system.h>
+
+#ifdef CYGPKG_HAL_ARM
+#include "arm/cpu.h"
+#endif
+
+#ifdef CYGPKG_HAL_MIPS
+#include "mips/cpu.h"
+#endif
+
+#ifdef CYGPKG_HAL_MN10300
+#include "mn10300/cpu.h"
+#endif
+
+#endif // __BSP_CPU_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/dbg-threads-api.h b/cesar/ecos/packages/cygmon/current/misc/bsp/dbg-threads-api.h
new file mode 100644
index 0000000000..8eb1bd7582
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/dbg-threads-api.h
@@ -0,0 +1,148 @@
+#ifndef __BSP_DBG_THREADS_API_H__
+#define __BSP_DBG_THREADS_API_H__
+//==========================================================================
+//
+// dbg-threads-api.h
+//
+// <DESCRIPTION>
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description: These are the calls used to extract operating system
+// specific information used in supporting thread aware
+// debugging.
+// The Operating Environment being debugged needs to supply
+// these functions.
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#define has_thread_void 0
+#define has_thread_current 1
+#define has_thread_registers 2
+#define has_thread_reg_change 4
+#define has_thread_list 8
+#define has_thread_info 16
+
+typedef unsigned char threadref[8] ;
+
+struct dbg_capabilities
+{
+ unsigned long mask1;
+};
+
+/* fill in the list of thread aware capabilities */
+extern int dbg_thread_capabilities(struct dbg_capabilities *cbp);
+
+
+/* Fill in the identifier of the current thread */
+/* return 1 if defined, 0 if not defined */
+extern int dbg_currthread(threadref *varparm);
+
+/* get the first or next member of the list of known threads */
+extern int dbg_threadlist(int startflag,
+ threadref *lastthreadid,
+ threadref *next_thread);
+
+/* return 1 if next_threadid has been filled in with a value */
+/* return 0 if there are none or no more */
+
+/* The O.S can fill in the following information about a thread when queried.
+ The structure of thise strings is determined by the O.S.
+ It is display oriented, so figure out what the users need to see.
+ Nulls are OK but GDB will fill some not so meaningful data.
+ These pointers may be in the calles private structures, the info will
+ get copied immediatly after the call to retreive it.
+ */
+struct cygmon_thread_debug_info
+{
+ threadref thread_id ;
+ int context_exists ; /* To the point where examining its state,
+ registers and stack makes sense to GDB */
+ char * thread_display ; /* As shown in thread status window, name, state */
+ char * unique_thread_name ; /* human readable identifier, window label */
+ char * more_display ; /* more detailed info about thread.
+ priority, queuedepth, state, stack usage, statistics */
+} ;
+
+
+
+
+extern int dbg_threadinfo(threadref *threadid,
+ struct cygmon_thread_debug_info *info);
+
+/* Return 1 if threadid is defined and info copied, 0 otherwise */
+
+/* The O.S should fillin the array of registers using values from the
+saves context. The array MUST be in GDB register save order even if
+the saved context is different or smaller. Do not alter the values of
+registers which are NOT in the O.S. thread context. Their default values
+have already been assigned.
+*/
+
+extern int dbg_getthreadreg(threadref *osthreadid,
+ int regcount, /* count of registers in the array */
+ void * regval); /* fillin this array */
+
+
+/* The O.S. should scan through this list of registers which are in
+GDB order and the O.S. should replace the values of all registers
+which are defined in the saved context of thread or process identified
+by osthreadid. Return 0 if the threadis does not map to a known
+process or other error. Return 1 if the setting is successful. */
+
+extern int dbg_setthreadreg(threadref *osthreadid,
+ int regcount, /* number of registers */
+ void *regval) ;
+
+
+extern int dbg_scheduler(threadref *thread_id, int lock, int mode);
+
+/* --- EXCEPTION -
+ The O.S. does not provide this function , it calls this to specify the
+ location of the dbg_syscall vector
+ */
+extern void patch_dbg_syscalls(void * vector);
+
+#endif /* DBG_THREADS_API_INCLUDED */
+#endif // __BSP_DBG_THREADS_API_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/defs.h b/cesar/ecos/packages/cygmon/current/misc/bsp/defs.h
new file mode 100755
index 0000000000..cd39ac2455
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/defs.h
@@ -0,0 +1,112 @@
+#ifndef __BSP_DEFS_H__
+#define __BSP_DEFS_H__
+//==========================================================================
+//
+// defs.h
+//
+// Definitions of interest to Red Hat BSP.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Definitions of interest to Red Hat BSP.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#define BIT0 0x00000001
+#define BIT1 0x00000002
+#define BIT2 0x00000004
+#define BIT3 0x00000008
+#define BIT4 0x00000010
+#define BIT5 0x00000020
+#define BIT6 0x00000040
+#define BIT7 0x00000080
+#define BIT8 0x00000100
+#define BIT9 0x00000200
+#define BIT10 0x00000400
+#define BIT11 0x00000800
+#define BIT12 0x00001000
+#define BIT13 0x00002000
+#define BIT14 0x00004000
+#define BIT15 0x00008000
+#define BIT16 0x00010000
+#define BIT17 0x00020000
+#define BIT18 0x00040000
+#define BIT19 0x00080000
+#define BIT20 0x00100000
+#define BIT21 0x00200000
+#define BIT22 0x00400000
+#define BIT23 0x00800000
+#define BIT24 0x01000000
+#define BIT25 0x02000000
+#define BIT26 0x04000000
+#define BIT27 0x08000000
+#define BIT28 0x10000000
+#define BIT29 0x20000000
+#define BIT30 0x40000000
+#define BIT31 0x80000000
+
+#define SZ_1K 0x00000400
+#define SZ_2K 0x00000800
+#define SZ_4K 0x00001000
+#define SZ_8K 0x00002000
+#define SZ_16K 0x00004000
+#define SZ_32K 0x00008000
+#define SZ_64K 0x00010000
+#define SZ_128K 0x00020000
+#define SZ_256K 0x00040000
+#define SZ_512K 0x00080000
+#define SZ_1M 0x00100000
+#define SZ_2M 0x00200000
+#define SZ_4M 0x00400000
+#define SZ_8M 0x00800000
+#define SZ_16M 0x01000000
+#define SZ_32M 0x02000000
+#define SZ_64M 0x04000000
+#define SZ_128M 0x08000000
+#define SZ_256M 0x10000000
+#define SZ_512M 0x20000000
+#define SZ_1G 0x40000000
+
+#endif // __BSP_DEFS_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/gdb-data.h b/cesar/ecos/packages/cygmon/current/misc/bsp/gdb-data.h
new file mode 100644
index 0000000000..b4dce69e7c
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/gdb-data.h
@@ -0,0 +1,126 @@
+#ifndef __BSP_GDB_DATA_H__
+#define __BSP_GDB_DATA_H__
+//==========================================================================
+//
+// gdb-data.h
+//
+// Shared data specific to gdb stub.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Shared data specific to gdb stub.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#ifndef __ASSEMBLER__
+typedef int (*gdb_memproc_t)(void *__addr, /* start addr of memory to read/write */
+ int __asid, /* address space id */
+ int __size, /* size of individual read/write ops */
+ int __n, /* number of read/write operations */
+ void *__buf); /* result(read)/src(write) buffer */
+
+
+typedef void (*gdb_regproc_t)(int __regno, /* Register number */
+ void *__regs, /* pointer to saved regs */
+ void *__val); /* pointer to register value */
+
+
+typedef struct {
+ /*
+ * An application may override the standard BSP memory
+ * read and/or write routines with these hooks.
+ */
+ gdb_memproc_t __mem_read_hook;
+ gdb_memproc_t __mem_write_hook;
+
+ /*
+ * An application may override the standard BSP register
+ * access routines with these hooks.
+ */
+ gdb_regproc_t __reg_get_hook;
+ gdb_regproc_t __reg_set_hook;
+
+ /*
+ * An application may extend the gdb remote protocol by
+ * installing hooks to handle unknown general query and
+ * set packets ("q" pkts and 'Q' pkts) with these two hooks.
+ */
+ void (*__pkt_query_hook)(unsigned char *__pkt);
+ void (*__pkt_set_hook)(unsigned char *__pkt);
+
+ /*
+ * An application may also extend the gdb remote protocol
+ * by installing a hook to handle all unknown packets.
+ */
+ void (*__pkt_hook)(unsigned char *__pkt);
+
+ /*
+ * The above hooks for receiving packets will probably need
+ * a mechanism to respond. This vector is provided to allow
+ * an application to append data to the outgoing packet which
+ * will be sent after the above hooks are called.
+ *
+ * This vector uses a printf-like format string followed by
+ * some number of arguments.
+ */
+ void (*__pkt_append)(char *fmt, ...);
+
+ /*
+ * An application can read/write from/to gdb console
+ * through these vectors.
+ *
+ * NB: console read is not supported and will block forever.
+ */
+ int (*__console_read)(char *__buf, int len);
+ int (*__console_write)(char *__buf, int len);
+
+} gdb_data_t;
+
+
+extern gdb_data_t *__get_gdb_data(void);
+
+#endif /* __ASSEMBLER__ */
+
+#endif // __BSP_GDB_DATA_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/hex-utils.h b/cesar/ecos/packages/cygmon/current/misc/bsp/hex-utils.h
new file mode 100644
index 0000000000..12bf43a52c
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/hex-utils.h
@@ -0,0 +1,85 @@
+#ifndef __BSP_HEX_UTILS_H__
+#define __BSP_HEX_UTILS_H__
+//==========================================================================
+//
+// hex-utils.h
+//
+// Utilities for decoding hexadecimal encoded integers.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Utilities for decoding hexadecimal encoded integers.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#ifndef __ASSEMBLER__
+
+/*
+ * Convert a single hex character to its binary value.
+ * Returns -1 if given character is not a value hex character.
+ */
+extern int __hex(char ch);
+
+/*
+ * Convert the hex data in 'buf' into 'count' bytes to be placed in 'mem'.
+ * Returns a pointer to the character in mem AFTER the last byte written.
+ */
+extern char *__unpack_bytes_to_mem(char *buf, char *mem, int count);
+
+/*
+ * While finding valid hex chars, build an unsigned long int.
+ * Return number of hex chars processed.
+ */
+extern int __unpack_ulong(char **ptr, unsigned long *val);
+
+/*
+ * Unpack 'count' hex characters, forming them into a binary value.
+ * Return that value as an int. Adjust the source pointer accordingly.
+ */
+extern int __unpack_nibbles(char **ptr, int count);
+
+#endif
+
+#endif // __BSP_HEX_UTILS_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb-cpu.c b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb-cpu.c
new file mode 100644
index 0000000000..b539c7ee8d
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb-cpu.c
@@ -0,0 +1,53 @@
+//==========================================================================
+//
+// gdb-cpu.c
+//
+// CPU specific support for GDB stub.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-06-07
+// Purpose: CPU specific support for GDB stub.
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb-cpu.h b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb-cpu.h
new file mode 100644
index 0000000000..fc68a42a52
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb-cpu.h
@@ -0,0 +1,58 @@
+#ifndef __BSP_MIPS_GDB_CPU_H__
+#define __BSP_MIPS_GDB_CPU_H__
+//==========================================================================
+//
+// gdb-cpu.h
+//
+// CPU specific definitions for GDB stub.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: dmoseley
+// Date: 2000-07-10
+// Purpose: CPU specific definitions for GDB stub.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
+
+#endif // __BSP_MIPS_GDB_CPU_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb.h b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb.h
new file mode 100644
index 0000000000..1218012153
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/gdb.h
@@ -0,0 +1,58 @@
+#ifndef __BSP_MIPS_GDB_H__
+#define __BSP_MIPS_GDB_H__
+//==========================================================================
+//
+// gdb.h
+//
+//
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
+
+#endif // __BSP_ARM_GDB_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mips/insn.h b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/insn.h
new file mode 100755
index 0000000000..e6cedeaf94
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/insn.h
@@ -0,0 +1,59 @@
+#ifndef __BSP_MIPS_INSN_H__
+#define __BSP_MIPS_INSN_H__
+//==========================================================================
+//
+// insn.h
+//
+// MIPS instruction descriptions.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-07-10
+// Purpose: MIPS instruction descriptions.
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
+// We are using the eCos hal for single-stepping.
+// FIXME: this file can be removed
+
+#endif // __BSP_ARM_INSN_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mips/singlestep.c b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/singlestep.c
new file mode 100644
index 0000000000..b57e73c1d1
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mips/singlestep.c
@@ -0,0 +1,55 @@
+//==========================================================================
+//
+// singlestep.c
+//
+// MIPS specific single-step support.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-07-10
+// Purpose: MIPS specific single-step support.
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
+// We are using the eCos hal for single-stepping.
+// FIXME: this file can be removed
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb-cpu.c b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb-cpu.c
new file mode 100644
index 0000000000..ce92d11e2d
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb-cpu.c
@@ -0,0 +1,53 @@
+//==========================================================================
+//
+// gdb-cpu.c
+//
+// CPU specific support for GDB stub.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose: CPU specific support for GDB stub.
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb-cpu.h b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb-cpu.h
new file mode 100644
index 0000000000..87d617985d
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb-cpu.h
@@ -0,0 +1,58 @@
+#ifndef __BSP_MN10300_GDB_CPU_H__
+#define __BSP_MN10300_GDB_CPU_H__
+//==========================================================================
+//
+// gdb-cpu.h
+//
+// CPU specific definitions for GDB stub.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose: CPU specific definitions for GDB stub.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
+
+#endif // __BSP_MN10300_GDB_CPU_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb.h b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb.h
new file mode 100644
index 0000000000..6b580e9765
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/gdb.h
@@ -0,0 +1,58 @@
+#ifndef __BSP_MN10300_GDB_H__
+#define __BSP_MN10300_GDB_H__
+//==========================================================================
+//
+// gdb.h
+//
+//
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
+
+#endif // __BSP_ARM_GDB_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/insn.h b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/insn.h
new file mode 100644
index 0000000000..3a29fc708c
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/insn.h
@@ -0,0 +1,59 @@
+#ifndef __BSP_MN10300_INSN_H__
+#define __BSP_MN10300_INSN_H__
+//==========================================================================
+//
+// insn.h
+//
+// MN10300 instruction descriptions.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose: MN10300 instruction descriptions.
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
+// We are using the eCos hal for single-stepping.
+// FIXME: this file can be removed
+
+#endif // __BSP_ARM_INSN_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/singlestep.c b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/singlestep.c
new file mode 100644
index 0000000000..1273f5a823
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/bsp/mn10300/singlestep.c
@@ -0,0 +1,55 @@
+//==========================================================================
+//
+// singlestep.c
+//
+// MN10300 specific single-step support.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose: MN10300 specific single-step support.
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Nothing now.
+// We are using the eCos hal for single-stepping.
+// FIXME: this file can be removed
diff --git a/cesar/ecos/packages/cygmon/current/misc/cpu-mon.c b/cesar/ecos/packages/cygmon/current/misc/cpu-mon.c
new file mode 100644
index 0000000000..43cbb4f002
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/cpu-mon.c
@@ -0,0 +1,61 @@
+//==========================================================================
+//
+// cpu-mon.c
+//
+// eCos BSP (for building Cygmon)
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-11
+// Description: Architecture support for Cygmon
+//####DESCRIPTIONEND####
+
+#include <pkgconf/system.h> // Configuration header
+
+#ifdef CYGPKG_HAL_ARM
+#include "arm/arm-mon.c"
+#endif
+
+#ifdef CYGPKG_HAL_MIPS
+#include "mips/mips-mon.c"
+#endif
+
+#ifdef CYGPKG_HAL_MN10300
+#include "mn10300/mn10300-mon.c"
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/cpu_info.h b/cesar/ecos/packages/cygmon/current/misc/cpu_info.h
new file mode 100644
index 0000000000..1a1700ac09
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/cpu_info.h
@@ -0,0 +1,69 @@
+#ifndef __CYGMON_CPU_INFO_H__
+#define __CYGMON_CPU_INFO_H__
+//==========================================================================
+//
+// cpu_info.h
+//
+// Architecture specific information
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+#include <pkgconf/system.h>
+#include <pkgconf/hal.h>
+
+#ifdef CYGPKG_HAL_ARM
+#include "arm/cpu_info.h"
+#endif
+
+#ifdef CYGPKG_HAL_MIPS
+#include "mips/cpu_info.h"
+#endif
+
+#ifdef CYGPKG_HAL_MN10300
+#include "mn10300/cpu_info.h"
+#endif
+#endif // __CYGMON_CPU_INFO_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/ecos_bsp.c b/cesar/ecos/packages/cygmon/current/misc/ecos_bsp.c
new file mode 100644
index 0000000000..f6ee0fcd2f
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/ecos_bsp.c
@@ -0,0 +1,470 @@
+//==========================================================================
+//
+// ecos_bsp.c
+//
+// eCos BSP (for building Cygmon)
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-11
+// Description: Wrapper functions which provide BSP environment for Cygmon
+//####DESCRIPTIONEND####
+
+#ifdef CYGPKG_KERNEL
+#include <pkgconf/kernel.h> // Configuration headers
+#endif
+#include <pkgconf/hal.h>
+#include <pkgconf/cygmon.h>
+
+#include <cyg/hal/hal_arch.h>
+#include <cyg/hal/hal_cache.h>
+#ifdef CYGPKG_KERNEL
+#include <cyg/kernel/kapi.h>
+#else
+#include <cyg/hal/drv_api.h>
+#include <cyg/hal/hal_intr.h>
+#endif
+#include <cyg/infra/diag.h>
+#include "bsp/common/bsp_if.h"
+#include <cyg/hal/hal_if.h>
+#include <signal.h>
+#include CYGHWR_MEMORY_LAYOUT_H
+
+#include <pkgconf/system.h>
+#ifdef CYGPKG_IO
+#include <cyg/io/io.h>
+#include <cyg/io/serialio.h>
+#endif
+
+#define STACK_SIZE CYGNUM_HAL_STACK_SIZE_MINIMUM
+static char stack[STACK_SIZE];
+#ifdef CYGPKG_KERNEL
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+#endif
+
+char *build_date = __DATE__;
+
+extern void monitor_main(int, char *);
+extern int stub_is_active;
+
+void ecos_bsp_set_memsize(unsigned long size);
+
+void
+cygmon_main(void)
+{
+ _bsp_init();
+ monitor_main(0, 0); // Null argument list
+}
+
+extern unsigned long cygmon_memsize;
+
+externC void
+cyg_start( void )
+{
+ // Fill in the BSP memory info
+ if (cygmon_memsize != 0)
+ ecos_bsp_set_memsize(cygmon_memsize);
+
+#ifdef CYGPKG_KERNEL
+ // Create a main thread, so we can run the scheduler and have time 'pass'
+ cyg_thread_create(10, // Priority - just a number
+ (cyg_thread_entry_t*)cygmon_main, // entry
+ 0, // entry parameter
+ "Cygmon", // Name
+ &stack[0], // Stack
+ STACK_SIZE, // Size
+ &thread_handle, // Handle
+ &thread_data // Thread data structure
+ );
+ cyg_thread_resume(thread_handle); // Start it
+ cyg_scheduler_start();
+#else
+#ifdef HAL_ARCH_FUNCALL_NEW_STACK
+ HAL_ARCH_FUNCALL_NEW_STACK(cygmon_main, &stack[0], STACK_SIZE);
+#else
+ #error Need to define HAL_ARCH_FUNCALL_NEW_STACK
+#endif
+#endif
+} // cyg_package_start()
+
+#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+extern void *_hal_registers; // Used by eCos GDB stubs
+extern void (*__init_vec)(void);
+extern void (*__cleanup_vec)(void);
+extern void __install_traps(void);
+#endif
+
+extern int machine_syscall(HAL_SavedRegisters *regs);
+void
+_bsp_handle_exception(cyg_addrword_t data, cyg_code_t num, cyg_addrword_t info)
+{
+ if (num == CYGNUM_HAL_EXCEPTION_INTERRUPT) {
+ if (machine_syscall((HAL_SavedRegisters*)info)) {
+ return;
+ }
+ // Fall through to "normal" exception handling if system call failed
+ }
+#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+ _hal_registers = (void *)info; // Used by eCos GDB stubs
+ __cleanup_vec();
+#endif
+ bsp_invoke_dbg_handler(num, (void *)info);
+#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+ __init_vec();
+#endif
+}
+
+#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+extern void __handle_exception(void);
+#else
+
+int
+unhandled_exception(int num, void *args)
+{
+ diag_printf("Unhandled exception: %d/%x\n", num, args);
+ while (1) ;
+}
+#endif
+
+void
+_bsp_cpu_init(void)
+{
+#ifdef CYGPKG_KERNEL
+ int d0;
+ cyg_exception_set_handler(CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION,
+ _bsp_handle_exception,
+ (cyg_addrword_t)&d0,
+ 0,
+ 0);
+#endif
+#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+ bsp_install_dbg_handler((bsp_handler_t)__handle_exception);
+ __install_traps();
+#else
+ bsp_install_dbg_handler(unhandled_exception);
+#endif
+}
+
+#define FAIL() diag_printf("fail: %s\n", __FUNCTION__); while (1) ;
+
+#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+
+struct BSP_IO {
+ char *name;
+ cyg_io_handle_t chan;
+};
+
+static void
+uart_putchar(void *base, char c)
+{
+ char buf;
+ int len;
+ struct BSP_IO *io = (struct BSP_IO *)base;
+ if (io->chan) {
+ len = 1;
+ buf = c;
+ cyg_io_write(io->chan, &buf, &len);
+ }
+}
+
+extern int __output_gdb_string (const char *str, int string_len);
+
+// This function is mostly used by the 'write()' system call
+static void
+uart_write(void *base, const char *buf, int len)
+{
+ struct BSP_IO *io = (struct BSP_IO *)base;
+ if (io->chan) {
+ if (stub_is_active) {
+ // We are running in 'GDB' mode
+ __output_gdb_string(buf, len);
+ } else {
+ cyg_io_write(io->chan, buf, &len);
+ }
+ }
+}
+
+static int
+uart_read(void *base, char *buf, int len)
+{
+ struct BSP_IO *io = (struct BSP_IO *)base;
+ if (io->chan) {
+ cyg_io_read(io->chan, buf, &len);
+ return len;
+ }
+ return 0;
+}
+
+static int
+uart_getchar(void *base)
+{
+ char buf = '\0';
+ int len;
+ struct BSP_IO *io = (struct BSP_IO *)base;
+ if (io->chan) {
+ len = 1;
+ cyg_io_read(io->chan, &buf, &len);
+ }
+ return buf;
+}
+
+static int
+uart_control(void *base, int func, ...)
+{
+ int rc = 0;
+ va_list ap;
+ int arg;
+ struct BSP_IO *io = (struct BSP_IO *)base;
+
+ va_start(ap, func);
+
+ if (func == COMMCTL_SETBAUD)
+ {
+ cyg_serial_info_t buffer = {
+ CYG_SERIAL_BAUD_DEFAULT,
+ CYG_SERIAL_STOP_DEFAULT,
+ CYG_SERIAL_PARITY_DEFAULT,
+ CYG_SERIAL_WORD_LENGTH_DEFAULT,
+ CYG_SERIAL_FLAGS_DEFAULT
+ };
+ int len = sizeof(buffer);
+ arg = va_arg(ap, int);
+
+ switch (arg)
+ {
+ case 50: buffer.baud = CYG_SERIAL_BAUD_RATE(50); break;
+ case 75: buffer.baud = CYG_SERIAL_BAUD_RATE(75); break;
+ case 110: buffer.baud = CYG_SERIAL_BAUD_RATE(110); break;
+ case 134: buffer.baud = CYG_SERIAL_BAUD_RATE(134_5); break;
+ case 135: buffer.baud = CYG_SERIAL_BAUD_RATE(134_5); break;
+ case 150: buffer.baud = CYG_SERIAL_BAUD_RATE(150); break;
+ case 200: buffer.baud = CYG_SERIAL_BAUD_RATE(200); break;
+ case 300: buffer.baud = CYG_SERIAL_BAUD_RATE(300); break;
+ case 600: buffer.baud = CYG_SERIAL_BAUD_RATE(600); break;
+ case 1200: buffer.baud = CYG_SERIAL_BAUD_RATE(1200); break;
+ case 1800: buffer.baud = CYG_SERIAL_BAUD_RATE(1800); break;
+ case 2400: buffer.baud = CYG_SERIAL_BAUD_RATE(2400); break;
+ case 3600: buffer.baud = CYG_SERIAL_BAUD_RATE(3600); break;
+ case 4800: buffer.baud = CYG_SERIAL_BAUD_RATE(4800); break;
+ case 7200: buffer.baud = CYG_SERIAL_BAUD_RATE(7200); break;
+ case 9600: buffer.baud = CYG_SERIAL_BAUD_RATE(9600); break;
+ case 14400: buffer.baud = CYG_SERIAL_BAUD_RATE(14400); break;
+ case 19200: buffer.baud = CYG_SERIAL_BAUD_RATE(19200); break;
+ case 38400: buffer.baud = CYG_SERIAL_BAUD_RATE(38400); break;
+ case 57600: buffer.baud = CYG_SERIAL_BAUD_RATE(57600); break;
+ case 115200: buffer.baud = CYG_SERIAL_BAUD_RATE(115200); break;
+ case 230400: buffer.baud = CYG_SERIAL_BAUD_RATE(230400); break;
+ default: buffer.baud = -1; rc = -1; break;
+ }
+
+ if ((io->chan) && (buffer.baud != -1)) {
+ rc = cyg_io_set_config(io->chan, CYG_IO_SET_CONFIG_SERIAL_INFO, &buffer, &len);
+ }
+ }
+
+ va_end(ap);
+ return rc;
+}
+
+/*
+ * Setup the bsp_comm_channel data structure
+ */
+struct BSP_IO bsp_comm_io[] = {
+ {CYGDAT_CYGMON_CONSOLE_DEV, 0}, // Console device
+};
+
+struct bsp_comm_channel _bsp_comm_list[] =
+{
+ {
+ { "UART 0",
+ BSP_COMM_SERIAL,
+ BSP_PROTO_NONE },
+ { (void*)&bsp_comm_io[0],
+ uart_write,
+ uart_read,
+ uart_putchar,
+ uart_getchar,
+ uart_control }
+ },
+};
+int _bsp_num_comms = sizeof(_bsp_comm_list)/sizeof(_bsp_comm_list[0]);
+
+void
+_bsp_init_board_comm(void)
+{
+ int i;
+ for (i = 0; i < _bsp_num_comms; i++) {
+ Cyg_ErrNo err;
+ struct BSP_IO *io;
+ io = (struct BSP_IO *)_bsp_comm_list[i].procs.ch_data;
+ if ((err = cyg_io_lookup(io->name, &io->chan)) != ENOERR) {
+ diag_printf("Can't open '%s'\n", io->name);
+ }
+ }
+}
+
+#else // CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+
+struct bsp_comm_channel _bsp_comm_list[1];
+int _bsp_num_comms = 1;
+
+// Yuck! Two things need doing:
+
+// FIXME: Make bsp code use pointers in the bsp_comm_channel instead
+// of sub-structures.
+
+// FIXME: Make HAL provide the bsp_comm_info structure - I missed that
+// initially because it cannot be accessed via the virtual table API.
+void
+_bsp_init_board_comm(void)
+{
+ struct bsp_comm_channel* channel;
+ hal_virtual_comm_table_t* comm;
+
+ channel = &_bsp_comm_list[0];
+ channel->info.name = "fixme";
+ channel->info.kind = BSP_COMM_SERIAL;
+ channel->info.protocol = BSP_PROTO_NONE;
+
+ comm = CYGACC_CALL_IF_DEBUG_PROCS();
+ channel->procs = *(struct bsp_comm_procs*)comm;
+}
+#endif // CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+
+/*
+ * Array of memory region descriptors. We just list RAM.
+ */
+#ifdef CYGMEM_REGION_ram
+#define RAM_VIRTUAL_BASE CYGMEM_REGION_ram
+#define RAM_TOTAL_SIZE CYGMEM_REGION_ram_SIZE
+#else
+#define RAM_VIRTUAL_BASE 0x00008000
+#define RAM_TOTAL_SIZE 0x00FF8000
+#endif
+
+struct bsp_mem_info _bsp_memory_list[] =
+{
+ { (void *)RAM_VIRTUAL_BASE,
+ (void *)RAM_VIRTUAL_BASE,
+ 0,
+ RAM_TOTAL_SIZE,
+ BSP_MEM_RAM
+ },
+};
+
+/*
+ * Number of memory region descriptors.
+ */
+int _bsp_num_mem_regions = sizeof(_bsp_memory_list)/sizeof(_bsp_memory_list[0]);
+
+void
+_bsp_install_cpu_irq_controllers(void)
+{
+}
+
+void
+_bsp_install_board_irq_controllers(void)
+{
+}
+
+void
+__init_irq_controllers(void)
+{
+}
+
+void
+_bsp_board_init(void)
+{
+ /*
+ * Define platform info.
+ */
+#ifdef HAL_PLATFORM_CPU
+ _bsp_platform_info.cpu = HAL_PLATFORM_CPU;
+#else
+ _bsp_platform_info.cpu = "Unknown CPU";
+#endif
+#ifdef HAL_PLATFORM_BOARD
+ _bsp_platform_info.board = HAL_PLATFORM_BOARD;
+#else
+ _bsp_platform_info.board = "Unknown board";
+#endif
+#ifdef HAL_PLATFORM_EXTRA
+ _bsp_platform_info.extra = HAL_PLATFORM_EXTRA;
+#else
+ _bsp_platform_info.extra = "";
+#endif
+}
+
+extern char *strchr(char *, char);
+char *
+index(char *string, char key)
+{
+ return strchr(string, key);
+}
+
+void
+flush_i_cache(void)
+{
+ HAL_ICACHE_SYNC();
+}
+
+void
+ecos_bsp_console_putc(char c)
+{
+ if (bsp_shared_data) {
+ bsp_console_putc(c);
+ }
+}
+
+char
+ecos_bsp_console_getc(void)
+{
+ if (bsp_shared_data) {
+ return bsp_console_getc();
+ } else {
+ return '?';
+ }
+}
+
+void
+ecos_bsp_set_memsize(unsigned long size)
+{
+ _bsp_memory_list[0].nbytes = size;
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/ecos_dummy.c b/cesar/ecos/packages/cygmon/current/misc/ecos_dummy.c
new file mode 100644
index 0000000000..876d527007
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/ecos_dummy.c
@@ -0,0 +1,70 @@
+//==========================================================================
+//
+// ecos_dummy.c
+//
+// eCos BSP (for building Cygmon)
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-11
+// Description: Wrapper functions which provide BSP environment for Cygmon
+//####DESCRIPTIONEND####
+
+#ifdef CYGPKG_KERNEL
+#include <pkgconf/kernel.h> // Configuration header
+#include <cyg/kernel/kapi.h>
+#endif
+#include <cyg/infra/diag.h>
+#include <cyg/hal/plf_stub.h>
+
+// TEMP
+
+#define FAIL(n) \
+void n(void) \
+{ \
+ diag_printf("Fail: %s\n", #n); \
+ while (1) ; \
+}
+
+#ifndef CYGHWR_HAL_RESET_DEFINED
+ FAIL(bsp_reset)
+#endif
+
+ FAIL(_bsp_gdb_handler)
+ FAIL(_bsp_gdb_data)
diff --git a/cesar/ecos/packages/cygmon/current/misc/fmt_util.h b/cesar/ecos/packages/cygmon/current/misc/fmt_util.h
new file mode 100644
index 0000000000..03a3fca22a
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/fmt_util.h
@@ -0,0 +1,65 @@
+#ifndef __FMT_UTIL_H__
+#define __FMT_UTIL_H__
+//==========================================================================
+//
+// fmt_util.g
+//
+// Interface to generic string parsing and formatting utilities.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+/* Interface to generic string parsing and formatting utilities.
+
+ It is posible that these services need to be defined in
+ a platform dependent way. These will work for the majority of
+ processors. */
+
+extern int str2addr (char *string, mem_addr_t *res);
+extern void addr2str (mem_addr_t *addr, char *dest);
+
+#endif // __FMT_UTIL_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/generic-stub.h b/cesar/ecos/packages/cygmon/current/misc/generic-stub.h
new file mode 100644
index 0000000000..d6b44ec80c
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/generic-stub.h
@@ -0,0 +1,54 @@
+//==========================================================================
+//
+// generic-stub.h
+//
+//
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Placeholder
diff --git a/cesar/ecos/packages/cygmon/current/misc/generic_fmt32.c b/cesar/ecos/packages/cygmon/current/misc/generic_fmt32.c
new file mode 100644
index 0000000000..26d2112208
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/generic_fmt32.c
@@ -0,0 +1,98 @@
+//==========================================================================
+//
+// generic_fmt32.c
+//
+// Generic address conversion routines
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Generic address conversion routines
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <string.h>
+#ifdef HAVE_BSP
+#include <bsp/bsp.h>
+#include <bsp/cpu.h>
+#endif
+#include "monitor.h"
+#include "fmt_util.h"
+
+
+int
+str2addr (char *string, mem_addr_t *res)
+{
+#ifdef HAVE_ASI
+ if (string[0] == '[')
+ {
+ char *ptr = ++string;
+ while (*ptr && *ptr != ']')
+ ptr++;
+
+ if (*ptr == 0)
+ return -1;
+
+ *(ptr++) = 0;
+ res->asi = str2int (string, 16);
+ string = ptr;
+ }
+ else
+ res->asi = ASI_DEFAULT;
+#endif
+ res->addr = str2int (string, 16);
+ return 0;
+}
+
+void
+addr2str (mem_addr_t *addr, char *dest)
+{
+#ifdef HAVE_ASI
+ if (addr->asi != ASI_DEFAULT)
+ xsprintf(dest, "[%x]", addr->asi);
+ else
+#endif
+ dest[0] = 0;
+ strcat (dest, int2str (addr->addr, 16, sizeof (void *) * 2));
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/generic_mem.c b/cesar/ecos/packages/cygmon/current/misc/generic_mem.c
new file mode 100644
index 0000000000..76c6c86636
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/generic_mem.c
@@ -0,0 +1,99 @@
+//==========================================================================
+//
+// generic_mem.c
+//
+// Routines for reading and writing memory.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-20
+// Purpose:
+// Description: It may be appropriate to relay directly into the stubs
+// implementation of read memory, without board specific
+// considerations such as checking the allowed ranges of
+// addresses. Perhaps there needs to be some consideration
+// of address spaces or, masking addresses.
+//
+// This file implements a default version of reading and writing
+// memory when none of this is an issue
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#ifdef HAVE_BSP
+#include <bsp/bsp.h>
+#include "cpu_info.h"
+#endif
+#include "board.h"
+#include "monitor.h"
+#include "tservice.h"
+
+#ifndef HAVE_BSP
+#include "generic-stub.h"
+#endif
+
+
+int
+read_memory (mem_addr_t *src, int size, int amt, char *dst)
+{
+#if defined(HAVE_BSP) && !defined(USE_ECOS_HAL_SAFE_MEMORY)
+ return (bsp_memory_read((unsigned char *)src->addr, MEM_ADDR_ASI(src),
+ size << 3, amt, dst) != amt);
+#else
+ int totamt = size * amt;
+ return (totamt != __read_mem_safe (dst, (void*)src->addr, totamt));
+#endif
+}
+
+int
+write_memory (mem_addr_t *dst, int size, int amt, char *src)
+{
+#if defined(HAVE_BSP) && !defined(USE_ECOS_HAL_SAFE_MEMORY)
+ return (bsp_memory_write((unsigned char *)dst->addr, MEM_ADDR_ASI(dst),
+ size << 3, amt, src) != amt);
+#else
+ int totamt = size * amt;
+ return (totamt != __write_mem_safe (src, (void*)dst->addr, totamt));
+#endif
+}
+
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/ledit.c b/cesar/ecos/packages/cygmon/current/misc/ledit.c
new file mode 100644
index 0000000000..c2609d3883
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/ledit.c
@@ -0,0 +1,604 @@
+//==========================================================================
+//
+// ledit.c
+//
+// Utterly simple line editor
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Udderly simple line editor
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+
+#include <monitor.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_BSP
+#include <bsp/bsp.h>
+#endif
+#include "ledit.h"
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+static char *cutBuf = NULL;
+
+#ifdef NO_MALLOC
+static char linebufArray [MAX_HIST_ENTS + 2][MAXLINELEN + 1];
+#endif
+
+static struct termcap
+{
+ char *relleft, *relright;
+ char *oneleft;
+ char *insertch;
+ char *deletech;
+ char *deleteonech;
+ char *clreol;
+ char *gobol;
+ int width;
+} terminal;
+
+static struct linepos
+{
+ char *prompt;
+ char *buffer;
+ char *ebuf;
+ int cursor;
+} linebuf;
+
+static struct history
+{
+ char *cmd;
+ struct history *next, *prev;
+} *list = NULL, *topl = NULL, *curl = NULL;
+
+static int histlen = 0;
+static int histLimit = MAX_HIST_ENTS;
+
+static struct history histEnts[MAX_HIST_ENTS + 1], *histPtr = histEnts;
+static struct history currLine = { NULL, NULL, NULL };
+
+void
+beep (void)
+{
+ xputchar ('\007');
+}
+
+void
+printHistoryList ()
+{
+ struct history *hist = list;
+ int hist_num = 1;
+
+ if (hist != NULL)
+ {
+ while (hist->prev != NULL)
+ {
+ hist = hist->prev;
+ }
+
+ while (hist != NULL)
+ {
+ if (hist->cmd != NULL)
+ xprintf(" %d %s\n", hist_num++, hist->cmd);
+ hist = hist->next;
+ }
+ }
+}
+
+static void
+outputParamStr (char *str, int val)
+{
+ char *i = strchr (str, '%');
+ char *ptr;
+ int dist = val;
+
+ if (i == NULL)
+ {
+ while (dist-- > 0)
+ xprintf (str);
+ }
+ else
+ {
+ for (ptr = str; *ptr && ptr < i; ptr++)
+ xputchar (*ptr);
+ if (dist > 99)
+ {
+ xputchar ('0' + dist / 100);
+ dist = dist % 100;
+ }
+ if (dist > 9)
+ {
+ xputchar ('0' + dist / 10);
+ dist = dist % 10;
+ }
+ xputchar ('0' + dist);
+ if (*ptr)
+ xprintf (ptr + 1);
+ }
+}
+
+static void
+absMoveCursor (int pos)
+{
+ int dist, oldpos = linebuf.cursor;
+ int absdist;
+ char *bigmove;
+
+ if (pos > (linebuf.ebuf - linebuf.buffer))
+ {
+ beep ();
+ pos = linebuf.ebuf - linebuf.buffer;
+ }
+ else if (pos < 0)
+ pos = 0;
+ dist = pos - linebuf.cursor;
+ absdist = (dist < 0 ? -dist : dist);
+ linebuf.cursor = pos;
+ if (dist == 0)
+ return;
+ if (dist < 0)
+ bigmove = terminal.relleft;
+ else
+ bigmove = terminal.relright;
+
+ if ((absdist < 4) || (bigmove == NULL))
+ {
+ int x;
+ int promptLen = strlen (linebuf.prompt);
+
+ if (pos < (absdist - promptLen))
+ {
+ xprintf (terminal.gobol);
+ xprintf (linebuf.prompt);
+ for (x = 0; x < pos; x++)
+ xputchar (linebuf.buffer[x]);
+ return;
+ }
+
+ if (dist < 0)
+ {
+ for (x = 0; x < -dist ;x++)
+ xprintf (terminal.oneleft);
+ }
+ else
+ {
+ for (x = 0; x < dist; x++)
+ xputchar (linebuf.buffer [oldpos + x]);
+ }
+ }
+ else
+ {
+ outputParamStr (bigmove, absdist);
+ }
+}
+
+static void
+clrScrToEol (void)
+{
+ int len = linebuf.ebuf - linebuf.buffer;
+
+ if (len < linebuf.cursor)
+ return;
+
+ if(terminal.clreol)
+ {
+ xprintf (terminal.clreol);
+ }
+ else if (terminal.deletech)
+ {
+ outputParamStr (terminal.deletech, len - linebuf.cursor);
+ }
+ else
+ {
+ int oldcur = linebuf.cursor;
+ while (linebuf.cursor < len)
+ {
+ xputchar (' ');
+ linebuf.cursor++;
+ }
+
+ absMoveCursor (oldcur);
+ }
+}
+
+static void
+redrawCmd (void)
+{
+ xprintf (terminal.gobol);
+ xprintf (linebuf.prompt);
+ linebuf.buffer[linebuf.cursor] = 0;
+ xprintf (linebuf.buffer);
+ clrScrToEol ();
+}
+
+static void
+instCmd (char *ncmd)
+{
+ linebuf.cursor = strlen (ncmd);
+ strcpy (linebuf.buffer, ncmd);
+ redrawCmd ();
+ linebuf.ebuf = linebuf.buffer + linebuf.cursor;
+}
+
+static void
+prevCmd (void)
+{
+ if (curl == &currLine)
+ {
+ if (list != NULL)
+ {
+ *linebuf.ebuf = 0;
+#ifdef NO_MALLOC
+ currLine.cmd = linebufArray[MAX_HIST_ENTS];
+ strcpy (currLine.cmd, linebuf.buffer);
+#else
+ if (currLine.cmd != NULL)
+ free (currLine.cmd);
+ currLine.cmd = strdup (linebuf.buffer);
+#endif
+ curl = list;
+ }
+ }
+ else
+ {
+ if (curl->prev != NULL)
+ curl = curl->prev;
+ }
+ if (curl != NULL && curl->cmd != NULL)
+ instCmd (curl->cmd);
+ else
+ beep ();
+}
+
+static void
+nextCmd (void)
+{
+ if (curl->next == NULL)
+ {
+ beep ();
+ }
+ else
+ {
+ curl = curl->next;
+ instCmd (curl->cmd);
+ }
+
+}
+
+static int initted = 0;
+
+void
+initVt100 (void)
+{
+ terminal.gobol = "\r";
+ terminal.oneleft = "\010";
+ terminal.relleft = "\033[%D";
+ terminal.relright = "\033[%C";
+ terminal.insertch = "\033[%@";
+ terminal.deletech = "\033[%P";
+ terminal.deleteonech = "\033[P";
+ terminal.clreol = "\033[K";
+ terminal.width = 80;
+ initted = 1;
+}
+
+void
+initDumb (void)
+{
+ terminal.gobol = "\r";
+ terminal.oneleft = "\010";
+ terminal.relleft = NULL;
+ terminal.relright = NULL;
+ terminal.insertch = NULL;
+ terminal.deletech = NULL;
+ terminal.deleteonech = NULL;
+ terminal.clreol = NULL;
+ terminal.width = 80;
+ initted = 1;
+}
+
+static void
+insertChar (char *chars, int num)
+{
+ int len = linebuf.ebuf - linebuf.buffer + strlen (linebuf.prompt);
+ int n = 0;
+
+ if ((len + num) >= terminal.width)
+ {
+ beep ();
+ return;
+ }
+ if ((linebuf.ebuf - linebuf.buffer) > linebuf.cursor)
+ {
+ char *ptr, *eptr = linebuf.buffer + linebuf.cursor;
+
+ for (ptr = linebuf.ebuf; ptr >= eptr; ptr--)
+ *(ptr+num) = *ptr;
+
+ if (terminal.insertch != NULL)
+ outputParamStr (terminal.insertch, num);
+ }
+ for (n = 0; n < num; n++)
+ {
+ xputchar (*chars);
+ linebuf.buffer[linebuf.cursor++] = *(chars++);
+ }
+
+ linebuf.ebuf += num;
+
+ if (terminal.insertch == NULL)
+ {
+ char *ptr = linebuf.buffer + linebuf.cursor;
+ int oldcur = linebuf.cursor;
+ for (; ptr < linebuf.ebuf; ptr++)
+ xputchar (*ptr);
+ linebuf.cursor = linebuf.ebuf - linebuf.buffer;
+ absMoveCursor (oldcur);
+ }
+}
+
+static void
+deleteEol (int putInCutBuffer)
+{
+ int len = linebuf.ebuf - linebuf.buffer;
+ if (linebuf.cursor < len)
+ {
+ clrScrToEol ();
+
+ if (putInCutBuffer)
+ {
+ *linebuf.ebuf = 0;
+#ifdef NO_MALLOC
+ cutBuf = linebufArray[MAX_HIST_ENTS + 1];
+ strcpy (cutBuf, linebuf.buffer + linebuf.cursor);
+#else
+ if (cutBuf != NULL)
+ free (cutBuf);
+ cutBuf = strdup (linebuf.buffer + linebuf.cursor);
+#endif
+ }
+ linebuf.ebuf = linebuf.buffer + linebuf.cursor;
+ }
+}
+
+static void
+deleteCurrChar (void)
+{
+ int len = linebuf.ebuf - linebuf.buffer;
+ char *ptr;
+ if (len == linebuf.cursor || len == 0)
+ return;
+ for (ptr = linebuf.buffer + linebuf.cursor; ptr < (linebuf.ebuf - 1); ptr++)
+ {
+ *ptr = *(ptr + 1);
+ if (terminal.deleteonech == NULL)
+ xputchar (*ptr);
+ }
+ linebuf.ebuf--;
+ if (terminal.deleteonech && (len - 1) != linebuf.cursor)
+ xprintf (terminal.deleteonech);
+ else
+ {
+ int oldcur = linebuf.cursor;
+ xputchar (' ');
+ linebuf.cursor = linebuf.ebuf - linebuf.buffer + 1;
+ absMoveCursor (oldcur);
+ }
+}
+
+static void
+deleteChar (void)
+{
+ if (linebuf.cursor == 0)
+ {
+ beep ();
+ return;
+ }
+ absMoveCursor (linebuf.cursor - 1);
+ deleteCurrChar ();
+}
+
+int
+lineedit (char *prompt, char *buffer, int maxLen)
+{
+ int c;
+
+ curl = &currLine;
+
+ if (!initted)
+ {
+ initted = 1;
+ /*initVt100 ();*/
+ initDumb();
+ }
+ linebuf.prompt = prompt;
+ linebuf.buffer = buffer;
+ linebuf.ebuf = buffer;
+ buffer[0] = 0;
+ linebuf.cursor = 0;
+ redrawCmd ();
+ while ((c=input_char ()) > 0)
+ {
+ switch (c)
+ {
+ case PREVCMD:
+ prevCmd ();
+ break;
+ case NEXTCMD:
+ nextCmd ();
+ break;
+ case LF:
+ case CR:
+ *linebuf.ebuf = 0;
+#ifdef NO_MALLOC
+ cutBuf = NULL;
+ currLine.cmd = NULL;
+#else
+ if (cutBuf != NULL)
+ {
+ free (cutBuf);
+ cutBuf = NULL;
+ }
+ if (currLine.cmd != NULL)
+ {
+ free (currLine.cmd);
+ currLine.cmd = NULL;
+ }
+#endif
+ return linebuf.ebuf - linebuf.buffer;
+ break;
+ case BOLCMD:
+ absMoveCursor (0);
+ break;
+ case EOLCMD:
+ absMoveCursor (linebuf.ebuf-linebuf.buffer);
+ break;
+ case FORWCMD:
+ absMoveCursor (linebuf.cursor + 1);
+ break;
+ case BACKCMD:
+ absMoveCursor (linebuf.cursor - 1);
+ break;
+ case DELBACK:
+ case '\177':
+ deleteChar ();
+ break;
+ case ERASELINE:
+ absMoveCursor (0);
+ deleteEol (0);
+ break;
+ case DELEOL:
+ deleteEol (1);
+ break;
+ case DELCURRCH:
+ deleteCurrChar ();
+ break;
+ case YANKCH:
+ if (cutBuf != NULL)
+ insertChar (cutBuf,strlen (cutBuf));
+ break;
+ default:
+ if (c >= 32 && c < 127)
+ {
+ char ch = c;
+ insertChar (&ch, 1);
+ }
+ break;
+ }
+ }
+ return -1;
+}
+
+void
+addHistoryCmd (char *cmd)
+{
+ struct history *newent = NULL;
+
+ if (histlen >= histLimit)
+ {
+ newent = topl;
+ topl = topl->next;
+ topl->prev = NULL;
+#ifdef NO_MALLOC
+ newent->prev = NULL;
+ newent->next = NULL;
+#else
+ free (newent->cmd);
+ newent->cmd = NULL;
+#endif
+ histlen = histLimit - 1;
+ }
+
+ histlen++;
+
+ if (newent == NULL)
+ {
+ newent = histPtr++;
+#ifdef NO_MALLOC
+ newent->cmd = linebufArray[histlen - 1];
+#endif
+ }
+
+ if (list == NULL)
+ {
+ list = newent;
+ list->prev = NULL;
+ topl = list;
+ }
+ else
+ {
+ list->next = newent;
+ list->next->prev = list;
+ list = list->next;
+ }
+ currLine.prev = list;
+ list->next = &currLine;
+#ifdef NO_MALLOC
+ strcpy (list->cmd, cmd);
+#else
+ list->cmd = strdup (cmd);
+#endif
+ curl = &currLine;
+}
+
+void
+set_term_name (char *name)
+{
+ if (! strcmp (name, "vt100"))
+ {
+ initVt100 ();
+ }
+ else if (! strcmp (name, "dumb"))
+ {
+ initDumb ();
+ }
+ else
+ {
+ xprintf ("Unknown terminal name %s\n", name);
+ }
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/ledit.h b/cesar/ecos/packages/cygmon/current/misc/ledit.h
new file mode 100644
index 0000000000..083eeff89e
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/ledit.h
@@ -0,0 +1,88 @@
+//==========================================================================
+//
+// ledit.h
+//
+// Header for the utterly simple line editor
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Header for the udderly simple line editor
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#ifndef LEDIT_H
+#define LEDIT_H
+
+#define LF '\n'
+#define CR '\r'
+#define BOLCMD '\001'
+#define EOLCMD '\005'
+#define FORWCMD '\006'
+#define BACKCMD '\002'
+#define DELBACK '\010'
+#define DELEOL '\013'
+#define YANKCH '\031'
+#define DELCURRCH '\004'
+#define PREVCMD '\020'
+#define ERASELINE '\025'
+#define NEXTCMD '\016'
+
+/* Prompt for one line of input using PROMPT. The input from the user
+ (up to MAXINPLEN characters) will be stored in BUFFER. The number
+ of characters read will be returned. */
+extern int lineedit(char *prompt, char *buffer, int maxInpLen);
+
+/* Add CMD to the user's command history. */
+extern void addHistoryCmd (char *cmd);
+
+/* Configure the editor to use the specified terminal. */
+extern void set_term_name (char *name);
+
+/* Beep the terminal. */
+extern void beep (void);
+
+/* Print a history list. */
+extern void printHistoryList(void);
+
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/mips/board.h b/cesar/ecos/packages/cygmon/current/misc/mips/board.h
new file mode 100644
index 0000000000..fff5918d0c
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/mips/board.h
@@ -0,0 +1,110 @@
+#ifndef __CYGMON_MIPS_BOARD_H__
+#define __CYGMON_MIPS_BOARD_H__
+//==========================================================================
+//
+// board.h
+//
+// Cygmon board/platform configuration file
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-07-11
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+// Hardware/platform/configuration specifics
+
+// These defines are only necessary for using target_reg union in monitor.h
+// It should be possible to remove that once the HAL integration is complete.
+#define HAVE_FLOAT_REGS 0
+#define HAVE_DOUBLE_REGS 0
+
+#define HAVE_CACHE 0
+#define HAVE_USAGE 0
+#define USE_CYGMON_PROTOTYPES 1
+#define NOMAIN 1
+#define CYGMON_SYSTEM_SERVICES 0 // Not used, fall back to BSP/HAL support
+
+#ifdef CYGDAT_CYGMON_USE_HELP
+#define USE_HELP 1
+#endif
+
+#define USE_ECOS_HAL_EXCEPTIONS
+#define USE_ECOS_HAL_BREAKPOINTS
+#define USE_ECOS_HAL_SINGLESTEP
+
+#include "cpu_info.h"
+extern void bp_print (target_register_t bp_val);
+extern int __set_breakpoint (target_register_t addr);
+extern int __remove_breakpoint (target_register_t addr);
+extern void __install_breakpoint_list (void);
+extern void __clear_breakpoint_list (void);
+extern int __display_breakpoint_list (void (*print_func)(target_register_t));
+
+#define bsp_skip_instruction(regs) __skipinst()
+#define install_breakpoints() __install_breakpoints()
+#define add_mon_breakpoint(bpt) __set_breakpoint((bpt).addr)
+#define clear_mon_breakpoint(bpt) __remove_breakpoint((bpt).addr)
+#define show_breakpoints() __display_breakpoint_list(bp_print)
+#define clear_breakpoints() __clear_breakpoint_list()
+
+#define bsp_get_signal(exc_nr, regs) __computeSignal(exc_nr)
+#define bsp_get_pc(regs) get_register(PC)
+
+#define CYGARC_HAL_COMMON_EXPORT_CPU_MACROS
+#include <cyg/hal/mips-regs.h>
+#include "monitor.h"
+
+#ifdef __mips64
+#define bsp_set_pc(pc, regs) \
+ put_register(PC, pc); \
+ if (regs->_sr & SR_ERL) \
+ put_register(EPC, pc); \
+ else \
+ put_register(EEPC, pc);
+#else
+#define bsp_set_pc(pc, regs) \
+ put_register(PC, pc);
+#endif
+
+#endif // __CYGMON_MIPS_BOARD_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/mips/cpu.h b/cesar/ecos/packages/cygmon/current/misc/mips/cpu.h
new file mode 100644
index 0000000000..e746a2ace2
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/mips/cpu.h
@@ -0,0 +1,59 @@
+#ifndef __MIPS_CPU_H__
+#define __MIPS_CPU_H__
+//==========================================================================
+//
+// cpu.h
+//
+// MIPS specific processor defines
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-06-07
+// Purpose: MIPS specific processor defines
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <cyg/hal/hal_intr.h>
+
+#define BSP_MAX_EXCEPTIONS CYGNUM_HAL_VSR_COUNT
+
+#endif // __MIPS_CPU_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/mips/cpu_info.h b/cesar/ecos/packages/cygmon/current/misc/mips/cpu_info.h
new file mode 100644
index 0000000000..adf6d705d8
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/mips/cpu_info.h
@@ -0,0 +1,90 @@
+#ifndef __MIPS_CPU_INFO_H__
+#define __MIPS_CPU_INFO_H__
+//==========================================================================
+//
+// cpu_info.h
+//
+// Architecture information for MIPS processors
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-06-07
+// Purpose:
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#define IS_MIPS 1
+
+/* Temporary as long a multiple protypes are copied in multiple files */
+/* This variation does NOT clone the prototypes */
+#define NO_MALLOC 1
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+
+/* big enuf to store a trap in the BP structure */
+
+#define BP_INST_T_DEFINED 1
+typedef unsigned int bp_inst_t ;
+
+#else /* USE_ECOS_HAL_BREAKPOINTS */
+
+#define MEM_ADDR_DEFINED 1
+typedef struct mem_addr {
+ unsigned long addr;
+} mem_addr_t ;
+
+#endif /* USE_ECOS_HAL_BREAKPOINTS */
+
+typedef unsigned long target_register_t;
+
+#include <cyg/infra/cyg_type.h>
+#include <cyg/hal/basetype.h>
+#if CYG_BYTEORDER == CYG_MSBFIRST
+#define PRINT_INSN print_insn_big_mips
+#else
+#define PRINT_INSN print_insn_little_mips
+#endif
+
+#undef BFD_MACH
+#define BFD_MACH 0
+
+#endif // __MIPS_CPU_INFO_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/mips/mips-mon.c b/cesar/ecos/packages/cygmon/current/misc/mips/mips-mon.c
new file mode 100644
index 0000000000..ab6067caa2
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/mips/mips-mon.c
@@ -0,0 +1,183 @@
+//==========================================================================
+//
+// mips-mon.c
+//
+// Support code to extend the generic monitor code to support
+// MIPS processors.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-06-07
+// Purpose: Support code to extend the generic monitor code to support
+// MIPS(R) processors.
+// Description: Further board specific support is in other files.
+// This file contains:
+// register names lookup table
+//
+// Empty Stubs:
+// Interval timer - This should really belong to the application
+// operating system.
+//
+// Should not contain:
+// low level uart getchar and putchar functions
+// delay function to support uart
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include "monitor.h"
+
+struct regstruct regtab[] =
+{
+ { "zero", REG_ZERO },
+ { "at", REG_AT },
+ { "v0", REG_V0 },
+ { "v1", REG_V1 },
+ { "a0", REG_A0 },
+ { "a1", REG_A1 },
+ { "a2", REG_A2 },
+ { "a3", REG_A3 },
+ { "t0", REG_T0 },
+ { "t1", REG_T1 },
+ { "t2", REG_T2 },
+ { "t3", REG_T3 },
+ { "t4", REG_T4 },
+ { "t5", REG_T5 },
+ { "t6", REG_T6 },
+ { "t7", REG_T7 },
+ { "s0", REG_S0 },
+ { "s1", REG_S1 },
+ { "s2", REG_S2 },
+ { "s3", REG_S3 },
+ { "s4", REG_S4 },
+ { "s5", REG_S5 },
+ { "s6", REG_S6 },
+ { "s7", REG_S7 },
+ { "t8", REG_T8 },
+ { "t9", REG_T9 },
+ { "k0", REG_K0 },
+ { "k1", REG_K1 },
+ { "gp", REG_GP },
+ { "sp", REG_SP },
+ { "s8", REG_S8 },
+ { "ra", REG_RA },
+
+ { "sr", REG_SR },
+ { "lo", REG_LO },
+ { "hi", REG_HI },
+ { "badvr", REG_BAD },
+ { "cause", REG_CAUSE },
+ { "pc", REG_PC },
+#ifdef CYGHWR_HAL_MIPS_FPU
+ { "f0", REG_F0 },
+ { "f1", REG_F1 },
+ { "f2", REG_F2 },
+ { "f3", REG_F3 },
+ { "f4", REG_F4 },
+ { "f5", REG_F5 },
+ { "f6", REG_F6 },
+ { "f7", REG_F7 },
+ { "f8", REG_F8 },
+ { "f9", REG_F9 },
+ { "f10", REG_F10 },
+ { "f11", REG_F11 },
+ { "f12", REG_F12 },
+ { "f13", REG_F13 },
+ { "f14", REG_F14 },
+ { "f15", REG_F15 },
+ { "f16", REG_F16 },
+ { "f17", REG_F17 },
+ { "f18", REG_F18 },
+ { "f19", REG_F19 },
+ { "f20", REG_F20 },
+ { "f21", REG_F21 },
+ { "f22", REG_F22 },
+ { "f23", REG_F23 },
+ { "f24", REG_F24 },
+ { "f25", REG_F25 },
+ { "f26", REG_F26 },
+ { "f27", REG_F27 },
+ { "f28", REG_F28 },
+ { "f29", REG_F29 },
+ { "f30", REG_F30 },
+ { "f31", REG_F31 },
+ { "fcr31", REG_FCR31 },
+#endif /* CYGHWR_HAL_MIPS_FPU */
+ { 0, 0 }, /* Terminating element must be last */
+} ;
+
+void
+initialize_mon(void)
+{
+} /* initialize_mon */
+
+
+#include <cyg/hal/hal_arch.h>
+#include <bsp/common/bsp_if.h>
+int
+machine_syscall(HAL_SavedRegisters *regs)
+{
+ int res, err;
+ target_register_t a0, a1, a2, a3;
+
+ a0 = get_register(REG_A0);
+ a1 = get_register(REG_A1);
+ a2 = get_register(REG_A2);
+ a3 = get_register(REG_A3);
+
+ err = _bsp_do_syscall(a0, // Function
+ a1, a2, a3, 0, // arguments,
+ &res);
+ if (err)
+ {
+ // This was a syscall. It has now been handled, so update the registers appropriately
+ put_register(REG_V0, res);
+ bsp_skip_instruction(regs);
+ }
+
+ return err;
+}
+
+
+// Utility function for printing breakpoints
+void bp_print(target_register_t bp_val)
+{
+ bsp_printf("0x%08lx\n", (unsigned long)bp_val);
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/mn10300/board.h b/cesar/ecos/packages/cygmon/current/misc/mn10300/board.h
new file mode 100644
index 0000000000..19b6ba1221
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/mn10300/board.h
@@ -0,0 +1,103 @@
+#ifndef __CYGMON_MN10300_BOARD_H__
+#define __CYGMON_MN10300_BOARD_H__
+//==========================================================================
+//
+// board.h
+//
+// Cygmon board/platform configuration file
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+// Hardware/platform/configuration specifics
+
+// These defines are only necessary for using target_reg union in monitor.h
+// It should be possible to remove that once the HAL integration is complete.
+#if CYGHWR_HAL_MN10300_AM33_REVISION == 2
+#define HAVE_FLOAT_REGS 1
+#else
+#define HAVE_FLOAT_REGS 0
+#endif
+#define HAVE_DOUBLE_REGS 0
+
+#define HAVE_CACHE 0
+#define HAVE_USAGE 0
+#define USE_CYGMON_PROTOTYPES 1
+#define NOMAIN 1
+#define CYGMON_SYSTEM_SERVICES 0 // Not used, fall back to BSP/HAL support
+
+#ifdef CYGDAT_CYGMON_USE_HELP
+#define USE_HELP 1
+#endif
+
+#define USE_ECOS_HAL_EXCEPTIONS
+#define USE_ECOS_HAL_BREAKPOINTS
+#define USE_ECOS_HAL_SINGLESTEP
+#define USE_ECOS_HAL_SAFE_MEMORY
+extern int __read_mem_safe (void *dst, void *src, int count);
+extern int __write_mem_safe (void *src, void *dst, int count);
+
+
+#include "cpu_info.h"
+extern void bp_print (target_register_t bp_val);
+extern int __set_breakpoint (target_register_t addr);
+extern int __remove_breakpoint (target_register_t addr);
+extern void __install_breakpoint_list (void);
+extern void __clear_breakpoint_list (void);
+extern int __display_breakpoint_list (void (*print_func)(target_register_t));
+
+#define bsp_skip_instruction(regs) __skipinst()
+#define install_breakpoints() __install_breakpoints()
+#define add_mon_breakpoint(bpt) __set_breakpoint((bpt).addr)
+#define clear_mon_breakpoint(bpt) __remove_breakpoint((bpt).addr)
+#define show_breakpoints() __display_breakpoint_list(bp_print)
+#define clear_breakpoints() __clear_breakpoint_list()
+
+#define bsp_get_signal(exc_nr, regs) __computeSignal(exc_nr)
+#define bsp_get_pc(regs) get_register(PC)
+#define bsp_set_pc(pc, regs) put_register(PC, pc);
+
+#endif // __CYGMON_MN10300_BOARD_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/mn10300/cpu.h b/cesar/ecos/packages/cygmon/current/misc/mn10300/cpu.h
new file mode 100644
index 0000000000..ae8a50d8d7
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/mn10300/cpu.h
@@ -0,0 +1,61 @@
+#ifndef __MN10300_CPU_H__
+#define __MN10300_CPU_H__
+//==========================================================================
+//
+// cpu.h
+//
+// MN10300 specific processor defines
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose: MN10300 specific processor defines
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <cyg/hal/hal_intr.h>
+
+#define BSP_MAX_EXCEPTIONS CYGNUM_HAL_VSR_COUNT
+
+#define REG_PC PC
+
+#endif // __MN10300_CPU_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/mn10300/cpu_info.h b/cesar/ecos/packages/cygmon/current/misc/mn10300/cpu_info.h
new file mode 100644
index 0000000000..000c8af39c
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/mn10300/cpu_info.h
@@ -0,0 +1,91 @@
+#ifndef __MN10300_CPU_INFO_H__
+#define __MN10300_CPU_INFO_H__
+//==========================================================================
+//
+// cpu_info.h
+//
+// Architecture information for MN10300 processors
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose:
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#define IS_MN10300 1
+
+/* Temporary as long a multiple protypes are copied in multiple files */
+/* This variation does NOT clone the prototypes */
+#define NO_MALLOC 1
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+
+/* big enuf to store a trap in the BP structure */
+
+#define BP_INST_T_DEFINED 1
+typedef unsigned char bp_inst_t ;
+
+#else /* USE_ECOS_HAL_BREAKPOINTS */
+
+#define MEM_ADDR_DEFINED 1
+typedef struct mem_addr {
+ unsigned long addr;
+} mem_addr_t ;
+
+#endif /* USE_ECOS_HAL_BREAKPOINTS */
+
+typedef unsigned long target_register_t;
+
+#include <cyg/infra/cyg_type.h>
+#include <cyg/hal/basetype.h>
+#define PRINT_INSN print_insn_mn10300
+
+#undef BFD_MACH
+#define BFD_MACH 0
+
+// Ensure that the reg_valid field in regstruct is used.
+#define REG_VALID_FIELD_IN_REGSTRUCT
+#define INITIALIZE_MON_EACH_TIME() initialize_mon_each_time()
+extern void initialize_mon_each_time(void);
+
+#endif // __MN10300_CPU_INFO_H__
diff --git a/cesar/ecos/packages/cygmon/current/misc/mn10300/mn10300-mon.c b/cesar/ecos/packages/cygmon/current/misc/mn10300/mn10300-mon.c
new file mode 100644
index 0000000000..205c7f6542
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/mn10300/mn10300-mon.c
@@ -0,0 +1,206 @@
+//==========================================================================
+//
+// mn10300-mon.c
+//
+// Support code to extend the generic monitor code to support
+// MN10300 processors.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): dmoseley
+// Contributors: dmoseley
+// Date: 2000-08-11
+// Purpose: Support code to extend the generic monitor code to support
+// MN10300 processors.
+// Description: Further board specific support is in other files.
+// This file contains:
+// register names lookup table
+//
+// Empty Stubs:
+// Interval timer - This should really belong to the application
+// operating system.
+//
+// Should not contain:
+// low level uart getchar and putchar functions
+// delay function to support uart
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include "monitor.h"
+
+struct regstruct regtab[] =
+{
+ {"d0", D0, 1},
+ {"d1", D1, 1},
+ {"d2", D2, 1},
+ {"d3", D3, 1},
+ {"a0", A0, 1},
+ {"a1", A1, 1},
+ {"a2", A2, 1},
+ {"a3", A3, 1},
+ {"sp", SP, 1},
+ {"pc", PC, 1},
+ {"mdr", MDR, 1},
+ {"psw", PSW, 1},
+ {"lir", LIR, 1},
+ {"lar", LAR, 1},
+#ifdef CYGPKG_HAL_MN10300_AM33
+ {"r0", R0, 1},
+ {"r1", R1, 1},
+ {"r2", R2, 1},
+ {"r3", R3, 1},
+ {"r4", R4, 1},
+ {"r5", R5, 1},
+ {"r6", R6, 1},
+ {"r7", R7, 1},
+ {"ssp", SSP, 1},
+ {"msp", MSP, 1},
+ {"usp", USP, 1},
+ {"mcrh", MCRH, 1},
+ {"mcrl", MCRL, 1},
+ {"mcvf", MCVF, 1},
+ {"mdrq", MDRQ, 1},
+#if CYGHWR_HAL_MN10300_AM33_REVISION == 2
+ {"fpcr", FPCR, 1},
+ {"fs0", FS0, 1},
+ {"fs1", FS1, 1},
+ {"fs2", FS2, 1},
+ {"fs3", FS3, 1},
+ {"fs4", FS4, 1},
+ {"fs5", FS5, 1},
+ {"fs6", FS6, 1},
+ {"fs7", FS7, 1},
+ {"fs8", FS8, 1},
+ {"fs9", FS9, 1},
+ {"fs10", FS10, 1},
+ {"fs11", FS11, 1},
+ {"fs12", FS12, 1},
+ {"fs13", FS13, 1},
+ {"fs14", FS14, 1},
+ {"fs15", FS15, 1},
+ {"fs16", FS16, 1},
+ {"fs17", FS17, 1},
+ {"fs18", FS18, 1},
+ {"fs19", FS19, 1},
+ {"fs20", FS20, 1},
+ {"fs21", FS21, 1},
+ {"fs22", FS22, 1},
+ {"fs23", FS23, 1},
+ {"fs24", FS24, 1},
+ {"fs25", FS25, 1},
+ {"fs26", FS26, 1},
+ {"fs27", FS27, 1},
+ {"fs28", FS28, 1},
+ {"fs29", FS29, 1},
+ {"fs30", FS30, 1},
+ {"fs31", FS31, 1},
+#endif
+#endif
+ { 0, 0, 1}, /* Terminating element must be last */
+} ;
+
+void
+initialize_mon(void)
+{
+} /* initialize_mon */
+
+#if CYGHWR_HAL_MN10300_AM33_REVISION == 2
+extern int fpu_regs_read;
+#endif
+
+#ifdef CYGPKG_HAL_MN10300_AM33
+extern int msp_read;
+#endif
+
+void
+initialize_mon_each_time(void)
+{
+ int i;
+#if CYGHWR_HAL_MN10300_AM33_REVISION == 2
+ // Make sure the regtab[] indicates the valid status of the FPU registers
+ for (i = 0; regtab[i].registername != NULL; i++)
+ {
+ if ((regtab[i].registernumber >= FP_START) && (regtab[i].registernumber <= FP_END))
+ regtab[i].registervalid = fpu_regs_read;
+ }
+#endif
+
+#ifdef CYGPKG_HAL_MN10300_AM33
+ // Make sure the regtab[] indicates the valid status of the MSP
+ for (i = 0; regtab[i].registername != NULL; i++)
+ {
+ if (regtab[i].registernumber == MSP)
+ regtab[i].registervalid = msp_read;
+ }
+#endif
+} /* initialize_mon_each_time */
+
+
+#include <cyg/hal/hal_arch.h>
+#include <bsp/common/bsp_if.h>
+int
+machine_syscall(HAL_SavedRegisters *regs)
+{
+ int res, err;
+ target_register_t d0, d1, d2, d3;
+
+ d0 = get_register(D0);
+ d1 = get_register(D1);
+ d2 = get_register(D2);
+ d3 = get_register(D3);
+
+ err = _bsp_do_syscall(d0, // Function
+ d1, d2, d3, 0, // arguments,
+ &res);
+ if (err)
+ {
+ // This was a syscall. It has now been handled, so update the registers appropriately
+ put_register(D0, res);
+ bsp_skip_instruction(regs);
+ }
+
+ return err;
+}
+
+
+// Utility function for printing breakpoints
+void bp_print(target_register_t bp_val)
+{
+ bsp_printf("0x%08lx\n", (unsigned long)bp_val);
+}
diff --git a/cesar/ecos/packages/cygmon/current/misc/monitor.c b/cesar/ecos/packages/cygmon/current/misc/monitor.c
new file mode 100644
index 0000000000..06c04ae93a
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/monitor.c
@@ -0,0 +1,494 @@
+//==========================================================================
+//
+// monitor.c
+//
+// Monitor shell and main routines for CygMON the Wonder Monitor
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-20
+// Purpose: Monitor shell and main routines for CygMON the Wonder Monitor
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+/* Platform-independent code for cygmon */
+
+#include <stdlib.h>
+#include <unistd.h>
+#ifdef HAVE_BSP
+#include <bsp/bsp.h>
+#include <bsp/cpu.h>
+#include <bsp/hex-utils.h>
+#endif
+#include <monitor.h>
+#ifdef HAVE_BSP
+#include "cpu_info.h"
+#endif
+#include <ledit.h>
+#include <signal.h>
+#include <string.h>
+#include <ctype.h>
+
+#if USE_CYGMON_PROTOTYPES
+/* Use common prototypes */
+/* Some of the composed board.h files compose these
+ prototypes redundently, but if they dont,
+ these are the common definitions */
+#include "fmt_util.h" /* Interface to string formatting utilities */
+#include "tservice.h" /* Interface to target specific services */
+#include "generic-stub.h" /* from libstub */
+#endif /* USE_CYGMON_PROTOTYPES */
+
+static int cygmon_handle_exception (int sigval);
+static void monitor_take_control (void);
+
+#if CYGMON_SYSTEM_SERVICES
+extern int process_syscall (int syscall_num);
+#elif defined (USE_ECOS_HAL_EXCEPTIONS)
+static int cygmon_process_syscall (int sigval);
+#endif
+
+int stub_is_active = 0;
+mem_addr_t last_pc;
+
+#ifdef HAVE_BSP
+
+#if !defined(USE_ECOS_HAL_EXCEPTIONS)
+static int mon_dbg_handler(int exc_nr, void *regs);
+static int mon_kill_handler(int exc_nr, void *regs);
+#endif // USE_ECOS_HAL_EXCEPTIONS
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+#define __is_breakpoint_function() (get_pc() == (target_register_t)bsp_breakinsn)
+#endif
+
+#ifdef __ECOS__
+/*
+ * This global flag is used by generic-stub.c to communicate to us that we
+ * are processing the breakpoint function within Cygmon itself.
+ */
+extern int processing_breakpoint_function;
+#endif
+
+/* Global pointer to current set of saved registers. */
+void *mon_saved_regs;
+
+/* Original BSP debug vector replaced by monitor. */
+#if !defined(USE_ECOS_HAL_EXCEPTIONS)
+static bsp_handler_t old_dbg_vec;
+#endif // !defined(USE_ECOS_HAL_EXCEPTIONS)
+
+#else
+static int handle_signal (int signal_val);
+
+__PFI user_signal_handler = NULL;
+#endif
+
+#if defined(__ECOS__)
+#include <cyg/hal/hal_stub.h>
+#endif
+
+#if defined(__ECOS__) && !defined(PROCESS_EXCEPTION_VEC_PROTOTYPE_EXISTS)
+#define PROCESS_EXCEPTION_VEC_PROTOTYPE_EXISTS
+extern volatile __PFI (*__process_exception_vec)(int);
+#endif
+
+
+#ifdef MONITOR_CONTROL_INTERRUPTS
+/* This is set if the user wants interrupts enabled in the monitor. */
+static int monitor_interrupts_enabled;
+#endif
+
+
+#if NOMAIN
+int monitor_main (int argc, char **argv) /* Suppress default main() junk */
+#else
+int main (int argc, char **argv)
+#endif
+{
+#ifdef HAVE_BSP
+ int cur_port;
+ struct bsp_comm_info comm_info;
+#else
+ /* Set up exception handling traps */
+ initialize_stub ();
+#endif
+
+ initialize_mon ();
+
+#ifdef HAVE_BSP
+ /* get info on debug channel */
+ cur_port = bsp_set_debug_comm(-1);
+ bsp_sysinfo(BSP_INFO_COMM, cur_port, &comm_info);
+
+ /*
+ * If we're using a network interface, don't install
+ * the cygmon vectors. Currently, we only support stub
+ * mode over a network connection.
+ */
+ if (comm_info.kind != BSP_COMM_ENET)
+ {
+ xprintf("\n");
+ version ();
+
+ /* replace original BSP debug and kill handler with ours */
+#if !defined(USE_ECOS_HAL_EXCEPTIONS)
+ old_dbg_vec = bsp_install_dbg_handler(mon_dbg_handler);
+ (void)bsp_install_kill_handler(mon_kill_handler);
+#else
+ /* replace original BSP debug and kill handler with ours using eCos stuff */
+ __process_exception_vec = (__PFI)cygmon_handle_exception;
+ __process_syscall_vec = cygmon_process_syscall;
+ __process_exit_vec = monitor_take_control;
+#endif // __ECOS__
+ }
+ else
+ {
+ /* This forces the console to use the gdb channel. */
+ bsp_set_console_comm(cur_port);
+ }
+#else
+ xprintf("\n");
+ version ();
+
+ __process_exception_vec = cygmon_handle_exception;
+ __process_exit_vec = monitor_take_control;
+#if CYGMON_SYSTEM_SERVICES
+ __process_syscall_vec = process_syscall;
+#endif
+ __process_signal_vec = handle_signal;
+ __init_vec = install_breakpoints;
+ __cleanup_vec = clear_breakpoints;
+#endif
+
+#if 0
+#ifdef __ECOS__
+ __process_exception_vec = cygmon_handle_exception;
+#endif
+#endif
+
+ while (1)
+ {
+ breakpoint ();
+ if (switch_to_stub_flag)
+ {
+ xprintf("Switching to stub\n");
+ switch_to_stub_flag = 0;
+ }
+ }
+
+ /* never reached */
+ exit (0);
+}
+
+
+/* Transfer control to gdb stub */
+
+int
+transfer_to_stub ()
+{
+ /* Return back to the exception handler, but the exception handler
+ should invoke the stub's exception handler instead of ours. */
+#if defined(HAVE_BSP) && !defined(USE_ECOS_HAL_EXCEPTIONS)
+ (void)bsp_install_dbg_handler(old_dbg_vec);
+#else
+ __switch_to_stub ();
+#endif
+
+ /* The stub is now active. */
+ stub_is_active = 1;
+ return -1;
+}
+
+void
+clear_user_state (void)
+{
+#ifdef HAS_TIMER
+ if (__timer_enabled ())
+ __settimer (0, 0);
+#endif
+
+ clear_breakpoints ();
+
+#ifndef HAVE_BSP
+ user_signal_handler = NULL;
+#endif
+
+ __clear_single_step ();
+}
+
+static void
+monitor_take_control (void)
+{
+ stub_is_active = 0;
+ switch_to_stub_flag = 0;
+
+ // Flush the unget state. This is because the ecos stub and Cygmon track this
+ // stuff separately.
+ bsp_debug_ungetc('\0');
+
+#ifdef INITIALIZE_MON_EACH_TIME
+ // Call the per-stop initialization routine if it is defined.
+ INITIALIZE_MON_EACH_TIME();
+#endif
+
+#if defined(HAVE_BSP) && !defined(USE_ECOS_HAL_EXCEPTIONS)
+ /* replace original BSP debug trap handler with ours */
+ (void)bsp_install_dbg_handler(mon_dbg_handler);
+#else
+ clear_user_state ();
+ __process_exception_vec = cygmon_handle_exception;
+#endif
+}
+
+
+#ifdef MONITOR_CONTROL_INTERRUPTS
+void
+monitor_enable_interrupts (void)
+{
+ monitor_interrupts_enabled = 1;
+ enable_interrupts ();
+}
+
+void
+monitor_disable_interrupts (void)
+{
+ monitor_interrupts_enabled = 0;
+ disable_interrupts ();
+}
+
+int
+monitor_interrupt_state (void)
+{
+ return monitor_interrupts_enabled;
+}
+#endif
+
+#if defined(USE_ECOS_HAL_EXCEPTIONS)
+externC HAL_SavedRegisters *_hal_registers;
+extern int machine_syscall(HAL_SavedRegisters *regs);
+static int
+cygmon_process_syscall (int sigval)
+{
+ return machine_syscall(_hal_registers);
+}
+#endif
+
+static int
+cygmon_handle_exception (int sigval)
+{
+ target_register_t pc;
+
+#ifdef MONITOR_CONTROL_INTERRUPTS
+ if (monitor_interrupts_enabled)
+ {
+ if (! __in_interrupt)
+ enable_interrupts ();
+ }
+#endif
+
+#ifdef TARGET_EXCEPTION_CODE
+ TARGET_EXCEPTION_CODE
+#endif
+
+#ifndef HAVE_BSP
+ if (sigval != SIGKILL)
+ if (handle_signal (sigval) == 0)
+ return 0;
+#endif
+
+ clear_user_state ();
+
+ /* We may want to tweak the PC to point at the faulting instruction,
+ for example. (breakpoints on x86). */
+#ifdef TARGET_ADJUST_PC
+ TARGET_ADJUST_PC
+#endif
+
+ pc = get_pc();
+ MAKE_STD_ADDR (pc, &last_pc);
+
+#ifdef __ECOS__
+ if ((sigval == SIGTRAP) && (__is_breakpoint_function() || processing_breakpoint_function))
+#else
+ if ((sigval == SIGTRAP) && __is_breakpoint_function())
+#endif
+ {
+ /*
+ * This is the initial breakpoint inserted by the BSP
+ * Don't print anything for this as it is confusing
+ */
+ }
+ else
+ {
+ if (sigval == SIGTRAP)
+ xprintf ("Hit breakpoint");
+ else
+ xprintf ("Got signal %d", sigval);
+
+ xprintf (" at 0x%s\n", int2str (pc, 16, sizeof (target_register_t) * 2));
+
+#ifdef DISASSEMBLER
+ if (!__is_breakpoint_function ())
+ {
+ do_dis (&last_pc);
+ flush_dis ();
+ }
+#endif
+ }
+
+ monitor_take_control ();
+
+ return monitor_loop ();
+}
+
+#ifndef HAVE_BSP
+/* Returns 0 if the program should restart at the point at which the
+ signal was received, -1 otherwise. */
+static int
+handle_signal (int signal)
+{
+ if (signal == SIGKILL)
+ return -1;
+
+ if (user_signal_handler != NULL)
+ {
+ int result = user_signal_handler (signal);
+ switch (result)
+ {
+ /* Don't ignore potential hardware signals. */
+ case 3:
+ if (signal == SIGSEGV || signal == SIGBUS || signal == SIGFPE
+ || signal == SIGTRAP || signal == SIGILL)
+ return -1;
+
+ case 0:
+ return 0;
+
+ default:
+ case 1:
+ case 2:
+ return -1;
+ }
+ }
+ return -1;
+}
+#endif
+
+
+void
+version (void)
+{
+#ifdef HAVE_BSP
+ struct bsp_platform_info platform;
+ struct bsp_mem_info mem;
+ int i;
+ unsigned long u, totmem, topmem;
+#endif
+ extern char *build_date;
+
+ xprintf ("Cygmon, the Cygnus ROM monitor.\n");
+ xprintf ("Copyright(c) 1997, 1998, 1999, 2000 Red Hat\n\n");
+ xprintf ("Version: %s\nThis image was built on %s\n\n",
+ VERSION, build_date);
+
+#ifdef HAVE_BSP
+ bsp_sysinfo(BSP_INFO_PLATFORM, &platform);
+
+ totmem = topmem = 0;
+ i = 0;
+ while (bsp_sysinfo(BSP_INFO_MEMORY, i++, &mem) == 0)
+ {
+ if (mem.kind == BSP_MEM_RAM)
+ {
+ totmem += mem.nbytes;
+ u = (unsigned long)mem.virt_start + mem.nbytes;
+ if (u > topmem)
+ topmem = u;
+ }
+ }
+
+ xprintf("CPU: %s\n", platform.cpu);
+ xprintf("Board: %s\n", platform.board);
+ if (*(platform.extra))
+ xprintf("%s\n", platform.extra);
+ xprintf("Total RAM: %d bytes\n", totmem);
+ xprintf("Top of RAM: 0x%x\n", topmem);
+#endif
+}
+
+
+#ifdef HAVE_BSP
+#if !defined(USE_ECOS_HAL_EXCEPTIONS)
+static int
+mon_kill_handler(int exc_nr, void *regs)
+{
+ monitor_take_control();
+ return 1;
+}
+#endif // !defined(USE_ECOS_HAL_EXCEPTIONS)
+
+#if !defined(USE_ECOS_HAL_EXCEPTIONS)
+static int
+mon_dbg_handler(int exc_nr, void *regs)
+{
+ int sig;
+ unsigned long cur_pc;
+
+ mon_saved_regs = regs;
+ sig = bsp_get_signal(exc_nr, regs);
+
+ cygmon_handle_exception(sig);
+
+ cur_pc = bsp_get_pc(regs);
+ if (cur_pc == (unsigned long)bsp_breakinsn)
+ bsp_skip_instruction(regs);
+
+ if (!stub_is_active)
+ install_breakpoints();
+
+ return 1;
+}
+#endif // !defined(USE_ECOS_HAL_EXCEPTIONS)
+
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/monitor.h b/cesar/ecos/packages/cygmon/current/misc/monitor.h
new file mode 100644
index 0000000000..fe1a6192a5
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/monitor.h
@@ -0,0 +1,303 @@
+//==========================================================================
+//
+// monitor.h
+//
+// Main definitions for the CygMON ROM monitor
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-20
+// Purpose: Main definitions for the CygMON ROM monitor
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#ifndef MONITOR_H
+#define MONITOR_H
+
+#if !defined(__ASSEMBLER__)
+#include <stdarg.h>
+#endif
+
+#include <board.h>
+#ifdef HAVE_BSP
+#include "cpu_info.h"
+#endif
+#include <monitor_cmd.h>
+
+#ifdef __ECOS__
+#include <cyg/hal/plf_stub.h>
+#endif
+
+#ifndef ASM
+
+#ifdef HAVE_BSP
+#define xprintf bsp_dprintf
+#define xsprintf bsp_sprintf
+#define xvprintf bsp_dvprintf
+#define xputchar bsp_debug_putc
+#define xgetchar bsp_debug_getc
+#define xungetchar bsp_debug_ungetc
+#define __getTty() bsp_set_debug_comm(-1)
+#define set_pc(x) bsp_set_pc((x), mon_saved_regs)
+
+#ifndef USE_ECOS_HAL_SINGLESTEP
+#define __single_step() bsp_singlestep_setup(mon_saved_regs)
+#define __clear_single_step() bsp_singlestep_cleanup(mon_saved_regs)
+#endif /* USE_ECOS_HAL_SINGLESTEP */
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+#define breakpoint() bsp_breakpoint()
+#endif /* USE_ECOS_HAL_BREAKPOINTS */
+
+#if defined(__ECOS__) && defined(CYGHWR_HAL_RESET_DEFINED)
+ extern void __reset(void);
+#else // defined(__ECOS__) && defined(CYGHWR_HAL_RESET_DEFINED)
+# define __reset bsp_reset
+#endif // defined(__ECOS__) && defined(CYGHWR_HAL_RESET_DEFINED)
+
+#else
+extern void xprintf(const char *fmt, ...);
+extern void xsprintf(char *str, const char *fmt, ...);
+extern void xvprintf(const char *fmt, va_list ap);
+
+#ifdef HAS_USER_IO
+#define xputchar putUserChar
+#define xgetchar getUserChar
+#else
+extern void putDebugChar(int ch);
+extern int getDebugChar(void);
+#define xputchar putDebugChar
+#define xgetchar getDebugChar
+#endif
+#define xungetchar ungetDebugChar
+#endif
+
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+struct bp {
+ mem_addr_t address;
+ bp_inst_t old_inst;
+ char in_memory;
+ struct bp *next;
+};
+#endif // USE_ECOS_HAL_BREAKPOINTS
+
+struct regstruct
+{
+ char *registername;
+ int registernumber;
+#ifdef HAVE_BSP
+#if defined(CYGPKG_HAL_ARM) || !defined(__ECOS__)
+ int registertype;
+#endif // defined(CYGPKG_HAL_ARM) || !defined(__ECOS__)
+#endif
+#ifdef REG_VALID_FIELD_IN_REGSTRUCT
+ int registervalid;
+#endif
+};
+
+
+
+#ifdef HAVE_BSP
+#define REGTYPE_INT 1
+#define REGTYPE_FLOAT 2
+#define REGTYPE_DOUBLE 3
+
+union target_reg
+{
+ unsigned long i; /* integer register (32/64 bit) */
+#if HAVE_FLOAT_REGS
+ float f; /* float register (32bit) */
+#endif
+#if HAVE_DOUBLE_REGS
+ double d; /* double register (64bit) */
+#endif
+};
+
+typedef union target_reg target_regval_t;
+
+
+/* This is a template for what should be defined in the board specific
+ header file composed, board.h */
+#if ! defined(MEM_ADDR_DEFINED)
+#define MEM_ADDR_DEFINED 1
+typedef struct mem_addr {
+ unsigned long addr;
+} mem_addr_t;
+#endif
+
+#if !defined(BP_INST_T_DEFINED)
+#define BP_INST_T_DEFINED 1
+typedef unsigned char bp_inst_t ;
+#endif
+
+#if ! defined(MAKE_STD_ADDR)
+#define MAKE_STD_ADDR(SRC, DST) ((DST)->addr = (SRC))
+#endif
+
+
+#if ! defined(ADD_OFFSET)
+#define ADD_OFFSET(SRC,DST,OFFSET) ((DST)->addr = (SRC)->addr + (OFFSET))
+#endif
+
+#if ! defined(ADD_ALIGN)
+#define ADD_ALIGN(SRC,DST,ALIGN) \
+ ((DST)->addr = (SRC)->addr - ((SRC)->addr % (ALIGN)))
+#endif
+
+#if ! defined(MEM_ADDR_EQ_P)
+#define MEM_ADDR_EQ_P(A, B) ((A).addr == (B).addr)
+#endif
+
+#if ! defined(MEM_ADDR_DIFF)
+#define MEM_ADDR_DIFF(A, B) ((A).addr - (B).addr)
+#endif
+
+#if ! defined(MEM_ADDR_ASI)
+#define MEM_ADDR_ASI(A) -1
+#endif
+
+#endif /* HAVE_BSP */
+
+#if defined(NO_MALLOC) && ! defined(MAX_NUM_BP)
+#define MAX_NUM_BP 64
+#endif
+
+extern struct regstruct regtab[];
+
+extern char **argvect;
+
+#ifdef HAVE_BSP
+#define VERSION "release 2.0"
+#else
+#define VERSION "release 1.2"
+#endif
+
+#define MAXLINELEN 80
+#define PROMPT "cygmon> "
+#if ! defined MAX_HIST_ENTS
+#define MAX_HIST_ENTS 10
+#endif
+
+/*
+ * From monitor.c
+ */
+extern mem_addr_t last_pc;
+extern int stub_is_active;
+#ifdef HAVE_BSP
+extern void *mon_saved_regs;
+#else
+extern int (*user_signal_handler)(int);
+#endif
+
+extern void clear_user_state (void);
+extern int transfer_to_stub (void);
+extern void version (void);
+#ifdef MONITOR_CONTROL_INTERRUPTS
+/* Enable interrupts within the monitor. */
+extern void monitor_enable_interrupts (void);
+
+/* Disable interrupts within the monitor. */
+extern void monitor_disable_interrupts (void);
+
+/* Returns 1 if interrupts have been enabled within the monitor, 0
+ otherwise. */
+extern int monitor_interrupt_state (void);
+#endif /* MONITOR_CONTROL_INTERRUPTS */
+
+
+/*
+ * From utils.c
+ */
+extern int switch_to_stub_flag;
+extern int input_char (void);
+extern target_register_t str2int (char *str, int base);
+#if HAVE_DOUBLE_REGS
+extern double str2double (char *str, int base);
+#endif
+extern target_register_t str2intlen (char *str, int base, int len);
+extern int hex2bytes(char *string, char *dest, int maxsize);
+extern char *int2str (target_register_t number, int base, int numdigs);
+#ifndef NO_MALLOC
+extern char *strdup(const char *str);
+#endif
+extern target_register_t get_pc(void);
+extern char *get_register_str (regnames_t which, int detail, int valid);
+extern void store_register (regnames_t which, char *string);
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+/*
+ * From breakpoints.c
+ */
+extern int add_mon_breakpoint (mem_addr_t location);
+extern void install_breakpoints (void);
+extern void clear_breakpoints (void);
+extern int show_breakpoints (void);
+extern int clear_mon_breakpoint (mem_addr_t location);
+#endif /* USE_ECOS_HAL_BREAKPOINTS */
+
+
+/*
+ * From do-dis.c
+ */
+extern mem_addr_t do_dis (mem_addr_t *addr);
+extern void flush_dis (void);
+
+
+/*
+ * From architecture-mon.c
+ */
+#ifdef HAVE_BSP
+extern void initialize_mon(void);
+extern target_register_t get_register(regnames_t reg);
+extern void put_register (regnames_t which, target_register_t value);
+#endif
+
+
+/* Lame. */
+#ifndef ITIMER_REAL
+#define ITIMER_REAL 0
+#endif
+
+#endif /* ASM */
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/monitor_cmd.c b/cesar/ecos/packages/cygmon/current/misc/monitor_cmd.c
new file mode 100644
index 0000000000..0a46fb883e
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/monitor_cmd.c
@@ -0,0 +1,2549 @@
+//==========================================================================
+//
+// monitor_cmd.c
+//
+// Monitor commands for the CygMON ROM monitor
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-20
+// Purpose: Monitor commands for the CygMON ROM monitor
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#ifdef HAVE_BSP
+#include "cpu_info.h"
+#include <bsp/bsp.h>
+#include <bsp/cpu.h>
+#include <bsp/hex-utils.h>
+#ifdef __BOARD_HEADER__
+#include __BOARD_HEADER__
+#endif
+#endif
+#include <board.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <monitor.h>
+#include <ledit.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef HAVE_BSP
+#include "fmt_util.h"
+#include "tservice.h"
+#endif
+
+#ifdef __ECOS__
+#include <cyg/hal/hal_stub.h>
+#endif
+
+#if USE_CYGMON_PROTOTYPES
+/* Use common prototypes */
+/* Some of the composed board.h files compose these
+ prototypes redundently, but if they dont,
+ these are the common definitions */
+#include "fmt_util.h" /* Interface to string formatting utilities */
+#include "tservice.h" /* Interface to target specific services */
+#include "generic-stub.h" /* from libstub */
+#endif /* USE_CYGMON_PROTOTYPES */
+
+static int history_cmd(cmdmode_t mode) ;
+
+#ifndef MAXLINELEN
+#define MAXLINELEN 80
+#endif
+
+#define MAXLINES 23
+
+char inbuf[MAXLINELEN] ;
+static char cmd[MAXLINELEN];
+
+#if ! defined(PROVIDE_CRASH_CMD)
+#define PROVIDE_CRASH_CMD 0
+#endif
+
+#if PROVIDE_CRASH_CMD
+/*
+ * The crash command is used while debugging cygmon itself
+ */
+static int crash_cmd(cmdmode_t mode) ; /* Command to trap into cygmon */
+#endif
+
+struct cmdentry cmdtab[] = {
+ {NULL, "baud", set_serial_speed_cmd},
+ {"b", "break", breakpoint_cmd},
+#if HAVE_CACHE
+ {NULL, "cache", cache_cmd},
+#endif
+ {NULL, "copy", copy_cmd},
+#if PROVIDE_CRASH_CMD
+ {NULL, "crash", crash_cmd},
+#endif
+ {NULL, "crc", checksumcmd},
+ {"d", "disassemble", disassemble_cmd},
+ {NULL, "dump", dump_cmd},
+#if defined(NVRAM_ETH_ADDR)
+ {NULL, "ethaddr", ethaddr_cmd},
+#endif
+ {NULL, "fill", fill_cmd},
+ {NULL, "go", go_cmd},
+ {NULL, "help", help_cmd},
+ {"his","history", history_cmd},
+#ifdef MONITOR_CONTROL_INTERRUPTS
+ {NULL, "interrupt", int_cmd},
+#endif
+#if defined(NVRAM_IP_ADDR)
+ {NULL, "ipaddr", ipaddr_cmd},
+#endif
+ {NULL, "load", load_cmd},
+ {"m", "memory", mem_cmd},
+#ifdef OTHERNAMES_CMD
+ {"o", "othernames", othernames_cmd},
+#endif
+ {NULL, "port", set_serial_port_cmd},
+ {"r", "register", reg_cmd},
+ {NULL, "reset", reset_cmd},
+#ifndef HAVE_BSP
+ {NULL, "setargs", set_program_args_cmd},
+#endif
+ {"si", "step", step_cmd},
+ {NULL, "swapmem", swapmem_cmd},
+#if defined(NVRAM_TCP_PORT)
+ {NULL, "tcpport", tcpport_cmd},
+#endif
+ {NULL, "terminal", set_term_cmd},
+#ifdef HAS_TIMER
+ {NULL, "timer", timer_cmd},
+#endif
+#if !defined(__ECOS__) || defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
+ {NULL, "transfer", transfer_cmd},
+#endif
+ {"u", "unbreak", clear_breakpoint_cmd},
+#if HAVE_USAGE
+ {NULL, "usage", memusage_cmd},
+#endif
+ {NULL, "version", version_cmd},
+ /* Really need to redo the way commands are done--there should be a
+ dynamic list (perhaps in addition to the static one). */
+#ifdef TARGET_COMMANDS
+ TARGET_COMMANDS
+#endif
+
+ {NULL, NULL, NULL}
+};
+
+static int
+alias_compare (char *cmd)
+{
+ int m = 0;
+ int match = -1;
+ int num_matches = 0;
+
+ while (cmdtab[m].cmd != NULL)
+ {
+ if (cmdtab[m].alias != NULL && !strcmp (cmd, cmdtab[m].alias))
+ {
+ match = m;
+ num_matches++;
+ /* We're expecting that aliases will be defined
+ uniquely, but just in case, we let the user know
+ if there is a conflict */
+ if (num_matches > 1)
+ {
+ xprintf ("Alias conflict. Executing last matching alias.\n");
+ }
+ }
+ m++;
+ }
+ return match;
+}
+
+static int
+command_compare (char *cmd)
+{
+ int m = 0;
+ int match = -1;
+ int num_matches = 0;
+ int cmdlen = strlen(cmd) ;
+ while (cmdtab[m].cmd != NULL)
+ {
+ if (!(strncmp (cmd,cmdtab[m].cmd, cmdlen)))
+ {
+ /* we found a match */
+ num_matches++;
+ if (num_matches == 2) /* we found a second match */
+ {
+ xprintf ("Ambiguous command. Possibilities are:\n%s\n%s\n",
+ cmdtab[match].cmd,
+ cmdtab[m].cmd);
+ }
+ else if (num_matches > 2) /* we found another match */
+ {
+ /* Show the new possibility we just found */
+ xprintf ("%s\n", cmdtab[m].cmd);
+ }
+ /* Point the match at the command we just looked at.
+ We have to wait until now so that the first duplicate
+ found can output the earlier match as well */
+ match = m;
+ }
+ m++;
+ }
+ return ((num_matches == 1) ? match : -1);
+}
+
+#ifdef USE_HELP
+void
+usage (char *string)
+{
+ xprintf ("Usage: %s\n", string);
+}
+
+void
+short_help (char *string)
+{
+ xprintf ("%s\n", string);
+}
+
+void
+long_help (char *string)
+{
+ int linecnt = 0;
+ int do_leave = 0;
+
+ for (; *string && !do_leave; string++)
+ {
+ xprintf ("%c", *string);
+ if (*string == '\n')
+ {
+ linecnt++;
+ if (linecnt == MAXLINES)
+ {
+ int i;
+
+ xprintf ("-More-");
+ while ((i = input_char ()) >= 0)
+ {
+ if (i == '\r' || i == '\n')
+ {
+ linecnt--;
+ break;
+ }
+ else if (i == ' ')
+ {
+ linecnt = 0;
+ break;
+ }
+ else if (i == 'q' || i == 'Q')
+ {
+ do_leave = 1;
+ break;
+ }
+ else
+ beep ();
+ }
+ }
+ }
+ }
+ xprintf ("\n");
+}
+
+void
+example (char *example)
+{
+ xprintf ("Example: %s\n", example);
+}
+
+#else
+void
+no_help (void)
+{
+ xprintf ("No help available.\n");
+}
+
+void
+no_help_usage (void)
+{
+ xprintf ("Incorrect usage.\n");
+}
+#endif
+
+int
+help_cmd (cmdmode_t mode)
+{
+ int command_number = -2;
+
+ if (mode == USAGE)
+ {
+ usage ("help [command]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("The help command");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ help_cmd (USAGE);
+ long_help ("\
+The help command without arguments shows a list of all available commands\n\
+with a short description of each one. With a command name as an argument\n\
+it shows usage for the command and a paragraph describing the command.\n\
+Usage is shown as command name followed by names of extensions or arguments.\n\
+Arguments in [brackets] are optional, plain text arguments are required.\n\
+Note that all commands can be invoked by typing enough of the command name\n\
+to uniquely specify the command. Some commands have aliases, which are one\n\
+letter abbreviations for commands which do not have unique first letters.\n\
+Aliases for all commands are shown in the help screen, which displays\n\
+commands in the format:\n\
+command name: (alias, if any) description of command \n");
+ example("\
+help foo \n\
+Shows the help screen for the command foo.");
+ return 0;
+ }
+
+ if (argvect[1] != NULL)
+ {
+ if (argvect[2] == NULL)
+ {
+ command_number = command_compare (argvect[1]);
+ if (command_number < 0)
+ {
+ xprintf ("No such command as %s\n", argvect[1]);
+ }
+ }
+
+ if (command_number < 0)
+ {
+ return help_cmd (USAGE);
+ }
+ else
+ {
+ return cmdtab[command_number].function (LONG_HELP);
+ }
+ }
+ else
+ {
+ int i;
+
+ xprintf ("Available commands are:\n");
+ for (i = 0; cmdtab[i].cmd != NULL; i++)
+ {
+ int x = strlen (cmdtab[i].cmd) + 2;
+
+ xprintf ("%s: ", cmdtab[i].cmd);
+ if (cmdtab[i].alias != NULL)
+ {
+ xprintf("(%s)", cmdtab[i].alias);
+ x += 2 + strlen(cmdtab[i].alias);
+ }
+ for (; x < 20; x++)
+ {
+ xprintf (" ");
+ }
+ cmdtab[i].function (SHORT_HELP);
+ if ((i > 0) && (i % MAXLINES) == 0)
+ {
+ xprintf ("-More-");
+ input_char ();
+ xprintf ("\n");
+ }
+ }
+ }
+ return 0;
+}
+
+#if PROVIDE_CRASH_CMD
+static int crash_cmd(cmdmode_t mode)
+{
+ switch (mode)
+ {
+ case USAGE : usage("crash") ; break ;
+ case SHORT_HELP : short_help("invoke the breakpoint function");
+ break ;
+ case LONG_HELP :
+ long_help("The crash command calls the breakpoint function() which is useful\n\
+only if you are using an additional debugger to debug this software and,\n\
+the general exception handler is hooked to the other debugger\n") ;
+ break ;
+ case INVOCATION :
+ dbg_breakpoint() ;
+ break ;
+ }
+ return 0 ;
+}
+#endif /* provide_crash_command */
+
+
+
+static int history_cmd(cmdmode_t mode)
+{
+ switch (mode)
+ {
+ case USAGE : usage("history") ; break ;
+ case SHORT_HELP : short_help("Print help about line editing features.");
+ break ;
+ case INVOCATION :
+ printHistoryList();
+ break;
+ case LONG_HELP :
+ long_help("Cygmon line editing allows you to repeat previously entered
+commands. The line editing commands are:
+ CR '\\n' Execute the currently displayed command
+ ctl-a move to Beginning of line
+ ctl-e End of line
+ ctl-f Forward char
+ ctl-b Backward char
+ ctl-k Delete to end of line
+ ctl-y yank Character (undelete)
+ ctl-d Delete current character
+ ctl-p edit previous command
+ ctl-u Erase Line
+ ctl-n Edit next command") ;
+ break ;
+ }
+ return 0 ;
+} /* history_cmd */
+
+#ifdef OTHERNAMES_CMD
+/* Switch to using the othernames (ie alternate register names) */
+int
+othernames_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("othernames");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Switch between alternate register names.");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ othernames_cmd (USAGE);
+ long_help ("\
+The othernames command allows you to switch between alternate register
+names for a given target.");
+ example ("\
+othernames\n\
+Switches to the alternate register name set..");
+ return 0;
+ }
+ OTHERNAMES_CMD();
+
+ return 0;
+}
+#endif /* OTHERNAMES_CMD */
+
+
+#if defined(NVRAM_ETH_ADDR)
+int
+ethaddr_cmd (cmdmode_t mode)
+{
+ int i, n;
+ unsigned char addr[6];
+ char *p;
+
+ if (mode == USAGE)
+ {
+ usage ("ethaddr [xx:xx:xx:xx:xx:xx]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("get/set NVRAM backed ethernet address");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ ethaddr_cmd (USAGE);
+ long_help ("\
+The ethaddr command is used to view and modify the non-volatile ethernet\n\
+address. The address is specified by 6 colon-seperated 2 digit hexadecimal\n\
+numbers. If no address is specified, the current address is displayed.\n");
+ example ("ethaddr 00:00:8B:F1:36:01");
+ return 0;
+ }
+
+ if (argvect[1] != NULL)
+ {
+ if (strlen(argvect[1]) != 17 || argvect[2] != NULL)
+ {
+ return ethaddr_cmd (USAGE);
+ }
+
+ for (i = 0, p = argvect[1]; i < 6; i++, p++)
+ {
+ n = __hex(*p++);
+ if (n < 0)
+ return ethaddr_cmd (USAGE);
+ addr[i] = (n << 4);
+ n = __hex(*p++);
+ if (n < 0)
+ return ethaddr_cmd (USAGE);
+ addr[i] |= n;
+
+ if (*p != ':' && !(i == 5 && *p == '\0'))
+ return ethaddr_cmd (USAGE);
+ }
+ for (i = 0; i < 6; i++)
+ NVRAM_ETH_ADDR(i) = addr[i];
+ }
+ else
+ {
+ for (i = 0; i < 5; i++)
+ xprintf("%02x:", NVRAM_ETH_ADDR(i));
+ xprintf("%02x\n", NVRAM_ETH_ADDR(i));
+ }
+
+ return 0;
+}
+#endif /* NVRAM_ETH_ADDR */
+
+
+#if defined(NVRAM_IP_ADDR)
+int
+ipaddr_cmd (cmdmode_t mode)
+{
+ int i, j, n;
+ unsigned char addr[4];
+ char *p;
+
+ if (mode == USAGE)
+ {
+ usage ("ipaddr [n.n.n.n]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("get/set NVRAM backed ip address");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ ipaddr_cmd (USAGE);
+ long_help ("\
+The ipaddr command is used to view and modify the non-volatile internet\n\
+address. The address is specified by 4 dot-seperated 1-3 digit decimal\n\
+numbers. If no address is specified, the current address is displayed.\n");
+ example ("ipaddr 192.161.0.1");
+ return 0;
+ }
+
+ if (argvect[1] != NULL)
+ {
+ if (argvect[2] != NULL)
+ return ipaddr_cmd (USAGE);
+
+ p = argvect[1];
+
+ for (i = 0; i < 3; i++, p++)
+ {
+ for (j = n = 0; j < 3 && isdigit(*p); j++, p++)
+ n = n*10 + (*p - '0');
+ if (j == 0 || *p != '.' || n > 255)
+ return ipaddr_cmd (USAGE);
+ addr[i] = n;
+ }
+ for (j = n = 0; j < 3 && isdigit(*p); j++, p++)
+ n = n*10 + (*p - '0');
+ if (j == 0 || *p != '\0' || n > 255)
+ return ipaddr_cmd (USAGE);
+ addr[i] = n;
+
+ for (i = 0; i < 4; i++)
+ NVRAM_IP_ADDR(i) = addr[i];
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ xprintf("%d.", NVRAM_IP_ADDR(i));
+ xprintf("%d\n", NVRAM_IP_ADDR(i));
+ }
+
+ return 0;
+}
+#endif /* NVRAM_IP_ADDR */
+
+#if defined(NVRAM_TCP_PORT)
+int
+tcpport_cmd (cmdmode_t mode)
+{
+ int n;
+ char *p;
+
+ if (mode == USAGE)
+ {
+ usage ("ethaddr [xx:xx:xx:xx:xx:xx]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("get/set NVRAM backed tcp port number");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ tcpport_cmd (USAGE);
+ long_help ("\
+The tcpport command is used to view and modify the non-volatile tcp port\n\
+address used for debugging. The address is specified by decimal numer in\n\
+the range of 1-65535. If no port number is specified, the current port is\n\
+displayed.\n");
+ example ("tcpport 1000");
+ return 0;
+ }
+
+ if (argvect[1] != NULL)
+ {
+ if (argvect[2] != NULL)
+ return tcpport_cmd (USAGE);
+
+ p = argvect[1];
+ n = 0;
+ while (isdigit(*p))
+ {
+ n = n*10 + (*p++ - '0');
+ if (n > 65535)
+ return tcpport_cmd (USAGE);
+ }
+ if (*p != '\0')
+ return tcpport_cmd (USAGE);
+
+ NVRAM_TCP_PORT(0) = (n >> 8) & 0xff;
+ NVRAM_TCP_PORT(1) = n & 0xff;
+ }
+ else
+ xprintf("%d\n", (NVRAM_TCP_PORT(0) << 8) + NVRAM_TCP_PORT(1));
+
+ return 0;
+}
+#endif /* NVRAM_TCP_PORT */
+
+
+#ifdef __ECOS__
+# if (CYG_BYTEORDER == CYG_LSBFIRST)
+# define LITTLE_ENDIAN_TARGET
+# else
+# define BIG_ENDIAN_TARGET
+# endif
+#endif
+
+#ifdef LITTLE_ENDIAN_TARGET
+static int swap_bytes = 1;
+#else
+static int swap_bytes = 0;
+#endif
+
+int
+get_memory_display_mode (void)
+{
+ return swap_bytes;
+}
+
+void
+set_memory_display_mode (int mode)
+{
+ swap_bytes = mode;
+}
+
+
+/* Just to make DEFAULT_SIZE something usable, this may go elsewhere later.*/
+#ifndef DEFAULT_SIZE
+#define DEFAULT_SIZE 1
+#endif
+
+static int
+get_cmd_size (void)
+{
+ int size = 0;
+ char *sizestr;
+
+ sizestr = strchr (argvect[0], '.');
+
+ if (sizestr == NULL || sizestr[0] == '\0' || sizestr[1] == '\0')
+ {
+ size = DEFAULT_SIZE;
+ }
+ else
+ {
+ size = str2int (sizestr + 1, 10) / 8;
+ }
+ if (size != 1 && size != 2 && size != 4 && size != 8)
+ {
+ xprintf ("Invalid size.\n");
+ return -1;
+ }
+ return size;
+}
+
+
+void
+display_memory (char *value, int size, int littleEndian)
+{
+ int x;
+ int start = littleEndian ? size - 1 : 0 ;
+ int end = littleEndian ? -1 : size;
+ int incr = littleEndian ? -1 : 1;
+
+ if (value)
+ {
+ for (x = start; x != end; x += incr)
+ xprintf ("%02x", value[x] & 0xff);
+ }
+ else
+ {
+ for (x = start; x != end; x += incr)
+ xprintf ("..");
+ }
+}
+
+
+static int
+peek (void)
+{
+ mem_addr_t addr;
+ int size = get_cmd_size ();
+
+ if (size > 0)
+ {
+ /* We already checked to see if the command was legal when we called the
+ function, so there's no need to worry about that here. */
+
+ if (argvect[1] != 0)
+ {
+ char value[8];
+
+ str2addr (argvect[1], &addr);
+ if (read_memory (&addr, size, 1, value))
+ {
+ xprintf ("Memory read failed\n");
+ }
+ else
+ {
+ display_memory (value, size, get_memory_display_mode ());
+ xprintf ("\n");
+ }
+ }
+ else
+ {
+ xprintf ("Not enough arguments\n");
+ return mem_cmd (USAGE);
+ }
+ }
+ return 0;
+}
+
+/* Poke a single byte in memory. */
+
+static int
+poke (void)
+{
+ int size = 0;
+
+ size = get_cmd_size ();
+ if (size > 0)
+ {
+ /* We already checked to see if the command was legal when we called the
+ function, so there's no need to worry about that here. */
+
+ if ((argvect[1] != 0) && (argvect[2] != 0))
+ {
+ char value[8];
+ mem_addr_t addr;
+
+ str2addr (argvect[1], &addr);
+ hex2bytes (argvect[2], value, size);
+
+ if (get_memory_display_mode ())
+ {
+ /* Gotta swap this puppy. */
+ int x;
+
+ for (x = 0; x < (size / 2); x++)
+ {
+ char tmp = value[x];
+ value [x] = value [size - 1 - x];
+ value [size - 1 - x] = tmp;
+ }
+ }
+ if (write_memory (&addr, size, 1, value))
+ {
+ xprintf ("Memory write failed\n");
+ }
+#ifdef HAVE_BSP
+ bsp_flush_dcache((void *)addr.addr, size);
+ bsp_flush_icache((void *)addr.addr, size);
+#endif
+ }
+ else
+ {
+ xprintf ("Not enough arguments\n");
+ return mem_cmd (USAGE);
+ }
+ }
+ return 0;
+}
+
+
+/* I am cheap and easy. */
+int
+mem_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("memory[.size] address [value]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("read/write memory");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ mem_cmd (USAGE);
+ long_help ("\
+The memory command is used to view and modify single locations in memory.\n\
+It can take a size extension, which follows the command name or partial\n\
+command name without a space, and is a period followed by the number of\n\
+bits to be viewed or modified. Options are 8, 16, 32, and 64. Without\n\
+a size extension, the memory command defaults to displaying or changing 8\n\
+bits at a time.\n\
+The memory command can take one or two arguments, independent of\n\
+whether a size extension is specified. With one argument, it displays the\n\
+contents of the specified location. With two arguments, it replaces the\n\
+contents of the specified location with the specified value.\n");
+ example ("\
+memory.8 45f6b2 57\n\
+Places the 8 bit value 57 at the location 45f6b2.");
+ return 0;
+ }
+
+ if (argvect[1] == NULL || (argvect[2] != NULL && argvect[3] != NULL))
+ {
+ return mem_cmd (USAGE);
+ }
+ if (argvect[1] != NULL && argvect[2] != NULL)
+ return poke ();
+ else
+ return peek ();
+}
+
+/* Memory dump function. */
+
+int
+dump_cmd (cmdmode_t mode)
+{
+ mem_addr_t addr;
+ char value[8];
+
+ if (mode == USAGE)
+ {
+ usage ("dump[.size] location [count]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Memory dump command");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ dump_cmd (USAGE);
+ long_help ("\
+The dump command displays a region of memory. If no count value is\n\
+supplied, the command displays 16 bytes. It can take a size\n\
+extension, which follows the command name or partial command name\n\
+without a space, and is a period followed by the number of bits to be\n\
+viewed or modified. Options are 8, 16, 32, and 64. Without a size\n\
+extension, the dump command defaults to displaying 8 bits at a time.\n\
+Addresses are aligned to a 16-byte boundary. Thus, dump 65 would show\n\
+all bytes from 60 through 6f.\n");
+ example ("\
+dump 44f5\n\
+Displays 16 bytes starting with 44f0 and ending with 44ff.");
+ return 0;
+ }
+
+ if (argvect[1] != 0 && (argvect[2] == NULL || argvect[3] == NULL))
+ {
+ mem_addr_t start_addr;
+ char chardumps[32];
+ int offset;
+ int count;
+ int line;
+ int size = get_cmd_size ();
+ int i;
+
+ if (size == -1)
+ /*
+ * Invalid size specified.
+ */
+ return 0;
+
+ str2addr (argvect[1], &addr);
+ if (argvect[2] != NULL)
+ {
+ count = str2int (argvect[2], 10);
+ count = (count + 15) / 16;
+ }
+ else
+ {
+ count = 1;
+ }
+ ADD_ALIGN(&addr, &start_addr, 16);
+ for (line = 0; line < count; line ++)
+ {
+ for (offset = 0; offset < 16; offset += size)
+ {
+ ADD_OFFSET(&start_addr, &addr, offset + line * 16);
+
+ if (offset == 0)
+ {
+ char buf[32];
+
+ addr2str (&addr, buf);
+ xprintf("%s: ", buf);
+ }
+ if (read_memory (&addr, size, 1, value))
+ {
+ display_memory (0, size, get_memory_display_mode ());
+ for (i = 0; i < size; i++)
+ {
+ value[i] = 0;
+ }
+ } else {
+ display_memory (value, size, get_memory_display_mode ());
+ }
+ xprintf (" ");
+ for (i = 0; i < size; i++)
+ {
+ chardumps[offset + i] = value[i] & 0x7f;
+ if (chardumps[offset + i] < 32)
+ chardumps[offset + i] = '.';
+ }
+ }
+ xprintf (" ");
+ for(i = 0; i < offset; i++)
+ {
+ xprintf ("%c", chardumps[i]);
+ }
+ xprintf ("\n");
+ }
+ }
+ else
+ {
+ dump_cmd (USAGE);
+ }
+ return 0;
+}
+
+static int scnt;
+static int (*srec_input_char) (void);
+
+static inline int
+gethexnibble(void)
+{
+ int ch;
+
+ inbuf[scnt++] = ch = srec_input_char();
+ if (ch >= '0' && ch <= '9')
+ return (ch - '0');
+ if (ch >= 'a' && ch <= 'f')
+ return (ch - 'a' + 10);
+ if (ch >= 'A' && ch <= 'F')
+ return (ch - 'A' + 10);
+
+ inbuf[scnt] = '\0';
+ xprintf("Bad hex char: %s\n", inbuf);
+ return -1;
+}
+
+
+static inline int
+gethexbyte(void)
+{
+ int nib;
+ unsigned char n;
+
+ if ((nib = gethexnibble()) < 0)
+ return -1;
+ n = nib << 4;
+ if ((nib = gethexnibble()) < 0)
+ return -1;
+ n |= nib;
+ return n;
+}
+
+static inline int
+chk_cksum(unsigned int cksum, int rval)
+{
+ int n;
+
+ if ((n = gethexbyte()) < 0)
+ return -1;
+
+ cksum = ~cksum & 0xff;
+
+ if (cksum != n)
+ {
+ inbuf[scnt] = '\0';
+ xprintf("Bad cksum[%02x]: %s\n", cksum, inbuf);
+ return -1;
+ }
+ return rval;
+}
+
+int
+load_srec(srec_input_func_t inp_func)
+{
+ int count, dcount, data, n, addr_bytes = 0, is_term, is_comment;
+ unsigned int address, cksum;
+ unsigned char data_buf[256];
+ mem_addr_t memaddr;
+
+ srec_input_char = inp_func;
+
+ is_comment = is_term = 0;
+
+ while (srec_input_char() != 'S')
+ ;
+
+ scnt = 0;
+ inbuf[scnt++] = 'S';
+
+ if ((n = gethexnibble()) < 0)
+ return -1;
+
+ switch (n)
+ {
+ case 0:
+ case 5:
+ is_comment = 1;
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ addr_bytes = n + 1;
+ break;
+
+ case 7:
+ case 8:
+ case 9:
+ is_term = 1;
+ addr_bytes = 11 - n;
+ break;
+
+ default:
+ inbuf[scnt] = '\0';
+ xprintf("Bad record type: %s\n", inbuf);
+ return -1;
+ }
+
+ if ((count = gethexbyte()) < 0)
+ return -1;
+ cksum = count;
+
+ --count; /* don't count chksum */
+
+ if (is_comment)
+ {
+ while (count > 0)
+ {
+ if ((n = gethexbyte()) < 0)
+ return -1;
+ cksum += n;
+ --count;
+ }
+ return chk_cksum(cksum, 0);
+ }
+
+ address = 0;
+ while (count > 0 && addr_bytes)
+ {
+ if ((n = gethexbyte()) < 0)
+ return -1;
+ cksum += n;
+ address = (address << 8) | n;
+ --addr_bytes;
+ --count;
+ }
+
+ if (is_term)
+ {
+ if (count || addr_bytes)
+ {
+ inbuf[scnt] = '\0';
+ xprintf("Malformed record cnt[%d] abytes[%d]: %s\n",
+ count, addr_bytes, inbuf);
+ return -1;
+ }
+ if (chk_cksum(cksum, 1) == 1)
+ {
+ set_pc (address);
+ xprintf("Setting start address: 0x%08x\n", address);
+ return 1;
+ }
+ return -1;
+ }
+
+ dcount = 0;
+
+ while (count > 0)
+ {
+ if ((data = gethexbyte()) < 0)
+ return -1;
+ cksum += data;
+ data_buf[dcount++] = data;
+ --count;
+ }
+
+ if (chk_cksum(cksum, 0))
+ return -1;
+
+ MAKE_STD_ADDR (address, &memaddr);
+ write_memory (&memaddr, 1, dcount, data_buf);
+#ifdef HAVE_BSP
+ bsp_flush_dcache((void *)memaddr.addr, dcount);
+ bsp_flush_icache((void *)memaddr.addr, dcount);
+#endif
+
+ return 0;
+}
+
+
+int
+load_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("load");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Load srecords into memory");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ load_cmd (USAGE);
+ long_help ("\
+The load command switches the monitor into a state where it takes all input
+as s-records and stores them in memory. The monitor exits this mode when a
+termination record is hit, or certain errors (such as an invalid s-record)
+cause the load to fail.");
+ return 0;
+ }
+
+ if (argvect[1] != NULL)
+ {
+ return load_cmd (USAGE);
+ }
+
+ while (!load_srec(xgetchar))
+ ;
+
+ return 0;
+}
+
+#ifndef REGNAME_EXAMPLE
+# define REGNAME_EXAMPLE "a0"
+#endif
+
+#if !defined(__ECOS__) || defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
+int
+transfer_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("$");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Transfer to gdb stub");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ transfer_cmd (USAGE);
+ long_help ("\
+The transfer or $ command transfers control to the gdb stub. This function\n\
+does not actually need to be called by the user, as connecting to the board\n\
+with gdb will call it automatically. The transfer command takes no\n\
+arguments. The $ command does not wait for a return, but executes\n\
+immediately. A telnet setup in line mode will require a return when $ is\n\
+executed by the user, as the host computer does not pass any characters to\n\
+the monitor until a return is pressed. Disconnecting from the board in gdb\n\
+automatically returns control to the monitor.");
+ return 0;
+ }
+ if (argvect[1] == NULL)
+ {
+ return transfer_to_stub ();
+ }
+ else
+ {
+ transfer_cmd (USAGE);
+ }
+ return 0;
+}
+#endif
+
+static void
+display_group (int which_group)
+{
+ int len = 0;
+ int skipping_group = 0;
+ char buf[80];
+ int start_entry = 0;
+ int i;
+
+ if (which_group >= 0)
+ {
+ start_entry = which_group;
+ }
+
+ for (i = start_entry; regtab[i].registername != NULL; i++)
+ {
+ int buflen;
+
+ if (regtab[i].registernumber < 0)
+ {
+ if (which_group >= 0 && i != which_group)
+ {
+ break;
+ }
+
+ if (len > 0)
+ {
+ xprintf ("\n");
+ len = 0;
+ }
+ if (which_group < 0)
+ {
+ if (regtab[i].registernumber == -2)
+ {
+ skipping_group = 1;
+ xprintf ("[skipping %s]\n", regtab[i].registername);
+ }
+ else
+ {
+ skipping_group = 0;
+ xprintf ("[%s]\n", regtab[i].registername);
+#if 0
+ len = strlen (regtab[i].registername) + 2;
+ while (len < MAXLINES)
+ {
+ xputchar (' ');
+ len++;
+ }
+#endif
+ }
+ }
+ }
+ else
+ if (!skipping_group)
+ {
+#ifdef REG_VALID_FIELD_IN_REGSTRUCT
+#define REGVALID_VAL regtab[i].registervalid
+#else
+#define REGVALID_VAL 1
+#endif
+ xsprintf(buf, "%4s: %s",
+ regtab[i].registername,
+ get_register_str (regtab[i].registernumber, 0 , REGVALID_VAL));
+#undef REGVALID_VAL
+ buflen = strlen (buf);
+ if ((buflen + len + 3) >= 80)
+ {
+ xprintf ("\n");
+ len = 0;
+ }
+ else if(len > 0)
+ {
+ xprintf (" ");
+ len += 3;
+ }
+
+ xprintf (buf);
+ len += buflen;
+ }
+ }
+ if (len > 0)
+ {
+ xprintf ("\n");
+ }
+}
+
+static int
+getregister (void)
+{
+ int i;
+
+ if (argvect[1] == 0)
+ {
+ display_group (-1);
+ }
+ else
+ {
+ for (i = 0; regtab[i].registername != NULL; i++)
+ {
+ if (!(strcmp (argvect[1], regtab[i].registername)))
+ {
+ break;
+ }
+ }
+ if (regtab[i].registername == NULL)
+ {
+ xprintf ("No such register\n");
+ }
+ else
+ {
+ if (regtab[i].registernumber < 0)
+ {
+ display_group (i);
+ }
+ else
+ {
+#ifdef REG_VALID_FIELD_IN_REGSTRUCT
+#define REGVALID_VAL regtab[i].registervalid
+#else
+#define REGVALID_VAL 1
+#endif
+ xprintf("%s: %s\n", argvect[1],
+ get_register_str (regtab[i].registernumber, 1, REGVALID_VAL));
+#undef REGVALID_VAL
+ }
+ }
+ }
+ return 0;
+}
+
+static int
+setregister (void)
+{
+ int number = -1;
+ int i;
+ if ((argvect[1] != 0) && (argvect[2] != 0))
+ {
+ i = 0;
+ while (regtab[i].registername != NULL)
+ {
+ if (!(strcmp (argvect[1], regtab[i].registername)))
+ {
+ number = regtab[i].registernumber;
+ break;
+ }
+ i++;
+ }
+ if (number < 0)
+ xprintf ("Unknown register name %s\n", argvect[1]);
+ else
+ store_register (number, argvect[2]);
+ }
+ else
+ {
+ xprintf ("Not enough arguments\n");
+ }
+ return 0;
+}
+
+
+int
+reg_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("register [register name] [value]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("View and manipulate registers");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ reg_cmd (USAGE);
+ long_help ("\
+The register command allows the viewing and manipulation of register\n\
+contents. It can take zero, one, or two arguments. When called with zero\n\
+arguments, the register command displays the values of all registers. When\n\
+called with only the register name argument, it displays the contents of\n\
+the specified register. When called with both a register name and a value,\n\
+it places that value into the specified register.\n");
+ example ("\
+register " REGNAME_EXAMPLE " 1f\n\
+Places the value 1f in the register " REGNAME_EXAMPLE);
+ return 0;
+ }
+
+ if (argvect[1] != NULL && argvect[2] != NULL)
+ {
+ if (argvect[3] != NULL)
+ {
+ return reg_cmd (USAGE);
+ }
+ return setregister ();
+ }
+ else
+ return getregister ();
+}
+
+
+/* execute the program in memory */
+int
+go_cmd (cmdmode_t mode)
+{
+#ifdef HAS_TIMER
+ extern tick_type start_tickcount;
+#endif
+
+ if (mode == USAGE)
+ {
+ usage ("go [location]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Start user program execution");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ go_cmd (USAGE);
+ long_help ("\
+The go command starts user program execution. It can take zero or one\n\
+argument. If no argument is provided, go starts execution at the current\n\
+pc. If an argument is specified, go sets the pc to that location, and then\n\
+starts execution at that location.\n");
+ example ("
+go 40020000\n\
+Sets the pc to 40020000, and starts program execution.");
+ return 0;
+ }
+
+ if (argvect[1] != NULL && argvect[2] != NULL)
+ {
+ return go_cmd (USAGE);
+ }
+ if (argvect[1] != NULL)
+ {
+ set_pc (str2int (argvect[1], 16));
+ }
+
+#ifdef HAS_TIMER
+ start_tickcount = __read_ticks ();
+#endif
+ /* We want monitor_loop to exit now. */
+ return 1;
+}
+
+#ifdef HAS_TIMER
+int
+timer_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("timer [state]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Enable and disable timer");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ timer_cmd (USAGE);
+ long_help ("\
+The timer command allows control of the on board timer. It takes zero\n\
+or one argument. With zero arguments, it displays the state of the timer,\n\
+with one argument, which can start with e or d, it enables or disables the\n\
+timer, respectively.\n");
+ example ("\
+timer e\n\
+Enables the timer.");
+ return 0;
+ }
+
+ if (argvect[1] != NULL)
+ {
+ if (argvect[2] != NULL)
+ {
+ return timer_cmd (USAGE);
+ }
+ else if (argvect[1][0] == 'e')
+ {
+ __settimer (0, 0);
+ }
+ else if (argvect[1][0] == 'd')
+ {
+ __disable_timer ();
+ }
+ else
+ {
+ timer_cmd (USAGE);
+ }
+ }
+ if (__timer_enabled ())
+ {
+ xprintf ("Timer is currently enabled.\n");
+ }
+ else
+ {
+ xprintf ("Timer is currently disabled.\n");
+ }
+ return 0;
+}
+#endif
+
+int
+clear_breakpoint_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("unbreak location");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Clear breakpoint");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ clear_breakpoint_cmd (USAGE);
+ long_help ("\
+The unbreak command removes breakpoints from memory. It takes one\n\
+argument, the location to remove the breakpoint from.\n");
+ example ("\
+unbreak 4ff5\n\
+Removes a previously set breakpoint at memory location 4ff5.");
+ return 0;
+ }
+
+ if (argvect[1] == NULL || argvect[2] != NULL)
+ {
+ clear_breakpoint_cmd (USAGE);
+ }
+ else
+ {
+ mem_addr_t location;
+ str2addr (argvect[1], &location);
+ if (clear_mon_breakpoint (location))
+ {
+ xprintf("Unable to remove breakpoint at 0x%08lx\n", location.addr);
+ }
+ }
+ return 0;
+}
+
+
+int
+breakpoint_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("break [location]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Set or display breakpoints");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ breakpoint_cmd (USAGE);
+ long_help ("\
+The break command displays and sets breakpoints in memory. It takes zero\n\
+or one argument. With zero arguments, it displays a list of all currently\n\
+set breakpoints. With one argument it sets a new breakpoint at the\n\
+specified location.\n");
+ example ("\
+break 4ff5\n\
+Sets a breakpoint at address 4ff5.");
+ return 0;
+ }
+
+ if (argvect[1] == NULL)
+ {
+ return show_breakpoints ();
+ }
+ else if (argvect[2] != NULL)
+ {
+ breakpoint_cmd (USAGE);
+ }
+ else
+ {
+ mem_addr_t location;
+
+ str2addr (argvect[1], &location);
+ if (add_mon_breakpoint (location))
+ {
+ xprintf("Unable to set breakpoint at 0x%08lx\n", location.addr);
+ }
+ }
+ return 0;
+}
+
+
+int
+version_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("version");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Display version");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ version_cmd (USAGE);
+ long_help ("\
+The version command displays the version of the monitor.");
+ return 0;
+ }
+
+ if (argvect[1] == NULL)
+ {
+ version ();
+ }
+ else
+ {
+ version_cmd (USAGE);
+ }
+ return 0;
+}
+
+int
+set_serial_port_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("port [port number]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Set the active serial port");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ set_serial_port_cmd (USAGE);
+ long_help ("\
+The port command allows control over the serial port being used by the\n\
+monitor. It takes zero or one argument. Called with zero arguments it\n\
+displays the port currently in use by the monitor. Called with one\n\
+argument it switches the port in use by the monitor to the one specified.\n\
+It then prints out a message on the new port to confirm the switch.\n");
+ example ("\
+port 1\n\
+Switches the port in use by the monitor to port 1.");
+ return 0;
+ }
+ if (argvect[1] != NULL && argvect[2] != NULL)
+ {
+ set_serial_port_cmd (USAGE);
+ return 0;
+ }
+ if (argvect [1] != NULL)
+ {
+#ifdef HAVE_BSP
+ if (bsp_set_debug_comm(str2int (argvect[1], 10)) < 0)
+ xprintf("Invalid port number.\n");
+ else
+ /* Since we are using the new port, we just need to write
+ something to tell the user that this is the active port */
+ xprintf ("Cygmon I/O now on this port.\n");
+#else
+ __setTty (str2int (argvect[1], 10));
+ /* Since we are using the new port, we just need to write
+ something to tell the user that this is the active port */
+ xprintf ("Cygmon I/O now on this port.\n");
+#endif
+ }
+ else
+ {
+ xprintf ("serial port currently set to %d\n", __getTty());
+ return 0;
+ }
+ return 0;
+}
+
+int
+step_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("step [location]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Single step user program");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ step_cmd (USAGE);
+ long_help ("\
+The step command causes one instruction of the user program to execute, then\n\
+returns control to the monitor. It can take zero or one argument. If no\n\
+argument is provided, step executes one instruction at the current pc. If\n\
+a location is specified, step executes one instruction at the specified\n\
+location.\n");
+ example ("
+step\n\
+Executes one instruction at the current pc.");
+ return 0;
+ }
+
+ if (argvect[1] != NULL && argvect[2] != NULL)
+ {
+ step_cmd (USAGE);
+ return 0;
+ }
+ if (argvect[1] != NULL)
+ set_pc (str2int (argvect[1], 16));
+
+ __single_step ();
+ return 1;
+
+}
+
+#if HAVE_CACHE
+/* This cache function needs to be in processor-specific files. */
+
+int
+cache_cmd (cmdmode_t mode)
+{
+ int x;
+ int cache_op = CACHE_NOOP;
+ int which_cache = -1;
+
+ if (mode == USAGE)
+ {
+ usage ("cache [type] [state]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Manipulate caches");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ cache_cmd (USAGE);
+ long_help ("\
+The cache command displays and changes the states of the caches. It takes\n\
+zero, one, or two arguments. With no arguments, it displays the state of\n\
+both the instruction cache and the data cache. With one argument, it\n\
+displays the state of the specified type of cache. With two arguments, it\n\
+changes the state of the specified cache to the specified state.\n");
+ example ("\
+cache i d\n\
+Disables the instruction cache.");
+ return 0;
+ }
+
+ if (argvect[1] != NULL && argvect[2] != NULL && argvect[3] != NULL)
+ {
+ return cache_cmd (USAGE);
+ }
+ if (argvect[1] != NULL)
+ {
+ if (argvect[1][0] == 'd')
+ which_cache = 0;
+ else if (argvect[1][0] == 'i')
+ which_cache = 1;
+ else
+ {
+ xprintf ("unknown cache type %s\n", argvect[1]);
+ return 0;
+ }
+ if (argvect[2] != NULL)
+ {
+ if (argvect[2][0] == 'e')
+ cache_op = CACHE_ENABLE;
+ else if (argvect[2][0] == 'd')
+ cache_op = CACHE_DISABLE;
+ else if (argvect[2][0] == 'f')
+ cache_op = CACHE_FLUSH;
+ else
+ {
+ xprintf ("Unknown cache op %s\n", argvect[2]);
+ return 0;
+ }
+ }
+ }
+ if (which_cache == 0 || which_cache == -1)
+ {
+ __data_cache (cache_op);
+ if (cache_op == CACHE_FLUSH)
+ {
+ xprintf ("Flushed dcache\n");
+ }
+ x = __data_cache (CACHE_NOOP);
+ xprintf ("dcache is ");
+ xprintf (x ? "enabled\n" : "disabled\n");
+ }
+ if (which_cache == 1 || which_cache == -1)
+ {
+ __instruction_cache (cache_op);
+ if (cache_op == CACHE_FLUSH)
+ {
+ xprintf ("Flushed icache\n");
+ }
+ x = __instruction_cache (CACHE_NOOP);
+ xprintf ("icache is ");
+ xprintf (x ? "enabled\n" : "disabled\n");
+ }
+ return 0;
+}
+#endif
+
+int
+set_serial_speed_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("baud speed");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Set serial port baud rate");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ set_serial_speed_cmd (USAGE);
+ long_help ("\
+The baud command sets the speed of the active serial port. It takes one\n\
+argument, which specifies the speed to which the port will be set.\n");
+ example ("\
+baud 9600\n\
+Sets the speed of the active port to 9600 baud.");
+ return 0;
+ }
+
+ if (argvect[1] == NULL || argvect[2] != NULL)
+ {
+ return set_serial_speed_cmd (USAGE);
+ }
+ else
+ {
+#ifdef HAVE_BSP
+ int channel_id = bsp_set_debug_comm(-1);
+ int baud = str2int (argvect[1], 10);
+
+ xprintf("Setting serial baud rate on channel %d to %d baud\n",
+ channel_id, baud);
+
+ if (bsp_set_serial_baud(bsp_set_debug_comm(-1),
+ str2int (argvect[1], 10)) < 0)
+ xprintf("Invalid baud rate\n");
+#else
+ __set_baud_rate (str2int (argvect[1], 10));
+#endif
+ }
+ return 0;
+}
+
+
+int
+set_term_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("terminal type");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Set the terminal type");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ set_term_cmd (USAGE);
+ long_help ("\
+The terminal command sets the type of the current terminal to that specified\n\
+in the type argument. The only available terminal types are vt100 and dumb.\n\
+This is used by the line editor to determine how to update the terminal\n\
+display.\n");
+ example ("\
+terminal dumb\n\
+Sets the type of the current terminal to a dumb terminal.\n");
+ return 0;
+ }
+
+ if (argvect[1] == NULL || argvect[2] != NULL)
+ set_term_cmd (USAGE);
+ else
+ set_term_name (argvect[1]);
+ return 0;
+}
+
+int
+reset_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("reset");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Reset the board (not on all architectures).");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ reset_cmd (USAGE);
+ long_help ("\
+The reset command resets the board. This may not be implemented\n\
+on all architectures");
+ return 0;
+ }
+
+ if (argvect[1] != NULL)
+ {
+ reset_cmd (USAGE);
+ }
+ else
+ {
+ __reset ();
+ }
+ return 0;
+}
+
+#if HAVE_USAGE
+int
+memusage_cmd (cmdmode_t mode)
+{
+ extern int sdata, _end;
+
+ if (mode == USAGE)
+ {
+ usage ("usage");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Show monitor memory usage");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ memusage_cmd (USAGE);
+ long_help ("\
+The usage command shows the amount of memory being used by the monitor,\n\
+broken down by category. Despite its name, it has nothing to do with the\n\
+usage of any other command.\n");
+ return 0;
+ }
+
+ if (argvect[1] != NULL)
+ {
+ return memusage_cmd (USAGE);
+ }
+ else
+ {
+ xprintf ("%d bytes were allocated with sbrk\n", (char *)sbrk (0) - (char *)&_end);
+ }
+ return 0;
+}
+#endif /* HAVE_USAGE */
+
+int
+disassemble_cmd (cmdmode_t mode)
+{
+#ifdef DISASSEMBLER
+ int x;
+
+ if (mode == USAGE)
+ {
+ usage ("disassemble [location]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Disassemble memory");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ disassemble_cmd (USAGE);
+ long_help ("\
+The disassemble command disassembles the contents of memory. Because of the\n\
+way breakpoints are handled, all instructions are shown and breakpoints are\n\
+not visible in the disassembled code. The disassemble command takes zero\n\
+or one argument. When called with zero arguments, it starts disassembling\n\
+from the current (user program) pc. When called with a location, it starts\n\
+disassembling from the specified location. When called after a previous\n\
+call and with no arguments, it disassembles the next area of memory after\n\
+the one previously disassembled.\n");
+ example ("\
+disassemble 45667000\n\
+Displays disassembled code starting at location 45667000.");
+ return 0;
+ }
+ if (argvect [1] != NULL && argvect[2] != NULL)
+ {
+ return disassemble_cmd (USAGE);
+ }
+
+ if(argvect [1] != NULL)
+ str2addr (argvect [1], &last_pc);
+ for (x = 0; x < 10; x++)
+ last_pc = do_dis (&last_pc);
+ flush_dis ();
+#else
+#warning "DISASSEMBLER not implemented"
+ xprintf ("disassembler not available\n");
+#endif
+
+ return 0;
+}
+
+int
+copy_cmd (cmdmode_t mode)
+{
+ mem_addr_t src, dst;
+ target_register_t size;
+
+ if (mode == USAGE)
+ {
+ usage ("copy startaddr destaddr amount");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Copies one area of memory to another");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ copy_cmd (USAGE);
+ long_help ("\
+The copy command is used to copy 'amount' bytes of memory\n\
+from 'startaddr' to 'destaddr'\n");
+ example ("\
+copy 10000 20000 300\n\
+Copies 0x300 bytes of memory from 0x10000 to 0x20000.");
+ return 0;
+ }
+ if (argvect[1] == NULL || argvect[2] == NULL || argvect[3] == NULL
+ || argvect[4] != NULL)
+ {
+ return copy_cmd (USAGE);
+ }
+ str2addr (argvect[1], &src);
+ str2addr (argvect[2], &dst);
+ size = str2int (argvect[3], 16);
+ while (size > 0)
+ {
+ char buf[128];
+
+ int msize = (size > 128) ? 128 : size;
+ if (read_memory (&src, 1, msize, buf))
+ {
+ xprintf ("Memory read failed\n");
+ break;
+ }
+ if (write_memory (&dst, 1, msize, buf))
+ {
+ xprintf ("Memory write failed\n");
+ break;
+ }
+#ifdef HAVE_BSP
+ bsp_flush_dcache((void *)dst.addr, msize);
+ bsp_flush_icache((void *)dst.addr, msize);
+#endif
+ ADD_OFFSET (&src, &src, msize);
+ ADD_OFFSET (&dst, &dst, msize);
+ size -= msize;
+ }
+ return 0;
+}
+
+#ifndef HAVE_BSP
+int
+set_program_args_cmd (cmdmode_t mode)
+{
+ int argc;
+
+ if (mode == USAGE)
+ {
+ usage ("setargs [args]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Sets the program arguments passed to main()");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ set_program_args_cmd (SHORT_HELP);
+ return 0;
+ }
+ for (argc = 1; argvect[argc] != NULL; argc++)
+ ;
+ __set_program_args (argc - 1, argvect + 1);
+ return 0;
+}
+#endif
+
+
+int
+fill_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("fill[.size] startaddress endaddress [value]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Fills memory with a specified value");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ fill_cmd (USAGE);
+ long_help("\
+The fill command is used to fill a region of memory from 'startaddress'\n\
+to 'endaddress' with the value in 'value'. If no value is specificed,\n\
+it uses zero. It can take a size extension, which follows the command\n\
+name or partial command name without a space, and is a period followed\n\
+by the size of the writes that are used, in bits. Options are 8, 16,\n\
+32, and 64. Without a size extension, the fill command defaults to\n\
+changing 8 bits at a time.\n");
+ example ("\
+fill.32 10000 20000 32\n\
+Fills the region between 0x10000 and 0x20000 with the 32 bit value 0x32.");
+ return 0;
+ }
+ if ((argvect[1] == NULL || argvect[2] == NULL)
+ || (argvect[3] != NULL && argvect[4] != NULL))
+ {
+ fill_cmd (USAGE);
+ return 0;
+ } else {
+ mem_addr_t start,end;
+ char value[8];
+ int size = get_cmd_size();
+ int amt;
+
+ if (size == -1)
+ /*
+ * Invalid size specified.
+ */
+ return 0;
+
+ if (argvect[3] != NULL)
+ {
+ hex2bytes (argvect[3], value, size);
+ }
+ else
+ {
+ hex2bytes ("0", value, size);
+ }
+ str2addr (argvect[1], &start);
+ str2addr (argvect[2], &end);
+ amt = MEM_ADDR_DIFF (end, start);
+ if (amt < 0)
+ {
+ xprintf ("Addresses in incorrect order\n");
+ }
+ else
+ {
+ int x;
+ if (get_memory_display_mode ())
+ {
+ /* Gotta swap this puppy. */
+ int x;
+
+ for (x = 0; x < (size / 2); x++)
+ {
+ char tmp = value[x];
+ value [x] = value [size - 1 - x];
+ value [size - 1 - x] = tmp;
+ }
+ }
+
+ xprintf ("Writing %d units\n", amt / size + 1);
+ for (x = amt / size; x >= 0; x--)
+ {
+ if (write_memory (&start, size, 1, value))
+ {
+ xprintf ("Memory write failed\n");
+ break;
+ }
+ ADD_OFFSET (&start, &start, size);
+ }
+ }
+ }
+ return 0;
+}
+
+
+int
+swapmem_cmd (cmdmode_t mode)
+{
+ int display_settings = 0;
+
+ if (mode == USAGE)
+ {
+ usage ("swapmem [little|big]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Sets whether or not memory values are byte-swapped");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ swapmem_cmd (USAGE);
+
+ long_help("\
+The swapmem command is used to determine whether or not memory values are\n\
+displayed and written in little or big-endian byte order. By default, values\n\
+are read and written to match the byte order of the target CPU.\n\
+This command does not alter the CPU state in any way; it only changes the\n\
+way memory values are displayed and written within the monitor.\n");
+ example("\
+swapmem \n\
+Displays the byte order that is currently in effect.");
+ return 0;
+ display_settings = 1;
+ }
+ else
+ {
+ if (argvect[1] != NULL && argvect[2] != NULL)
+ {
+ swapmem_cmd (USAGE);
+ return 0;
+ }
+ }
+ if (display_settings || argvect[1] == NULL)
+ {
+ if (get_memory_display_mode ())
+ {
+ xprintf ("Memory values are read and written in little-endian byte order.\n");
+ }
+ else
+ {
+ xprintf ("Memory values are read and written in big-endian byte order.\n");
+ }
+ return 0;
+ }
+ if (strncmp (argvect[1], "little", strlen (argvect[1])) == 0)
+ {
+ set_memory_display_mode (1);
+ xprintf ("Memory values are now read and written in little-endian order.\n");
+ }
+ else if (strncmp (argvect[1], "big", strlen (argvect[1])) == 0)
+ {
+ set_memory_display_mode (0);
+ xprintf ("Memory values are now read and written in big-endian order.\n");
+ }
+ else
+ {
+ return swapmem_cmd (USAGE);
+ }
+ return 0;
+}
+
+#ifdef MONITOR_CONTROL_INTERRUPTS
+int
+int_cmd (cmdmode_t mode)
+{
+ if (mode == USAGE)
+ {
+ usage ("interrupt [on|off]");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("Enables or disables interrupts within the monitor");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ int_cmd (USAGE);
+ long_help("\
+The interrupt command is used to enable or disable interrupts while the\n\
+monitor is running.");
+ return 0;
+ }
+ if (argvect[1] != NULL && argvect[2] != NULL)
+ {
+ int_cmd (USAGE);
+ return 0;
+ }
+ if (argvect[1] != NULL)
+ {
+ if (strcmp (argvect[1], "on") == 0)
+ {
+ monitor_enable_interrupts ();
+ }
+ else if (strcmp (argvect[1], "off") == 0)
+ {
+ monitor_disable_interrupts ();
+ }
+ else
+ {
+ int_cmd (USAGE);
+ return 0;
+ }
+ }
+ xprintf ("Interrupts ");
+ if (monitor_interrupt_state ())
+ {
+ xprintf ("enabled\n");
+ }
+ else
+ {
+ xprintf ("disabled\n");
+ }
+ return 0;
+}
+#endif
+
+
+/* Table used by the crc32 function to calcuate the checksum. */
+static uint32 crc32_table[256];
+static int crc_initted = 0;
+
+static uint32
+crc32 (unsigned char *buf, int len, uint32 crc)
+{
+ if (! crc_initted)
+ {
+ /* Initialize the CRC table and the decoding table. */
+ int i, j;
+ uint32 c;
+
+ crc_initted = 1;
+ for (i = 0; i < 256; i++)
+ {
+ for (c = i << 24, j = 8; j > 0; --j)
+ c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
+ crc32_table[i] = c;
+ }
+ }
+
+ while (len--)
+ {
+ crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
+ buf++;
+ }
+ return crc;
+}
+
+
+int
+checksumcmd (cmdmode_t mode)
+{
+ mem_addr_t start, end;
+ uint32 crc = 0xffffffff;
+
+ if (mode == USAGE)
+ {
+ usage ("crc startaddr endaddr");
+ return 0;
+ }
+ if (mode == SHORT_HELP)
+ {
+ short_help ("checksum an area of memory");
+ return 0;
+ }
+ if (mode == LONG_HELP)
+ {
+ checksumcmd (USAGE);
+ long_help ("\
+The crc command is used to calculate a standard CRC32 checksum of the\n\
+specified memory region. The checksum is printed out as a hexadecimal\n\
+value.");
+ return 0;
+ }
+ if (argvect[1] == NULL || argvect[2] == NULL || argvect[3] != NULL)
+ {
+ return checksumcmd (USAGE);
+ }
+
+ str2addr (argvect[1], &start);
+ str2addr (argvect[2], &end);
+ while (start.addr < end.addr)
+ {
+ char c[1024];
+ int len = end.addr - start.addr;
+ if (len > sizeof(c))
+ len = sizeof(c);
+
+ read_memory (&start, 1, len, c);
+ crc = crc32 (c, len, crc);
+ start.addr += len;
+ }
+ xprintf("0x%08lx is checksum\n", crc);
+ return 0;
+}
+
+char **argvect;
+static char argvect_cmd[MAXLINELEN];
+
+static char **
+buildargv (char *input)
+{
+ static char *arglist[256];
+ int numargs = 0;
+
+ while (1)
+ {
+ while (isspace ((unsigned char)*input) && *input != 0)
+ input++;
+ if (*input == 0)
+ break;
+ arglist [numargs++] = input;
+ while (!isspace ((unsigned char)*input) && *input != 0)
+ input++;
+ if (*input == 0)
+ break;
+ *(input++) = 0;
+ }
+ arglist [numargs] = NULL;
+ return arglist;
+}
+
+
+int
+monitor_loop (void)
+{
+ int state = 1, return_value = 0;
+
+ while (state == 1)
+ {
+ /* Get a line of input, putting it in the input buffer */
+ lineedit (PROMPT, inbuf, sizeof (inbuf));
+ xprintf ("\n");
+
+ if (switch_to_stub_flag)
+ {
+#ifndef HAVE_BSP
+ switch_to_stub_flag = 0;
+#endif
+ return transfer_to_stub ();
+ }
+
+ /* Separate off the command from any other stuff on the line */
+
+ strcpy (argvect_cmd, inbuf);
+ argvect = buildargv (argvect_cmd);
+
+ if (argvect[0] != NULL && argvect[0][0] != '\0')
+ {
+ char *ptr;
+ int command_number;
+
+ strcpy (cmd, argvect[0]);
+
+ /* Function to split off . delimiters. */
+ ptr = strchr (cmd, '.');
+
+ if (ptr != NULL && *ptr == '.')
+ *ptr = '\0';
+
+ /* See if it's an alias. */
+ command_number = alias_compare (cmd);
+
+ /* Compare input to command list, check for conflicts. */
+ if (command_number < 0)
+ command_number = command_compare (cmd);
+
+ /* If we found a command, just run the function */
+ if (command_number >= 0)
+ {
+ int status;
+ /* Execute the function, if the function returns a non-zero
+ value, break out of the loop and return. */
+ status = (*cmdtab[command_number].function) (INVOCATION);
+ if (status)
+ {
+ state = 0;
+ if (status < 0)
+ return_value = 1;
+ }
+ }
+ else
+ {
+ /* If none of the commands or aliases match, complain. */
+ xprintf ("Not a legal command\n");
+ }
+
+ if (inbuf[0] != '\0')
+ addHistoryCmd (inbuf);
+ }
+ }
+ return return_value;
+}
+
+
diff --git a/cesar/ecos/packages/cygmon/current/misc/monitor_cmd.h b/cesar/ecos/packages/cygmon/current/misc/monitor_cmd.h
new file mode 100644
index 0000000000..23535b688a
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/monitor_cmd.h
@@ -0,0 +1,126 @@
+//==========================================================================
+//
+// monitor_cmd.h
+//
+// Monitor command definitions for the CygMON ROM monitor
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose: Monitor command definitions for the CygMON ROM monitor
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#ifndef MONITOR_CMD_H
+#define MONITOR_CMD_H
+
+#ifndef ASM
+typedef enum {
+ INVOCATION, USAGE, SHORT_HELP, LONG_HELP
+} cmdmode_t;
+
+struct cmdentry
+{
+ char *alias;
+ char *cmd;
+ int (*function) (cmdmode_t);
+};
+
+extern struct cmdentry cmdtab [];
+
+extern int monitor_loop (void);
+
+extern char inbuf[];
+
+extern char **argvect;
+
+typedef int (*srec_input_func_t)(void);
+
+extern int load_srec(srec_input_func_t inp_func);
+
+#ifdef USE_HELP
+extern void usage (char *string);
+extern void short_help (char *string);
+extern void long_help (char *string);
+extern void example (char *string);
+#else
+#define usage(x) no_help_usage ()
+#define short_help(x) no_help()
+#define long_help(x) no_help()
+#define example(x)
+extern void no_help (void);
+extern void no_help_usage (void);
+#endif
+extern int help_cmd (cmdmode_t mode);
+extern int mem_cmd (cmdmode_t mode);
+
+extern int dump_cmd (cmdmode_t mode);
+extern int ethaddr_cmd (cmdmode_t mode);
+extern int ipaddr_cmd (cmdmode_t mode);
+extern int tcpport_cmd (cmdmode_t mode);
+extern int load_cmd (cmdmode_t mode);
+extern int reg_cmd (cmdmode_t mode);
+extern int go_cmd (cmdmode_t mode);
+extern int othernames_cmd (cmdmode_t mode);
+extern int step_cmd (cmdmode_t mode);
+extern int transfer_cmd (cmdmode_t mode);
+extern int timer_cmd (cmdmode_t mode);
+extern int disassemble_cmd (cmdmode_t mode);
+extern int breakpoint_cmd (cmdmode_t mode);
+extern int clear_breakpoint_cmd (cmdmode_t mode);
+extern int memusage_cmd (cmdmode_t mode);
+extern int set_serial_port_cmd (cmdmode_t mode);
+extern int set_serial_speed_cmd (cmdmode_t mode);
+extern int version_cmd (cmdmode_t mode);
+extern int cache_cmd (cmdmode_t mode);
+extern int set_term_cmd (cmdmode_t mode);
+extern int reset_cmd (cmdmode_t mode);
+extern int copy_cmd (cmdmode_t mode);
+extern int fill_cmd (cmdmode_t mode);
+extern int set_program_args_cmd (cmdmode_t mode);
+extern int swapmem_cmd (cmdmode_t mode);
+extern int checksumcmd (cmdmode_t mode);
+extern int int_cmd (cmdmode_t mode);
+#endif
+
+#endif
diff --git a/cesar/ecos/packages/cygmon/current/misc/stub-tservice.h b/cesar/ecos/packages/cygmon/current/misc/stub-tservice.h
new file mode 100644
index 0000000000..10aa56cb6b
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/stub-tservice.h
@@ -0,0 +1,54 @@
+//==========================================================================
+//
+// stub-tservice.h
+//
+//
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Placeholder
diff --git a/cesar/ecos/packages/cygmon/current/misc/tservice.h b/cesar/ecos/packages/cygmon/current/misc/tservice.h
new file mode 100644
index 0000000000..1338b37e8f
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/tservice.h
@@ -0,0 +1,84 @@
+#ifndef __TSERVICE_H__
+#define __TSERVICE_H__
+//==========================================================================
+//
+// tservice.h
+//
+// These are the core functions are expected to be provided by the
+// target dependent services.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+/* These are the core functions are expected to be provided by the
+ target dependent services. They are used by both cygmon and by
+ libstub
+*/
+
+
+extern int read_memory (mem_addr_t *src, int size, int amt, char *dst);
+
+extern int write_memory (mem_addr_t *dst, int size, int amt, char *src);
+
+
+#ifndef USE_ECOS_HAL_BREAKPOINTS
+extern void set_breakpoint (struct bp *bp);
+extern void clear_breakpoint (struct bp *bp);
+#endif // USE_ECOS_HAL_BREAKPOINTS
+
+#ifndef HAVE_BSP
+extern void set_pc (target_register_t pc);
+#endif
+
+extern target_register_t next_step_pc (void);
+
+extern void enable_interrupts (void);
+
+#endif // __TSERVICE_H__
+
+
+extern void initialize_mon(void);
diff --git a/cesar/ecos/packages/cygmon/current/misc/unistd.h b/cesar/ecos/packages/cygmon/current/misc/unistd.h
new file mode 100644
index 0000000000..6bbfe6eb11
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/unistd.h
@@ -0,0 +1,54 @@
+//==========================================================================
+//
+// unistd.h
+//
+// Standard Unix/POSIX environment
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas
+// Date: 1999-10-20
+// Purpose:
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+// Placeholder only
diff --git a/cesar/ecos/packages/cygmon/current/misc/utils.c b/cesar/ecos/packages/cygmon/current/misc/utils.c
new file mode 100644
index 0000000000..04b6174abd
--- /dev/null
+++ b/cesar/ecos/packages/cygmon/current/misc/utils.c
@@ -0,0 +1,376 @@
+//==========================================================================
+//
+// utils.c
+//
+// Monitor utilities.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):
+// Contributors: gthomas, dmoseley
+// Date: 1999-10-20
+// Purpose: Monitor utilities.
+// Description:
+//
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#ifdef HAVE_BSP
+#include <bsp/bsp.h>
+#include <bsp/cpu.h>
+#include <bsp/hex-utils.h>
+#endif
+#include "monitor.h"
+#include "tservice.h"
+
+#if USE_CYGMON_PROTOTYPES
+/* Use common prototypes */
+/* Some of the composed board.h files compose these
+ prototypes redundently, but if they dont,
+ these are the common definitions */
+#include "fmt_util.h" /* Interface to string formatting utilities */
+#include "generic-stub.h" /* from libstub */
+#endif /* USE_CYGMON_PROTOTYPES */
+
+volatile int switch_to_stub_flag = 0;
+
+/* Input routine for the line editor. */
+int
+input_char (void)
+{
+ int i;
+
+ /* We have to drop the '+' characters on the floor
+ because gdb will send a '+' as the first character
+ when connecting to the target. If we waste time
+ echoing that, slow hw might get a uart overrun. */
+ while ((i = xgetchar ()) == '+');
+
+ if (i == '$')
+ {
+ xungetchar ('$');
+ switch_to_stub_flag = 1;
+ i = '\n';
+ }
+ return i;
+}
+
+
+static char tohex_array[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+#define tohex(X) (tohex_array[(X) & 15])
+
+#ifdef HAVE_BSP
+#define fromhex __hex
+#else
+static int
+fromhex (a)
+{
+ int number = -1;
+
+ if (a >= '0' && a <= '9')
+ number = a - '0';
+ else if (a >= 'a' && a <= 'f')
+ number = a - 'a' + 10;
+ else if (a >= 'A' && a <= 'F')
+ number = a - 'A' + 10;
+ else
+ xprintf ("Invalid hex digit %c", a);
+
+ return number;
+}
+#endif
+
+
+static unsigned long long
+str2ull (char *str, int base)
+{
+ unsigned long long l = 0;
+
+ if (str[0] == '0' && str[1] == 'x')
+ {
+ str += 2 ;
+ base = 16 ;
+ }
+
+ while (*str != '\0')
+ {
+ if (*str == '.')
+ str++;
+ else
+ l = (l * base) + fromhex(*str++);
+ }
+
+ return l;
+}
+
+
+/* Converts a string to a long, base is the assumed base of the string */
+
+target_register_t
+str2int (char *str, int base)
+{
+ return str2ull(str, base);
+}
+
+/* Converts a string to a double, input is a raw integer string
+ * of the given assumed base. */
+#if HAVE_DOUBLE_REGS
+static double
+str2double (char *str, int base)
+{
+ double d;
+
+ switch (sizeof(double))
+ {
+ case sizeof(unsigned int):
+ *((unsigned int *)&d) = str2ull(str, base);
+ break;
+#if __LONG_MAX__ != __INT_MAX__
+ case sizeof(unsigned long):
+ *((unsigned long *)&d) = str2ull(str, base);
+ break;
+#endif
+#if __LONG_LONG_MAX__ != __LONG_MAX__
+ case sizeof(unsigned long long):
+ *((unsigned long long *)&d) = str2ull(str, base);
+ break;
+#endif
+ default:
+ d = 0.0;
+ break;
+ }
+ return d;
+}
+#endif
+
+target_register_t
+str2intlen (char *str, int base, int len)
+{
+ target_register_t number = 0;
+
+ while ((len--) > 0 && *str != '\0')
+ number = number * base + fromhex (*(str++));
+
+ return number;
+}
+
+int
+hex2bytes (char *str, char *dest, int maxsize)
+{
+ int i;
+ char *ptr;
+
+ for (i = 0; i < maxsize; i++)
+ dest[i] = 0;
+ maxsize--;
+
+ // Don't try and convert 0x prefix
+ if ((str[0] == '0') && (str[1] == 'x'))
+ str += 2;
+
+ ptr = str + strlen(str) - 1;
+ while (maxsize >= 0 && ptr >= str)
+ {
+ dest [maxsize] = fromhex(*ptr);
+ ptr--;
+ if (ptr >= str)
+ {
+ dest [maxsize--] |= fromhex(*ptr) * 16;
+ ptr--;
+ }
+ }
+ return 0;
+}
+
+
+/* Converts an unsigned long long to an ASCII string, adding leading
+ zeroes to pad space up to numdigs. */
+static int use_dots = 1;
+
+#define MAX_NUM_DIGS 51
+
+static char *
+ull2str (unsigned long long number, int base, int numdigs)
+{
+ static char string[MAX_NUM_DIGS+1];
+ int dots, i;
+ char *ptr = string + MAX_NUM_DIGS;
+
+ dots = (use_dots && base == 16);
+
+ *(ptr--) = '\0';
+ *(ptr--) = tohex (number % base);
+ i = 1;
+ number = number / base;
+
+ while (number != 0)
+ {
+ if (dots && (i % 4) == 0)
+ *(ptr--) = '.';
+ *(ptr--) = tohex (number % base);
+ i++;
+ number = number / base;
+ }
+
+ if (numdigs == 0)
+ {
+ numdigs = i;
+ }
+ else
+ {
+ while(i < numdigs)
+ {
+ if (dots && (i % 4) == 0)
+ *(ptr--) = '.';
+ *(ptr--) = '0';
+ i++;
+ }
+ }
+ return ptr + 1;
+}
+
+
+char *
+int2str (target_register_t number, int base, int numdigs)
+{
+ return ull2str((unsigned long long)number, base, numdigs);
+}
+
+#if HAVE_DOUBLE_REGS
+static char *
+double2str(double d)
+{
+ switch(sizeof(double))
+ {
+ case sizeof(unsigned int):
+ return ull2str(*((unsigned int *)&d), 16, sizeof(double) * 2);
+ break;
+#if __LONG_MAX__ != __INT_MAX__
+ case sizeof(unsigned long):
+ return ull2str(*((unsigned long *)&d), 16, sizeof(double) * 2);
+ break;
+#endif
+#if __LONG_LONG_MAX__ != __LONG_MAX__
+ case sizeof(unsigned long long):
+ return ull2str(*((unsigned long long *)&d), 16, sizeof(double) * 2);
+ break;
+#endif
+ }
+ return "....fixme...";
+}
+#endif
+
+#ifndef NO_MALLOC
+char *
+strdup(const char *str)
+{
+ char *x = malloc (strlen (str) + 1);
+ if (x != NULL)
+ strcpy (x, str);
+ return x;
+}
+#endif
+
+
+target_register_t
+get_pc(void)
+{
+ return get_register(REG_PC);
+}
+
+
+#if defined(HAVE_BSP) && !defined(__ECOS__)
+static int
+get_register_type(regnames_t which)
+{
+ int i;
+
+ for (i = 0; regtab[i].registername != NULL; i++)
+ if (regtab[i].registernumber == which)
+ return regtab[i].registertype;
+ return REGTYPE_INT;
+}
+#endif
+
+char *get_register_str (regnames_t which, int detail, int valid)
+{
+#ifdef SPECIAL_REG_OUTPUT
+ char *res;
+
+ if ((res = SPECIAL_REG_OUTPUT (which, detail)) != NULL)
+ {
+ return res;
+ }
+#endif
+ if (valid == 0)
+ {
+ switch (sizeof (target_register_t))
+ {
+ case 1: return "...";
+ case 2: return ".....";
+ case 4: return ".........";
+ case 8: return ".................";
+ default: return ".........";
+ }
+ }
+ else
+ {
+ return int2str (get_register (which), 16, sizeof (target_register_t) * 2);
+ }
+}
+
+
+void
+store_register (regnames_t which, char *string)
+{
+#ifdef SPECIAL_REG_STORE
+ if (SPECIAL_REG_STORE(which, string))
+ return;
+#endif
+ put_register (which, str2int (string, 16));
+}
+
+
+