This patch should fix the problem.

The patch is against openocd/master....

As this post was made back in January, I'm including a reference to the
original discussion here...

http://www.mail-archive.com/[email protected]/msg11864.html

-- 
Meet Zylin at ESC 2010 San Jose
April 26 - 30. 2010
http://www.zylin.com/events_esc2010.html


Øyvind Harboe
US toll free 1-866-980-3434 / International +47 51 63 25 00
http://www.zylin.com/zy1000.html
ARM7 ARM9 ARM11 XScale Cortex
JTAG debugger and flash programmer
From 091a31d12f221348838ed3448dcf22cf4e134d23 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?=C3=98yvind=20Harboe?= <[email protected]>
Date: Mon, 3 May 2010 17:01:53 +0200
Subject: [PATCH] command context: fix errors when running certain commands on startup
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Various commands, e.g. "arm mcr xxxx" would fail if invoked upon startup
since it there was no command context defined for the jim interpreter
in that case.

A Jim interpreter is now associated with a command context(telnet,
gdb server's) or the default global command context.

Signed-off-by: Øyvind Harboe <[email protected]>
---
 src/helper/command.c |    8 ++++++--
 src/helper/command.h |    4 ++++
 src/jtag/tcl.c       |    4 ++--
 src/target/armv4_5.c |    8 +++-----
 src/target/target.c  |   29 +++++++++++++++--------------
 5 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/src/helper/command.c b/src/helper/command.c
index 3625508..be262f2 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -167,14 +167,18 @@ static const char **script_command_args_alloc(
 	return words;
 }
 
-static struct command_context *current_command_context(Jim_Interp *interp)
+struct command_context *current_command_context(Jim_Interp *interp)
 {
 	/* grab the command context from the associated data */
 	struct command_context *cmd_ctx = Jim_GetAssocData(interp, "context");
 	if (NULL == cmd_ctx)
 	{
 		/* Tcl can invoke commands directly instead of via command_run_line(). This would
-		 * happen when the Jim Tcl interpreter is provided by eCos.
+		 * happen when the Jim Tcl interpreter is provided by eCos or if we are running
+		 * commands in a startup script.
+		 *
+		 * A telnet or gdb server would provide a non-default command context to
+		 * handle piping of error output, have a separate current target, etc.
 		 */
 		cmd_ctx = global_cmd_ctx;
 	}
diff --git a/src/helper/command.h b/src/helper/command.h
index 8a418d3..2c19241 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -311,6 +311,10 @@ void command_set_output_handler(struct command_context* context,
 
 int command_context_mode(struct command_context *context, enum command_mode mode);
 
+/* Return the current command context associated with the Jim interpreter or
+ * alternatively the global default command interpreter
+ */
+struct command_context *current_command_context(Jim_Interp *interp);
 /**
  * Creates a new command context using the startup TCL provided and
  * the existing Jim interpreter, if any. If interp == NULL, then command_init
diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c
index 579ca9e..ea6d07e 100644
--- a/src/jtag/tcl.c
+++ b/src/jtag/tcl.c
@@ -684,7 +684,7 @@ static int jim_jtag_arp_init(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 		Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
 		return JIM_ERR;
 	}
-	struct command_context *context = Jim_GetAssocData(interp, "context");
+	struct command_context *context = current_command_context(interp);
 	int e = jtag_init_inner(context);
 	if (e != ERROR_OK) {
 		Jim_SetResult_sprintf(goi.interp, "error: %d", e);
@@ -701,7 +701,7 @@ static int jim_jtag_arp_init_reset(Jim_Interp *interp, int argc, Jim_Obj *const
 		Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
 		return JIM_ERR;
 	}
-	struct command_context *context = Jim_GetAssocData(interp, "context");
+	struct command_context *context = current_command_context(interp);
 	int e = jtag_init_reset(context);
 	if (e != ERROR_OK) {
 		Jim_SetResult_sprintf(goi.interp, "error: %d", e);
diff --git a/src/target/armv4_5.c b/src/target/armv4_5.c
index eeb6694..1a84a5f 100644
--- a/src/target/armv4_5.c
+++ b/src/target/armv4_5.c
@@ -820,11 +820,9 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 	struct arm *arm;
 	int retval;
 
-	context = Jim_GetAssocData(interp, "context");
-	if (context == NULL) {
-		LOG_ERROR("%s: no command context", __func__);
-		return JIM_ERR;
-	}
+	context = current_command_context(interp);
+	assert( context != NULL);
+
 	target = get_current_target(context);
 	if (target == NULL) {
 		LOG_ERROR("%s: no current target", __func__);
diff --git a/src/target/target.c b/src/target/target.c
index a3a1b0a..d17bb74 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -3236,12 +3236,9 @@ static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 	struct command_context *context;
 	struct target *target;
 
-	context = Jim_GetAssocData(interp, "context");
-	if (context == NULL)
-	{
-		LOG_ERROR("mem2array: no command context");
-		return JIM_ERR;
-	}
+	context = current_command_context(interp);
+	assert (context != NULL);
+
 	target = get_current_target(context);
 	if (target == NULL)
 	{
@@ -3432,11 +3429,9 @@ static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 	struct command_context *context;
 	struct target *target;
 
-	context = Jim_GetAssocData(interp, "context");
-	if (context == NULL) {
-		LOG_ERROR("array2mem: no command context");
-		return JIM_ERR;
-	}
+	context = current_command_context(interp);
+	assert (context != NULL);
+
 	target = get_current_target(context);
 	if (target == NULL) {
 		LOG_ERROR("array2mem: no current target");
@@ -4318,7 +4313,9 @@ static int jim_target_wait_state(Jim_Interp *interp, int argc, Jim_Obj *const *a
  */
 static int jim_target_event_list(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
-	struct command_context *cmd_ctx = Jim_GetAssocData(interp, "context");
+	struct command_context *cmd_ctx = current_command_context(interp);
+	assert (cmd_ctx != NULL);
+
 	struct target *target = Jim_CmdPrivData(interp);
 	struct target_event_action *teap = target->event_action;
 	command_print(cmd_ctx, "Event actions for target (%d) %s\n",
@@ -4512,7 +4509,9 @@ static int target_create(Jim_GetOptInfo *goi)
 	struct target *target;
 	struct command_context *cmd_ctx;
 
-	cmd_ctx = Jim_GetAssocData(goi->interp, "context");
+	cmd_ctx = current_command_context(goi->interp);
+	assert (cmd_ctx != NULL);
+
 	if (goi->argc < 3) {
 		Jim_WrongNumArgs(goi->interp, 1, goi->argv, "?name? ?type? ..options...");
 		return JIM_ERR;
@@ -4686,7 +4685,9 @@ static int jim_target_current(Jim_Interp *interp, int argc, Jim_Obj *const *argv
 		Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");
 		return JIM_ERR;
 	}
-	struct command_context *cmd_ctx = Jim_GetAssocData(interp, "context");
+	struct command_context *cmd_ctx = current_command_context(interp);
+	assert (cmd_ctx != NULL);
+
 	Jim_SetResultString(interp, get_current_target(cmd_ctx)->cmd_name, -1);
 	return JIM_OK;
 }
-- 
1.6.3.3

_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to