Re: [U-Boot] [PATCH v2] Export redesign

2014-11-30 Thread Simon Glass
Hi Martin,

On 27 November 2014 at 01:42, Martin Dorwig dor...@tetronik.com wrote:
 this is an atempt to make the export of functions typesafe.
 I replaced the jumptable void ** by a struct (jt_funcs) with function 
 pointers.
 The EXPORT_FUNC macro now has 3 fixed parameters and one
 variadic parameter
 The first is the name of the exported function,
 the rest of the parameters are used to format a functionpointer

function pointer

 in the jumptable,

 the EXPORT_FUNC macros are expanded three times,
 1. to declare the members of the struct
 2. to initialize the structmember pointers
 3. to call the functions in stubs.c

 Signed-off-by: Martin Dorwig dor...@tetronik.com

Good to get rid of the XF macros.

I tested this on x86 and it still works fine.

Tested-by: Simon Glass s...@chromium.org

I have a few minor things comments below too. Please make sure to
rebase to latest mainline before sending as I think there are a few
changes in common/console.c.

 ---

 Changes in v2:
 - redesign the way functions are exported to standalone applications

  arch/blackfin/cpu/cpu.c   |  2 +-
  board/BuS/eb_cpux9k2/cpux9k2.c|  2 +-
  common/cmd_load.c |  2 +-
  common/console.c  | 20 -
  common/exports.c  | 26 ++-
  doc/README.standalone | 41 -
  examples/standalone/stubs.c   | 64 ++-
  include/_exports.h| 93 
 +++
  include/asm-generic/global_data.h |  2 +-
  include/exports.h | 15 +++
  10 files changed, 151 insertions(+), 116 deletions(-)

 diff --git a/arch/blackfin/cpu/cpu.c b/arch/blackfin/cpu/cpu.c
 index b7f1188..59c470f 100644
 --- a/arch/blackfin/cpu/cpu.c
 +++ b/arch/blackfin/cpu/cpu.c
 @@ -121,7 +121,7 @@ static void display_global_data(void)
 printf( |-ram_size: %lx\n, gd-ram_size);
 printf( |-env_addr: %lx\n, gd-env_addr);
 printf( |-env_valid: %lx\n, gd-env_valid);
 -   printf( |-jt(%p): %p\n, gd-jt, *(gd-jt));
 +   printf( |-jt(%p): %p\n, gd-jt, gd-jt-get_version);
 printf( \\-bd: %p\n, gd-bd);
 printf(   |-bi_boot_params: %lx\n, bd-bi_boot_params);
 printf(   |-bi_memstart: %lx\n, bd-bi_memstart);
 diff --git a/board/BuS/eb_cpux9k2/cpux9k2.c b/board/BuS/eb_cpux9k2/cpux9k2.c
 index 5e4778e..76ad7c4 100644
 --- a/board/BuS/eb_cpux9k2/cpux9k2.c
 +++ b/board/BuS/eb_cpux9k2/cpux9k2.c
 @@ -98,7 +98,7 @@ int misc_init_r(void)
 puts(Error: invalid MAC at EEPROM\n);
 }
 }
 -   gd-jt[XF_do_reset] = (void *) do_reset;
 +   gd-jt-do_reset = do_reset;

  #ifdef CONFIG_STATUS_LED
 status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
 diff --git a/common/cmd_load.c b/common/cmd_load.c
 index f6e522c..d043e6d 100644
 --- a/common/cmd_load.c
 +++ b/common/cmd_load.c
 @@ -222,7 +222,7 @@ static int read_record(char *buf, ulong len)
 }

 /* Check for the console hangup (if any different from serial) */
 -   if (gd-jt[XF_getc] != getc) {
 +   if (gd-jt-getc != getc) {
 if (ctrlc()) {
 return (-1);
 }
 diff --git a/common/console.c b/common/console.c
 index 5a2f411..08cf188 100644
 --- a/common/console.c
 +++ b/common/console.c
 @@ -124,13 +124,13 @@ static int console_setfile(int file, struct stdio_dev * 
 dev)
  */
 switch (file) {
 case stdin:
 -   gd-jt[XF_getc] = dev-getc;
 -   gd-jt[XF_tstc] = dev-tstc;
 +   gd-jt-getc = getc;
 +   gd-jt-tstc = tstc;
 break;
 case stdout:
 -   gd-jt[XF_putc] = dev-putc;
 -   gd-jt[XF_puts] = dev-puts;
 -   gd-jt[XF_printf] = printf;
 +   gd-jt-putc  = putc;
 +   gd-jt-puts  = puts;
 +   gd-jt-printf = printf;
 break;
 }
 break;
 @@ -722,11 +722,11 @@ int console_init_r(void)
  #endif

 /* set default handlers at first */
 -   gd-jt[XF_getc] = serial_getc;
 -   gd-jt[XF_tstc] = serial_tstc;
 -   gd-jt[XF_putc] = serial_putc;
 -   gd-jt[XF_puts] = serial_puts;
 -   gd-jt[XF_printf] = serial_printf;
 +   gd-jt-getc  = serial_getc;
 +   gd-jt-tstc  = serial_tstc;
 +   gd-jt-putc  = serial_putc;
 +   gd-jt-puts  = serial_puts;
 +   gd-jt-printf = serial_printf;

 /* stdin stdout and stderr are in environment */
 /* scan for it */
 diff --git a/common/exports.c b/common/exports.c
 index b97ca48..333107c 100644
 --- a/common/exports.c
 +++ b/common/exports.c
 @@ -1,6 +1,7 @@
  #include common.h
  #include exports.h
  #include spi.h
 +#include i2c.h

  

[U-Boot] [PATCH v2] Export redesign

2014-11-27 Thread Martin Dorwig
this is an atempt to make the export of functions typesafe.
I replaced the jumptable void ** by a struct (jt_funcs) with function pointers.
The EXPORT_FUNC macro now has 3 fixed parameters and one
variadic parameter
The first is the name of the exported function,
the rest of the parameters are used to format a functionpointer
in the jumptable,

the EXPORT_FUNC macros are expanded three times,
1. to declare the members of the struct
2. to initialize the structmember pointers
3. to call the functions in stubs.c

Signed-off-by: Martin Dorwig dor...@tetronik.com
---

Changes in v2:
- redesign the way functions are exported to standalone applications

 arch/blackfin/cpu/cpu.c   |  2 +-
 board/BuS/eb_cpux9k2/cpux9k2.c|  2 +-
 common/cmd_load.c |  2 +-
 common/console.c  | 20 -
 common/exports.c  | 26 ++-
 doc/README.standalone | 41 -
 examples/standalone/stubs.c   | 64 ++-
 include/_exports.h| 93 +++
 include/asm-generic/global_data.h |  2 +-
 include/exports.h | 15 +++
 10 files changed, 151 insertions(+), 116 deletions(-)

diff --git a/arch/blackfin/cpu/cpu.c b/arch/blackfin/cpu/cpu.c
index b7f1188..59c470f 100644
--- a/arch/blackfin/cpu/cpu.c
+++ b/arch/blackfin/cpu/cpu.c
@@ -121,7 +121,7 @@ static void display_global_data(void)
printf( |-ram_size: %lx\n, gd-ram_size);
printf( |-env_addr: %lx\n, gd-env_addr);
printf( |-env_valid: %lx\n, gd-env_valid);
-   printf( |-jt(%p): %p\n, gd-jt, *(gd-jt));
+   printf( |-jt(%p): %p\n, gd-jt, gd-jt-get_version);
printf( \\-bd: %p\n, gd-bd);
printf(   |-bi_boot_params: %lx\n, bd-bi_boot_params);
printf(   |-bi_memstart: %lx\n, bd-bi_memstart);
diff --git a/board/BuS/eb_cpux9k2/cpux9k2.c b/board/BuS/eb_cpux9k2/cpux9k2.c
index 5e4778e..76ad7c4 100644
--- a/board/BuS/eb_cpux9k2/cpux9k2.c
+++ b/board/BuS/eb_cpux9k2/cpux9k2.c
@@ -98,7 +98,7 @@ int misc_init_r(void)
puts(Error: invalid MAC at EEPROM\n);
}
}
-   gd-jt[XF_do_reset] = (void *) do_reset;
+   gd-jt-do_reset = do_reset;
 
 #ifdef CONFIG_STATUS_LED
