Re: [U-Boot] [PATCH v2] Export redesign
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
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