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

Reply via email to