summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2009-10-16 13:52:40 -0700
committerDavid Brownell <dbrownell@users.sourceforge.net>2009-10-16 13:52:40 -0700
commitcb7965da154793430d935f4965d7360198b711ba (patch)
tree1ca65b04f77e65884b82b80cc490552a347ee31e
parenta61b57a87fec48a41c7429715c477077b545d698 (diff)
downloadopenocd+libswd-cb7965da154793430d935f4965d7360198b711ba.tar.gz
openocd+libswd-cb7965da154793430d935f4965d7360198b711ba.tar.bz2
openocd+libswd-cb7965da154793430d935f4965d7360198b711ba.tar.xz
openocd+libswd-cb7965da154793430d935f4965d7360198b711ba.zip
xscale: better fix for debug_handler.bin
Generate a C struct with the data, and use that, instead of an assembly language file. The assembly language causes issues on Darwin and MS-Windows, which don't necessarily use GNU AS; or if they do, don't necessarily use its ELF syntax. It's also better in two other ways: fewer global symbols; and the init-time size check gets optimized away at compile time. (Unless it fails, in which case bigger chunks of the file vanish.) Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
-rw-r--r--configure.in1
-rw-r--r--src/helper/Makefile.am10
-rw-r--r--src/target/Makefile.am12
-rw-r--r--src/target/xscale.c15
-rw-r--r--src/target/xscale.h6
-rw-r--r--src/target/xscale_debug.S13
6 files changed, 27 insertions, 30 deletions
diff --git a/configure.in b/configure.in
index 84574bec..8e2881cf 100644
--- a/configure.in
+++ b/configure.in
@@ -16,7 +16,6 @@ AC_LANG_C
AC_PROG_CC
AC_PROG_CC_C99
AM_PROG_CC_C_O
-AM_PROG_AS
AC_PROG_RANLIB
dnl disable checks for C++, Fortran and GNU Java Compiler
diff --git a/src/helper/Makefile.am b/src/helper/Makefile.am
index 7047253b..67250a18 100644
--- a/src/helper/Makefile.am
+++ b/src/helper/Makefile.am
@@ -52,12 +52,16 @@ noinst_HEADERS = \
startup.tcl \
bin2char.c
-bin2char$(EXEEXT_FOR_BUILD): bin2char.c
+BIN2C = bin2char$(EXEEXT_FOR_BUILD)
+
+BUILT_SOURCES = $(BIN2C)
+
+$(BIN2C): bin2char.c
${CC_FOR_BUILD} ${CFLAGS_FOR_BUILD} $(srcdir)/bin2char.c -o $@
# Convert .tcl to cfile
-startup_tcl.c: startup.tcl bin2char$(EXEEXT_FOR_BUILD)
- ./bin2char$(EXEEXT_FOR_BUILD) startup_tcl < $(srcdir)/startup.tcl > $@
+startup_tcl.c: startup.tcl $(BIN2C)
+ ./$(BIN2C) startup_tcl < $(srcdir)/startup.tcl > $@
# add startup_tcl.c to make clean list
CLEANFILES = startup_tcl.c bin2char$(EXEEXT_FOR_BUILD)
diff --git a/src/target/Makefile.am b/src/target/Makefile.am
index a2c34f0f..ea1641ef 100644
--- a/src/target/Makefile.am
+++ b/src/target/Makefile.am
@@ -10,11 +10,10 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/src/jtag \
-I$(top_srcdir)/src/xsvf
-# ideally this would be specific to xscale_debug.S ...
-libtarget_la_CCASFLAGS = \
- -Wa,-I$(top_srcdir)/src/target \
- $(AM_CCASFLAGS)
+BIN2C = $(top_srcdir)/src/helper/bin2char$(EXEEXT_FOR_BUILD)
+xscale_debug.h: $(BIN2C) xscale/debug_handler.bin
+ $(BIN2C) < xscale/debug_handler.bin xscale_debug_handler > xscale_debug.h
METASOURCES = AUTO
noinst_LTLIBRARIES = libtarget.la
@@ -41,7 +40,6 @@ libtarget_la_SOURCES = \
feroceon.c \
etb.c \
xscale.c \
- xscale_debug.S \
arm_simulator.c \
image.c \
armv7m.c \
@@ -62,6 +60,9 @@ libtarget_la_SOURCES = \
mips_ejtag.c \
avrt.c
+BUILT_SOURCES = \
+ xscale_debug.h
+
noinst_HEADERS = \
target.h \
target_type.h \
@@ -85,6 +86,7 @@ noinst_HEADERS = \
arm926ejs.h \
etb.h \
xscale.h \
+ xscale_debug.h \
arm_simulator.h \
image.h \
armv7m.h \
diff --git a/src/target/xscale.c b/src/target/xscale.c
index dd16b35e..640eb01b 100644
--- a/src/target/xscale.c
+++ b/src/target/xscale.c
@@ -69,6 +69,17 @@ static int xscale_unset_breakpoint(struct target_s *, breakpoint_t *);
static int xscale_read_trace(target_t *);
+/* This XScale "debug handler" is loaded into the processor's
+ * mini-ICache, which is 2K of code writable only via JTAG.
+ *
+ * FIXME the OpenOCD "bin2char" utility currently doesn't handle
+ * binary files cleanly. It's string oriented, and terminates them
+ * with a NUL character. Better would be to generate the constants
+ * and let other code decide names, scoping, and other housekeeping.
+ */
+static /* unsigned const char xscale_debug_handler[] = ... */
+#include "xscale_debug.h"
+
static char *const xscale_reg_list[] =
{
"XSCALE_MAINID", /* 0 */
@@ -1594,7 +1605,7 @@ static int xscale_deassert_reset(target_t *target)
* force that, so writing new contents is reliable...
*/
address = xscale->handler_address;
- for (unsigned binary_size = xscale_debug_handler_size;
+ for (unsigned binary_size = sizeof xscale_debug_handler - 1;
binary_size > 0;
binary_size -= buf_cnt, buffer += buf_cnt)
{
@@ -3030,7 +3041,7 @@ static int xscale_target_create(struct target_s *target, Jim_Interp *interp)
{
xscale_common_t *xscale;
- if (xscale_debug_handler_size > 0x800) {
+ if (sizeof xscale_debug_handler - 1 > 0x800) {
LOG_ERROR("debug_handler.bin: larger than 2kb");
return ERROR_FAIL;
}
diff --git a/src/target/xscale.h b/src/target/xscale.h
index 9d92550a..a5d83ee6 100644
--- a/src/target/xscale.h
+++ b/src/target/xscale.h
@@ -170,10 +170,4 @@ enum
#define ERROR_XSCALE_NO_TRACE_DATA (-1500)
-/* This XScale "debug handler" is loaded into the processor's
- * mini-ICache, which is 2K of code writable only via JTAG.
- */
-extern const uint8_t xscale_debug_handler[];
-extern const uint32_t xscale_debug_handler_size;
-
#endif /* XSCALE_H */
diff --git a/src/target/xscale_debug.S b/src/target/xscale_debug.S
deleted file mode 100644
index 0a7b87d2..00000000
--- a/src/target/xscale_debug.S
+++ /dev/null
@@ -1,13 +0,0 @@
- .section .rodata
-
- .align 4
- .global xscale_debug_handler
-xscale_debug_handler:
- .incbin "xscale/debug_handler.bin"
- .size xscale_debug_handler, . - xscale_debug_handler
-
- .align 4
- .global xscale_debug_handler_size
-xscale_debug_handler_size:
- .word . - xscale_debug_handler
- .size xscale_debug_handler_size, 4