From 91e47f3ab8875176b6f6ac9244562f42f140467d Mon Sep 17 00:00:00 2001 From: Andreas Fritiofson Date: Wed, 18 Jun 2014 23:10:45 +0200 Subject: [PATCH] Fix some problems with the bin2char utility Don't hardcode the type for the array, just output the array initializer so the includer can choose the type and storage class, zero-terminate at will and so on. Change-Id: I6d5e0710eaaba0a218b3eb32f6569177356f4462 Signed-off-by: Andreas Fritiofson Reviewed-on: http://openocd.zylin.com/2176 Tested-by: jenkins Reviewed-by: Paul Fertser --- .gitignore | 4 ++-- src/Makefile.am | 17 ++++++++--------- src/helper/bin2char.sh | 12 ++++++------ src/openocd.c | 8 ++++++-- src/openocd.h | 3 --- src/target/Makefile.am | 6 +++--- src/target/xscale.c | 14 +++++--------- 7 files changed, 30 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index bfb22ed6e..3e6e1e94f 100644 --- a/.gitignore +++ b/.gitignore @@ -30,8 +30,8 @@ src/jtag/drivers/OpenULINK/*.rst *.swp src/startup.tcl -startup_tcl.c -xscale_debug.h +startup_tcl.inc +xscale_debug.inc bin2char bin2char.exe diff --git a/src/Makefile.am b/src/Makefile.am index b539ec433..7d67e3d7e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,8 +32,7 @@ endif libopenocd_la_SOURCES = \ hello.c \ - openocd.c \ - startup_tcl.c + openocd.c noinst_HEADERS = \ hello.h \ @@ -86,23 +85,23 @@ STARTUP_TCL_SRCS = \ EXTRA_DIST = $(STARTUP_TCL_SRCS) -BUILT_SOURCES = startup.tcl +BUILT_SOURCES = startup_tcl.inc startup.tcl: $(STARTUP_TCL_SRCS) cat $^ > $@ BIN2C = $(top_srcdir)/src/helper/bin2char.sh -# Convert .tcl to cfile -startup_tcl.c: startup.tcl $(BIN2C) - $(BIN2C) openocd_startup_tcl < $< > $@ || rm -f $@ +# Convert .tcl to c-array +startup_tcl.inc: startup.tcl $(BIN2C) + $(BIN2C) < $< > $@ || { rm -f $@; false; } -# add startup_tcl.c to make clean list -CLEANFILES = startup.tcl startup_tcl.c +# add generated files to make clean list +CLEANFILES = startup.tcl startup_tcl.inc # we do not want generated file in the dist dist-hook: - rm -f $(distdir)/startup_tcl.c + rm -f $(distdir)/startup_tcl.inc MAINTAINERCLEANFILES = $(srcdir)/Makefile.in diff --git a/src/helper/bin2char.sh b/src/helper/bin2char.sh index f9da30944..85a0fd6a8 100755 --- a/src/helper/bin2char.sh +++ b/src/helper/bin2char.sh @@ -1,14 +1,14 @@ #!/bin/sh -[ $# = 0 ] && { - echo "Usage: $0 " +[ $# != 0 ] && { + echo "Usage: $0" echo - echo "Read binary data from standard input and write it as a C character" - echo "array to standard output. Add a final NULL for terminating." + echo "Read binary data from standard input and write it as a comma separated" + echo "list of hexadecimal byte values to standard ouput. The output is usable" + echo "as a C array initializer. It is terminated with a comma so it can be" + echo "continued e.g. for zero termination." exit 1 } echo "/* Autogenerated with $0 */" -echo "unsigned const char $1[] = {" od -v -A n -t x1 | sed 's/ *\(..\) */0x\1,/g' -echo "0 /* NULL-terminated */ };" diff --git a/src/openocd.c b/src/openocd.c index 71e047f40..758febb4d 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -50,6 +50,11 @@ #define OPENOCD_VERSION \ "Open On-Chip Debugger " VERSION RELSTR " (" PKGBLDDATE ")" +static const char openocd_startup_tcl[] = { +#include "startup_tcl.inc" +0 /* Terminate with zero */ +}; + /* Give scripts and TELNET a way to find out what version this is */ static int jim_version_command(Jim_Interp *interp, int argc, Jim_Obj * const *argv) @@ -228,8 +233,7 @@ struct command_context *setup_command_handler(Jim_Interp *interp) log_init(); LOG_DEBUG("log_init: complete"); - const char *startup = openocd_startup_tcl; - struct command_context *cmd_ctx = command_init(startup, interp); + struct command_context *cmd_ctx = command_init(openocd_startup_tcl, interp); /* register subsystem commands */ typedef int (*command_registrant_t)(struct command_context *cmd_ctx_value); diff --git a/src/openocd.h b/src/openocd.h index 57bf45512..6d87c2af9 100644 --- a/src/openocd.h +++ b/src/openocd.h @@ -31,7 +31,4 @@ */ int openocd_main(int argc, char *argv[]); -/** provides a hard-coded command environment setup */ -extern const char openocd_startup_tcl[]; - #endif diff --git a/src/target/Makefile.am b/src/target/Makefile.am index efbeb33af..bf80c64c0 100644 --- a/src/target/Makefile.am +++ b/src/target/Makefile.am @@ -16,12 +16,12 @@ EXTRA_DIST = \ startup.tcl \ $(wildcard $(srcdir)/xscale/*) -DEBUG_HEADER = xscale_debug.h +DEBUG_HEADER = xscale_debug.inc BUILT_SOURCES = $(DEBUG_HEADER) CLEANFILES = $(DEBUG_HEADER) -$(DEBUG_HEADER): $(BIN2C) $(DEBUG_HANDLER) - $(BIN2C) < $(DEBUG_HANDLER) xscale_debug_handler > xscale_debug.h +$(DEBUG_HEADER): $(DEBUG_HANDLER) $(BIN2C) + $(BIN2C) < $< > $@ || { rm -f $@; false; } METASOURCES = AUTO noinst_LTLIBRARIES = libtarget.la diff --git a/src/target/xscale.c b/src/target/xscale.c index e88a23112..04189a148 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -73,14 +73,10 @@ static int xscale_read_trace(struct target *); /* 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 const uint8_t xscale_debug_handler[] = { +#include "xscale_debug.inc" +}; static char *const xscale_reg_list[] = { "XSCALE_MAINID", /* 0 */ @@ -1549,7 +1545,7 @@ static int xscale_deassert_reset(struct target *target) * coprocessors, trace data, etc. */ address = xscale->handler_address; - for (unsigned binary_size = sizeof xscale_debug_handler - 1; + for (unsigned binary_size = sizeof xscale_debug_handler; binary_size > 0; binary_size -= buf_cnt, buffer += buf_cnt) { uint32_t cache_line[8]; @@ -3028,7 +3024,7 @@ static int xscale_target_create(struct target *target, Jim_Interp *interp) { struct xscale_common *xscale; - if (sizeof xscale_debug_handler - 1 > 0x800) { + if (sizeof xscale_debug_handler > 0x800) { LOG_ERROR("debug_handler.bin: larger than 2kb"); return ERROR_FAIL; }