From e5e6f1313eb901cfebf59a9fdcdd0200bd27a759 Mon Sep 17 00:00:00 2001 From: Tomek CEDRO Date: Tue, 13 Nov 2012 02:35:48 +0100 Subject: [PATCH] Moved Transport registration from constructor-like functions into one function oocd_transport_register_all() that is executed at program startup. Registration ivocation can be moved, but contructor functions caused totally unpredictable behavior on program linking time... Change-Id: I8501046952ced75a95fcadd8f6645f3d5ea5c371 Signed-off-by: Tomek CEDRO --- src/jtag/core.c | 2 ++ src/jtag/jtag.h | 2 ++ src/openocd.c | 8 ++++++++ src/target/adi_v5_swd.c | 2 ++ src/target/arm_adi_v5.h | 1 + src/transport/transport.c | 19 ++++++++++++++++--- src/transport/transport.h | 3 ++- 7 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/jtag/core.c b/src/jtag/core.c index a0edd5c07..6e8a6a188 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -1798,11 +1798,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 3d2146c36..efa3cb2b8 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -26,6 +26,7 @@ #include #include +#include #ifdef _DEBUG_JTAG_IO_ #define DEBUG_JTAG_IO(expr ...) \ @@ -671,6 +672,7 @@ void jtag_poll_set_enabled(bool value); * level APIs that are used in inner loops. */ #include +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 e56a3ae55..e5be537bc 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -8,6 +8,9 @@ * Copyright (C) 2008 Richard Missenden * * richard.missenden@googlemail.com * * * + * Copyright (C) 2011-2012 Tomasz Boleslaw CEDRO * + * cederom@tlen.pl, 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 a30943e6d..2dc6ea445 100644 --- a/src/target/adi_v5_swd.c +++ b/src/target/adi_v5_swd.c @@ -342,11 +342,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 6553a95b1..e99461e80 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 827d5093e..aad0cfc58 100644 --- a/src/transport/transport.c +++ b/src/transport/transport.c @@ -50,6 +50,7 @@ #include #include #include +#include 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 4185d9d61..cc4c1a520 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); -- 2.11.4.GIT