status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
diff --git a/common/cmd_load.c b/common/cmd_load.c
index f6e522c..d043e6d 100644
--- a/common/cmd_load.c
+++ b/common/cmd_load.c
@@ -222,7 +222,7 @@ static int read_record(char *buf, ulong len)
}
 
/* Check for the console hangup (if any different from serial) */
-   if (gd-jt[XF_getc] != getc) {
+   if (gd-jt-getc != getc) {
if (ctrlc()) {
return (-1);
}
diff --git a/common/console.c b/common/console.c
index 5a2f411..08cf188 100644
--- a/common/console.c
+++ b/common/console.c
@@ -124,13 +124,13 @@ static int console_setfile(int file, struct stdio_dev * 
dev)
 */
switch (file) {
case stdin:
-   gd-jt[XF_getc] = dev-getc;
-   gd-jt[XF_tstc] = dev-tstc;
+   gd-jt-getc = getc;
+   gd-jt-tstc = tstc;
break;
case stdout:
-   gd-jt[XF_putc] = dev-putc;
-   gd-jt[XF_puts] = dev-puts;
-   gd-jt[XF_printf] = printf;
+   gd-jt-putc  = putc;
+   gd-jt-puts  = puts;
+   gd-jt-printf = printf;
break;
}
break;
@@ -722,11 +722,11 @@ int console_init_r(void)
 #endif
 
/* set default handlers at first */
-   gd-jt[XF_getc] = serial_getc;
-   gd-jt[XF_tstc] = serial_tstc;
-   gd-jt[XF_putc] = serial_putc;
-   gd-jt[XF_puts] = serial_puts;
-   gd-jt[XF_printf] = serial_printf;
+   gd-jt-getc  = serial_getc;
+   gd-jt-tstc  = serial_tstc;
+   gd-jt-putc  = serial_putc;
+   gd-jt-puts  = serial_puts;
+   gd-jt-printf = serial_printf;
 
/* stdin stdout and stderr are in environment */
/* scan for it */
diff --git a/common/exports.c b/common/exports.c
index b97ca48..333107c 100644
--- a/common/exports.c
+++ b/common/exports.c
@@ -1,6 +1,7 @@
 #include common.h
 #include exports.h
 #include spi.h
+#include i2c.h
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -13,31 +14,10 @@ unsigned long get_version(void)
return XF_VERSION;
 }
 
-/* Reuse _exports.h with a little trickery to avoid bitrot */
-#define EXPORT_FUNC(sym) gd-jt[XF_##sym] = (void *)sym;
-
-#if !defined(CONFIG_X86)  !defined(CONFIG_PPC)
-# define install_hdlr  dummy
-# define free_hdlr dummy
-#else /* kludge for non-standard function naming */
-# define install_hdlr  irq_install_handler
-# define free_hdlr irq_free_handler
-#endif
-#ifndef