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 <dorwig@tetronik.com> Acked-by: Simon Glass <sjg@chromium.org> Signed-off-by: Simon Glass <sjg@chromium.org> (resending to the list since my tweaks are not quite trivial)
This commit is contained in:
committed by
Simon Glass
parent
2017aaef8c
commit
49cad54788
@@ -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);
|
||||
}
|
||||
|
||||
@@ -125,13 +125,13 @@ static int console_setfile(int file, struct stdio_dev * dev)
|
||||
*/
|
||||
switch (file) {
|
||||
case stdin:
|
||||
gd->jt[XF_getc] = getc;
|
||||
gd->jt[XF_tstc] = tstc;
|
||||
gd->jt->getc = getc;
|
||||
gd->jt->tstc = tstc;
|
||||
break;
|
||||
case stdout:
|
||||
gd->jt[XF_putc] = putc;
|
||||
gd->jt[XF_puts] = puts;
|
||||
gd->jt[XF_printf] = printf;
|
||||
gd->jt->putc = putc;
|
||||
gd->jt->puts = puts;
|
||||
gd->jt->printf = printf;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -758,11 +758,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 */
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <common.h>
|
||||
#include <exports.h>
|
||||
#include <spi.h>
|
||||
#include <i2c.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
@@ -13,34 +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
|
||||
#if !defined(CONFIG_CMD_I2C) || \
|
||||
(defined(CONFIG_DM_I2C) && !defined(CONFIG_DM_I2C_COMPAT))
|
||||
# define i2c_write dummy
|
||||
# define i2c_read dummy
|
||||
#endif
|
||||
#if !defined(CONFIG_CMD_SPI) || defined(CONFIG_DM_SPI)
|
||||
# define spi_init dummy
|
||||
# define spi_setup_slave dummy
|
||||
# define spi_free_slave dummy
|
||||
#endif
|
||||
#ifndef CONFIG_CMD_SPI
|
||||
# define spi_claim_bus dummy
|
||||
# define spi_release_bus dummy
|
||||
# define spi_xfer dummy
|
||||
#endif
|
||||
#define EXPORT_FUNC(f, a, x, ...) gd->jt->x = f;
|
||||
|
||||
void jumptable_init(void)
|
||||
{
|
||||
gd->jt = malloc(XF_MAX * sizeof(void *));
|
||||
gd->jt = malloc(sizeof(struct jt_funcs));
|
||||
#include <_exports.h>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user