This is an automated email from Gerrit. Tomasz CEDRO ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/1036
-- gerrit commit 008ea67615d5bad66d3e4c21afb35429e7abcb6f Author: Tomek CEDRO <[email protected]> Date: Tue Nov 13 02:35:48 2012 +0100 Moved Transport registration from constructor-like functions into one function oocd_transport_register_all() that is executed at program startup. Registration invocation can be moved, but constructor functions caused totally unpredictable behavior on program linking time... Change-Id: Ibb8f1160bfb849fd92211d9f11af9ea26c581b8e Signed-off-by: Tomek CEDRO <[email protected]> diff --git a/src/jtag/core.c b/src/jtag/core.c index 4066a3f..4837ec0 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -1780,11 +1780,13 @@ oocd_transport_t jtag_transport = { .init = jtag_init, }; +/* Transport are now setup with oocd_transport_register_all() static void jtag_constructor(void) __attribute__((constructor)); static void jtag_constructor(void) { oocd_transport_register(&jtag_transport); } +*/ /** Returns true if the current debug session * is using JTAG as its transport. diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index da5e025..482f02e 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -26,6 +26,7 @@ #include <helper/binarybuffer.h> #include <helper/log.h> +#include <transport/transport.h> #ifdef _DEBUG_JTAG_IO_ #define DEBUG_JTAG_IO(expr ...) \ @@ -670,6 +671,7 @@ void jtag_poll_set_enabled(bool value); * level APIs that are used in inner loops. */ #include <jtag/minidriver.h> +extern oocd_transport_t jtag_transport; bool transport_is_jtag(void); int jim_jtag_newtap(Jim_Interp *interp, int argc, Jim_Obj *const *argv); diff --git a/src/openocd.c b/src/openocd.c index e56a3ae..e937674 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -8,6 +8,9 @@ * Copyright (C) 2008 Richard Missenden * * [email protected] * * * + * Copyright (C) 2011-2012 Tomasz Boleslaw CEDRO * + * [email protected], http://www.tomek.cedro.info * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -314,6 +317,11 @@ int openocd_main(int argc, char *argv[]) cmd_ctx = setup_command_handler(NULL); + /* Register all supported transports before init */ + ret = oocd_transport_register_all(); + if (ERROR_OK != ret) + return ERROR_FAIL; + if (util_init(cmd_ctx) != ERROR_OK) return EXIT_FAILURE; diff --git a/src/target/adi_v5_swd.c b/src/target/adi_v5_swd.c index fc1571b..5c9e300 100644 --- a/src/target/adi_v5_swd.c +++ b/src/target/adi_v5_swd.c @@ -343,11 +343,13 @@ oocd_transport_t swd_transport = { .init = swd_init, }; +/* TC: Transport registration moved to function from constructors... static void swd_constructor(void) __attribute__((constructor)); static void swd_constructor(void) { oocd_transport_register(&swd_transport); } +*/ /** Returns true if the current debug session * is using SWD as its transport. diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h index 6553a95..e99461e 100644 --- a/src/target/arm_adi_v5.h +++ b/src/target/arm_adi_v5.h @@ -431,6 +431,7 @@ struct target; /* Put debug link into SWD mode */ int dap_to_swd(struct target *target); +extern oocd_transport_t swd_transport; /* Put debug link into JTAG mode */ int dap_to_jtag(struct target *target); diff --git a/src/transport/transport.c b/src/transport/transport.c index acaf37c..925d18f 100644 --- a/src/transport/transport.c +++ b/src/transport/transport.c @@ -50,6 +50,7 @@ #include <target/arm.h> #include <target/arm_adi_v5.h> #include <helper/log.h> +#include <jtag/jtag.h> extern struct command_context *global_cmd_ctx; @@ -72,6 +73,20 @@ static const char **oocd_transport_list_allowed; /** * The transport being used for the current OpenOCD session. */ oocd_transport_t *session; +/** + * Register all supported transport types with this one function at startup. + * This needs to be done like this in a function, not using contructors, + * because linking killed contructor function attributes. + * Registering them here gives more predictable behavior. + */ +int oocd_transport_register_all(void){ + if (oocd_transport_register(&jtag_transport)!=ERROR_OK) + return ERROR_FAIL; + if (oocd_transport_register(&swd_transport)!=ERROR_OK) + return ERROR_FAIL; + return ERROR_OK; +} + int oocd_transport_select(struct command_context *ctx, const char *name) { LOG_INFO("TRANSPORT SELECT: %s", name); @@ -156,7 +171,6 @@ bool oocd_transport_declared(void) int oocd_transport_register(oocd_transport_t *new_transport) { oocd_transport_t *t; - printf("TRANSPORT REGISTER: %s\n", new_transport->name); for (t = oocd_transport_list_all; t; t = t->next) { if (strcmp(t->name, new_transport->name) == 0) { @@ -171,7 +185,7 @@ int oocd_transport_register(oocd_transport_t *new_transport) /* splice this into the list */ new_transport->next = oocd_transport_list_all; oocd_transport_list_all = new_transport; - LOG_DEBUG("register '%s'", new_transport->name); + LOG_DEBUG("Transport registered: %s", new_transport->name); return ERROR_OK; } @@ -368,4 +382,3 @@ int oocd_transport_register_commands(struct command_context *ctx) { return register_commands(ctx, NULL, oocd_transport_group); } - diff --git a/src/transport/transport.h b/src/transport/transport.h index 4185d9d..cc4c1a5 100644 --- a/src/transport/transport.h +++ b/src/transport/transport.h @@ -78,10 +78,11 @@ typedef struct oocd_transport { struct oocd_transport *next; } oocd_transport_t; +int oocd_transport_register(oocd_transport_t *new_transport); +int oocd_transport_register_all(void); int oocd_transport_select(struct command_context *ctx, const char *name); int oocd_transport_allow(struct command_context *ctx, const char **vector); bool oocd_transport_declared(void); -int oocd_transport_register(oocd_transport_t *new_transport); oocd_transport_t *oocd_transport_current_get(void); int oocd_transport_register_commands(struct command_context *ctx); int oocd_transport_select_jim(Jim_Interp *interp, int argc, Jim_Obj * const *argv); -- ------------------------------------------------------------------------------ LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial Remotely access PCs and mobile devices and provide instant support Improve your efficiency, and focus on delivering more value-add services Discover what IT Professionals Know. Rescue delivers http://p.sf.net/sfu/logmein_12329d2d _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
